PROSZE O POMOC. MAM ZEGAR RTC (PCF8583) I EEPROM 24C32 NA JEDNEJ SZYNIE I2C. POSIADAM PROCEDURY DO OBSLUGI OBYDWU URZADZEN ALE PO ZLOZENIU TYCH PROGRAMIKOW "DO KUPY" PAMIEC NIE CHCE MI CHODZIC. ZEGAR URUCHAMIALEM PIERWSZY I DZIALA NADAL POPRAWNIE. CZY KTOS KIEDS MOZE URUCHAMIAL TE URZADZENIA RAZEM I POSIADA PRZYPADKIEM PROCEDURY W ASSEMBLERZE NA AT89S8252? (TO JEST ZWYKLA '52). ZA WSZELKA POMOC BEDE WDZIECZNY.
PROSZE O POMOC. ZEGAR RTC (PCF8583) I EEPROM 24C32 NA JEDNEJ SZYNIE I2C
Aug 26, 2004
11 Replies
a adresy się nie "gryzą"?
I nie krzycz...
U¿ytkownik "Jarek Andrzejewski" snipped-for-privacy@dawid.com.pl> napisa³ :
dzis to juz sprawdzalem - nie maja prawa sie gryzc dla 24C32 mam adres
10100011x (piny A0 i A1 do + ; A3 do GND) a PCF8583 ma 1010000x.(A0 do masy) Staram sie sprawdzic nastepujaco pamiec: Wysylam adres urzadzenia pozniej bardziej i mniej znaczaca czesc adresu komorki pamieci do korej chce pisac i z ktorej chce pozniej czytac. Wysylam mu znak (#'=') i pozniej odczytuje. Tylko ze juz nie ten znak. Zauwazylem ze jesli w procedurze wysylania danej do SLAVE w³±czê linijke oczekiwania na ACK SLAVE (JB SDA, $) w momecie kiedy uzywam tej procedury dla 24C32 caly program mi sie zatrzymuje. To tak jakby ten uklad wogole nie wysylal bitu potwierdzenia .. nie wiem wlasciewie jak mam to interpretowac... przydala by sie jakas dzialajaca procedura obsugujaca oba urzadzenia ...sorki .. :)
dzieki pozdrawiam ariachi
obawiam się, że nic z tego :-(
formatting link
"The PCF8583 is, basically, a 256byte RAM chip, hence it's ID code is the same as for an EEPROM (1010)."
U¿ytkownik "ariachi" snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:cgltd2$5fo$ snipped-for-privacy@news.onet.pl...
musi wysylac czyli ack 0
jesli nie potwierdza znaczy, ze nie czuje sie sie wywolany
proponuje podlaczyc jeden scalak potem drugi a na koniec oba razem do magistrali i zrobic probe wysylac wszystkie adresy urzadzen na I2C od 0 do 127 i zobaczyc przy ktorych jest potwierdzenie
wystarczy wysylac tylko ten pierwszy bajt adresujacy urzadzenie potem STOP nastepnie START i kolejny adres
w ten sposob wyjasni sie, pod ktorymi adresami zglaszaja sie scalaki
U¿ytkownik "Jarek Andrzejewski" snipped-for-privacy@dawid.com.pl> napisa³ w wiadomo¶ci news: snipped-for-privacy@4ax.com...
no ale po to sa nogi A3, A2, A1w EEPROM'ie i A0 w PCF8583 zeby ustawic tak aby nie kolidowaly
co prawda PCF ma tylko A0 wiec sa tylko w dwie mozliwosci
A0 w PCF'ie musi byc w przeciwnym stanie niz A0 w EEPROM'ie i wtedy nie bedzie kolizji
jeszcze jedno mi się skojarzyło: adres komórki w EEPROMie ma chyba 12 bitów, a w PCFie - tylko 8.
Nie dam głowy na 100%, ale chyba coś tam przeszkadza w pracy obu tych układów na jednej szynie. Ja w każdym razie mam je na osobnych liniach w swoich konstrukcjach.
U¿ytkownik "ariachi" snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:cgloe9$av9$ snipped-for-privacy@news.onet.pl...
Caps Lock siê zacina?
Owszem kto¶ uruchamia³ te dwa urz±dzenia razem. Podstawowa ró¿nica jest taka ¿e adresuj±c EEPROM musisz wys³aæ dwa bajty adresu (starszy i m³odszy bajt adresu), a adresuj±c RTC tylko jeden. Przyk³ad: parametr adrs tej procedury okre¶la z którym uk³adem chcemy gadaæ gdy 1 - RTC, gdy 2 - EEPROM
void I2C_Set_Address(unsigned int address, int adrs) { char Uadd, Ladd; MemClkLo; P2DIR |= (MemClkBit | MemDataBit);
if (adrs == 2) Uadd = (address & 0xFF00) >> 8; // adresujemy EEPROM (starszy bajt wysylam // tylko wtedy gdy adrs = 2 Ladd = (address & 0x00FF); // mlodszy bajt adresu
I2C_Start; // reszta... //Send control Byte I2C_Send_Byte(MemContWrite); //send two address bytes if (adrs == 2) I2C_Send_Byte(Uadd); I2C_Send_Byte(Ladd); }
Ciebie interesuje tylko kawa³ek od if(adrs == 2) do Ladd = (address &
0x00FF);Aha, to nie jest na AT89S8252, tylko na procki rodziny MSP430 z TI.
Pozdrawiam
Poprawka, Ciebie interesuj± tak¿e linijki:
if (adrs == 2) I2C_Send_Byte(Uadd); // To tutaj wysy³am ten dodatkowy bajt adresu. I2C_Send_Byte(Ladd);
Krzysiek
U nie pracują oba elementy na wspólnej szynie. co prawda eepromy mniejsze bo
24c02 lub 24c04 ale to przecież nie ma większego znaczenia. Niestety nie piszę w asemblerze takich rzeczy więc nie wiele moge pomoóc.PC
ariachi snipped-for-privacy@poczta.onet.pl> napisał(a):
Kochane ludziska:-)
Wszystkie wasze odpowiedzi prowadzą do nikąd ponieważ: Pamięci serii 24Cxx o pojemności większej niż 256 bajtów, adresuje się w dość specyficzny sposób .Aby zaadresować komórkę pamięci nr.256(licząc od 0 ) musimy adres bazowy układu zwiększyć o 2 a jako adres komórki pamięci wpisać 0 (ZERO). Rozumiecie ? Adres komórki pamięci jest zawsze 1-bajtowy Dla przykładu pamięć 24C08 jest widziana na szynie I2C jako DWA układy o kolejnych adresach bazowych np.160 dla pierwszych 256 komórek i 162 dla kolejnych 256. Więc łatwo policzyć ile przestrzeni adresowej zajmuje 24C32.
Strasznie się napracowałem uffff.
Pozdrowionka dla wszystkich operatorów lutownic.
Piotrek Sz.
Sorry zapędziłem się.Powyższe dotyczy pamięci 24c01<->24c16 a mówimy o 24c32. Faktycznie sprawdziłem w PDF-ie adresowanie 16 (14) bitowe. Proponuję poczytać to:
formatting link
Pozdrawiam
Piotrek Sz.
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required