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