Go Down

Topic: Binär und Hexerdezimal Umrechnung / Übergabe (Read 212 times) previous topic - next topic

Chaos_Lord

Aug 23, 2019, 12:46 am Last Edit: Aug 23, 2019, 12:46 am by Chaos_Lord
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

combie

#1
Aug 23, 2019, 01:20 am Last Edit: Aug 23, 2019, 01:42 am by combie
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.

Quote
Sorry für die vermutlich triviale und blöde Frage.
Ist sie nicht.

Gerade auch, weil ich dein Problem gar nicht verstehe.

Code: [Select]

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

Nobody is perfect!
(und selbst der nicht zu 100%)

Chaos_Lord

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?

combie

#3
Aug 23, 2019, 01:42 am Last Edit: Aug 23, 2019, 01:51 am by combie
Was willst du übergeben?


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


Code: [Select]
Wire.println("Kraut und Rueben.");
Nobody is perfect!
(und selbst der nicht zu 100%)

Chaos_Lord

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?

combie

#5
Aug 23, 2019, 01:59 am Last Edit: Aug 27, 2019, 10:23 am by combie
Quote
Pin 1,4,7
Code: [Select]

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.


Quote
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.
Nobody is perfect!
(und selbst der nicht zu 100%)

Chaos_Lord

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?

combie

#7
Aug 23, 2019, 02:18 am Last Edit: Aug 23, 2019, 02:29 am by combie
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
Code: [Select]

Wire.write ( _BV(1) | _BV(4) | _BV(7) );
Nobody is perfect!
(und selbst der nicht zu 100%)

Chaos_Lord

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

Whandall

Code: [Select]
Wire.write(20|16|128);
Wire.write(20+16+128);

Da stimmt was nicht, solltest du oben korrigieren.  ;)
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

combie

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

Ich bekomme ja auch keine Antwort auf meine Ansage:
Quote
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

Nobody is perfect!
(und selbst der nicht zu 100%)

Whandall

Shit happens.  ;)

In der schönen Auflistung sollte doch kein Fehler sein.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Chaos_Lord

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

TriB

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.

uwefed

Quote
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

Go Up