Forum: Compiler & IDEs Welcher Takt in Timer-Overflow-ISR ?


von remmos (Gast)


Lesenswert?

Hallo allerseits ...

Ich hab mir mit meinem ATTiny2313 mit dem Timer0 im Phase-Correct-PWM 
Modus eine Servo-Ansteuerung gebastelt. Soweit funktioniert das auch 
alles, ich hab ein 8MHz Takt und im Timer einen Prescale von 64 => Ich 
bekomm alle 4,096ms ein Overflow-Interrupt ... in dem mach ich 
eigentlich nichts anderes, als den Overflow-Counter zu inkrementieren, 
damit ich im nächsten Compare-Match die Compare-Match-Value auf 0 setzen 
kann (=> Dauer-Aus)

Dann im 4. Overflow setz ich wieder meine Compare-Match-Value die ich 
erreichnet hab für die Servo-Position.

Das Funktioniert auch wunderbar, solange bis "mehr" code in der 
Overflow-ISR steht ... Dann passiert nämlich NICHTS mehr ... das aller 
erste "signal" an den Servo kommt noch richtig, aber danach (nachdem ich 
die Compare-Match-Value auf 0 gesetzt habe) wird sie nie wieder auf 
einen anderen Wert gesetzt (habs mir mit nem Oszi angeschaut). Im 
Simulator hab ich im schlechtesten fall (allso wenn alle if's 
durchgearbeitet werden etc.) ca. 33 Taktzyklen ergo, falls die ISR auch 
mit 8MHz "arbeitet", ca. 4µs "bearbeitungszeit" ...

Meine Frage ist jetzt, wieso funktioniert es mit weniger code 
einwandfrei, aber sobald mehr Code in der ISR ist nichtmehr ?! Die 
Interrupts werden doch eh nacheinander abgearbeitet, da geht doch keiner 
verloten oder etwa doch?!
(Und selbst dann müsste i.wann wieder die Compare-Match-Value gesetzt 
werden ...)

Hier mal die ISR's:
1
ISR(TIMER0_COMPA_vect) {
2
  // Innerhalb von einem Overflow sind alle werte möglich, daher sobald es einen overvflow gab => immer aus !
3
  if(pwmOverflows >= 1+1)
4
    OCR0A = 0x00;
5
}
6
7
// Alle 4,096 ms
8
ISR(TIMER0_OVF_vect) {
9
  // Themporär ablegen
10
   uint8_t pwmOverflowsThemp = pwmOverflows;
11
  // Solange, bis ~16ms vorbei sind, dann kann wieder entsprechend ein geschalten werden
12
  if(pwmOverflowsThemp == 0 || pwmOverflowsThemp == 5) {
13
    OCR0A = pwmOcr2Value;
14
    // Overflows zurücksetzen
15
    pwmOverflowsThemp = 0;
16
    TCNT0 = 0x00;
17
  }
18
  pwmOverflowsThemp++;
19
  // Zurückschreiben
20
  pwmOverflows = pwmOverflowsThemp;
21
}


So wie es jetzt ist, funktioniert es einwandfrei ... will ich jetzt 
allerdings noch Code zum Tasten entprellen in die Overflow-ISR, 
funktioniert das PWM nichtmehr ...

von remmos (Gast)


Lesenswert?

Ok, sorry Jungs ... hab das Problem gefunden:

Das Problem war die Zeile hier:
TCNT0 = 0x00;

Ich weis ehrlich gesagt nicht warum, aber jetzt scheint es zu 
funktionieren =)

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.