Hallo, ich arbeite mich gerade in die serielle Kommunikation mit AVR ein. Setup: AVR4433, MAX232, Anbindung an PC. Auf dem uC laeuft ein kleines Programm aus dem AVR-GCC Tutorial. Dieses macht nicht anderes als das Empfangsbit im UART Statusregister zu pollen und beim Ankommen eines Zeichens dieses auszulesen und an den PC zurueckzuschicken. Leider gibt es da ein kleines Problem: Auch wenn nichts vom PC gesendet wird glaubt der AVR etwas empfangen zu haben. Selbst wenn ich die TX Leitung vom PC abziehe scheint der AVR immer noch etwas zu empfangen. Gibt es da kleingedrucktes was ich uebersehen haben ? -Hugo
Rx Leitung vom Controller nicht per MAX232 an Tx-Anschluss vom PC. Sondern irgendwo anders, oder verkehrt. Schaltplan könnte helfen. Programm auch.
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
Hallo,
willst du damit
>> test=uart_receivechar; <<
deine Funktion aufrufen? Versuch's mal mit Klammern für die Funktion.
Tschüss
Torsten
> >> test=uart_receivechar; << > deine Funktion aufrufen? Versuch's mal mit Klammern für die Funktion. Das koennte eine Ursache sein. Bin zu verdorben mit Pascal... Danke! -Hugo
Das sollte aber eigentlich einen Kompilier-Fehler geben. Und warum ist "test" als globale Variable angelegt? Da scheint aber jemand wirklich was mit Pascal zu verwechseln ;)
Simon Küppers wrote:
> Das sollte aber eigentlich einen Kompilier-Fehler geben.
Nö, ist ja kein Fehler. Gibt nur ne Warnung.
Aber viele Leute denken ja, Warnungen sind nur dazu da, daß man sie nie
durchliest.
Peter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.