Vielen Dank für den Hinweis - ich habe schlicht und einfach vergessen, dass es ein 16 Bit Register ist.
Jetzt funktioniert (theoretisch) alles bestens - eine komplette Messung von 400 ksps mit 16 Bit ohne jegliche CPU-Last (bzw. laufenden Programm-Code).
Der variable mit DMA veränderbare Timer sieht jetzt so aus:
Ich werde jetzt noch einen Test mit der SPI-Geschwindigkeit machen und prüfen, ob fehlerfrei übertragen wird - dann geht es zum Hardware-Aufbau.Code:void SetupWriteTimer( void ) { // Start Timer/Counter C0 with actual clock (32MHz) divided by 4 TCD0.CTRLA = (TCD0.CTRLA & ~TC0_CLKSEL_gm) | TC_CLKSEL_DIV1_gc; // AD_Wandlung 1,5 µs - Per = 47 TCD0.PER = 30; // Timer vorladen um Kollision mit Timer TCC0 zu vermeiden TCD0.CNT = 15; // Priorität setzten TCD0.INTCTRLA = TC_OVFINTLVL_MED_gc; } #define Interval 4 volatile uint16_t WriteDelay[Interval] = { 20, 20, 20, 96 }; void SetupWriteDelayChannel( DMA_CH_t * dmaChannel ) { DMA_SetupBlock( dmaChannel, WriteDelay, DMA_CH_SRCRELOAD_BLOCK_gc, DMA_CH_SRCDIR_INC_gc, (void *) &(TCD0.PER), DMA_CH_DESTRELOAD_BURST_gc, DMA_CH_DESTDIR_INC_gc, Interval * 2, DMA_CH_BURSTLEN_2BYTE_gc, 0, true ); DMA_EnableSingleShot( dmaChannel ); DMA_SetTriggerSource( dmaChannel, DMA_CH_TRIGSRC_TCD0_OVF_gc ); }






Zitieren

Lesezeichen