Forum: Mikrocontroller und Digitale Elektronik Programmreste im Flash / Flash-Speicher löschen mit Bootloader möglich?


von Tobias G. (tobi1435)


Lesenswert?

Hallo,

ich habe vor einiger Zeit angefangen AVRs in C zu programmieren.
Da mein Notebook keine serielle Schnittstelle besitzt, verwende ich 
einen USB-RS232-Konverter und, da ansonsten das Hochladen sehr, sehr 
lange dauert, den Bootloader FBoot.
Ich programmiere zur Zeit einen ATmega32. Hierbei ist mir schon mehrfach 
aufgefallen, dass nach mehrmaligen Hochladen des Programmes der 
Mikrocontroller ungewollte Dinge tut, die nicht programmiert sind.
Ich vermute, dass noch Programmreste vom vorherigen Programm gespeichert 
sind. Ich hatte nämlich zum Testen nach einem großen Programm ein ganz 
einfaches Programm hochgeladen, indem lediglich eine LED blinken sollte. 
Der µC hatte zusätzlich aber auch noch andere Ausgänge angesteuert, die 
in dem vorher hochgeladenen Programm verwendet wurden.
In der kompilierten hex-Datei sind ja nur die Adressen enthalten, die 
für das Programm gebraucht werden. Der Rest ist ja nicht "ff", sondern 
steht garnicht in der Datei. Vermutlich wird der Rest, der nicht mehr 
gebraucht wird, durch das neue Programm nicht überschrieben.

Um dieses Problem nach dem Auftreten zu beheben, habe ich bisher immer 
den Bootloader neu hochgeladen. Allerdings muss ich hierfür jedes mal an 
einen PC mit serieller Schnittstelle gehen.
Ich würde daher gerne wissen, ob ich den Flash-Speicher auch mit FBoot 
komplett bis auf dien entsprechenden Bereich des Bootloaders löschen 
kann oder ob ich beim Bootloader bzw. Kompiler einstellen kann, dass 
dieser das vor jedem Hochladen tut bzw. nicht verwendete Bytes auf "ff" 
setzt.


Im Voraus vielen Dank für eure Antworten.

Viele Grüße,

Tobi

von Floh (Gast)


Lesenswert?

Wenn dein Programm richtig "beendet" wird, sprich mit einer 
Endlosschleife am Schluss, darf es nicht zu irregulärem Verhalten 
kommen.
:-)

von Thomas H. (tux85)


Lesenswert?

hi
mit welcher software programmierst du? avrdude oder so? weil da kannst 
du vor dem flashen einen chip erase machen dann ist der chip vorm 
proggen leer und wird nur mit deinem compilierten programm geflasht. was 
ich mir noch vorstellen könnte ist wenn du ein programm für den avr 
kompilierst und dann hoch lädst dann was änderst im programm und dann 
neu compilierst ohne ein make clean zu machen dann könnte es sein dass 
noch "reste" rumfliegen.

von spess53 (Gast)


Lesenswert?

Hi

>Wenn dein Programm richtig "beendet" wird, sprich mit einer
>Endlosschleife am Schluss, darf es nicht zu irregulärem Verhalten
>kommen.

???

Aber ein funktionierendes Programm interessiert es herzlich wenig, was 
sonst noch im Speicher steht.

MfG Spess

von Peter D. (peda)


Lesenswert?

Tobias G. schrieb:
> Ich hatte nämlich zum Testen nach einem großen Programm ein ganz
> einfaches Programm hochgeladen, indem lediglich eine LED blinken sollte.
> Der µC hatte zusätzlich aber auch noch andere Ausgänge angesteuert, die
> in dem vorher hochgeladenen Programm verwendet wurden.

Zeig mal dieses seltsame Blinkprogramm.

Ein C-Compiler weiß eigentlich immer, welchen Code er erzeugt und dann 
anspringen darf. Er springt nicht einfach in ungenutzte Bereiche und 
daher ist es egal, was da drin steht.


Peter

von Tobias G. (tobi1435)


Lesenswert?

Hallo,

vielen dank für die schnellen Antworten.

meine Programme führen eigentlich immer in eine Endlosschleife.

> mit welcher software programmierst du? avrdude oder so?
Nein, ich lade die Programme mit FBoot hoch, da ich keine echte 
RS232-Schnittstelle habe. Bei FBoot habe ich keine Option zum Löschen 
des Flashes gefunden.
Den Bootloader selbst habe ich an einem anderen PC mit RS232 mit der 
Software PonyProg2000 hochgeladen, dies ging groblemlos.
Make Clean habe ich bisher eigentlich nicht gemacht. Kann das der Grund 
sein?
Allerdings habe ich bei dem jetzt hochgeladenen Programm auch mit Make 
Clean Probleme, da das AVR Pull-Up-Widerstände der Eingänge ausschaltet, 
obwohl dies nicht so programmiert ist. Vielleich hat dies aber auch eine 
andere Ursache als das bisherige "Programmresteproblem".

Das Blinkprogramm, mit dem ich das damals getestet hatte, habe ich nicht 
mehr, aber es sah in etwa so aus:
1
int main (void) {
2
   DDRD = 0b11100000;
3
     while(1)
4
     {
5
       PORTD ^= 0b00100000;
6
     _delay_ms(500);
7
     }
8
     return 0;
9
    }
Hierbei summte zusätzlich der an PC7 angeschlossene Piezosummer, wenn 
man einen an PC2 bzw. PC3 angeschlossenen Taster betätigte. Dies sollte 
allerdings nur in dem vorher hochgeladenen Programm der Fall sein.


Viele Grüße,

Tobi

von Peter D. (peda)


Lesenswert?

Schaust Du Dir auch die Ausgaben des FBOOT an?
Schreib mal das Pause Kommando in die Batch rein, damit das Fenster 
offen bleibt.

Die CRC muß o.k. sein, sonst hats irgendwo gehangen.
Dann kann es gut sein, daß das neue Programm nur teilweise geflasht ist 
und in das alte reinläuft.

Wenn es öfter hängt, mal die Baudrate ändern.


Peter

von Tobias G. (tobi1435)


Lesenswert?

Hallo,

ja, ich achte immer auf die Ausgabe.
Es gibt zwar manchmal Fehler, aber ich lade das Programm so oft hoch, 
bis CRC o.k. ist.
Ich nehme an, sicherer wird es mit einer geringeren Baudrate?


Viele Grüße,

Tobi

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.