Man liest ja immer wieder, dass ISRs möglichst kurz sein sollen (damit
andere Interrrupts auch mal drankommen) und man möglichst viel in der
main machen soll.
Aber ob es dabei auf 100ns ankommt? Ich würde in diesem Fall alles in
der ISR erledigen:
Ontimer0:
Timer0 = 6 'Timer sofort neu laden
Decr Umlauf
if Umlauf >=128 then Portd.6 = 1 'LED ausschalten
else Portd.6 = 0 'LED einschalten
Return
oder
Manchmal ist es hilfreich, sich in das Zahlensystem des µC
hineinzudenken. Für diesen ist die Zahl 250 krumm, lieber ist ihm 256.
Dadurch kannst Du Dir viele Abfragen sparen, da Bytes und Counter von
selbst auf 0 / 255 überlaufen.
Um das zu kompensieren und wieder auf für Menschen gerade (= übliche,
bequeme) Frequenzen kommt, verwendet man auch entsprechende Quarze
(z.B. 2^22 = 4,194304 MHz)
Ontimer0:
' Timer0 = 6 'Timer sofort neu laden
' Timer durchlaufen lassen
Decr Umlauf
if Umlauf = 128 then
Portd.6 = 1 'LED ausschalten
endif
if Umlauf = 0 then
Portd.6 = 0 'LED einschalten
endif
Return
Oder
Ontimer0:
' Timer0 = 6 'Timer sofort neu laden
' Timer durchlaufen lassen
Decr Umlauf
if Umlauf = 0 then 'ergibt halbe Blinkfrequenz
Portd.6 = NOT Portd.6 'LED togglen
' oder
Portd.6 = 1 - Portd.6 'LED togglen
' ich weiß nicht, wie der toggle-Befehl in Bas heißt
endif
Return
Außerdem: der Timer im CTC-Mode ist unabhängig von der
Interrupt-Response-Time (Laden des Timers mit 6 zu unbekannter Zeit -->
ungenaues Timing, Jittern).