Hallo zusammen!
Da ich noch Anfänger bin und mir überall den Code für einen
Kodierschalter gesucht habe und den leider nicht fand, habe ich nun
selbst eine Funktion dafür geschrieben.
Damit nicht noch jemand so viel Zeit verliert und es leichter hat solch
einen Schalter in sein Programm einzubinden, möchte ich hier den Code
zur Verfügung stellen.
Ich habe ihn unter Arduino 1.01 getestet und er funktioniert da
einwandfrei.
Viel Erfolg damit!
Mit freundlichem Gruß
Frank Oldenbürger
Puh.
Was soll man damit machen?
Auf der einen Seite hast du nicht geschnallt, dass du die 4 Leitungen
einfach an die Bit-Pins 0 bis 4 eines Port anschliesst und mit einer
einzigen Einleseanweisung die Zahl einlesen kannst. Eventuell mit einem
& Nichtbenutzte Bits wegmaskieren und fertig ist die Sache. Im
einfachsten Fall präsentiert sich das einlesen des SChalters so:
Annahme: Der Schalter ist an die Pins 0 bis 4 vom Port B angeschlossen
Code = ~PINB & 0x0F;
fertig. das wars. Bei anderen Pins muss man eventuell noch ein wenig hin
un dherschieben, alles in allem aber eine einfache Sache (und daher wird
man auch die 4 Pins direkt nebeneinander in der richtigen Reihenfolge an
einem einzigen Port anschliessen)
Jetzt kann es natürlich auch noch sein, dass die 4 Pins an verschiedenen
Ports angeschlossen sind. In dem Fall errechnet sich der Code indem man
ausnutzt, dass die Pins eine Wertigkeit haben. Der Code lautet dann
Code = Bit_0 * 1 + Bit_1 * 2 + Bit_2 * 4 + Bit_3 * 8;
Wie man an die einzelnen Bitwerte (0 oder 1) kommt lass ich offen, das
hängt von den Details des Anschlusses ab. Mit Anwendung der Horner Regel
landet man bei
Code = (((((Bit_3 << 1) + Bit_2) << 1) + Bit_1) << 1) + Bit_0;
Alles in allem bin ich unschlüssig, wie sinnvoll dein Beitrag in der
Codesammlung ist. Auf der einen Seite will ich dir nicht die Freude
rauben, auf der anderen Seite ist dein Code so ziemlich die
umständlichste und ineffizienteste Methode, die es gibt.
Danke für die Kritik!
Hätte gern ne kürzere Lösung gefunden. Und wie gesagt, ich bin Anfänger
und habe auch nichts studiert. Auch die Horner Regel ist mir unbekannt.
Dafür kenne ich eine BesAnLWUKdo.
Aber Spaß beiseite, das ist Arduino und meines (bescheidenen) Wissens
kann man keinen ganzen Port in Arduino ansprechen.
C lerne ich als nächstes.
Außerdem war ich natürlich gespannt, ob jemand da was besseres für
ARDUINO anbieten kann.
Ich jedenfalls hätte mich gefreut, wenn ich das hätte kopieren können.
Weißt du, ich bin jetzt 49 Jahre alt, voll berufstätig,
Alleinerziehender und bin nun seit ungefähr 3 Monaten mit den
Mikrocontrollern dran. Ganz abgesehen von den Wartezeiten auf Material
und Büchern.
Seit heute läuft mein Projekt und da lese ich einen DHT11 aus, lese
besagten Codeschalter aus und steuere dort verschiedene Ausgänge.
Für das was ich da bauen will, habe ich mir noch ne ganze Menge anderes
Wissen aneignen müssen und das auch in dieser Zeit (immer dann, wenn ich
auf Teile wartete).
Dafür habe ich mir hier so manche Nacht um die Ohren gehauen.
Sicher ist das für einige hier, und das meine ich ohne jede Ironie und
mit vollem Respekt vor deren Intelligenz und Können, Kinderkram, aber
ich bin auf das was ich bis jetzt geleistet habe recht stolz.
Es war keinerlei Klugscheißerei dabei, auch wollte ich nicht zeigen was
ich für ein toller Kerl bin. Ich wollte lediglich Anfängern wie mir, mit
ebenso bescheidener Intelligenz wie ich sie habe, die Möglichkeit geben
sich hier etwas Arbeit zu sparen.
Hab mir gerade mal die Horner Regel angeschaut, das ist wohl eher was
für meinen Sohn. Der hat eine außerordentlich hohe Begabung für
Mathematik.
Ich muss mir so was anders herleiten.
Gut, dass ich so doof bin. Hätte ich vorher gewusst, dass ich so was
lernen soll, dann hätte ich das sicher ganz gelassen. grins
Frank O. schrieb:> Hab mir gerade mal die Horner Regel angeschaut, das ist wohl eher was> für meinen Sohn. Der hat eine außerordentlich hohe Begabung für> Mathematik.
Da brauchst du keine besondere Begabung
i = x * 100 + y * 10
kann man auch so rechnen
i = ((x) * 10 + y ) * 10
also im Grunde einfach nur gemeinsame Faktoren geeignet herausheben.
Anstelle von
Bit_3 << 3 + Bit_2 << 2 + Bit_1 << 1 + Bit_0
wobei das Schieben um 3 Stellen aufwändig ist, hebt man einmal Schieben
heraus
( Bit_3 << 2 + Bit_2 << 1 + Bit_1 ) << 1 + Bit_0
kommt aufs gleiche raus.
Ob man die Ausgangsprodukte um die entsprechende Anzahl Stellen schiebt,
oder das Endergebnis kommt aufs gleiche raus.
Und innerhalb der Klammer kann man jetzt dasselbe nochmal machen
( Bit_3 << 1 + Bit_2 ) << 1 + Bit_1 ) << 1 + Bit_0
und voila. Anstelle von einmal um 3 Bits schieben und einemal um 2 Bits
etc. hat man jetzt immer nur die Operation: schiebe um 1 Bit.
genauso, wie man anstelle von
y = x1 * 1000 + x2 * 100 + x3 * 10 + x4
mit jeweils unterschiedlichen Multiplikationen, durch Herausheben
y = ((x1 * 10 + x2) * 10 + x3) * 10 + x4
schreiben kann und das gleiche Ergebnis bekommt.
Das Schiebennwird sicher beim Ansteuern von 7 Segmentanzeigen nötig?
Hab da schon so was gelesen. Die brauchte ich noch nicht, kommen aber
noch.
Jetzt hab ich mein Programm soweit, dass es funktioniert. Noch einige
Berechnungen für die Werte, die ich im Programm brauche und dann kann
ich mit den Platinen anfangen; genauer gesagt, der Platine.
Das Design des Gehäuses, den das ist der eigentliche Trick bei dem
Ganzen und wenn es dann läuft, ich es verkauft habe, dann werde ich mich
Assembler nähern (damit ich die µC besser verstehe) und dann werde ich
C++ lernen. Aber in der Zwischenzeit lerne ich erst dieses Arduino
weiter. Das wird sicher auch etwas zum Verständnis der Dinge bei tragen.
Viele Männer in meinem Alter ziehen sich Fußball und Bier in den Kopf,
ich lerne da lieber noch nützliche Sachen.
Danke für die tollen Ausführungen. Werde mir das sicher noch öfter
anschauen.
Gruß
Fank