Hallo zusammen,
ich habe mich heute mal an der seriellen Schnittstelle des ATtiny441
beschäftigt und dazu ein einfaches Echoprogramm geschrieben.
Die Kommunikation funktioniert auch grundsätzlich, aber die Daten sind
fehlerhaft. Deshalb schließe ich auf eine falsche Frame-Einstellung,
kann ihn aber nicht finden. Kann mir jemand weiter helfen?
Hier ist der Code:
1 | #define F_CPU 1843200UL
|
2 | #define UART_BAUD_RATE 9600UL
|
3 |
|
4 | #include <avr/io.h>
|
5 | #include <avr/interrupt.h>
|
6 |
|
7 | void UART_Init( unsigned int baud )
|
8 | {
|
9 | int UBRR_value = (F_CPU/(baud*16))-1; //UBRR setzen
|
10 | UBRR0H = (unsigned char) (UBRR_value >> 8);
|
11 | UBRR0L = (unsigned char) UBRR_value;
|
12 |
|
13 | UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0); //RX, TX, RXinterrupt aktivert
|
14 |
|
15 | UCSR0C = (1<<UCSZ01)|(1<<UCSZ00); //Frame format: 8N1
|
16 | }
|
17 |
|
18 | void UART_Transmit( char data )
|
19 | {
|
20 |
|
21 | while( !( UCSR0A & (1<<UDRE0)) );//auf leeren transmitbuffer warten
|
22 | UDR0 = data; //daten in buffer legen und senden
|
23 | }
|
24 |
|
25 | ISR (USART0_RX_vect)
|
26 | {
|
27 | char daten = UDR0;
|
28 | UART_Transmit(daten);
|
29 |
|
30 | }
|
31 |
|
32 |
|
33 | int main(void)
|
34 | {
|
35 | UART_Init(UART_BAUD_RATE);
|
36 | sei(); //Interrupt reset
|
37 | while(1)
|
38 | {
|
39 | //TODO:: Please write your application code
|
40 | }
|
41 | }
|
Beste Grüße
Frogtime