Code to interface with the MCP7940 Real time clock. Supports getting and setting the time in 24 hour format
MCP7940.cpp@2:941a59078507, 2015-10-02 (annotated)
- Committer:
- MichaelW
- Date:
- Fri Oct 02 11:36:17 2015 +0000
- Revision:
- 2:941a59078507
- Parent:
- 1:8f330348d96b
Added some documentation
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MichaelW | 1:8f330348d96b | 1 | #include "MCP7940.h" |
MichaelW | 1:8f330348d96b | 2 | |
MichaelW | 1:8f330348d96b | 3 | MCP7940::MCP7940(PinName sda, PinName scl):Clock(sda, scl){ |
MichaelW | 1:8f330348d96b | 4 | _addr = 0xDE; // 1101 111x |
MichaelW | 1:8f330348d96b | 5 | Clock.frequency(100000); |
MichaelW | 1:8f330348d96b | 6 | _YearStart = 2000; |
MichaelW | 1:8f330348d96b | 7 | } |
MichaelW | 1:8f330348d96b | 8 | MCP7940::MCP7940(PinName sda, PinName scl, int StartYear):Clock(sda, scl){ |
MichaelW | 1:8f330348d96b | 9 | _addr = 0xDE; // 1101 111x |
MichaelW | 1:8f330348d96b | 10 | Clock.frequency(100000); |
MichaelW | 1:8f330348d96b | 11 | _YearStart = StartYear; |
MichaelW | 1:8f330348d96b | 12 | } |
MichaelW | 1:8f330348d96b | 13 | |
MichaelW | 1:8f330348d96b | 14 | char MCP7940::IntToBCD(char Data){ |
MichaelW | 1:8f330348d96b | 15 | char Tens = Data / 10; |
MichaelW | 1:8f330348d96b | 16 | char Units = Data % 10; |
MichaelW | 1:8f330348d96b | 17 | char BCD = (Tens << 4 | Units); |
MichaelW | 1:8f330348d96b | 18 | return(BCD); |
MichaelW | 1:8f330348d96b | 19 | } |
MichaelW | 1:8f330348d96b | 20 | char MCP7940::BCDtoInt(char Data){ |
MichaelW | 1:8f330348d96b | 21 | char Value; |
MichaelW | 1:8f330348d96b | 22 | Value = (((Data & 0xF0 ) >> 4) * 10) + (((Data & 0x0F ))); |
MichaelW | 1:8f330348d96b | 23 | return(Value); |
MichaelW | 1:8f330348d96b | 24 | } |
MichaelW | 1:8f330348d96b | 25 | |
MichaelW | 1:8f330348d96b | 26 | int MCP7940::setTime(int Year, int Month, int Day, int Hour, int Mins){ |
MichaelW | 1:8f330348d96b | 27 | return(setTime(Year, Month, Day, Hour, Mins, 0, 0)); |
MichaelW | 1:8f330348d96b | 28 | } |
MichaelW | 1:8f330348d96b | 29 | int MCP7940::setTime(int Year, int Month, int Day, int Hour, int Mins, int Secs){ |
MichaelW | 1:8f330348d96b | 30 | return(setTime(Year, Month, Day, Hour, Mins, Secs, 0)); |
MichaelW | 1:8f330348d96b | 31 | } |
MichaelW | 1:8f330348d96b | 32 | int MCP7940::setTime(int Year, int Month, int Day, int Hour, int Mins, int Secs, int MiliSecs){ |
MichaelW | 1:8f330348d96b | 33 | return(setTime(Year, Month, Day, Hour, Mins, Secs, 0,1)); |
MichaelW | 1:8f330348d96b | 34 | } |
MichaelW | 1:8f330348d96b | 35 | int MCP7940::setTime(int Year, int Month, int Day, int Hour, int Mins, int Secs, int MiliSecs, int DayOfWeek){ |
MichaelW | 1:8f330348d96b | 36 | _Day = Day; |
MichaelW | 1:8f330348d96b | 37 | _Month = Month; |
MichaelW | 1:8f330348d96b | 38 | _Year = Year; |
MichaelW | 1:8f330348d96b | 39 | _Hour = Hour; |
MichaelW | 1:8f330348d96b | 40 | _Minutes = Mins; |
MichaelW | 1:8f330348d96b | 41 | _Seconds = Secs; |
MichaelW | 1:8f330348d96b | 42 | _MilliSeconds = MiliSecs; |
MichaelW | 1:8f330348d96b | 43 | _DayOfWeek = DayOfWeek; |
MichaelW | 1:8f330348d96b | 44 | return(setTime()); |
MichaelW | 1:8f330348d96b | 45 | } |
MichaelW | 1:8f330348d96b | 46 | void MCP7940::StartClock(){ |
MichaelW | 1:8f330348d96b | 47 | char cmd[8]; |
MichaelW | 1:8f330348d96b | 48 | cmd[0] = 0x00; // The start register |
MichaelW | 1:8f330348d96b | 49 | cmd[1] = 0x00; |
MichaelW | 1:8f330348d96b | 50 | |
MichaelW | 1:8f330348d96b | 51 | Clock.start(); |
MichaelW | 1:8f330348d96b | 52 | Clock.write(_addr,cmd,1) ; |
MichaelW | 1:8f330348d96b | 53 | Clock.read(_addr, cmd, 1); |
MichaelW | 1:8f330348d96b | 54 | |
MichaelW | 1:8f330348d96b | 55 | //Cmd 0 now contains the value of the seconds regsiter |
MichaelW | 1:8f330348d96b | 56 | cmd[1] = cmd[0] & 0x7F; //Move the seconds register value and clear the top bit |
MichaelW | 1:8f330348d96b | 57 | cmd[0] = 0x00; //Set write location |
MichaelW | 1:8f330348d96b | 58 | // Clock.write(_addr,cmd,2); |
MichaelW | 1:8f330348d96b | 59 | cmd[1] = cmd[1] | 0x80 ; //Now set the top bit |
MichaelW | 1:8f330348d96b | 60 | Clock.write(_addr,cmd,2); //Write to Reg 0x00 the value with top bit set |
MichaelW | 1:8f330348d96b | 61 | Clock.stop(); |
MichaelW | 1:8f330348d96b | 62 | |
MichaelW | 1:8f330348d96b | 63 | } |
MichaelW | 1:8f330348d96b | 64 | int MCP7940::setDefaultTime(){ |
MichaelW | 1:8f330348d96b | 65 | _Day = 1; |
MichaelW | 1:8f330348d96b | 66 | _Month = 10; |
MichaelW | 1:8f330348d96b | 67 | _Year = 2015; |
MichaelW | 1:8f330348d96b | 68 | _Hour = 1; |
MichaelW | 1:8f330348d96b | 69 | _Minutes = 0; |
MichaelW | 1:8f330348d96b | 70 | _Seconds = 0; |
MichaelW | 1:8f330348d96b | 71 | _MilliSeconds = 0; |
MichaelW | 1:8f330348d96b | 72 | _DayOfWeek = 1; |
MichaelW | 1:8f330348d96b | 73 | return(setTime()); |
MichaelW | 1:8f330348d96b | 74 | } |
MichaelW | 1:8f330348d96b | 75 | int MCP7940::setTime(){ |
MichaelW | 1:8f330348d96b | 76 | //Write time to the Device |
MichaelW | 1:8f330348d96b | 77 | char cmd[8]; |
MichaelW | 1:8f330348d96b | 78 | cmd[0] = 0x00; // The start register |
MichaelW | 1:8f330348d96b | 79 | cmd[1] = IntToBCD(_Seconds); |
MichaelW | 1:8f330348d96b | 80 | cmd[2] = IntToBCD(_Minutes); |
MichaelW | 1:8f330348d96b | 81 | cmd[3] = IntToBCD(_Hour); |
MichaelW | 1:8f330348d96b | 82 | cmd[4] = IntToBCD(_DayOfWeek) | 0x80; //NB this will clear the PWR Fail and set VBat Enable |
MichaelW | 1:8f330348d96b | 83 | cmd[5] = IntToBCD(_Day); |
MichaelW | 1:8f330348d96b | 84 | cmd[6] = IntToBCD(_Month); |
MichaelW | 1:8f330348d96b | 85 | cmd[7] = IntToBCD(_Year - _YearStart); |
MichaelW | 1:8f330348d96b | 86 | |
MichaelW | 1:8f330348d96b | 87 | Clock.start(); |
MichaelW | 1:8f330348d96b | 88 | Clock.write(_addr, cmd, 8); |
MichaelW | 1:8f330348d96b | 89 | Clock.stop(); |
MichaelW | 1:8f330348d96b | 90 | |
MichaelW | 1:8f330348d96b | 91 | return(1); |
MichaelW | 1:8f330348d96b | 92 | } |
MichaelW | 1:8f330348d96b | 93 | int MCP7940::getTime(){ |
MichaelW | 1:8f330348d96b | 94 | |
MichaelW | 1:8f330348d96b | 95 | char cmd[7]; |
MichaelW | 1:8f330348d96b | 96 | cmd[0] = 0x00; |
MichaelW | 1:8f330348d96b | 97 | |
MichaelW | 1:8f330348d96b | 98 | Clock.start(); |
MichaelW | 1:8f330348d96b | 99 | //Set the position to Reg 0x00 |
MichaelW | 1:8f330348d96b | 100 | Clock.write(_addr, cmd, 1); |
MichaelW | 1:8f330348d96b | 101 | //Read 7 bytes from 0x00 |
MichaelW | 1:8f330348d96b | 102 | Clock.read(_addr, cmd, 7); |
MichaelW | 1:8f330348d96b | 103 | Clock.stop(); |
MichaelW | 1:8f330348d96b | 104 | |
MichaelW | 1:8f330348d96b | 105 | //printf("%i %i %i %i %i %i %i\r\n", cmd[0], cmd[1],cmd[2],cmd[3],cmd[4], cmd[5], cmd[6]); |
MichaelW | 1:8f330348d96b | 106 | |
MichaelW | 1:8f330348d96b | 107 | //Convert into numbers - note have to mask out the configuration bits as well |
MichaelW | 1:8f330348d96b | 108 | _Day = BCDtoInt(cmd[4] & 0x3F); |
MichaelW | 1:8f330348d96b | 109 | _Month = BCDtoInt(cmd[5] & 0x1F); |
MichaelW | 1:8f330348d96b | 110 | _Year = BCDtoInt(cmd[6] & 0xFF) + _YearStart; |
MichaelW | 1:8f330348d96b | 111 | _Hour = BCDtoInt(cmd[2] & 0x3F); //Should handle 12 or 24 hour here. |
MichaelW | 1:8f330348d96b | 112 | _Minutes = BCDtoInt(cmd[1] & 0x7F); |
MichaelW | 1:8f330348d96b | 113 | _Seconds = BCDtoInt(cmd[0] & 0x7F); |
MichaelW | 1:8f330348d96b | 114 | _DayOfWeek = BCDtoInt(cmd[3] & 0x07); |
MichaelW | 1:8f330348d96b | 115 | _MilliSeconds = 0; |
MichaelW | 1:8f330348d96b | 116 | //printf("Day: %i Month: %i Year: %i Hour: %i Minute: %i Second: %i\r\n", _Day, _Month,_Year,_Hour,_Minutes, _Seconds); |
MichaelW | 1:8f330348d96b | 117 | return(0); |
MichaelW | 1:8f330348d96b | 118 | } |
MichaelW | 1:8f330348d96b | 119 | char * MCP7940::TimeStamp(){ |
MichaelW | 1:8f330348d96b | 120 | TimeStamp(_TimeStamp); |
MichaelW | 1:8f330348d96b | 121 | return(_TimeStamp); |
MichaelW | 1:8f330348d96b | 122 | } |
MichaelW | 1:8f330348d96b | 123 | void MCP7940::TimeStamp(char * buf){ |
MichaelW | 1:8f330348d96b | 124 | getTime(); |
MichaelW | 1:8f330348d96b | 125 | sprintf(buf,"%04i-%02i-%02iT%02i:%02i:%02i",_Year, _Month,_Day,_Hour,_Minutes,_Seconds); |
MichaelW | 1:8f330348d96b | 126 | } |
MichaelW | 1:8f330348d96b | 127 | void MCP7940::niceTimeStamp(char * buf){ |
MichaelW | 1:8f330348d96b | 128 | getTime(); |
MichaelW | 1:8f330348d96b | 129 | sprintf(buf,"%02i/%02i/%04i %02i:%02i:%02i",_Day, _Month,_Year,_Hour,_Minutes,_Seconds); |
MichaelW | 1:8f330348d96b | 130 | } |
MichaelW | 1:8f330348d96b | 131 | void MCP7940::niceDate(char * buf){ |
MichaelW | 1:8f330348d96b | 132 | getTime(); |
MichaelW | 1:8f330348d96b | 133 | sprintf(buf,"%02i-%02i-%04i",_Day, _Month,_Year); |
MichaelW | 1:8f330348d96b | 134 | } |
MichaelW | 1:8f330348d96b | 135 | void MCP7940::niceTime(char * buf){ |
MichaelW | 1:8f330348d96b | 136 | getTime(); |
MichaelW | 1:8f330348d96b | 137 | sprintf(buf,"%02i:%02i:%02i",_Hour,_Minutes,_Seconds); |
MichaelW | 1:8f330348d96b | 138 | } |
MichaelW | 1:8f330348d96b | 139 | |
MichaelW | 1:8f330348d96b | 140 | int MCP7940::Day(){ |
MichaelW | 1:8f330348d96b | 141 | return(_Day); |
MichaelW | 1:8f330348d96b | 142 | } |
MichaelW | 1:8f330348d96b | 143 | int MCP7940::Month(){ |
MichaelW | 1:8f330348d96b | 144 | return(_Month); |
MichaelW | 1:8f330348d96b | 145 | } |
MichaelW | 1:8f330348d96b | 146 | int MCP7940::Year(){ |
MichaelW | 1:8f330348d96b | 147 | return(_Year); |
MichaelW | 1:8f330348d96b | 148 | } |
MichaelW | 1:8f330348d96b | 149 | int MCP7940::Hour(){ |
MichaelW | 1:8f330348d96b | 150 | return(_Hour); |
MichaelW | 1:8f330348d96b | 151 | } |
MichaelW | 1:8f330348d96b | 152 | int MCP7940::Minutes(){ |
MichaelW | 1:8f330348d96b | 153 | return(_Minutes); |
MichaelW | 1:8f330348d96b | 154 | |
MichaelW | 1:8f330348d96b | 155 | } |
MichaelW | 1:8f330348d96b | 156 | int MCP7940::Seconds(){ |
MichaelW | 1:8f330348d96b | 157 | return(_Seconds); |
MichaelW | 1:8f330348d96b | 158 | } |
MichaelW | 1:8f330348d96b | 159 | int MCP7940::MilliSeconds(){ |
MichaelW | 1:8f330348d96b | 160 | return(_MilliSeconds); |
MichaelW | 1:8f330348d96b | 161 | } |
MichaelW | 1:8f330348d96b | 162 | int MCP7940::DayOfWeek(){ |
MichaelW | 1:8f330348d96b | 163 | return(_DayOfWeek); |
MichaelW | 1:8f330348d96b | 164 | } |
MichaelW | 1:8f330348d96b | 165 |