Forum: Mikrocontroller und Digitale Elektronik CTC1 im TCCR1 des ATtiny85


von Paul (Gast)


Lesenswert?

Hallo,

wenn ich das CTC1 Bit im TCCR1 eines ATtiny85 setze, springt das 
Programm weder im Simulator noch in echt in den TIMER1_OVF_vect. Wenn 
ich das Datenblatt richtig verstehe müsste das aber passieren. Werde als 
workaround den TCNT1 wie zB PeDa in den Entprellroutinen vorladen und 
CTC nicht setzen. Ist das ein Fehler im Datenblatt, des Controllers oder 
was steckt dahinter?

Viele Grüße, Paul


Zitat aus dem Datenblatt (Kapitel 12.3.1):
1
 • Bit 7- CTC1 : Clear Timer/Counter on Compare Match
2
When the CTC1 control bit is set (one), Timer/Counter1 is reset to $00 in
3
the CPU clock cycle after a compare match with OCR1C register value. If
4
the control bit is cleared, Timer/Counter1 continues counting and is
5
unaffected by a compare match.

Ich initialisiere den Timer1 so:
1
void    adc_timer_init(){
2
    //mit nem Prescaler von 2048 und ner Taktung von 0,5sec
3
    TCCR1    |= ( 0<<CTC1 | 1<<CS13 | 1<<CS12 | 0<<CS11 | 0<<CS10 ); //Prescaler auf 2048
4
                //und CTC NICHT gesetzt weil dann nichts mehr geht
5
    TIMSK    |= ( 1<<TOIE1 );    //Interrupt aktivieren
6
    OCR1C    = (uint8_t)(uint16_t) (F_CPU/2048*0.5+0.5);
7
}

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

Damit löst der Timer kein Überlauf-Ereignis aus, sondern ein 
Compare-Ereignis. Er springt demnach in den entsprechenden 
Compare-Interrupt.

MfG

von Paul (Gast)


Lesenswert?

Hi, danke für den Denkanstoß sonst wäre ich nicht drauf gekommen. Es ist 
allerdings nicht ganz richtig: Es passiert einfach nichts, ein 
TIMER1_COMPC_vect oder ein Interrupt-Flag dazu gibt es nicht. OCR1C wird 
nur im PWM-Mode ausgewertet, und sorgt da wohl für den normalen Timer 
Overflow Interrupt. Wenn ich neben CTC1 auch PWM1A setze funktionierts 
wie erwartet!

Datenblatt sagt unter 12.2 dazu:
1
In the normal mode an overflow interrupt (TOV1) is generated when
2
Timer/Counter1 counts from $FF to $00, while in the PWM mode the overflow
3
interrupt is generated when Timer/Counter1 counts either from $FF to $00 or
4
from OCR1C to $00.

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

Deine kryptischen Vektornamen kenne ich nicht, ich programmiere in ASM 
und richte mich einzig und allein nach dem Datasheet.

Um den Timer im CTC-Mode laufen zu lassen, nutzt man OCR1A zum 
Einstellen des Zählumfangs. Somit wird der Compare 1A-Interrupt 
ausgelöst.

Siehe Bitbeschreibung zum CTC1-Bit im TCCR1-Register im Kapitel 16.3.1 
des Datenblattes des ATTiny25/45/85.

MfG

von Paul (Gast)


Lesenswert?

Kapitel 12.3.1, ja, wie oben bereits zitiert, die Beschreibung zu 
Bit7-CTC1 erwähnt leider nicht dass im normalen Modus (nicht-PWM) bei 
gesetztem CTC1 überhaupt kein Overflow Interrupt ausgelöst wird. Der 
Zählumfang beim Timer1 wird trotzdem ausschließlich vom OCR1C bestimmt.

Meine Vektornamen sind übrigens nicht kryptisch, sondern entspringen 
ebenfalls dem Datenblatt, Table 9-1 ;-)

Viele Dank, Grüße, Paul

von Kluchscheißernder N. (kluchscheisser)


Angehängte Dateien:

Lesenswert?

Ich meinte aber Kapitel 16, denn das betrifft den Timer1.

MfG

von Paul (Gast)


Lesenswert?

Hi, du schaust in ein anderes Datenblatt, im Datenblatt des ATtiny85 
beschreibt Kapitel 16 den Analog Comperator - und ein tiny85 hat kein 
TCCR1A, sondern nur ein TCCR1. Das aktuelle Datenblatt findest du hier:
http://www.atmel.com/dyn/resources/prod_documents/doc2586.pdf
Grüße, Paul

von Kluchscheißernder N. (kluchscheisser)


Angehängte Dateien:

Lesenswert?

Du hast recht, aber nur halb... ^^
Das Datenblatt ist schon für den Tiny85 gültig, aber nicht mehr ganz 
neu. Mein Fehler war aber, dass ich versehentlich beim 
Tiny15-Kompatiblitätsmode nachgeschaut habe. Also sorry...

Ich vermeide meist den CTC-Modus, da ich mehrere Interrupts des Timers 
brauche. Wenn der Timer frei durchläuft, kann man nämlich beide 
Compare-Interrupts eines Timers unabhängig voneinander nutzen. Dazu muss 
man allerdings in der ISR das OCR-Register auslesen, das Intervall dazu 
addieren und das Ergebnis als Termin für den nächsten Compare-Interrupt 
ins OCR zurückschreiben. Bei durchlaufendem Timer kann man auch noch den 
ICP-Interrupt nebenher benutzen, um Impulse zu messen. Letzteres ist 
aber bei meinem aktuellen Tiny85-Projekt (Sound für Modellbahn) nicht 
erforderlich.

MfG

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.