mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik M16C / UART und DMA


Autor: Surrounder (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Ansgar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Surrounder (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Surrounder (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.