Arduino инвертировать байт - PullRequest
0 голосов
/ 03 апреля 2019

Я использую I2C I / O расширитель для чтения до 8 входов.

Расширитель ввода / вывода обеспечивает 8-битный выход .... 1 байт. Поскольку расширитель ввода / вывода имеет внутренние подтягивания, все 8 бит равны 1, когда все порты не подключены к GND.

Таким образом, на выходе получается 255 ... B11111111

когда все порты подключены к GND .. все 8 бит становятся 0.

Таким образом, выходной сигнал равен 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
}

Так что я надеюсь, что кто-то знает, как инвертировать байт без отрицательного вывода.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Спасибо, что все заработало, с небольшим количеством настроек я загружаю все данные в 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 
}
0 голосов
/ 03 апреля 2019

Поскольку ваш тип byte без знака, обычно побитовое не должно работать ... Можете ли вы попытаться преобразовать вывод в этот тип перед печатью?

Что-то вроде Serial.print((byte) ~OutputI2CInvert);

Этодолжен заставить Arduino не рассматривать первый бит как знаковый бит.

...