www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DMA repeat timer - springt aber nur einmal rein (M32C)


Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte mit dem Renesas M32C StarterKit folgendes realisieren.

Vom UART werden X Zeichen eingelesen, welche über den DMA direkt aufm 
Speicher abgespeichert werden.

In der DMA ISR setze ich die Zyklen Anzahl und den Zielort wieder fest.
Wenn ich mir vor und nach durchlaufen der ISR die DMA Register anschaue, 
dann haben diese wieder die Werte von zuvor....
Doch leider springt er mir nur ein einziges mal in die ISR hinein und 
kein 2. mal.
Im User Guide, habe ich auch gesehen, dass es eine repeat funktion gibt 
- aber mit der habe ich es auch nicht hinbekommen

Anbei nun mein Code. ich hoffe jmd findet den fehler, ist bestimmt nur 
eine Kleinigkeit....
/**** Global Variables *************************************************/
unsigned char buffer[5];

unsigned short dct0;
unsigned short drc0;
unsigned short dmd0;
void  *dsa0;
void  *dma0;
void  *dra0;

#pragma DMAC dct0 DCT0 
#pragma DMAC dmd0 DMD0
#pragma DMAC dsa0 DSA0
#pragma DMAC dma0 DMA0
#pragma DMAC drc0 DRC0
#pragma DMAC dra0 DRA0


void init_DMA0(void)
{   
  dmd0 = 0x01;  // 8-bit units, single transfer 
//  dmd0 = 0x03;  // 8-bit units, repeat transfer 
  
  dm0sl =  0x0f;    // DMA request source: UART0 Receive
  
  dma0 = buffer;  //  set memory to RAM buffer

  dsa0 = &u0rb;   // set peripheral address of UART0 receive register  
//  dra0 = buffer;
  
  dct0 = 5;    //  set transfer counter for 5
//  drc0 = 5;
  
  
  dm0ic = 0x04;
}

void dma0_isr(void)
{    
  BER(); 

   dma0 = buffer;  //  set memory to RAM buffer
  dct0 = 5;
  ir_dm0ic &= 0;
}

Vielen Dank, Gruß
Timo

Autor: Judge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Timo,

funktioniert einwandfrei, auch als repeated transfer. Allerdings sollte 
das Register dm0sl gesetzt werden während die DMA abgeschaltet ist (dmd0 
= 0x00), also die ersten beiden Initialisierungsschritte vertauschen.

Das nur ein DMA-Interrupt kommt könnte daran liegen das in der UART 
während der ISR ein Overrun-Error auftritt, also neue Daten empfangen 
wurden und die alten noch nicht abgeholt wurden. In diesem Fall wird 
kein Interrupt mehr generiert, und die DMA läuft nicht weiter. Prüfe mal 
das high-byte im Empfangsregister auf irgendwelche Übertragungsfehler.
Um diese Fehler wieder zurückzusetzen muss das high-byte ausgelesen 
werden (ggf. 16 bit Transfer benutzen).

Gruss
Judge

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Morgen,
danke für die Nachricht - habe den Fehler gestern noch gefunden ....
#pragma INTERRUPT dma0_isr
void dma0_isr(void)

Hatte die erste Zeile vergessen gehabt und somit macht die Renesas HEW 
Software kein Return from Interrupt sondern ein Return from Subroutine 
ans Ende....

Somit wäre das nun auch geklärt ;)

Nun klappts nämlich wunderbar.

Gruß
Timo

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.