hallo, ich hab mal wieder ein Problem bei dem ich nicht alleine weiterkomme und deshalb hoffe hier einen guten Rat zu bekommen... Es handelt sich um folgendes: Ich möchte per USART an meinen uC (ATmega48) senden und danach das gesendete wieder empfangen. Das Senden senden klappt auch schon ganz gut(regelmäßige PWM am Pin), aber der Pin fürs senden bleibt unberührt auf 5V Versorgungsspannung, sprich empfangen funktioniert nicht. Hier mein Quellcode: void Init_Transmit(void) { unsigned char Data = 100; //USART initialisieren UBRR0 = 49; //Baudrate 10000 UCSR0B |= (1<<TXEN0); //enable transmitter UCSR0C |= (1<<UCSZ00) | (1<<UCSZ01); //8 Bit character size while(!(UCSR0A & (1<<UDRE0))) //wait for empty transmit buffer { } UDR0 = Data; //put data into buffer, sends the data } unsigned char Init_Receive(void) { unsigned char Data = 0; //USART initialisieren UBRR0 = 49; //Baudrate 10000 UCSR0B |= (1<<RXEN0); //enable reveiver UCSR0C |= (1<<UCSZ00) | (1<<UCSZ01); //8 Bit character size while(!(UCSR0A & (1<<UDRE0))) //wait for data to be received { } return Data; //get and return reveived data from buffer } void main(void) { DDRD |= (1<<DDD1); //TX output DDRD &= ~(1<<DDD0); //RX input unsigned char Data = 0; while(1) { Init_Transmit(); Data = Init_Receive(); } } Vielen Dank schon mal im Vorraus für eure Beiträge... Gruß Daniel
1/ UDR0 enthält dein empfangenes Zeichen ;-) 2/ (für den Schönheitspreis) Ziehe den Initialisierungsteil in eine eigene Routine, die du vor der eigentlichen Arbeitsschleife ausführst.
1 | void init_uart(void) |
2 | {
|
3 | //USART initialisieren
|
4 | UBRR0 = 49; //Baudrate 10000 |
5 | UCSR0B |= (1<<TXEN0) | (1<<RXEN0); //enable transmitter+receiver |
6 | UCSR0C |= (1<<UCSZ00) | (1<<UCSZ01); //8 Bit character size |
7 | }
|
8 | |
9 | void Init_Transmit(void) |
10 | {
|
11 | unsigned char Data = 100; |
12 | while(!(UCSR0A & (1<<UDRE0))) //wait for empty transmit buffer |
13 | {
|
14 | }
|
15 | UDR0 = Data; //put data into buffer, sends the data |
16 | }
|
17 | |
18 | unsigned char Init_Receive(void) |
19 | {
|
20 | unsigned char Data = 0; |
21 | while(!(UCSR0A & (1<<UDRE0))) //wait for data to be received |
22 | {
|
23 | }
|
24 | data = UDR0; // <=== |
25 | return data; // bzw. gleich return UDR0; |
26 | }
|
27 | |
28 | void main(void) |
29 | {
|
30 | DDRD |= (1<<DDD1); //TX output |
31 | DDRD &= ~(1<<DDD0); //RX input |
32 | unsigned char Data = 0; |
33 | |
34 | init_uart(); // <== |
35 | |
36 | while(1) |
37 | {
|
38 | Init_Transmit(); |
39 | Data = Init_Receive(); |
40 | }
|
41 | }
|
guten morgen, vielen dank für deine hilfe. jetzt funktionierts endlich! werd mir das merken mit der schönheitskorrektur ;) danke nochmals, daniel
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.