8.1 MCC Generated Code
To generate this project using MPLAB Code Configurator (MCC), follow the next steps:
- Create a new MPLAB X IDE project for PIC18F47Q10.
- Open MCC from the toolbar (more information about how to install the MCC plug-in can be found here).
- Go to Project Resources →
System → System Module and make the following configurations:
- Oscillator Select: HFINTOSC
- HF Internal Clock: 1 MHz
- Clock Divider: 1
- In the Watchdog Timer Enable field in the WWDT tab, WDT Disabled has to be selected
- In the Programming tab, Low-Voltage Programming Enable has to be checked
- From the Device Resources window, add
TMR2 and ADCC and then make the following configurations:
Timer2 Configuration:
- Enable Timer: checked
- Control Mode: Roll over pulse
- Start/Reset Option: Software control
- Timer Clock tab
- Clock Source: LFINTOSC
- Clock Prescaler: 1:64
- Postscaler: 1:1
- Set 100 ms period in the Timer Period tab
ADCC Configuration:
- Enable ADCC: checked
- Operating: Basic mode
- In the ADC tab choose
the following options:
- ADC Clock → Clock Source: Select FRC
- Auto-conversion Trigger: Select TMR2
- CVD Features tab:
- Enable ADC Interrupt: checked
- Open Pin Manager → Grid View window and select UQFN40 in the MCU package field and select the I/O pins outputs to enable the internal signal access to the I/O.
- Click Pin Module in the Project Resources and set the custom name for RE0 to LED0, select Output box and for the ANA0 pin select the Analog box.
- Click Generate in the Project Resources tab.
- Add into the
main.c
file, the following lines of code:#define DesiredThreshold 300 /* Desired threshold value */ volatile uint16_t adcVal; static void ADCC_interrupt(void); static void ADCC_interrupt(void) { /* Toggle LED0 at the Timer2Period frequency */ LED0_Toggle(); adcVal = ADCC_GetConversionResult(); } void main(void) { // Initialize the device SYSTEM_Initialize(); ADCC_SetADIInterruptHandler(ADCC_Interrupt_by_TMR2); // Enable the Global Interrupts INTERRUPT_GlobalInterruptEnable(); // Enable the Peripheral Interrupts INTERRUPT_PeripheralInterruptEnable(); while (1) { if (adcVal > DesiredThreshold) { LED0_SetLow(); } } }