G' Morgen, ich habe mir als Statusanzeige ein paar Routinen programmiert
die eine gelbe und eine rote LED blinken lassen. Zum Testen lasse ich
die gelbe LED einmal blinken und die rote zwei Mal, danach folgt eine
kleine Pause. Dummerweise habe ich das Problem, dass die Sequenz
manchmal nur ein einziges Mal funktioniert. Manchmal funktioniert es
dauerhaft. Ich konnte bisher nicht erkennen woran das liegt, sicher ist,
dass ich den Quelltext zwischenzeitlich NICHT ändere.
Kann das an Strom- oder Spannungsschwankungen liegen? Oder muss ich beim
Anschließen des Controllers irgendwas beachten? Ich werde bald
wahnsinnig wegen diesem Fehler, weil ich schon einen Fehler in meiner
Software gesucht habe den es gar nicht gibt. Kann mir da jemand einen
Tipp geben?
Vielen Dank im voraus
lg Torsten
Ich glaube ich habe das Problem gefunden, es könnte sein, dass mein
"preiswertes" Labornetzteil die Probleme verursacht. Mit 4.8V aus vier
Akkus scheint es funktionieren.
lg Torsten
Torsten Ohne schrieb:
> Ich glaube ich habe das Problem gefunden, es könnte sein, dass mein> "preiswertes" Labornetzteil die Probleme verursacht.
Hast du Pufferkondensatoren eingebaut?
> Oder muss ich beim Anschließen des Controllers irgendwas beachten?
Ja, auf die Pufferkondensatoren/Entkopplungskondensatoren.
du sicherst überhaupt keine register (kann ja noch ok sein) aber das
Prozessorregister musst du auf jeden fall sichern.
Auch das Sperren der Interupts macht der Atmel von selber
Ja, sorry. Ich kann mich mit den ganzen Bezeichnungen nicht anfreunden,
arbeite lieber direkt mit den Registeradressen. Was das Statusregister
angeht sichere es ich generell nur wenn ich es in einem Unterprogramm
verändere und in der übergeordneten Routine wieder brauch, also nur wenn
es wirklich notwendig ist. Bisher hatte ich nie Probleme was das angeht.
Sonst arbeite ich auch mit einem ATMEGA48, da hatte ich solche kuriosen
Schwierigkeiten auch nicht.
Die Pufferkondensatoren sind dran, je einer an VCC und GND mit jeweils
100µ. Am Netzteil liegt es offensichtlich auch nicht :( Der Fehler
scheint nur auzutreten wenn man die Versorgungsspannung lange genug
abklemmt.
lg Torsten
> Was das Statusregister> angeht sichere es ich generell nur wenn ich es in einem Unterprogramm> verändere und in der übergeordneten Routine wieder brauch, also nur wenn> es wirklich notwendig ist
und woher weist du da es bei einem Interupt der an jeder stelle
auftreten kann nicht gebraucht wird? Es ist zwingend notwendig das
Status-Register zu sichern (wenn es geändert wird) weil du überhaupt
nicht wissen kannst ob es noch gebraucht wird.
Ja, aber ich arbeite grundsätzlich mit Interrupts. Es werden also nur
Routinen durch ausgelöste Interrupts angesprungen, und wenn erstmal
einer ausgelöst ist kann ja kein zweiter ausgelöst werden.
lg Torsten
Torsten Ohne schrieb:
> sichere es ich generell nur wenn ich es in einem Unterprogramm> verändere und in der übergeordneten Routine wieder brauch, also nur wenn> es wirklich notwendig ist.
An dieser Stelle ist Geiz nicht wirklich geil, sondern auf lange Sicht
ein Garant für fröhliche Fehlersuch-Orgien.
Meistens ist defensives Programmieren die bessere Option.
Und wenn deine ISR so knapp ist, dass wirklich jeder Taktzyklus zählt,
dann machst du sowieso etwas falsch (es gibt auch Ausnahmen: zb
Videotiming ist zeitkritisch. Aber Ausnahmen bestätigen die Regel)
Und zum Thema Registeradressen bzw. Bitnamen: Irgendwann wird dir keiner
mehr helfen wollen, weil es jedem zu blöd ist, zum x-ten mal im
Datenblatt rauszusuchen, was du da eigentlich treibst.
Allerdings: All das dürfte nichts mit deinem jetzigen Problem zu tun
haben. Das klingt tatsächlich nach einem Hardwareproblem.
Eine eigene Frage?
Dieser Thread ist über 17 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.