Forum: Mikrocontroller und Digitale Elektronik CTC Modus abschalten..


von Thomas S. (thomasschattat)


Lesenswert?

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

von holger (Gast)


Lesenswert?

Setz TCCR1A auf normal Port operation.

von Alex S. (thor368)


Lesenswert?

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