volatile char *TWC_R = (char*)0xBC;
volatile char *TWS_R = (char*)0xB9;
volatile char *TWD_R = (char*)0xBB;
volatile char *TWB_R = (char*)0xB8;
unsigned char status,sec,minutes,hours,day,date,month,year;
char days [7][20]= {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
void setup() {
Serial.begin(115200);
i2c_init();
init_timer();
i2c_start();
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_write(0xD0);//slave address of RTC
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_write(0x07);
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_write(0x00);
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_stop();
delay1();
// status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
// set_date_time();
// while(1){
// }
}
void init_timer(){
volatile char *TCCR1_A = 0x80;
volatile char *TCCR1_B = 0x81;
volatile short *TCNT_1 = 0x84;
volatile short *OCR1_A = 0x88;
volatile char *TIMSK_1 = 0x6F;
*TCCR1_A = 0;
*TCCR1_B = 0x0C;
*TCNT_1 = 0;
*OCR1_A = 60000;
*TIMSK_1 = 0x03;
}
ISR (TIMER1_COMPA_vect){
get_date_time();
show_date_time();
}
void show_date_time(){
Serial.print("TIME - ");
Serial.print(hours,HEX);
Serial.print(":");
Serial.print(minutes,HEX);
Serial.print(":");
Serial.println(sec,HEX);
Serial.print("Date - ");
Serial.print(date,HEX);
Serial.print("/");
Serial.print(month,HEX);
Serial.print("/20");
Serial.print(year,HEX);
Serial.print(" (");
Serial.print(days[day-1]);
Serial.print(")");
Serial.println(" ");
Serial.println(" ");
}
void set_date_time(){
i2c_start();
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_write(0xD0);
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_write(0x00); //Initial address
delay1();
status = *TWS_R & 0xF8;
Serial.println(status,HEX);
i2c_write(0x00);//seconds
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_write(0x37);//minutes
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_write(0x13);//hours
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_write(0x05);//day
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_write(0x24);//date
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_write(0x03);//month
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_write(0x22);//year
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_stop();
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
}
void get_date_time(){
i2c_start();
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_write(0xD0);
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_write(0x00);
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_stop();
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_start();
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_write(0xD1);
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
set_ack();
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
set_ack();
sec = *TWD_R;
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
set_ack();
minutes = *TWD_R;
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
set_ack();
hours = *TWD_R;
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
set_ack();
day = *TWD_R;
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
set_ack();
date = *TWD_R;
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
set_ack();
month = *TWD_R;
delay1();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
not_ack();
year = *TWD_R;
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
i2c_stop();
status = *TWS_R & 0xF8;
// Serial.println(status,HEX);
}
void i2c_init(){
*TWB_R = 0x48;
*TWS_R = 0x00;
*TWC_R = 0x04; //TWI enable
}
void i2c_start(){
*TWC_R = 0b10100100;
while((*TWC_R>>7)&0x01 != 0);
}
void i2c_stop(){
*TWC_R = 0b10010100;
}
void i2c_write(unsigned data){
*TWD_R = data;
*TWC_R = 0b10000100;
while((*TWC_R>>7)&0x01==0);
}
void set_ack(){
*TWC_R = 0b11000100;
while((*TWC_R>>7)&0x01==0);
}
void not_ack(){
*TWC_R = 0b10000100;
while((*TWC_R>>7)&0x01==0);
}
void delay1(){
volatile long i;
for(i=0;i<100;i++);
}
void loop() {
}