Hallo,
Habe ein Problem mit den UART leider muss ich vor jeden Senden 105us
warten da es sonst zu Überschneidungen der Bytes kommt, ich benutze
einen max3232 sowie einen atmega88 auf 20mhz irgend jemand eine Idee
woran es liegen könnte evtl. Fehlerate zu hoch ?
Gruss Rudolf
MAIN
1 | #define F_CPU 20000000UL
|
2 |
|
3 | #include <stdio.h>
|
4 | #include <string.h>
|
5 | #include <avr/io.h>
|
6 | #include <avr/interrupt.h>
|
7 | #include <util/delay.h>
|
8 | #include "usart.h"
|
9 |
|
10 | // Defines
|
11 | #define sleep() asm volatile ("nop")
|
12 |
|
13 | //Prototypen
|
14 |
|
15 |
|
16 | //Hauptprogramm
|
17 |
|
18 | //Globale Variablen
|
19 | uint8_t temp;
|
20 |
|
21 |
|
22 |
|
23 | int main (void)
|
24 | {
|
25 |
|
26 | USART0_init();
|
27 | USART0_puts((uint8_t *)"Hello\n");
|
28 |
|
29 | sei(); //irq enable
|
30 |
|
31 |
|
32 | while(1) //hauptschleife
|
33 | {
|
34 | //casten
|
35 | //
|
36 | // USART0_write(0x41);
|
37 | // USART0_write(0x42);
|
38 | // USART0_write(0x43);
|
39 | // _delay_ms(1000);
|
40 |
|
41 | //nix
|
42 | }
|
43 | // cli(); //int deaktivieren
|
44 | return (1);
|
45 | }
|
46 |
|
47 |
|
48 | ISR(USART_RX_vect)
|
49 | {
|
50 | temp = UDR0; //daten vom uart
|
51 | USART0_write(temp);
|
52 | }
|
USART.C
1 | // -------------
|
2 | // --- usart ---
|
3 | // -------------
|
4 |
|
5 | #include <avr/io.h>
|
6 | #include <avr/interrupt.h>
|
7 | #include <util/delay.h>
|
8 |
|
9 |
|
10 | //USART0 TX Complete
|
11 | //ISR(USART_TX_vect)
|
12 | //{
|
13 | //}
|
14 |
|
15 | //USART0 Data Register Empty
|
16 | //ISR(USART_UDRE_vect)
|
17 | //{
|
18 | //}
|
19 |
|
20 | void USART0_init()
|
21 | {
|
22 | // settings: 115200 8-n-1
|
23 | // real baud = 119047
|
24 | // error = 3.3394097222222197%
|
25 | // Set baud rate
|
26 | UBRR0H = 0;
|
27 | UBRR0L = 20;
|
28 | UCSR0A = (1<<U2X0);
|
29 | // Enable receiver and transmitter
|
30 | UCSR0B = (1<<RXCIE0)|(1<<RXEN0) | (1<<TXEN0);
|
31 | // Set frame format
|
32 | UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);
|
33 |
|
34 |
|
35 | }
|
36 |
|
37 | void USART0_write(uint8_t data)
|
38 | {
|
39 | _delay_us(105); //sonst fehler
|
40 |
|
41 | // Wait for empty transmit buffer
|
42 | while ( !( UCSR0A & (1<<UDRE0)) ) ;
|
43 | // Put data into buffer, sends the data
|
44 | UDR0 = data;
|
45 | }
|
46 |
|
47 | uint8_t USART0_read()
|
48 | {
|
49 | // Wait for data to be received
|
50 | while ( !(UCSR0A & (1<<RXC0)) );
|
51 | return UDR0;
|
52 | }
|
53 |
|
54 |
|
55 | void USART0_puts(unsigned char *txt)
|
56 | {
|
57 | while (*txt) USART0_write(*txt++);
|
58 | }
|