Hallo die Herren, hätte da noch eine Frage zum Bootloader: Ich habe es mit der Anleitung aus dem Forum: http://www.mikrocontroller.net/articles/AVR_Bootloader_in_C_-_eine_einfache_Anleitung mittlerweile geschafft das ich das ganze HEX-File in den Flash-Speicher schreiben kann. Danach sollte der Controller allerdings automatisch in das Anwenderprogramm springen. Dies macht er aber nicht. Wenn ich einen Hardware Reset des Controllers durchführe: Springt er zuerst in den Bootloader. Wartet 10 sec auf eine Eingabe. Springt danach in das Anwender Programm. Wieso macht er dies den nicht ohne einen HWR nach dem Flashen mittels des Bootloaders? Verwende einen ATmega32 und Codevision. Poste auch gerne den Programmcode falls gewünscht, nur denke ich mir das der ganze dann doch etwas unübersichtlich ist. mfg
ok ich musste REENABLE_RWW zu einem späteren Zeitpunkt nochmals aufrufen.
1 | void REENABLE_RWW(void) |
2 | {
|
3 | #asm("ldi r17,0x11"); //Bit 0 – SPMEN: Store Program Memory Enable, Bit 4 – RWWSRE: Read-While-Write Section Read Enable
|
4 | DO_SPM(); |
5 | }
|
der Ursprüngliche Aufruf nach dem Page_WRITE hat anscheinend nicht funktioniert, da ich die Funktion "boot_spm_busy_wait();" falsch umgesetzt habe. void PAGE_WRITE(void) { #asm movw r30,r6; //move CurrentAddress to Z pointer ldi r17,0x05; //Bit 0 – SPMEN: Store Program Memory Enable, Bit 2 – PGWRT: Page Write #endasm DO_SPM(); } Wie setzte ich die Funktion: boot_spm_busy_wait() den richtig um? Dachte eigentlich das mein void DO_SPM(void) dies mit dem sbrc "r16,0x01;" beinhaltet.
1 | void DO_SPM(void) |
2 | {
|
3 | #asm
|
4 | WAIT_SPM:
|
5 | in r16,0x37; //SPMCR in Register r16 einlesen 37= Address von SPMCR, passt für ATmega32 |
6 | sbrc r16,0x01; //Skip if Bit in Register is Cleared |
7 | //The SPMEN bit will auto-clear upon completion of an SPM instruction,
|
8 | //or if no SPM instruction is executed within four clock cycles. During page erase and page write,
|
9 | //the SPMEN bit remains high until the operation is completed.
|
10 | rjmp WAIT_SPM; |
11 | out 0x37,r17; //schreibe in SPMCR-Register und führe aus |
12 | spm; |
13 | #endasm
|
14 | }
|
Oder liege ich mit meiner Vermutung hier ganz falsch?
ok muss wahrscheinlichdas BIT6 des SPMCR abfragen und so lange warten wie gesetzt. • Bit 6 – RWWSB: Read-While-Write Section Busy When a self-programming (Page Erase or Page Write) operation to the RWW section is initiated, the RWWSB will be set (one) by hardware. When the RWWSB bit is set, the RWW section cannot be accessed. The RWWSB bit will be cleared if the RWWSRE bit is written to one after a Self-Programming operation is completed. Alternatively the RWWSB bit will automatically be cleared if a page load operation is initiated. Richtig?
Leider hilft
1 | void boot_spm_busy_wait(void) |
2 | {
|
3 | while ( !(SPMCR & (1 << 6)) ) {} |
4 | }
|
nicht. "void REENABLE_RWW(void)" muss ich nichts testo trotz vor den Sprung zu Adresse:0 nochmals aufrufen. Nur Warum?
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.