Arduino и часы на VT82885P и аналоги DS12887, DS12885, DS12885Q
Как то попалась под руку материнская плата старая Asus VX97 а в ней VT82885P (аналоги DS12887, DS12885, DS12885Q).
И решил сделать из микросхеме часы реального времени, так как под рукой не было микросхемы Ds1302… ( её я заказал и ждал)…Вот нашел datasheet на неё: VT82885 — RTC
пины для неё:
и принялся писать скетч под неё… благо в datasheet все расписано..
// VT82885P ADDRESS REGISTERS
const uint8_t REGISTER_SECONDS = B00000000; // Seconds
const uint8_t REGISTER_SECONDS_ALARM = B00000001; // Seconds alarm
const uint8_t REGISTER_MINUTES = B00000010; // Minutes
const uint8_t REGISTER_MINUTES_ALARM = B00000011; // Minutes alarm
const uint8_t REGISTER_HOURS = B00000100; // Hours
const uint8_t REGISTER_HOURS_ALARM = B00000101; // Hours alarm
const uint8_t REGISTER_DOW = B00000110; // Day of week
const uint8_t REGISTER_DOM = B00000111; // Day of month
const uint8_t REGISTER_MONTH = B00001000; // Month
const uint8_t REGISTER_YEAR = B00001001; // Year
const uint8_t REGISTER_A = B00001010; // REGISTER A
const uint8_t REGISTER_B = B00001011; // REGISTER B
const uint8_t REGISTER_C = B00001100; // REGISTER C
const uint8_t REGISTER_D = B00001101; // REGISTER D
// dataPins = AD0 - AD7
int dataPins[8] = {2, 3, 4, 5, 6, 7, 8, 9};
// int dataPins[8] = {9, 8, 7, 6, 5, 4, 3, 2}; INVERTED
int CS = A4; // SELECT CHIP
int AS = A3; // STROBE ADDRESS
int WR = A2; // HIGH READ LOW WRITE
int DS = A1; // READ
uint8_t seconds;
uint8_t asecs;
uint8_t minutes;
uint8_t amins;
uint8_t hours;
uint8_t ahour;
uint8_t dow;
uint8_t dom;
uint8_t month;
uint8_t year;
uint8_t regA;
uint8_t rebB;
uint8_t rebC;
uint8_t rebD;
uint8_t lastsecs = 0b11111111;
boolean getBit(uint8_t myVarIn, uint8_t whatBit) {
boolean bitState;
bitState = myVarIn & (1 << whatBit);
return bitState;
}
uint8_t setBit(uint8_t myVarIn, uint8_t whatBit, boolean bitState) {
if (bitState) {
myVarIn |= (1 << whatBit);
}
else {
myVarIn &= ~(1 << whatBit);
}
return myVarIn;
}
void setIdle() {
digitalWrite(CS, HIGH);
digitalWrite(AS, HIGH);
digitalWrite(WR, HIGH);
digitalWrite(DS, HIGH);
}
void switchRead() {
for (int i=0; i<7; i++) {
pinMode(dataPins[i], INPUT);
}
}
void switchWrite() {
for (int i=0; i<7; i++) {
pinMode(dataPins[i], OUTPUT);
}
}
uint8_t readBusData() {
uint8_t dataBuffer = 0b00000000;
for (int i=0; i<8; i++) {
boolean state = digitalRead(dataPins[i]);
dataBuffer = setBit(dataBuffer, i, state);
}
return dataBuffer;
}
void writeBusData(uint8_t data) {
for (int i=0; i<8; i++) {
digitalWrite(dataPins[i], getBit(data, i));
}
}
void readSeconds() {
seconds = getRegisterData(REGISTER_SECONDS);
}
uint8_t getRegisterData(uint8_t registerAddr) {
uint8_t dataBuffer = 0b00000000;
switchWrite();
digitalWrite(CS, LOW);
delayMicroseconds(20);
writeBusData(registerAddr);
digitalWrite(AS, LOW);
delayMicroseconds(20);
switchRead();
delayMicroseconds(20);
digitalWrite(DS, LOW);
delayMicroseconds(20);
dataBuffer = readBusData();
digitalWrite(DS, HIGH);
delayMicroseconds(20);
digitalWrite(AS, HIGH);
delayMicroseconds(20);
digitalWrite(CS, HIGH);
return dataBuffer;
}
void getRTCDate() {
seconds = getRegisterData(REGISTER_SECONDS);
minutes = getRegisterData(REGISTER_MINUTES);
hours = getRegisterData(REGISTER_HOURS);
dow = getRegisterData(REGISTER_DOW);
dom = getRegisterData(REGISTER_DOM);
month = getRegisterData(REGISTER_MONTH);
year = getRegisterData(REGISTER_YEAR);
}
void setup() {
pinMode(CS, OUTPUT);
pinMode(AS, OUTPUT);
pinMode(WR, OUTPUT);
pinMode(DS, OUTPUT);
setIdle();
switchRead();
Serial.begin(9600);
}
void loop() {
getRTCDate();
Serial.print("(");
Serial.print(dow);
Serial.print(") ");
Serial.print(month);
Serial.print("/");
Serial.print(dom);
Serial.print("/");
Serial.print(year);
Serial.print(" ");
Serial.print(hours);
Serial.print(":");
Serial.print(minutes);
Serial.print(".");
Serial.println(seconds);
delay(1000);
/*
if (lastsecs != seconds) {
lastsecs = seconds;
for (int i=0; i<8; i++) {
//Serial.print(getBit(seconds, i));
}
}
*/
}
Февраль 7, 2015 Суббота at 8:27 пп