1 | #include <avr/io.h>
|
2 | #include <util/twi.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <avr/signal.h>
|
5 |
|
6 | #define DS1307ADR 104
|
7 |
|
8 |
|
9 | void usart_init(void)
|
10 | {
|
11 | UCSRB = (1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
|
12 | UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8N1
|
13 | UBRRL = 103; //9600 Baud bei 16MHz
|
14 | }
|
15 |
|
16 | void usart_txchar(uint8_t byte)
|
17 | {
|
18 | while(!(UCSRA & (1 << UDRE)));
|
19 | UDR=byte;
|
20 | }
|
21 |
|
22 | void usart_txstr(char *str)
|
23 | {
|
24 | while(*str)
|
25 | {
|
26 | usart_txchar(*str);
|
27 | str++;
|
28 | }
|
29 | usart_txchar(10);
|
30 | usart_txchar(13);
|
31 | }
|
32 |
|
33 | void twi_error()
|
34 | {
|
35 | usart_txstr("TWI-Fehler erkannt");
|
36 |
|
37 | }
|
38 |
|
39 | void twi_init(void)
|
40 | {
|
41 |
|
42 | TWSR = 0x00;
|
43 | //TWSR |= (1 << TWPS1) | (1 << TWPS0); Prescaler=1
|
44 | TWBR = 152; // SCL=50KHz @ 16 MHz
|
45 | //TWCR |= (1 << TWEN); //TWI aktivieren
|
46 |
|
47 | }
|
48 |
|
49 | void twi_start(void)
|
50 | {
|
51 |
|
52 | TWCR = (1 << TWSTA) | (1 << TWEN) | (1 << TWINT);
|
53 | while(!(TWCR & (1 << TWINT)));
|
54 | if((TWSR & TW_STATUS) != TW_START)
|
55 | {
|
56 | usart_txstr("Fehler beim Senden der Start-Condition");
|
57 | usart_txchar(TWSR);
|
58 | }
|
59 | }
|
60 |
|
61 | void twi_writeadr(uint8_t adr, uint8_t wr) //W=0 R= alles außer 0
|
62 | {
|
63 |
|
64 | adr=(DS1307ADR << 1);
|
65 | if(wr)
|
66 | adr |= 1; //Beim lesen SLA+R übertragen ansonsten LSB auf 0 lassen (SLA+W)
|
67 | TWDR=adr;
|
68 | TWCR = (1 << TWEN) | (1 << TWINT);
|
69 | while(!(TWCR & (1 << TWINT)));
|
70 | if ((adr & 1) && ((TWSR & TW_STATUS) != TW_MR_SLA_ACK))
|
71 | usart_txstr("Fehler beim Senden der Adresse");
|
72 | if (!(adr & 1) && ((TWSR & TW_STATUS) != TW_MT_SLA_ACK))
|
73 | usart_txstr("Fehler beim Senden der Adresse");
|
74 |
|
75 | }
|
76 |
|
77 | void twi_writedata(uint8_t data)
|
78 | {
|
79 |
|
80 | TWDR=data;
|
81 | TWCR = (1 << TWEN) | (1 << TWINT);
|
82 | while(!(TWCR & (1 << TWINT)));
|
83 | if((TWSR & TW_STATUS) != TW_MT_DATA_ACK)
|
84 | usart_txstr("Fehler beim Senden der Daten");
|
85 | }
|
86 |
|
87 | uint8_t twi_readdata(void)
|
88 | {
|
89 | uint8_t data;
|
90 |
|
91 | TWCR = (1 << TWEN) | (1 << TWINT);
|
92 | while(!(TWCR & (1 << TWINT)));
|
93 | data = TWDR;
|
94 | return data;
|
95 |
|
96 | }
|
97 |
|
98 | void twi_stop(void)
|
99 | {
|
100 |
|
101 | TWCR = (1 << TWEN) | (1 << TWSTO) | (1 << TWINT);
|
102 | while(TWCR & (1 << TWSTO));
|
103 |
|
104 |
|
105 | }
|
106 |
|
107 | void ds1307_writereg(uint8_t adr,uint8_t data)
|
108 | {
|
109 | twi_start();
|
110 | twi_writeadr(DS1307ADR,TW_WRITE);
|
111 | twi_writedata(adr);
|
112 | twi_writedata(data);
|
113 | twi_stop();
|
114 | }
|
115 |
|
116 |
|
117 |
|
118 | uint8_t ds1307_readreg(uint8_t adr)
|
119 | {
|
120 | uint8_t data;
|
121 |
|
122 | twi_start();
|
123 | twi_writeadr(DS1307ADR,TW_WRITE);
|
124 | twi_writedata(adr);
|
125 | twi_stop();
|
126 | twi_start();
|
127 | twi_writeadr(DS1307ADR,TW_READ);
|
128 | data=twi_readdata();
|
129 | twi_stop();
|
130 | return data;
|
131 | }
|
132 |
|
133 | void main(void)
|
134 | {
|
135 | usart_init();
|
136 | twi_init();
|
137 |
|
138 | twi_start();
|
139 | twi_writeadr(DS1307ADR,TW_WRITE);
|
140 | twi_writedata(0); //Register-Pointer
|
141 | twi_writedata(0); //sec
|
142 | twi_writedata(0x50); //Minuten
|
143 | twi_writedata(0x16); //Stunden
|
144 | twi_writedata(1); //Tag
|
145 | twi_writedata(1); //Datum
|
146 | twi_writedata(1); //Monat
|
147 | twi_writedata(1); //Jahr
|
148 | twi_writedata(0x11);//Control
|
149 | twi_stop();
|
150 | twi_start();
|
151 | twi_writeadr(DS1307ADR,TW_WRITE);
|
152 | twi_writedata(0);
|
153 | twi_writedata(1);
|
154 | twi_stop();
|
155 |
|
156 | sei();
|
157 |
|
158 | while(1);
|
159 |
|
160 | }
|
161 |
|
162 | void ds1307_gettime(void)
|
163 | {
|
164 | uint8_t seconds,minutes,hours;
|
165 |
|
166 | seconds = ds1307_readreg(0);
|
167 | minutes = ds1307_readreg(1);
|
168 | hours = ds1307_readreg(3);
|
169 |
|
170 | seconds &= ~128;
|
171 | usart_txchar((hours >> 4)+0x30);
|
172 | usart_txchar((hours & 0x0f)+0x30);
|
173 | usart_txchar(':');
|
174 | usart_txchar((minutes >> 4)+0x30);
|
175 | usart_txchar((minutes & 0x0f)+0x30);
|
176 | usart_txchar(':');
|
177 | usart_txchar((seconds >> 4)+0x30);
|
178 | usart_txchar((seconds & 0x0f)+0x30);
|
179 | usart_txchar(10);
|
180 | usart_txchar(13);
|
181 | }
|
182 |
|
183 |
|
184 | SIGNAL (SIG_USART_RECV)
|
185 | {
|
186 | uint8_t dummy;
|
187 |
|
188 | dummy=UDR;
|
189 | ds1307_gettime();
|
190 |
|
191 | }
|