ds1307.c


1
/*******************************************************************************
2
   __________
3
  |  _       |
4
  | | |      |
5
  | | |-KISS |
6
  | | |____  |  L-Kiss: Keep It Simple! - Stupid! :-))
7
  | |______| |  (c) 2007 by ELEb 2003
8
  |__________|
9
10
  Projectname:  ds1307
11
12
  Filename:     ds1307.c
13
  Author:       P.Berger
14
  Version:      1.0
15
  Date:         16.09.2009 15:19:13
16
17
  Function:     
18
  
19
20
*******************************************************************************/
21
22
// Einbinden von bestehenden Modulen
23
#include <kiss.h>                                //ATMega32 Register
24
#include <I2C.h>                            //I2C Headerfile vom LKiss
25
#include <rs232.h>                            //RS232 Definitionen
26
#include <avr/iom32.h>                          //ATmega32 IO Definition
27
#include <avr/interrupt.h>                        //Interrupt Register
28
29
//------------------------------------------------------------------------------
30
// Definitionen
31
#define waitAktion 0                          //RS232 Cases
32
#define waitSEC 1
33
#define waitMIN 2
34
#define waitH 3
35
#define waitDATE 4
36
#define waitDAY 5
37
#define waitMOUNTH 6
38
#define waitYEAR 7
39
40
#define Montag 1                            //Wochentage
41
#define Dienstag 2
42
#define Mittwoch 3
43
#define Donnerstag 4
44
#define Freitag 5
45
#define Samstag 6
46
#define Sonntag 7
47
48
#define RTC_Adresse 0xD0                        //DS1307 I2C 
49
#define Read 0x00
50
#define Write 0x01
51
#define received 0x02
52
#define ACK 1
53
#define NAK 0
54
55
#define Buf_max 9                            //grösste Bufferstelle
56
#define F_CPU 8000000                          
57
#define BAUDRATE 19200
58
//------------------------------------------------------------------------------
59
// Variablen
60
int Comand = 0;
61
int Sekunden = 0;                            //Datum's und Zeitvariablen
62
int Minuten = 0;
63
int Stunden = 0;
64
int Wochentag = 0;
65
int Datum = 0;
66
int Monat = 0;
67
int Jahr = 0;
68
69
static volatile int RX_buffer[10];                    //RS232 Receive Buffer
70
static volatile int index_rxBuf_W = 0;                  //Index wo RXBuffer zuletzt geschrieben wurde
71
static volatile int index_rxBuf_R = 0;                  //Index wo RXBuffer zuletzt gelesen wurde
72
73
//------------------------------------------------------------------------------
74
// Funktionen
75
void SysInit(void){
76
  int i = 0;
77
  kiss_init();
78
  DDRD |= (1<<6)|(1<<7);
79
  DDRB = 0xFF;
80
  i2c_init();
81
  rs232_init(19200,8000000);                      //RS232 Initialisieren
82
83
  TCCR1A |= (1<<WGM12);                        //Modus CTC
84
  TCCR1B |= (1<<CS12);                        //Presc. 256
85
  OCR1AH = 0x7A;                            //alle Sec ein Interrupt
86
  OCR1AL = 0x12;
87
  
88
  for(i=0;i<=9;i++){
89
    RX_buffer[i] = 0;
90
  }
91
  
92
  sei();                                // General Interrupts enabled
93
}
94
void RS232(void){
95
  static int rs232_status = 0;                    //Status bei der Kommunikation    
96
  if(index_rxBuf_W == index_rxBuf_R){                  //Buffer Error abgleichen
97
    return;                              //Wenn Error => aus Funktion heraus springen
98
  }
99
  if(index_rxBuf_R == Buf_max){
100
    index_rxBuf_R = 0;
101
  }
102
  else{
103
    index_rxBuf_R ++;
104
  }
105
  switch(rs232_status){  
106
    case waitAktion:
107
      switch(RX_buffer[index_rxBuf_R]){              //Comands 
108
        case '?':
109
          printf("rtc_ds1307\n\n");              //Systemname
110
          printf("?\tAnzeige Implementierter Tokens\n");    //Anzeige Implementierter Tokens
111
          printf("{\tPING\n");                //PING
112
          printf("}\tPONG\n");                //PONG
113
          printf("@\tSystemname\n");              //System Name 
114
          printf("[\tSystemLED rot ein\n");          //SystemLED rot ein
115
          printf("]\tSystemLED grün ein\n");          //SystemLED grün ein
116
          printf("!\tSystemLED’s grün und rot aus\n");    //SystemLED’s grün und rot aus
117
          printf("*\tSendet Zeit und Datum\n");        //Sendet Zeit und Datum
118
          printf("$\tZeit und Datum setzen\n");        //Zeit und Datum setzen  
119
          printf("+\tRTC initialisieren\n\n");  ////////////RTC initialisieren
120
          printf("Berger Patrick\n\n");            //Verfasser
121
          break;
122
        case '{':                        //Ping Pong
123
          printf("}\n");
124
          break;
125
        case '@':                        //Projektname
126
          printf("rtc_ds1307\r\n");
127
          break;
128
        case '[':                        //LED Rot ein
129
          bitset(PORTD,7);
130
          bitclr(PORTD,6);
131
          break;
132
        case ']':                        //LED Grün ein
133
          bitset(PORTD,6);
134
          bitclr(PORTD,7);
135
          break;
136
        case '!':                        //LEDs aus
137
          bitclr(PORTD,7);
138
          bitclr(PORTD,6);
139
          break;
140
        case '*':                        //RTC lesen
141
          Comand = '*';
142
          break;
143
        case '$':                        //RTC beschreiben
144
          Comand = '$';
145
          break;
146
        case '+':          ///////////////    //RTC Initialisieren
147
          Comand = '+';
148
          break;
149
      }
150
      if(Comand == '$'){                      //RTC Daten  erwarten
151
        rs232_status ++;
152
      }
153
      break;
154
    case waitSEC:                          //Zeit und Datum empfangen
155
      Sekunden = RX_buffer[index_rxBuf_R];
156
      rs232_status ++;
157
      break;
158
    case waitMIN:
159
      Minuten = RX_buffer[index_rxBuf_R];    
160
      rs232_status ++;
161
      break;
162
    case waitH:
163
      Stunden = RX_buffer[index_rxBuf_R];    
164
      rs232_status ++;
165
      break;
166
    case waitDATE:
167
      Wochentag = RX_buffer[index_rxBuf_R];    
168
      rs232_status ++;
169
      break;
170
    case waitDAY:
171
      Datum = RX_buffer[index_rxBuf_R];    
172
      rs232_status ++;
173
      break;
174
    case waitMOUNTH:
175
      Monat = RX_buffer[index_rxBuf_R];    
176
      rs232_status ++;
177
      break;
178
    case waitYEAR:
179
      Wochentag = RX_buffer[index_rxBuf_R];  
180
      Comand = received;                      //Daten komplet
181
      rs232_status = 0;
182
      break;
183
  }
184
}
185
void RTC(void){
186
  int weekday = 0;
187
  switch(Comand){
188
    case '*':                            //RTC auslesen
189
//      i2c_start();
190
//      i2c_write(RTC_Adresse|Write);
191
//      i2c_write(0x00);                            // Start at REG 0 - Seconds      
192
      i2c_start();
193
      i2c_write(RTC_Adresse|Read);
194
      Sekunden = i2c_read(ACK);
195
      Minuten = i2c_read(ACK);
196
      Stunden = i2c_read(ACK);
197
      weekday = i2c_read(ACK);
198
      Datum = i2c_read(ACK);
199
      Monat = i2c_read(ACK);
200
      Jahr = i2c_read(NAK);
201
      i2c_stop();
202
      switch (weekday){
203
        case Montag:
204
          Wochentag = Montag;
205
          break;
206
        case Dienstag:
207
          Wochentag = Dienstag;
208
          break;
209
        case Mittwoch:
210
          Wochentag = Mittwoch;
211
          break;
212
        case Donnerstag:
213
          Wochentag = Donnerstag;
214
          break;
215
        case Freitag:
216
          Wochentag = Freitag;
217
          break;
218
        case Samstag:
219
          Wochentag = Samstag;
220
          break;
221
        case Sonntag:
222
          Wochentag = Sonntag;
223
          break;
224
      }
225
      printf("%d:%d:%d\n",Stunden, Minuten, Sekunden);      //Zeit ausgeben
226
      printf("%d, %d:%d:%d\n", Wochentag, Datum, Monat, Jahr);  //Datum ausgeben 
227
      Comand = 0;
228
      break;
229
    case received:                          //RTC beschreiben
230
      i2c_start();
231
      i2c_write(RTC_Adresse|Write);
232
      i2c_write(Sekunden);
233
      i2c_write(Minuten);
234
      i2c_write(Stunden);
235
      i2c_write(Wochentag);
236
      i2c_write(Datum);
237
      i2c_write(Monat);
238
      i2c_write(Jahr);
239
      i2c_stop();
240
      Comand = 0;
241
      break;
242
    case '+':            //////////////////////////////RTC initialisieren
243
      i2c_start();
244
      i2c_write(RTC_Adresse|Write);
245
      i2c_write(30);
246
      i2c_write(51);
247
      i2c_write(11);
248
      i2c_write(Mittwoch);
249
      i2c_write(21);
250
      i2c_write(10);
251
      i2c_write(9);
252
      i2c_stop();
253
      break;
254
  }
255
}
256
//------------------------------------------------------------------------------
257
// Interrupts 
258
ISR(USART_RXC_vect){
259
  if(index_rxBuf_W == Buf_max){
260
    index_rxBuf_W = 0;
261
  }
262
  else{
263
    index_rxBuf_W ++;
264
  }
265
  if(index_rxBuf_W == index_rxBuf_R){
266
    //Error
267
  }
268
  else{
269
    RX_buffer[index_rxBuf_W] = UDR;
270
  }
271
}
272
//------------------------------------------------------------------------------
273
// Hauptfunktion (wird beim Start ausgeführt) 
274
int main(void){
275
    SysInit();
276
  while(1){
277
    RS232();
278
    RTC();
279
  }
280
return 0;
281
}
282
//------------------------------------------------------------------------------