DIP Schalter "negieren"

Hallo,
ich lese 8 DIP Schalter mittels MCP23008 ein. Durch ein Versehen sind die Schalter nun "verkehrt" herum, d.h. oben ist Null (Schalter geschlossen) und unten Eins (offen). Ich könnte den Schalterblock auslöten und umdrehen, aber geht das auch softwaremäßig?
byte readSwitchPort() {
byte val;
Wire.beginTransmission(0x24); // address of input port
Wire.write(0x09);
Wire.endTransmission();
Wire.requestFrom(0x24,1);
while (Wire.available()) {
val = Wire.read();
}
return val;
}

Vielen Dank
Micha

Hallo,

komplettes negieren mit NOT (~) Operator.

vorher:
0b1010'1100
val = ~val;
nachher:
0b01010011

Referenz

Vielen Dank,
manche Dinge sind so einfach.

Es geht auch noch einfacher:

Der MCP23008 hat als Beschreibung: " Polarity Inversion register to configure the polarity of the input port data"
Im IPOL Register (Adresse 01) kannst Du für jeden Eingang definieren ob ein HIGH am Eingang als HIGH (bzw ein LOW als LOW) gesehen wird, oder invertiert wird:

[quote]
© 2007 Microchip Technology Inc. DS21919E-page 11
MCP23008/MCP23S08

1.6.2 INPUT POLARITY (IPOL) REGISTER

The IPOL register allows the user to configure the polarity on the corresponding GPIO port bits. If a bit is set, the corresponding GPIO register bit will reflect the inverted value on the pin.
[/quote] Quelle: https://ww1.microchip.com/downloads/en/DeviceDoc/21919e.pdf

Grüße Uwe

Danke auch, als einfacher würde ich das nicht sehen, aber auch eine gute Möglichkeit.
Gruß Micha

Es hat zumindest den Vorteil, daß Du es einmal (im setup()) einstellst und nicht jeden gelesenen Wert in Software umdrehen musst.
Sind zwar nur ein paar Zyklen, aber Kleinvieh macht auch Mist.

Das wäre für mich kein Grund etwas zu unternehmen. Es ist ja nicht irgendwo festgelegt, das oben ein sein muss

wenn ich es so schreibe, funktioniert es nicht richtig:
/* initialize input port (SWITCHES) */
Wire.beginTransmission(0x24); // address of input port
Wire.write(0x00); // IODIR
Wire.write(0xff); // set as inputs
Wire.write(0x01); // IPOL
Wire.write(0x00);
Wire.endTransmission();

aber üblicherweise macht man es so

Es handelt sich übrigens um einen Nachbau dieses 8080-Simulators:

Meine Version:

Micha

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.