INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Wie nur ansteigende Flanken einlesen ?
20.09.2014, 11:01
Beitrag #1
Wie nur ansteigende Flanken einlesen ?
Hallo,

ich bin blutjunger Anfänger in Sachen Programmierung, deswegen wende ich mich an euch um Hilfe bei folgendem Problem:

Ich möchte in einer Schleife der Reihe nach 4 Eingangsports einlesen, ist dort ein H-Signal dann lege das dazugehörige Ausgangsport auf H. Also jeder Eingang hat sein Ausgang.
Das wäre mal das erste. Das könne ich noch hinbekommen ... Was für mich wichtiger wäre - und ich habe keine Ahnung wie ich das programmieren könnte - die Eingänge sollen nur auf ansteigende Flanken reagieren und soll nur einmal ein Ereignis auslösen, keine mehrere in der Schleife.

Könnt ihr mir da etwas unter die Arme greifen ? Gibt es hier vielleicht auch kleine verständliche Beispiele ?

besten Dank im Voraus

mops
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.09.2014, 13:32
Beitrag #2
RE: Wie nur ansteigende Flanken einlesen ?
(20.09.2014 11:01)mops schrieb:  die Eingänge sollen nur auf ansteigende Flanken reagieren und soll nur einmal ein Ereignis auslösen, keine mehrere in der Schleife.
Hi,
definiere pro Eingang eine Variable (am besten in einem Array), welche den vorherigen Zustand des Ports enthält. In der Schleife fragst Du den jeweiligen Eingang ab, aber nur wenn der Eingang High ist und die Vorher-Variable Low enthält machst Du was.
Am Schluss von jedem Durchlauf wird die Vorher-Variable auf den aktuellen Wert gesetzt.
Falls Deine Eingänge Tasten sind, dann musst Du vielleicht noch entprellen, sonst bekommst Du pro Tastendruck mehrere aufsteigende Flanken. Aber das kommt auch auf Deine Hardware an.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.09.2014, 20:22
Beitrag #3
RE: Wie nur ansteigende Flanken einlesen ?
Danke,

von der Hardware wäre dies ein Signal von einer anderen Schaltung die in einen Eingangsport des Arduino gehen. Leider gibt diese Schaltung 6 Impulse (3V,1 Hz, 50:50 Pulsweite) pro Ereignis ab. Zusammen soll das aber nur als ein Impuls gelesen werden.
Mein Gedanke wäre daran einen Kondensator (100µF ?) zu hängen (mit R, ohne R ?), dies durch einen Schmitt-Trigger zu einem sauberen Impuls formen zu lassen und dann zum Arduino zu schalten.

Wie ich gerade gelesen habe könnte ich auch den Interupt-Eingang benutzen da dieser auch auf ansteigende Flanke eingestellt werden kann. Ich benöige jedoch 4 solcher Eingänge, der Nano hat aber nur zwei.

Könnte etwas dauern bis ich das irgendwie hinbekommen habe. Oder gäbe es in diesem Fall eine bessere Lösung ?

Gruß
mops
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.09.2014, 21:23
Beitrag #4
RE: Wie nur ansteigende Flanken einlesen ?
Hi,
1Hz ist ziemlich langsam, da sollte Polling noch kein Problem sein. Mit dem, was ich bereits beschrieben habe, findest Du die aufsteigenden Flanken. Nach der ersten setzt Du Deinen Ausgang. Was auch immer dann am Eingang während der nächsten 6 Sekunden passiert ignorierst Du einfach.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.09.2014, 22:08
Beitrag #5
RE: Wie nur ansteigende Flanken einlesen ?
Hi Thorsten,
mir wäre deine Softwarelösung lieber ohne Hardware-Zusatz.
Allerdings bin ich so am Anfang in der Materie dass ich - ehrlich gesagt - noch keinen Schimmer habe wie ich das programmieren soll ... einmal Status setzen wie ein Flipflop und zum zweiten ein Zähler des Ignorierens mit rein bauen und das ganze als Schleife bei 4 Eingängen. (in diesen 6 sek soll der Prozessor aber nicht warten sondern bereits die anderen Eingänge abfragen).
Ich fürchte ich bin damit schon völlig überfordert. Sad
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.09.2014, 22:41
Beitrag #6
RE: Wie nur ansteigende Flanken einlesen ?
(20.09.2014 22:08)mops schrieb:  Ich fürchte ich bin damit schon völlig überfordert. Sad
Hi,
na dann fang' doch mal Stück für Stück an. Erstmal ein Eingang und auch erstmal eine Flanke erkennen und den Ausgang setzen.
Durch was soll der Ausgang denn zurückgesetzt werden?
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.09.2014, 04:28
Beitrag #7
RE: Wie nur ansteigende Flanken einlesen ?
Wenn ich dich richtig verstanden habe, müsste das schon reichen:
Zitat:const byte inputPin[] = {2,3,4,5};
unsigned long timestamp[] = {0,0,0,0};

void setup() {
  for (byte i=0;i<4;i++)
    pinMode(inputPin[i], INPUT);
}

void loop()
{
  for (byte i=0;i<4;i++) {
    if (digitalRead(inputPin[i])) {
      if (!timestamp[i]) {
        timestamp[i] = millis();
        switch (i) {
          case 0:
            // Auszufürender Code bei Impuls auf Pin 2
            break;
          case 1:
            // Auszufürender Code bei Impuls auf Pin 3
            break;
          case 2:
            // Auszufürender Code bei Impuls auf Pin 4
            break;
          case 3:
            // Auszufürender Code bei Impuls auf Pin 5
        } 
      }
      else if(millis() - timestamp[i] > 6500) //Wartezeit gegebenenfalls anpassen
        timestamp[i] = 0;     
    }
  }
}

gruß lorenz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.09.2014, 09:00
Beitrag #8
RE: Wie nur ansteigende Flanken einlesen ?
Hi,
wahrscheinlich klappt das erstmal, aber ich würde das unter "gefährliche Benutzung von millis" einordnen. Wenn millis() überläuft und bei der Abfrage Null wird,dann wird's falsch. (das ist vielleicht unwahrscheinlich, aber wenn's dann doch passiert wird's blöd) Das kann zwar erst nach 49 Tagen passieren und auch nur einmal, aber das ist der Art von Fehler, bei dem man anfängt an's Übersinnliche zu glauben...
Also besser ganz klassisch so:
Code:
const byte inputPin[] = {2,3,4,5};
unsigned long timestamp[] = {0,0,0,0};

void setup() {
   for (byte i=0;i<4;i++)
     pinMode(inputPin[i], INPUT);
}

void loop()
{
   unsigned long now = millis();  

   for (byte i=0;i<4;i++) {
     if (digitalRead(inputPin[i]) && now - timestamp[i] > 6500) {
         timestamp[i] = now;
         switch (i) {
           case 0:
             // Auszufürender Code bei Impuls auf Pin 2
             break;
           case 1:
             // Auszufürender Code bei Impuls auf Pin 3
             break;
           case 2:
             // Auszufürender Code bei Impuls auf Pin 4
             break;
           case 3:
             // Auszufürender Code bei Impuls auf Pin 5
         }
      }
   }
}
Dabei gehe ich davon aus, dass auf jedem Pin mindestens alle 49 Tage mal ein Impuls kommt und der "Auszuführende Code bei Impuls auf Pin x" maximal ein paar Millisekunden dauert.
Ach ja: Es funktioniert erst etwa 6500ms nach dem Einschalten. Was vorher kommt wird ignoriert.

Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Zahl von SD-Card Modul einlesen und Var. zuweisen Nafetz 13 298 28.10.2016 10:12
Letzter Beitrag: hotsystems
  433 Mhz Signal von Garagentor Fernbedieung einlesen Much 6 822 07.02.2016 10:45
Letzter Beitrag: Binatone
  Port B vom Arduino Ethernet einlesen magifix 0 354 08.01.2016 10:46
Letzter Beitrag: magifix
  Takt einlesen Igor_H 4 613 07.11.2015 12:06
Letzter Beitrag: Igor_H
  Byteweise von Datei einlesen von SD-Karte. arduinofan 8 920 28.10.2015 19:52
Letzter Beitrag: arduinofan
  GUI für Arduino Werte einlesen/rausschreiben Xtremefly 2 927 23.01.2015 18:41
Letzter Beitrag: Xtremefly
  Analogwerte einlesen kendrick 10 2.568 03.01.2015 20:27
Letzter Beitrag: Bitklopfer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste