I2C -obsluga pamieci EEprom AT24C256

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

Reply to
ToR
Loading thread data ...
Reply to
Bogdan Gutknecht

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.

Reply to
ToR
Reply to
Bogdan Gutknecht

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

Reply to
ToR_kulaWYTNIJTO

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); }

Reply to
ToR

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.