www.mikrocontroller.net

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

Autor: Timo (Gast)
Datum: 17.04.2008 07:17

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: 18.04.2008 00:13

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: 18.04.2008 07:22

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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net