Hallo zusammen,
ich versuche gerade eine UART-Übertragung zu meinem PC (Win 7, 64 bit,
HTerm 0.8.1beta und uCon 7.1 als Terminals, WinAVR vom 13.03.2009,
Code::Blocks als IDE, AVRDude zum flashen).
Der ATMega 8515L sitzt auf einem STK 500.
Den Init-Code habe ich zum großteil aus dem Datenblat von Atmel
übernommen bzw. Angepasst. Insgesamt sollte ein Frame 8 Datenbits, 2
Stopbits und keine Parität haben. Die Baudrate von 9600 sollte auch
stimmen.
Das Problem ist, dass ich statt der erwarteten Zahlen von 0 bis 9 die
Buchstaben 'p' bis 'y' empfange. Sprich, der ASCII-Code weißt
irgendwoher eine Art "Offset" von 0x40 auf. Weiß einer von Euch woran
das liegen kann oder was ich falsch gemacht hab?
Hier 'mein' Quelltext:
1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 | #ifndef F_CPU
|
4 | #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
|
5 | #define F_CPU 4000000UL // Systemtakt in Hz - Definition als unsigned long beachten
|
6 | // Ohne ergeben sich unten Fehler in der Berechnung
|
7 | #endif
|
8 |
|
9 | #define BAUD 9600UL // Baudrate
|
10 |
|
11 | // Berechnungen
|
12 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
13 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
14 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
15 |
|
16 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
17 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
18 | #endif
|
19 |
|
20 | void uart_init(void)
|
21 | {
|
22 | UBRRH = UBRR_VAL >> 8;
|
23 | UBRRL = UBRR_VAL & 0xFF;
|
24 | UCSRB |= (1 << TXEN);
|
25 | UCSRC |= (1<<URSEL) |(1<<USBS) | (1<< UCSZ0) |(1<<UCSZ1) | (0 << UCSZ2);
|
26 | UCSRC |= (0 << UMSEL);
|
27 | UCSRC |= (0<< UPM1) | (0 << UPM0);
|
28 | }
|
29 |
|
30 | void allg_init(void)
|
31 | {
|
32 | DDRB = 0xFF;
|
33 | PORTB = 0xFF;
|
34 | }
|
35 |
|
36 | int uart_putc(unsigned char c)
|
37 | {
|
38 | while(! (UCSRA & (1 <<UDRE))){
|
39 | ;
|
40 | }
|
41 | uint8_t i = (uint8_t) c;
|
42 | UDR = c;
|
43 | PORTB = ~i;
|
44 | return 0;
|
45 | }
|
46 |
|
47 | int main(void)
|
48 | {
|
49 | uart_init();
|
50 | allg_init();
|
51 | unsigned char c;
|
52 | uint8_t i;
|
53 | for(i = 0; i < 10; i++){
|
54 | c =(unsigned char) (i + 0x30);
|
55 | PORTB = ~i;
|
56 | uart_putc(c);
|
57 | _delay_ms(900);
|
58 | _delay_ms(900);
|
59 | _delay_ms(900);
|
60 | PORTB = ~(i +0x30);
|
61 | _delay_ms(900);
|
62 | _delay_ms(900);
|
63 | _delay_ms(900);
|
64 | }
|
65 | c = (unsigned char) (0 + 0x30);
|
66 | PORTB = ~(0+0x30);
|
67 | uart_putc(c);
|
68 | while(1)
|
69 | {
|
70 | ;
|
71 | }
|
72 | return 0;
|
73 | }
|