AVR - neuling wrote:
> //Timer 1:
> TCCR1A = ( (2<<COM1A0) | (1<<WGM10) | (2<<COM1B0) ); //8bit phase
> correct,
Warum schiebst du eine 2 nach COM1A0? Effektiv setzt du damit
das COM1A1 Bit. Anstelle eines 'toggels' hast du damit einen
'clear on compare match' programmiert.
1 << COM1A0
wenn du allerdings tatsächlich das COM1A1 Bit setzten willst,
dann schreib das auch so hin:
1 << COM1A1
Damit gibt es dann kein Missverständnis darüber, was du haben
willst, ob du das so haben willst oder ob du einfach nur einen
Programmierfehler gemacht hast.
> OCR1AL = 0xFF;//TOP ist über 8 bit modus eingestellt (0xFF)
OCR1A ist ein 16 Bit Register. Atmel verlangt, dass die meisten
16 Bit Register (darunter auch OCR1A) beschrieben werden, indem
die Sequenz: 'zuerst das High Byte und erst dann das Low Byte'
eingehalten wird. Tust du das nicht, dann wird das Register
nicht verändert.
Dein Compiler weis darüber Bescheid und stellt dir ein
virtuelles 16 Bit Register OCR1A zur Verfügung. Beschreibe
es einfach und der Compiler kümmert sich um die korrekte
Sequenz.
Auch: Ich würde in das Compare Register mal einen Wert laden,
der nicht an den Extremwerten liegt, sondern genau in der Mitte.
Falls es irgendwelche Sonderfälle in der Werten gibt, dann treten
sie meistens bei den Extremwerte auf. Meide ich diese bei den
ersten Versuchen, dann habe ich meistes schon eine mögliche
Falle weg.
Um eine Analogie zu benutzen: Wenn ich eine Divisionsroutine
testen möchte, dann wird mein erster Versuch nicht gerade eine
Division durch 0 sein.
OCR1A = 0x80; // PWM auf 50%
> TCCR1B = ( (1<<CS10) |(1<<WGM10) ); //kein prescaler, 8bit
das WGM10 Bit ist nicht im Register TCCR1B
> OCR1BL = 0xF0;
gleiche Anmerkung wie für OCR1AL