Binär und Hexerdezimal Umrechnung / Übergabe

Hallo zusammen,

ich versuche gerade einen MCP23017 I/O Expander zu verstehen. Das Ansprechen mit dem i2C klappt soweit und auch das händische Ansteuern der Ports ist auch kein Problem.

Nun möchte ich das aber natürlich auch dynamisch machen. Da ich es verstehen möchte, versuche ich die typische Adfrait lib zu umgehen, stosse dabei aber auf ein Problem.

Wenn ich einen bestimmten Port als Output auf High setzen möchte, muss dem Refister 0x12 einen Hexerdezimal oder Binär Wert übergeben Wert übergeben. Leider verstehe ich überhaupt nicht, wie ich so einen Wert übergeben kann.

Klar ist mir, dass ich z.b. Wire.write(B11001100) nutzen kann, aber wie übergebe ich der Zeile diesen Wert? Einen binären String in eine Hex Zahl umzuwandeln, denke ich ist auch nicht wirklich effektiv oder?

Habe im Netz versucht beispeiel zu finden, aber hier sind fast überall nur welche mit der Adfruit lib, die einem die Arbeit abnimmt und die ich eben nicht verstehe.

Sorry für die vermutlich triviale und blöde Frage.

Grüße

Steve

Die Binäre, Dezimale, Oktale und die Hexadezimale Schreibweisen sind nur für Menschen.
Deinen µC interessiert das nicht.

Der arbeitet grundsätzlich binär.

Sorry für die vermutlich triviale und blöde Frage.

Ist sie nicht.

Gerade auch, weil ich dein Problem gar nicht verstehe.

Wire.write(B11001100)
Wire.write(0b11001100)
Wire.write(0xCC)
Wire.write(204)
Wire.write(0314)
Wire.write('Ì') // unter Verwendung des Character set ISO-8859-1

Alles exakt das gleiche.
Der Unterschied liegt ausschließlich im Auge des Betrachters.
Der µC oder auch MCP23017 sieht keinen

Danke für die schnelle Antwort.

Also ist es nur an mir, wie ich das am besten lesen kann. Ok verstehe ich,

Aber wie kann ich sowas übergeben? Als String macht er das nicht?

Was willst du übergeben?

Als String geht übrigens auch....
Macht nur vermutlich nicht das, was du dir wünscht.

Wire.println("Kraut und Rueben.");

Wenn wir Z.b. bei dem MCP bleiben (das gilt ja für alles was mit i2c genutzt wird und nicht eine fertige Lib nutzt).

Ich möchte z.B. Sagen Pin 1,4,7 auf High setzen, also Z.B. B10100010. Dieses folge kann ich generieren, aber wie übergebe ich diese, also in was für einer Variablen muß ich die speicher bzw was muß meine Funktion zurück geben?

Pin 1,4,7

Wire.write((1<<1)|(1<<7)|(1<<4); // korrigiert
Wire.write((1<<1)+(1<<7)+(1<<4); // korrigiert
Wire.write(2|16|128); // korrigiert
Wire.write(2+16+128); // korrigiert
Wire.write(B10010010);
Wire.write(0b10010010);
Wire.write(0x92);
Wire.write(0222);
Wire.write(146);

Alles das gleiche...

Wobei:

1,4,7 auf High setzen, also Z.B. B10100010.
Da passen die beiden Zahlen nicht zusammen.

bzw was muß meine Funktion zurück geben?

Ein byte, oder ein unsigned char, oder uint8_t,
Halt eben das, was write() sich wünscht.
Ist die Zahl zu groß, wird sie abgeschnitten.

Nachtrag:
Ein paar Zeilen waren nicht richtig.
Dieses sind jetzt mit "// korrigiert" gekennzeichnet.

Verstehe ich das richtig, das die ersten beiden Beispielzeichen
Wire.write((1<<1)|1<<7)|(1<<4);
Wire.write((1<<1)+1<<7)+(1<<4);

eine Verschiebeung von 1 an eine Position sind? werden die anderen Stellen dann als 0 vorgegeben oder muss ich die einmal irgendwo festelgen und dann befüllen?

Wenn bei einer 1 noch irgendwelche anderen Stellen eine 1 wären, dann wäre die erste 1 keine 1, sondern irgendetwas anderes.

Beispiel:
0b1001 ist nicht 1

Du schiebst mit 1<<X eine 1 durch ein Feld von Nullen.

Nachtrag:

Tipp:
Verwende das, _BV() Makro, dann musste nicht soviel denken :o :o :o :o

Wire.write ( _BV(1) | _BV(4) | _BV(7) );

Danke Dir, glaube so langsam komme ich dahinter was das bedeutet 8)

combie:

Wire.write(20|16|128);

Wire.write(20+16+128);

Da stimmt was nicht, solltest du oben korrigieren. :wink:

Och nöö...
Ich will nicht!
(warum sollte ich einen Fehler zugeben wollen)

Ich bekomme ja auch keine Antwort auf meine Ansage:

Wobei:

1,4,7 auf High setzen, also Z.B. B10100010.
Da passen die beiden Zahlen nicht zusammen.

Also:
Nöö...
Ich will nicht!

Habs aber dennoch getan.
Ist mir wohl durch die Lappen gerutscht

Shit happens. :wink:

In der schönen Auflistung sollte doch kein Fehler sein.

Hallo zusammen,

Habe ein wenig gebraucht um alle Möglichkeiten auszuprobieren und auch zu verstehen. Aktuell hänge ich an der Zeile

Wire.write(2|16|128);
Wie die Zahlen zustande kommen ist klar aber was hat das mit den |auf sich? Laut der Referenz ist es ein bit weise or?

Grüße
Steve

Korrekt!
Du erstellst für Deine 3 Pins jeweils 3 "Listen" wo die 1., 4., 7. Stelle "angehakt" wurde.
00000001
00001000
01000000

Die setzt Du nun mit | zusammen um einen Wert zu erhalten, in dem alle Zahlen enthalten sind:
01001001

Dein Arduino auf der anderen Seite kann nun prüfen ob dort die 1, 4 oder 7 enthalten ist.

Wobei:

1,4,7 auf High setzen, also Z.B. B10100010.
Da passen die beiden Zahlen nicht zusammen.

Man zählt die Bits von 0 bis 7 und nicht von 1 bis 8.
Grüße Uwe

@TriB

Ah ok, nun geht mir ein Licht auf, An Listen habe ich mal so garnicht gedacht aber super erklärt danke

Du kannst natürlich auch machen

uint8_t wert=128+16+1;
Wire.write(wert);