Forum: Mikrocontroller und Digitale Elektronik Probleme mit Timer 1 im CTC-Modus


von Dagobert (Gast)


Lesenswert?

In einem größeren Projekt soll der Timer 1 des ATmega644(P) jede Sekunde 
einen Interrupt auslösen. Dieser wird auch ausgelöst, nur ungefähr 100x 
in der Sekunde. Der AVR läuft mit 18,432 MHz. Das ganze Projekt ist in 
Assembler verfasst.

1
    ldi     XL,(1<<WGM12)|\
2
               (1<<CS12)|(1<<CS10)      ; Taktvorteiler 1024, CTC-Modus
3
    sts     TCCR1B,XL                   ; Und Taktvorteiler setzen
4
    ldi     XL,(1<<OCIE1A)              ; Interrupt bei Compare
5
    sts     TIMSK1,XL                   ; Und setzen
6
    ldi     XL,LOW(18000)               ; Comparewert für COMP1A mit 18000
7
    sts     OCR1AL,XL
8
    ldi     XH,HIGH(18000)
9
    sts     OCR1AH,XL

Ich suche nun schon das halbe Wochenende :(

von Peter R. (gelb)


Lesenswert?

Deine letzten beiden Zeilen:

> ldi     XH,HIGH(18000)
> sts     OCR1AH,XL

Merkst du was?

Grüße, Peter

von Guter Rat (Gast)


Lesenswert?

1. Registerverwechslung, wie Peter schrieb.
2. In den Datenblättern steht außerdem, daß bei 16-Bit-Registern
z.B. das OCR1AH,L das High-Register zuerst zu laden ist, dann das
Low-Register. Hat mit der internen Registerstruktur zu tun.
Achtung beim Auslesen ist das genau umgekehrt! Also erst Low-Teil,
dann High-Teil, (siehe ADC)

Schönen Sonntag noch, sogar mit Sonne.......

von AVRuser (Gast)


Lesenswert?

Hallo,

wenn die Zeit wirklich genau 1s sein soll, muss diese Zahl etwas anders 
lauten. Statt

> ldi     XL,LOW(18000)               ; Comparewert für COMP1A mit 18000

muss es sein:

>> ldi     XL,LOW(17999)               ; Comparewert für COMP1A mit 18000

(entsprechend für den anderen Wert).

Bei einem CTC-Zählwert der Grösse X muss in die Register der Wert X-1 
geschrieben werden (da der Zähler bei Null beginnt).

von Dagobert (Gast)


Lesenswert?

Vielen Dank. Das wars aber leider noch nicht. Er ist zwar jetzt 
langsamer aber noch sehr weit von 1s entfernt.

von Dagobert (Gast)


Lesenswert?

1000 Dank Leute. Das war es. H-Wert zuerst geladen und schon wird die 
Laufzeit sauber hochgezählt :).

Gehe jetzt erst einmal Sommer genießen.

von spess53 (Gast)


Lesenswert?

Hi

>Er ist zwar jetzt langsamer aber noch sehr weit von 1s entfernt.

Der Wert muss auch $47FF (18431) sein. Ansonsten Fuses (z.B. CKDIV8) 
überprüfen.

MfG Spess

von AVRuser (Gast)


Lesenswert?

spess53 schrieb:
> Der Wert muss auch $47FF (18431) sein.

Bei dem angegebenen Takt von 18,432 MHz und dem Prescaler von 1024 komme 
ich auf 18000 (respektive 17999) als Zählwert ...

von spess53 (Gast)


Lesenswert?

Hi

Hast Recht. Wie weit weicht denn deine Zeit ab?

MfG Spess

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.