void cmd_write (uint64_t cluster, uint8_t adcport, uint64_t maxsize, uint8_t speed) { uart_puts_P("Writing...\r\n"); uint16_t maxblocks = maxsize / 512; uint16_t block = 0; char c = 0x00; while(c != 'q') { char values[512] = {0x00}; for (uint16_t i = 0; i<=80; ++i) { adc_request(adcport); uint16_t adcvalue = adc_read(); string_append(values, num2str(adcvalue, 10)); string_append(values, "\r\n"); for (uint8_t d = 0; d<=speed; ++d) _delay_ms(3); uart_puts(num2str(i, 10)); uart_puts(": "); uart_puts(num2str(adcvalue, 10)); uart_puts("\r\n"); c = uart_getc(); if (c == 'q') break; } fat_write_file(cluster, (unsigned char*)values, block); ++block; if (block >= maxblocks) break; } uart_puts_P("...done\r\n"); }
/*---------------------------------------------------------------------------*/ uint8_t initialize_adcModule(uint32_t sps, uint32_t sysclkHz, ADC_MODE mode, uint8_t bitResolution, ADC_INIT_OPT *opt) { uint32_t divTable[8] = {4, 8, 16, 32, 64, 128, 256, 512}; //J 動作モードと、ビット解像度をチェック if ((mode != ADC_ONESHOT) && (mode != ADC_FREERUN) ) { return ADC_UNKNOWN_CAPTURE_MODE; } if ((bitResolution != 8) && (bitResolution != 12)) { return ADC_INVALID_BIT_RESOLUTION; } //J オプション処理 uint8_t vref_bitmap = 0; if (opt == NULL) { //J デフォルトはこれ vref_bitmap = ADC_REFSEL_INTVCC_gc; } else { vref_bitmap = ADC_REFSEL_gm & (opt->vrefSelect << ADC_REFSEL_gp); } //J 適当なSAMPVALになるようなDIVを見つける //J ねらったようにならないので、SPSを適当に当てて、現物合わせで使う int i=0; uint32_t sampval = 0; for (i=0 ; i<8 ; ++i) { sampval = (sysclkHz / divTable[i]) / ((bitResolution/2) * sps); if (sampval <= ADC_SAMPVAL_gm) { break; } else { sampval = 0xff; } } if (sampval > ADC_SAMPVAL_gm) { return ADC_INVALID_SAMPLING_RATE; } //J ADCのモードを変更 uint8_t ret = adc_request(mode, bitResolution); if (ret != ADC_OK) { return ret; } /* 24.14.3 REFCTRL ? Reference Control register */ ADCA.REFCTRL = (ADCA.REFCTRL & ~ADC_PRESCALER_gm) | vref_bitmap; /* 24.14.4 EVCTRL ? Event Control register */ // I don't use event control. /* 24.14.5 PRESCALER ? Clock Prescaler register */ ADCA.PRESCALER = (i << ADC_PRESCALER_gp); /* 24.14.8 SAMPCTRL ? Sampling Time Control register */ ADCA.SAMPCTRL = (uint8_t)sampval; //J PAD GNDの状況を確認して、結果から引く(GAIN x1の場合のみ) /* 24.15.1 CTRL ? Control register */ ADCA.CH0.CTRL = ADC_CH_INPUTMODE_INTERNAL_gc | ((ADC_GAIN_1X << ADC_CH_GAIN_gp) & ADC_CH_GAIN_gm); /* 24.15.2 MUXCTRL ? MUX Control register */ ADCA.CH0.MUXCTRL = (ADC_CH_MUXNEGL_GND_gc) | ADC_CH_MUXNEGL_INTGND_gc; /* 24.15.3 INTCTRL ? Interrupt Control register */ //J ポーリングするので、IntlevelはOffで良い ADCA.CH0.INTCTRL = ADC_CH_INTMODE_COMPLETE_gc | ADC_CH_INTLVL_OFF_gc; /* 24.14.1 CTRLA ? Control register A */ ADCA.CTRLA |= ADC_START_bm | ADC_ENABLE_bm; /* 24.14.6 INTFLAGS ? Interrupt Flags register */ while (ADCA.INTFLAGS == 0); ADCA.INTFLAGS = ADC_CH0IF_bm; // Clear sGndLevelGainX1 = (ADCA.CH0RES); return ADC_OK; }