Приблема при работе с RTC3231

Здесь все вопросы по языку программирования С
Ответить
Lexx!
Сообщения: 1
Зарегистрирован: 25 ноя 2018, 07:27

Приблема при работе с RTC3231

Сообщение Lexx! » 26 ноя 2018, 13:16

Пользуюсь библиотекой axlib. Возник вопрос, который поставил меня в тупик

Вот кусок кода

Код: Выделить всё

BYTE rtc_time[2], rtc_date[3];
 
void send_UART(BYTE value) {
       while(!( UCSRA & (1 << UDRE)));   // Ожидаем когда очистится буфер передачи
       UDR = value; // Помещаем данные в буфер, начинаем передачу
}

 

while(1)
       {
       ds3231_read_time(&rtc_time[0]);
       ds3231_read_data(&rtc_date[0]);
       send_UART(rtc_time[0]); //часы
       send_UART(rtc_time[1]); //минуты
       send_UART(rtc_time[2]); //секунды
       send_UART(rtc_date[0]); //день недели   
       send_UART(rtc_date[1]); //число
       send_UART(rtc_date[2]); //месяц
       send_UART(rtc_date[3]); //год
       _delay_ms(1000);
       }
То в порт вместо секунд выводится день недели, получается например 12 45 3 3 25 11 18
Но если переделать так:

Код: Выделить всё

while(1)
       {
       ds3231_read_time(&rtc_time[0]);
       send_UART(rtc_time[0]); //часы
       send_UART(rtc_time[1]); //минуты
       send_UART(rtc_time[2]); //секунды

       ds3231_read_data(&rtc_date[0]);
       send_UART(rtc_date[0]); //день недели   
       send_UART(rtc_date[1]); //число
       send_UART(rtc_date[2]); //месяц
       send_UART(rtc_date[3]); //год
       _delay_ms(1000);
       }
То получается нормально. Например 12 45 32 3 25 11 18

Следующий опыт

Код: Выделить всё

while(1)
       {
       ds3231_read_time(&rtc_time[0]);

       send_UART(rtc_time[0]); //часы
       send_UART(rtc_time[1]); //минуты
       send_UART(rtc_time[2]); //секунды

       ds3231_read_data(&rtc_date[0]);
       send_UART(rtc_time[0]); //часы
       send_UART(rtc_time[1]); //минуты
       send_UART(rtc_time[2]); //секунды
       send_UART(rtc_date[0]); //день недели   
       send_UART(rtc_date[1]); //число
       send_UART(rtc_date[2]); //месяц
       send_UART(rtc_date[3]); //год
       
       _delay_ms(1000);
       }

Результат 12 45 32 12 45 3 3 25 11 18

Я подумал, что это из за задержки может быть, сделал так:

Код: Выделить всё

while(1)
       {
       ds3231_read_time(&rtc_time[0]);
       _delay_ms(1000);
       ds3231_read_data(&rtc_date[0]);
       
       send_UART(rtc_time[0]); //часы
       send_UART(rtc_time[1]); //минуты
       send_UART(rtc_time[2]); //секунды
       send_UART(rtc_date[0]); //день недели   
       send_UART(rtc_date[1]); //число
       send_UART(rtc_date[2]); //месяц
       send_UART(rtc_date[3]); //год
       }
Результат 12 45 3 3 25 11 18


Поменял местами чтение даты и времени.
Теперь вместо дня недели секунды

12 45 32 32 25 11 18


Как так, из за чего такой глюк?

Надеюсь на вашу помощь

Ответить