1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 |
|
5 | #include <main.h> //Definitionen und Konstanten
|
6 |
|
7 | #define RXB8 1
|
8 | #define TXB8 0
|
9 | #define UPE 2
|
10 | #define OVR 3
|
11 | #define FE 4
|
12 | #define UDRE 5
|
13 | #define RXC 7
|
14 |
|
15 | #define FRAMING_ERROR (1<<FE)
|
16 | #define PARITY_ERROR (1<<UPE)
|
17 | #define DATA_OVERRUN (1<<OVR)
|
18 | #define DATA_REGISTER_EMPTY (1<<UDRE)
|
19 | #define RX_COMPLETE (1<<RXC)
|
20 |
|
21 |
|
22 | // Standard Input/Output functions
|
23 | #include <stdio.h>
|
24 |
|
25 |
|
26 |
|
27 | // Declare your global variables here
|
28 | struct {
|
29 | int bytezeiger; //Zeiger auf das Byte einer Busnachricht
|
30 | int bitzeiger; //Zeiger auf das Bit im Byte einer Busnachricht
|
31 | char nachricht[6]; //Speicher fuer die Nachricht max. 6 Bytes
|
32 | char buffer[4][6]; //Buffer fuer eine Nachricht max. 6 Bytes bereit zum Abarbeiten.
|
33 | int flag[4]; //Zeigt an das im Buffer eine Nachricht abgearbeitet werden muss.
|
34 | int laenge[4]; //Laenge der Nachricht in Bytes !inklusive Chksumme!
|
35 | int eingangnr; //Setzt auf den aktuellen empfangs Buffer 0 - 3
|
36 | int ausgangsnr; //Setzt auf den aktuellen zu bearbeitenden Buffer 0 - 3
|
37 | char chksumme; //Speicher fuer die Checksumme
|
38 | int status; //Zeigt den Status an.
|
39 | } volatile bus_rx; //Container fuer den Busempfaenger mit 4 Bufferstellen
|
40 | struct {
|
41 | int bytezeiger; //Zeiger auf das Byte einer Busnachricht
|
42 | int bitzeiger; //Zeiger auf das Bit im Byte einer Busnachricht
|
43 | char nachricht[6]; //Speicher fuer die Nachricht max. 6 Bytes
|
44 | int laenge; //Laenge der Nachricht in Bytes !inklusive Chksumme!
|
45 | int flag; //Zeigt an das im Buffer eine Nachricht abgearbeitet werden muss.
|
46 | int status; //Zeigt den Status an.
|
47 | int zeit; //Speicher fuer den Bussender
|
48 | } volatile bus_tx; //Container fuer den Busdaten Sender
|
49 | struct {
|
50 | int status; //Status des Rs232 Empfaengers
|
51 | char nachricht[5]; //Speicher fuer eine Nachricht zum Bus
|
52 | int bytezeiger; //Zeigt auf ein Byte in der Nachricht
|
53 | } rs232_rx; //Container fuer die rs232 Kommunikation
|
54 |
|
55 | int uart_putc(char daten);
|
56 |
|
57 | ISR(BADISR_vect)
|
58 | {
|
59 | uart_putc((char)0x24);
|
60 | }
|
61 |
|
62 | /**********************************************************************************/
|
63 | /*! Analog Comparator Interrupt
|
64 | */
|
65 | /**********************************************************************************/
|
66 | ISR(ANALOG_COMP_vect)
|
67 | {
|
68 | asm ("nop");
|
69 | }//Ende analog comparator interrupt -- busdatenempfaenger
|
70 |
|
71 |
|
72 | /**********************************************************************************
|
73 | * Sendet ein Byte an den PC.
|
74 | * !!! Nicht Interrupt gesteuert!!! Wartet bis Senden möglich ist, max. 125us bei 4MHz (500Zyklen)
|
75 | *
|
76 | * - Return 0 wenn Daten gesendet werden konnten
|
77 | * - Return 1 wenn Fehler auftrat
|
78 | */
|
79 | /**********************************************************************************/
|
80 | int uart_putc(char daten)
|
81 | {
|
82 | int i; //Hilfzaehler fuer die Routine
|
83 | i= 0; //Um Verzoegerung mit zu zaehlen auf 0 setzen
|
84 |
|
85 | while ((!(UCSR0A & (1<<UDRE))) & (i <= 500)) //warten bis Senden moeglich aber nur 500 Zyklen
|
86 | {
|
87 | i++;
|
88 | }
|
89 | if( UCSR0A & (1<<UDRE) ) //Wenn der TX Buffer frei ist Daten senden
|
90 | {
|
91 | UDR0 = daten; //Daten in Sendebuffer schreiben
|
92 | return 0; //Rückmeldung OK
|
93 | }
|
94 | else //Wenn der TX Buffer nach 500 Zyklen immer noch nicht frei ist
|
95 | {
|
96 | return 1; //Einen Fehler zurück melden
|
97 | }
|
98 |
|
99 | }//Ende int uart_putc(char daten)
|
100 |
|
101 | /**********************************************************************************
|
102 | *
|
103 | * Empfaengt RS232 Daten vom PC
|
104 | *
|
105 | * - Handshake: PC sendet Handshake Signal, Controller antwortet OK, PC sendet erneut
|
106 | * Handshake Signal. Controller antwortet OK und ist verbunden!
|
107 | * - Senden: PC sendet einen Befehl der auf den Bus gesendet werden soll
|
108 | * Es werden 5 Bytes erwartet.
|
109 | */
|
110 | /**********************************************************************************/
|
111 | ISR(USART0_RX_vect)
|
112 | {
|
113 | int i;
|
114 |
|
115 | asm ("cli");
|
116 | asm ("nop");
|
117 |
|
118 | uart_putc(rs232_rx.status);
|
119 | switch(rs232_rx.status)
|
120 | {
|
121 | case BUS_STANDBY: //Bisher war RS232 Inaktiv
|
122 | if(UDR0 == HANDSHAKE) //Handshake anforderung
|
123 | {
|
124 | uart_putc(OK); //Bestaetigen
|
125 | rs232_rx.status= BUS_HANDSHAKE;
|
126 | uart_putc(0x55);
|
127 | for(i= 0; i<500; i++)
|
128 | uart_putc(i);
|
129 |
|
130 |
|
131 | }
|
132 | break;
|
133 | case BUS_HANDSHAKE: //Handshake ausfuehren
|
134 | if(UDR0 == HANDSHAKE) //Handshake erfolgreich
|
135 | {
|
136 | uart_putc(OK); //Bestaetigen
|
137 | rs232_rx.status= BUS_READY;
|
138 | uart_putc(0x66);
|
139 | }
|
140 | else //Handshake fehlgeschlagen
|
141 | {
|
142 | uart_putc(FAULT); //Fehler senden.
|
143 | rs232_rx.status= BUS_STANDBY;
|
144 | }
|
145 | break;
|
146 | case BUS_READY: //Verbindung mit dem PC besteht
|
147 | switch(UDR0) //Je nach Befehl reagieren.
|
148 | {
|
149 | case SENDEN: //naechsten 5 byte auf Bus senden
|
150 | rs232_rx.status= BUS_SENDEN;
|
151 | rs232_rx.bytezeiger= 0;
|
152 | break;
|
153 | case DISCONNECT: //Vom PC trennen
|
154 | uart_putc(OK); //Bestaetigen
|
155 | rs232_rx.status= BUS_STANDBY;
|
156 | break;
|
157 | default:
|
158 | uart_putc(FAULT); //Fehler senden
|
159 | break;
|
160 | }
|
161 | break;
|
162 | case BUS_SENDEN: //Nachricht zum Senden zusammen setzten
|
163 | //Es werden 5 Bytes vom PC + ein OK erwartet
|
164 | if(rs232_rx.bytezeiger >= 5) //Jetzt muesste OK kommen
|
165 | {
|
166 | if(UDR0 == OK)
|
167 | {
|
168 | uart_putc(OK); //Bestaetigen
|
169 | // bustransmitter(rs232_rx.nachricht[0],rs232_rx.nachricht[1],rs232_rx.nachricht[2],rs232_rx.nachricht[3],rs232_rx.nachricht[4]);
|
170 | rs232_rx.status= BUS_READY;
|
171 | }
|
172 | else //Falsche uebertragung --> Nachricht verwerfen.
|
173 | {
|
174 | uart_putc(FAULT); //Fehler senden
|
175 | rs232_rx.status= BUS_READY;
|
176 | }
|
177 |
|
178 | }
|
179 | else //Noch mit empfang beschaeftigt.
|
180 | rs232_rx.nachricht[rs232_rx.bytezeiger++]= UDR0;
|
181 | break;
|
182 | }
|
183 | UCSR0A&= 0x7F; //RXC flag loeschen
|
184 |
|
185 | asm ("sei");
|
186 | }//Ende Usart RX Interrupt -- RS232 Empfang
|
187 |
|
188 | int main(void)
|
189 | {
|
190 | // Declare your local variables here
|
191 | int i;
|
192 | uart_putc(0x31);
|
193 | //Watchdog Timer ausschalten
|
194 | WDTCR|= 0x18; //Logic 1 to WDCE and WDE
|
195 | WDTCR= 0x00; //Watchtog off
|
196 |
|
197 |
|
198 | // Input/Output Ports initialization
|
199 | // Port A initialization
|
200 | // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
|
201 | // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
|
202 | PORTA=0x00;
|
203 | DDRA=0xFF;
|
204 |
|
205 | // Port B initialization
|
206 | // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
|
207 | // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
|
208 | PORTB=0x00;
|
209 | DDRB=0xFF;
|
210 |
|
211 | // Port C initialization
|
212 | // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In
|
213 | // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=P State0=P
|
214 | PORTC=0x03;
|
215 | DDRC=0xFC;
|
216 |
|
217 | // Port D initialization
|
218 | // Func7=In Func6=In Func5=In Func4=Out Func3=In Func2=In Func1=Out Func0=Out
|
219 | // State7=P State6=P State5=P State4=0 State3=T State2=T State1=0 State0=0
|
220 | PORTD=0xE0;
|
221 | DDRD=0x13;
|
222 |
|
223 | // Port E initialization
|
224 | // Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
|
225 | // State7=0 State6=0 State5=0 State4=0 State3=T State2=T State1=T State0=T
|
226 | PORTE=0x00;
|
227 | DDRE=0xF0;
|
228 |
|
229 | // Port F initialization
|
230 | // Func7=Out Func6=Out Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In
|
231 | // State7=0 State6=0 State5=0 State4=T State3=T State2=T State1=T State0=T
|
232 | PORTF=0x00;
|
233 | DDRF=0xE0;
|
234 |
|
235 | // Port G initialization
|
236 | // Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
|
237 | // State4=0 State3=0 State2=0 State1=0 State0=0
|
238 | PORTG=0x00;
|
239 | DDRG=0x1F;
|
240 |
|
241 | // Timer/Counter 0 initialization
|
242 | // Clock source: System Clock
|
243 | // Clock value: Timer 0 Stopped
|
244 | // Mode: Normal top=FFh
|
245 | // OC0 output: Disconnected
|
246 | ASSR=0x00;
|
247 | TCCR0=0x00;
|
248 | TCNT0=0x00;
|
249 | OCR0=0x00;
|
250 |
|
251 | // Timer/Counter 1 initialization
|
252 | // Clock source: System Clock
|
253 | // Clock value: Timer 1 Stopped
|
254 | // Mode: Normal top=FFFFh
|
255 | // OC1A output: Discon.
|
256 | // OC1B output: Discon.
|
257 | // OC1C output: Discon.
|
258 | // Noise Canceler: Off
|
259 | // Input Capture on Falling Edge
|
260 | // Timer 1 Overflow Interrupt: Off
|
261 | // Input Capture Interrupt: Off
|
262 | // Compare A Match Interrupt: Off
|
263 | // Compare B Match Interrupt: Off
|
264 | // Compare C Match Interrupt: Off
|
265 | TCCR1A=0x00;
|
266 | TCCR1B=0x00;
|
267 | TCNT1H=0x00;
|
268 | TCNT1L=0x00;
|
269 | ICR1H=0x00;
|
270 | ICR1L=0x00;
|
271 | OCR1AH=0x00;
|
272 | OCR1AL=0x00;
|
273 | OCR1BH=0x00;
|
274 | OCR1BL=0x00;
|
275 | OCR1CH=0x00;
|
276 | OCR1CL=0x00;
|
277 |
|
278 | // Timer/Counter 2 initialization
|
279 | // Clock source: System Clock
|
280 | // Clock value: Timer 2 Stopped
|
281 | // Mode: Normal top=FFh
|
282 | // OC2 output: Disconnected
|
283 | TCCR2=0x00;
|
284 | TCNT2=0x00;
|
285 | OCR2=0x00;
|
286 |
|
287 | // Timer/Counter 3 initialization
|
288 | // Clock source: System Clock
|
289 | // Clock value: Timer 3 Stopped
|
290 | // Mode: Normal top=FFFFh
|
291 | // Noise Canceler: Off
|
292 | // Input Capture on Falling Edge
|
293 | // OC3A output: Discon.
|
294 | // OC3B output: Discon.
|
295 | // OC3C output: Discon.
|
296 | // Timer 3 Overflow Interrupt: Off
|
297 | // Input Capture Interrupt: Off
|
298 | // Compare A Match Interrupt: Off
|
299 | // Compare B Match Interrupt: Off
|
300 | // Compare C Match Interrupt: Off
|
301 | TCCR3A=0x00;
|
302 | TCCR3B=0x00;
|
303 | TCNT3H=0x00;
|
304 | TCNT3L=0x00;
|
305 | ICR3H=0x00;
|
306 | ICR3L=0x00;
|
307 | OCR3AH=0x00;
|
308 | OCR3AL=0x00;
|
309 | OCR3BH=0x00;
|
310 | OCR3BL=0x00;
|
311 | OCR3CH=0x00;
|
312 | OCR3CL=0x00;
|
313 |
|
314 | // External Interrupt(s) initialization
|
315 | // INT0: Off
|
316 | // INT1: Off
|
317 | // INT2: Off
|
318 | // INT3: Off
|
319 | // INT4: Off
|
320 | // INT5: Off
|
321 | // INT6: Off
|
322 | // INT7: Off
|
323 | EICRA=0x00;
|
324 | EICRB=0x00;
|
325 | EIMSK=0x00;
|
326 |
|
327 | // Timer(s)/Counter(s) Interrupt(s) initialization
|
328 | TIMSK=0x00;
|
329 | ETIMSK=0x00;
|
330 |
|
331 | // USART0 initialization
|
332 | // Communication Parameters: 8 Data, 1 Stop, No Parity
|
333 | // USART0 Receiver: On
|
334 | // USART0 Transmitter: On
|
335 | // USART0 Mode: Asynchronous
|
336 | // USART0 Baud Rate: 9600
|
337 | UCSR0A=0x00;
|
338 | UCSR0B=0x98;
|
339 | UCSR0C=0x06;
|
340 | UBRR0H=0x00;
|
341 | UBRR0L=0x19;
|
342 |
|
343 | // USART1 initialization
|
344 | // Communication Parameters: 8 Data, 1 Stop, No Parity
|
345 | // USART1 Receiver: On
|
346 | // USART1 Transmitter: On
|
347 | // USART1 Mode: Asynchronous
|
348 | // USART1 Baud Rate: 9600
|
349 | UCSR1A=0x00;
|
350 | UCSR1B=0x18;
|
351 | UCSR1C=0x06;
|
352 | UBRR1H=0x00;
|
353 | UBRR1L=0x19;
|
354 |
|
355 | // Analog Comparator initialization
|
356 | // Analog Comparator: On
|
357 | // Interrupt on Falling Output Edge
|
358 | // Analog Comparator Input Capture by Timer/Counter 1: Off
|
359 | ACSR=0x0A;
|
360 | SFIOR=0x00;
|
361 |
|
362 |
|
363 |
|
364 | uart_putc(0x32);
|
365 |
|
366 | // Global enable interrupts
|
367 | asm ("sei");
|
368 |
|
369 | //Variablen in Ausgangszustand bringen:
|
370 | bus_rx.status= BUS_STANDBY;
|
371 | for(i=0; i<4; i++)
|
372 | bus_rx.flag[i]= 0;
|
373 | bus_rx.eingangnr= 0;
|
374 | bus_rx.ausgangsnr= 0;
|
375 | bus_tx.status= BUS_STANDBY;
|
376 | bus_tx.flag= 0;
|
377 | rs232_rx.status= BUS_STANDBY;
|
378 | uart_putc(0x33);
|
379 | uart_putc(MCUCSR);
|
380 | MCUSR= 0x00;
|
381 |
|
382 |
|
383 | while (1)
|
384 | {
|
385 | PORTE ^= 0x20;
|
386 | for(i=0 ; i<= 10000;i++)
|
387 | asm ("nop");
|
388 |
|
389 |
|
390 |
|
391 | };
|
392 | }
|