Eine Sub?? Das ist doch mindestens ein halbes Dutzend...ich habe deinen Test Code nun mal einen Sub gelegt
Also:
1. ISRs soll man so kurz wie nur irgend möglich halten. Warum? Weil während eines Interrupts zwar die nächsten IRQs angenommen, aber nicht ausgeführt werden können. Also idealerweise nur schnell ein Flag setzen, das in der -> Hauptschleife dann anzeigt, dass ein Interrupt passiert ist.
2. In der Hauptschleife (von DO bis LOOP) dürfen ruhig auch ein paar Befehle stehen!
3. Waitms... in einer ISR ist eines von den klassischen No-Go´s, weil es aus genannten Gründen für lange Zeit das Abarbeiten von anderen IRQs blockiert. Deine Timer1-ISR wird ja schon ca. 30mal pro Sekunde angesprungen, da kann es leicht sein, dass er sozusagen von einem Timer1-IRQ nahtlos in den anderen übergeht.
4. Eine ISR sollte man nur im äußersten Notfall über ein Goto oder Gosub verlassen - und dann muss man unbedingt sicherstellen, dass das Programm korrekt in die ISR zurückkehrt, um sie sauber über das return zu verlassen. Ansonsten läuft Dir der Stack in wenigen Sekunden über.
Möglicherweise wiederhole ich mich, aber ich würde an Deiner Stelle versuchen, all die Features nacheinander dazuzustricken, und nicht alles auf einmal. Und die Messung des Empfängerimpulses solltest Du unbedingt über einen Interrupt machen, da die Bitwait-Geschichte den Controller irrsinnig lange aufhält. Das war nur ein ganz grobes Testprogramm um zu sehen, ob der Controller den Empfänger überhaupt erkennt.
Lesezeichen