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.