Programowanie EEPROM w 89S8252
Masz problem? Zapytaj na forum elektroda.pl
From: "I:D" <damianbalboa_at_nospam_vp.pl>
Subject: Programowanie EEPROM w 89S8252
Date: Sat, 13 Nov 2004 17:14:13 +0100
Próbuje zaprogramować pamięć 2KB EEPROM w uC 89S8252 (przestrzeń adresowa:
0x0000-0x7FF).
Jednak po zaprogramowaniu paru bajtów program się krzaczy.
Wg mojej opinii poniższy program powinien przesłać do kompa (RS232) cos
takiego:
0
01
0123
01234
...
Jednak zauważyłem, że wynikowe znaki zależą (wynika z testów) do wartości
początkowej wskaźnika: BYTE *EE = 0x0000;
np.:
dla BYTE *EE = 0x000F; wydaje się, że działa do 44 znaków:
0123456789:;<=>?_at_nospam_ABCDEFGHIJKLMNOPQRSTUś_at_nospam_XYZ[
z tym, że V i W źle zapisało jako ś i _at_nospam_. Po powyższym ciągu 44 znaków
zaczyna krzaczyć:
01<0><0><0>01<0><0><0>01<0><0><0>01<0><0><0>01<0><0><0>01<0><0><0>01<0
'<0>01
Oto kod:
typedef unsigned char BYTE;
BYTE *EE = 0x0000; //wskaźnik do pamięci EEPROM
//ODCZYT::------------------------------------------------------------------
-------------
void EEPROM_rd(BYTE NoOfBytes, BYTE indexEE, BYTE *to)
{
idata BYTE i,n;
for(i=0;i<NoOfBytes;i++)
{
WMCON |= 0x08;//dostep do EEPROM
n=EE[indexEE+i];
WMCON &= ~0x08;//dostep z powrotem do XData
*(to+i)=n;
}
}
//ZAPIS:--------------------------------------------------------------------
-------------
void EEPROM_wr(BYTE NoOfBytes, BYTE indexEE, BYTE *from)
{
BYTE i,n;
for(i=0;i<NoOfBytes;i++)
{
n=*(from+i);
WMCON |= 0x18;
EE[indexEE+i]=n;
while ( !(WMCON & 0x02) ){}
WMCON &= ~0x18;
}
}
//MAIN:---------------------------------------------------------------------
---------------
//wycinek kodu z main():
...
idata unsigned char daneOdczyt[68]; //Odczytany tekst
idata unsigned char daneZapis[3]; //znak zapisywany do EEPROM
...
while(1)
{
...
daneZapis[0]=j+'0';
EEPROM_wr(1, j, &daneZapis[0]); //EEPROM_wr( ile zapisac, od ktorego
bitu w pamieci, co)
j=j+1;
EEPROM_rd(j, 0, &daneOdczyt[0]); // EEPROM_rd( ile przeczytac, od ktorego
bitu, gdzie )
... wizualizacja odczytu (RS232->Komp)
}
//--------------------------------------------------------------------------
------------------
Dzięki za sugestie.
From: Adam Dybkowski <adybkows123_at_nospam_amwaw.edu.pl>
Subject: Re: Programowanie EEPROM w 89S8252
Date: Sun, 14 Nov 2004 23:10:38 +0100
I:D wrote:
Próbuje zaprogramować pamięć 2KB EEPROM w uC 89S8252 (przestrzeń adresowa:
0x0000-0x7FF).
Jednak po zaprogramowaniu paru bajtów program się krzaczy.
[...]
typedef unsigned char BYTE;
BYTE *EE = 0x0000; //wskaźnik do pamięci EEPROM
A gdzie niby masz powiedziane, że EE to wskaźnik do pamięci EEPROM?
Wygląda jak zwykły wskaźnik do danych (sam definiujesz typ BYTE) czyli:
unsigned char *EE = 0x0000;
To wygląda na całkiem normalny wskaźnik do pamięci danych. Skąd
kompilator ma wiedzieć, że chodziło ci o pamięć EEPROM?
W zależności od wykorzystywanego kompilatora C dla '51, należy użyć
różnych definicji aby zrealizować dostęp do pamięci EEPROM. Albo zrobić
to ręcznie (na piechotę, rejestrami SFR) - poczytaj o sposobie dostępu
do pamięci EEPROM w dokumentacji AT89S8252.
--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/
Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.