Hallo, kann mir jemand sagen, wie man mit dem 8-bit Timer vom ATMEGA8 ein PWM-es Signal erzeugen kann? Ich habs so versucht, aber im Simmulator ändert sich der Ausgang (PB3-Port) nicht: #include <io.h> #include <interrupt.h> #include <inttypes.h> int main (void) { DDRB = 0xFF; // TIMER2 initialisation TCCR2 = 0x00; // stop ASSR = 0x00; // set async mode TCNT2 = 0x01; // setup OCR2 = 0x10; TCCR2 = 0x42; // start prescale:8 sei(); for(;;){}; return 0; } Gruß Zoltan
> #include <io.h> Bitte <avr/io.h> nehmen. > #include <interrupt.h> Auch der wäre in <avr/interrupt.h> zu finden, aber den brauchst Du gar nicht. > #include <inttypes.h> Den brauchst Du derzeit auch nicht. > TCCR2 = 0x00; // stop Der ist sowieso nach einem Reset gestoppt. > ASSR = 0x00; // set async mode Überflüssig, synchroner Modus ist Standard. > TCNT2 = 0x01; // setup Auch nicht sinnvoll. Die erste Periode zählt damit nur 255 mal, alle anderen 256. > TCCR2 = 0x42; // start prescale:8 Hier liegt der Hase im Pfeffer. Besser ist es, Du nimmst die Bitkonstanten, dann schaut sich's einfacher im Datenblatt nach: TCCR2 = _BV(WGM20) | _BV(CS21); WGM20 gesetzt und WGM21 nicht gesetzt ist der phase correct PWM mode, soweit OK. CS221 gesetzt und CS22/CS20 nicht, Vorteiler 8, auch OK. Aber: wer sagt denn Deinem Controller, daß Du den OC2 auch benutzen willst? Du mußt noch COM21 setzen und ggf. auch COM20, dann geht es. sei(); for(;;){}; return 0; }
Danke für die ausführliche Beschreibung! Ich musste noch COM21, COM20 setzen. Das habe ich übersehn. Mit dem Simulieren klappt es trotzdem nicht, obwohl der programmierte IC einwanfrei funktioniert. Danke nochmal Joerg Gruß Zoltan
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.