hi ich will eine uart schnittstelle mit 921600 baud erzeugen mittels atmega644. das programm funktioniert mit 38400 baud jedoch wenn ich diesen wert dann auf 921600 ändere nicht mehr. hier der code: main.c
1 | /*** main.c ***/
|
2 | #include <avr/io.h> |
3 | #include <util/delay.h> |
4 | #include "cam_uart.h" |
5 | #include "cam.h" |
6 | |
7 | int main(void) |
8 | {
|
9 | |
10 | init_uart(); |
11 | |
12 | cam_init(); |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | return; |
21 | }
|
cam_uart.c
1 | /*** cam_uart.c ***/
|
2 | #include <avr/io.h> |
3 | #include "cam_uart.h" |
4 | |
5 | |
6 | void init_uart() |
7 | {
|
8 | |
9 | |
10 | UBRR0=UBRR_VAL; |
11 | |
12 | |
13 | |
14 | /* Enable receiver and transmitter */
|
15 | UCSR0B = (1<<RXEN0)|(1<<TXEN0); |
16 | /* Set frame format: 8data, 1stop bit */
|
17 | UCSR0C = (0<<USBS0)|(3<<UCSZ00); |
18 | |
19 | }
|
20 | |
21 | void uart_putc( unsigned char data ) |
22 | {
|
23 | /* Wait for empty transmit buffer */
|
24 | while ( !( UCSR0A & (1<<UDRE0)) ) |
25 | ;
|
26 | /* Put data into buffer, sends the data */
|
27 | UDR0 = data; |
28 | }
|
cam.c
1 | /****cam.c****/
|
2 | #include <avr/io.h> |
3 | #include "cam_uart.h" |
4 | #include "cam.h" |
5 | #include <util/delay.h> |
6 | |
7 | void cam_init(void){ |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | while(1) |
15 | {
|
16 | |
17 | uart_putc(0xFF); // in while |
18 | uart_putc(0xFF); // in while |
19 | uart_putc(0xFF); // in while |
20 | uart_putc(0x0E); // in while |
21 | uart_putc(0x0D); // in while |
22 | uart_putc(0x00); // in while |
23 | uart_putc(0x00); // in while |
24 | uart_putc(0x00); // in while |
25 | |
26 | |
27 | |
28 | }
|
29 | |
30 | }
|
cam_uart.h
1 | #ifndef cam_uart_h
|
2 | #define cam_uart_h
|
3 | |
4 | #define BAUD 921600UL // Baudrate
|
5 | |
6 | #ifndef F_CPU
|
7 | //#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 14745600UL"
|
8 | #define F_CPU 14745600UL // Systemtakt in Hz
|
9 | // Definition als unsigned long beachten
|
10 | // Ohne UL ergibt Fehler in der Berechnung
|
11 | #endif
|
12 | |
13 | // Berechnungen
|
14 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
15 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
16 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
|
17 | // Fehler in Promille, 1000 = kein Fehler
|
18 | |
19 | |
20 | |
21 | |
22 | |
23 | void init_uart(void); |
24 | void uart_putc(unsigned char c); |
25 | #endif /* cam_uart_h */ |