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.