Welcher Takt in Timer-Overflow-ISR ?

Gast #2700457
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 ...

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.