Cześć!
W programie zabrakło mi SRAM'u, toteż musiałem dołożyć atmedze pamięci. Użyłem układu U6264DC z latchem 74HC573. Pamięć wydaje się działać, jednak mam z nią dziwny problem.
Napisałem sobie w C program sprawdzający pamięć.
Najpierw alokuję dużą tablicę, potem piszę do niej określone wartości, a nastepnie sprawdzam czy są ok. Jeśli nie to wyrzucam na wyświetlacz numer "komorki" tablicy i jej zawartość (funkcją debug(...)).
Kod wygląda mniej-więcej tak:
#v+ #define TAB_LENGTH 0x7FFF #define TEST_VAL 0xAA
u8 tab[TAB_LENGTH];
int main() { u16 i; debug_init(); avr_memory_init(); for (i = 0; i < TAB_LENGTH; i++) { tab[i] = TEST_VAL; } for (i = 0; i < TAB_LENGTH; i++) { debug(1, (i >> 8) & 0xFF, i & 0xFF); if (tab[i] != TEST_VAL) { delay_ms(500); debug(1, (tab[i] >> 8) & 0xFF, tab[i] & 0xFF); delay_ms(2000); } } } #v-
Problemy są takie:
- Jeśli próbuję zaalokować tablicę większą niż 0x7FFF kompilator wyrzuca błąd: $ make all avr-gcc -g -mmcu=atmega128 -Wall -Os -o main.elf main.c delay.o debug.o avr_memory.o main.c:13: error: size of array `tab' is too large main.c:13: error: storage size of `tab' isn't known Pytanie... dlaczego? Przecież m128 adresuje do 64k zewnętrzej pamięci (objętość = 64k * 8 [bajtów]).
- Dwanaście "komórek" tablicy podczas czytania ma inną wartość niż wcześniej została do nich zapisana. Co dziwniejsze, są to zawsze te same wartości! Komórki, które sprawiają kłopoty to 0x0FF4 - 0x0FFF.
komórka | wartość
0x0FF4 0x01 0x0FF5 0x2C 0x0FF6 0x0F 0x0FF7 0xF7 0x0FF8 0x0F 0x0FF9 0xF9 0x0FFA 0x00 0x0FFB 0xBB 0x0FFC 0x0F 0x0FFD 0xFD 0x0FFE 0x00 0x0FFF 0x9CUwaga: "komórki" to nie są adresy w pamięci tylko indeksy kolejnych danych w tablicy tab. Niestety, słabo posługuję się asemblerem, więc patrzenie w kod asm niewiele mi pomogło. Ale wyrzuciłem go tu:
- może zechcecie zerknąć? Może na jego podstawie ktoś życzliwie powie mi, dlaczego 12 komórek pamięci "nie działa"?
Zauważylem jeszcze coś. jak zmieniam wartość TEST_VAL, zmieniaja się również wartości komórek 0x0FF5, 0x0FFB i 0x0FFF. Reszta jest taka sama.
Pozdrawiam i czekam na rady, voice