Forum: Mikrocontroller und Digitale Elektronik ATmega328p + stk500v2 (Peter ihm sein Bootloader), Flash bleibt leer


von Simon (Gast)


Lesenswert?

Hey Leute,
ich hab mir wirklich Mühe gegeben selbst zu suchen, allerdings bin ich 
erfolglos geblieben. Daher nun die Frage an euch:

Ich setze auf verschiedenen Controllern den stk500v2 Bootloader von 
Peter Fleury ein. Teilweise mit einigen Zusätzen, teilweise gestrippt, 
teilweise original. Das hat stehts gut geklappt. (danke Peter :D )

Jetzt ist mir ein ATmega328P unter gekommen, der dann auch den 
Bootloader bekommen sollte. Soweit alles angepasst, geflashed, connected 
=> läuft. Ich erhalte alle Antworten und avrdude schreibt das Hex File 
komplett.
Nur startete danach meine Applikation nicht.
Hmm gewundert und mit meinem mkII den Controller ausgelesen: Alles "FF" 
bis auf den Bootloader.

Gewundert. Etwas debug in den Bootloader geschmissen und festgestellt 
das alles korrekt ausgeführt wird, trotzdem bleibts beim "FF".

Dann hab ich einfach mal stumpf zum testen ganz vorne direkt nach dem 
start der main() folgendes eingefügt:

  boot_page_erase(0);
  boot_spm_busy_wait();
  unsigned int temp=(0x12)<<8 | 0x11;
  boot_page_fill(0,temp);
  boot_page_write(0);
  boot_spm_busy_wait();
  boot_rww_enable();

Flash ausgelesen: Alles "FF". Dann hab ich an mir selbst gezweifelt, und 
meinen ATm2560 mit dem selben Startblock getestet: geht 1A, die ersten 
Bytes sind 0x12 und 0x11. Alles super.

Nun also die Quizfrage: Warum wird der Schreibvorgang im ATm328 
ausgeführt, aber es landet nix im Flash.
Die LockBits sind nicht gesetzt, ich kann auch mit dem MKII den Bereich 
beschreiben und wieder auslesen, der Speicher ist also auch nicht 
defekt.
Ich hab absolut keinen Schimmer woran es liegen kann. Habt ihr eine 
Idee?

Laut Datenblatt des Atm328P unterstützt der 328 Bootloader, außerdem 
wird exakt der oben aufgeführte Code Block empfohlen.
Ich bin total Ratlos.

Gruß und vielen Dank Simon

von Stefan (Gast)


Lesenswert?

Im Datenblatt werden die von die zittierten C Prozeduren nicht genannt. 
Die Frage ist, ob diese Prozeduren überhaupt DIESEN ATmega Typ 
unterstützen. Im Datenblatt steht, dass ein ziemlich exaktes Timing 
eingehalten werden muss. Ist das der Fall? Hast du es kontrolliert oder 
nur tehoretisch berechnet?

Vergleiche das compilierte Programm mit dem Assembler-Beispiel aus dem 
Datenblatt.

von Daniel C. (cecky)


Lesenswert?

Eine Lösung für dein Problem kann ich dir leider auch nicht anbieten.
Aber ich habe besagten Bootloader bereits auf einem Crumb328 mit 
ATmega328(P) erfolgreich eingesetzt. Funktioniert also ohne Probleme auf 
dem 328!

von Simon (Gast)


Lesenswert?

Hey Leute,
ich hab irgendwie vergessen nachzusehen:
Also Stefan, du hast recht, es stand in der boot.c und nicht im 
Datenblatt.
Ich habe daraufhin mir die Assambler Befehle im Datenblatt angesehen und 
mit denen im lss-file von avr-gcc verglichen. Ich muss zugeben, dass 
meine Assambler Erfahrungen begrenzt sind, aber zumindest habe ich alle 
die Befehle wieder gefunden. -> in richtiger Reihenfolge an der 
gesuchten Stelle.
Ein weiter Grund der mich bestärkt das es klappen könnte liegt darin, 
das der Assambler Code zwischen ATmega2560 und ATmega328 laut Datenblatt 
identisch ist und auch die lss Files ähnlich sind.

Wenn Daniel jetzt auch noch bestätigt das es möglich ist habe ich noch 
2..3.. Fragen.

Benutzt du den interenen Oszilator? Das mache ich zwar aktuell noch 
(8Mhz), will ich aber ändern. Nutzt du als Baudrate 115200?
stk500v2 ist ja klar denke ich mal. Könntest du mir vielleicht die 
sourcen irgendwo hochladen?

Ich habe jetzt gestern nach erfolgloser Suche im Assambler file im 
Internet rumgewuselt und habe gesehen das der Bootloader des Arduino 
auch für einene 328p existiert. Dort habe ich gesehen das sie eine 
abweichende Prozedure zum Beschreiben des Flash benutzen. Begründet wird 
dies mit Speicherplatz Einsparung. Als ich die Procedur kopieren wollte, 
ist mir aufgefallen das der standard skt500v2 Code von Peter gar nicht 
checkt ob die BaudRate abweicht. Dies hinzugefügt führt nun dazu das 
mein Code nicht mehr kompiliert da ich mit dem internen RC (ja, Schande 
über mein Haupt) und 115k eine Abweichung von 8% erzeugt. In der Tat 
habe ich auch viele communication error. Ich denke dem Problem sollte 
ich mich zuerst annehmen, oder? 115k lässt sich bedingt durch meine 
Architektur nicht ändern.

Gruß und danke für eure Hilfe!
Simon

von Daniel C. (cecky)


Angehängte Dateien:

Lesenswert?

Hi,
hier mal der Bootloader. Ist allerdings etwas modifiziert (Bootloader 
startet automatisch nach Watchdog-Reset). Bis jetzt habe ich ihn 
erfolgreich eingesetzt auf mega8, mega88, mega328, mega16 und mega128. 
115200 sind natürlich zwingend erforderlich! Mit internem RC wirds aber 
nicht klappen, da der Fehler einfach zu groß ist. Da musst du schon 
einen entsprechenden Baudraten-Quarz benutzen. Viel erfolg

von Simon (Gast)


Lesenswert?

Moin, danke dir sehr.
Ich konnte es natürlich nicht lassen und habe gleich getestet.
Im wensentlichen sehen ich keinen Unterschied :( aber ich denke mal ich 
muss auch zuerst das 8mhz => 115.2 k problem lösen.

Auf der nächsten Platine sitzt ein 16Mhz - Quarz, dann sollte das sauber 
teilbar sein.
Ich werde berichten, auch wenn das jetzt erstmal etwas dauern wird.

Aber vielen dank für die Bereitschaft!!
Gruß Kolja

von holger (Gast)


Lesenswert?

>aber ich denke mal ich muss auch zuerst das 8mhz => 115.2 k problem lösen.

Kannste vergessen. Fehler zu hoch.

>Auf der nächsten Platine sitzt ein 16Mhz - Quarz, dann sollte das sauber
>teilbar sein.

Kannste auch vergessen. Fehler zu hoch.

Nimm einen 14.7456 MHz Quarz.

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.