I2C -obsluga pamieci EEprom AT24C256

Jan 19, 2006 5 Replies

Mam problem bo mam juz 5 stron kodu a jeszcze mi nie dziala :D.Chcialem prosic o rade (gdyz jestem poczatkujacy) jak najpiej sprawdzic na ledach (bez ruszania portu D) czy mi dziala zapis do EEprom? Tzn ja wykabinowalem to tak :



while(1) { Write_to_eeprom(0xAA,adress); //np adres 0xAA; przy daress=0; liczba = Read_from_eeprom(adress); //zwraca mi liczbe zczytana



if (tmp==liczba) //gdzie tmp = 0xAA; { PORTC=0x00; czekaj(ile); PORTC=0xFF; } }



Czyli ze jesli wartosc odczyatana zgadza sie z wartoscia wpisana to mi zapala diody na PORTC.



Programuje w WinAVR a poprawnosc kodu sprawdzam w AVR Studio i z tego co widze po debugowaniu to wszytko jest ok...A wiec gdzie radzicie szukac bledu i czy moj sposob sprawdzania zapisu jest ok?



A moze cos nie tak z ACK? Jak radzicie aby to zaimplementowac bo nie posiadam emulatora i kieplsko troche...



PS:Bo w debugerze w ogule nie moge podgladnac wartosci "tmp", czy "liczba". bo mi pisze "Location not valid"...Jak to podgladnac?



Procek to ATmega8 a piny SDA-> PD6 i SCL PD5;



Pozdarwiam, ToR


U¿ytkownik "ToR" <ToR snipped-for-privacy@o2.pl napisa³ w wiadomo¶ci news: snipped-for-privacy@newsgate.onet.pl...

Nie widzi, bo ich nie ma. tmp zosta³ zast±piony 0xAA, a liczba zmienn± chwilow± i Twój kod uproszczony zosta³ do while(1) { Write_to_eeprom(0xAA,adress); if (0xAA== Read_from_eeprom(adress)) ; { PORTC=0x00; czekaj(ile); PORTC=0xFF; } lub nawet bardziej. Spróbuj wysy³aæ na port C ca³y odczytany bajt, za ka¿dym razem spod innych adresów.

Ale jak symuluje proces w AvrStudio i jak podam dobre wartosci to mi wchodzi do petli if (tmp==liczba),czyli co to znaczy? CZy jesli wszytko jest ok w symulatorze to i powinno byc dobrze w rzeczywistym dzialaniu procka?

Ok, sprubuje ale mam pytanie czy czasem jak podam na port C odczytany bajt to czy mi sie nie bedzie resetowal procek, gdyz PC6 to reset?

Mysle ze blad moge miec gdzies w generowaniu ACK, badz opuznieniach czasowych a wiec wklejam pare funcji z mysla iz ktos dojrzy blad, ktory ja przeoczyylem..

----------------- void delay(void) //mam zegar 8Mhz (Atmega8)i nie wiem ile dac asm("nop") aby { // bylo obuznienie 10ms ? Mam za malo? asm("nop"); asm("nop"); asm("nop"); asm("nop"); }

------------------

unsigned char Write_to_eeprom (int dana, unsigned int adres) { unsigned char ack=1; while(ack) { i2cstart(); ack=i2cwrite(0xA0); } ack=i2cwrite(adres>>8); // H ack=i2cwrite(adres&0x00FF); // L ack=i2cwrite(dana); i2cstop(); return (ack); }

-------------------------- unsigned char Read_from_eeprom(unsigned int adres) { unsigned char tmp=1; unsigned char ack=1; while(ack) { i2cstart(); ack=i2cwrite(0xA0); } ack=i2cwrite(adres>>8); // H ack=i2cwrite(adres&0x00FF); // L while(ack) { i2cstart(); ack=i2cwrite(0xA1); } tmp=i2cread(NOACK); //NOACK=1 i2cstop(); return (tmp); }

------------------- Pozdrawiam, Rafal k.

Mo¿na to ustawiaæ w fuse bitach. Je¶li jest ustawiony na reset, to po prostu nic siê nie stanie - linia nie zmieni stanu. Je¶li jako linia portu to bêdzie dzia³aæ jako linia portu, a nie reset. Razem nie bêdzie to dzia³aæ

Tak, za ma³o o jakie¶ 80 tysiêcy linii programu - jeden nop to 1/8 mikrosekundy.

Ok poprawilem ten czas i okazalo sie ze zapis dziala a odczyt danej z eeprom juz nie :(.I teraz moje pytanie gdzie waszym zdaniem popelnilem blda.

Ponizej wklejam okd zapisu:

--------------------------------- unsigned char Read_from_eeprom() { unsigned char tmp=1; unsigned char ack=1; while(ack) { i2cstart(); ack=i2cwrite(0xA0); //odczyt adres pamieci 1010 -czyli hex-> A //a "0" bo robimy zapis czyli calosc 10100000 :D } ack=i2cwrite(adres); //ack=i2cwrite(0x00); // H ack=i2cwrite(adres); //ack=i2cwrite(0x00); // L while(ack) { i2cstart(); ack=i2cwrite(0xA1); //odczyt adres pamieci 1010 -czyli hex-> A //a "1" bo robimy odczyt czyli calosc 10100001 :D } tmp=i2cread(NOACK); // jako paramert ma byc "1" a wiec NACK i2cstop(); return (tmp); }

----------------------

PS:Ten kod napisalem na podstawie pdf'a pamieci AT24C256,

Prozdarwiam, Rafal k

O licho zle wkleilem ;) Czyli kod wyglada tak:

unsigned char Read_from_eeprom(unsigned int adres) { unsigned char tmp=1; unsigned char ack=1; while(ack) { i2cstart(); ack=i2cwrite(0xA0); //odczyt adres pamieci 1010 -czyli hex-> A //a "0" bo robimy zapis czyli calosc 10100000 :D } ack=i2cwrite(adres); //ack=i2cwrite(adres>>8); // H ack=i2cwrite(adres); //ack=i2cwrite(adres&0x00FF); // L while(ack) { i2cstart(); ack=i2cwrite(0xA1); //odczyt adres pamieci 1010 -czyli hex-> A //a "1" bo robimy odczyt czyli calosc 10100001 :D } tmp=i2cread(NOACK); // jako paramert ma byc "1" a wiec NACK i2cstop(); return (tmp); }

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required