Boot loader i ATmega128

Jul 13, 2003 3 Replies

Witam,



podczas pisania boot loadera dla ATmega128 napotka³em na pewien problem którego nie mogê znale¼æ w dokumentacjach, mianowicie - mój boot loader znajduje siê pod adresem F000h i po inicjalizacji portów itd. ma za zadanie obliczyæ CRC obszaru pamiêci programu od 0000h do EFFFh po czym porównaæ go z CRC zapisanym w EPROM'ie. Ma to na celu stwierdzenie czy program jest prawid³owy czy te¿ jest uszkodzony i w zale¿no¶ci od tego albo przekazaæ mu sterowanie albo przej¶æ do trybu samoprogramowania pamiêci FLASH.



Odczyt zawarto¶ci FLASH wykonywany jest instrukcj± ELPM przez kod jak poni¿ej:



unsigned int readromword(unsigned int addr) { #asm ldd r31, y + 1 rol r31 ld r30, y clc rol r30 clr r26 clr r26 sts rampz, r26 elpm r26, z+ elpm r27, z mov r30, r26 mov r31, r27



#endasm }



Powy¿sza funkcja jest funkcj± w C, para rejestrów R30:R31 to adres s³owa (nie bajtu!) w pamiêci FLASH, wynik funkcji czyli odczytane spod podanego adresu s³owo równie¿ l±duje w R30:R31. Otó¿ problem polega na tym ¿e jakkolwiek funkcja ta bezb³êdnie czyta kod boot loadera to próba odczytu adresów od np. 0000h do 000Fh powoduje ¿e funkcja zwraca FFFFh bez wzglêdu na zawarto¶æ tych komórek. Sprawdza³em wszelkie lockbity, nic nie wskazuje na to aby rozkaz ELPM wywo³ywany z bootblocka nie mia³ mieæ dostêpu do obszaru aplikacji - co wiêc mo¿e byæ przyczyn± ?? Proszê, pomó¿cie !


Pozdrawiam, Sebcio



Przyczyn szukałbym w ustawianiu bitu RAMPZ. LPM nie korzysta z tego bitu, a ELPM korzysta.

[...]

Po co 2x czyścisz R26? Do tego w RAMPZ na stałe zapisujesz 0 - czy o to na pewno chodziło?

U¿ytkownik "Adam Dybkowski" snipped-for-privacy@amwaw.edu.pl> napisa³ w wiadomo¶ci news: snipped-for-privacy@amwaw.edu.pl...

nie, skopiowa³em kod z chwili gdy testowa³em - winno byæ w oryginale clr r26, rol r26 (bo poprzednie operacje umieszcza³y w Carry bit który wskazywa³ na w³a¶ciw± po³ówkê pamiêci), sts rampz, r26. Natomiast wykry³em problem - mianowicie zamiast sts rampz, r26 winno byæ out rampz, r26 i teoretycznie dzia³a. Teoretycznie gdy¿ w niektórych sytuacjach wywo³anie tej procedury powoduje dziwne zachowanie siê printf() w CodeVisionAVR i podejrzewam ¿e jest to jaki¶ bug albo niekompatybilno¶æ... :-(

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required