Forum: Mikrocontroller und Digitale Elektronik Zaehlen von Signalsträngen


von Heinrich Tennis (Gast)


Lesenswert?

Hi,

ich möchte Signalimpulse zählen. Dabei hab ich folgendes Problem: Ein 
Signal liegt an einem Eingang an. Jetzt tastet der Empfaenger das Signal 
viel mehr schneller ab, als es anliegt. Also sagen wir mal, eine Lampe 
blinkt z.B. 10mal in der Sekunde, dann hab ich Blink- und Unblikphasen. 
Nun erfasse ich das Signal aber 50mal in der Sekunde. Nun koennte es 
passieren, dass ein Signal durch das mehrmalige Abtasten mehrfach 
gezählt wird, das dann das Ergebnis verfälschen würde.

Folgende Lösung hab ich mir ausgedacht.

schleife_start:
If Pegel = High
    Goto Zähler_Unterprogramm
Else
    Bit = False
endif

goto schleife_start

Zähler_Unterprogramm:
   If Bit = False
      Zähler = Zaehler+1
      Bit = TRUE
   endif

return

also ich sezte gewissermaßen ein Bit, dass praktisch hin- und 
herschaltet, ob der Pegel High oder Low ist. und wenn es High ist und 
Bit= True ist, dann wird es nicht mehr gezählt.

Ist das ein geeigneter Lösungsansatz? Ich habe nach mehreren Stichworten 
bisher gesucht wie Impulse zaehlen, Flanken zaehlen ..., habe aber kein 
erklärendes Beispiel gefunden, was mir erklärt, wir man das macht, da 
ist mir diese Idee gekommen mit dem zusaetzlichen Bit.

PS: Das soll kein Quellcode sein, sondern einfach nur ein schematischer 
Ablauf das Beispielprogramm.

von Klaus D. (kolisson)


Lesenswert?

nimm einen Flankengesteuerten Interrupt.

Klaus

von Karl H. (kbuchegg)


Lesenswert?

DIe vernünftigste Lösung besteht darin, dass man sich klar macht, dass 
eine Flanke (denn genau das ist es was du zählen willst) sich nur 
dadurch feststellen lässt, in dem man einen Zustand von jetzt mit einem 
Zustand von früher vergleicht. Sind die beiden gleich, dann gab es keine 
Flanke. Nur wenn sie unterschiedlich sind, kann es eine Flanke gegeben 
haben.

Wenn du um 1/2 9 Uhr ins Badezimmer gehst und dort brennt das Licht und 
um 9 Uhr gehst du wieder rein und das Licht brennt noch immer, dann hat 
es in der Zwischenzeit keiner ausgeschaltet. Gehst du aber um 1/2 10 
rein und das Licht ist aus, dann gab es eine Schaltflanke: jemand hat 
das Licht ausgeschaltet. Das stellst du fest, in dem du den Zustand um 
1/2 10 (Licht aus) mit dem Zustand von 9 Uhr (Licht ein) vergleichst und 
feststellst, dass es da einen Unterschied gibt.

Deine Hauptschleife ist deine Uhr. Jedesmal wenn sie wieder von vorne 
beginnt, ist der nächste Zeitpunkt da.

   ZustandAlt = Zustand des Eingangspins


   do  ---- Hauptschleife
     ZustandJetzt = ZUstand des Eingangspins

     if  ZustandAlt ungleich ZustandJetzt then

       da hat sich was getan, bearbeite es

     end if

     ZustandAlt = ZustandJetzt


     mache was es sonst noch so alles in der Hauptschleife zu tun gibt

   loop

von Heinrich Tennis (Gast)


Lesenswert?

Klaus De lisson schrieb:
> nimm einen Flankengesteuerten Interrupt.

Interrupt geht nicht, da nur zwei Interrupts verfügbar sind, ich aber an 
8 Kanälen zaehlen will :-(

von Heinrich Tennis (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
>    do  ---- Hauptschleife
>      ZustandJetzt = ZUstand des Eingangspins
>      if  ZustandAlt ungleich ZustandJetzt then
>        da hat sich was getan, bearbeite es
     end if
>      ZustandAlt = ZustandJetzt
      mache was es sonst noch so alles in der Hauptschleife zu tun gibt
>    loop

Danke fuer die ausfuerhliche Loesung, die ist ja noch einfacher als das 
von mir mit dem Unterprogramm,

von Heinrich Tennis (Gast)


Lesenswert?

Ich hab das Programm jetzt versucht zu verstehen - aber damit würde ich 
ja, wenn ich in die if-Abfrage etwas bearbeite, jede Änderung 
feststellen, also jede Änderung zwischen Low/High feststellen, oder muss 
ich dann einfach das Ergebnis durch zwei teilen, um die Impulse zaehlen 
zu koennen?

von Karl H. (kbuchegg)


Lesenswert?

Heinrich Tennis schrieb:
> Ich hab das Programm jetzt versucht zu verstehen - aber damit würde ich
> ja, wenn ich in die if-Abfrage etwas bearbeite, jede Änderung
> feststellen, also jede Änderung zwischen Low/High feststellen, oder muss
> ich dann einfach das Ergebnis durch zwei teilen, um die Impulse zaehlen
> zu koennen?

Kannst du machen.
Du kannst dir aber auch einfach den ZustandJetzt ansehen.

Im Beispiel:
Wenn vorher das Licht brannte und jetzt nicht, dann hat es wer 
AUSGESCHALTET
Wenn vorher das Licht nicht brannte, jetzt aber schon, dann hat es 
offensichtlich wer EINGESCHALTET.

Das sich die Zustände unterscheiden verrät dir, DASS etwas passiert ist. 
WAS passiert ist verrät dir einer der beiden Zustände.

   do  ---- Hauptschleife
     ZustandJetzt = ZUstand des Eingangspins

     if  ZustandAlt ungleich ZustandJetzt then
       if ZustandJetzt gleich ein
         es wurde eingeschaltet
       end if

     end if

     ZustandAlt = ZustandJetzt


     mache was es sonst noch so alles in der Hauptschleife zu tun gibt

   loop

von Heinrich Tennis (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Kannst du machen.
> Du kannst dir aber auch einfach den ZustandJetzt ansehen.

Vielen Dank für Deine beiden Programbeispiele, Du hast mir sehr geholfen 
und ich habe eine Menge von Dir gelernt, dafür bin ich Dir sehr dankbar.

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.