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:
- 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.
- 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?
- 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.