Hallo zusammen,
Ich habe eine selbstgebaute Mikroncontrollerplatine mit einem
ATmega32U2, der von Werk aus einen USB-Bootloader besitzt. Über diesen
Programmiere ich den Controller und da ich damals auf einen Reset Taster
verzichtet hat, muss dieser über die Software aktiviert werden. Dazu
verwende ich folgende Routine:
USB_Disable();
Delay_MS(2000);
cli();
PORTB = 0x00;
Delay_MS(2000);
_asm_ ("jmp 0x7000;");
Das funktioniert in 20% der Fälle und in den restlichen hängt der uC
sich irgend wo auf und macht nichts, bis ich einen Hardware Reset
durchführe. Es ist schon eine Weile her, dass ich dies programmiert habe
und ich konnte auch nicht mehr herausfinden woher ich die Adresse 0x7000
habe, jedoch gehe ich davon aus das, das der Anfang vom Bootloader ist.
Hat jemand eine Idee das ganze zuverlässiger zu gestalten?
>Hat jemand eine Idee das ganze zuverlässiger zu gestalten?
Watchdog aktivieren und nicht triggern löst einen Reset aus.
Das ist richtig, jedoch startet er doch wieder das Programm und nicht den Bootloader, wenn der Reset vom Watchdog gekommen ist.
> ...Adresse 0x7000..., das der Anfang vom Bootloader ist
Byte oder Wort? Im Datenblatt finde ich nur 0x3800 (neben 0x3C00, 0x3E00
und 0x3F00) unter "Boot Size Configuration(1)(Word Addresses)".
Auch könnte es vielleicht sein, dass der Programmierer sich auf die
Defaultwerte der SFRs nach einem Reset verlassen hat, was ja später
nicht mehr gegeben ist.
Das wars, mit 0x3800 funktioniert es ohne Probleme. Keine Ahnung wie ich damals auf 0x7000 gekommen bin.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.