|(0<<DMA_CH_REPEAT_bp)// Channel Repeat Mode bit position.
33
|(0<<DMA_CH_TRFREQ_bp)// Channel Transfer Request bit position.
34
|(0<<DMA_CH_SINGLE_bp)// Channel Single Shot Data Transfer bit position.
35
|DMA_CH_BURSTLEN_8BYTE_gc;
36
DMA.CH0.CTRLA|=(1<<DMA_CH_TRFREQ_bp);// Channel Transfer Request bit position.
37
38
39
while(1)
40
{
41
if((DMA.INTFLAGS&0x01)==0x01){
42
asmvolatile("nop");
43
}
44
//TODO:: Please write your application code
45
}
46
}
Bei den Programm soll der Inhalt des Arrays gewinn in das Array umsatz
kopiert werden. Derzeit habe ich leider das Problem mit den Simulator,
das der Vorgang als abgeschlossen bewertet wird(Haltepunkt bei NOP),
aber sich der Inhalt vom 2. Array nicht verändert hat.
Ich denke das liegt sicher an falsch gesetzten Registern
DMA.CH0.DESTADDR und DMA.CH0.SRCADDR. Leider komme ich nicht auf die
richtige Lösung
Ich sehe da einen Buffer overflow. Du hast 1000 Byte Puffer, aber machst
dann 0x400 = 1024 Byte Transfers.
Allerdings scheint auch Dest INC nicht an zu sein, deshalb knallt es
vermutlich nicht.
Für memcopy via DMA müssen AFAIK sowohl src als auch dest jeweils
inkrementert werden.
|DMA_CH_DESTDIR_INC_gc;// Destination adressing mode: FIXED, INC, DEC
Jetzt erkennt er in der Abfrage leider keine beendigung dieser Aufgabe
und selbst wenn ich bei der Abfrage nach 5 Sekunden einen Breakpoint
setze, ist das gewünschte Array leider leer.
Edit:
Jetzt habe ich wie gewünscht die Destaddr und Srcaddr geändert, aber
erhalte die Fehlermeldung aus dem Anhang.
1
DMA.CH0.DESTADDR0=umsatz&0xFF;
2
DMA.CH0.DESTADDR1=(umsatz>>8)&0xFF;
3
DMA.CH0.DESTADDR2=(umsatz>>16)&0xFF;//bzw. 0x00
4
DMA.CH0.SRCADDR0=gewinn&0xFF;
5
DMA.CH0.SRCADDR1=(gewinn>>8)&0xFF;
6
DMA.CH0.SRCADDR2=(gewinn>>16)&0xFF;//bzw. 0x00
das gleiche bei:
1
DMA.CH0.DESTADDR0=&umsatz[0]>>0xFF
Jetzt werde ich mal dort weiter schauen. Vielen Dank