Programowanie EEPROM w 89S8252

Nov 13, 2004 1 Replies

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:;<=>?@ABCDEFGHIJKLMNOPQRSTU¶@XYZ[ z tym, ¿e V i W ¼le zapisa³o jako ¶ i @. 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.



[...]

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.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required