UART: µC hört nicht auf zu senden

Gast #3216877
Lesenswert?

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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren