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.
sehe ich das richtig das du in ASM Programmierst? Wenn ja, dann sind da aber sehr viele magic-numbers drin.
1 | ldi Lowbyte, 0xff ; Stackpointer initialisieren |
2 | out 0x3d, Lowbyte |
3 | ldi Highbyte, 0x03 |
4 | out 0x3e, Highbyte |
dafür gibt es doch extra makros (memend, high, low usw ) Auch hier könnten schon ein fehler sein.
1 | externalInterrupt: |
2 | |
3 | in Value, 0x3b ; externes Interruptregister lesen |
4 | cbr Value, 0x40 ; Interrupt sperren |
5 | out 0x3b, Value |
6 | rcall twowire_Transmit_Startcondition ; Daten senden |
7 | reti |
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.
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.