ATmega8 programowanie EEPROMU w C

Jun 04, 2004 9 Replies

Witam bawiê siê w³a¶nie w programowanie pamiêci EEPROM ATMegi8 w C i mam problem bo programuje mi siê tylko pierwszy bajt (nie wiedzieæ czemu) ni¿ej zamieszczam funkcje która wywo³uje (jest na 100% dobra bo wzi±³em j± z dokumentacji) nie wiem mo¿e jako¶ ¼le wywo³ujê tê funkcje ? w ka¿dym razie po uruchomieniu programu a nastêpnie po zczytaniu EEPROMA widaæ jak byk ¿e programuje siê tylko jeden bajt bo jest tam wpisane 'Z' natomiast pozosta³e bajty nie s± zaprogramowane !!! o co tu chodzi ? Zasilam uC z baterii nie wiem mo¿e mam nieodpowiednie ¼ród³o zasilania, ale to raczej nie to bo pierwszy bajt siê programuje bez problemu. Dziêkuje wszystkim za pomoc.


void EEPROM_write(unsigned int uiAddress, unsigned char ucData) { /* Wait for completion of previous write */ while(EECR & (1<<EEWE)); /* Set up address and data registers */ EEAR = uiAddress; EEDR = ucData; /* Write logical one to EEMWE */ EECR |= (1<<EEMWE); /* Start eeprom write by setting EEWE */ EECR |= (1<<EEWE); }



int main(void) {



EEPROM_write(0,'Z'); EEPROM_write(1,'Z'); EEPROM_write(2,'Z'); EEPROM_write(3,'Z'); EEPROM_write(4,'Z'); EEPROM_write(5,'Z');



return(0); }



U¿ytkownik "BT" snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:c9qj5e$lne$ snipped-for-privacy@nemesis.news.tpi.pl...

nie wiem w czym problem ale pokombinuj troche

zmien kolejnosc zapisow znaczy najpierw zapisz np. 5-ty a pozniej 1-szy moze dodaj petle opozniajaca miedzy zapisami i pewnie cos sie wyjasni

Kupa konkretna nie mam pojêcia ju¿ zielonego co to mo¿e byæ próbowa³em ju¿ chyba wszystkiego ;( jak zapisuje najpierw 5 a pó¼niej 1 to i tak zapisuje siê tylko ten pierwszy ;( ale mniej wiêcej wiem o co ju¿ chodzi. Otó¿ program w uC albo w tym momêcie siê wiesza albo restartuje uC bo nie idze dalej. No ale i tak nie wiem co z tym zorbiæ.

U¿ytkownik "BT" snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:c9qo6q$ace$ snipped-for-privacy@nemesis.news.tpi.pl...

moze cos z watchdogiem, masz zalaczony ?

jesli tak to go odswiezaj albo na razie wylacz

news:c9qo6q$ace$ snipped-for-privacy@nemesis.news.tpi.pl...

Na razie jest ju¿ za pó¼no ¿ebym to sprawdzi³ (ide spaæ ;). Powiedz mi tylko jeszcze czy watchdog w AVR jest standardowo w³±czony ? bo wydaje mi siê ¿e trzeba go w³±czyæ a ja nic nie zmienia³em w ustawieniach tak¿e lockbit WDTON jest wy³±czony a to chyba oznacza ¿e Watchdog jest wy³±czony i nie trzeba nic z nim robiæ.

U¿ytkownik "BT" snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:c9qtis$r18$ snipped-for-privacy@atlantis.news.tpi.pl...

hmm zwykle jest nieaktywny jesli nie bawiles sie fuse'ami to chyba powinien byc wylaczony

ale to widac czy reszta programu poza zapisem eeprom'u chodzi czy ciagle sie resetuje ?

A nie będzie prościej (i pewniej) użyć standardowej funkcji z biblioteki libc kompilatora avr-gcc? Jest napisana optymalnie (asm) i łatwa do użycia. Szczegółów szukaj w: #include <avr/eeprom.h>

Na pocz±tku u¿ywa³em w³a¶nie tej funkcji ;-) ale jako ¿e nie dzia³a³a (nie zapisywa³a tych pozosta³ych bitów) to przerzuci³em siê na t± z dokumentacji AVR i jest tak samo ;(. Jak narazie moje podejrzenia id± w kierunku z³ego skonfigurowania avr-gcc bo okaza³o siê ¿e nie tylko z zapisywaniem eepromu s± problemy (czasami program zachowuje siê co najmniej irracjonalnie). Tak¿e bêdê siê mêczy³ dalej. Pozdrawiam i dziêkuje za pomoc jak co¶ wymy¶le to dam znaæ co by³o nie tak. Aha jeszcze jedno pytanie bo zauwa¿y³em ¿e w avr-gcc nie da siê tworzyæ klas czy jest jaki¶ kompilator który by kompilowa³ pod avr i radzi³ sobie z klasami ? Bo jest to dla mnie denerwuj±ce zw³aszcza ¿e jestem informatykiem i na codzieñ programuje w C++ (tak¿e programuj±c pod AVR musze siê cofn±æ z programowania obiektowego do programowania proceduralnego).

U¿ytkownik "BT" snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:c9rsbc$12r$ snipped-for-privacy@atlantis.news.tpi.pl...

to jest C moze z jakimis dodatkami ale nie ma klas na male kontrolery to raczej nie stosuje sie C++

na wieksze tak np. H8 albo ARM

No uda³o siê ;-) zajê³o mi to jakie¶ dwa dni ;) ale w koñcu wiem dlaczego mi to nie dzia³a³o. Otó¿ okaza³o siê ¿e AVR-GCC tworzy pliki *.hex w jakim¶ formacie którego mój programator chyba nie przyswaja i poprostu pl±ta niektóre bajty a co za tym idzie uC jest blednie programowany. Co dziwne nie zg³asza przy tym ¿adnych b³êdów. W ka¿dym razie rozwi±za³em ten problem kompiluj±c program nie do pliku *.hex a do *.bin i teraz ju¿ wszystko ³adnie dzia³a. Jeszcze raz dziêki wszystkim za pomoc.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required