combie:
Vergleichen mit vorherigem, gelesenem, Wert.
20ms keine Änderung, dann Wert als gültig ansehen.
Ich würde, ganz ketzerisch, diese 20 ms einfach per delay abfangen und erst nach 100 ms ( also ca 5 mal keine Änderung) den neuen Wert verarbeiten.
Bei dieser Anwendung sollte doch wohl während des Verstellens "rauf , rauf, rauf, rauf, oh zu weit, zurück"
mit den Zwischenwerten und auch sonst nichts *) gemacht werden, oder?
Bei dem 4stelligen wie im Bild wären noch weit größere Anzahl Wartezyklen sinnvoll, finde ich.
*) Ein delay(20) ist prima für z.B. eine kurze Quittierung per led oder pieps
die beste Implementierung wird eine ála "Blink without delay" sein.
PseudoCode (ohne Gesamtschleife):
Wenn Modus != "Hole neuen Wert"
{
Teste alle 100 ms (ála Blink without ..) ob Bit0 sich geändert hat (beim Drehcodierer wechselt ja dieses Bit immer)
Wenn geändert Setze Modus "Hole neuen Wert"
]
Wenn Modus == "Hole neuen Wert"
{
Warte ein paar Millis (Schleifendurchgänge) ab (a la Blink without ..)
Lese neuen Wert ein
Wenn der Wert dreimal hintereinander gleich ist.,
dann lösche Modus "Hole neuen Wert" und verwende diesen Wert
}
Teste alle 100 ms (ála Blink without ..) ob Bit0 sich geändert hat (beim Drehcodierer wechselt ja dieses Bit immer)
Es wechselt wenn Du um 1 oder 3 ecc weiterschaltest, aber nicht wenn Du um 2 weiterschaltest. Ich weiß nicht ob Du das in 100mS schaffst, aber es ist zu bedenken.
Grüße Uwe
combie:
Du hast alle 4 Bit in einem Byte.
Es reicht (nein, es ist ein MUSS) das ganze Byte auf Veränderung zu prüfen.
Kein Bitgefummel nötig....
Aus meiner Wühlkiste, leicht für deine Zwecke angepasst:
const byte maske = 0x0f; // Schalter auf A0 bis A3
const unsigned long bcdInterval = 100; // erst nach X Millisekunden akzeptieren
unsigned long lastBcdHit; // interner Zeit Merker
byte lastBcd = 0; // interner Merker
byte bcd = 0; // hier steckt die erkannte Schalterstellung
void loop()
{
if(checkBcd())
{
// neuer bcd Wert erkannt
// tu was mit bcd
}
}
(*ungetestet*)
Ich glaube das war der Teil den ich noch nicht verstanden habe :-(((
Ich lese doch aus einem analogem Port (wenn auch mit digitalRead()).
Repräsentieren die von dir benannten Bits in PORTC die gleichen Werte wie (zb habs nicht im Kopf)
digitalRead(PortA0) bis digitalRead(PortA3) ?
(Und wenn ja, warum kann ich da denn auch analoge Werte lesen ?)
Mache dich mit dem Prozessor vertraut, dann lernst du auch, was Port C alles kann.
Serenifly hat dir einen Link zum Datenblatt gepostetet
Port C kann als digitaler Eingang und Ausgang fungieren.
Wahlweise mit Pullups
Als analoge Eingänge
Der Reset ist daran angeklemmt
Er kann Interrupts auslösen
I2C Kommunikation.
All dieses ist an den Pins von Port C verewigt.
Wir brauchen hier nur den digitalen Kram.
DigitaRead() und AnalogRead() ist Arduino spezifischer Kram, den wir hier bei deinem Schalter nicht brauchen. Der uns hier nur im Weg steht.
Repräsentieren die von dir benannten Bits in PORTC die gleichen Werte wie (zb habs nicht im Kopf)
digitalRead(PortA0) bis digitalRead(PortA3) ?
combie:
Mache dich mit dem Prozessor vertraut, dann lernst du auch, was Port C alles kann.
Serenifly hat dir einen Link zum Datenblatt gepostetet
DigitaRead() und AnalogRead() ist Arduino spezifischer Kram, den wir hier bei deinem Schalter nicht brauchen. Der uns hier nur im Weg steht.
Ja...
Aber das sagte Serenifly doch auch schon.
Oki, ich sag's mal so, im Moment (oder vielleicht auch nie) will ich mich gar nicht so sehr mit dem Datenblatt beschäftigen,
für mich als Arduino-Neuling ist es erst mal wichtig(er) den Arduino und seine Besonderheiten kennen zu lernen
Ich konstantiere einfach mal, dass dieser "PortC-Hack" für mein kleines "Problem" die einfachste, wenn auch etwas undurchsichtige Methode ist mit wenig Aufwand schnell ans Ergebnis zu kommen
Sagen wir mal so:
ein 8 Bit Microcontroller kann ein Eingangsregister (zB PortC) bestehend aus 8 Bit bzw 8 Eingängen alle auf einmal lesen und weiterverarbeiten (maskieren weil man nur 4 bit braucht und dann vergleichen) Das setzen bzw Löschen von 1 Pin bzw 1Bit im 8 Bit-Register ist eine Arduino-Konfort-Funktion.
Direkte Port-Adressierung wird manchmal wegen der wesentlich höheren Geschwindigkeit gemacht. Aber hier ist der Vorteil dass man mehrere Pins auf einmal auslesen kann!
Mit digitalRead() kannst du immer nur einen Pin auf einmal auslesen. Dann musst du das 4 mal machen und aus den einzelnen Bits wieder ein Byte basteln. Das geht mit bitWrite() auch in vier Zeilen, aber es ist trotzdem elendig umständlich:
Und dann hast du da eben noch das Problem, dass du jeden Pin einzeln entprellten musst! Was ja der eigentliche Kern hier ist.
Allgemein ist der AVR ein 8 Bit Prozessor. Also ist alles in 8 Bit Registern zusammengefasst (manchmal sind zwei von denen auch als 16 Bit ansprechbar). Es sind jeweils bis zu 8 Pins in einem Port zusammengefasst. Diese sind mit Buchstaben A, B, C, etc. bezeichnet. Und die Pins darin wieder über eine Nummer von 0-7. PC2 ist z.B. Pin 2 in Port C. Dann hat jeder Port ein Richtungsregister (DDRn), ein Ausgangsregister (PORTn) und ein Eingangsregister (PINn).
HarryR:
Oki, ich sag's mal so, im Moment (oder vielleicht auch nie) will ich mich gar nicht so sehr mit dem Datenblatt beschäftigen,
....
Ich konstantiere einfach mal, dass dieser "PortC-Hack" für mein kleines "Problem" die einfachste, wenn auch etwas undurchsichtige Methode ist mit wenig Aufwand schnell ans Ergebnis zu kommen
Schade, dass du dich nicht mit den Internas beschäftigen willst....
Das wird dir vermutlich noch häufiger im Weg stehen.
Das ist kein PortC Hack, sondern die natürliche Methode sowas anzugehen.
Und sie ist keinesfalls undurchsichtig, sondern eher offensichtlich.
für mich als Arduino-Neuling ist es erst mal wichtig(er) den Arduino und seine Besonderheiten kennen zu lernen
Dazu gehört auch das Datenblatt des jeweiligen Prozessors.
Mein Tipp: Einmal ausgiebig durchlesen. Die Zeit muss sein.
combie:
Schade, dass du dich nicht mit den Internas beschäftigen willst....
Das wird dir vermutlich noch häufiger im Weg stehen.
Das ist kein PortC Hack, sondern die natürliche Methode sowas anzugehen.
Und sie ist keinesfalls undurchsichtig, sondern eher offensichtlich.
Dazu gehört auch das Datenblatt des jeweiligen Prozessors.
Mein Tipp: Einmal ausgiebig durchlesen. Die Zeit muss sein.
Wir wollen das nicht ausdiskutieren, oder ?
Beispiel: Für jemanden auf "Hello world"-Niveau ist ein Datenblatt noch nicht interessant ...