Forum: Mikrocontroller und Digitale Elektronik Frage zum Timer1


von Flo (Gast)


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

von Johannes M. (johnny-m)


Lesenswert?

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?

von Flo (Gast)


Lesenswert?

Entschuldigung,

aber ich dachte, das bei dieser Fragestellung die µc auswahl nachrangig 
wär. Aber um die Gemüter zu Befriedigen:

 ATmega 16


MfG Flo

von Johannes M. (johnny-m)


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).

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Johannes M. (johnny-m)


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...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Stimmt. Muss man relativieren. Der Code ist sehr sehr wahrscheinlich 
falsch.

von Johannes M. (johnny-m)


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..."

von Flo (Gast)


Angehängte Dateien:

Lesenswert?

Im Anhang mal die Vorläufige Version....

von Stefan B. (stefan) Benutzerseite


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.

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.