UART: µC hört nicht auf zu senden

Gast #3216877
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.