/elec/propeller-clock

To get this branch, use:
bzr branch http://bzr.ed.am/elec/propeller-clock

« back to all changes in this revision

Viewing changes to test/rtc-test/util/DS1307.cpp

  • Committer: Tim Marston
  • Date: 2012-03-10 12:31:16 UTC
  • Revision ID: tim@ed.am-20120310123116-l348p5btgecmdj1q
added realtime clock test

Show diffs side-by-side

added added

removed removed

 
1
#include <../Wire/Wire.h>
 
2
#include "DS1307.h"
 
3
 
 
4
DS1307::DS1307()
 
5
{
 
6
  Wire.begin();
 
7
}
 
8
 
 
9
DS1307 RTC=DS1307();
 
10
 
 
11
// PRIVATE FUNCTIONS
 
12
 
 
13
// Aquire data from the RTC chip in BCD format
 
14
// refresh the buffer
 
15
void DS1307::read(void)
 
16
{
 
17
  // use the Wire lib to connect to tho rtc
 
18
  // reset the resgiter pointer to zero
 
19
  Wire.beginTransmission(DS1307_CTRL_ID);
 
20
  Wire.write( (unsigned char )0 );
 
21
  Wire.endTransmission();
 
22
 
 
23
  // request the 7 bytes of data (secs, min, hr, dow, day, mth, yr)
 
24
  Wire.requestFrom(DS1307_CTRL_ID, 7);
 
25
  for(int i=0; i<7; i++)
 
26
  {
 
27
    // store data in raw bcd format
 
28
    rtc_bcd[i]=Wire.read();
 
29
  }
 
30
}
 
31
 
 
32
// update the data on the IC from the bcd formatted data in the buffer
 
33
void DS1307::save(void)
 
34
{
 
35
  Wire.beginTransmission(DS1307_CTRL_ID);
 
36
  Wire.write( (unsigned char)0 ); // reset register pointer
 
37
  for(int i=0; i<7; i++)
 
38
  {
 
39
    Wire.write(rtc_bcd[i]);
 
40
  }
 
41
  Wire.endTransmission();
 
42
}
 
43
 
 
44
 
 
45
// PUBLIC FUNCTIONS
 
46
void DS1307::get(int *rtc, boolean refresh)   // Aquire data from buffer and convert to int, refresh buffer if required
 
47
{
 
48
  if(refresh) read();
 
49
  for(int i=0;i<7;i++)  // cycle through each component, create array of data
 
50
  {
 
51
        rtc[i]=get(i, 0);
 
52
  }
 
53
}
 
54
 
 
55
int DS1307::get(int c, boolean refresh)  // aquire individual RTC item from buffer, return as int, refresh buffer if required
 
56
{
 
57
  if(refresh) read();
 
58
  int v=-1;
 
59
  switch(c)
 
60
  {
 
61
  case DS1307_SEC:
 
62
    v=(10*((rtc_bcd[DS1307_SEC] & DS1307_HI_SEC)>>4))+(rtc_bcd[DS1307_SEC] & DS1307_LO_BCD);
 
63
        break;
 
64
  case DS1307_MIN:
 
65
    v=(10*((rtc_bcd[DS1307_MIN] & DS1307_HI_MIN)>>4))+(rtc_bcd[DS1307_MIN] & DS1307_LO_BCD);
 
66
        break;
 
67
  case DS1307_HR:
 
68
    v=(10*((rtc_bcd[DS1307_HR] & DS1307_HI_HR)>>4))+(rtc_bcd[DS1307_HR] & DS1307_LO_BCD);
 
69
        break;
 
70
  case DS1307_DOW:
 
71
    v=rtc_bcd[DS1307_DOW] & DS1307_LO_DOW;
 
72
        break;
 
73
  case DS1307_DAY:
 
74
    v=(10*((rtc_bcd[DS1307_DAY] & DS1307_HI_DAY)>>4))+(rtc_bcd[DS1307_DAY] & DS1307_LO_BCD);
 
75
        break;
 
76
  case DS1307_MTH:
 
77
    v=(10*((rtc_bcd[DS1307_MTH] & DS1307_HI_MTH)>>4))+(rtc_bcd[DS1307_MTH] & DS1307_LO_BCD);
 
78
        break;
 
79
  case DS1307_YR:
 
80
    v=(10*((rtc_bcd[DS1307_YR] & DS1307_HI_YR)>>4))+(rtc_bcd[DS1307_YR] & DS1307_LO_BCD)+DS1307_BASE_YR;
 
81
        break;
 
82
  } // end switch
 
83
  return v;
 
84
}
 
85
 
 
86
void DS1307::set(int c, int v)  // Update buffer, then update the chip
 
87
{
 
88
  switch(c)
 
89
  {
 
90
  case DS1307_SEC:
 
91
    if(v<60 && v>-1)
 
92
    {
 
93
        //preserve existing clock state (running/stopped)
 
94
        int state=rtc_bcd[DS1307_SEC] & DS1307_CLOCKHALT;
 
95
        rtc_bcd[DS1307_SEC]=state | (((v / 10)<<4) + (v % 10));
 
96
    }
 
97
    break;
 
98
  case DS1307_MIN:
 
99
    if(v<60 && v>-1)
 
100
    {
 
101
        rtc_bcd[DS1307_MIN]=((v / 10)<<4) + (v % 10);
 
102
    }
 
103
    break;
 
104
  case DS1307_HR:
 
105
  // TODO : AM/PM  12HR/24HR
 
106
    if(v<24 && v>-1)
 
107
    {
 
108
        rtc_bcd[DS1307_HR]=((v / 10)<<4) + (v % 10);
 
109
    }
 
110
    break;
 
111
  case DS1307_DOW:
 
112
    if(v<8 && v>-1)
 
113
    {
 
114
        rtc_bcd[DS1307_DOW]=v;
 
115
    }
 
116
    break;
 
117
  case DS1307_DAY:
 
118
    if(v<31 && v>-1)
 
119
    {
 
120
        rtc_bcd[DS1307_DAY]=((v / 10)<<4) + (v % 10);
 
121
    }
 
122
    break;
 
123
  case DS1307_MTH:
 
124
    if(v<13 && v>-1)
 
125
    {
 
126
        rtc_bcd[DS1307_MTH]=((v / 10)<<4) + (v % 10);
 
127
    }
 
128
    break;
 
129
  case DS1307_YR:
 
130
    if(v<13 && v>-1)
 
131
    {
 
132
        rtc_bcd[DS1307_YR]=((v / 10)<<4) + (v % 10);
 
133
    }
 
134
    break;
 
135
  } // end switch
 
136
  save();
 
137
}
 
138
 
 
139
void DS1307::stop(void)
 
140
{
 
141
        // set the ClockHalt bit high to stop the rtc
 
142
        // this bit is part of the seconds byte
 
143
    rtc_bcd[DS1307_SEC]=rtc_bcd[DS1307_SEC] | DS1307_CLOCKHALT;
 
144
    save();
 
145
}
 
146
 
 
147
void DS1307::start(void)
 
148
{
 
149
        // unset the ClockHalt bit to start the rtc
 
150
        // this bit is part of the seconds byte
 
151
    rtc_bcd[DS1307_SEC]=rtc_bcd[DS1307_SEC] & ~DS1307_CLOCKHALT;
 
152
        save();
 
153
}