Frage zum Timer1

Gast #1162245
Lesenswert?

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:

1
  
2
    ldi    r17, 101
3
    ldi    r18, 17
4

5
    rjmp  loop
6

7
  
8
  loop:
9
    rjmp   loop   
10

11
  
12
  timer1_overflow:
13

14
    cpi    r17, 0
15
    breq  loop2
16
    dec    r17
17
    
18
    rjmp  loop
19

20
  
21
  loop2:
22
  
23
    ldi    r17, 101
24
    cpi    r18, 0
25
    breq  loop3
26
    dec    r18
27
    
28
    rjmp   loop
29

30
  loop3:
31

32
    ldi    temp, 0b11111110
33
    out   PORTD, temp
34

35
    rjmp   loop

Vielen Dank

Flo
#1162291
Lesenswert?

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).
#1162297
Lesenswert?

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

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..."
Persönliche Seite #1162408
Lesenswert?

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.

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