Guten Abend,
ich betreibe Timer1 eines Atmega32 im CTC Modus und variiere die
Pulsweite mit OCR1A. Klappt!
Wenn ich die PWM aber ausschalten will, so bleibt der Ausgang manchmal
auf High hängen, nicht immer.
Meine Stopfunktion sieht so aus:
int main (void)
...
TCCR1A |= (1<<COM1A1) | (1<< WGM11); //Set up timermode CTC
TCCR1B |= (1<<CS10) |(1<<CS11) | (1<<WGM13) | (1<<WGM12); //Prescaler
64
...
void Stop_PWM (void)
{
unsigned char sreg = SREG;
cli();
TCCR1B &= 0xF8; //stop PWM
OCR1A = 0;
PORTD &= 0xDF; //turn PWM off
TCNT1=0;
SREG = sreg;
}
Wenn ich Stop_PWM aufrufe so stoppt der Timer, aber der Ausgang bleibt
hin und wieder auf 1 und nicht auf 0 hängen. Selbst das Nullsetzen des
Bits hilft nicht, oder ist der Zugriff durch den CTC Modus da nicht
möglich?
Wie kann ich sicherstellen, dass der PWM Ausgang beim Stop auf Null ist?
Besten Dank für eure Meinungen,
Thomas
Tach Thomas, dein Problem ist folgendes: Du hast dein OCM im toggle Modus stehen. Das heißt jedes mal, wenn ein OC auftritt wird dein output getoggelt. Wenn du jetzt asynchron den timer anhältst hast du eine 50:50 Chance, dass er bei high hängen bleibt. Du musst also das ganze OCM abschalten, damit du einen definierten Zustand an dem Pin hast. Versuchst du das so wie in deinem code wird zwar das Port Register auf einen defineirten Zustand gesetzt aber das OC Modul überschreibt noch die Portfunktion. Du musst noch das entsprechende COM bit im TCCRxA aus machen. In deinem speziellen Falle ist das COM1A in TCCR1A. Thor
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.