1 | #define F_CPU 16000000L
|
2 | // "Morsedauer" für ein Bit in Millisekunden
|
3 | #define BITZEIT 100
|
4 |
|
5 | #include <string.h>
|
6 | #include <avr/io.h>
|
7 | #include <avr/interrupt.h>
|
8 | #include <util/delay.h>
|
9 |
|
10 |
|
11 | // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
|
12 | #define BAUD 9600L
|
13 |
|
14 | // Berechnungen
|
15 | // clever runden
|
16 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
|
17 | // Reale Baudrate
|
18 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
|
19 | // Fehler in Promille
|
20 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000)
|
21 |
|
22 | #if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
|
23 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
24 | #endif
|
25 |
|
26 | // globale Variablen für den UART
|
27 |
|
28 | // Puffergrösse in Bytes, RX und TX sind gleich gross
|
29 | #define uart_buffer_size 32
|
30 |
|
31 | volatile uint8_t uart_rx_flag=0; // Flag, String komplett empfangen
|
32 | volatile uint8_t uart_tx_flag=1; // Flag, String komplett gesendet
|
33 | char uart_rx_buffer[uart_buffer_size]; // Empfangspuffer
|
34 | char uart_tx_buffer[uart_buffer_size]; // Sendepuffer
|
35 |
|
36 | // lange, variable Wartezeit, Einheit in Millisekunden
|
37 | void long_delay(uint16_t ms) {
|
38 | for (; ms>0; ms--) _delay_ms(1);
|
39 | }
|
40 |
|
41 | // einen String senden
|
42 | // vor Aufruf der Funktion muss man prüfen, ob uart_t_flag==1 ist
|
43 | // nur dann kann ein neuer String gesendet werden
|
44 |
|
45 | void put_string(char *daten) {
|
46 |
|
47 | if (uart_tx_flag==1) {
|
48 | // String daten in den Sendepuffer kopieren
|
49 | strcpy(uart_tx_buffer, daten);
|
50 | // Flag für 'Senden ist komplett' löschen,
|
51 | uart_tx_flag = 0;
|
52 | // UDRE Interrupt einschalten, los gehts
|
53 | UCSRB |= (1<<UDRIE);
|
54 | }
|
55 | }
|
56 |
|
57 | // einen empfangenen String kopieren
|
58 | // vor Aufruf der Funktion muss man prüfen, ob uart_rx_flag==1 ist
|
59 | // anderenfalls ist der RX Buffer noch ungültig
|
60 |
|
61 | void get_string(char *daten) {
|
62 |
|
63 | if (uart_rx_flag==1)
|
64 | {
|
65 | // String kopieren
|
66 | strcpy(daten, uart_rx_buffer);
|
67 | // Flag löschen
|
68 | uart_rx_flag = 0;
|
69 | }
|
70 | }
|
71 |
|
72 |
|
73 | // Hauptprogramm
|
74 |
|
75 | int main (void) {
|
76 |
|
77 |
|
78 |
|
79 | char stringbuffer[64]; // Allgemeiner Puffer für Strings
|
80 | uint8_t buffer_full=0; // noch ein Flag, aber nur in der Hauptschleife
|
81 | // char * charpointer; // Hilfszeiger
|
82 |
|
83 | // IO konfigurieren
|
84 |
|
85 | DDRA = 0xFF;
|
86 | DDRB = 0xFF;
|
87 | DDRC = 0xFF;
|
88 | DDRD = 0xFF;
|
89 |
|
90 | PORTB = 0xff;
|
91 | PORTD = 0xff;
|
92 | PORTA = 0xff;
|
93 |
|
94 |
|
95 | // UART konfigurieren
|
96 |
|
97 | UBRRH = UBRR_VAL >> 8;
|
98 | UBRRL = UBRR_VAL & 0xFF;
|
99 | UCSRB = (1<<RXCIE) | (1<<RXEN) | (1<<TXEN);
|
100 | UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8N1 8 bit parity none 1 stopbit
|
101 | // UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0) | (0 << UPM1);
|
102 | // UCSRC = (1<<URSEL)|(3<<UCSZ0);
|
103 | // UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
|
104 |
|
105 |
|
106 | // Stringpuffer initialisieren
|
107 |
|
108 |
|
109 | stringbuffer[0] = '\n';
|
110 | stringbuffer[1] = '\r';
|
111 |
|
112 |
|
113 |
|
114 | //variablen
|
115 | int x;
|
116 | int y;
|
117 | // Interrupts freigeben
|
118 |
|
119 | sei();
|
120 |
|
121 | // Endlose Hauptschleife
|
122 |
|
123 | while(1)
|
124 | {
|
125 |
|
126 |
|
127 | // Wurde ein kompletter String empfangen
|
128 | // und der Buffer ist leer?
|
129 | if (uart_rx_flag==1 && buffer_full==0)
|
130 | {
|
131 | // ja, dann String lesen,
|
132 | get_string(stringbuffer);
|
133 | buffer_full=1;
|
134 |
|
135 | x = stringbuffer[1];
|
136 | y = stringbuffer[2];
|
137 |
|
138 |
|
139 |
|
140 | if(stringbuffer[0] == 'E'|| stringbuffer[0] == 'e')
|
141 | {
|
142 | x = stringbuffer[1];
|
143 | y= stringbuffer [2];
|
144 |
|
145 | if(stringbuffer[1]<7)
|
146 | {
|
147 | PORTB |= (1 << x);
|
148 | PORTA &= ~(1 << y);
|
149 | }
|
150 |
|
151 | else
|
152 | { if(stringbuffer[1]>=7)
|
153 | {
|
154 | PORTD |= (1 << x);
|
155 | PORTA &= ~(1 << y);
|
156 | }
|
157 |
|
158 | }
|
159 | }
|
160 |
|
161 | else
|
162 | {
|
163 |
|
164 |
|
165 | if(stringbuffer[0] == 'A'|| stringbuffer[0] == 'a')
|
166 | {
|
167 | x = stringbuffer[1];
|
168 | y = stringbuffer[2];
|
169 |
|
170 | if(stringbuffer[1]<7)
|
171 | {
|
172 | PORTB &= ~(1 << x);
|
173 | PORTA |= (1 << y);
|
174 | }
|
175 |
|
176 | else
|
177 | { if(stringbuffer[1]>=7)
|
178 | {
|
179 | PORTD &= ~(1 << x);
|
180 | PORTA |= (1 << y);
|
181 | }
|
182 | }
|
183 | }
|
184 |
|
185 |
|
186 |
|
187 | }
|
188 |
|
189 |
|
190 |
|
191 |
|
192 |
|
193 |
|
194 | }
|