Class library for the Dallas Semiconductor DS1307 RTC Basic Functionality, read and set RTC

Committer:
jebradshaw
Date:
Sat Nov 01 14:56:37 2014 +0000
Revision:
2:a9a0784930bd
Parent:
1:95a90bac5d6d
Still need to implement arrays for day and month names

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jebradshaw 0:2bbb23558624 1 // J Bradshaw
jebradshaw 0:2bbb23558624 2 // 20141010 - I2C Real Time Clock
jebradshaw 0:2bbb23558624 3
jebradshaw 0:2bbb23558624 4 #include "DS1307_RTC.h"
jebradshaw 0:2bbb23558624 5
jebradshaw 0:2bbb23558624 6 #define YEAR_OFFSET 2000
jebradshaw 0:2bbb23558624 7
jebradshaw 0:2bbb23558624 8 DS1307_RTC::DS1307_RTC(PinName sda, PinName scl) : _i2c(sda, scl)
jebradshaw 0:2bbb23558624 9 {
jebradshaw 0:2bbb23558624 10 _i2c.frequency(400000);
jebradshaw 0:2bbb23558624 11
jebradshaw 2:a9a0784930bd 12 /* Day[] = {"","Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
jebradshaw 2:a9a0784930bd 13 Mon[] = {"","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};*/
jebradshaw 0:2bbb23558624 14
jebradshaw 2:a9a0784930bd 15 /*
jebradshaw 0:2bbb23558624 16 Day[0] = "";
jebradshaw 0:2bbb23558624 17 Day[1] = "Sun";
jebradshaw 1:95a90bac5d6d 18 Day[2] = "Mon";
jebradshaw 1:95a90bac5d6d 19 Day[3] = "Tue";
jebradshaw 1:95a90bac5d6d 20 Day[4] = "Wed";
jebradshaw 1:95a90bac5d6d 21 Day[5] = "Thu";
jebradshaw 1:95a90bac5d6d 22 Day[6] = "Fri";
jebradshaw 1:95a90bac5d6d 23 Day[7] = "Sat";
jebradshaw 1:95a90bac5d6d 24
jebradshaw 1:95a90bac5d6d 25 Mon[0] = "";
jebradshaw 1:95a90bac5d6d 26 Mon[1] = "Jan";
jebradshaw 1:95a90bac5d6d 27 Mon[2] = "Feb";
jebradshaw 1:95a90bac5d6d 28 Mon[3] = "Mar";
jebradshaw 1:95a90bac5d6d 29 Mon[4] = "Apr";
jebradshaw 1:95a90bac5d6d 30 Mon[5] = "May";
jebradshaw 1:95a90bac5d6d 31 Mon[6] = "Jun";
jebradshaw 1:95a90bac5d6d 32 Mon[7] = "Jul";
jebradshaw 1:95a90bac5d6d 33 Mon[8] = "Aug";
jebradshaw 1:95a90bac5d6d 34 Mon[9] = "Sep";
jebradshaw 1:95a90bac5d6d 35 Mon[10] = "Oct";
jebradshaw 1:95a90bac5d6d 36 Mon[11] = "Nov";
jebradshaw 1:95a90bac5d6d 37 Mon[12] = "Dec";
jebradshaw 2:a9a0784930bd 38 */
jebradshaw 0:2bbb23558624 39
jebradshaw 0:2bbb23558624 40 rtc_sec = 0;
jebradshaw 0:2bbb23558624 41 rtc_minute = 0;
jebradshaw 0:2bbb23558624 42 rtc_hours = 0;
jebradshaw 0:2bbb23558624 43 rtc_day = 0;
jebradshaw 0:2bbb23558624 44 rtc_date = 0;
jebradshaw 0:2bbb23558624 45 rtc_month = 0;
jebradshaw 0:2bbb23558624 46 rtc_year = 0;
jebradshaw 0:2bbb23558624 47 }
jebradshaw 0:2bbb23558624 48
jebradshaw 0:2bbb23558624 49 //function for writing to RTC registers
jebradshaw 0:2bbb23558624 50 void DS1307_RTC::RTC_write_reg(int reg, int val)
jebradshaw 0:2bbb23558624 51 {
jebradshaw 0:2bbb23558624 52 char cmd[3];
jebradshaw 0:2bbb23558624 53 cmd[0] = reg;
jebradshaw 0:2bbb23558624 54 cmd[1] = val & 0xFF;
jebradshaw 0:2bbb23558624 55
jebradshaw 0:2bbb23558624 56 _i2c.write(DS1307_addr, cmd, 2);
jebradshaw 0:2bbb23558624 57 }
jebradshaw 0:2bbb23558624 58
jebradshaw 0:2bbb23558624 59 int DS1307_RTC::RTC_read_reg(char reg)
jebradshaw 0:2bbb23558624 60 {
jebradshaw 0:2bbb23558624 61 char byte_read[2];
jebradshaw 0:2bbb23558624 62
jebradshaw 0:2bbb23558624 63 if(_i2c.write(DS1307_addr, &reg, 1)) //tell the RTC which reg
jebradshaw 0:2bbb23558624 64 printf("\r\nDS1307 - Error sending address!\0");
jebradshaw 0:2bbb23558624 65
jebradshaw 0:2bbb23558624 66 if(_i2c.read(DS1307_addr, byte_read, 1)) //read one byte
jebradshaw 0:2bbb23558624 67 printf("\r\nDS1307 - Error reading!\0");
jebradshaw 0:2bbb23558624 68 return byte_read[0];
jebradshaw 0:2bbb23558624 69 }
jebradshaw 0:2bbb23558624 70
jebradshaw 0:2bbb23558624 71 int DS1307_RTC::bcd(int dec)
jebradshaw 0:2bbb23558624 72 {
jebradshaw 0:2bbb23558624 73 return ((dec/10)<<4) + (dec%10);
jebradshaw 0:2bbb23558624 74 }
jebradshaw 0:2bbb23558624 75
jebradshaw 0:2bbb23558624 76 int DS1307_RTC::unbcd(int bcd)
jebradshaw 0:2bbb23558624 77 {
jebradshaw 0:2bbb23558624 78 return ((bcd>>4)*10) + bcd%16;
jebradshaw 0:2bbb23558624 79 }
jebradshaw 0:2bbb23558624 80
jebradshaw 0:2bbb23558624 81 void DS1307_RTC::set_RTC_time(void)
jebradshaw 0:2bbb23558624 82 {
jebradshaw 0:2bbb23558624 83 printf("\r\n\r\nSet the Real Time Clock.\r\nEnter Year and press Enter...\r\n");
jebradshaw 0:2bbb23558624 84 scanf("%d",&rtc_year); //Read year
jebradshaw 0:2bbb23558624 85 RTC_write_reg(6, bcd(rtc_year)); //seconds reg
jebradshaw 0:2bbb23558624 86 printf("%d\r\n",rtc_year + YEAR_OFFSET); //print year
jebradshaw 0:2bbb23558624 87
jebradshaw 0:2bbb23558624 88 printf("Enter Month and press Enter...\r\n");
jebradshaw 0:2bbb23558624 89 scanf("%d",&rtc_month); //Read month
jebradshaw 0:2bbb23558624 90 RTC_write_reg(5, bcd(rtc_month)); //month reg
jebradshaw 0:2bbb23558624 91 printf("%d\r\n",rtc_month); //print month
jebradshaw 0:2bbb23558624 92
jebradshaw 0:2bbb23558624 93 printf("Enter Day (Sun=1,Mon=2,Tues=3,etc...) and press Enter...\r\n");
jebradshaw 0:2bbb23558624 94 scanf("%d",&rtc_day); //Read day
jebradshaw 0:2bbb23558624 95 RTC_write_reg(3, bcd(rtc_day)); //day reg
jebradshaw 0:2bbb23558624 96 printf("%d\r\n",rtc_day); //print day
jebradshaw 0:2bbb23558624 97
jebradshaw 0:2bbb23558624 98 printf("Enter Date and press Enter...\r\n");
jebradshaw 0:2bbb23558624 99 scanf("%d",&rtc_date); //Read date
jebradshaw 0:2bbb23558624 100 RTC_write_reg(4, bcd(rtc_date)); //date reg
jebradshaw 0:2bbb23558624 101 printf("%d\r\n",rtc_date); //print date
jebradshaw 0:2bbb23558624 102
jebradshaw 0:2bbb23558624 103 printf("Enter hours and press Enter...\r\n");
jebradshaw 0:2bbb23558624 104 scanf("%d",&rtc_hours); //Read hour
jebradshaw 0:2bbb23558624 105 RTC_write_reg(2, bcd(rtc_hours)); //hour reg
jebradshaw 0:2bbb23558624 106 printf("%d\r\n",rtc_hours); //print hour
jebradshaw 0:2bbb23558624 107
jebradshaw 0:2bbb23558624 108 printf("Enter Minutes and press Enter...\r\n");
jebradshaw 0:2bbb23558624 109 scanf("%d",&rtc_minute); //Read minute
jebradshaw 0:2bbb23558624 110 RTC_write_reg(1, bcd(rtc_minute)); //minute reg
jebradshaw 0:2bbb23558624 111 printf("%d\r\n",rtc_minute); //print minute
jebradshaw 0:2bbb23558624 112
jebradshaw 0:2bbb23558624 113 printf("Enter seconds and press Enter...\r\n");
jebradshaw 0:2bbb23558624 114 scanf("%d",&rtc_sec); //Read sec
jebradshaw 0:2bbb23558624 115 printf("%d\r\n",rtc_sec); //print sec
jebradshaw 0:2bbb23558624 116 RTC_write_reg(0, bcd(rtc_sec)); //seconds reg
jebradshaw 0:2bbb23558624 117 }
jebradshaw 0:2bbb23558624 118
jebradshaw 1:95a90bac5d6d 119 void DS1307_RTC::set_RTC_time_UTC(float utc_time, int timezone){
jebradshaw 1:95a90bac5d6d 120 int Hour = (int)((int)utc_time/10000) + timezone;
jebradshaw 1:95a90bac5d6d 121 if(Hour < 0)
jebradshaw 1:95a90bac5d6d 122 Hour += 24;
jebradshaw 1:95a90bac5d6d 123
jebradshaw 1:95a90bac5d6d 124 int Min = (int)((int)utc_time/100%100);
jebradshaw 1:95a90bac5d6d 125 int Sec = (int)utc_time % 100;
jebradshaw 1:95a90bac5d6d 126
jebradshaw 1:95a90bac5d6d 127 /* RTC_write_reg(6, bcd(rtc_year)); //seconds reg
jebradshaw 1:95a90bac5d6d 128 RTC_write_reg(5, bcd(rtc_month)); //month reg
jebradshaw 1:95a90bac5d6d 129 RTC_write_reg(3, bcd(rtc_day)); //day reg
jebradshaw 1:95a90bac5d6d 130 RTC_write_reg(4, bcd(rtc_date)); //date reg*/
jebradshaw 1:95a90bac5d6d 131
jebradshaw 1:95a90bac5d6d 132 RTC_write_reg(2, bcd(Hour)); //hour reg
jebradshaw 1:95a90bac5d6d 133 RTC_write_reg(1, bcd(Min)); //minute reg
jebradshaw 1:95a90bac5d6d 134 RTC_write_reg(0, bcd(Sec)); //seconds reg
jebradshaw 1:95a90bac5d6d 135 }
jebradshaw 1:95a90bac5d6d 136
jebradshaw 0:2bbb23558624 137 void DS1307_RTC::get_RTC_time(char *str)
jebradshaw 0:2bbb23558624 138 {
jebradshaw 0:2bbb23558624 139 rtc_sec = unbcd(RTC_read_reg(0)); //
jebradshaw 0:2bbb23558624 140 rtc_minute = unbcd(RTC_read_reg(1));
jebradshaw 0:2bbb23558624 141 rtc_hours = unbcd(RTC_read_reg(2));
jebradshaw 0:2bbb23558624 142 rtc_day = unbcd(RTC_read_reg(3));
jebradshaw 2:a9a0784930bd 143 if(rtc_day > 7)
jebradshaw 2:a9a0784930bd 144 rtc_day = 0;
jebradshaw 0:2bbb23558624 145 rtc_date = unbcd(RTC_read_reg(4));
jebradshaw 0:2bbb23558624 146 rtc_month = unbcd(RTC_read_reg(5));
jebradshaw 2:a9a0784930bd 147 if(rtc_month > 12)
jebradshaw 2:a9a0784930bd 148 rtc_month = 0;
jebradshaw 0:2bbb23558624 149 rtc_year = unbcd(RTC_read_reg(6)) + YEAR_OFFSET;
jebradshaw 0:2bbb23558624 150
jebradshaw 2:a9a0784930bd 151 sprintf(str, "%2d:%02d:%02d", rtc_hours,rtc_minute,rtc_sec);
jebradshaw 2:a9a0784930bd 152 //sprintf(str, "%2d:%02d:%02d %s %s %d %d", rtc_hours,rtc_minute,rtc_sec,Day[rtc_day],Mon[rtc_month], rtc_date, rtc_year);
jebradshaw 0:2bbb23558624 153 //pc.printf("%s", str);
jebradshaw 0:2bbb23558624 154 }