I2C -obsluga pamieci EEprom AT24C256



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "ToR" <ToR_kulaWYTNIJTO_at_nospam_o2.pl>
Subject: I2C -obsluga pamieci EEprom AT24C256
Date: 20 Jan 2006 00:42:16 +0100


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

--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "Bogdan Gutknecht" <b_gutknecht_at_nospam_interia.pl>
Subject: Re: I2C -obsluga pamieci EEprom AT24C256
Date: Fri, 20 Jan 2006 07:13:35 +0100



Użytkownik "ToR" <ToR_kulaWYTNIJTO_at_nospam_o2.pl> napisał w wiadomości
news:06b0.00000272.43d023d8_at_nospam_newsgate.onet.pl...
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?


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.


Poprzedni Następny
Wiadomość
Spis treści
From: "ToR" <ToR_kulaWYTNIJTO_at_nospam_o2.pl>
Subject: Re: I2C -obsluga pamieci EEprom AT24C256
Date: 20 Jan 2006 13:34:12 +0100


Nie widzi, bo ich nie ma. tmp został zastąpiony 0xAA, a liczba zmienną

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?


lub nawet bardziej. Spróbuj wysyłać na port C cały odczytany bajt, za każdym
razem spod innych adresów.

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.




--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "Bogdan Gutknecht" <b_gutknecht_at_nospam_interia.pl>
Subject: Re: I2C -obsluga pamieci EEprom AT24C256
Date: Fri, 20 Jan 2006 14:37:46 +0100


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?

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ć


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


Tak, za mało o jakieś 80 tysięcy linii programu - jeden nop to 1/8
mikrosekundy.



Poprzedni Następny
Wiadomość
Spis treści
From: ToR_kulaWYTNIJTO_at_nospam_o2.pl
Subject: Re: I2C -obsluga pamieci EEprom AT24C256
Date: 21 Jan 2006 16:11:57 +0100


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

--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "ToR" <ToR_kula_at_nospam_o2.pl>
Subject: Re: I2C -obsluga pamieci EEprom AT24C256
Date: 21 Jan 2006 16:15:41 +0100



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




--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl