Ich habe seit heute den Programmspeicher zu ca. 95% belegt. Jetzt startet der Atmega8 plötzlich nicht immer, wenn die Versorgungsspannung angelegt wird. Mit dem alten Programm funktioniert er dagegen einwandfrei. Das dürfte doch eigentlich kein Problem sein, den Programmspeicher komplett auszunutzen?
Die Änderung in Zeile 97 war es! Grüße Bernhard
Es gibt keinen leeren Speicher. 0x00 bzw 0xFF sind auch Daten
> Das dürfte doch eigentlich kein Problem sein, den > Programmspeicher komplett auszunutzen? Doch, manchmal möchte der Controller ein Bäuerchen machen, wenn er zu voll ist. Einfach öfter probieren, irgendwann geht es bestimmt.
Die Software kann ja nicht beeinflussen, dass die Hardware manchmal garnicht startet. Wenn ich zum Testen den Code verkleinere, dann nur in der Hauptschleife, in der auch keinerlei Fuses etc. gesetzt werden. Ich spare also nur einige Dutzend If-Abfragen ein. Das einzige was es noch sein könnte ist dann also die Größe?
> Die Software kann ja nicht beeinflussen, dass die Hardware manchmal > garnicht startet. Ja wer denn sonst, wenn der einzige Unterschied das Programm ist? > Wenn ich zum Testen den Code verkleinere, dann nur in > der Hauptschleife, in der auch keinerlei Fuses etc. gesetzt werden. Ja wo setzt Du denn die Fuses? Im Interrupt? Wenn in der Huptschleife eine Endlosschleife drin ist bewegt sich nichts mehr (deshalb heißt die auch Endlosschleife)
Bis jetzt sind zwei Dinge bekannt: 1. Die Software eines funktionierenden Systems wurde geändert. 2. Anschließend treten intermittierende Fehler auf. Nichts weiter ist bekannt; der gesamte Rest ist Spekulation. @Hardy: Bitte Hausaufgaben machen und alle die Dinge nachliefern, die bereits in den Originalbeitrag gehörten: - Programmiersprache - Was sind die präzisen Fehlersymptome - Was wurde alles geändert Nützlich wären zusätzlich die Compilder- und Linkermeldungen über Speicherbedarf u.ä.! Last but not Least: Woran ist erkennbar, daß die HW manchmal garnicht anläuft? Ist es absolut sicher, daß in diesem Fehlerfall nicht eine Instruktion durchlaufen wurde? Bernhard
Die Programmiersprache ist C und wird unter Windows mit WinAVR im AVRStudio geschrieben.
1 | int main(void) |
2 | {
|
3 | initialisierungen(); |
4 | LEDan(); |
5 | |
6 | while(1) |
7 | {
|
8 | if ( ) |
9 | ....
|
10 | if ( ) |
11 | ....
|
12 | if ( ) |
13 | ....
|
14 | if ( ) |
15 | ....
|
16 | if ( ) |
17 | ....
|
18 | if ( ) |
19 | ....
|
20 | }
|
21 | }
|
Die if-Bedingungen werden z.B. vom Timer, vom Taster und vom Interrupt auf wahr gesetzt und führen dann einige Funktionen aus. Das seltsame daran ist jetzt, dass wenn die Menge des Codes in der while-Schleife zu viel wird, der Atmega8 nicht immer zuverlässig startet. Wenn er einmal startet, funktioniert auch alles. Dass er garnicht erst startet sehe ich daran, dass die LED dann auch nicht leuchtet. Wenn ich jetzt eine dtostrf() auskommentiere, dann sinkt der Speicherbedarf von 96,6% auf 82,4% und schon startet der Atmega jedes mal. Genauso kann ich aber auch beliebige andere Funktionen auskommentieren und es läuft wieder. Der Compiler optimiert mit -0s. Die Compilerausgabe: Program: 7914 bytes (96.6 % Full) (.text + .data + .bootloader) Data: 146 bytes (14.3% Full) (.data + .bss + .noinit)
Das "stinkt" nach Software-Problemen in der Initialisierung (vor main?). Stack-Overflow? Was geschieht denn bei Testläufen im AVRStudio? Braucht die SW unbedingt Floating-Point? Aber Hardware-Fehler - das paßt nicht ganz. Vor allen Dingen, wenn beim Programmieren der Verify hinhaut! Grüße Bernhard P.s. Diese Fehlersymptomatik ist grottenhäßlich und verlangt viiiiiel Zeit.
Na so nach und nach kommen ja doch noch ein paar Informationen... Schau die mal das Listing an, ob vielleicht das Programm über den eingestellten bootloader vektor drüberläuft (falls der Bootloader aktiv ist)
Jep, das war der Fehler. Der Bootloader-Vektor war noch aktiviert. Ohne diesen startet das Programm immer.
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.