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!!
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.
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.
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?
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!
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).
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!!!!
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.
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.