Запись и чтение данных из модуля RTC EEPROM_Arduino

я взял приведенный ниже код из https://lastminuteengineers.com/ds1307-rtc-arduino-tutorial/. я не понимаю, что делают эти коды. пожалуйста, помогите мне понять.

Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB

Спасибо

, 👍2

Обсуждение

сколько битов имеет " eeaddress`?, @jsotola


1 ответ


1

Эти две строки записывают 16-разрядное (2 8-разрядных) значение, которое подписано -32768..32767 или без знака 0..65535.

Примите значение в битах: 10101010 11001100

Положение 1:

Wire.write((int)(eeaddress >> 8)); // MSB

Первое утверждение сдвигает значение на 8 бит (позиций) вправо; это называется MSB (Самый значительный байт, левые 8 бит). Кусочки справа обрезаются / отваливаются. Таким образом

10101010 11001100

станет

00000000 10101010

При приведении к 8-битному значению вы получаете:

10101010

Утверждение 2:

Wire.write((int)(eeaddress & 0xFF)); // LSB

Второй оператор получит LSB (наименее значимый байт). При этом использовался оператор И, то есть бит равен только 1, если оба значения равны 1. 0xFF-это "маска".

Original value: 10101010 11001100
Mask:           00000000 11111111
                ----------------- AND (&, И) оператор
Result:         00000000 11001100

Как вы можете видеть, сохраняются только правильные 8 бит. При приведении этого значения к 8 - битному значению:

11001100
,

Вы также знаете, почему существует int-бросок ("(int)...`)?, @Gerben

@Гербен; на самом деле я бы либо ожидал приведения 8-битного типа (uint8_t или int8_t), поскольку результат всегда равен 8 битам, либо вообще никакого приведения, так как вызывающий, вероятно, ожидает 8-битную переменную. Даже если вызывающий ожидает 16 бит (что было бы излишним), 8-битный аргумент будет автоматически приведен к 16 битам без необходимости приведения в двух строках, приведенных в этом коде., @Michel Keijzers

Спасибо. Похоже, что проводная библиотека будет [возвращать ее (обратно) в uint8_t](https://github.com/arduino/ArduinoCore-avr/blob/master/libraries/Wire/src/Wire.h#L82) в любом случае., @Gerben

@Gerben, верно, поэтому приведение его в вызывающий метод " запись` не требуется., @Michel Keijzers

Спасибо @Michel Кейзерс, @Suman Ponmathan

Если ответ вам помог, выведите его (стрелка рядом с ответом). Если ответ решит вашу проблему, примите ответ (значок рядом с ответом)., @Michel Keijzers