Bonjour,
je chercher à réaliser une prise de mesure avec le registre d'interruption ADC à partir du registre d'interruption du timer.
volatile int AT1;
volatile bool Flag;
volatile float dbValue = 0.0;
uint32_t sampleRate = 500;
void setup() {
Serial.begin(9600);
tcConfigure(sampleRate);
adcConfigure();
}
void loop() {
if (Flag == 1) Serial.println(AT1);
}
void TC3_Handler(void) {
// Acknowledge the interrupt (clear MC0 interrupt flag to re-arm)
TC3->COUNT16.INTFLAG.reg |= 0b00010000;
}
void ADC_Handler() {
AT1++;
Flag = 1;
//ADC->RESULT.reg
ADC->INTFLAG.reg = ADC_INTFLAG_WINMON; //Need to reset interrupt
}
void tcConfigure(int sampleRate) {
// Configure asynchronous clock source
GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID_TCC2_TC3_Val; // select TC3 peripheral channel
GCLK->CLKCTRL.reg |= GCLK_CLKCTRL_GEN_GCLK0; // select source GCLK_GEN[0]
GCLK->CLKCTRL.bit.CLKEN = 1; // enable TC3 generic clock
// Configure synchronous bus clock
PM->APBCSEL.bit.APBCDIV = 0; // no prescaler
PM->APBCMASK.bit.TC3_ = 1; // enable TC3 interface
/* Configure TC Mode
0 COUNT16 | Counter in 16-bit mode
01 COUNT8 | Counter in 8-bit mode
10 COUNT32 | Counter in 32-bit mode
11 - | Reserved
*/
TC3->COUNT16.CTRLA.bit.MODE = 0x0;
/* Configure Prescaler
0x0 DIV1 | Prescaler: GCLK_TC
0x1 DIV2 | Prescaler: GCLK_TC/2
0x2 DIV4 | Prescaler: GCLK_TC/4
0x3 DIV8 | Prescaler: GCLK_TC/8
0x4 DIV16 | Prescaler: GCLK_TC/16
0x5 DIV64 | Prescaler: GCLK_TC/64
0x6 DIV256 | Prescaler: GCLK_TC/256
0x7 DIV1024 | Prescaler: GCLK_TC/1024
*/
TC3->COUNT16.CTRLA.bit.PRESCALER = 0x6;
/* Configure Waveform Generation Operation
0x0 NFRQ | Normal frequency | PER(1)/Max | Toggle No action
0x1 MFRQ | Match frequency | CC0 | Toggle No action
0x2 NPWM | Normal PWM | PER(1)/Max | Clear when counting up Set when counting down | Set when counting up Clear when counting down
0x3 MPWM | Match PWM | CC0 | Clear when counting up Set when counting down | Set when counting up Clear when counting down
*/
TC3->COUNT16.CTRLA.bit.WAVEGEN = 0x1; // "Match Frequency" operation
// Initialize compare value
TC3->COUNT16.CC[0].reg = (48000000) / (256 * 0.5);
// Enable TC3 compare mode interrupt generation
TC3->COUNT16.INTENSET.bit.MC0 = 0x1; // Enable match interrupts on compare channel 0
// Enable TC3
TC3->COUNT16.CTRLA.bit.ENABLE = 1;
// Wait until TC3 is enabled
while (TC3->COUNT16.STATUS.bit.SYNCBUSY == 1)
;
/* Set TC3 Interrupt Priority to Level 3 */
NVIC_SetPriority(TC3_IRQn, 3);
/* Enable TC3 NVIC Interrupt Line */
NVIC_EnableIRQ(TC3_IRQn);
}
void adcConfigure() {
ADC->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTVCC1_Val;
ADC->CTRLB.bit.RESSEL = ADC_CTRLB_RESSEL_12BIT_Val;
ADC->CTRLB.bit.PRESCALER = ADC_CTRLB_PRESCALER_DIV32_Val;
ADC->INPUTCTRL.bit.MUXPOS = g_APinDescription[A0].ulADCChannelNumber;
ADC->CTRLB.bit.FREERUN = 0x1;
ADC->CTRLA.bit.ENABLE = 0x1;
ADC->INTFLAG.bit.RESRDY = 0x1; // Clear ready flag
ADC->SWTRIG.bit.START = 1; // Start ADC
ADC->INTFLAG.bit.RESRDY = 0x1; // Discard first reading
}
Je ne sais pas quoi mettre dans le "void TC3_Handler(void) {" pour déclencher l'ADC.
Pouvez vous m'aidez?