XMEGA USART Sendepuffer

Gast #3715043
Lesenswert?
• ▲
▼
Hallo.
Ich habe momentan eine Denkblockade ;). Und zwar möchte ich auf einem 
XMega 128A1 einen Sendepuffer fürs USART anlegen, doch all meine 
Bemühungen sind bisher vergebens. Hier erst mal der Code:
1
#define FT232_Puffer_Grose_TX 512
2
char FT232_Sendepuffer[FT232_Puffer_Grose_TX] = {0};
3

4
volatile uint16_t FT232_Zahler_TX_0=0;
5
volatile uint16_t FT232_Zahler_TX_1=0;
6

7
volatile uint8_t FT232_Control = 0;
8
#define FT232_Control_TX_Puffer_Uberlauf 0
9
#define FT232_Control_TX_ubertragung_Aktiv 2
10

11

12
void FT232_sende_Byte (char Zeichen) {
13

14
  if (!(FT232_Control & (1<<FT232_Control_TX_ubertragung_Aktiv))){ // prüft ob bereits eine Übertragung in gange ist
15
    USARTD0_DATA = Zeichen;                                      // starte übertragung
16
    FT232_Control |= (1<<FT232_Control_TX_ubertragung_Aktiv);    // setze Flag
17
  } else {
18
  
19
  while ((FT232_Control & (1<<FT232_Control_TX_Puffer_Uberlauf)))// warte bis Pufferüberlauf behoben
20
    
21
  FT232_Sendepuffer[FT232_Zahler_TX_0] = Zeichen;                // Schreibe Byte in Puffer
22
  if (FT232_Zahler_TX_0 == FT232_Puffer_Grose_TX){               // Prüfe ob zahler überläuft
23
    FT232_Zahler_TX_0=0;                                         // setze auf 0 zurück wenn überlauft
24
    FT232_Control|= (1<<FT232_Control_TX_Puffer_Uberlauf);       // setze überlaufsflag
25
  } else FT232_Zahler_TX_0++;                                    // erhöhe index
26

27
  }
28
  
29
}
30

31

32
ISR (USARTD0_TXC_vect) {
33
  
34
  if ((FT232_Zahler_TX_0 == FT232_Zahler_TX_1) & (!(FT232_Control & (1<<FT232_Control_TX_Puffer_Uberlauf)))) {
35
    FT232_Control&=~(1<<FT232_Control_TX_ubertragung_Aktiv);    // Lösche Ubertragungsflag da Puffer leer
36
  } else {
37
  
38
  USARTD0_DATA = FT232_Sendepuffer[FT232_Zahler_TX_1];          // Schreibe Byte aus Puffer
39
  if (FT232_Zahler_TX_1==FT232_Puffer_Grose_TX){                // prüfe ob Zahler überläuft
40
    FT232_Zahler_TX_1=0;                                        // Setze zahler auf 0
41
    FT232_Control&=~(1<<FT232_Control_TX_Puffer_Uberlauf);      // Lösche übrlaufsflag 
42
  }  else FT232_Zahler_TX_1++;                                  // erhöhe Index  
43
  }
44
  
45
}

Ich meine herausgefunden zu haben das es an der while Schleife liegt, 
kann mir aber nicht erklären warum. Ohne die Schleife läuft es (einen 
großen Puffer vorausgesetzt) solange kein Überlauf entsteht.
Gast #3715053
Lesenswert?
• ▲
▼
Semikolon hinter while fehlt.

Du solltest die angewöhnen, immer die geschweiften Klammern zu benutzen. 
Selbst wenn der Inhalt leer ist. Das erhöht die Übersichtlichkeit für 
Dritte und vermeidet solche Fehler.
#3715295
Lesenswert?
• ▲
▼
Schneller wird die Ausgabe wenn du den UDRE-Int nimmst, denn mit TXC 
wird das nächste Byte erst an den UART übergeben wenn das Senden des 
vorherigen Bytes abgeschlossen ist. Mit UDRE nutzt du den internen 
Puffer und das nächste Byte geht sofort im Anschluss an das vorherige 
raus.

Sascha

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.