Forum: Mikrocontroller und Digitale Elektronik Flankenwechsel L->H in IRQ erkennen


von MathiasM (Gast)


Lesenswert?

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.

von Peter Dannegger (Gast)


Lesenswert?

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

von MathiasM (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.