Forum: Mikrocontroller und Digitale Elektronik Timer Mega 32


von Ingo L. (grobian)


Lesenswert?

Ich habe hier ein Problem mit dem Timer (Mega32).
Obwohl ich meines Erachtens den Timer stoppe, befinden sich am Ausgang 
von OC2 (PD7) immer noch Rechteckimpulse. Auch ein eventuelles  löschen 
von CS20 bringt kein Erfolg. Der Timer stoppt dann zwar aber mit dem 
Ergebnis, dass der Ausgang OC2 mal sporadisch auf high oder low liegt.
Den vorliegenden Code benutze ich zum lesen von WAVE-Dateien von einer 
SD-Karte.
1
void StartTimer(void)
2
{
3
 // CTC Mode
4
 TCCR1A = (0<<COM1A1) | (0<<COM1A0) | (0<<WGM11) | (0<<WGM10);
5
 TCCR1B = (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
6
 OCR1A = TIMER1_OCR_VALUE;
7
8
9
10
11
 // Fast PWM, no prescaler 
12
 TCCR2 = (1<<COM21) | (1<<COM20) | (1<<WGM21) | (1<<WGM20) | (1<<CS20);
13
 DDRD |= (1<<PD7);
14
15
16
TIMSK |= (1<<OCIE1A);
17
TIFR  |= (1<<OCF1A); 
18
19
}
20
21
void StopTimer(void)
22
{
23
24
  TIMSK &= ~(1<<OCIE1A);
25
  
26
}

von Chris (Gast)


Lesenswert?

Den Timer Stopt man in dem man ihm kein Vorteiler zuweist. Steht aber 
auch im Datenblatt.

von Ingo L. (grobian)


Lesenswert?

Chris schrieb:
> Den Timer Stopt man in dem man ihm kein Vorteiler zuweist. Steht aber
> auch im Datenblatt.

Hatte ich ja probiert, was auch funktionierte (steht oben im Text) aber 
mit dem Problem der Ausgang war dann mal high und mal low. Bei mir ist 
es zwingend notwendig, dass der Ausgang low hat.

von Chris (Gast)


Lesenswert?

Welchen Timer willst du Stoppen? 1 oder 2? Oben schreibst du CS20 (Timer 
2)
in der Stopfunktion schaltest du den Interrupt von Timer 1 aus.

von Ingo L. (grobian)


Lesenswert?

Timmer 2 soll stoppen --> keine Rechtecke am Ausgang, Ausgang soll low 
sein


sorry oben falscher Code bei StopTimer
1
void StopTimer(void)
2
{
3
4
  TIMSK &= ~(1<<OCIE1A);
5
  OCR2 = 0;
6
  TCCR2 &= ~(1<<CS20);
7
  
8
}

von Chris (Gast)


Lesenswert?

Das Stimmt soweit auch, dass der Ausgang sporadisch auf High oder Low 
ist, ist Normal der Timer wird ja gestoppt. Den Ausgang musst schon 
selbst auf Low setzten oder den Timer erst stoppen wenn der Ausgang 
gerade auf Low ist.

Aber was willst den genau machen mit der Funktion?

von Ingo L. (grobian)


Lesenswert?

Es werden WAVE-Dateien von einer SD-Karte ausgegeben.

von Ingo L. (grobian)


Lesenswert?

also dann in der Form
1
void StopTimer(void)
2
{
3
4
  TIMSK &= ~(1<<OCIE1A);
5
  TCCR2 &= ~(1<<CS20);
6
  PORTD &= ~(1<<PD7);
7
8
}

bin hier leider auf Arbeit und kann es nich tsofort probieren

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.