Hallo, ich weiß nicht weiter mit diesem Mini-Codeschnipsel. Er soll einfach permanent via printf "12345" ausgeben. Aber die UART sendet sehr langsam. Ist evtl. mein Chip defekt? Hat jemand gerade einen Mega8 und könnte das mal ausprobieren? oder sieht jemand den Fehler? Ich hatte schonmmal gepostet und die Register überprüft.. Mit dem Mega2560 und angepaßten Registern geht es.. seltsam..
1 | #ifndef F_CPU
|
2 | #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 1000000"
|
3 | #define F_CPU 1000000UL
|
4 | #endif
|
5 | |
6 | // Berechnungen für RS232
|
7 | #define BAUD 1200UL // Baudrate 1200
|
8 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // USART Baud Rate Register
|
9 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
|
10 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
|
11 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
12 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
13 | #endif
|
14 | |
15 | #include <avr/io.h> |
16 | #include <stdio.h> |
17 | |
18 | int main(void); |
19 | static void USART_Init( unsigned int ubrr); |
20 | int uart_putchar(char c, FILE *stream); |
21 | static FILE mystdout = FDEV_SETUP_STREAM( uart_putchar, NULL, _FDEV_SETUP_WRITE ); |
22 | |
23 | //*******************************************************
|
24 | int main(void) |
25 | {
|
26 | USART_Init(UBRR_VAL); |
27 | stdout = &mystdout; |
28 | while(1) { printf("12345\n"); } |
29 | }
|
30 | |
31 | int uart_putchar( char c, FILE *stream ) |
32 | {
|
33 | if( c == '\n' ) |
34 | uart_putchar( '\r', stream ); |
35 | |
36 | loop_until_bit_is_set( UCSRA, UDRE ); |
37 | UDR = c; |
38 | return 0; |
39 | }
|
40 | |
41 | void USART_Init( unsigned int ubrr) |
42 | {
|
43 | UBRRH = (unsigned char)(ubrr>>8); |
44 | UBRRL = (unsigned char)ubrr; |
45 | //Enable receiver and transmitter
|
46 | UCSRB = (1<<RXEN)|(1<<TXEN); |
47 | //Set frame format: 8N1
|
48 | UCSRC = (3<<UCSZ0); |
49 | }
|