Seltsames Phönomen ATMEGA32

Gast #1413302
Lesenswert?

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
Gast #1413378
Lesenswert?

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
Gast #1413396
Lesenswert?

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
Gast #1413407
Lesenswert?

> 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.
Gast #1413411
Lesenswert?

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
#1413429
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren