1 | #include <avr/io.h>
|
2 | // #include <util/twi.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include "DS1307.h"
|
5 |
|
6 |
|
7 |
|
8 | void twi_error()
|
9 | {
|
10 | uart_puts("TWI Fehler erkannt\n\r");
|
11 |
|
12 | }
|
13 |
|
14 | void twi_init(void)
|
15 | {
|
16 |
|
17 | TWSR = 0x00;
|
18 | //TWSR |= (1 << TWPS1) | (1 << TWPS0); Prescaler=1
|
19 | TWBR = 152; // SCL=50KHz @ 16 MHz
|
20 | TWCR |= (1 << TWEN); //TWI aktivieren
|
21 |
|
22 | }
|
23 |
|
24 | void twi_start(void)
|
25 | {
|
26 |
|
27 | TWCR = (1 << TWSTA) | (1 << TWEN) | (1 << TWINT);
|
28 | while(!(TWCR & (1 << TWINT)));
|
29 | if((TWSR & TW_STATUS) != TW_START)
|
30 | {
|
31 | uart_puts("Fehler beim Senden der Start-Condition\n\r");
|
32 | uart_putc(TWSR);
|
33 | }
|
34 | }
|
35 |
|
36 | void twi_writeadr(uint8_t adr, uint8_t wr) //W=0 R= alles außer 0
|
37 | {
|
38 |
|
39 | adr=(DS1307ADR << 1);
|
40 | if(wr)
|
41 | adr |= 1; //Beim lesen SLA+R übertragen ansonsten LSB auf 0 lassen (SLA+W)
|
42 | TWDR=adr;
|
43 | TWCR = (1 << TWEN) | (1 << TWINT);
|
44 | while(!(TWCR & (1 << TWINT)));
|
45 | if ((adr & 1) && ((TWSR & TW_STATUS) != TW_MR_SLA_ACK))
|
46 | uart_puts("Fehler beim Senden der Adresse\n\r");
|
47 | if (!(adr & 1) && ((TWSR & TW_STATUS) != TW_MT_SLA_ACK))
|
48 | uart_puts("Fehler beim Senden der Adresse\n\r");
|
49 |
|
50 | }
|
51 |
|
52 | void twi_writedata(uint8_t data)
|
53 | {
|
54 |
|
55 | TWDR=data;
|
56 | TWCR = (1 << TWEN) | (1 << TWINT);
|
57 | while(!(TWCR & (1 << TWINT)));
|
58 | if((TWSR & TW_STATUS) != TW_MT_DATA_ACK)
|
59 | uart_puts("Fehler beim Senden der Daten\n\r");
|
60 | }
|
61 |
|
62 | uint8_t twi_readdata(void)
|
63 | {
|
64 | uint8_t data;
|
65 |
|
66 | TWCR = (1 << TWEN) | (1 << TWINT);
|
67 | while(!(TWCR & (1 << TWINT)));
|
68 | data = TWDR;
|
69 | return data;
|
70 |
|
71 | }
|
72 |
|
73 | void twi_stop(void)
|
74 | {
|
75 |
|
76 | TWCR = (1 << TWEN) | (1 << TWSTO) | (1 << TWINT);
|
77 | while(TWCR & (1 << TWSTO))
|
78 | ;
|
79 |
|
80 |
|
81 | }
|
82 |
|
83 | void ds1307_writereg(uint8_t adr,uint8_t data)
|
84 | {
|
85 | twi_start();
|
86 | twi_writeadr(DS1307ADR,TW_WRITE);
|
87 | twi_writedata(adr);
|
88 | twi_writedata(data);
|
89 | twi_stop();
|
90 | }
|
91 |
|
92 |
|
93 |
|
94 | uint8_t ds1307_readreg(uint8_t adr)
|
95 | {
|
96 | uint8_t data;
|
97 |
|
98 | twi_start();
|
99 | twi_writeadr(DS1307ADR,TW_WRITE);
|
100 | twi_writedata(adr);
|
101 | twi_stop();
|
102 | twi_start();
|
103 | twi_writeadr(DS1307ADR,TW_READ);
|
104 | data=twi_readdata();
|
105 | twi_stop();
|
106 | return data;
|
107 | }
|
108 |
|
109 |
|
110 | void ds1307_gettime(void)
|
111 | {
|
112 | uint8_t seconds,minutes,hours;
|
113 | uint8_t day, date, month, year;
|
114 |
|
115 | seconds = ds1307_readreg(0);
|
116 | minutes = ds1307_readreg(1);
|
117 | hours = ds1307_readreg(2);
|
118 | day = ds1307_readreg(3);
|
119 | date = ds1307_readreg(4);
|
120 | month = ds1307_readreg(5);
|
121 | year = ds1307_readreg(6);
|
122 |
|
123 | day = ds1307_readreg(3);
|
124 | date = ds1307_readreg(4);
|
125 | month = ds1307_readreg(5);
|
126 | year = ds1307_readreg(6);
|
127 |
|
128 | seconds &= ~128;
|
129 | uart_putc(((hours >> 4) & 0x01) + 0x30);
|
130 | uart_putc((hours & 0x0F) + 0x30);
|
131 | uart_putc(':');
|
132 | uart_putc((minutes >> 4) + 0x30);
|
133 | uart_putc((minutes & 0x0F) + 0x30);
|
134 | uart_putc(':');
|
135 | uart_putc((seconds >> 4) + 0x30);
|
136 | uart_putc((seconds & 0x0F) + 0x30);
|
137 |
|
138 | uart_puts(" -");
|
139 |
|
140 | switch(day)
|
141 | {
|
142 | case 1:
|
143 | uart_puts("Montag, d.");
|
144 | break;
|
145 |
|
146 | case 2:
|
147 | uart_puts("Dienstag, d.");
|
148 | break;
|
149 |
|
150 | case 3:
|
151 | uart_puts("Mittwoch, d.");
|
152 | break;
|
153 |
|
154 | case 4:
|
155 | uart_puts("Donnerstag, d.");
|
156 | break;
|
157 |
|
158 | case 5:
|
159 | uart_puts("Freitag, d.");
|
160 | break;
|
161 |
|
162 | case 6:
|
163 | uart_puts("Samstag, d.");
|
164 | break;
|
165 |
|
166 | case 7:
|
167 | uart_puts("Sonntag, d.");
|
168 | break;
|
169 |
|
170 | }
|
171 |
|
172 | // tag
|
173 | uart_putc((day >> 4) + 0x30);
|
174 | uart_putc((day & 0x0F) + 0x30);
|
175 | uart_putc(':');
|
176 |
|
177 | // monat
|
178 | uart_putc((month >> 4) + 0x30);
|
179 | uart_putc((month & 0x0F) + 0x30);
|
180 | uart_putc(':');
|
181 |
|
182 | // jahr
|
183 | uart_putc((year >> 4) + 0x30);
|
184 | uart_putc((year & 0xF0) + 0x30);
|
185 |
|
186 |
|
187 | uart_putc(10);
|
188 | uart_putc(13);
|
189 | }
|