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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.