1 | #include <stdbool.h>
|
2 | #include <util/delay.h>
|
3 | #include <avr/io.h>
|
4 |
|
5 | void usart_puts(char* s);
|
6 | void usart_putc(unsigned char data);
|
7 | unsigned char usart_getc();
|
8 |
|
9 | #define LED_PORT PORTD
|
10 | #define LED_PIN PIND
|
11 | #define LED_1 PD5
|
12 | #define LED_2 PD6
|
13 |
|
14 |
|
15 | #define PACKET_LEN 1+1+1+1
|
16 | #define PACKET_NONE 0 //ID,?,?
|
17 | #define PACKET_LED 1 //ID,NR,AN/AUS
|
18 | #define LED_1_ON 1
|
19 | #define LED_1_OFF 2
|
20 | #define LED_1_TOGGLE 3
|
21 | char packet[PACKET_LEN];
|
22 |
|
23 | #define PUFFER_SIZE 100
|
24 | char puffer[PUFFER_SIZE];
|
25 | int puffer_schreiben=0;
|
26 | int puffer_lesen=0;
|
27 |
|
28 | void long_delay_ms(int time) {
|
29 | for(int i=0; i<time; i++) {
|
30 | _delay_ms(1);
|
31 | }
|
32 | }
|
33 | void readPacket() {
|
34 | int sum;
|
35 | bool erfolgreich=true;
|
36 | do {
|
37 | //Packet empfangen
|
38 | for(int i=0; i<PACKET_LEN; i++) {
|
39 | //Auf Datenbyte warten
|
40 | packet[i] = usart_getc();
|
41 | }
|
42 |
|
43 | //checksumme pruefen
|
44 | usart_puts("PRUEFEN\r\n");
|
45 | sum=0;
|
46 | for (int i=0; i<PACKET_LEN-1; i++) {
|
47 | sum+=packet[i];
|
48 | }
|
49 |
|
50 | //Rueckmeldung machen
|
51 | if (sum == packet[PACKET_LEN-1]) {
|
52 | erfolgreich = true;
|
53 | usart_puts("EMPFANGEN-OK\r\n");
|
54 | } else {
|
55 | erfolgreich = false;
|
56 | usart_puts("EMPFANGEN-ERROR\r\n");
|
57 | }
|
58 | } while(!erfolgreich);
|
59 | }
|
60 |
|
61 |
|
62 |
|
63 | void usart_putc( unsigned char data )
|
64 | {
|
65 | /* Wait for empty transmit buffer */
|
66 | while ( !(UCSRA & (1<<UDRE)) ) {
|
67 | }
|
68 |
|
69 | /* Put data into buffer, sends the data */
|
70 | UDR = data;
|
71 | }
|
72 |
|
73 | void usart_puts(char* s) {
|
74 | while (1) {
|
75 | if ('\0' == s[0])
|
76 | break;
|
77 | usart_putc (s[0]);
|
78 | s++;
|
79 | }
|
80 | }
|
81 |
|
82 |
|
83 |
|
84 | void usart_init() {
|
85 | uint16_t baud = 832; //1200 Baud - U2X=0
|
86 | /* Set baud rate */
|
87 | UBRRH = (unsigned char)(baud>>8);
|
88 | UBRRL = (unsigned char)baud;
|
89 |
|
90 | /* Enable receiver and transmitter */
|
91 | UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
|
92 |
|
93 | /* Set frame format: 8data, 2stop bit */
|
94 | UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
|
95 |
|
96 |
|
97 | }
|
98 |
|
99 | ISR (USART_RXC_vect)
|
100 | {
|
101 | //Daten speichern
|
102 | puffer[puffer_schreiben] = UDR;
|
103 |
|
104 | //Auf nächste freie stelle zeigen
|
105 | puffer_schreiben++;
|
106 | if (puffer_schreiben== PUFFER_SIZE) {
|
107 | puffer_schreiben = 0;
|
108 | }
|
109 |
|
110 | if ((LED_PIN & (1<<LED_1)) == 0) {
|
111 | LED_PORT |= (1<<LED_1);
|
112 | } else {
|
113 | LED_PORT &= ~(1<<LED_1);
|
114 | }
|
115 | }
|
116 |
|
117 | unsigned char usart_getc( void )
|
118 | {
|
119 | char* text = "WARTE\r\n";
|
120 | usart_puts(text);
|
121 | //Darauf warten das neue daten vorliegen
|
122 | while(puffer_schreiben==puffer_lesen) {
|
123 | }
|
124 | usart_puts("LESE\r\n");
|
125 |
|
126 | //Daten sichern
|
127 | char ret = puffer[puffer_lesen];
|
128 |
|
129 | //Auf das naechste byte zeigen
|
130 | puffer_lesen++;
|
131 | if(puffer_lesen==PUFFER_SIZE) {
|
132 | puffer_lesen=0;
|
133 | }
|
134 |
|
135 | //Daten zurück geben
|
136 | return ret;
|
137 | }
|
138 |
|
139 | int main() {
|
140 | cli();
|
141 | usart_init();
|
142 | sei(); // Wird nur gebraucht bei der Interrupt-Version
|
143 |
|
144 | usart_puts("usart_init_intr\r\n");
|
145 |
|
146 | //Led als ausgang
|
147 | DDRD |= (1<<LED_1);
|
148 |
|
149 | while(true) {
|
150 | usart_puts("while(true)\r\n");
|
151 | readPacket();
|
152 | usart_puts("Packet gelesen\r\n");
|
153 | switch (packet[0]) {
|
154 | case PACKET_NONE:
|
155 | usart_puts("Packet empfangen: NONE\r\n");
|
156 | break;
|
157 |
|
158 | case PACKET_LED:
|
159 | switch (packet[1]) {
|
160 | case LED_1_ON:
|
161 | LED_PORT |= (1<<LED_1);
|
162 | usart_puts("LED AN\r\n");
|
163 | break;
|
164 |
|
165 | case LED_1_OFF:
|
166 | LED_PORT &= ~(1<<LED_1);
|
167 | usart_puts("LED AUS\r\n");
|
168 | break;
|
169 |
|
170 | case LED_1_TOGGLE:
|
171 | if ((LED_PIN & (1<<LED_1)) == 0) {
|
172 | LED_PORT |= (1<<LED_1);
|
173 | } else {
|
174 | LED_PORT &= ~(1<<LED_1);
|
175 | }
|
176 | usart_puts("LED TOGGLE\r\n");
|
177 | break;
|
178 | default:
|
179 | break;
|
180 | }
|
181 | break;
|
182 |
|
183 | case '(':
|
184 |
|
185 | break;
|
186 |
|
187 | default:
|
188 | usart_puts("Packet empfangen: FEHLER\r\n");
|
189 | break;
|
190 | }
|
191 | }
|
192 | return 0;
|
193 | }
|