Hallo liebe Community,
ich versuche seit einiger Zeit mit Hilfe meines ATTinys die PWM-Einheit
in Betrieb zu nehmen. Scheinbar übersehe ich eine Kleinigkeit und hoffe
da einwenig auf eure Hilfe.
Mein Ziel ist es ein PWM-Signal mit der Frequenz von 48KHz zu erzeugen,
dh eine Periode von ca. 21µs. Bis das aber klappt mache ich Versuche um
mich von der korrekten Funktionalität des µC zu überzeugen, daher die
sehr großen Werte:
1 | void vConfPWM()
|
2 | {
|
3 | TCCR0A = _BV(WGM00)|_BV(COM0A1); //Phase Correct PWM //Output on PB0
|
4 | TCCR0B = _BV(CS02)|_BV(CS00)|_BV(WGM02); //Maxinmum Prescaler: 1024
|
5 | OCR0A = 255; //Counter counts to maximum
|
6 | }
|
Mein Programm überwacht den PIN PB0 und gibt den Status über eine
Soft-UART Schnittstelle an PB4 in Abhängigkeit vom Timer0.
1 | int main (void)
|
2 | {
|
3 | DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB4); //Output
|
4 | DDRB &= ~(1<<PB3);//PB3 als Input
|
5 | sei();
|
6 | vConfPWM();
|
7 | //die komplette main poste ich nach Bedarf. Will niemanden erschlagen...
|
8 | }
|
Die Ausgabe macht deutlich, dass der PIN PB0 seinen Wert nicht
verändert, obwohl er sollte. Dies ist mein Problem.
1 | 00255 <OCR0A & TCNT0> 00100 ->00108 ->00117 ->PINB 00017
|
2 | 00255 <OCR0A & TCNT0> 00166 ->00157 ->00149 ->PINB 00017
|
3 | 00255 <OCR0A & TCNT0> 00079 ->00087 ->00095 ->PINB 00017
|
4 | 00255 <OCR0A & TCNT0> 00187 ->00179 ->00170 ->PINB 00017
|
5 | 00255 <OCR0A & TCNT0> 00057 ->00066 ->00074 ->PINB 00017
|
6 | ...
|
Man sieht an der Konsolenausgabe, dass obwohl der Counter hoch oder
runterzählt, die LED an PB0 konstant leuchtend bleibt. Der andere
gesetzte PIN ist hier PB4, denn dieser überträgt den Software-UART mit
dem diese Daten auf meinen PC kommen ;-).
Zum Vergleich. Ich schalte das fast PWM an:
1 | void vConfPWM()
|
2 | {
|
3 | TCCR0A = _BV(WGM00)|_BV(WGM01)|_BV(COM0A1); //Fast PWM //Output PB0
|
4 | TCCR0B = _BV(CS02)|_BV(CS00); //Maxinmum Prescaler: 1024
|
5 | OCR0A = 127; //Counter counts to half
|
6 | }
|
Hier sieht man das Toggeln ganz deutlich...
1 | 00127 <OCR0A & TCNT0> 00118 ->00127 ->00135 ->PINB 00016
|
2 | 00127 <OCR0A & TCNT0> 00013 ->00021 ->00029 ->PINB 00017
|
3 | 00127 <OCR0A & TCNT0> 00163 ->00171 ->00180 ->PINB 00016
|
4 | 00127 <OCR0A & TCNT0> 00057 ->00066 ->00074 ->PINB 00017
|
5 | 00127 <OCR0A & TCNT0> 00208 ->00216 ->00224 ->PINB 00016
|
Was mache ich falsch? Habe ich evtl. ein altes Exemplar erwischt und
diese im Datenblatt beschriebene Funktionalität ist noch nicht drin?