mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CTC1 im TCCR1 des ATtiny85


Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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):
 • Bit 7- CTC1 : Clear Timer/Counter on Compare Match
When the CTC1 control bit is set (one), Timer/Counter1 is reset to $00 in
the CPU clock cycle after a compare match with OCR1C register value. If
the control bit is cleared, Timer/Counter1 continues counting and is
unaffected by a compare match.

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

Autor: Kluchscheißernder Nixwisser (kluchscheisser)
Datum:

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

MfG

Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
In the normal mode an overflow interrupt (TOV1) is generated when
Timer/Counter1 counts from $FF to $00, while in the PWM mode the overflow
interrupt is generated when Timer/Counter1 counts either from $FF to $00 or
from OCR1C to $00.

Autor: Kluchscheißernder Nixwisser (kluchscheisser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kluchscheißernder Nixwisser (kluchscheisser)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich meinte aber Kapitel 16, denn das betrifft den Timer1.

MfG

Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/...
Grüße, Paul

Autor: Kluchscheißernder Nixwisser (kluchscheisser)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.