100Hz ist die absolute höchste Frequenz die auftritt. Der Sensor prellt manchmal. Ich habe natürlich beides, FALLING und CHANGE, ausprobiert. Jedes mal zählt das Programm bei einer Radumdrehung genau 40 Flanken. Die Lochscheibe hat 20 Löcher. Mehrfach ausprobiert.
Ich habe den Sensor mal analog ausgelesen, weil ich genau wissen wollte was der so ausspuckt. Dann hab ich ihn natürlich wieder an den digitalen Pin gehängt bevor jetzt einer fragt.
Ich habe ihn richtig angeschlossen. Irgendwie weiß ich nicht was ich da anderes sagen soll, er funktioniert wunderbar, was soll ich da jetzt zum dritten mal die Verkabelung prüfen.
Ich hab wie du oben im Code siehst keinen PinMode Befehl gegeben, daher sind sie ganz normal auf Input eingestellt.
Hab ich schon geprüft. Hier ist mal ein Code der auch funktioniert und pro Radumdrehung 20 Flanken zählt, also das was ich erwarten würde von Interrupt mit Falling:
Danke für die Mühe, aber hilft mir jetzt nicht wirklich weiter. Wenn jemand meinen Code auf einem Uno ausprobiert und etwas anderes beobachtet als ich es tue wäre das aussagekräftiger. Ich glaub nämlich eigentlich auch nicht so ganz, dass die "Modi" prinzipiell nicht funktionieren. Dann wäre ja viel früher einer drauf gestoßen. Aber das was du so selbstsicher durchstreichst ist eben das, was ich bei mir beobachte.
Benutze alle Mechanismen meines Sketches und deine Symptome verschwinden.
Oder es wird von der Hardware verursacht, was man aber ziemlich auschließen kann.
"Interrupt - FALLING verhält sich wie CHANGE" ist einfach falsch.
Uno hattest du noch nicht erwähnt, spielt aber für diese beiden externen Interrupts auch keine Rolle.
P.S.: Deine 6 ms Debounce-Zeit ist auf alle Fälle viel zu lang für ein 100 Hz Signal (20%);
Da es sich bei dem Sensor - wie erwartet - um eine Elektronik handelt, prellt Da Nichts.
Wenn Du wider Erwarten dort Mehrfach-Signale bekommst, dann erkennen die Lichtschranke Mehrfach!
Denke, Du hast Fusseln oder so Was auf der Schlitzscheibe.
Alternativ wäre eine wesentlich kürzere Entprellzeit ein Versuch wert - der Sensor selber prellt nicht!
mach folgenden Test. Nimm einen ausgeleierten Taster. In dem Fall hier soll er prellen. Den schließt du an beide Interrupt Pins an. Einen mit change und den anderen mit falling (oder rising) konfiguriert. Jetzt muss der falling/rising konfigurierte stets den halben Zählerstand zeigen als der change.
habs mal nachgestellt. Funktioniert fast wie erwartet. Nur das die Counter zueinander mit der Zeit wegdriften. Hängt damit zusammen das zwar beide zeitgleich ihr Signal sehen, aber beide ISRs nur nacheinander abgearbeitet werden. Mit millis Ausgabeintervall wirds nur schlimmer, mit harten delay weniger schlimm. Man erkennt aber das die Werte zueinander fast immer ca. ungefähr nahezu halbiert ist.
// https://forum.arduino.cc/index.php?topic=596606.0
// Arduino Mega2560
volatile int Flanken_L;
volatile int Flanken_R;
void setup() {
Serial.begin(250000);
attachInterrupt(digitalPinToInterrupt(18), count_Flanken_R , CHANGE); // rechter Raddrehzahlsensor
attachInterrupt(digitalPinToInterrupt(19), count_Flanken_L , FALLING); // linker Raddrehzahlsensor
pinMode(18, INPUT_PULLUP);
pinMode(19, INPUT_PULLUP);
}
void loop() {
delay(5000);
Werte();
}
void Ausgabe (unsigned int interval) // hat noch stärken Drift
{
static unsigned long last_ms = 0;
unsigned long ms = millis();
if (ms - last_ms >= interval) {
last_ms = ms;
noInterrupts();
int tempL = Flanken_L;
int tempR = Flanken_R;
interrupts();
Serial.print(tempL);
Serial.print('\t');
Serial.println(tempR);
}
}
void Werte ()
{
noInterrupts();
int tempL = Flanken_L;
int tempR = Flanken_R;
interrupts();
Serial.print(tempL);
Serial.print('\t');
Serial.println(tempR);
}
void count_Flanken_R(){
Flanken_R++;
}
void count_Flanken_L(){
Flanken_L++;
}
daran hatte ich ehrlich gesagt nicht gedacht das man das so machen kann, vorallendingen mit Interrupts.
Habe mir nochmal "General Digital I/O" angeschaut. Tatsache, alle Port-Register hängen am I/O Pin. Das erklärt auch warum man die Ausgangspegel wiederum einlesen kann. Das nutzt du hier mit den Interrupts aus. Okay.
Whandall: @Mahimus ich habe mir noch einmal deine Lichtschranken angeschaut, die sollten völlig prellfrei sein.
Lass mal das Debouncen ganz weg und schau wie es dann aussieht.
Doch, er "prellt", gerade wenn er langsam dreht. Der Mechanismus ist sicher ein anderer als beim Taster, aber beim Übergang von High zu Low oder umgekehrt, vermutlich wenn die Lichtschranke teilweise verdeckt ist, gibt er manchmal sowas aus: "...0000101011111..."
Der Zustand ist dann denk ich nicht exakt definiert, bzw genau an der Grenze von "ich les das als offene Lichtschranke" oder "geschlossen". Dann kommt noch ein allgemeines Rauschen dazu und voila: Prellen.
Weiterhin habe ich den Versuch auch schon ohne Entprellen laufen lassen, gleiche Symptomatik wie in der Threadbeschreibung genannt.
Als Korrektur zu dem oben geschriebenen: Die höchste zu erwartende Frequenz sind 50Hz, das wären mit "Change" 100 ISR Ausführungen pro Sek, meine Entprellung lässt ~200 Ausführungen pro Sek zu. Alles gut. getestet hab ich bisher mit noch viel weniger Drehzahl (= geringere Abzutastende Frequenz).
@Doc_Arduino: Danke für die Mühe. Irgendwie muss es wohl doch mein Fehler sein, aber ich komm nicht drauf. Ist echt komisch. Für das aktuelle Projekt ist es allerdings auch recht egal, ich nutze jetzt "Change" und weiß eben, dass das Rad nach 40 Interrupts eine Umdrehung gemacht hat.
Whandall:
Fremde Beleuchtung können die Schranken nicht abbekommen?
Doch. Aber ein HIGH bleibt zumindest immer HIGH und ein LOW immer LOW. Die Fremdbeleuchtung allein hat also keinen so großen Einfluss, dass sie alleine einen fälschlichen Wechsel des Wertes auslöst. Nur beim gewollten Wechsel (Rad dreht sich) gibt es das "Prell"-Problem, aber dieses Problem ist ja gelöst.
Um die Hardware genauer zu beschreiben: Die Lichtschranke ist am Unterboden von einem kleinen Roboter, also kommt direkte Lichteinstrahlung nicht hin. Da ich keinen Anlass sehe das weiter abzuschirmen hab ich da bisher kein lichtdichtes Gehäuse für die Lichtschranken gebaut.
Whandall:
Du könntest ja mal im Dunkeln testen, dann könntest du auch das Fremdlicht ausschließen.
Ich habe ja den Sensor bei den üblichen Lichtbedingungen analog Ausgelesen und da bekomm ich ne superhübsche Rechteckfunktion ohne nennenswerte Störung/Rauschen.
Weiterhin verhält er sich ja bei "Change" als Interruptauslöser und mit Entprellung so wie er soll. Da schaltet er also nicht fälschlicherweise. Licht war da auch an. Das Licht ist demnach schonmal nicht der Übeltäter.