Hallo, ich arbeite Momentan mit einem Mikrocontrollerboard 644p. Der Mikrocontroller 644p besizt zwei USARTs. Eine der Schnittstelle (RS232) von USART dient zum Empfang von Daten (X und Y Koordinaten), die von PC gesendet wurden. Die Zweite Schnittstelle (RS485) von USART der 644p soll die Daten von Mikrocontrollerboard zu einem anderen Gerät übertragen. Bevor ich die C-Code für die Datenübertragung schreibe, muss ich die USART von 644p initializieren. Ich habe selber versucht, die beide USART vom 644p zu initializieren und die C-Code lautet: #include <avr/interrupt.h> #include <util/delay.h> #include <string.h> #include <stdlib.h> #include <avr/interrupt.h> #include <util/delay.h> #define FOSC 8000000 // Clock Speed #define BAUD 9600UL // Berechnungen zur Baudrate: #define UBRR_VAL ((FOSC+BAUD*8)/(BAUD*16)-1) // clever runden // USART Initialization void USART_Init (unsigned int ubrr) { /* Set baud rate */ UBRR0H = (unsigned char)(ubrr>>8); UBRR0L = (unsigned char) ubrr; UBRR1H = (unsigned char)(ubrr>>8); UBRR1L = (unsigned char) ubrr; /* Enable receiver, transmitter */ UCSR0B = (1<<RXEN0)|(1<<TXEN0)); UCSR1B = (1<<RXEN1)|(1<<TXEN1); /* Set frame format: 8data, 2stop bit */ UCSR0C = (1<<USBS0)|(3<<UCSZ00); UCSR1C = (1<<USBS1)|(3<<UCSZ10); } /*============Erste USART=====================*/ /* Data Reception (The USART Receiver) */ unsigned char USART_Receive (void) { /* Wait for data to be received */ while(!(UCSR0A & (1<<RXC0)) ); /* Get and return received data from buffer */ return UDR0; } // Data Transmission (The USART Transmitter) void USART_Transmit (unsigned char data) { /* Wait for empty transmit buffer */ while ( !(UCSR0A & (1<<UDRE0)) ); //warten bis Senden moeglich /* Put data into buffer and sends the data */ UDR0 = data; } /*=============Zweite USART===========================*/ unsigned char USART_Receive (void) { /* Wait for data to be received */ while(!(UCSR1A & (1<<RXC1)) ); /* Get and return received data from buffer */ return UDR1; } // Data Transmission (The USART Transmitter) void USART_Transmit (unsigned char data) { /* Wait for empty transmit buffer */ while ( !(UCSR1A & (1<<UDRE1)) ); //warten bis Senden moeglich /* Put data into buffer and sends the data */ UDR1 = data1; } Kann jemand mir sagen, ob meine Initializierung stimmt. Ich bitte Sie um Hilfe. MFG Luffy
Du hast mehrere Funktionen mit gleichem Namen definiert! Mach dir Paare: unsigned char USART0_Receive (void) unsigned char USART1_Receive (void) void USART0_Transmit (unsigned char data) void USART1_Transmit (unsigned char data)
Hallo nochmal, du hast recht Krapao. Ich habe vergessen, die Funktionen anders zu definieren. Danke für die Bemerkung. Gibt es sonst noch was in meinem C-Code zu modifizieren ? Danke im Voraus. Luffy.
Luffy, das siehst du beim Compiler lauf... Warum wird immer wieder nicht übersetzter Code zur Diskussion gestellt ?
Auf den ersten Blick verwendest du die gleiche Initialisierung, wie sie im Datenblatt auf Seite 177 zu sehen, ist mit dem Unterschied, dass du in einer Funktion beide UARTs initialisierst. Da ist IMHO nix problematisch dran. Von der Praxis her musst du halt sicher stellen, dass du genaue 8 MHz als Taktquelle hast. Das ist aber in der [[AVR Checkliste]] und wahrscheinlich auch in den diversen Tutorials zum AVR UART erläutert.
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.