Erstmal vielen Dank für die beiden Links. Über die Seite vom ersten bin ich sogar schonmal irgentwann gestolpert, aber wusste da noch nicht was man davon alles wissen sollte. Die zweite setzt bei ihren Beispielen schon viel verständnis voraus.
Das Einzige, was mir immer noch ein paar Schwierigkeiten bereitet ist die Nummerierung. Mal wird ein Register als TIMSK bezeichnet, aber bei der konkreten Implementierung muss man noch passende Index/Buchstaben dranhängen TIMSK2 und da hab ich noch nicht den vollen Durchblick. Sowas wie WGM12 oder COM1A1 hat mich bis gestern auch noch total verwirrt, weil ich mich immer gefragt hab, was da für Zahlen hinterstehen.
Jetzt bin ich die erste Seite aber man richtig durchgegangen und verstehe schon viel mehr.
Damit etwas bei mir im Gedächtnis hängenbleibt, mache ich es immer so, dass ich alles so kompakt wie möglich mit eigenen Worten nochmal aufschreibe und das hab ich hier auch mal versucht.
Was stimmt davon/was nicht; es sind auch noch ein paar Detailfragen drin:
8bit Timer:
Overflow-Mode:
TCCR0 - 8bit Timer: 5=>CPU-Takt/1024 4=>CPU/256 3=>CPU/64 2=>CPU/8 1=>CPU
TCNT0 - 8bit Counter: Zählt von 0 bis 255. Setzt bei Überlauf TOV0, TIFR-Flag (Interrupt)
??TIMSK |= (1<<TOIE0): Overflow Interrupt erlauben??
sei() - Interruptverarbeitung aktivieren
Def. der InterruptRoutine:
ISR (TIMER0_OVF_vect){} //wobei TIMER0_OVF_vect sie an Timer0 bindet
/* TCNT0 kann hier auf einen Wert > 0 gesetzt werden um die Zeit bis zum nächsten
Aufruf zu verkürzen */
Clear Timer on Compare Match CTC-Mode: Anstatt immer bis 255 zu zählen gibt man
in OCR0A eine Zahl vor, bis zu der gezählt werden soll.
TCCR0A = (1<<WGM01); // CTC Modus //welcher Wert ist WGM01?
TCCR0B |= (1<<CS01); // Prescaler 8 //warum ver-odert? reicht WGM01 bis in dieses Register?
//wozu kann TCCR0B ohne CTC benutzt werden?
OCR0A - Counter-Obergrenze setzten
??TIMSK |= (1<<OCIE0A);??
sei() - Interruptverarbeitung aktivieren
Def. der InterruptRoutine:
ISR (TIMER0_COMPA_vect){} //TIMER0_COMPA_vect legt fest dass sie bei einem Compare Match
//aufgerufen wird, da hier ein anderes Register-Flag benutzt wird?
/* Es gibt nicht Das Eine ISR-Auslösende Timer-Flag sondern mehrere verschiedene?? */
16bit Timer:
Zu einem 16bit Timer gehört immer eine PWM-Funktionalität und immer ein bestimmter PIN.
TCCRA1: 0=>PWM aus 1=>8bit PWM 2=>9bit PWM 3=>10bit PWM
OC1A - Zugehöriger PIN, der je nach Einstellung bei Compare Match gesetzt wird.
PWM aus:
TCCRA1 - 8bit Einstellungsregister: 64=>OC1A Toggle 128=>OC1A 0 192=>OC1A 1
PWM an:
TCCRA1: 128=>(beim Hochzählen) OC1A auf 0 (beim Runterzählen auf 1) 192=>OC1A 1 bzw. 0
PWM aus:
TCCR1B - zweites 8bit Einstellungsregister, das die eigentlichen Auslösezeitpunkte
festlegt bzw. Prescaler. (wie TCCR0 beim 8bit Timer)
5=>Hochzählen der OCR0A bei jedem CPU-Takt/1024 ten Takt 4=>CPU/256 3=>CPU/64 2=>CPU/8
1=>CPU/Takt 0=>angehalten (nachdem TCNT0 den Wert von OCR0A erreicht hat, folgt das
Auslösen der ISR bzw. PWM bedingter PIN umlegungen)
/* Die Höheren Bits in TCCR1B sind für Feineinstellungen und erstmal unwichtig */
TCNT1H/TCNT1L - Zwei 8bit Register, also zusammen 16bit, die die Funktion von TCNT0
beim 8bit Timer erfüllen und immer von 0 bis 65535 zählen. (TCNT1High->höherwertige Bits)
OCR1H/OCR1L - Zwei 8bit Register, die zusammen die 16bit Zahl darstellen, bei der ein
Compare Match (ISR oder PWM-PINumlegung) ausgelöst/durchgeführt wird. (erst in H schreiben)
/* Kann man auch eine 16bit Zahl in OCR1L stecken und die zu hohen Bits werden automatisch
in OCR1H gespeichert? /*
ICR1H/ICR1L - Bei PINflanke von außen wird eine andere TOP-Grenze gesetzt (unwichtig)
PWM an:
/* Wenn in TCCRA1 ein PWM-Mode ausgewählt wurde, wird nicht immer von 0 bis 65535 gezählt
sondern je nach Modus( 8bit,9bit,10bit) bis zu einer Grenze und dann wieder zurück. */
Wurde in TCCRA1 der 8bit PWM-Modus gewählt, wird in TCNT1H/TCNT1L von 0 bis 255 und zurück
gezählt. Beim 9bit PWM-Modus von 0 bis 511 und beim 10bit PWM-Modus bis 1023. Nur wenn
überhaupt ein Modus gewählt wurde wird, sobald der Zähler den Wert von OCR1H/OCR1L
erreicht, die PWM-Typische PINumlegung durchgeführt.(z.B. PIN PB3). Was genau mit diesem
PIN passiert wurde am Anfang in TCCRA1 festgelegt.
Was sowohl für den 8bit als auch für den 16bit Timer gilt:
TIMSK - Interrupt Mask: 128=>bei Überlauf von TCNT1H/TCNT1L, also dem Zähler des 16bit
Timers (Timer1) wird ein (Timer Overflow 1) Interrupt ausgelöst.
64=>wenn OCR1H/OCR1L den Wert von TCNT1H/TCNT1L erreicht, also wenn der Zähler von Timer1
den Grenzwert von Timer1 erreicht, wird ein (Compare Match) Interrupt ausgelöst.
8=>Es wird ein (Capture Event) Interrupt ausgelöst, wenn ein Signal an PIN PD6 anliegt.
2=>Bei einem Überlauf von TCNT0, dem Zähler des 8bit Timers (Timer0) wird ein (Timer
Overflow 0) Interrupt ausgelöst.
Mehrere Bits werden gesetzt, indem man sie nacheinander mit TIMSK verODERt.
/* Beim 8bit Register OCR0A hatte man eine neue Obergrenze (statt 255) gesetzt, keinen
Wert bis zu dem gezählt, ein Interrupt ausgelöst wird und dann weitergezählt wird, wie
beim 16bit Timer! Deshalb gibt es auch kein Bit in dieser TIMSK-Maske, das man setzt
um einen Interrupt bei Erreichen von OCR0A auszulösen!!! */
TIFR - Interrupt Flag Register: Beinhaltet die Flags, die die Timer setzten.
Lesezeichen