Dear Alex, how are you. My code below worked perfect. My outputs are PA12 and PA13 .THanks!!
I want to start with interrupts but I have doubts. Once I have two ACs, I found only one NVIC_EnableIRQ(AC_IRQn) in samd21j18a.h.
Also in DS I found in page 48 a descryption about NVIC but superficial.
How I can call a interrupt from AC0 and other for AC1? For example, I want to increase a variable in an external function for AC0 and decrease a variable in another function with AC1.
**obs. This is the first time I am using NVIC. If you has any web link to learn about them, I will be greaful.
Best Regards!
void ac_init(void)
{
GPIO_dirIn(COM_0_IN);
GPIO_pmuxen(COM_0_IN, PF_MUX_B);
GPIO_dirIn(COM_1_IN);
GPIO_pmuxen(COM_1_IN, PF_MUX_B);
PM->APBCMASK.reg |= PM_APBCMASK_AC;
GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID (AC_GCLK_ID_DIG) | // AC share same GCLK 48Mhz
GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN (AC_GCLK_SOURCE);
while (0==(GCLK->CLKCTRL.reg & GCLK_CLKCTRL_CLKEN));
GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID(AC_GCLK_ID_ANA) | // Habilita o clock analogico para os AC.
GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN(AC_GCLK_SOURCE);
AC->CTRLA.reg = AC_CTRLA_SWRST; //Reset AC register
AC->CTRLA.reg = AC_CTRLA_RUNSTDBY(1); // AC remain active in Sleep mode.
// COMPx - Positive Pin, and Negative VDDscale source, Hysteresys Control, High Speed, Interruption Rising
AC->COMPCTRL[0].reg = AC_COMPCTRL_ENABLE | AC_COMPCTRL_MUXPOS_PIN0 | AC_COMPCTRL_MUXNEG_VSCALE
| AC_COMPCTRL_HYST | AC_COMPCTRL_INTSEL_RISING | AC_COMPCTRL_SPEED_HIGH | AC_COMPCTRL_OUT_SYNC | AC_COMPCTRL_FLEN_MAJ3;
while (AC->STATUSB.bit.SYNCBUSY);
AC->COMPCTRL[1].reg = AC_COMPCTRL_ENABLE | AC_COMPCTRL_MUXPOS_PIN2 | AC_COMPCTRL_MUXNEG_VSCALE
| AC_COMPCTRL_HYST | AC_COMPCTRL_INTSEL_RISING | AC_COMPCTRL_SPEED_HIGH | AC_COMPCTRL_OUT_SYNC | AC_COMPCTRL_FLEN_MAJ3;
while (AC->STATUSB.bit.SYNCBUSY);
GPIO_dirOut(COM_0_OUT);
GPIO_pmuxen(COM_0_OUT, PF_MUX_H); //mux H for output, PA12 as CMP[0]
GPIO_dirOut(COM_1_OUT);
GPIO_pmuxen(COM_1_OUT, PF_MUX_H); //mux H for output, PA13 as CMP[1]
AC->SCALER[0].reg = AC_SCALER_VALUE(49); //Negative reference in 2.5V for 3.2Vana
while (AC->STATUSB.bit.SYNCBUSY); //Aguarda sincronização
AC->SCALER[1].reg = AC_SCALER_VALUE(49);
while (AC->STATUSB.bit.SYNCBUSY);
AC->CTRLA.reg = AC_CTRLA_ENABLE; //Habilita os comparadores
while (AC->STATUSB.bit.SYNCBUSY);
}