RTV forum PL | NewsGroups PL

Debugowanie bootloadera na Atmega8: reset po wysłaniu bajtu przez I2C?

[avr] Bootloader i stos albo...

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Debugowanie bootloadera na Atmega8: reset po wysłaniu bajtu przez I2C?

Dariusz Zolna
Guest

Sat Jan 17, 2009 12:35 pm   



Rzeźbię teraz bootloader na Atmega8, który ściąga firmware przez I2C,
niestety dzieją się dziwne rzeczy.
Kod bootloadera uruchamia się, kontrolna dioda miga w określonej
sekwencji, czyli jest ok. W momencie kiedy wyślę pierwszy bajt po I2C,
układ się resetuje.
Podejrzewałem 1 z 3 możliwości:

1. Kod bootloadera jest za duży i nie mieści się w obszarze 1024 słów
(ale to wyeliminowałem przez porównanie zawartości flasha z tym co do
niego ładuję)

2. Jest niepoprawnie ustawiony wektor przerwania TWI i w momencie
otrzymania danej skacze gdzieś w maliny.

Na początku programu przepisuję tablicę wektorów przerwań:
GICR = (1<<IVCE);
GICR = (1<<IVSEL);

W pliku . map mam taki wpis:
0x00000d4e __vector_17

A w .lst taki:
302 .global __vector_17
304 __vector_17:
305 .LFB15:
306 .LM55:
307 /* prologue: frame size=0 */
308 00e2 1F92 push __zero_reg__

Więc wygląda, że wszystko jest na miejscu.

3. Ta opcja wygląda mi najbardziej podejrzanie: być może mam źle
ustawiony wskaźnik stosu i program resetuje się przy próbie powrotu z
przerwania.

HELP!

Dariusz Żołna

T.M.F.
Guest

Sat Jan 17, 2009 3:43 pm   



Dariusz Zolna pisze:
Quote:
Rzeźbię teraz bootloader na Atmega8, który ściąga firmware przez I2C,
niestety dzieją się dziwne rzeczy.
Kod bootloadera uruchamia się, kontrolna dioda miga w określonej
sekwencji, czyli jest ok. W momencie kiedy wyślę pierwszy bajt po I2C,
układ się resetuje.

Odpal to w AVR Studio i podejrzyj co sie dzieje.
Sprawdz boot lock bits, bootrst i IVSEL, bo nie wiadomo gdzie masz
wektor dla resetu, w SPMCR czy nie masz odblokowanych przerwan SPM,
ktorych nie obslugujesz.

Dariusz Zolna
Guest

Mon Jan 19, 2009 1:38 pm   



T.M.F. pisze:
Quote:
Odpal to w AVR Studio i podejrzyj co sie dzieje.
Sprawdz boot lock bits, bootrst i IVSEL, bo nie wiadomo gdzie masz
wektor dla resetu, w SPMCR czy nie masz odblokowanych przerwan SPM,
ktorych nie obslugujesz.

Dzięki. Jednak było to coś zupełnie innego niż przypuszczałem.
W dokumentacji Atmel podaje adress bootloadera w _słowach_ (zupełnie nie
wiem w jakim celu), a linkerowi trzeba podać w _bajtach_. Poprawiłem
makefile i wszystko śmiga.

Dariusz Żołna

T.M.F.
Guest

Mon Jan 19, 2009 5:17 pm   



Quote:
Dzięki. Jednak było to coś zupełnie innego niż przypuszczałem.
W dokumentacji Atmel podaje adress bootloadera w _słowach_ (zupełnie nie
wiem w jakim celu), a linkerowi trzeba podać w _bajtach_. Poprawiłem
makefile i wszystko śmiga.

Dlatego w slowach, ze tak jest adresowana pamiec FLASH.

Dariusz Zolna
Guest

Mon Jan 19, 2009 6:58 pm   



T.M.F. pisze:
Quote:
Dzięki. Jednak było to coś zupełnie innego niż przypuszczałem.
W dokumentacji Atmel podaje adress bootloadera w _słowach_ (zupełnie
nie wiem w jakim celu), a linkerowi trzeba podać w _bajtach_.
Poprawiłem makefile i wszystko śmiga.

Dlatego w slowach, ze tak jest adresowana pamiec FLASH.

A adres w tej pamięci podaje się w bajtach, więc nie tyle jest
adresowana w słowach, co zapisać i odczytać można tylko pełne słowo.

Dariusz Żołna

T.M.F.
Guest

Mon Jan 19, 2009 7:44 pm   



Dariusz Zolna pisze:
Quote:
T.M.F. pisze:
Dzięki. Jednak było to coś zupełnie innego niż przypuszczałem.
W dokumentacji Atmel podaje adress bootloadera w _słowach_ (zupełnie
nie wiem w jakim celu), a linkerowi trzeba podać w _bajtach_.
Poprawiłem makefile i wszystko śmiga.

Dlatego w slowach, ze tak jest adresowana pamiec FLASH.

A adres w tej pamięci podaje się w bajtach, więc nie tyle jest
adresowana w słowach, co zapisać i odczytać można tylko pełne słowo.

Adresowana jest w slowach i tak sie podaje jej adres. Zauwaz, ze adresy
wszystkich stalych we FLASHu trzeba pomnozyc razy dwa. W slowach operuja
tez instrukcje skoku, jedyny wyjatek to instrukcje LPM i ELPM, ktore
operuja na adresie podanym w bajtach. I akurat o ile zapisac mozna tylko
pelne slowo (instrukcja SPM operuje wylacznie na slowach, rejestr Z
zawiera adres slowa zapisywanej komorki, a nie bajtu) to instrukcje
LPM/ELPM umozliwiaja odczyt pojedynczych bajtow, a nie slow. Moze to
troche pokrecone ale pewien sens ma, szczegolnie jesli patrzec na
architekture procesora.

elektroda NewsGroups Forum Index - Elektronika Polska - Debugowanie bootloadera na Atmega8: reset po wysłaniu bajtu przez I2C?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map