Hallo,
ich möchte gerne mit Hilfe des Timer 1 vom ATmega32 mit 16MHz ein 
PWM-Signal mit einer Frequenz von 800kHz ausgeben, mit variablem 
Dutycycle.
Meine Idee war, die TCCR1A,B-Register folgendermaßen einzustellen:
- kein Prescaler -> 20 Takte entsprechen 1,25us und somit genau meiner 
gewünschten Frequenz
- Mode of Operation: CTC, mit TOP = ICR1, wobei ICR1 = 19 (Also: Springe 
bei 19 wieder auf 0. Details im ATmega32-Datenblatt auf Seite 109)
- und dann wollte ich Werte zwischen ~1 und ~18 ins OCR1A schreiben, um 
verschiedene Dutycycles zu erreichen (über CompareMatch), die mir über 
den Pin PD5 (OC1A) ausgegeben werden.
Hier der Code innerhalb meiner Funktion:
1  | OCR1A = u16Pwm; // = vergleichsregister vom Timer1 bekommt Variable
  | 
2  | 
  | 
3  | ICR1 = 0x0013; // = 19, ICR1 beinhaltet den TOP-Wert, bei auf 0 gesetzt wird.
  | 
4  | 
  | 
5  | TCCR1A = _BV(COM1A1); // High->Low an OC1A bei CompareMatch
  | 
6  | TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10) ; // siehe DB S.109
  | 
Ergebnis: Der Timer zählt periodisch bis zu meinem gewünschten im ICR1 
angegebenen Wert, allerdings bekomme ich am OC1A keinerlei PWM-Output.
Meine Vermutung: Da ich ja im CTC-Modus arbeite, ist so eine PWM evtl. 
gar nicht möglich? Aber wie gehts dann?
Ich freue mich auf alle Tipps. Bin schon seit Stunden am rätseln.. :(