// PIC18 in C - Versione 0.85 - Ottobre 2015 // Copyright (c) 2015 VincenzoV.net // Creative Commons | Attribuzione-Condividi allo stesso modo 3.0 Unported. // Creative Commons | Attribution-Share Alike 3.0 Unported // https://www.vincenzov.net/tutorial/PIC18/adc.htm // PIC18F14K50 - ADC (10 bit) - Read data sheet! // MPLAB X / XC8 #define VREF 3.20 #include "configurationbits.h" void main(void) { unsigned int voltage10bits; // Voltage as ten bits integer (0 -> 1023) double voltage; // Voltage as floating point number 0 -> 3,3 (V) OSCCON = 0x70; // Set internal clock to 16 MHz - Data sheet: REGISTER 2-1: OSCCON: OSCILLATOR CONTROL REGISTER // Configure I/O pins TRISC = 0x00; // Port C as digital output (LEDs) - Data sheet: REGISTER 9-12: TRISC: PORTC TRI-STATE REGISTER TRISBbits.RB5 = 1; // Disable digital output buffer on AN11/RB5 - Data sheet: REGISTER 9-7: TRISB: PORTB TRI-STATE REGISTER ANSELHbits.ANS11 = 1; // Disable digital input buffer for AN11 - Data sheet: REGISTER 9-15: ANSEL: ANALOG SELECT REGISTER 1 // Configure ADC ADCON2bits.ADFM = 1; // Right justified // Data sheet: Figure 17-2: 10-BIT A/D CONVERSION RESULT FORMAT ADCON2bits.ADCS = 0b101; // A/D Conversion Clock = FOSC/16 (1 us @ 16 MHz) - Data sheet: Table 17-1: ADC CLOCK PERIOD (TAD) VS. DEVICE OPERATING FREQUENCIES ADCON2bits.ACQT = 0b001; // A/D Acquisition time set to 2 TAD - Data sheet: 17.3 A/D Acquisition Requirements - Figure 17-4: A/D CONVERSION TAD CYCLES (ACQT<2:0> = 010, TACQ = 4 TAD) ADCON1 = 0; // Set VDD and VSS as voltage reference - Data sheet: REGISTER 17-2: ADCON1: A/D CONTROL REGISTER 1 ADCON0bits.CHS = 0b1011; // Analog Channel Select AN11 - Data sheet: REGISTER 17-1: ADCON0: A/D CONTROL REGISTER 0 ADCON0bits.ADON = 1; // ADC is enabled - Data sheet: REGISTER 17-1: ADCON0: A/D CONTROL REGISTER 0 while (1) { ADCON0bits.GO = 1; // Start conversion - Data sheet: REGISTER 17-1: ADCON0: A/D CONTROL REGISTER 0 while (ADCON0bits.nDONE); // Wait End Of Conversion - Data sheet: REGISTER 17-1: ADCON0: A/D CONTROL REGISTER 0 voltage10bits = ADRESH << 8; // Read voltage - 2 MSB - Data sheet: REGISTER 17-6: ADRESH: ADC RESULT REGISTER HIGH (ADRESH) ADFM = 1 voltage10bits |= ADRESL; // Read voltage - 8 LSB - Data sheet: REGISTER 17-7: ADRESL: ADC RESULT REGISTER LOW (ADRESL) ADFM = 1 // voltage = (double) VREF / 1024 * voltage10bits; LATC = voltage10bits >> 2; // Display ADC result - Data sheet: REGISTER 9-13: LATC: PORTC DATA LATCH REGISTER } }