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
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
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