Hallo zusammen, ich habe hier einen Mega16 den ich mit den internen 8MHz takte. Nun möchte ich an den Pins C7 und C7 PWM-Signal erzeugen. Da Timer 1 ja zwei Compareregister hat, würde ich das gerne damit machen. Jedesmal wenn ein CompareMatch auftritt, dann soll im Interrupt ein Ausgang gesetzt werden, wenn ein Overflow eintritt sollen beide Ausgänge gelöscht werden. Timer2 benutze ich für andere Zwecke. Nun habe ihn das Ganze soweit, dass an C7 Impulse mit f=63,... Hz ausgegeben werden. Der CompareMatch-Interrupt wird aufgerufen (da ich in der Routine den Ausgang toggle). Ein Oveflow wird nicht ausgelöst. Solbald ich von einer der Zeilen // TIMSK |= (1<<OCIE1B); // TIMSK |= (1<<TOIE1); den Kommentar wegmache, blinkt die Led vom Timer 2 nicht mehr. Wo ist da der Zusammenhang ? Und wie kriege ich den OverflowInterrupt zum Laufen ? Greets Karlheinz
Ach ja, nochwas: Egal wie ich den Wert für OCR1a ändere, die Frequenz ändert sich nicht. Sollte sie aber doch nach meinem Verständnis
Karlheinz Druschel schrieb: > Solbald ich von einer > der Zeilen > // TIMSK |= (1<<OCIE1B); > // TIMSK |= (1<<TOIE1); > den Kommentar wegmache, blinkt die Led vom Timer 2 nicht mehr. Weil du für beides keine ISR hast. Karlheinz Druschel schrieb: > Und wie kriege ich den OverflowInterrupt zum Laufen ? Als ersten Schritt, indem du die Warnungen des Compilers nicht ignorierst. Karlheinz Druschel schrieb: > Egal wie ich den Wert für OCR1a ändere, die Frequenz ändert sich nicht. > Sollte sie aber doch nach meinem Verständnis Warum sollte sie. Der Abstand zwischen den Interrupts (und damit die Frequenz) ist doch immer der gleiche.
und was ist das: ISR(TIMER1_COMPA_vect) { // PORTC ^= (1<<PC7); PORTC ^= (1<<PC7); } ? na ich den timer im normalen modus betreibe, zählt er doch von bottmom bis top. wenn er de den wert von ocr1a erreicht, dann ruft er den interrupt auf. aber wenn ich den wert von ocr1a ändere, ist die zeit die er braucht um von 0 an bis zu diesem wert zu zählen ja unterschiedlich. ergo müßte sich die frequenz ändern
Karlheinz Druschel schrieb: > und was ist das: > ISR(TIMER1_COMPA_vect) > { > // PORTC ^= (1<<PC7); > PORTC ^= (1<<PC7); > } Das ist weder eine ISR für OCIE1B, noch für TOIE1. Wenn du einen der beiden Interrupts freischaltest, ohne eine ISR dafür zu haben, gibt es einen Software-Reset, sobald der jeweilige Interrupt passiert. Daher: Stefan Ernst schrieb: > Karlheinz Druschel schrieb: >> Solbald ich von einer >> der Zeilen >> // TIMSK |= (1<<OCIE1B); >> // TIMSK |= (1<<TOIE1); >> den Kommentar wegmache, blinkt die Led vom Timer 2 nicht mehr. > > Weil du für beides keine ISR hast. Karlheinz Druschel schrieb: > na ich den timer im normalen modus betreibe, zählt er doch von bottmom > bis top. wenn er de den wert von ocr1a erreicht, dann ruft er den > interrupt auf. Richtig. Karlheinz Druschel schrieb: > aber wenn ich den wert von ocr1a ändere, ist die zeit die > er braucht um von 0 an bis zu diesem wert zu zählen ja unterschiedlich. Ja, das ist also der Teilabschnitt "BOTTOM bis OCR1A". Und was ist mit dem anderen Abschnitt, "OCR1A bis TOP"?
OK, da hast du wohl recht. Habe es mittlerweile auch am Laufen. Aber das Tastverhältnis sollte sich doch dann wenigstens ändern, tuts aber auch nicht. Egal ob ich den CompareMatch bei 50 oder bei 200 auslösen lasse
Aber da auch die 126 Hz nicht gerade der Bringer sind, versuche ichs mal anders. Ich lasse nur einen CompareMatch auslösen, und zähle in dem eine Variable hoch. dann kann ich über den Comparematch wenigstens die Frequez höhe legen
Karlheinz Druschel schrieb: > Aber das > Tastverhältnis sollte sich doch dann wenigstens ändern, tuts aber auch > nicht. Egal ob ich den CompareMatch bei 50 oder bei 200 auslösen lasse Nö. Wenn du nichts weiter machst, als im CompareMatch einen Pin zu toggeln, ist das Tastverhältnis immer 50%.
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.