1 | /*
|
2 | * main.c
|
3 | *
|
4 | * Created on: 11.03.2009
|
5 | * Author: chris
|
6 | */
|
7 | #include <avr/io.h>
|
8 | #include <stdint.h>
|
9 | #include <avr/interrupt.h>
|
10 | #include <util/delay.h>
|
11 | #include <stdlib.h>
|
12 | #include <string.h> // Für "strcmp"
|
13 |
|
14 |
|
15 |
|
16 | #define Takt 16000000
|
17 | #define BAUD1 115200 // Baudrate
|
18 | //BAUDRATE 2 AKTIV !!!
|
19 | #define UBRR_VAL1 ((Takt/16/BAUD2)-1) // Schnittstelle BUS
|
20 |
|
21 | #define BAUD2 9600 // Baudrate
|
22 | #define UBRR_VAL2 ((Takt/16/BAUD2)-1) // Schnittstelle KESSEL
|
23 |
|
24 | int CheckSumm; //CheckSumme RX Global
|
25 | int Tempstatus = 0;
|
26 |
|
27 |
|
28 | //Einzelne Zeichen senden
|
29 | void USART1_Transmit( char data )
|
30 | {
|
31 | /* Wait for empty transmit buffer */
|
32 | while ( !( UCSR1A & (1<<UDRE1)) )
|
33 | ;
|
34 | /* Put data into buffer, sends the data */
|
35 | UDR1 = data;
|
36 | };
|
37 | void USART2_Transmit( char data )
|
38 | {
|
39 | /* Wait for empty transmit buffer */
|
40 | while ( !( UCSR0A & (1<<UDRE0)) )
|
41 | ;
|
42 | /* Put data into buffer, sends the data */
|
43 | UDR0 = data;
|
44 | };
|
45 |
|
46 | uint8_t usart1_getc(void)
|
47 | {
|
48 | while (!(UCSR1A & (1<<RXC1))) // warten bis Zeichen verfuegbar
|
49 | ;
|
50 | return UDR1; // Zeichen aus UDR an Aufrufer zurueckgeben
|
51 | };
|
52 |
|
53 |
|
54 | char USART1_getchar(void)
|
55 | {
|
56 | // Ist schon ein Zeichen im Buffer?
|
57 | PORTC = 0xFE; //rechte LED an
|
58 | while (!bit_is_set(UCSR1A, RXC1))
|
59 | ;
|
60 | PORTC = 0xFF; //Rechte LED aus
|
61 | return UDR1;
|
62 |
|
63 | }
|
64 |
|
65 |
|
66 |
|
67 | //Daten empfangen Routine
|
68 | unsigned char USART1_readcommand(unsigned char *Nutzdaten, char *Steuerdaten, char *h)
|
69 | {
|
70 | unsigned char NextByte;
|
71 | char Len;
|
72 | unsigned int i;
|
73 | unsigned int CheckSummCalc;
|
74 | unsigned int CheckSummRead;
|
75 |
|
76 | CheckSummCalc = 0;
|
77 | Steuerdaten[0] = USART1_getchar(); // CommandoByte 1
|
78 | CheckSummCalc += Steuerdaten[0];
|
79 | Steuerdaten[1] = USART1_getchar(); // CommandoByte 2
|
80 | CheckSummCalc += Steuerdaten[1];
|
81 |
|
82 |
|
83 | // Anzahl der Datenbytes lesen
|
84 | Len = USART1_getchar();
|
85 | CheckSummCalc += Len;
|
86 | // Jetzt kommen die Datenbytes
|
87 |
|
88 | if(h==0) //für Initialisierung h wird später auf 1 gesetzt
|
89 | {
|
90 | Len = 11;
|
91 | }
|
92 |
|
93 | for( i = 0; i < Len; i++ )
|
94 | {
|
95 | NextByte = USART1_getchar();
|
96 | CheckSummCalc += NextByte;
|
97 | Nutzdaten[i] = NextByte;
|
98 | }
|
99 |
|
100 | // Daten sind gelesen. Jetzt kommen noch 2 Bytes Checksumme
|
101 | CheckSummRead = USART1_getchar();
|
102 | CheckSummRead = ( CheckSummRead << 8 ) + USART1_getchar();
|
103 |
|
104 |
|
105 |
|
106 | if (CheckSummRead != CheckSumm && Steuerdaten[1] == 0X31) //Tempwerte änderung
|
107 | {
|
108 | Tempstatus = 1;
|
109 | //Testfunktionen
|
110 | USART2_Transmit(CheckSummRead);
|
111 | USART2_Transmit(CheckSumm);
|
112 | CheckSumm = CheckSummRead;
|
113 | }
|
114 |
|
115 | if(h==0)
|
116 | {
|
117 | Steuerdaten[0]=0X4D;
|
118 | Steuerdaten[1]=0X41;
|
119 | Steuerdaten[2]=0X01;
|
120 | Steuerdaten[3]=0X01;
|
121 | Steuerdaten[4]=0X00;
|
122 | Steuerdaten[5]=0X90;
|
123 |
|
124 | for(i=0; i<=5 ;i++)
|
125 | {
|
126 | USART1_Transmit(Steuerdaten[i]);
|
127 | }
|
128 | }
|
129 |
|
130 | return Len;
|
131 | }
|
132 |
|
133 |
|
134 |
|
135 | void USART2_ValuesTransmit(unsigned char *Nutzdaten)
|
136 | {
|
137 | unsigned char Sendstring[31];
|
138 | int j;
|
139 | Sendstring[0]=0x66; // f
|
140 | Sendstring[1]=0x62; // b
|
141 | Sendstring[2]=0x73; // s
|
142 | Sendstring[3]=0x30; // 0
|
143 | Sendstring[4]=0x35; // 5
|
144 | Sendstring[5]=0x2F; // /
|
145 | Sendstring[6]=0x30; // 0 Hauptlinie hb
|
146 | Sendstring[7]=0x31; // 1 Hauptlinie lb
|
147 | Sendstring[8]=0x2F; // /
|
148 | Sendstring[9]=0x62; // b Mittellinie
|
149 | Sendstring[10]=0x2F; // /
|
150 | Sendstring[11]=0x00; // 0 Teilnehmer
|
151 | Sendstring[12]=0x00; // 0 Teilnehmer
|
152 | Sendstring[13]=0x00; // 0 Teilnehmer 1. Temperatur
|
153 | Sendstring[14]=0x3D; // =
|
154 |
|
155 | for(j=0; j<=20 ;j++) //Erste Temperatur senden
|
156 | {
|
157 | USART2_Transmit(Sendstring[j]);
|
158 |
|
159 | }
|
160 |
|
161 | Sendstring[11]=0x00; // 0 Teilnehmer
|
162 | Sendstring[12]=0x00; // 0 Teilnehmer
|
163 | Sendstring[13]=0x00; // 0 Teilnehmer 2. Temperatur
|
164 |
|
165 | for(j=0; j<=20 ;j++) //Zweite emperatur senden
|
166 | {
|
167 | USART2_Transmit(Sendstring[j]);
|
168 |
|
169 | }
|
170 | //Status senden
|
171 |
|
172 | Sendstring[11]=0x00; // 0 Teilnehmer
|
173 | Sendstring[12]=0x00; // 0 Teilnehmer
|
174 | Sendstring[13]=0x00; // 0 Teilnehmer
|
175 |
|
176 | if(Nutzdaten[1] == 2)
|
177 | {
|
178 | Sendstring[15]='A';
|
179 | Sendstring[16]='n';
|
180 | Sendstring[17]='h';
|
181 | Sendstring[18]='e';
|
182 | Sendstring[19]='i';
|
183 | Sendstring[20]='z';
|
184 | Sendstring[21]='e';
|
185 | Sendstring[22]='n';
|
186 | Sendstring[23]=0x0D; // CR
|
187 | Sendstring[24]=0x0A; // LF
|
188 | }
|
189 | if(Nutzdaten[1] == 3)
|
190 | {
|
191 | Sendstring[15]='H';
|
192 | Sendstring[16]='e';
|
193 | Sendstring[17]='i';
|
194 | Sendstring[18]='z';
|
195 | Sendstring[19]='e';
|
196 | Sendstring[20]='n';
|
197 | Sendstring[21]=0x0D; // CR
|
198 | Sendstring[22]=0x0A; // LF
|
199 | }
|
200 | if(Nutzdaten[1] == 4)
|
201 | {
|
202 | Sendstring[15]='F';
|
203 | Sendstring[16]='e';
|
204 | Sendstring[17]='u';
|
205 | Sendstring[18]='e';
|
206 | Sendstring[19]='r';
|
207 | Sendstring[20]='h';
|
208 | Sendstring[21]='a';
|
209 | Sendstring[22]='l';
|
210 | Sendstring[23]='t';
|
211 | Sendstring[24]='u';
|
212 | Sendstring[25]='n';
|
213 | Sendstring[26]='g';
|
214 | Sendstring[27]=0x0D; // CR
|
215 | Sendstring[28]=0x0A; // LF
|
216 | }
|
217 | if(Nutzdaten[1] == 6)
|
218 | {
|
219 | Sendstring[15]='T';
|
220 | Sendstring[16]='u';
|
221 | Sendstring[17]='e';
|
222 | Sendstring[18]='r';
|
223 | Sendstring[19]='-';
|
224 | Sendstring[20]='o';
|
225 | Sendstring[21]='f';
|
226 | Sendstring[22]='f';
|
227 | Sendstring[23]='e';
|
228 | Sendstring[24]='n';
|
229 | Sendstring[25]=0x0D; // CR
|
230 | Sendstring[26]=0x0A; // LF
|
231 | }
|
232 | if(Nutzdaten[1] == 0)
|
233 | {
|
234 | Sendstring[15]='S';
|
235 | Sendstring[16]='t';
|
236 | Sendstring[17]='o';
|
237 | Sendstring[18]='e';
|
238 | Sendstring[19]='r';
|
239 | Sendstring[20]='u';
|
240 | Sendstring[21]='n';
|
241 | Sendstring[22]='g';
|
242 | Sendstring[23]=0x0D; // CR
|
243 | Sendstring[24]=0x0A; // LF
|
244 | }
|
245 | if(Nutzdaten[1] == 5)
|
246 | {
|
247 | Sendstring[15]='F';
|
248 | Sendstring[16]='e';
|
249 | Sendstring[17]='u';
|
250 | Sendstring[18]='e';
|
251 | Sendstring[19]='r';
|
252 | Sendstring[20]='-';
|
253 | Sendstring[21]='A';
|
254 | Sendstring[22]='u';
|
255 | Sendstring[23]='s';
|
256 | Sendstring[24]=0x0D; // CR
|
257 | Sendstring[25]=0x0A; // LF
|
258 | }
|
259 | for(j=0; j<=30 ;j++) //Status senden
|
260 | {
|
261 | USART2_Transmit(Sendstring[j]);
|
262 |
|
263 | }
|
264 |
|
265 | }
|
266 |
|
267 | //Funktion Temperatur anfordern
|
268 | unsigned char Tempanfordern()
|
269 | {
|
270 | unsigned int j;
|
271 | unsigned char Tempstring[8];
|
272 | Tempstring[0]=0X4D; //M2
|
273 | Tempstring[1]=0X32;
|
274 | Tempstring[2]=0X01;
|
275 | Tempstring[3]=0X01;
|
276 | Tempstring[4]=0X00;
|
277 | Tempstring[5]=0X81;
|
278 |
|
279 | for(j=0; j<=5 ;j++)
|
280 | {
|
281 | USART1_Transmit(Tempstring[j]);
|
282 |
|
283 | }
|
284 | Tempstring[0]=0X52; //Rb
|
285 | Tempstring[1]=0X62;
|
286 | Tempstring[2]=0X03;
|
287 | Tempstring[3]=0X00;
|
288 | Tempstring[4]=0X00;
|
289 | Tempstring[5]=0X01;
|
290 | Tempstring[6]=0X00;
|
291 | Tempstring[7]=0XB8;
|
292 | for(j=0; j<=7 ;j++)
|
293 | {
|
294 | USART1_Transmit(Tempstring[j]);
|
295 |
|
296 | }
|
297 | for( j = 0; j < 6; j++ ) //Erste Zeichen des Antwortstrings verwerfen
|
298 | {
|
299 | Tempstring[j] = USART1_getchar();
|
300 |
|
301 | }
|
302 |
|
303 | return 1;
|
304 | }
|
305 |
|
306 |
|
307 |
|
308 | int main(void)
|
309 | {
|
310 |
|
311 | UCSR0B |= (1<<TXEN0); // USART1 TX einschalten
|
312 | UCSR1B |= (1<<TXEN1); // USART2 TX einschalten
|
313 | UCSR0B |= (1<<RXEN0);
|
314 | UCSR1B |= (1<<RXEN1);
|
315 | UCSR0C |= (1<<URSEL0)|(3<<UCSZ00); // USART1 Asynchron 8N1
|
316 | UCSR1C |= (1<<URSEL1)|(3<<UCSZ10); // USART2 Asynchron 8N1
|
317 |
|
318 | UBRR0H = UBRR_VAL1 >> 8;
|
319 | UBRR1H = UBRR_VAL2 >> 8;
|
320 | UBRR0L = UBRR_VAL1;
|
321 | UBRR1L = UBRR_VAL2 ;
|
322 |
|
323 | while (!bit_is_set(UCSR0A, UDRE0));
|
324 | //Timer initialisieren
|
325 | TCCR0 |= (1<<CS00)|(1<<CS02);
|
326 | TIMSK =(1<<TOIE0);
|
327 | sei();//interrupts aktivieren
|
328 |
|
329 |
|
330 |
|
331 | //Globale Daten:
|
332 | struct {
|
333 | unsigned initstatus:1; // Initialisierung Ra
|
334 | unsigned tempstatus:1; // Temperatur angefordert
|
335 | unsigned Tempchange:1; // Temperatur geändert
|
336 | unsigned b2Bits:5; // Dieses Feld ist 2 Bits breit
|
337 |
|
338 | } ctlbits;
|
339 | ctlbits.initstatus = 0;
|
340 | ctlbits.tempstatus = 0;
|
341 | ctlbits.Tempchange = 0;
|
342 | char Steuerdaten[8];
|
343 | char Steuerdatenalt[2];
|
344 | int zaehler;
|
345 | int counter=0;
|
346 | DDRC = 0xFF; //Led
|
347 |
|
348 | unsigned char Nutzdaten[60];
|
349 | uint16_t Datenlaenge = 0;
|
350 |
|
351 | for(zaehler=0;zaehler<60;zaehler++) //Erstmal Array mit Endzeichen füllen
|
352 | {
|
353 | Nutzdaten[zaehler]='\0';
|
354 | }
|
355 |
|
356 | ISR (TIMER0_OVF_vect) //Timerroutine
|
357 | {
|
358 | TCNT0 = 0;
|
359 | DDRC = 0xFD;
|
360 | counter++;
|
361 | if(counter==10)
|
362 | DDRC = 0xFF;
|
363 | }
|
364 |
|
365 |
|
366 | //Initialisierungsstring senden:
|
367 |
|
368 | Steuerdaten[0]=0X52; //Ra
|
369 | Steuerdatenalt[0]=0X52;
|
370 | Steuerdaten[1]=0X61;
|
371 | Steuerdatenalt[1]=0X52;
|
372 | Steuerdaten[2]=0X03;
|
373 | Steuerdaten[3]=0X00;
|
374 | Steuerdaten[4]=0X00;
|
375 | Steuerdaten[5]=0X01;
|
376 | Steuerdaten[6]=0X00;
|
377 | Steuerdaten[7]=0XB7;
|
378 | for(zaehler=0; zaehler<=7 ;zaehler++)
|
379 | {
|
380 | USART1_Transmit(Steuerdaten[zaehler]);
|
381 |
|
382 | }
|
383 |
|
384 | Steuerdaten[0]=0X4D; //Ma
|
385 | Steuerdaten[1]=0X41;
|
386 | Steuerdaten[2]=0X01;
|
387 | Steuerdaten[3]=0X01;
|
388 | Steuerdaten[4]=0X00;
|
389 | Steuerdaten[5]=0X90;
|
390 | for(zaehler=0; zaehler<=5 ;zaehler++)
|
391 | {
|
392 | USART1_Transmit(Steuerdaten[zaehler]);
|
393 |
|
394 | }
|
395 |
|
396 | //Initialisierung Ende
|
397 |
|
398 |
|
399 |
|
400 | //Daten empfangen und Bestätigungskommando schicken
|
401 | Kommunikation:
|
402 | cli(); //Interrupts sperren
|
403 | Datenlaenge = USART1_readcommand(Nutzdaten, Steuerdaten,ctlbits.initstatus);
|
404 | sei(); //Interrupts zulassen
|
405 | if(ctlbits.initstatus==0)//Für erste Antwort, wird verworfen
|
406 | {
|
407 | ctlbits.initstatus=1;
|
408 | goto Kommunikation;
|
409 |
|
410 | }
|
411 |
|
412 | //Kommando für Temperaturwerte schicken (nur einmal)
|
413 | if(ctlbits.tempstatus == 0 && Steuerdaten[1] == 0X32)
|
414 | {
|
415 | ctlbits.tempstatus = Tempanfordern();
|
416 | goto Kommunikation;
|
417 | }
|
418 | //Werte an den Bus senden
|
419 | if(Tempstatus == 1)
|
420 | {
|
421 | //Temperaturen senden
|
422 |
|
423 | USART2_ValuesTransmit(Nutzdaten);
|
424 | Tempstatus = 0;
|
425 |
|
426 | }
|
427 |
|
428 |
|
429 | Steuerdatenalt[0]=Steuerdaten[0];
|
430 | Steuerdatenalt[1]=Steuerdaten[1];
|
431 | Steuerdaten[5]= Steuerdaten[0]+Steuerdaten[1]+2;
|
432 | PORTC = 0xFB; //LED links an
|
433 | for(zaehler=0; zaehler<=5 ;zaehler++)
|
434 | {
|
435 | USART1_Transmit(Steuerdaten[zaehler]);
|
436 | }
|
437 |
|
438 | PORTC = 0xFF; //LED links aus
|
439 | goto Kommunikation;
|
440 |
|
441 |
|
442 | while(1);
|
443 | }
|