Я использую расширитель ввода-вывода I2C для чтения до 8 входов.
Расширитель ввода/вывода обеспечивает 8-битный вывод... 1 байт. Поскольку расширитель e/o имеет внутренние подтяжки, все 8 бит равны 1, когда все порты не подключены к GND.
So the output is then 255 ... B11111111
когда все порты подключены к GND.. все 8 бит становятся 0.
So the output then is 0 ... B00000000
Все хорошо, но я хотел бы инвертировать сигналы, когда все порты не подключены к GND, вывод должен быть: 0 ... B00000000.
И когда все порты подключены к GND, на выходе должно быть 255 ... B11111111.
Использование Bitwise NOT на самом деле не то, что я хочу.
с 255 до -1
Это логично, потому что они упомянули об этом на своем сайте:
Код, который у меня есть, действительно не работает...
byte OutputI2C;
byte OutputI2CInvert;
byte InputModbus;
void setup() {
Serial.begin(9600);
}
void loop() {
Wire.requestFrom(B0111000, 1); //connect to i/o expander
OutputI2C = Wire.read(); // Read data
OutputI2CInvert = OutputI2C; // make copie
delay(250);
Serial.print(~OutputI2CInvert); // invert
}
Поэтому я надеюсь, что кто-то знает, как инвертировать байт без отрицательного вывода.





Поскольку ваш тип byte беззнаковый, обычно побитовое не должно работать…
Можете ли вы попытаться привести свой вывод к этому типу перед печатью?
Что-то вроде Serial.print((byte) ~OutputI2CInvert);
Это должно заставить Arduino не рассматривать первый бит как бит знака.
Я думаю, что возвращаемое значение ~byteValue является байтом, но Serial.print интерпретирует свой первый бит как бит знака. Таким образом, значение ~byteValue было правильным, только печать была неправильной.
но если возвращаемое значение ~byteValue является байтом, как Serial.print может знать, что было приведение к байту... он видит только результат этого приведения.
InputModbus = ((byte)~OutputI2C); работает, но InputModbus = (~OutputI2C); тоже работает, может Serial.print что-то делает с байтом!?
@stefandekraker, значит, для Serial.print это не имело никакого значения?
нет, нет разницы... что ж, я рад, что вы все так быстро помогли мне решить следующие проблемы
Спасибо, что все заработало, с небольшой настройкой я загружаю все данные в Modbus.
#include <Mudbus.h>
#include <Wire.h>
#include <Ethernet.h>
#include <SPI.h>
Mudbus Mb;
byte OutputI2C;
byte InputModbus;
void setup() {
Wire.begin(); // start I2C bus
uint8_t mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0x06 }; // set MAC address
Ethernet.begin(mac); // start ethernet connection
}
void loop() {
Wire.requestFrom(B0111000, 1); //connect to i/o expander
OutputI2C = Wire.read(); // Read data
InputModbus = ((byte)~OutputI2C); // invert the data
Mb.Run(); // start modbus connection
Mb.R[0] = InputModbus; // insert inverted data from i/o expander
delay(250); // small delay
}
Я не совсем понимаю, почему это имеет значение. является ли возвращаемое значение ~byteValue не байтом? зачем еще нужен гипс?