Es ist ein GCC Problem. Kann es mir aber nicht erklaeren. Der Code sieht
folgendermassen aus:
1 | /* Serielle Kommunikation */
|
2 | /* 4800 Baud, 8 Databits, 1 Stopbit, keine Paritaet */
|
3 |
|
4 | #include <stdint.h>
|
5 | #include <stdlib.h>
|
6 | #include <avr/io.h>
|
7 |
|
8 | char test;
|
9 |
|
10 | void uart_sendchar(unsigned char c)
|
11 | {
|
12 | while (!(UCSRA & (1<<UDRE))) /* Warten bis sendebereit */
|
13 | {
|
14 | }
|
15 | UDR = c; /* Zeichen senden */
|
16 | }
|
17 |
|
18 | void uart_sendstring (char *s)
|
19 | {
|
20 | while (*s)
|
21 | {
|
22 | uart_sendchar(*s);
|
23 | s++;
|
24 | }
|
25 | }
|
26 |
|
27 | char uart_receivechar(void)
|
28 | {
|
29 | while (!(UCSRA & (1<<RXC))) /* Warten bis Zeichen verfuegbar */
|
30 | {
|
31 | }
|
32 | return UDR;
|
33 | }
|
34 |
|
35 | int main(void)
|
36 | {
|
37 | UCSRB |= (1<<TXEN); /* Transmitter enable */
|
38 | UCSRB |= (1<<RXEN); /* Receiver enable */
|
39 | UBRR = 51; /* Baudrate bei 4MHz und 4800baud */
|
40 |
|
41 | uart_sendstring("Hallo PC !");
|
42 |
|
43 | while(1)
|
44 | {
|
45 |
|
46 | test=uart_receivechar;
|
47 |
|
48 | while (!(UCSRA & (1<<RXC))) /* !(UCSRA & (1<<RXC)) Warten bis Zeichen verfuegbar */
|
49 | {
|
50 | }
|
51 | test = UDR;
|
52 | uart_sendstring("Empfange:");
|
53 | uart_sendchar(test);
|
54 | uart_sendstring("\n\r");
|
55 | }
|
56 |
|
57 |
|
58 | return 0;
|
59 | }
|
Das Problem verursacht die Routine uart_receivechar(void). Wie es
aussieht wird sie niemals aufgerufen, deshalb kommt auch die Ausgabe
"Empfange" ohne dass wirklich etwas da ist. Bringe ich den Inhalt der
Routine in die Hauptschleife, dann wird wirklich gewartet bis ein
Zeichen eingetroffen ist und dieses dann auch ausgegeben.
Kann mir jemand den Grund sagen wieso die Routine nicht
aufgerufen/ausgefuehrt wird ?
-Hugo