четверг, 14 марта 2013 г.

Библиотека для PCF8563

Продолжаю микроконтроллерную тему. С целью поиграться с I2C были прикуплены микросхемы RTC DS1307 и PCF8563. Если с DS1307 не ковырялся только ленивый и информации и библиотек для нее полно, то с PCF8563 ситуация другая, ничего внятного кроме даташита найти не удалось. Вот и задачка, пишем свою библиотеку.

Итак, пишем на C для AVR GCC в AtmelStudio 6.
Для начала о самих часах:
PCF8563 это часы реального времени/календарь оптимизированные для устройств с низким энергопотреблением, на борту есть детектор низкого напряжения(весьма полезно в устройствах с автономным питанием), таймер, будильник. Напряжение питания от 1 до 5,5В, I2C работает в диапазоне напряжений питания от 1,8 до 5,5В. В общем мне эта штука приглянулась, собрал простейшую макетку и в горы.


Теперь про саму библиотеку, для общения по I2C взял программную реализацию от Avinash, функции работы частично подсмотрены в библиотеке для CodeVision AVR, частично тут (тут же и про I2C кратенько почитать можно). Хорошо расписана I2C у DI HALT'а как вообще, так и в приложении в AVR, рекомендую ознакомиться.
То что наваял я, можно взять тут, в архиве сама библиотека, необходимая для работы с ней i2csoft и даташит на PCF8563. Расписывать особо нечего, функции описаны в коде, просто накидаю пример применения , для ясности. В примере используется библиотека для LCD от Nokia 3310, брать тут.

#define F_CPU 8000000UL

#include <avr/io.h>
#include <util/delay.h>

#include "n3310.h"
#include "PCF8563.h"

const char  WeekDayNames[][3] = {"Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"};

int main(void)
{
unsigned char time[SHORT_T]="     ", date[FULL_D] = "          ", datetime[7] = {};
LcdInit();
LcdClear();

LcdUpdate();
ClockInit(RTC_AIE_ON|RTC_TIE_ON|RTC_TP_ON,RTC_CLKOUT_1,RTC_TIMER_OFF);

    while(1)
    {

   if (GetDateTime(&datetime))
{
    LcdGotoXYFont(2,1);
if (TimeStr(&datetime,&time,sizeof(time))) LcdStr(FONT_2X,(unsigned char*)time);
LcdGotoXYFont(0,3);
LcdStr(FONT_1X,(unsigned char*)WeekDayNames[datetime[4]&0b00000111]);
LcdGotoXYFont(3,3);
if (DateStr(&datetime,&date,sizeof(date),'.')) LcdStr(FONT_1X,(unsigned char*)date);
LcdUpdate();
                }
      }
}
Должно выйти как то так:

Пины, к которым подключается PCF8563, прописываются в i2csoft.h, для LCD в n3310.h
Код должен работать на контроллерах ATMega, тинькам тупо не хватит памяти, из за библиотеки для LCD.
Ну, вроде бы все. Будут вопросы постараюсь ответить.

2 комментария:

  1. Класная статья! У меня всё заработало.. Но не понимаю как записать время верно, его нужно как-то подготовить ... в BCD формат перевести?

    ОтветитьУдалить
  2. Да, необходимо перевести в BCD.

    ОтветитьУдалить