Forum: Mikrocontroller und Digitale Elektronik Bootloader für AtMega168A flasht nicht


von T. F. (n3ssaja)


Angehängte Dateien:

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!!

von Georg G. (df2au)


Lesenswert?

Du bist sicher, dass das geflashte Programm an der richtigen Stelle 
eingebracht wurde? Du hast den Flash-Speicher per Programmer zurück 
gelesen und kontrolliert?
Wie erkennst du, dass das Programm nicht angesprungen wird?

Bitte etwas mehr Infos.

von T. F. (n3ssaja)


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.

von Georg G. (df2au)


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?

von T. F. (n3ssaja)


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!

von Stefan E. (sternst)


Lesenswert?

Du hast die falsche Adresse eingetragen. Was bei den Fuses steht ist die 
Word-Adresse (1C00). Diese musst du auch im Studio eintragen. Was im 
lss-File steht sind Byte-Adressen. Dort muss dann also das doppelte 
davon auftauchen (3800).

von T. F. (n3ssaja)


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!!!!

von Thomas E. (thomase)


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.

von T. F. (n3ssaja)


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

von T. F. (n3ssaja)


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?

von Georg G. (df2au)


Lesenswert?

Mit der Zeile definierst du den Einsprungpunkt des Bootladers. Du 
solltest den Sprung dann auch ausführen.

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.