Flankenerkennung

#889181
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..
#889190
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.
#889212
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.
#889263
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren