hi,
ich hab mal ne Frage bezüglich des timer 1 ctc mode 12.
Ich bin mir nicht sicher, ob ich das Datenblatt richtig verstehe:
Ich hab das so verstanden, dass der Timer von 0 - ICR1 läuft,
und dass man die OCR1A und OCR1B Ausgänge weiterhin benutzen kann.
(nur ebend mit der verringerten Auflösung)
Ist das falsch?
Ich habe den timer mit ICR=800 (prescaler 1, Takt: 8Mhz --> 10kHz)
laufen
der ist fix.
jetzt möchte ich den OCR1A Pin für eine PWM benutzen.
Die Frage ist, ist denn der CTC mode ein PWM-Mode oder nicht?
Sprich, welche Tabelle gilt für die Compare-Output-Modes.
Ich hätte angenommen die erste.
Dh, man müsste den Pin im Compare setzen und im overflow/capture löschen
(COM1A1:0 = 3).
Das funktioniert nur nicht, selbst wenn man im capture nciht löscht,
geht die LED nie an.
Toggeln (COM1A1:0 = 1) bringt ja auch nix, da er dann immer im Compare
toggelt und somit nur die PWM-Grundfrequenz halbiert wird, ohne das
Tastverähltnis (50:50) zu beeinflussen.
Die Frage ist, ist mein Verständnis des Timers falsch, oder mach ich im
Code was falsch?
hier mal der Testcode:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <util/delay.h>
|
4 | #include <stdint.h>
|
5 |
|
6 |
|
7 | ISR(TIMER1_CAPT_vect)
|
8 | {
|
9 | PORTB &= ~(1<<PIN1);
|
10 | }
|
11 |
|
12 | int main (void)
|
13 | {
|
14 | DDRB |= (1<<PIN1);
|
15 |
|
16 | ICR1 = 800; // compare value 10kHz
|
17 | TCCR1B = (1 << WGM13)|(1 << WGM12) | (1 << CS10); // switch CTC Mode on, set prescaler to 1
|
18 | TIMSK1 = (1 << ICIE1); // ICIE1: Interrupt if timer reaches the Top (ICR1 register)
|
19 |
|
20 | TCCR1A = (1<<COM1A1); // set on match, clear on overflow
|
21 |
|
22 | while(1)
|
23 | {
|
24 | OCR1A = (OCR1A+5)%800;
|
25 | _delay_ms(10);
|
26 | }
|
27 | }
|
Gruß und Danke,
Vlad
edit:
1 | TCCR1A = (1<<COM1A1); // set on match, clear on overflow
|
hier fehlt das COM1A0-Bit, dann geht die LED auch an.e
1 | TCCR1A = (1<<COM1A1)|(1<<COM1A0); // set on match, clear on overflow
|
Die Helligkeit ändert sich aber trotzdem nicht.