Интерфейс Ардуино PC8563
Я пытаюсь подключить pc8563 к Arduino Uno. У меня есть небольшое сомнение, связанное с чтением адреса подчиненного устройства RTC
В техническом описании RTC указана страница № 14. где адрес ведомого устройства — A2 для записи и чтения A3 я хотел бы знать, как A2 /A3
Пример кода из идентификатора устройства веб-сайта, упомянутого как 0X51
Мой вопрос, как настроить точный адрес подчиненного устройства??
#include "Wire.h"
#define PCF8563address 0x51
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
String days[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
byte bcdToDec(byte value)
{
return ((value / 16) * 10 + value % 16);
}
byte decToBcd(byte value){
return (value / 10 * 16 + value % 10);
}
void setPCF8563()
// это устанавливает время и дату на PCF8563
{
Wire.beginTransmission(PCF8563address);
Wire.write(0x02);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}
void readPCF8563()
// это получает время и дату от PCF8563
{
Wire.beginTransmission(PCF8563address);
Wire.write(0x02);
Wire.endTransmission();
Wire.requestFrom(PCF8563address, 7);
second = bcdToDec(Wire.read() & B01111111); // удалить бит ошибки VL
minute = bcdToDec(Wire.read() & B01111111); // удаляем ненужные биты из MSB
hour = bcdToDec(Wire.read() & B00111111);
dayOfMonth = bcdToDec(Wire.read() & B00111111);
dayOfWeek = bcdToDec(Wire.read() & B00000111);
month = bcdToDec(Wire.read() & B00011111); // удалить бит века, 1999 закончился
year = bcdToDec(Wire.read());
}
void setup()
{
Wire.begin();
Serial.begin(9600);
// измените следующее, чтобы установить начальное время
second = 0;
minute = 28;
hour = 9;
dayOfWeek = 2;
dayOfMonth = 13;
month = 8;
year = 13;
// закомментируйте следующую строку и загрузите снова, чтобы установить и предотвратить сброс времени при каждом сбросе
setPCF8563();
}
void loop()
{
readPCF8563();
Serial.print(days[dayOfWeek]);
Serial.print(" ");
Serial.print(dayOfMonth, DEC);
Serial.print("/");
Serial.print(month, DEC);
Serial.print("/20");
Serial.print(year, DEC);
Serial.print(" - ");
Serial.print(hour, DEC);
Serial.print(":");
if (minute < 10)
{
Serial.print("0");
}
Serial.print(minute, DEC);
Serial.print(":");
if (second < 10)
{
Serial.print("0");
}
Serial.println(second, DEC);
delay(1000);
}
Технические данные RTC
@user50949, 👍1
Обсуждение1 ответ
Обычные адреса I2C имеют длину 7 бит. На первом кадре I2C транзакции мастер отправляет 8-битный байт, содержащий адрес ведомое устройство, за которым следует бит, указывающий, является ли это чтением или записью операция. Некоторые люди склонны называть «адресом» весь 8-битный кадр, что вызывает путаницу. Из-за этого у нас получается три вкуса. адресов I2C:
- 7-битный адрес, который является реальным адресом устройства
- 8-битный «адрес записи», то есть адрес, за которым следует 0 что означает «операция записи».
- 8-битный «адрес чтения», который представляет собой адрес, за которым следует 1 что означает «операция чтения».
Для вашего RTC 3 адреса в шестнадцатеричном и двоичном формате следующие:
7-bit = 0x51 = 0b1010001
write = 0xA2 = 0b10100010
read = 0xA3 = 0b10100011
Библиотека Arduino Wire ожидает 7-битный адрес.
- PCF8583 с задержкой Arduino в одну секунду?
- Не удается обновить время в RTC через I2c
- Нужно сделать кнопку, чтобы выключить будильник на часах
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Разница между «time_t» и «DateTime»
- Создание таймера с использованием часов реального времени с указанием времени начала и остановки
так какой из них работает? А2 или 51?, @jsotola
на самом деле это один и тот же адрес .... A2 - 8-битное число .... 51 - 7-битное число ... бит 0 используется для указания чтения или записи .... запишите A2 как двоичное число ... вы увидите, что 51 - это верхние 7 бит, @jsotola