Hallo, in meinem AVR-Programm für einen ATmega16 möchte ich alle 20ms Werte über die Serielle Schnittstelle ausgeben. Das klappt vom Prinzip her auch. Nur manchmal hängt sich der AVR auf. Ich vermute mal, dass die while-Schleifen der UART-Ausgabe-Funktionen(siehe unten) schuldig sind (die restlichen Funktionen waren bis auf die Timer-ISR auskommentiert). Gibt es eine geschickte Möglichkeit dieses Aufhängen zu verhindern? Sebastian
1 | // bei neueren AVRs andere Bezeichnung fuer die Statusregister, hier ATmega16:
|
2 | int uart_putc(unsigned char c) |
3 | {
|
4 | while (!(UCSRA & (1<<UDRE))) // warten bis Senden moeglich |
5 | {
|
6 | }
|
7 | |
8 | UDR = c; // sende Zeichen |
9 | return 0; |
10 | }
|
11 | |
12 | |
13 | // puts ist unabhaengig vom Controllertyp
|
14 | void uart_puts (char *s) |
15 | {
|
16 | while (*s) |
17 | { // so lange *s != '\0' also ungleich dem "String-Endezeichen" |
18 | uart_putc(*s); |
19 | s++; |
20 | }
|
21 | }
|