mikrocontroller.net

Forum: PC-Programmierung Flankenerkennung


Autor: Peter "d." (piotred)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
   if( status_global != signal_old ) {

      //
      // bis jetzt weisst du nur, dass sich am Signal was
      // verändert hat. Das reicht aber schon mal um es
      // für die nächste Flankenabfrage festzuhalten
      // Wenn die Abfrage das nächste mal gemacht wird, soll
      // ja nicht noch eine Flanke erkannt werden
      //
      signal_old = status_global;

      //
      // Da war also eine Flanke. Aber war es auch die Richtige?
      //
      if( status_global == TRUE ) {
        zaehler += 1;
      }
    }

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

Autor: Peter "d." (piotred)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter "d." (piotred)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok..ich habe s nun verstanden..danke für die schnelle hilfe..

Autor: Peter "d." (piotred)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
somit ist der von dir vorgegebene codeabschnitt schon der ganze 
code,oder?

static status_global;


flankenerkennung()
{
   static signal_old = FALSE;

   if( status_global != signal_old ) {

      //
      // bis jetzt weisst du nur, dass sich am Signal was
      // verändert hat. Das reicht aber schon mal um es
      // für die nächste Flankenabfrage festzuhalten
      // Wenn die Abfrage das nächste mal gemacht wird, soll
      // ja nicht noch eine Flanke erkannt werden
      //
      signal_old = status_global;

      //
      // Da war also eine Flanke. Aber war es auch die Richtige?
      //
      if( status_global == TRUE ) {
        zaehler += 1;
      }
    }
}

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

Autor: Peter "d." (piotred)
Datum:

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

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zaehler += (int)(status_global == TRUE); // scnr

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (status_global && !status_old) {
  //...
}
status_old = status_global

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.