Forum: PC-Programmierung Flankenerkennung


von Peter ". (piotred)


Lesenswert?

Hallo Leute,

ich habe folgende frage:

ich soll bei einer positiven flanke einen zähler hochsetzen..

dies habe ich mir so gedacht: ich habe eine globale variable, wo ich 
sozusagen den wert des signals übermittelt bekomme..

dann habe ich in meiner funktion eine static signal_old_u8 
variable..diese wird mit FALSE vorinitialisiert..

dann übergebe ich ihr den wert, der mir die globale variable 
übermittelt..

anschließend frage ich nach:

if((status_global != signal_old) && status_global = TRUE))
{
    zähler += 1;
}

ist das soweit richtig? ich soll den zähler nur bei einer positiven 
flanke erhöhen, wenn vorher FALSE war..

danke für hilfe..

von gast (Gast)


Lesenswert?

???
was für ein µC, was für eine entwicklungsumgebung???
bei nem atmega brauchst nur den icp nehmen und im interruppt dann ebend 
hochzählen (siehe tutorial)

von Karl H. (kbuchegg)


Lesenswert?

Peter "d." wrote:

>
> anschließend frage ich nach:
>
> if((status_global != signal_old) && status_global = TRUE))
> {
>     zähler += 1;
> }
>
> ist das soweit richtig?

fast.
Du musst in signal_old natürlich noch vermerken, dass sich
das Signal verändert hat. Denn beim nächsten Check möchtest
du den Signalwechsel nicht nochmal protokollieren
1
   if( status_global != signal_old ) {
2
3
      //
4
      // bis jetzt weisst du nur, dass sich am Signal was
5
      // verändert hat. Das reicht aber schon mal um es
6
      // für die nächste Flankenabfrage festzuhalten
7
      // Wenn die Abfrage das nächste mal gemacht wird, soll
8
      // ja nicht noch eine Flanke erkannt werden
9
      //
10
      signal_old = status_global;
11
12
      //
13
      // Da war also eine Flanke. Aber war es auch die Richtige?
14
      //
15
      if( status_global == TRUE ) {
16
        zaehler += 1;
17
      }
18
    }

PS: Ein Vergleich auf Gleichheit schreibt sich in C mit 2 Gleichheits-
zeichen! Ein Gleichheitszeichen alleine ist eine Zuweisung.

von Peter ". (piotred)


Lesenswert?

ja, aber hierbei frage und setzte die signal_old mit TRUE und komme dann 
doch nie mehr rein in meine abfrage? oder? denn der wert bleibt ja dann 
auf true von signal_old..

von Karl H. (kbuchegg)


Lesenswert?

Peter "d." wrote:
> ja, aber hierbei frage und setzte die signal_old mit TRUE und komme dann
> doch nie mehr rein in meine abfrage? oder?

Das willst du ja auch

> denn der wert bleibt ja dann
> auf true von signal_old..

Ja. Ist doch ok so.
Irgendwann wird dann der status_global wieder false und als Folge
davon setzt dein Code signal_old dann ebenfalls wieder auf false.
Nur das diese Flanke dann nicht gezählt wird.

Danach ist status_signal wieder lange Zeit auf false, bis die
nächste Flanke eintrifft. Als Folge davon wird der Vergleich wieder
wahr (denn status_old ist ja immer noch auf false), signal_old
bekommt true zugewiesen und da es eine positive Flanke war wird
sie gezählt.

Beim nächsten Vergleich ist status_signal immer noch auf true
(weil das Signal anhält), aber da auch signal_old auf true ist,
passiert nichts weiter.

Solange bis status_signal dann wieder auf false zurückfällt, wodurch
der Vergleich wieder anschlägt und signal_old wieder auf false
zurücksetzt.

status_old hinkt dem Zustand von status_global immer um eine Abfrage
hinterher. Und genau das brauchst du um Flanken feststellen zu können.

von Peter ". (piotred)


Lesenswert?

ok..ich habe s nun verstanden..danke für die schnelle hilfe..

von Peter ". (piotred)


Lesenswert?

somit ist der von dir vorgegebene codeabschnitt schon der ganze 
code,oder?
1
static status_global;
2
3
4
flankenerkennung()
5
{
6
   static signal_old = FALSE;
7
8
   if( status_global != signal_old ) {
9
10
      //
11
      // bis jetzt weisst du nur, dass sich am Signal was
12
      // verändert hat. Das reicht aber schon mal um es
13
      // für die nächste Flankenabfrage festzuhalten
14
      // Wenn die Abfrage das nächste mal gemacht wird, soll
15
      // ja nicht noch eine Flanke erkannt werden
16
      //
17
      signal_old = status_global;
18
19
      //
20
      // Da war also eine Flanke. Aber war es auch die Richtige?
21
      //
22
      if( status_global == TRUE ) {
23
        zaehler += 1;
24
      }
25
    }
26
}

hier wäre der ganze lösungsweg,stimmt dies soweit?

von Peter ". (piotred)


Lesenswert?

gebe s eigentlich die möglichkeit, mit nur einer if-abfrage dies zu 
erledigen?

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

zaehler += (int)(status_global == TRUE); // scnr

von Philipp B. (philipp_burch)


Lesenswert?

1
if (status_global && !status_old) {
2
  //...
3
}
4
status_old = status_global

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.