main.c


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
}