Forum: Mikrocontroller und Digitale Elektronik ATmega32+Timer1+CompareMatch bleibt unberücksichtigt


von Rush .. (rush)


Lesenswert?

Hallo alle miteinander...

Ich möchte timergesteuert den INT0-Interrupt aktivieren und 
deaktivieren. Dafür hatte ich vor, den Timer1 im Normal-Mode laufen zu 
lassen und über das OCR1A Register den Vergleichswert zu definieren. In 
der CompareMatch ISR wird dann einfach der INT0-Interrupt eingeschaltet 
oder ausgeschaltet.
TCNT1 soll bei einem CompareMatch nicht zurückgesetzt werden

Laut Datenblatt zählt der Normal-Mode bis 0XFFF ohne zurücksetzen und 
als CompareMatch kann OCR1A benutzt werden.

Nun habe ich das ganze einfach mal ausprobiert. Hab vorerst in die 
ISR(TIMER1_COMPA_vect) ein Pintoggeln reingenommen und mir dann den 
Ausgang angesehen.

Nun ist es so, dass am Ausgang einfach eine 50/50-PWM (Periode von 8,192 
ms) ist, unabhängig davon welcher Wert in dem Vergleichsregister drin 
steht. Wenn man die 8,192ms betrachtet, sieht es so aus als wäre es der 
OverflowInterrupt und nicht der CompareMatch.

Hat jemand eine Idee woran das liegen könnte?

Hier meine Initialisierung für den Timer:
1
void init_timer(void)
2
{
3
  TCCR1A &= ~(1<<WGM11) | (1<<WGM10);  //Normal-Mode
4
  TCCR1B &= ~(1<<WGM13) | (1<<WGM12);              
5
  TIMSK |= (1<<OCIE1A);  // Compare Match Int aktivieren
6
  OCR1A = 32767;            
7
  TCCR1B |= (1<<CS10);  //Timer starten
8
}

und hier die passende ISR
1
ISR(TIMER1_COMPA_vect)
2
{
3
  PORTD ^= (1<<PD3);
4
}

Danke schonmal im Voraus.

von Stefan E. (sternst)


Lesenswert?

Rush ... schrieb:
> Nun ist es so, dass am Ausgang einfach eine 50/50-PWM (Periode von 8,192
> ms) ist, unabhängig davon welcher Wert in dem Vergleichsregister drin
> steht. Wenn man die 8,192ms betrachtet, sieht es so aus als wäre es der
> OverflowInterrupt und nicht der CompareMatch.
>
> Hat jemand eine Idee woran das liegen könnte?

Nirgendwo dran.

Du lässt den Timer im Normal-Modus durchlaufen, und beim Compare-Match 
wird ein Ausgang getoggelt. Wenn dann das beobachtete Verhalten dich 
überrascht, dann erkläre doch mal detailliert, welchen Ablauf du 
eigentlich erwartest hättest.

von Rush .. (rush)


Lesenswert?

Ich will einfach den Tiner von 0 bis 0xFFFF zählen lassen und dazu 
CompareMatches anhand des Wertes von OCR1A erhalten. Mehr nicht.

Sehe gerade dass der Wert den ich in dem Codebeispiel für OCR1A 
angegeben habe sowieso die hälfte des eig. Maximalwertes ist. Da kommt 
klar eine 50/50 PWM raus. Aber wie gesagt, trage ich dort den Wert 1 
ein, erhalte ich ebenfalls das 50/50 PWM.

von Stefan E. (sternst)


Lesenswert?

Rush ... schrieb:
> Ich will einfach den Tiner von 0 bis 0xFFFF zählen lassen und dazu
> CompareMatches anhand des Wertes von OCR1A erhalten. Mehr nicht.

Genau das passiert doch auch.

Rush ... schrieb:
> Aber wie gesagt, trage ich dort den Wert 1
> ein, erhalte ich ebenfalls das 50/50 PWM.

Und nochmal: warum überrascht dich das? Was würdest du denn statt dessen 
erwarten? Und wie soll dieses "statt dessen" mit obigen Vorgaben 
entstehen?

von Rush .. (rush)


Lesenswert?

Sorry.... jetzt wirds echt peinlich für mich...
Ich weiss nicht was mich dazu veranlasst hat, aber ich bin die ganze 
Zeit davon ausgegangen dass mein Ausgang beim Erreichen des Höchstwertes 
wieder zurückgesetzt werden sollte...

Wird er aber logischerweise nicht! Also ist es vollkommen klar das da 
nichts anderes als eine 50/50 PWM rauskommt....

scheisse ist das peinlich!

Aber trotzdem danke für deine Hartnäckigkeit ;)

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.