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 ...