Hallo,
ich mochte einen 8-Stunden Timer programmieren. Ich habe berechenet das
ich mit Timer 1 beim größten Vorteiler (1024) 1717 Overflows durchlaufe.
Jetzt wollte ich fragen ob folgender Code richtig ist, oder ob es da
noch was einfacheres oder "eleganteres" gibt, auf 1717 zu zählen.
Die grundeinstellungen (PORT, TIMER, Interrupt-Org.) hab ich jetzt mal
nicht mitkopiert, weil hier gibts ja keine Probleme:
Ist es wirklich so schwer, bei einer Anfrage zu schreiben, um welchen
verd***ten Controller es geht? Wozu steht das eigentlich in den
Forenregeln drin?
Flo wrote:
> aber ich dachte, das bei dieser Fragestellung die µc auswahl nachrangig> wär.
Klar, deshalb gibt's ja so viele Typen von µCs, eben weil die alle
gleich sind...
Dein Codeschnipsel lässt mich allerdings ahnen, dass in dem /nicht
gezeigten/ Teil Deines Programmes etwas ganz wichtiges steckt, das zu
einem vermutlichen generellen Nichtfunktionieren des Codes führt. Wer
oder was ruft eigentlich die Marke timer1_overflow auf? Wenn das mit
einem (r)call geschieht, wo ist dann das ret(i)? Also poste bitte den
kompletten Code (wenn er etwas länger ist, bitte als Anhang, und zwar
als .asm-Datei und nicht als .txt oder so).
Der Code ist falsch:
Es kann nicht sein, dass eine ISR (timer1_overflow) ohne RETI da steht.
Du hast mit RJMP loop eine klassische Endlosschleife *in der
Interruptroutine*
Und:
> Die grundeinstellungen (PORT, TIMER, Interrupt-Org.) hab ich jetzt mal> nicht mitkopiert, weil hier gibts ja keine Probleme
DAS hätte ich nicht gemacht.
Stefan B. wrote:
> Der Code ist falsch:>> Es kann nicht sein, dass eine ISR (timer1_overflow) ohne RETI da steht.
Naja, von Interrupt sehe ich da oben erstmal gar nichts (bis auf den
Kommentar im zweiten Posting). In dem Kontext ist timer1_overflow
zunächst nur eine Marke. Deshalb auch meine obige Nachfrage...
Stefan B. wrote:
> Stimmt. Muss man relativieren. Der Code ist sehr sehr wahrscheinlich> falsch.
Yep. Es ist auch immer wieder erstaunlich, dass viele erstens
hellseherische Fähigkeiten bei anderen voraussetzen und v.a.
genialerweise den Fehler schon auf ein paar Zeilen eingrenzen können.
Der Rest vom Code ist dann ja total uninteressant...
Typ1: "Ich war letztens bei einer Hellseherin."
Typ2: "Und, wie war's?"
Typ1: "Naja, als ich geklingelt hatte, hat sie gerufen 'Wer ist da?' Da
bin ich direkt wieder gegangen..."
Sieht besser aus.
Ein 16-bit Zähler (r17, r18) wird mit der Anzahl der Überläufe gefüllt,
die dann pro Overflow um eins runtergezählt wird. Wenn der Zähler auf 0
steht, wird die Aktion im ISR ausgelöst.
Wenn es eine kurze Aktion wie hier ist, kann man das so machen. Wenn es
eine längere Aktion (LCD-Ausgabe, ADC-Messung...) ist, sollte man die
Aktion in der Hauptschleife loop: ... jrmp loop durchführen.
Der Timer läuft nach dem ersten Anspringen nach 8 h übrigens nicht
initialisiert weiter, d.h. nach der Aktion sollte man den Zähler
entweder neu initialisieren oder den Timer abschalten (disablen).
Timerinitialisierungen mit absoluten Bitwerten kontrolliere ich
prinzipiell nicht.