Forum: Mikrocontroller und Digitale Elektronik AVR Programm läuft nur fehlerfrei direkt nach Programmierung mittels ISP


von Daniel H. (danyag)


Lesenswert?

Hey,
ich nutze einen Atmega 328p zur Aufnahme von Sensorwerten, welche 
mittels eines NRF24L01 Funkmoduls an einen anderen µC übertragen werden 
sollen.

Dabei treten ein paar Schwierigkeiten auf, auf die ich mir keinen Reim 
machen kann.
Zur Übersicht teile ich untersuchte bzw. eingegrenzte Szenarios ein:

1. Die int-Werte der Sensoren werden in Strings umgewandelt und gesendet
      1.1 Nach dem Programmieren mit ISP:
           -funktioniert einwandfrei
      1.2 Erneutes Einschalten zu einem beliebigen Zeitpunkt:
           -funktioniert einwandfrei

2. Die Strings werden noch ein wenig umgewandelt (hinzufügen von Kommata 
etc)
      2.1 Nach dem Programmieren mit ISP:
           -funktioniert einwandfrei
      2.2 Erneutes Einschalten zu einem beliebigen Zeitpunkt:
           -Programm läuft ein einziges mal ansatzweise durch, aber
            scheint Fehler zu verursachen. Auch ein Reset bringt
            nichts.


Ich hatte irgendwie an den RAM gedacht, aber soweit ich es beurteilen 
konnte, sollte es da keine Probleme geben. Die SuFu hat einige ähnlichte 
Fälle gefunden, bei denen das Programm nur direkt nach dem Programmieren 
sauber lief, aber einen problemlösenden Ansatz für meinen Fall konnte 
ich leider nicht finden.
Habt ihr vielleicht Ideen wo das Problem genau liegen könnte?


Viele Grüße
Daniel

von google (Gast)


Lesenswert?

Wo ist das Programm?

von Jawoll (Gast)


Lesenswert?

Das RAM wird beim Programmieren über ISP gelöscht. Wenn Dein Programm 
schon mal gelaufen ist und Du nur einen Reset auslöst oder aber der 
Controller neu eingeschaltet wird, ist der zustand des RAMs undefiniert. 
Veranlasse also Deine Init, das RAM komplett auszunullen oder bestimmte 
Werte definiert zu beschreiben.

von Wolfgang (Gast)


Lesenswert?

Daniel H. schrieb:
> Habt ihr vielleicht Ideen wo das Problem genau liegen könnte?

Das wird an deinem Programm liegen. Von selbst macht ein µC gar nichts - 
nicht mal direkt nach dem Flashen.

von Daniel H. (danyag)


Lesenswert?

Jawoll schrieb:
> Veranlasse also Deine Init, das RAM komplett auszunullen oder bestimmte
> Werte definiert zu beschreiben.

Das werde ich gleich mal testen, sobald ich die Gelegenheit habe - 
danke!

google schrieb:
> Wo ist das Programm?

Ich könnte den Code gleich mal hochladen, aber momentan sieht das 
wahrscheinlich etwas chaotisch aus, sodass ich mir dafür erst mal was 
anhören müsste ;x. Ich finde es nur merkwürdig, dass eine Änderung am 
String das oben genannte Fehlerbild erzeugt.

von MikeH (Gast)


Lesenswert?

Möglicherweise ist dein String zu kurz und es wird über das Ende des 
Speicherbereichs hinausgeschrieben oder eine Variable wird nicht 
initialisiert. Schau mal auf eventuelle Warnungen, die der Compiler 
ausgibt.

von Daniel H. (danyag)


Lesenswert?

MikeH schrieb:
> Möglicherweise ist dein String zu kurz und es wird über das Ende des
> Speicherbereichs hinausgeschrieben oder eine Variable wird nicht
> initialisiert

Das hatte ich eigentlich schon überprüft, aber ich checke es nochmal 
sobald ich daheim bin.
Wenn ein string zu kurz initialisiert wird, sollte es dann nicht auch 
direkt nach dem Programmieren durch den ISP zu Fehlern kommen?

von Daniel H. (danyag)


Angehängte Dateien:

Lesenswert?

So, hier ist der verwendete Code.
Die Datei iO.c kennzeichnet das Programm das immer funktioniert. Unter 
niO.c ist das Programm zu finden, das immer nur direkt nach dem 
Programmieren funktioniert.
Der einzige Unterschied ist der mittlere Teil zur Anpassung der Strings, 
der bei iO.c auskommentiert wurde.


Jawoll schrieb:
> Veranlasse also Deine Init, das RAM komplett auszunullen oder bestimmte
> Werte definiert zu beschreiben.

Den RAM komplett auszunullen versuche ich, sobald ich herausgefunden 
habe wie das geht.

Viele Grüße
Daniel

von Bernhard (Gast)


Lesenswert?

Hallo
Ein String muss mit einer 0 terminiert werden
Bei deinen handgemachten Strings machst du das nicht

Bernhard

von Daniel H. (danyag)


Lesenswert?

Bernhard schrieb:
> Ein String muss mit einer 0 terminiert werden

oh, du meine Güte... du hast natürlich Recht.
Die Fehlersymptomatik hat mich überhaupt nicht an sowas denken lassen.
Das Programm funktioniert jetzt wie gewünscht.
  - auch wenn ich gerne verstehe würde warum der fehlerhafte Code
    jedesmal nur direkt nach dem Programmieren funktioniert hat

Vielen Dank für die Hilfe!

von Irgendwer (Gast)


Lesenswert?

Daniel H. schrieb:
> auch wenn ich gerne verstehe würde warum der fehlerhafte Code
>     jedesmal nur direkt nach dem Programmieren funktioniert hat

weil vermutlich beim ersten Durchlauf noch Nullen im RAM-Bereich nach 
deinem String steht. Bei den weiteren versuchen steht da aber 
irgendwelche undefinierten Werte drin du schickst das Ding ins Nirwana.

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.