Lichtschranke_in C_Dämpfung

Gast #5279089
Lesenswert?
• ▲
▼
Hallo Team,

ich habe zwei Lichtschranken. Diese kann ich auch perfekt einlesen.
Mein "Programm in C" besteht Grundsätzlich aus if-Schleifen in der ich 
Und-Oder Befehle verarbeite.

Ich habe es so programmiert: Wenn beide Lichtschranken unter einem Wert 
X liegen, passiert etwas. Wenn mindestens eine Lichtschranke über den 
Wert X liegt, passiert etwas anderes.

Nun folgendes Problem: Den Bereich den meine Lichtschranken einlesen, 
ist nicht immer zu 100% spiegelnd (Unebenheiten). Quasi, dass zum 
Beispiel eine Lichtschranke für eine sehr kurze Zeit über dem Wert X 
ist.

Ich will es nun so Programmieren, dass die Lichtschranken mindestens 
eine Zeit T(zum Beispiel mindestens 100ms) betätigt/unbetätigt sein 
müssen, damit meine if-Schleifen erst reagieren.

Ich habe gar keine Ahnung, wo nach ich "googlen" müsste oder wie ich es 
Anstellen könnte.
(Ich hoffe ich habe es nicht zu allgemein geschrieben, dass man nichts 
mehr versteht:/)
Danke für mögliche Antworten!:D
#5279103
Lesenswert?
• ▲
▼
@ programmiernoob (Gast)

>ich habe zwei Lichtschranken. Diese kann ich auch perfekt einlesen.

Aha.

>Mein "Programm in C" besteht Grundsätzlich aus if-Schleifen

Das wage ich zu bezweiflen.

http://www.if-schleife.de/

> in der ich
>Und-Oder Befehle verarbeite.

Nennt sich Bitmanipulation.

>Ich habe es so programmiert: Wenn beide Lichtschranken unter einem Wert
>X liegen, passiert etwas. Wenn mindestens eine Lichtschranke über den
>Wert X liegt, passiert etwas anderes.

Komisch. Lichtschranken sind im Normalfall digital, genauer, binär. Da 
gibt es nur 1 oder 0 und keine Zwischenstufen.

>Ich will es nun so Programmieren, dass die Lichtschranken mindestens
>eine Zeit T(zum Beispiel mindestens 100ms) betätigt/unbetätigt sein
>müssen, damit meine if-Schleifen erst reagieren.

Nennt sich Entprellung und ist vermutlich besser in der Hardware 
aufgehoben.
#5279111
Lesenswert?
• ▲
▼
a)
"if" bildet keine Schleife in C, im Gegensatz zu "for", "do" oder 
"while"

b)
Der Ansatz mit zeitlichen Verzögerungen zu arbeiten ist bei diese 
Problemstellung (verrauschtes Eingangssignal) nicht unbedingt das Beste.

Besser ist es mit einer Hysterese bei den Eingangsdaten zu arbeiten.
D.h. du definierst nicht nur einen Schwellwert "X", sondern zwei, die 
einen gewissen Abstand voneinander haben ("threshold_high", 
"threshold_low").

Das ganze sieht dann exemplarisch so aus:
1
if (adc_value > threshold_high)
2
  state = 1;
3
else if (adc_value < threshold_low)
4
  state = 0;

Im Bereich zwischen "threshold_high" und "threshold_low" behält "state" 
also erstmal den vorherigen Wert, und toggelt nicht wild hin und her.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.