void pot_init(void) { //sets up interrupts to trigger on every sucessful conversion IRQ_ConfigureIT(AT91C_ID_ADC, 0, ISR_ADC); //initilize ADC ADC_Initialize(AT91C_BASE_ADC, AT91C_ID_ADC, AT91C_ADC_TRGEN_DIS, 0, AT91C_ADC_SLEEP_NORMAL_MODE, AT91C_ADC_LOWRES_10_BIT, BOARD_MCK, BOARD_ADC_FREQ, 10, 1200); ADC_EnableDataReadyIt(AT91C_BASE_ADC); ADC_EnableChannel(AT91C_BASE_ADC, POT_CHANNEL); IRQ_EnableIT(AT91C_ID_ADC); ADC_EnableIt(AT91C_BASE_ADC, POT_CHANNEL); //Starts the adc ADC_StartConversion(AT91C_BASE_ADC); }
/** * Interrupt handler for the TouchScreen. * Handles pen press, pen move and pen release events * by invoking three callback functions. */ void TSD_Handler(uint32_t dwAdcStatus) { Adc *pAdc = ADC; uint32_t status; /* TSADC status */ status = dwAdcStatus; status &= /*ADC_GetItMask(pAdc) &*/ TS_STATUSES; if (status == 0) return; /* Pen released */ if (status & ADC_ISR_NOPEN) { if ((bTsFlags & TS_PEN_STAT) == 0) { /* Register last data */ memcpy(dwLastTsData, dwTsData, sizeof(dwTsData)); /* Invoke PenReleased callback */ if (TSDCom_IsCalibrationOk()) TSD_PenReleased(dwTsData[0], dwTsData[1]); } bTsFlags = 0; /* Stop periodic trigger & enable pen */ ADC_SetTsAverage(pAdc, ADC_TSMR_TSAV_NO_FILTER); ADC_SetTsDebounce(pAdc, BOARD_TOUCHSCREEN_DEBOUNCE); ADC_SetTriggerMode(pAdc, ADC_TRGR_TRGMOD_PEN_TRIG); /* Disable pen release detect */ ADC_DisableIt(pAdc, ADC_IDR_NOPEN); /* Enable pen press detect */ ADC_EnableIt(pAdc, ADC_IER_PEN); } /* Pen pressed */ else if (status & ADC_ISR_PEN) { bTsFlags |= TS_PEN_STAT; /* Configure for peripdic trigger */ ADC_SetTsAverage(pAdc, ADC_TSMR_TSAV_AVG8CONV); ADC_SetTsDebounce(pAdc, 300); /* 300ns */ ADC_SetTriggerMode(pAdc, ADC_TRGR_TRGMOD_PERIOD_TRIG); /* Disable pen press detect */ ADC_DisableIt(pAdc, ADC_IDR_PEN); /* Enable pen release detect */ ADC_EnableIt(pAdc, ADC_IER_NOPEN|ADC_IER_XRDY|ADC_IER_YRDY|ADC_IER_PRDY); } else if (status & ADC_ISR_PENS) { /* X */ if (status & ADC_ISR_XRDY) { bTsFlags |= TS_X_RDY; } /* Y */ if (status & ADC_ISR_YRDY) { bTsFlags |= TS_Y_RDY; } /* P: (X/1024)*[(Z2/Z1)-1] */ if (status & ADC_ISR_PRDY) { bTsFlags |= TS_P_RDY; } } /* X,Y,P are ready */ if ((bTsFlags & TS_DATA_RDY) == TS_DATA_RDY) { uint32_t xpos, z2, z1; bTsFlags &= ~TS_DATA_RDY; /* Get X,Y */ TSD_GetRawMeasurement(dwRaw); /* Interprate X,Y */ TSDCom_InterpolateMeasurement(dwRaw, dwTsData); /* Get P: Rp = Rxp*(Xpos/1024)*[(Z2/Z1)-1] */ dwRaw[2] = ADC_GetTsPressure(pAdc); #ifdef TS_XY_SWAP xpos = (dwRaw[1]); #else xpos = (dwRaw[0]); #endif xpos = (xpos & ADC_XPOSR_XPOS_Msk) >> ADC_XPOSR_XPOS_Pos; z2 = (dwRaw[2] & ADC_PRESSR_Z2_Msk) >> ADC_PRESSR_Z2_Pos; z1 = (dwRaw[2] & ADC_PRESSR_Z1_Msk) >> ADC_PRESSR_Z1_Pos; dwTsData[2] = (xpos) * (z2 - z1) / z1; /* PenPress */ if (bTsFlags & TS_PEN_STAT) { bTsFlags &= ~TS_PEN_STAT; /* Invoke PenPress callback */ if (TSDCom_IsCalibrationOk()) TSD_PenPressed(dwTsData[0], dwTsData[1], dwTsData[2]); } /* Periodic if data change invoke callback */ if (dwTsData[0] != dwLastTsData[0] || dwTsData[1] != dwLastTsData[1] || dwTsData[2] != dwLastTsData[2] ) { /* Register last data */ memcpy(dwLastTsData, dwTsData, sizeof(dwTsData)); /* Invoke PenMoved callback */ if (TSDCom_IsCalibrationOk()) TSD_PenMoved(dwTsData[0], dwTsData[1], dwTsData[2]); } }
static uint32_t _WFE_Potentiometer_Initialize( void ) { Adc *pAdc = ADC; int32_t dwLowPotThreshold, dwHighPotThreshold; /* STEP1: Realize a first measure to get potentiometer's initial position */ /* Initialize ADC*/ ADC_Initialize( pAdc,ID_ADC, ADC_MR_TRGEN_DIS,/*HARDWARE trigger*/ 0,ADC_MR_SLEEP_NORMAL,ADC_MR_LOWRES_12_BIT, BOARD_MCK,BOARD_ADC_FREQ,10,20); /*Enable channel 5 (potentiometer) */ ADC_EnableChannel(pAdc, ADC_CHANNEL_5); /* Start convrsion */ ADC_StartConversion(pAdc); /* Wait for the end of conversion */ while ( !(ADC_GetStatus(pAdc) & ADC_ISR_EOC5) ) {} /* Get the potentiometer initial value */ gdwPotentiometerValue = ADC_GetConvertedData(pAdc, ADC_CHANNEL_5); /* Set Window threshold according to the initial values */ dwLowPotThreshold = gdwPotentiometerValue - (NB_INTERVALS * (0x1000 / 256)); if (dwLowPotThreshold < 0) dwLowPotThreshold = 0; dwHighPotThreshold = gdwPotentiometerValue + (NB_INTERVALS * (0x1000 / 256)); if (dwHighPotThreshold >= 0x1000) dwHighPotThreshold = 0x1000 - 1; /* Normalize the value 0 -> 255 */ gdwPotentiometerValue = (gdwPotentiometerValue * 256) / 0xFFF; /* STEP2: Re configure ADC to use windowing */ /* Initialize ADC*/ ADC_Initialize( pAdc,ID_ADC, ADC_MR_TRGEN_EN,/*HARDWARE trigger*/ ADC_MR_TRGSEL_ADC_TRIG0,ADC_MR_SLEEP_NORMAL,ADC_MR_LOWRES_12_BIT, BOARD_MCK,BOARD_ADC_FREQ,10,20); /*Enable channel 5 (potentiometer) */ ADC_EnableChannel(pAdc, ADC_CHANNEL_5); /* Configure TC*/ ConfigureTc0(); /*Channel 5 has to be compared*/ ADC_SetCompareChannel(pAdc, ADC_CHANNEL_5); /*Compare mode, in the window*/ ADC_SetCompareMode(pAdc, ADC_EMR_CMPMODE_OUT); /* Setup Threshold*/ ADC_SetComparisonWindow(pAdc,((dwHighPotThreshold<<16)|dwLowPotThreshold)); /* enable adc interrupt*/ NVIC_EnableIRQ(ADC_IRQn); /* Enable Compare Interrupt*/ ADC_EnableIt(pAdc, ADC_IDR_COMPE); /* Start TC0 and hardware trigger*/ TC_Start(TC0,0); return SAMGUI_E_OK ; }