Bootloader für AtMega168A flasht nicht

OP #3194483
Lesenswert?

Hallo zusammen,

ich möchte eine Bootloader realisieren und habe habe für meinem 
AtMega168A Mikrocontroller den folgenden Bootloader 1:1 verwendet:

[http://www.mikrocontroller.net/articles/AVR_Bootloader_in_C_-_eine_einfache_Anleitung]

Mein Problem ist, dass er nach dem Flash nicht in die Applikation 
springt.

Ich habe bereits die verschiedensten Einstellungen vorgenommen, leider 
ohne Erfolg (vgl. angehängte Fotos)

Hat von Euch jemand eine Idee an welcher Stelle es noch haken kann?

Noch zu Info: Den UART Empfang habe ich ohne Interrupts gelöst.

Danke für Eure Hilfe!!
Angehängte Dateien:
OP #3194517
Lesenswert?

Hi,
sorry für die dünne Beschreibung!

Nein 100%ig sicher bin ich mir noch nicht.

Wie kann man denn den Flash Speicher per Programmer zurücklesen? Das 
Problem ist nämlich das ich bei diesem Controller auch keine Möglichkeit 
habe über JTAG zu debuggen.

Wenn man die einzelnen Pages auslesen könnte und per UART zurücksenden 
könnte dann würde mir das sehr helfen! Leider weiß ich nicht wie man den 
Flash Speicher wieder ausließt.

Als Applikation habe ich ein Mini-Programm geschrieben das Bytes per 
UART sendet. Das er nicht die Applikation anspringt schließe ich daraus 
dass keine Zeichen nach dem Flash gesendet werden.
#3194522
Lesenswert?

Wie hast du denn den Bootlader in den Chip geschossen? Mit dem gleichen 
Werkzeug sollte es möglich sein, den kompletten Speicher auszulesen.

Hast du dein Mini-Programm einmal separat getestet, also per Programmer 
geflasht, nicht per Bootlader? Funktioniert es dann?
OP #3194536
Lesenswert?

Der Tip war gut. Mit meinem Programmer kann ich den Flash Speicher 
auslesen. Das dann erzeugte Hexfile ist an der Adresse 0x0000 in der Tat 
leer.

Als Flash-Funktion verwende ich die aus oben genanntem Beispiel:
1
void program_page (uint32_t page, uint8_t *buf)
2
{
3
    uint16_t i;
4
    uint8_t sreg;
5
 
6
    /* Disable interrupts */
7
    sreg = SREG;
8
    cli();
9
 
10
    eeprom_busy_wait ();
11
 
12
    boot_page_erase (page);
13
    boot_spm_busy_wait ();      /* Wait until the memory is erased. */
14
 
15
    for (i=0; i<SPM_PAGESIZE; i+=2)
16
    {
17
        /* Set up little-endian word. */
18
        uint16_t w = *buf++;
19
        w += (*buf++) << 8;
20
    
21
        boot_page_fill (page + i, w);
22
    }
23
 
24
    boot_page_write (page);     /* Store buffer in flash page.    */
25
    boot_spm_busy_wait();       /* Wait until the memory is written.*/
26
 
27
    /* Reenable RWW-section again. We need this if we want to jump back */
28
    /* to the application after bootloading. */
29
    boot_rww_enable ();
30
 
31
    /* Re-enable interrupts (if they were ever enabled). */
32
    SREG = sreg;
33
}


Ja ich habe bereits das Mini-Programm vorher ohne Bootloader geflasht. 
Funktioniert einwandfrei!
OP #3194559
Lesenswert?

Hi Stefan,

es lag in der Tat an der falsch eingetragenen Adresse. Jetzt schreibt er 
an die Adresse 0x0000 die Applikation. Leider sind jetzt noch einige 
Bytes nicht identisch aber das liegt noch an meiner Uart Übertragung.

Schonmal vielen Dank für Eure Bemühungen!!!!
#3194585
Lesenswert?

T. F. schrieb:
> Wie kann man denn den Flash Speicher per Programmer zurücklesen? Das
> Problem ist nämlich das ich bei diesem Controller auch keine Möglichkeit
> habe über JTAG zu debuggen.
Das Problem ist, daß du dich weder mit dem Manual deines Programmers 
noch mit dem Datenblatt des 168a befasst hast sondern einfach nur 
vorhandene Programme abtippst. Denn sonst wüsstest du, daß ein 168a 
Debugwire hat und was man damit machen kann.

mfg.
OP #3194605
Lesenswert?

Hallo Herr Eckmann,

Ihre Aussage finde ich jetzt ein wenig schwach. Ich habe mich sehr wohl 
mit dem Datenblatt sowie den Controller selber auseinander gesetzt. Da 
ich aber nach drei Tagen immer noch keinen Erfolg hatte, habe ich mir 
erlaubt hier mal nachzufragen, was Ursachen sein könnten. Ich wusste 
sehr wohl das der AtMega168A einen Debug Wire hat. Leider stecke ich 
nicht so tief wie Sie in der Materie, sodass der mir nicht weiter 
geholfen hat. Das ich mich für den Beispielcode entschieden habe liegt 
schlicht weg daran dass ich zunächst möglich Fehlerquellen durch eigenen 
Code vermeiden wollte. Finde ich persönlich als Einsteiger keine 
schlechte Idee. Schließlich ist dieses Forum ja auch dazu da um sich 
auszutauschen.

Viele Grüße
OP #3231950
Lesenswert?

Hi zusammen,

ich habe obenstehenden Bootloader bei mir implementiert und er 
funktioniert auch soweit einwandfrei. Ich habe jetzt noch die 
Möglichkeit das ich per Commando aus der Applikation wieder in den 
Bootloader springe mit:
1
void (*bootloader)( void ) = (void*) 0x1C00;

Das klappt auch soweit. Das komische ist das er jedoch dann nicht im 
Bootloader bleibt und automatisch die Applikation wieder startet. Ist 
das Normal sobald die Applikation geflasht ist? Wodrann könnte so etwas 
liegen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren