DS1307.c


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
}