Forum: Mikrocontroller und Digitale Elektronik Seltsames Phönomen ATMEGA32


von Torsten O. (Gast)


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

von Martin M. (mmc8801)


Lesenswert?

kannst du mal deinen Sourcecode posten?

von Torsten O. (Gast)


Angehängte Dateien:

Lesenswert?

Ja gerne, meinst du es ist doch ein Fehler drin?

lg Torsten

von Torsten O. (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von Peter (Gast)


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

von Torsten O. (Gast)


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

von Peter (Gast)


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.

von Torsten O. (Gast)


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

von Karl H. (kbuchegg)


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.

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.