Forum: Mikrocontroller und Digitale Elektronik UART: µC hört nicht auf zu senden


von Georg (Gast)


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
}

von Jim M. (turboj)


Lesenswert?

Dein RX Interrupt Handler löscht das RX Flag nicht. Hinweis: Das UDR 
Register auslesen.

von Georg (Gast)


Lesenswert?

Cool! Es geht!!
Danke :-) :-) :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.