Zitat Zitat von HeXPloreR Beitrag anzeigen
Hallo,
mal abgesehen davon dass das hier nur der halbe Code ist...startest Du den Timer0 in der For-Next Schleife 100mal neu... um ihn dann einfach nach dem Next anzuhalten?? Hast Du irgendeine Zeit berechnet- die vergehen darf/soll?

Also, ich denke normalerweise würde man für Dein Problem einen Interrupt abstellen...und das ist völlig unabhängig von irgendeinem Timer. Und das ganze dann in der Hauptschleife. Sobal Interrupt auslöst geht es in die ISR und mit Return wieder raus...woher der return (z.B. if Bedingung) kommt ist völlig egal. In der ISR setzt man die entsprechende Variable A B C oder D = 1 (=Flag; um mal im obigen Beispiel zu bleiben) - und im Hauptprogramm kann man dann auf diese Variablen testen und in neuen Programmteile verzweigen.

Vielleicht, wenn es kein ultra geheimes Projekt ist, kannst Du ja nochmal besser beschreiben was Du eigentlich genau machen möchtest?
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?




Zitat Zitat von RoboHolIC Beitrag anzeigen
Das ist der klassische Fall einer Timeout-Sicherung: Warten auf ein äusseres Signal, das zu spät oder vielleicht auch nie kommt; der Timeout leitet das Programm weg vom operativen Ziel hin zu einer Störbehandlungsfunktion.

Der Timeout wird wie eine Eieruhr immer dann frisch "aufgezogen", wenn eine potentiell erfolglose Wartephase beginnt. Das Warten auf das operative Signal und die Prüfung auf Timeout werden ständig nacheinander ausgeführt. Innerhalb dieser "aktives-warten"-Schleife wird dann je nach Ereignis in die Prozessfunktion oder die Störbehandlung verzweigt.
Genau das ist die Idee dahinter.