Forum: Mikrocontroller und Digitale Elektronik XMEGA USART Sendepuffer


von afroman (Gast)


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.

von PittyJ (Gast)


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.

von afroman (Gast)


Lesenswert?

Jaaaa! Vielen Dank, genau das war der Fehler. Komisch das der Compiler 
da keinen Fehler oder ne Warnung bringt. PittyJ du bist mein Held ;)

von Sascha W. (sascha-w)


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

von Moby (Gast)


Lesenswert?

Sascha Weber schrieb:
> Schneller wird die Ausgabe wenn du

... Deinen Puffer nebenbei via DMA (so noch verfügbar) ausgibst.

Moby

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.