mikrocontroller.net

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


Autor: MathiasM (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MathiasM (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.