Поиск по этому блогу

четверг, 20 декабря 2012 г.

Arduino howto use RTC NXP PCF2129AT

Многие получили халяву от NXP. Теперь будем пользовать :)
Чип RTC (часы реального времени) PCF2129AT   мне понравился -

  1. встроенный кварц - это раз;
  2. из обвязки - только батарея и подтягивающие резисторы(!);
  3. обещано так же коррекция точности при нагреве чипа;
  4. встроенный будильник;
  5. встроенная возможность вручную программным способом корректировать ход;
  6. интерфейсы - SPI или I2C на выбор;
  7. вроде как есть таймер - но мне пока не нужен - не вникал ;
Не понравилось - питание строго 3,3 вольта :(
Хотя если подключать именно к ардуине - это не проблема. B главное - три штуки забесплатно :))
В общем я далеко не спец - но подключить к ардуине было нужно - и вроде получилось. Сам процесс очень похож на подключение DS1307 - у них даже адреса I2C одинаковые - и это сильно облегчило процесс.
 ну да - ужаснонах :) Прифигачен сверху регулятор на 3,3 вольта и два кондёра на 0,1 мкф, что бы  запитаться от общих  5 вольт.
А это термометр с шиной I2c LM75B
из того же халявного набора - о нём расскажу потом, если не будет лень :)
Из различий - в чипе от NXP целых 3 первых регистра управляют процессами, в отличии от Ds1307 и самих регистров побольше - если мы хотим использовать возможности будильника. В общем код получился такой :

Подробнее :
#include 

#define ADDRESS B1010001
byte zero = 0x00;
byte tre = 0x03;

int second;
int minute;
int hour;  
int dayOfWeek;
int dayOfMonth;
int month;
int year;
int alsec;
int almin;
int alhour;

byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}


void setDate()  
{
 Wire.beginTransmission(ADDRESS);
  Wire.write(tre); // сдвинули регистр (пропустили первые три ячейки), что бы чтение началось с 4 по-порядку, где собственно и лежат значения часов
  Wire.endTransmission();
  Wire.requestFrom(ADDRESS, 7); // Считываем значения времени - первые 7 ячеек 
  int second     = bcdToDec(Wire.read()); 
  int minute     = bcdToDec(Wire.read()); 
  int hour       = bcdToDec(Wire.read());  // 24 hour  
  int dayOfWeek  = bcdToDec(Wire.read()); 
  int dayOfMonth = bcdToDec(Wire.read()); 
  int month      = bcdToDec(Wire.read()); 
  int year       = bcdToDec(Wire.read()); 
  Wire.beginTransmission(ADDRESS); 
 Wire.write(zero);  
 Wire.write(zero);  
 Wire.write(zero);  
  Wire.write(zero); 
  Wire.write(zero);   //sec обнуляем секунды - если надо, можем записать произвольное число от 0 до 59 таким, же образом, что и минуты, часы, etc 
  Wire.write(decToBcd(minute));  //min 
  Wire.write(decToBcd(hour));  //hour    
  Wire.write(decToBcd(dayOfWeek));  //day 
  Wire.write(decToBcd(dayOfMonth));   //week 
  Wire.write(decToBcd(month));  //months 
  Wire.write(decToBcd(year));  //year 
   
// установка будильника 
  Wire.write(zero);// секунды выставляем в ноль 
  Wire.write(zero); // минуты выставляем в ноль 
  Wire.write(decToBcd(7)); // часы выставляем в 7 утра 
   
  Wire.endTransmission(); 
  Serial.println("Done set!"); 
   

void getDate() 
{
  Wire.beginTransmission(ADDRESS);   
  Wire.write(tre); 
  Wire.endTransmission(); 
  Wire.requestFrom(ADDRESS, 10); // Здесь мы получаем значения уже из 10 регистров - время + будильник 
   
  int second =(bcdToDec(Wire.read())); 
  int minute =(bcdToDec(Wire.read())); 
  int hour =(bcdToDec(Wire.read()));   
  int dayOfMonth  =(bcdToDec(Wire.read())); 
  int dayOfWeek =(bcdToDec(Wire.read())); 
  int month= (bcdToDec(Wire.read())); 
  int year =(bcdToDec(Wire.read()));   
  int alsec=(bcdToDec(Wire.read())); 
  int almin=(bcdToDec(Wire.read())); 
  int alhour=(bcdToDec(Wire.read())); 
   
  Serial.println("Time...."); 
  Serial.print(hour); 
  Serial.print(":"); 
  Serial.print(minute); 
  Serial.print(":"); 
  Serial.print(second);   
Serial.print("     ");   
  Serial.print(dayOfMonth); 
  Serial.print("_"); 
  Serial.print(month); 
  Serial.print("_20"); 
  Serial.print(year); 
  Serial.print("   day of week: "); 
  Serial.println(dayOfWeek); 
Serial.println(); 
  Serial.println("Alarm...."); 
  Serial.print(alhour); 
  Serial.print(":"); 
  Serial.print(almin); 
  Serial.print(":"); 
  Serial.print(alsec);   
  Serial.println(); 

void setup() 
{    Wire.begin(); 
 Serial.begin(9600); 
 Serial.println("Start"); 

void loop() 
//  setDate(); // Расскоментируем в случае установки времени - потом опять комментим 
 getDate(); 
  delay(1000); 





P.s. В процессе эксплуатации обнаружена повышенная глюкавость - видимо сильно реагирует на статику :( Хотя после окончательной сборки в корпусе работает вроде без нареканий. Часы не сбиваются - идут точно.

Комментариев нет:

Отправить комментарий