Probleme mit Timer 1 im CTC-Modus

Gast #1737297
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 :(
Gast #1737323
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.......
Gast #1737328
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).

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