mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Seltsames Phönomen ATMEGA32


Autor: Torsten O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin M. (mmc8801)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kannst du mal deinen Sourcecode posten?

Autor: Torsten O. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ja gerne, meinst du es ist doch ein Fehler drin?

lg Torsten

Autor: Torsten O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sehe ich das richtig das du in ASM Programmierst?

Wenn ja, dann sind da aber sehr viele magic-numbers drin.
ldi    Lowbyte, 0xff  ; Stackpointer initialisieren
out    0x3d, Lowbyte
ldi    Highbyte, 0x03
out    0x3e, Highbyte

dafür gibt es doch extra makros (memend, high, low usw )


Auch hier könnten schon ein fehler sein.
externalInterrupt:

in    Value, 0x3b     ; externes Interruptregister lesen
cbr    Value, 0x40  ; Interrupt sperren
out    0x3b, Value
rcall  twowire_Transmit_Startcondition  ; Daten senden
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

Autor: Torsten O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Torsten O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.