Запись и чтение данных из модуля RTC EEPROM_Arduino
я взял приведенный ниже код из https://lastminuteengineers.com/ds1307-rtc-arduino-tutorial/. я не понимаю, что делают эти коды. пожалуйста, помогите мне понять.
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Спасибо
@Suman Ponmathan, 👍2
Обсуждение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
- Разница между «time_t» и «DateTime»
- Создание таймера с использованием часов реального времени с указанием времени начала и остановки
- Библиотека времени Arduino и библиотеки RTC
- Ошибка модуля часов реального Времени-DS3231
- DS3231 rtc.begin() всегда возвращает false
- Adafruit RTC begin() не возвращает false
- Как установить управляющий регистр в модуле RTC DS3231 для Arduino UNO R3?
- DS3231 Не совпадает время при выключении Arduino
сколько битов имеет " eeaddress`?, @jsotola