Moin!!!
Ich versuche gerade Daten per UART an meinen PC zu senden. Zum Senden
vom Controller aus habe ich 8 Datenbits, 2 Stopbits und Parität disabled
eingestellt.
Wenn ich nun beispielsweise eine 1 senden will und mit die empfangenen
Werte im Terminal ansehe, liegt folgendes Bitmuster vor: 11100001.
Bei einer 2 -> 11100010
Bei einer 3 -> 11100011
und so weiter.
Ich habe echt keine Idee woran das liegen könnte.
Da mein Code noch sehr einfach ist, werde ich hier einfach mal meine
Funktionen Posten:
Zuerst mein Hauptprogramm:
1 | /*RS232.c*/
|
2 |
|
3 | #include <avr/io.h>
|
4 |
|
5 | int main(void)
|
6 | {
|
7 | unsigned char data;
|
8 | data = 3;
|
9 |
|
10 | init_rs232();
|
11 | set_rs232_baud();
|
12 |
|
13 | while(!(UCSRA & (1<<UDRE)))
|
14 | {
|
15 | }
|
16 | UDR = data;
|
17 |
|
18 | while(1)
|
19 | {
|
20 | }
|
21 | }
|
Dann die Funktionen für die Initialisierung:
1 | /*rs232_init.c*/
|
2 |
|
3 |
|
4 | #include <avr/io.h>
|
5 |
|
6 | #ifndef F_CPU
|
7 | #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 16000000"
|
8 | #define F_CPU 16000000UL
|
9 | #endif
|
10 |
|
11 | #define BAUD 9600
|
12 | #include <util/setbaud.h>
|
13 |
|
14 | void init_rs232(void)
|
15 | {
|
16 | /* UART Status/Control Register (A) */
|
17 | UCSRA = 0x00;
|
18 |
|
19 | /* UART Control Register (B) */
|
20 | UCSRB = 0x00
|
21 | UCSRB |= (1<<TXEN); //Transmitter Enable
|
22 |
|
23 | /* UART Control Register (C) */
|
24 | UCSRC = 0x00;
|
25 | UCSRC |= (1<<URSEL);
|
26 | //Select bit:1 -> write to UCSRC 0 -> write to Baud rate Register
|
27 | UCSRC |= (1<<USBS); //2 Stop Bits
|
28 | UCSRC |= ((1<<UCSZ1) | (1<<UCSZ0));
|
29 | //combined with UCSZ2 = 0 -> 8Bit data
|
30 | UCSRC &= ~(1<<URSEL);
|
31 | //Asynchronous Mode 8N2
|
32 | }
|
33 |
|
34 | void set_rs232_baud(void)
|
35 | {
|
36 | UBRRH = UBRRH_VALUE;
|
37 | UBRRL = UBRRL_VALUE;
|
38 | }
|
Ich hoffe mir kann hier irgendwer einen Tipp geben.
Grüße Jan