Ich mal wieder ;p
Ich wollte grad die Funktion meiner UART-Methoden erweitern und hab die
Funktion hinzugefügt, einen String zu senden. Er soll mir einen String
senden, sobald er etwas vom PC empfangen hat. Dies löse ich mit dem
Interrupt. Wenn ich ein einzelnes Zeichen sende funktioniert das auch
prima, doch wenn ich einen String zurücksenden möchte bekomme ich eine
Endlosschleife.. Kann mir wer sagen woran dass liegt? Hier der Code:
1 | #define F_CPU 16000000UL
|
2 | #define BAUD 9600UL
|
3 | #define MYUBRR F_CPU/16/BAUD-1
|
4 |
|
5 | #include <avr/io.h>
|
6 | #include <avr/delay.h>
|
7 | #include <avr/interrupt.h>
|
8 |
|
9 | void UART_init( unsigned int ubrr );
|
10 | void UART_transmit( char send );
|
11 | void UART_transmitString( char *s );
|
12 | char UART_recive( void );
|
13 |
|
14 | int main(void)
|
15 | {
|
16 | sei();
|
17 | UART_init(MYUBRR);
|
18 | while(1)
|
19 | {
|
20 |
|
21 | }
|
22 | }
|
23 |
|
24 | void UART_init( unsigned int ubrr )
|
25 | {
|
26 | // BAUD-Rate
|
27 | UBRR0H = (unsigned char) (ubrr >> 8);
|
28 | UBRR0L = (unsigned char) ubrr;
|
29 |
|
30 | // Senden/Empfangen aktivieren
|
31 | UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);
|
32 |
|
33 | // 1 Stop-Bit und 8 Data-Bits
|
34 | UCSR0C = (3 << UCSZ00);
|
35 | }
|
36 |
|
37 | void UART_transmit( char send )
|
38 | {
|
39 | // Warte auf leeren Transmitter-Buffer
|
40 | while( !(UCSR0A & (1 << UDRE0)));
|
41 | UDR0 = send;
|
42 | }
|
43 |
|
44 | void UART_transmitString(char *s)
|
45 | {
|
46 | while(*s)
|
47 | {
|
48 | UART_transmit(*s);
|
49 | s++;
|
50 | }
|
51 | }
|
52 |
|
53 | char UART_recive( void )
|
54 | {
|
55 | // Auf Daten warten
|
56 | while( !(UCSR0A & (1 << RXC0)));
|
57 |
|
58 | // Daten zurückgeben
|
59 | return UDR0;
|
60 | }
|
61 |
|
62 | ISR(USART_RX_vect)
|
63 | {
|
64 | UART_transmitString("Hallo Welt!");
|
65 | }
|