Go Down

Topic: 30 Taster einlesen mit i2c oder shiftRegister? (Read 11683 times) previous topic - next topic

ElEspanol

d.h. also, wenn ich die Porterweiterung nur alle 50ms abfrage, kann ich mir das entprellen sparen, laufe aber Gefahr, dass ein kurz zuvor gedrückter Taster gerade prellt und mir 0 stat 1 liefert. Da ich den Taster aber in aller Pegel länger als 50ms gedrückt halte, kommt spätestens bei der nächsten Abfrage eine 1

Sehe ich das richtig?

Doc_Arduino

Hallo,

könnte klappen. Schreib mal Deinen Code, dass er aller 50ms abfragt und zusätzlich für jeden Tastendruck eine LED umschaltet, Ein/AUS, und zusätzlich die Signaländerungen, dass ggf. vorhandene prellen, einfach hochzählt und Dir ausgibt. Dann wirste sehen was passiert und ob das so funktioniert. Dann veränderst Du die 50ms auf weniger oder mehr und guckst was dann passiert. Dann lernste das ganz schnell.   ;)



Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

ElEspanol

#32
Sep 30, 2014, 01:10 pm Last Edit: Sep 30, 2014, 01:16 pm by ElEspanol Reason: 1
Ich mach eine Schleife "blink ohne delay" mit 50ms, ggf. weniger, mit include adafruit mcp23017 lib

darin
mcp.digitalRead(1);
if Taster gedrückt: digidalwrite(13, !digitalRead(13)); prellzaehler++

den prellzaehler auf serial ausgeben und vergleichen

Das ganze mit miesem taster, der übel prellt.

So?, dann werd ich das später mal testen

P.S.: Wenn ich dann länger als 50ms draufbleibe, wechselt doch die LED ständig den zustand, oder? Werde doch die kompliziertere Methode nehmen ..., sonst läuft ja auch der prellzaehler alle 50ms um eins hoch

Doc_Arduino

Hallo,

zum sauberen "umschalten" mache ich das so. Wenn wirklich ein sauberes Signal ohne prellen rein kommt, dann schaltet die LED bei jedem Tastendruck genau einmal um. Mußte jetzt nur an Deine Pins und mcp Funktionen/Lib anpassen.

Code: [Select]

// Taster 1 
   if ( digitalRead(Taster1) == HIGH) {
      prellzaehler++;
      if ( ledState1 == LOW ) {
         ledState1 = HIGH;
       } else {
         ledState1 = LOW;
       }
     digitalWrite(led1, ledState1);
   }
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

michael_x

Quote

wenn ich die Porterweiterung nur alle 50ms abfrage, kann ich mir das entprellen sparen, laufe aber Gefahr, dass ein kurz zuvor gedrückter Taster gerade prellt und mir 0 stat 1 liefert. Da ich den Taster aber in aller Pegel länger als 50ms gedrückt halte, kommt spätestens bei der nächsten Abfrage eine 1
Sehe ich das richtig?

Ja, siehst du richtig.
Einmal Änderung erkennen reicht übrigens.

Wobei 10 ms zum Entprellen von Tastern meist auch schon reichen sollten,
aber kaum jemand einen großen Licht-Taster kürzer als 100 ms drückt und trotzdem erwartet, dass das zugehörige Relais schaltet.

Die Bounce2 Library will eine Pin-Nummer und macht damit digitalRead. Ist also so wie sie ist, hier unbrauchbar.

Du musst ntürlich erstmal eine Änderung erkennen...
Code: [Select]

const int led1=13;
const int Taster1 = 3;

void loop() {
static unsigned int Zaehler;
static bool ledState1;
static bool Taster1Zustand;
if (digitalRead(Taster1) != Taster1Zustand)
{
    delay(10); // Entprellen
    Serial.println(Zaehler++); // Zählt jeden Wechsel
    Taster1Zustand = ! Taster1Zustand;
    if (TasterZustand == HIGH)
        ledState1 = ! ledState1;  // Toggle mit jedem Drücken
}
digitalWrite(led1, ledState1);
}

Doc_Arduino

Hallo,

a) das delay ist an der falschen Stelle
b) das delay muß raus, muß und sollte man mit millis() machen

Das gesamte einlesen der Eingänge bzw. des Ports soll aller 50ms oder Deiner 10ms erfolgen. Die Auswertung danach sofort.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

michael_x

Das ist nur ein Beispiel für einen einzelnen Taster. ( mit digitalRead )
Zum Testen des Entprellens per delay.

Wenn sonst nix in loop ist, kann das delay ruhig so bleiben, auch an der Stelle ;)

Wenn man 30 Taster per shiftIn oder  wire.read()  ( I2C ) einliest, und evtl. noch mehr macht, sollte man dies schon nach der
blinkwithoutdelay-Methode machen, richtig:

Code: [Select]
static unsigned long lastRead;
if (millis() - lastRead >= 20)  // zum Entprellen nur alle 20 ms einlesen
{
    lastRead= millis();
    einlesen_und_auswerten(); // ohne delay hierdrin.
}

ElEspanol

#37
Sep 30, 2014, 03:16 pm Last Edit: Sep 30, 2014, 03:22 pm by ElEspanol Reason: 1
Also, folgendes Resultat:

Ich habe es mir einfacher gemacht, ganz einfacher Code.
Code: [Select]

long previousmillis;
int interval=25;

void setup() {
pinMode(13, OUTPUT);
}

void loop() {

unsigned long currentMillis = millis();

 if (currentMillis - previousmillis > interval)
   {
   digitalWrite(13,digitalRead(2));
   previousmillis=currentMillis;
   }
}


Dann Logiganalyzer an CH0 an Pin2 und CH1 Pin13

Es ist ganz klar zu erkennen, dass es so funktioniert. Das schalten des Ausgangs ist natürlich etwas verzögert, eben verursacht durch die nicht ständig laufende Abfrage.
Ganz praktisch, so ein 8€ Ding

Screenshot, man sieht es klar:

Doc_Arduino

Hallo,

schön das es klappt. Du kannst ruhig die v1.1.24 beta verwenden und die Abtastfrequenz ganz hoch setzen. Vielleicht siehste dann noch etwas mehr prellen des Kontakts.

Ganz schön verwirrend auf den ersten Blick, Deine NOT Operationen, aber ich denke ich habs verstanden. Wird funktionieren.   ;)
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

michael_x

Wie hast du das "Prellen" in Ch0 erzeugt ?
Sieht zumindest anders aus als ich erwartet hätte. ( Fehlt da ein Pulldown-Widerstand am Taster ?)

Mach mal:
Code: [Select]
pinmode(2, INPUT_PULLUP);
und dann den Taster nach GND. Spart den PullDown-Widerstand.

ElEspanol

Das ist ein Logiganalyzer kein DSO. Zeigt also nur oV oder 5V an, nix dazwischen.

Pulldown auf Masse. Bin irgendwie kein Fan von invertieter Logik.

@Doc
Was meinst du mit NOT Operationen? Die Schlichtheit meines Sketches?  8)

Doc_Arduino

Hallo,

ich weis das Du kein DSO hast, sondern die kleine schwarze Plasteschachtel vom Chinesen. Wenn der Taster nicht mehr prellt, kannst Du auch nichts mehr sehen das er prellt. Deswegen kann es keine Werte zwischen 0/1 geben, sondern nur diese beiden. Entweder oder. Das haut schon hin. Erhöhst Du Deine Abtastfrequenz kann er noch mehr detektieren. Stell mal 24MS/s ein.

Mit NOT Operationen meinte ich den Code von michael. Die Syntax "!" ist NOT, drehe das bool'sche Signal um.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

ElEspanol

Ich habe die 1.1.25 beta installiert, arg düsteres Design. Kann man das irgendwo ämdern? Hab nix gefunden.

Bei 24MHZ siehts übler aus. Aber das was der LA sieht, wird doch genau so auch vom Arduino erkannt. Also ich würde sagen, für meine Zwecke bei meinem aktuelle Projekt reicht das Entprellen so.

Man lernt ja immer gerne dazu.

Doc_Arduino

#43
Sep 30, 2014, 05:21 pm Last Edit: Sep 30, 2014, 05:24 pm by Doc_Arduino Reason: 1
Hallo,

das Design kann man nicht ändern. Mir gefällt das neue besser.   :)  
Ich würde aber nicht zurückwechseln. Paar nette Sachen wurden verbesserten. Zum Bsp. bleibt der Signal-Zoom für das nächste Sampling erhalten. Möchte ich nicht mehr missen.

Genau, das was der LA sieht, bekommt auch der Arduino vor die Nase gesetzt und nur Dein entprellen filtert das raus. Du kannst mit dem LA schön sehen wie lange und wie oft ein Taster prellt. Deswegen hohe Abtastrate.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

sschultewolter


Hallo,

schön das es klappt. Du kannst ruhig die v1.1.24 beta verwenden und die Abtastfrequenz ganz hoch setzen. Vielleicht siehste dann noch etwas mehr prellen des Kontakts.

Ganz schön verwirrend auf den ersten Blick, Deine NOT Operationen, aber ich denke ich habs verstanden. Wird funktionieren.   ;)


Danke für den Tipp mit der Beta ;) Hatte auch nur die 15er. Die 25er gefällt mir auch etwas besser. Was ich mir noch wünsche wäre. dass man die Farbe des Pegels ändern könnte.
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Go Up