На просторах интернета не так много рабочего кода для связки DS3231 и Codevision AVR, хочу показать свой рабочий вариант.
Подключаются эти часы точно так жк как и DS1307, V+ 5в, GND, SDA, SCL.
А вот распределение памяти по ячейкам у них немного другое.
Соответственно ячейка 0х00 это секунды, 0х01 минуты, 0х03 часы и т.д.
Ну а теперь рабочий код
//**блок который нужно добавить в переменные**// // дефайны адресов микросхемы #define RTC_adr_write 0b11010000 #define RTC_adr_read 0b11010001 // переменные времени unsigned char hour23; unsigned char minute23; unsigned char sec23; // переменные даты unsigned char day; unsigned char wday; unsigned char month; unsigned char year; // переменные температуры unsigned int temp; unsigned char t1; unsigned char t2; //**блок который нужно добавить в переменные**// /** необходимые библиотеки**/ #include "bcd.h" //библиотека работы с BCD #include <i2c.h> //библиотека i2c //** необходимые библиотеки**// //** функции преобразования чисел (для корректного отображения значений)**/ unsigned char bcd (unsigned char data) { unsigned char bc; bc=((((data&(1<<6))|(data&(1<<5))|(data&(1<<4)))*0x0A)>>4)+((data&(1<<3))|(data&(1<<2))|(data&(1<<1))|(data&0x01)); return bc; } unsigned char bin(unsigned char dec){ char bcd; char n, dig, num, count; num = dec; count = 0; bcd = 0; for (n=0; n<4; n++) { dig = num%10; num = num/10; bcd = (dig<<count)|bcd; count += 4; } return bcd; } //** функции преобразования чисел (для корректного отображения значений)**// //**функции с часами**// // инициализация начальных установок void RTC_init(void){ i2c_start(); // запуск i2c i2c_write(RTC_adr_write); // передача адреса устройства, режим записи i2c_write(0x0E); // передача адреса памяти i2c_write(0b00100000); // запустить преобразование температуры и выход на 1 Гц i2c_write(0b00001000); // разрешить выход 32 кГц i2c_stop(); // остановка i2c } // получение времени и даты void RTC_read_time(void){ i2c_start(); // запуск i2c i2c_write(RTC_adr_write); // передача адреса устройства, режим записи i2c_write(0x00); // передача адреса памяти i2c_stop(); // остановка i2c i2c_start(); // запуск i2c i2c_write(RTC_adr_read); // передача адреса устройства, режим чтения sec23 = bcd(i2c_read(0)); // чтение секунд, ACK i2c_stop(); // остановка i2c i2c_start(); // запуск i2c i2c_write(RTC_adr_write); // передача адреса устройства, режим записи i2c_write(0x01); // передача адреса памяти i2c_stop(); // остановка i2c i2c_start(); // запуск i2c i2c_write(RTC_adr_read); // передача адреса устройства, режим чтения minute23 = bcd(i2c_read(0)); // чтение минут, ACK i2c_stop(); // остановка i2c i2c_start(); // запуск i2c i2c_write(RTC_adr_write); // передача адреса устройства, режим записи i2c_write(0x02); // передача адреса памяти i2c_stop(); // остановка i2c i2c_start(); // запуск i2c i2c_write(RTC_adr_read); // передача адреса устройства, режим чтения hour23 = bcd(i2c_read(0)); // чтение часов, ACK i2c_stop(); i2c_start(); // запуск i2c i2c_write(RTC_adr_write); // передача адреса устройства, режим записи i2c_write(0x03); // передача адреса памяти i2c_stop(); // остановка i2c i2c_start(); // запуск i2c i2c_write(RTC_adr_read); // передача адреса устройства, режим чтения wday = bcd(i2c_read(0)); // чтение день недели, ACK i2c_stop(); i2c_start(); // запуск i2c i2c_write(RTC_adr_write); // передача адреса устройства, режим записи i2c_write(0x04); // передача адреса памяти i2c_stop(); // остановка i2c i2c_start(); // запуск i2c i2c_write(RTC_adr_read); // передача адреса устройства, режим чтения day = bcd(i2c_read(0)); // чтение число, ACK i2c_stop(); i2c_start(); // запуск i2c i2c_write(RTC_adr_write); // передача адреса устройства, режим записи i2c_write(0x05); // передача адреса памяти i2c_stop(); // остановка i2c i2c_start(); // запуск i2c i2c_write(RTC_adr_read); // передача адреса устройства, режим чтения month = bcd(i2c_read(0)); // чтение месяц, ACK i2c_stop(); i2c_start(); // запуск i2c i2c_write(RTC_adr_write); // передача адреса устройства, режим записи i2c_write(0x06); // передача адреса памяти i2c_stop(); // остановка i2c i2c_start(); // запуск i2c i2c_write(RTC_adr_read); // передача адреса устройства, режим чтения year = bcd(i2c_read(1)); // чтение год, NACK i2c_stop(); } //**установка времени**// void RTC_write_minute23(unsigned char min1){ i2c_start(); // запуск i2c i2c_write(RTC_adr_write); // передача адреса устройства, режим записи i2c_write(0x01); // 0x01 минуты i2c_write(bin(min1)); i2c_stop(); // остановка i2c } void RTC_write_hour23(unsigned char hour1){ i2c_start(); // запуск i2c i2c_write(RTC_adr_write); // передача адреса устройства, режим записи i2c_write(0x02); // 0x02 часы i2c_write(bin(hour1)); i2c_stop(); // остановка i2c } void RTC_write_sec23(unsigned char sec1){ i2c_start(); // запуск i2c i2c_write(RTC_adr_write); // передача адреса устройства, режим записи i2c_write(0x00); // 0x00 секунды i2c_write(bin(sec1)); i2c_stop(); // остановка i2c } //**установка времени**// //** установка даты**// void RTC_write_wday23(unsigned char wday1){ i2c_start(); // запуск i2c i2c_write(RTC_adr_write); // передача адреса устройства, режим записи i2c_write(0x03); // 0x01 минуты i2c_write(bin(wday1)); i2c_stop(); // остановка i2c } void RTC_write_day23(unsigned char day1){ i2c_start(); // запуск i2c i2c_write(RTC_adr_write); // передача адреса устройства, режим записи i2c_write(0x04); // 0x01 минуты i2c_write(bin(day1)); i2c_stop(); // остановка i2c } void RTC_write_month23(unsigned char month1){ i2c_start(); // запуск i2c i2c_write(RTC_adr_write); // передача адреса устройства, режим записи i2c_write(0x05); // 0x01 минуты i2c_write(bin(month1)); i2c_stop(); // остановка i2c } void RTC_write_year23(unsigned char year1){ i2c_start(); // запуск i2c i2c_write(RTC_adr_write); // передача адреса устройства, режим записи i2c_write(0x06); // 0x01 минуты i2c_write(bin(year1)); i2c_stop(); // остановка i2c } //** установка даты**// //**чтение температуры**// void RTC_read_temper(void){ i2c_start(); // запуск i2c i2c_write(RTC_adr_write); // передача адреса устройства, режим записи i2c_write(0x11); // передача адреса памяти i2c_stop(); // остановка i2c i2c_start(); // запуск i2c i2c_write(RTC_adr_read); // передача адреса устройства, режим чтения t1 = i2c_read(0); // чтение MSB температуры t2 = i2c_read(1); // чтение LSB температуры i2c_stop(); // остановка i2c t2=(t2>>7); // сдвигаем на 6 - точность 0,25 (2 бита) // сдвигаем на 7 - точность 0,5 (1 бит) t2=t2*5; } //**чтение температуры**// //**функции с часами**// //** в void main добавим инициализацию **// RTC_init(); //** в void main добавим инициализацию **//
А тут рассмотрим примеры вызова:
RTC_read_time (); // считаем время и дату
RTC_write_hour23(X); // запишем новое значение в часы
RTC_write_minute23(X); // запишем новое значение в минуты
Добрый день сделал для визарта но не работает
Записываю значения вот так
RTC_write_hour23(0); // запись часов
RTC_write_minute23(0); // запись минут
RTC_write_sec23(0);//запись секунд
RTC_write_wday23(0); //запись дней недели
RTC_write_day23(0); //запись числа
RTC_write_month23(0); //запись месяца
RTC_write_year23(0); // запись года
while (1)
{
RTC_read_time (); // выводим время и дату
Добрый день сделал для визарта но не правильно показания и почему секунды не идут?
Записываю значения вот так
RTC_write_hour23(13); // запись часов
RTC_write_minute23(55); // запись минут
RTC_write_sec23(33);//запись секунд
RTC_write_wday23(2); //запись дней недели
RTC_write_day23(23); //запись числа
RTC_write_month23(4); //запись месяца
RTC_write_year23(19); // запись года
while (1)
{
RTC_read_time (); // выводим время и дату
}
и зачем нужна функция
//** функции преобразования чисел (для корректного отображения значений)**/
unsigned char bcd (unsigned char data)
{
unsigned char bc;
bc=((((data&(1<<6))|(data&(1<<5))|(data&(1<>4)+((data&(1<<3))|(data&(1<<2))|(data&(1<<1))|(data&0x01));
return bc;
}
unsigned char bin(unsigned char dec){
char bcd;
char n, dig, num, count;
num = dec;
count = 0;
bcd = 0;
for (n=0; n<4; n++) {
dig = num%10;
num = num/10;
bcd = (dig<<count)|bcd;
count += 4;
}
return bcd;
}
Секунды не тикают время вроде идёт но не точно а секунды в 00
дошло как сделать секунды
надо RTC_read_time (); // выводим время и дату опрашивать в бесконечном цикле но ПОЧЕМУ СЕКУНДЫ СЧИТАЮТ ДО 90 А ПОТОМ СБРАСЫВАЮТСЯ????????????????????????????????
И секунды перескакивают с 9 на 16 и тд.
Проблема с выводом
//** функции преобразования чисел (для корректного отображения значений)**/
unsigned char bcd (unsigned char data)
unsigned char year;
Год в unsigned char не влезет. Надо как минимум int