1 | //---------------------INCLUDES---------------------------------
|
2 | #define F_CPU 3686400UL
|
3 | #include <avr/delay.h>
|
4 | #include <avr/io.h>
|
5 | #include <avr/interrupt.h>
|
6 | #include <inttypes.h>
|
7 | #include <avr/signal.h>
|
8 | #include <avr/wdt.h>
|
9 | //---------------------DEFINES---------------------------------
|
10 | #define eDIP_IRQ PD2
|
11 | #define Takt 3686400UL //Controllertakt 3,4686 MHz
|
12 | #define BAUD 9600UL //Baudrate
|
13 |
|
14 | #include <UART\konsolfunc.h>
|
15 | //-------------------INIT UART----------------------------------
|
16 | //UCSRA: RXC = INT wenn zeichen im empfänger angekommen. Wird gelöscht wenn Daten aus UDR gelesen werden.
|
17 | // TXC = INT wenn Zeichen aus dem sender geschickt wurde und Sendepuffer leer ist. Durch Interrupt-
|
18 | // annahme oder durch Einschreiben einer 1 wieder gelöscht.
|
19 | // UDRE = 1 wenn Puffer bereit für neue Datenübertragung. (S.350)
|
20 |
|
21 | //-------------------IRQ ausgelöst-------------------------//GIFR (Interrupt Flag = 01000000)
|
22 | volatile double ISR_buffer;
|
23 |
|
24 | //-------------------------FUNKTIONEN--------------------------------------------
|
25 |
|
26 | //-------------------------Sendepuffer empfangen---------------------------------
|
27 | int sendepuffer_empfangen()
|
28 | {
|
29 | getch();
|
30 |
|
31 | switch(UDR)
|
32 | {
|
33 |
|
34 | case 0x01 : PORTB^=(1<<PB1); //gelbe LED blinkt
|
35 | break;
|
36 | _delay_ms(50);
|
37 |
|
38 | case 0x02 : PORTB^=(1<<PB1); //gelbe LED blinkt
|
39 | break;
|
40 | _delay_ms(50);
|
41 |
|
42 | default : PORTB^=((1<<PB1) | (1<<PB2));
|
43 | _delay_ms(50);
|
44 | }
|
45 | return(0);
|
46 | }
|
47 |
|
48 | //-------------------------Sendepuffer anfordern --------------------------------------
|
49 | void sendepuffer_anfordern()
|
50 | {
|
51 |
|
52 | initusart();
|
53 | _delay_ms(30);
|
54 | putch('0x12'); //<DC2>
|
55 | _delay_ms(1);
|
56 | putch('0x01'); //1(len)
|
57 | _delay_ms(1);
|
58 | putch('0x53'); //S
|
59 | _delay_ms(1);
|
60 | putch('0x66'); //66(bcc)
|
61 | _delay_ms(1);
|
62 |
|
63 | getch(); // Empfänger ein und auf Antwort des Displays warten
|
64 |
|
65 | if(UDR == '0x06') //wenn "Ack" vom Display
|
66 | {
|
67 | PORTB=(1<<PB1); // LED grün
|
68 | sendepuffer_empfangen;
|
69 | }
|
70 | else //wenn "Nack" vom Display
|
71 | {
|
72 | PORTB=(1<<PB2); //LED rot
|
73 | }
|
74 | for (int i=0; i<5; i++)
|
75 | {
|
76 | sendepuffer_anfordern; //EVENTUELL SEPARAT !!!
|
77 | }
|
78 |
|
79 | }
|
80 |
|
81 | //-------------------------Daten senden--------------------------------------
|
82 |
|
83 | // FÜR MENÜBEFEHLSROUTINE !!!
|
84 |
|
85 | //-------------------------auf Daten warten--------------------------------------
|
86 |
|
87 | int wait_for_data()
|
88 | {
|
89 | ISR_buffer = PORTC ;
|
90 | while(1)
|
91 | {PORTB=(1<<PB3);//DEBUGLEUCHTE
|
92 | if(ISR_buffer>0x00) //prüfen ob Daten in Register
|
93 | {
|
94 | ISR_buffer = 0; //Buffer zurücksetzen
|
95 | sendepuffer_anfordern;
|
96 |
|
97 | }
|
98 |
|
99 | }
|
100 | return(0);
|
101 | }
|
102 |
|
103 | //------------------------------------------------------------------------------
|
104 | //-------------------------ISRs--------------------------------------
|
105 |
|
106 | ISR (INT0_vect) // SBUF Display hat Daten - jetzt abholen !
|
107 | {
|
108 | PORTC++;
|
109 | // GICR= (!(1<<INT0)) ;
|
110 | }
|
111 |
|
112 | //--------------------HAUPTPROGRAMM----------------------------
|
113 |
|
114 | int main()
|
115 | {
|
116 | wdt_reset();
|
117 |
|
118 | initusart();
|
119 | //---------------------INIT EXT INTERRUPT--------------------------
|
120 |
|
121 | MCUCSR |=(1<<ISC01); //INT bei fallender Flanke an PIN D2
|
122 |
|
123 | GICR |= (1<<INT0) ; // EXT INT aktiviert
|
124 |
|
125 | //------------------------------------------------------------------
|
126 |
|
127 | //----------------------EIN/AUSGÄNGE festlegen----------------
|
128 | DDRB=0xff;
|
129 | DDRC=0xff;
|
130 | PORTD=0xff; //PIN 2 EXT0 INTERRUPT Pullup
|
131 | //-----------------------------------------------------------
|
132 | sei();
|
133 | while(1)
|
134 | {
|
135 |
|
136 | PORTB^=(1<<PB0); // Rote LED blinkt
|
137 | _delay_ms(50);
|
138 | cli();
|
139 | wait_for_data;
|
140 | sei();
|
141 | }
|
142 | // Arbeitsschleife Ende
|
143 |
|
144 | }
|