Hallo,
ich bin gerade dabei, mich mit dem UART zu beschäftigen. Ich möchte,
dass der µC einen Wert sendet, sobald er ein Byte empfängt.
Der Controller sendet auch, sobald der Interrupt kommt - aber er hört
nicht mehr damit auf!
Kann wer helfen?
Danke
1 | #define F_CPU 18432000UL
|
2 | #define BAUD 115200UL
|
3 | #include <avr/io.h>
|
4 | #include <stdint.h>
|
5 | #include <avr/interrupt.h>
|
6 |
|
7 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
8 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
9 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
10 |
|
11 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
12 | #error Systematischer Fehler der Baudrate groesser 1% und damit zu hoch!
|
13 | #endif
|
14 |
|
15 | //Methodendeklaration====================================================================
|
16 | void uart_init(void);
|
17 | void uart_putValue(uint16_t v);
|
18 |
|
19 | //=======================================================================================
|
20 | volatile uint16_t value =0; //Variable, die gesendet werden soll
|
21 | volatile uint8_t SendFlag =0; //Wenn gesetzt, soll gesendet werden
|
22 |
|
23 | ISR(USART_RX_vect){
|
24 | SendFlag=1; //Wenn ein Zeichen empfangen wird, soll eins gesendet werden
|
25 | }
|
26 |
|
27 | int main (void){
|
28 | uart_init();
|
29 | sei(); //Interrupts einschalten
|
30 |
|
31 | while(1){
|
32 |
|
33 | if(SendFlag==1){
|
34 | SendFlag=0;
|
35 | value++;
|
36 | uart_putValue(value);
|
37 | }
|
38 |
|
39 | }//while
|
40 | }//main
|
41 |
|
42 |
|
43 |
|
44 | //Methoden====================================================================================
|
45 | void uart_init(void)
|
46 | {
|
47 | UBRRH = UBRR_VAL >> 8;
|
48 | UBRRL = UBRR_VAL & 0xFF;
|
49 | UCSRB |= (1<<TXEN)|(1<<RXEN)|(1<<RXCIE); // UART Senden und Empfangen einschalten
|
50 | UCSRC = (1<<UCSZ1)|(1<<UCSZ0)|(3<<UCSZ0); // Asynchron 8N1
|
51 | }
|
52 |
|
53 | void uart_putValue(uint16_t v){
|
54 | while (!(UCSRA & (1<<UDRE))){} // warten bis Senden moeglich
|
55 | UDR = ((v >> 8) & 0xFF); // HighByte senden
|
56 | while (!(UCSRA & (1<<UDRE))){}
|
57 | UDR = ((v >> 0) & 0xFF); // LowByte senden
|
58 | }
|