Forum: Mikrocontroller und Digitale Elektronik M16C / UART und DMA


von Surrounder (Gast)


Lesenswert?

Hallo Forum,

hat jemand von Euch schon Erfahrungen beim Einsatz des DMA Controllers
in Verbindung mit UART0 gemacht? Bekomme das irgendwie nicht gebacken
bzw. ist mir unklar wieso das so funktioniert.

Wenn ich den DMA auf die UART0 scharf mache passiert nix weil die UART0
keinen Interrupt für den DMA auslöst obwohl der Transmit Buffer leer
ist. Erst wenn ich von Hand 1 Byte in den Transmit Buffer der UART
schreibe und das versendet wurde dann kommt der Interrupt. Gibt es da
einen Trick, mache ich was falsch? Das kann doch nicht sein dass ich
das von Hand starten muss oder?

von Ansgar (Gast)


Lesenswert?

Hi,
ich habe mich jetzt nicht speziell mit dem DMA beschäftigt... aber
interrupts werden im Normalfall nicht auf Zustände sondern auf
Ereignisse erzeugt... in deinem Fall auf eine Falle Flanke des
Statusbits von Transmitbuffer Empty.

Gruß Ansgar

von Surrounder (Gast)


Lesenswert?

Hallo,

ich habe es zwischenzeitlich gelöst. Also im DMA Modus kann man sich ja
darüber streiten, aber letztendlich muss ja auf den Zustand Sendebuffer
leer ein Interrupt für den DMA ausgeelöst werden. Klar im Normalen
Betrieb kann man das auch auf ein Ereignis machen, nämlich genau dann
wenn der Buffer gesendet wurde. Das hat ja wie gesagt auch
funktioniert. Nur was mache ich um das ganze überhaupt ans laufen zu
bekommen ? Der Buffer ist ja leer wenn ich den DMA scharf mache? Das
ging bei mir bisher nur indem ich von Hand doch nochmals Daten in den
Buffer geschrieben habe um das Senden ausgelöst habe. Nur dann hatte
ich immer schon 8 Bit auf der Empfangseite im DMA Buffer und somit in
den einzelnen Worten immer 1 Byte versatz.

Problem war ich hatte ein altes Datenblatt zum M16C und habe die
Register genau in der Reihenfolge beschrieben wie die dort erklärt
wurden. In einer überarbeiteten Version steht aber ein Hinweis auf das
Schreiben der Register in einer anderen Reihenfolge, wenn man das macht
dann funktioniert das mit dem Interrupt wenn man den DMA aktiviert auch.

von Profi (Gast)


Lesenswert?

Ich hatte mal mit dem DMA den DAC gespeist.
Das ging völlig im Hintergrund, nur wenn 8 kB übertragen waren, löste
ich einen Interrupt aus, der den Zeiger neu setzte und den DMA wieder
startete.

Vermutlich geht das bei UART ebenfalls.

Löst Du bei jedem Byte oder bei jedem Paket einen Interrupt aus?

von Surrounder (Gast)


Lesenswert?

Ich löse den Interrupt ja nicht von Hand aus, sondern die Uart
Schnittstelle löst den Interrupt aus wenn der Sendebuffer leer sprich
versendet wurde, dadurch schreibt dann der DMA das nächste Byte in den
Sendebuffer

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.