Hallo Sternthaler,
diese Geschichte mit den Mehr-als-ein-Byte-Werten liegt mir immer am Herzen (eigentlich nicht im Magen *gggg*). ABER, soweit ich weiß, wird der Interrupt bei den ATMELControllern verboten, sobald eine ISR angeworfen wird - und erst wieder nach deren RETI erlaubt. Präziser: ich habe softwaremässig keine nested Interrupts installiert (hoffe ich - wenn meine C-Kenntnisse in diesem Punkt stimmen). Bei mir läuft die Regelroutine nach Aufruf aus einer ISR. Bitte deswegen nicht schlagen - ich habe mich ausgiebig um die schnelle Abarbeitung gekümmert, damit ich in den Pausen meiner schnellsten Interrupt-Frequenz mit der ganzen Arbeit sehr locker zurande komme - dass also auch noch andere Aufrufe erfolgen können und kein Interrupt-Stau auftritt.
Code:
/* ============================================================================== */
/* === Nicht unterbrechbare ISR für ADC3 auf Pin 26/PC3/mega168 =============== */
ISR(ADC_vect) // _VECTOR(21)
{
- - - -
if (adc3_cnt == 4)
rgl_mo_12(); // Aufruf Regeln für mo_12
if (adc3_cnt == 8)
rgl_mo_34(); // Aufruf Regeln für mo_34
- - - -
}
/* ============================================================================== */
Also sollte eine neue ISR doch erst gestartet werden, wenn sowohl die rgl_mo_ij als auch die ISR ADC_vect fertig sind. Damit sollten meine je 2-bytigen Zeitvariablen ungestört leben können. Oder habe ich da etwas falsch verstanden? Hoffentlich nicht, sonst - hmmmm, dann müsste ich den ganzen Codeaufbau umwerfen.
PS: Hoffentlich hat Dir der Osterhase "auf Arbeit" kein allzu schweres (Arbeits-) Ei gelegt.
Lesezeichen