Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 |