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.