1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 | #include "i2cmaster.h"
|
4 | #include "rtc.h"
|
5 |
|
6 | //Integer zu BCD Converter
|
7 | void rtc_init(void){
|
8 | rtc_writetimercontrol(0b10000010);
|
9 | rtc_writecontrol2(0b00010001);
|
10 |
|
11 | //INT0 Interrupt initialisieren
|
12 |
|
13 | }
|
14 | uint8_t itobcd(uint8_t i)
|
15 | {
|
16 | uint8_t lo, hi = 0;
|
17 |
|
18 | //Fehler mit unmoeglicher Zahl "von aussen" erkennbar machen
|
19 | if(i > 99)
|
20 | return(0xFF);
|
21 |
|
22 | //Division, entspricht "hi = i/10;"
|
23 | while (i > 9)
|
24 | {
|
25 | hi++;
|
26 | i -= 10;
|
27 | }
|
28 |
|
29 | //Der Rest der Division ist noch in "i", das ist der lo-Anteil
|
30 | //Der Compiler wird die Variable "lo" wegoptimieren
|
31 | lo = i;
|
32 |
|
33 | return((hi << 4) | lo);
|
34 | }
|
35 | /*
|
36 |
|
37 | Auslesen der Register für Sekunde,Minute,Stunde,Tag,Monat,Jahr & Wochentag
|
38 |
|
39 | */
|
40 |
|
41 | int rtc_readsek(void){
|
42 | int read;
|
43 | int sek;
|
44 | i2c_start(RTC_ADRESS_WRITE);
|
45 | i2c_write(RTC_SECONDS);
|
46 | i2c_rep_start(RTC_ADRESS_READ);
|
47 | read=i2c_readNak();
|
48 | i2c_stop();
|
49 | sek = (((read & 0x70) >> 4)*10)+(read & 0x0F);
|
50 |
|
51 | return sek;
|
52 | }
|
53 |
|
54 | int rtc_readmin(void){
|
55 | int read;
|
56 | int min;
|
57 | i2c_start(RTC_ADRESS_WRITE);
|
58 | i2c_write(RTC_MINUTES);
|
59 | i2c_rep_start(RTC_ADRESS_READ);
|
60 | read=i2c_readNak();
|
61 | i2c_stop();
|
62 | min = (((read & 0x70) >> 4)*10)+(read & 0x0F);
|
63 |
|
64 | return min;
|
65 | }
|
66 |
|
67 | int rtc_readhour(void){
|
68 | int read;
|
69 | int hour;
|
70 | i2c_start(RTC_ADRESS_WRITE);
|
71 | i2c_write(RTC_HOURS);
|
72 | i2c_rep_start(RTC_ADRESS_READ);
|
73 | read=i2c_readNak();
|
74 | i2c_stop();
|
75 | hour = (((read & 0x30) >> 4)*10)+(read & 0x0F); // NOCH BEARBEITEN STUNDENREGISTER IST ANDERS AUFGEBAUT ALS SEKUNDEN MINUTEN UND STUNDEN
|
76 |
|
77 | return hour;
|
78 | }
|
79 |
|
80 | int rtc_readday(void){
|
81 | int read;
|
82 | int day;
|
83 | i2c_start(RTC_ADRESS_WRITE);
|
84 | i2c_write(RTC_DAYS);
|
85 | i2c_rep_start(RTC_ADRESS_READ);
|
86 | read=i2c_readNak();
|
87 | i2c_stop();
|
88 | day = (((read & 0x30) >> 4)*10)+(read & 0x0F); // NOCH BEARBEITEN STUNDENREGISTER IST ANDERS AUFGEBAUT ALS SEKUNDEN MINUTEN UND STUNDEN
|
89 |
|
90 | return day;
|
91 | }
|
92 |
|
93 | int rtc_readweekday(void){
|
94 | int read;
|
95 | int weekday;
|
96 | i2c_start(RTC_ADRESS_WRITE);
|
97 | i2c_write(RTC_WEEKDAYS);
|
98 | i2c_rep_start(RTC_ADRESS_READ);
|
99 | read=i2c_readNak();
|
100 | i2c_stop();
|
101 | weekday = (read & 0x07);
|
102 |
|
103 | return weekday;
|
104 |
|
105 | }
|
106 | int rtc_readyear(void){
|
107 | int read;
|
108 | int year;
|
109 | i2c_start(RTC_ADRESS_WRITE);
|
110 | i2c_write(RTC_YEARS);
|
111 | i2c_rep_start(RTC_ADRESS_READ);
|
112 | read=i2c_readNak();
|
113 | i2c_stop();
|
114 | year = (((read & 0x70) >> 4)*10)+(read & 0x0F);
|
115 |
|
116 | return year;
|
117 | }
|
118 |
|
119 | int rtc_readmonth(void){
|
120 | int read;
|
121 | int month;
|
122 | i2c_start(RTC_ADRESS_WRITE);
|
123 | i2c_write(RTC_MONTH_CENTURY);
|
124 | i2c_rep_start(RTC_ADRESS_READ);
|
125 | read=i2c_readNak();
|
126 | i2c_stop();
|
127 | month = (read & 0x1F);
|
128 |
|
129 | return month;
|
130 |
|
131 | }
|
132 |
|
133 | /*
|
134 |
|
135 | Beschreiben der Register des RTC
|
136 |
|
137 | */
|
138 |
|
139 | void rtc_writecontrol1(int input){
|
140 | i2c_start(RTC_ADRESS_WRITE);
|
141 | i2c_write(RTC_CONTROL_STATUS1);
|
142 | i2c_write(input);
|
143 | i2c_stop();
|
144 | }
|
145 |
|
146 | void rtc_writecontrol2(int input){
|
147 | i2c_start(RTC_ADRESS_WRITE);
|
148 | i2c_write(RTC_CONTROL_STATUS2);
|
149 | i2c_write(input);
|
150 | i2c_stop();
|
151 | }
|
152 |
|
153 | void rtc_writeweekdays(int input){
|
154 | i2c_start(RTC_ADRESS_WRITE);
|
155 | i2c_write(RTC_WEEKDAYS);
|
156 | i2c_write(input);
|
157 | i2c_stop();
|
158 | }
|
159 |
|
160 | void rtc_writesek(int input){
|
161 | i2c_start(RTC_ADRESS_WRITE);
|
162 | i2c_write(RTC_SECONDS);
|
163 | i2c_write(itobcd(input));
|
164 | i2c_stop();
|
165 | }
|
166 |
|
167 | void rtc_writemin(int input){
|
168 | i2c_start(RTC_ADRESS_WRITE);
|
169 | i2c_write(RTC_MINUTES);
|
170 | i2c_write(itobcd(input));
|
171 | i2c_stop();
|
172 | }
|
173 |
|
174 | void rtc_writehour(int input){
|
175 | i2c_start(RTC_ADRESS_WRITE);
|
176 | i2c_write(RTC_HOURS);
|
177 | i2c_write(itobcd(input));
|
178 | i2c_stop();
|
179 | }
|
180 |
|
181 | void rtc_writeday(int input){
|
182 | i2c_start(RTC_ADRESS_WRITE);
|
183 | i2c_write(RTC_DAYS);
|
184 | i2c_write(itobcd(input));
|
185 | i2c_stop();
|
186 | }
|
187 | void rtc_writeyear(int input){
|
188 | i2c_start(RTC_ADRESS_WRITE);
|
189 | i2c_write(RTC_YEARS);
|
190 | i2c_write(itobcd(input));
|
191 | i2c_stop();
|
192 | }
|
193 |
|
194 | void rtc_writemonth(int input){
|
195 | i2c_start(RTC_ADRESS_WRITE);
|
196 | i2c_write(RTC_MONTH_CENTURY);
|
197 | i2c_write(input);
|
198 | i2c_stop();
|
199 | }
|
200 |
|
201 | void rtc_writeminutealarm(int enable,int input){
|
202 | int minalarm;
|
203 | minalarm = ((enable<<7) | itobcd(input));
|
204 | i2c_start(RTC_ADRESS_WRITE);
|
205 | i2c_write(RTC_MINUTE_ALARM);
|
206 | i2c_write(minalarm);
|
207 | i2c_stop();
|
208 | }
|
209 |
|
210 | void rtc_writehouralarm(int enable,int input){
|
211 | int houralarm;
|
212 | houralarm = ((enable<<7) | itobcd(input));
|
213 | i2c_start(RTC_ADRESS_WRITE);
|
214 | i2c_write(RTC_HOUR_ALARM);
|
215 | i2c_write(houralarm);
|
216 | i2c_stop();
|
217 | }
|
218 |
|
219 | void rtc_writedayalarm(int enable,int input){
|
220 | int dayalarm;
|
221 | dayalarm = ((enable<<7) | itobcd(input));
|
222 | i2c_start(RTC_ADRESS_WRITE);
|
223 | i2c_write(RTC_DAYALARM);
|
224 | i2c_write(dayalarm);
|
225 | i2c_stop();
|
226 | }
|
227 |
|
228 | void rtc_writeweekdayalarm(int enable,int input){
|
229 | int weekdayalarm;
|
230 | weekdayalarm = ((enable<<7) | itobcd(input));
|
231 | i2c_start(RTC_ADRESS_WRITE);
|
232 | i2c_write(RTC_WEEKDAY_ALARM);
|
233 | i2c_write(weekdayalarm);
|
234 | i2c_stop();
|
235 | }
|
236 |
|
237 | void rtc_writeclkout(int input){
|
238 | i2c_start(RTC_ADRESS_WRITE);
|
239 | i2c_write(RTC_CLKOUT_FREQUENCY);
|
240 | i2c_write(input);
|
241 | i2c_stop();
|
242 | }
|
243 |
|
244 | void rtc_writetimercontrol(int input){
|
245 | i2c_start(RTC_ADRESS_WRITE);
|
246 | i2c_write(RTC_TIMER_CONTROL);
|
247 | i2c_write(input);
|
248 | i2c_stop();
|
249 | }
|
250 |
|
251 | void rtc_writetimer(int input){
|
252 | i2c_start(RTC_ADRESS_WRITE);
|
253 | i2c_write(RTC_TIMER);
|
254 | i2c_write(input);
|
255 | i2c_stop();
|
256 | }
|