Forum: Mikrocontroller und Digitale Elektronik Bootloader, eine weitere Frage


von Mark (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

Schick mal deinen Code..

von Mark (Gast)


Lesenswert?

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?

von Mark (Gast)


Lesenswert?

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?

von Mark (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.