00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "m41t81s.h"
00038 #include "pic_serial.h"
00039
00040 uns8 bcd_to_dec(uns8 bcd) {
00041 return (bcd & 0b00001111) + ((bcd >> 4) * 10);
00042 }
00043
00044 uns8 dec_to_bcd(uns8 dec) {
00045 return ((dec / 10) << 4) + (dec % 10);
00046 }
00047
00048 uns8 rtc_get_minutes() {
00049 return bcd_to_dec(i2c_read_eeprom(m41t81s_device_addr, m41t81s_minutes_reg));
00050 }
00051 uns8 rtc_get_hours() {
00052
00053
00054
00055 return bcd_to_dec(0b00111111 & i2c_read_eeprom(m41t81s_device_addr, m41t81s_hours_reg));
00056 }
00057
00058 uns8 rtc_get_seconds() {
00059 return bcd_to_dec(0b01111111 & i2c_read_eeprom(m41t81s_device_addr, m41t81s_seconds_reg));
00060 }
00061
00062 uns8 rtc_get_dow() {
00063 return bcd_to_dec(i2c_read_eeprom(m41t81s_device_addr, m41t81s_dow_reg));
00064 }
00065
00066 uns8 rtc_get_date() {
00067 return bcd_to_dec(i2c_read_eeprom(m41t81s_device_addr, m41t81s_date_reg));
00068 }
00069
00070 uns8 rtc_get_month() {
00071 return bcd_to_dec(i2c_read_eeprom(m41t81s_device_addr, m41t81s_month_reg));
00072 }
00073
00074 uns8 rtc_get_year() {
00075 return bcd_to_dec(i2c_read_eeprom(m41t81s_device_addr, m41t81s_year_reg));
00076 }
00077
00078 uns8 rtc_get_register(uns8 reg) {
00079 return i2c_read_eeprom(m41t81s_device_addr, reg);
00080 }
00081
00082 void rtc_set_register(uns8 reg, uns8 data) {
00083 i2c_write_eeprom(m41t81s_device_addr, reg, data);
00084 }
00085
00086
00087 void rtc_stop_clock() {
00088 i2c_write_eeprom(m41t81s_device_addr, m41t81s_seconds_reg, 0b10000000 | i2c_read_eeprom(m41t81s_device_addr, m41t81s_seconds_reg));
00089 }
00090
00091 void rtc_start_clock() {
00092
00093 i2c_write_eeprom(m41t81s_device_addr, m41t81s_seconds_reg, 0b01111111 & i2c_read_eeprom(m41t81s_device_addr, m41t81s_seconds_reg));
00094 i2c_write_eeprom(m41t81s_device_addr, m41t81s_alarm_hour_reg, 0b10111111 & i2c_read_eeprom(m41t81s_device_addr, m41t81s_alarm_hour_reg));
00095
00096 }
00097
00098 void rtc_set_year(uns8 year) {
00099 i2c_write_eeprom(m41t81s_device_addr, m41t81s_year_reg, dec_to_bcd(year));
00100 }
00101 void rtc_set_minutes(uns8 minutes) {
00102 i2c_write_eeprom(m41t81s_device_addr, m41t81s_minutes_reg, dec_to_bcd(minutes));
00103 }
00104 void rtc_set_day(uns8 day) {
00105 i2c_write_eeprom(m41t81s_device_addr, m41t81s_dow_reg, dec_to_bcd(day));
00106 }
00107 void rtc_set_date(uns8 date) {
00108 i2c_write_eeprom(m41t81s_device_addr, m41t81s_date_reg, dec_to_bcd(date));
00109 }
00110
00111 void rtc_set_seconds(uns8 seconds) {
00112
00113 i2c_write_eeprom(m41t81s_device_addr, m41t81s_seconds_reg, (0b10000000 & i2c_read_eeprom(m41t81s_device_addr, m41t81s_seconds_reg)) | dec_to_bcd(seconds));
00114 }
00115
00116 void rtc_set_hours(uns8 hours) {
00117
00118 i2c_write_eeprom(m41t81s_device_addr, m41t81s_hours_reg, (0b11000000 & i2c_read_eeprom(m41t81s_device_addr, m41t81s_hours_reg)) | dec_to_bcd(hours));
00119 }
00120
00121 void rtc_set_month(uns8 month) {
00122 i2c_write_eeprom(m41t81s_device_addr, m41t81s_month_reg , dec_to_bcd(month));
00123 }
00124
00125 void rtc_set_sqw_freq(uns8 freq) {
00126
00127 freq = freq << 4;
00128 rtc_set_register(m41t81s_sqw_reg, freq);
00129 }
00130
00131 void rtc_start_sqw_output() {
00132
00133 rtc_set_register(m41t81s_alarm_month_reg, 0b01000000 | rtc_get_register(m41t81s_alarm_month_reg));
00134 }
00135
00136 void rtc_stop_sqw_output() {
00137
00138 rtc_set_register(m41t81s_alarm_month_reg, 0b10111111 | rtc_get_register(m41t81s_alarm_month_reg));
00139
00140 }
00141
00142
00143 void rtc_setup_io() {
00144 i2c_setup_io();
00145 }