Forums Neueste Beiträge
 

ATXmega: DMA und USART

06/12/2013 - 19:17 von Thomas Rachel | Report spam
Hallo,

kennt sich hier jemand mit dem ATXmega aus?

Ich arbeite gerade an einer Applikation auf einem ATXmega256A3, die
Daten mißt.

Idealerweise könnte ich hier

a) sowohl sauber und mit Hardware-Flußkontrolle mit dem UART reden
b) als auch zeitnah Messungen durchführen.

a) ist gegeben, aber dafür mußte ich den RX-Interrupt auf hohe Prioritàt
setzen, den Timer-Interrupt für die Messung hingegen auf MED. (Mache ich
es umgekehrt, gehen Bytes verloren.) Wenn ich dann ein komplettes Paket
von 10, 20 oder noch mehr Bytes erhalte, deren Bearbeitung jeweils ca.
10 µs dauert, dann wird die Messung unter Umstànden um 200 µs und noch
verzögert. Bei einer Messfrequenz von 2 kHz sehr unschön.

Von daher war meine Überlegung, DMA zu verwenden, aber nur als
"Sicherheitsnetz": die empfangenen Daten möchte ich gerne, sobald ich
Zeit habe, verarbeiten. Habe ich keine Zeit, bleiben die Daten im Buffer.

Hier sehe ich aber einige Probleme:

1. Laut Datenblatt kann ich ein Ereignis (wie etwa USART RXC) *entweder*
einem Interrupt zuführen *oder* als DMA-Trigger verwenden. D.h., direkte
Reaktion auf eingegangenes Byte ist nicht drin. Den DMA-Interrupt zu
verwenden, fàllt hier flach, weil ich nicht erst reagieren will, wenn
die Transkation fertig ist, sondern wie gesagt schon früher. Das wàre
wohl noch machbar, indem ich im Timer-Interrupt ab und zu mal
nachschaue, ob was da ist, und ggf. ein Flag setze.

2. Tue ich das aber, müßte ich die aktuelle DMA-Transaktion abbrechen,
die Daten verarbeiten und dann DMA wieder aufnehmen. Da stellt sich mir
die Frage, ob das sauber geht?

3. Will ich das Ganze jetzt auch noch mit Flußkontrolle kombinieren und
RTS hochziehen, wenn der Buffer zu voll wird, hörts ganz auf. Denn das
zeitnah zu erledigen, wird schwierig. Hat da jemand eine Idee, oder
denke ich nur zu kompliziert?

Sehr allgemeine Frage: Hat das schonmal jemand so getan und weiß, wie
ich diese Probleme angehe? Gibts da ein HowTo oder so was?

Ich könnte auch mit Mini-DMA-Transaktionen von 1 Byte arbeiten, die
Daten irgendwo hinschreiben lassen und dann über ein Event direkt RTS
setzen, bis ich das Byte verarbeitet habe. Aber da weiß man nicht, ob
die Gegenseite auch sofort aufhört mit Senden, wenn ich RTS setze. Von
daher, ebenfalls recht diffizile Angelegenheit.
 

Lesen sie die antworten

#1 Thomas Rachel
06/12/2013 - 20:22 | Warnen spam
Am 06.12.2013 19:17 schrieb Thomas Rachel:

Ich könnte auch mit Mini-DMA-Transaktionen von 1 Byte arbeiten, die
Daten irgendwo hinschreiben lassen und dann über ein Event direkt RTS
setzen, bis ich das Byte verarbeitet habe.



Letzteres geht ja gar nicht. Das Event-System ist wohl doch nicht so
màchtig, wie es zunàchst scheint...


Thomas

Ähnliche fragen