Das Projekt ist nicht ultrageheim, es geht um die Emulation eines One-Wire Bauteils, das es nicht mehr gibt. Aber die 600 Zeilen finde ich unübersichtlich, deshalb fasse ich das wesentliche zusammen.
Wenn ich in der Leseroutine bin (=vom Server kommen Bits), dann habe ich bei jeder ankommenden Flanke die folgenden zwei Möglichkeiten:
- Es kommt ein nächstes Bit, bis das Byte voll ist
- Das Lesen soll beendet werden und der Master sendet ein Reset.
Ich weiss aber vorher nicht, was genau kommt, deshalb nehme ich an, es soll ein nächstes Bit ankommen. Dese Operation wird in 60 us abgehandelt. Falls das nach den 60 us aber noch nicht fertig ist, dann weiss ich, dass es ein Reset sein soll und muss in die Resetroutine springen.
Deshalb starte ich bei jedem Schleifendurchgang der Timer aufs Neue und initialisiere mit 255-60. Falls alles läuft wie gewünscht, dann kommt das nächste Bit, Timer wird wieder auf den Wert 255-60 resettet. Wenn die 8 Bits von einem Byte durch sind, dann stoppe ich den Timer und arbeite weiter. In diesem Fall wird nie ein Interrupt auftreten.
Wenn jetzt aber ein Timer0-Overflow auftritt, dann hat der Master einen Reset gesendet. Ich muss also die Leseroutine verlassen und ins Hauptprogramm zurück, wobei je nach Pegelstand der Signalleitung unterschiedliche Orte angesprungen werden müssen. Das bedeutet, ich muss aus dem ISR an zwei verschiedene Orte gelangen können.
Wenn ich in der ISR nur ein Flag setze, ist das sicher die beste Lösung. Aber wo frage ich denn das Flag ab? Der Overflow kann irgendwo in der "Lese ein Bit"-Routine vorkommen, also müsste ich alle paar Zeilen wieder auf das Flag prüfen? Oder gibt es da einen schöneren Weg?
Genau das ist die Idee dahinter.
Lesezeichen