Eigene Methode für Flankenerkennung

Hi Leute, hätte da mal eine Frage. Und zwar wollte ich eine eigene Methode zur Flankenerkennung machen, z.B. für eine steigende Flanke.
Soweit so gut, jetzt ist die Frage, kann ich es irgendwie umgehen immer am Anfang meine Loops meinen "rEdgeFlag" auf LOW zu setzen? Dass man die irgendwie temporär machen kann, dass die automatisch nur für einen Durchlauf verändert werden kann.

Gruß Moritz

void rEdge(bool input, bool output) {
  bool rEdgeFlag;
  if(input == 1 && rEdgeFlag == 0){
    output == 1;
  }
  if(input != rEdgeFlag) {
    rEdgeFlag = output;
  }
}

Was soll denn diese Funktion machen?

Die kocht doch nur im eigenen Saft und gibt nichts nach außen.
Wenn man etwas output nennt, sollte es auch etwas zurückgeben, was Dein Konstrukt nicht tut.
Schau Dir mal Funktionen mit Rückgabewert an.

Gruß Tommy

fritzko:
... wollte ich eine eigene Methode zur Flankenerkennung machen ...

Wieso das? Mit den Dingen, die ein Arduino „von Haus aus kann“, ist das doch eigentlich überflüssig und damit vergleichbar, dass ich mal einen Brainfuck-Interpreter für die Bash geschrieben habe. Braucht eigentlich keine Sau, kann aber Spaß machen :slight_smile:

Gruß

Gregor

... sehen will ... :wink: (gerne als Link - nicht, daß ich großartig was mit Brainfuck anfangen könnte - nur von gelesen)

MfG

Haha gibt ja schon gleich Rückmeldungen. Ja hab grade auch gesehen dass das alles nicht so funktioniert :smiley:
Immer diese Sache mit Copy - Paste

@Tommy56
Oh ja hab da noch was gesehen was du wohl meintest, wird ja wohl eher nichts mit void

Richtig erkannt.

Gruß Tommy

Hallo,

die Funktion hat nichts mit Flankenerkennung zu tun, weil man eher sagen kann das ein "Pegel" (low oder high) an die Funktion übergeben wird. Ich habe die Funktion einmal zusammen gekürzt, damit du selbst siehst was die eigentlich macht und damit eigentlich überflüssig ist. Schritt für Schritt wie in der Schule.

Flankenerkennung in dem Sinne funktioniert so, dass man den alten Zustand mit dem neuen vergleicht und den neuen dann wiederum als alten speichert für den nächsten Vergleich. Rising wäre vorher irgendein Signal hat Low, dann Wechsel auf High Pegel. Falling umgekehrt. Auf den gewünschten Richtungswechsel reagiert man dann.

im Syntax korrigiert mit lokaler Variablen Initialisierung

void rEdge(bool input, bool output)
{
  bool rEdgeFlag = 0;
  
  if(input == 1 && rEdgeFlag == 0){
    output = 1;
  }
  if(input != rEdgeFlag) {
    rEdgeFlag = output;
  }
}

Vergleiche gekürzt

void rEdge(bool input, bool output)
{
  bool rEdgeFlag = 0;
  
  if(input == 1){
    output = 1;
  }
  if(input == 1) {
    rEdgeFlag = output;
  }
}

letzten Vergleich weggekürzt

void rEdge(bool input)
{
  bool rEdgeFlag = 0;
  
  if(input == 1){
    rEdgeFlag = 1;
  }
}

return eingefügt

bool rEdge(bool input)
{
  bool rEdgeFlag = 0;
  
  if(input == 1) {
    rEdgeFlag = 1;
  }
  return rEdgeFlag;
}

am Ende bleibt ohne Funktionsrumpf übrig

  if(input) {
    rEdgeFlag = 1;
  }
  else {
    rEdgeFlag = 0;
  }

und das nochmal gekürzt wäre am Ende

  rEdgeFlag = input;

lustiges Ergebnis, oder? :slight_smile:

postmaster-ino:
... sehen will ... :wink: (gerne als Link - nicht, daß ich großartig was mit Brainfuck anfangen könnte - nur von gelesen)

http://test.szaktilla.de/recordmydestop-out-1.ogv und
http://test.szaktilla.de/recordmydestop-out-2.ogv

Die Programme sind im Grunde Endlosschleifen, die ewig laufen, wenn man sie auf einen Speicher loslässt, der einen Ring darstellt.

Für die, die BF nicht kennen: Das ist mWn die kleinste Turing-vollständige Programmiersprache, d. h. dass mit BF prinzipiell jedes Problem gelöst werden kann. Wer's genauer wissen will, gucke hier vorbei.

Gruß

Gregor

Aus meiner Wühlkiste:

class FlankenErkennung
{
  private:
  bool state = false;

  public:
  bool doTrigger(const bool trigger) 
  {
    bool result = trigger && !state;
    state = trigger;
    return result;
  }
};

Hallo,

noch ne Lösung!

Zur Erklärung ist ja eigendlich schon alles gesagt. Du benötigst eine Variable die den Zustand des letzten Durchlaufs speichern kann und mit dem akuellen neuen Zustand vergleicht. Insofern war Dein Ansatz ja fast richtig.

Wenn man das in eine Funktion packt kann das so aussehen.

die Fuktion hat einen return Wert der TRUE ist wenn die Flanke erkannt wurde.

boolean posflanke( boolean input, boolean &hilfsmerker)

Der erste Parameter input ist eine Eingabe, hier der Pegel des Tasters.
Der zweite ist Ein und Ausgabe. (& vor dem Namen der Variablen)

in dem Beispiel wird ein Taster abgefragt. Mit jedem Betätigen wird ein Zähler um 1 erhöht. Ohne Flankenerkennung würde so lange hochgezählt wie der Taster gedrückt ist. Mit dem Monitor werden die Zustände angezeigt.

Wenn Du die Funktion so wie sie ist mehrfach benötigst, und das ist u.A ist der Sinn von Funktionen, kannst Du sie für unterschiedliche Input Signale mit unterschiedlichen Parametern mehrfach aufrufen.

pflanke1=posflanke(signal1,flag1)
pflanke2=posflanke(signal2,flag2)

Das Ganze geht natürlich auch für negative Flanken mit einer ähnlichen Funktion.

Gruß Heinz

// Testprogram positive Flankenerkennung
// ein Zähler wird mit jeder Flanke erhöht

int taster = 3; // Taster liegt auf pin 3 und 0V

boolean pegel;  // Variable für Tastersignal
boolean pflanke;// Variable für pos. Flanke
boolean flag1;  // Hilfsmerker
int count;      // counter zum testen

void setup() {
  Serial.begin(9600);
  pinMode(taster, INPUT); // pin 3 ist ein Eingang
}

void loop() {
  // Anzeige nur zum testen
  Serial.print(pegel); Serial.print("\t");
  Serial.print(flag1); Serial.print("\t");
  Serial.println(count);

  // Taster invertiert lesen (Taster schaltet nach 0V)
  pegel = !digitalRead(taster);

  // Function aufrufen
  pflanke = posflanke(pegel, flag1);
  

  // bei pos. flanke zähler erhöhen
  if (pflanke) {
    count++;
  }
}

// ================ functon´s =================
boolean posflanke( boolean input, boolean &hilfsmerker) {

  if (input && !hilfsmerker ) {  // wenn Signal True und hilfsmerker false
    hilfsmerker = true;           // Zustand von Signal abspeichern 
    return true;                    // Funktion mit Rückgabe true verlssen
  }
  if (!input) {                      // wenn Signal False ist Hilfsmerker auch auf false setzten
    hilfsmerker = false;
  }
  return false;                    // funktion mit Rückgabe false verlassen
}

Erweiterte Moeglichkeit der FlankenErkennung nach combie's Entwurf.

//class design created by combie
class FlankenErkennung
{
  private:
    bool state;
    int16_t zaehler;

  public:
    void begin()
    {
      state = false;
      zaehler = 0;
    }
    void aktZaehler(const int16_t ivar)
    {
      if (ivar == 0) zaehler = 0; //bei 0 = RESET
      else zaehler += ivar;       //+/- moeglich
    }
    bool doTrigger(const bool trigger)
    {
      bool result = trigger && !state;
      state = trigger;
      return result;
    }
    int16_t getZaehler()
    {
      return zaehler;
    }
};

FlankenErkennung FE_1; //Objekt anlegen (FE_1)
//FlankenErkennung FE_2...;

const uint8_t pin_2 = 2; //fuer Flanken Auswertung

void setup()
{
  pinMode(pin_2, INPUT);
  FE_1.begin(); //Variablen initialisieren
}

void loop()
{
  if (FE_1.doTrigger(digitalRead(pin_2))) FE_1.aktZaehler(1);
  int16_t FE_1_zaehler = FE_1.getZaehler();
  //...
}

Gruß
Grillgemuese :slight_smile:

Flanken erkennen und zählen, mit der CombieLib
:smiling_imp: :smiling_imp: :smiling_imp:

#include <CombiePin.h>
#include <CombieTimer.h>
#include <CombieTools.h>

using Combie::Tools::FlankenErkennung;
using Combie::Timer::EntprellTimer;


using EingabeTaster = Combie::Pin::TasterGND<2>; // Taster zwischen Pin und GND(invertierend)
using Counter       = Combie::Tools::Counter<uint16_t>;

EingabeTaster     taster; 
EntprellTimer     entprellen(20);
FlankenErkennung  flankenerkennung;
Counter           counter;



auto callBack = [](Counter &counter)   // Lambda Funktion
                {
                  Serial.println(counter);
                };

void setup() 
{
  Serial.begin(9600);
  taster.initPullup();
  counter.onCount(callBack);
}

void loop() 
{
  counter = flankenerkennung = entprellen = taster;
}

CombieLib.zip (50.8 KB)