Real Time Clock ds1302 library
ds1302.cpp@0:be8d71b29b37, 2010-12-03 (annotated)
- Committer:
- gcibeira
- Date:
- Fri Dec 03 18:01:36 2010 +0000
- Revision:
- 0:be8d71b29b37
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gcibeira | 0:be8d71b29b37 | 1 | /* |
gcibeira | 0:be8d71b29b37 | 2 | Copyright (c) 2010 Cibeira Gerardo |
gcibeira | 0:be8d71b29b37 | 3 | */ |
gcibeira | 0:be8d71b29b37 | 4 | |
gcibeira | 0:be8d71b29b37 | 5 | #include "ds1302.h" |
gcibeira | 0:be8d71b29b37 | 6 | #include "mbed.h" |
gcibeira | 0:be8d71b29b37 | 7 | |
gcibeira | 0:be8d71b29b37 | 8 | //constructor |
gcibeira | 0:be8d71b29b37 | 9 | ds1302::ds1302(PinName pinSCLK,PinName pinIO,PinName pinRST) : SCLK(pinSCLK),IO(pinIO),RST(pinRST) {} |
gcibeira | 0:be8d71b29b37 | 10 | |
gcibeira | 0:be8d71b29b37 | 11 | //methods |
gcibeira | 0:be8d71b29b37 | 12 | void ds1302::write_byte(BYTE cmd) |
gcibeira | 0:be8d71b29b37 | 13 | { |
gcibeira | 0:be8d71b29b37 | 14 | BYTE i; |
gcibeira | 0:be8d71b29b37 | 15 | IO.output(); |
gcibeira | 0:be8d71b29b37 | 16 | for(i=0;i<=7;i++) |
gcibeira | 0:be8d71b29b37 | 17 | { |
gcibeira | 0:be8d71b29b37 | 18 | IO = (cmd >> i) & 0x01; |
gcibeira | 0:be8d71b29b37 | 19 | wait_us(1); |
gcibeira | 0:be8d71b29b37 | 20 | SCLK=1; |
gcibeira | 0:be8d71b29b37 | 21 | wait_us(1); |
gcibeira | 0:be8d71b29b37 | 22 | SCLK=0; |
gcibeira | 0:be8d71b29b37 | 23 | } |
gcibeira | 0:be8d71b29b37 | 24 | IO.input(); |
gcibeira | 0:be8d71b29b37 | 25 | } |
gcibeira | 0:be8d71b29b37 | 26 | |
gcibeira | 0:be8d71b29b37 | 27 | void ds1302::write(BYTE cmd, BYTE data) |
gcibeira | 0:be8d71b29b37 | 28 | { |
gcibeira | 0:be8d71b29b37 | 29 | RST=1; |
gcibeira | 0:be8d71b29b37 | 30 | wait_us(1); |
gcibeira | 0:be8d71b29b37 | 31 | write_byte(cmd); |
gcibeira | 0:be8d71b29b37 | 32 | write_byte(data); |
gcibeira | 0:be8d71b29b37 | 33 | RST=0; |
gcibeira | 0:be8d71b29b37 | 34 | } |
gcibeira | 0:be8d71b29b37 | 35 | |
gcibeira | 0:be8d71b29b37 | 36 | BYTE ds1302::read(BYTE cmd) |
gcibeira | 0:be8d71b29b37 | 37 | { |
gcibeira | 0:be8d71b29b37 | 38 | BYTE i,data=0; |
gcibeira | 0:be8d71b29b37 | 39 | |
gcibeira | 0:be8d71b29b37 | 40 | RST=1; |
gcibeira | 0:be8d71b29b37 | 41 | write_byte(cmd); |
gcibeira | 0:be8d71b29b37 | 42 | |
gcibeira | 0:be8d71b29b37 | 43 | IO.input(); |
gcibeira | 0:be8d71b29b37 | 44 | wait_us(1); |
gcibeira | 0:be8d71b29b37 | 45 | |
gcibeira | 0:be8d71b29b37 | 46 | for(i=0;i<=7;i++) |
gcibeira | 0:be8d71b29b37 | 47 | { |
gcibeira | 0:be8d71b29b37 | 48 | data += IO<<i; |
gcibeira | 0:be8d71b29b37 | 49 | SCLK=1; |
gcibeira | 0:be8d71b29b37 | 50 | wait_us(1); |
gcibeira | 0:be8d71b29b37 | 51 | SCLK=0; |
gcibeira | 0:be8d71b29b37 | 52 | wait_us(1); |
gcibeira | 0:be8d71b29b37 | 53 | } |
gcibeira | 0:be8d71b29b37 | 54 | RST=0; |
gcibeira | 0:be8d71b29b37 | 55 | |
gcibeira | 0:be8d71b29b37 | 56 | return(data); |
gcibeira | 0:be8d71b29b37 | 57 | } |
gcibeira | 0:be8d71b29b37 | 58 | |
gcibeira | 0:be8d71b29b37 | 59 | void ds1302::init() |
gcibeira | 0:be8d71b29b37 | 60 | { |
gcibeira | 0:be8d71b29b37 | 61 | BYTE x; |
gcibeira | 0:be8d71b29b37 | 62 | RST=0; |
gcibeira | 0:be8d71b29b37 | 63 | wait_us(2); |
gcibeira | 0:be8d71b29b37 | 64 | SCLK=0; |
gcibeira | 0:be8d71b29b37 | 65 | write(0x8e,0); |
gcibeira | 0:be8d71b29b37 | 66 | write(0x90,0xa4); |
gcibeira | 0:be8d71b29b37 | 67 | x=read(0x81); |
gcibeira | 0:be8d71b29b37 | 68 | if((x & 0x80)!=0) |
gcibeira | 0:be8d71b29b37 | 69 | write(0x80,0); |
gcibeira | 0:be8d71b29b37 | 70 | } |
gcibeira | 0:be8d71b29b37 | 71 | |
gcibeira | 0:be8d71b29b37 | 72 | BYTE ds1302::get_bcd(BYTE data) |
gcibeira | 0:be8d71b29b37 | 73 | { |
gcibeira | 0:be8d71b29b37 | 74 | BYTE nibh=0; |
gcibeira | 0:be8d71b29b37 | 75 | BYTE nibl=0; |
gcibeira | 0:be8d71b29b37 | 76 | |
gcibeira | 0:be8d71b29b37 | 77 | nibh = data/10; |
gcibeira | 0:be8d71b29b37 | 78 | nibl = data-(nibh*10); |
gcibeira | 0:be8d71b29b37 | 79 | |
gcibeira | 0:be8d71b29b37 | 80 | return( (nibh<<4) | nibl); |
gcibeira | 0:be8d71b29b37 | 81 | } |
gcibeira | 0:be8d71b29b37 | 82 | |
gcibeira | 0:be8d71b29b37 | 83 | BYTE ds1302::rm_bcd(BYTE data) |
gcibeira | 0:be8d71b29b37 | 84 | { |
gcibeira | 0:be8d71b29b37 | 85 | BYTE i,aux=0; |
gcibeira | 0:be8d71b29b37 | 86 | |
gcibeira | 0:be8d71b29b37 | 87 | i = data; |
gcibeira | 0:be8d71b29b37 | 88 | aux = (i>>4)*10; |
gcibeira | 0:be8d71b29b37 | 89 | aux += (i & 0x0F); |
gcibeira | 0:be8d71b29b37 | 90 | |
gcibeira | 0:be8d71b29b37 | 91 | return aux; |
gcibeira | 0:be8d71b29b37 | 92 | } |
gcibeira | 0:be8d71b29b37 | 93 | |
gcibeira | 0:be8d71b29b37 | 94 | void ds1302::set_datetime(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min) |
gcibeira | 0:be8d71b29b37 | 95 | { |
gcibeira | 0:be8d71b29b37 | 96 | write(0x86,get_bcd(day)); |
gcibeira | 0:be8d71b29b37 | 97 | write(0x88,get_bcd(mth)); |
gcibeira | 0:be8d71b29b37 | 98 | write(0x8c,get_bcd(year)); |
gcibeira | 0:be8d71b29b37 | 99 | write(0x8a,get_bcd(dow)); |
gcibeira | 0:be8d71b29b37 | 100 | write(0x84,get_bcd(hr)); |
gcibeira | 0:be8d71b29b37 | 101 | write(0x82,get_bcd(min)); |
gcibeira | 0:be8d71b29b37 | 102 | write(0x80,get_bcd(0)); |
gcibeira | 0:be8d71b29b37 | 103 | } |
gcibeira | 0:be8d71b29b37 | 104 | |
gcibeira | 0:be8d71b29b37 | 105 | void ds1302::get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow) |
gcibeira | 0:be8d71b29b37 | 106 | { |
gcibeira | 0:be8d71b29b37 | 107 | day = rm_bcd(read(0x87)); |
gcibeira | 0:be8d71b29b37 | 108 | mth = rm_bcd(read(0x89)); |
gcibeira | 0:be8d71b29b37 | 109 | year = rm_bcd(read(0x8d)); |
gcibeira | 0:be8d71b29b37 | 110 | dow = rm_bcd(read(0x8b)); |
gcibeira | 0:be8d71b29b37 | 111 | } |
gcibeira | 0:be8d71b29b37 | 112 | |
gcibeira | 0:be8d71b29b37 | 113 | void ds1302::get_time(BYTE &hr, BYTE &min, BYTE &sec) |
gcibeira | 0:be8d71b29b37 | 114 | { |
gcibeira | 0:be8d71b29b37 | 115 | hr = rm_bcd(read(0x85)); |
gcibeira | 0:be8d71b29b37 | 116 | min = rm_bcd(read(0x83)); |
gcibeira | 0:be8d71b29b37 | 117 | sec = rm_bcd(read(0x81)); |
gcibeira | 0:be8d71b29b37 | 118 | } |
gcibeira | 0:be8d71b29b37 | 119 | |
gcibeira | 0:be8d71b29b37 | 120 | void ds1302::write_nvr(BYTE address, BYTE data) |
gcibeira | 0:be8d71b29b37 | 121 | { |
gcibeira | 0:be8d71b29b37 | 122 | write(address|0xc0,data); |
gcibeira | 0:be8d71b29b37 | 123 | } |
gcibeira | 0:be8d71b29b37 | 124 | |
gcibeira | 0:be8d71b29b37 | 125 | BYTE ds1302::read_nvr(BYTE address) |
gcibeira | 0:be8d71b29b37 | 126 | { |
gcibeira | 0:be8d71b29b37 | 127 | return(read(address|0xc1)); |
gcibeira | 0:be8d71b29b37 | 128 | } |