Andreas schrieb:
> ok vielen dank für die antworten.
>
> jetzt hab ich noch eine frage: wenn ich in der isr in eine sub springe,
> dann steht die isr ja genau gleich lange oder ?und zwar genau bis zum
> dem zeitpunkt wo ein return steht ?! oder liege ich da flasch? das läuft
> ja nicht parallel und die sub blockiert ja auch die isr bis sie fertig
> ist ?!
So ist es. Die Funktion läuft im Kontext der ISR und die ISR läuft damit
entsprechend länger.
ISR immer so kurz wie möglich halten und nur das nötigste in der ISR
erledigen. Beim Beispiel Drehgeber nur schnell die beiden Pins und
Taster abfragen, erkennen ob sich etwas geändert hat und eine (globale)
Variable aktualisieren, an der man den Zustand des Drehgebers vom
restlichen Programm aus abfragen kann und raus. Kein Menü, keine weitere
Bearbeitung - das gehört alles in die Main-Endlosschleife.
Dadurch hast Du zwei getrennte "Ebenen". Die Main-Ebene, die beliebig
langsam sein darf - für User-IO, Menü, Berechnungen, ... und die
ISR-Ebene, die von der Main-Ebene getrennt ist und immer schnell auf
Hardware-Ereignisse reagieren kann (PWM, Drehgeber, ADC, I2C, SPI, ...).
Natürlich gibt es auch Grenzfälle, bei denen die ISR aufgebohrt werden
muß, aber das ist eher selten. Ich programmiere schon viele Jahre lang
und es war nur einmal nötig (war ein schnelles Protokoll (ähnlich CAN,
bei dem direkt in Abhängigkeit vom empfangenen Inhalt reagieren musste -
hier war es unumgänglich einen großen Teil des Protokollstacks in die
ISR zu verlagern.
Meist ist es aber einfach schlechtes Design, wenn viel Code in einer ISR
steht.
Gruß,
Bernd