Hallo, ich hänge an folgendem Problem fest: In einem IRQ der alle 500 Hz aufgerufen wird muss ich einen Flankenwechsel an einem Portbit erkennen (Low nach High), die Frequenz am Portbit ist variabel von 50 bis 120 Hz. Wäre diese Funktion nicht im IRQ sähe sie so aus (natürlich in echt in PIC-Assembler, hier zur Vereinfachung mal als Basic-Befehle): MAINLOOP DO WHILE PORTBIT = LOW LOOP DO WHILE PORTBIT = HIGH LOOP [hier die Funktion, z.B. Frequenz teilen mittels Zähler] GOTO MAINLOOP Das Problem ist aber das ich das ja wie gesagt in einem IRQ mache. Dort kann ich nicht einfach den Prozessor in der Schleife laufen lassen. Ich bräuchte also ein Hilfs-Flag mit dem ich den letzten Zustand zwischenspeichere. Doch ich komme bei dieser Logik einfach nicht voran :-( Jedesmal zählt er genau mit den 500 Hz die der IRQ aufgerufen wird - anstatt mit der externen Frequenz am Portbit. Betrachtet bitte die Hardware als gegeben, eleganter wäre es natürlich den externen Takt direkt auf einen INT-Eingang zu legen, aber dies geht nicht (in der Schaltung ist es nämlich noch viel komplizierter, der Takt wird zu allem Unglück auch noch über einen Multiplexer mit externen Gattern eingelesen, etc. aber dies nur als Info, hat mit dem Problem an sich ja nichts zu tun - dies funktioniert auch schon alles einwandfrei). Ich hoffe das ich das Problem halbwegs verständlich erklären konnte und mir jemand einen Tipp geben kann wie man denn nun so einen Flankenwechsel innerhalb des IRQ erkennen kann.
Du brauchst eine Bitvariable: im 500Hz-Interrupt: if( Pin = 0 ) merkerbit = 1; else if( merkerbit == 1 ){ // pin = 1 AND merkerbit = 1 merkerbit = 0; do_action_on_low_to_high(); } Allerdings müssen low und high mindestens eine 500Hz Interruptzeit (>2ms) lang anliegen, sonst gehen sie Dir durch die Lappen. Peter
Hi Peter, danke für den Tipp! Mit so einem Hilfsflag hatte ich es probiert, allerdings nicht so wie bei Deiner Funktion. Werde das gleich mal heute abend testen :-) @2ms: ja, das ist gewährleistet. Ich denke mal das das direkt so klappt wie von Dir beschrieben. Gruß Mathias
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.