Forum: Mikrocontroller und Digitale Elektronik ATMega16 und PWM


von Karlheinz D. (kdruschel)


Angehängte Dateien:

Lesenswert?

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

von Karlheinz D. (kdruschel)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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.

von Karlheinz D. (kdruschel)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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"?

von Karlheinz D. (kdruschel)


Lesenswert?

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

von Karlheinz D. (kdruschel)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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%.

von Karlheinz D. (kdruschel)


Lesenswert?

sorry, natürlich nur wenn ich den auch im CTCV-mode betreibe

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
Noch kein Account? Hier anmelden.