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
Gast
#2610702
Setz TCCR1A auf normal Port operation.
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
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.