Arduino integer mit binärem Wert in decimal umwandeln?
// Probleme wurden gelöst. Teil des Problems war dass ich den Chip außversehen nach dem umprogrammieren eine Reihe zu weit nach Oben gemacht habe... Leichtsinnsfehler... :)
Hallo. Bin gerade an einem Projekt bei dem ich LED's mit einem 8Bit shift register zum leuchten bringen will.
1 bedeutet leuchten und 0 bedeutet aus.
Jetzt will ich einen Wert wie "10000001" angeben können und die LED's werden direkt so eingeschalten wie es im int aussieht.
Gerade im Moment probiere ich es so zu lösen dass ich der ShiftOut Funktion den decimalen Wert gebe welche diese dann wieder in decimal umwandelt und raus schiebt:
int bits = 10000001;
digitalWrite(latchPin, LOW);
//Binary to decimal Versuch
int decimal =
(((bits / 10000000U) % 10) * 128)
+ (((bits / 1000000U) % 10) * 64)
+ (((bits / 100000U) % 10) * 32)
+ (((bits / 10000U) % 10) * 16)
+ (((bits / 1000U) % 10) * 8)
+ (((bits / 100U) % 10) *4)
+ (((bits / 10U) % 10) *2)
+ ((bits / 1U) % 10);
shiftOut(dataPin, clockPin, MSBFIRST, decimal);
digitalWrite(latchPin, HIGH);
Ich bin mir sicher dass man das wesentlich effizienter und schlauer lösen kann. Unter anderem funktioniert mein Code nicht mal... wenn ich ihn laufen lasse sind die LED's volgendermaßen angeschaltet: "00010000"...
Würde mich über Hilfe freuen und danke schon mal im Vorraus.
Liebe Grüße, Leo
2 Antworten
Wenn du die Zahl direkt im Binärformat (B) angibst, sparst du dir sämtliche Umwandlungen:
byte bits = B10000001;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, bits);
digitalWrite(latchPin, HIGH);
In welchem Zahlensystem du die Zahlen angibst, ist egal. Wenn du das Programm kompilierst, wird sowieso alles in Binärzahlen umgewandelt, da der Mikrocontroller nichts anderes versteht. Ob du nun also B10000001 (binär) oder 129 (dezimal) oder 0x81 (hexadezimal) schreibst ... es ist die selbe Zahl.
Ok. Aus irgend einem Grund funktioniert es trotzdem nicht. Jedes mal wenn ich strom anstecke bekomm ich einen selben Output
Da würde ich jetzt als erstes vermuten, dass die Verkabelung nicht korrekt ist.
Die Verkabelung stimmt. Ich kann dir mal kurz den ganzen Code schicken.
//Pin connected to ST_CP of 74HC595
int latchPin = 10;
//Pin connected to SH_CP of 74HC595
int clockPin = 9;
////Pin connected to DS of 74HC595
int dataPin = 11;
int buttonPin = 0;
byte bits = B11111111;
int buttonState = 0;
void setup() {
//set pins to output so you can control the shift register
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void pushValues() {
// take the latchPin low so
// the LEDs don't change while you're sending in bits:
digitalWrite(latchPin, LOW);
//Binary to decimal
//Shift out Bits from decimal value
shiftOut(dataPin, clockPin, MSBFIRST, bits);
//take the latch pin high so the LEDs will light up:
digitalWrite(latchPin, HIGH);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
// turn LED on:
bits = B10000001;
pushValues();
} else {
// turn LED off:
bits = B01000010;
pushValues();
}
}
Ich kann in dem Programm keine Unstimmigkeiten entdecken. Sieht alles einwandfrei aus. Was ist denn das genaue Ergebnis, wenn du das Programm laufen lässt?
Es sind immer zufällige LED's die angehen. Also immer andere die dann auch egal wie ich den Knopf drücke an bleiben
Also wenn nicht zufällig das Shift-Register defekt ist, kann ich mich nur wiederholen: da muss irgendwas mit der Verkabelung falsch sein. Wenn du magst, kannst du gerne ein Foto hier einstellen, sodass man das nochmal gegenprüfen kann.
Hab ein Bild in die ursprüngliche Frage gestellt
Also so dürfte da gerade eigentlich gar nichts funktionieren. Der Mikrocontroller sitzt eine Reihe zu hoch. Wenn du ihn eine Reihe runtersetzt, dann sollten fast alle Anschlüsse stimmen. Nur der Pullup-Widerstand vom Taster muss noch in die richtige Reihe gesetzt werden.
Oh shit ich bin so dumm. Das habe ich jetzt übersehen... Habe mich schon gewunert warum es davor geklappt hat. Vielen Dank, die Probleme sind jetzt alle gelöst :)
Mach es doch einfach mit einem String oder einem Array. Das macht das Problem viel einfacher als ein Integer.
Aber die Shift Out funktion nimmt ja bei 8Bit zahlen von 0-255 und shiftet sie in Bits raus oder? Also muss man ihr eine Decimalzahl geben?