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.
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
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 :-(
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,
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.