Guten morgen, ich habe ein Problem mit USART. Ich benutze einen ATmega48 und möchte per USART mit dem PC kommunizieren (senden und empfangen). Das senden klappt auch schon ganz gut aber empfangen kann ich leider nichts. Ich hoffe ihr könnt mir weiterhelfen. Wäre echt super... void Init_USART(void) { unsigned char x; //Hilfsvariable UBRR0 = 51; //Baudrate = 9600 UCSR0B |= (1<<RXEN0) | (1<<TXEN0); //enable Transmitter & Receiver UCSR0C |= (1<< UCSZ00) | (1<<UCSZ01); //8 Bits, ein Stroppbit x = UDR0; //Empfänger leeren } void USART_Transmit(void) { unsigned char Data = 100; //Daten die gesendet werden sollen while(!(UCSR0A & (1<<UDRE0))) //warte bis Empfangsbuffer leer { } UDR0 = Data; //put data into buffer, sends the data } unsigned char USART_Receive(void) { while(!(UCSR0A & (1<<UDRE0))) //warte auf die Daten die übertragen werden sollen { } return UDR0; //get and return data } void main(void) { DDRD |= (1<<DDD1); //PD1 output DDRD &= ~(1<<DDD0); //PD0 input unsigned char Data = 0; //Hilfsvariable Init_USART(); //initialisiere USART while(1) { USART_Transmit(); //USART senden Data = USART_Receive(); //USART empfangen } } Danke schon mal im Vorraus!! Gruß Roland
Wieso benutzt du zum Empfangen nicht den RX-Complete-INT? das mit dem Polling wird so nicht funktionieren, da dein UDR0 direkt nach dem Senden '0' ist, somit läuft deine RX-Routine sofort durch. Du könntest es so probieren:
1 | void USART_Transmit(void) |
2 | {
|
3 | unsigned char Data = 100; //Daten die gesendet werden sollen |
4 | while(!(UCSR0A & (1<<UDRE0))) //warte bis Empfangsbuffer leer |
5 | {
|
6 | }
|
7 | UDR0 = Data; //put data into buffer, sends the data |
8 | while(!(UCSR0A & (1<<UDRE0))) //warte bis Empfangsbuffer leer |
9 | {
|
10 | }
|
11 | }
|
Äh, probier mal das:
1 | unsigned char USART_Receive(void) |
2 | {
|
3 | while(!(UCSR0A & (1<<RXC))) //warte bis ein Byte empfangen wurde |
4 | ;
|
5 | return UDR0; //get and return data |
6 | }
|
Das UDRE-Bit hat ja nicht mit dem Empfangen zu tun... hth. Jörg ps.: wir haben hier ein tolles AVR-GCC-Tutorial, das beantwortet solche Fragen doch auch
Ersteinmal danke für eure Antworten. Hab eure Ratschläge befolgt aber es will sich immer noch nichts tun. Irgendwie funktionierts einfach nicht. Ich benutze alls Simulator Lap View. Kann ich eigentlich an der Hardware(PIN´s) auch messen ob gesendet oder empfangen wurde. Müsste doch eigentlich auf HIGH bzw LOW ziehen oder liege ich da falsch? So könnte ich feststellen ob es vll ein Inititalisierungsproblem von Lap View ist... @Jörg: Ja ich weiß, hab das Tutorium auch schon durchgekaut und das Datasheet ein paar mal gelesen, bin aber nicht fündig geworden. Das RXN0-Bit war mal wieder einer dieser berühmt/berüchtigten Schreibfehler(wenn man aus einer anderen Funktion etwas kopiert und vergisst zu ändern) ;-) mfg Roland
Probier mal das Hterm als Terminalprogramm! Ist einfach und übersichtlich zu bedienen und muss nicht mal installiert werden! http://www.der-hammer.info/terminal/index.htm
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.