int main(void) { led_blink(); //Variablen Deklaration //--------------------------------------------- uint8_t offset =0; uint16_t resultat, probe; uint16_t i; extern uint16_t array[1000]; //---------------------------------------------- PORTA.DIR |= (0<<0x00); //Eingang ADC PORTR.OUT = 0; //Initialisierung adc_initfree(); dma_init(); //offset = adc_caloff(); //Programm in Endlosschleife //-------------------------------------------- start_dma(); while(1) { resultat = get_adc2(); i=array[8]; } } --------------------------- dma.c --------------------------- uint16_t array[1000]; //DMA konfigurieren void dma_init(void){ //repeat bit muss noch gesetzt werden!! DMA.CTRL = DMA_CH_ENABLE_bm; // Aktivieren Single Buffer, Burst Size 2Byte //Modus Transaktion, increase und fix, Burst DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_NONE_gc | DMA_CH_SRCDIR_FIXED_gc| DMA_CH_DESTRELOAD_BLOCK_gc | DMA_CH_DESTDIR_INC_gc; // Trigger Source ist ADCA Triggerung wenn der Datenpuffer leer ist. DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH0_gc; //100 Byte sind zu übertragen! DMA.CH0.TRFCNT = 100; DMA.CH0.CTRLA |= 0x10; //Repeat in Endlosschleife DMA.CH0.REPCNT = 0; DMA.CH0.CTRLA |= 0x20; //16Bit Quelle DMA.CH0.SRCADDR0 =(((uint32_t)(&ADCA.CH0.RES))>>0*8)&0xFF; DMA.CH0.SRCADDR1 =(((uint32_t)(&ADCA.CH0.RES))>>1*8)&0xFF; DMA.CH0.SRCADDR2 =(((uint32_t)(&ADCA.CH0.RES))>>2*8)&0xFF; //8Bit Ergebnis in array DMA.CH0.DESTADDR0 = ((uint32_t) array >>0*8)&0xFF; DMA.CH0.DESTADDR1 = ((uint32_t) array >>1*8)&0xFF; DMA.CH0.DESTADDR2 = ((uint32_t) array >>2*8)&0xFF; } //DMA Start void start_dma(void){ // DMA CH0 aktivieren DMA.CH0.CTRLA = DMA_CH_ENABLE_bm |DMA_CH_SINGLE_bm|DMA_CH_BURSTLEN_2BYTE_gc|0x20; } -------------------------------- adc.c -------------------------------- //----------------------------- //Auslesen des ADC Wertes //----------------------------- uint16_t get_adc2(void){ int j = 0; uint16_t Result; uint16_t Result2 = 0; while(j<8){ ADCA.CH0.INTFLAGS = 1; //float ResultVolt; ADCA.CH0.CTRL |= ADC_CH_START_bm; // start conversion on channel 0 while(!ADCA.CH0.INTFLAGS); Result = ADCA.CH0RES; //ResultVolt = (float)Result/4096; // 1V ref, 12bit ADC count Result2 = Result + Result2; j++; } Result2=Result2/8; return Result2; } //--------------------------------------- //Initialisierung des ADC im FreeRunMode //--------------------------------------- uint16_t adc_initfree(void){ PORTA.DIR = 0; //ADCA.CTRLB = 0x08; // freeRunMode, 12-Bit right adjusted, unsigned ADCA.CTRLB = 0x00; // Single-ended mode //ADCA.EVCTRL = 0x00; // sweep mode ADCA.EVCTRL = 0x00; // alternativ //ADCA.REFCTRL = ADC_REFSEL_VCC_gc | 0x02; //internal 1.6V ADCA.REFCTRL = 0; //internal 1V ADCA.PRESCALER = ADC_PRESCALER_DIV4_gc; // peripheral clk/8 (2MHz/16=250kHz) ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc; // single ended ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN2_gc ; // PORTA:2 //ADCA.CALL = ReadCalibrationByte( offsetof(NVM_PROD_SIGNATURES_t, ADCACAL0) ); //ADCA.CALH = ReadCalibrationByte( offsetof(NVM_PROD_SIGNATURES_t, ADCACAL1) ); ADCA.CTRLA |= 0x1; // enable adc }