Code Example 2: ADC Reading
  • Start a new project in MPLAB, name it ADCToLed
  • Create a new source code file, name it ADCToLed
  • Add the source code to the project
  • Copy/Paste the following code to the source code windows

Code:
        '--------------------------------< ADCToLed >------------------------------------
        '
        '    File name  : ADCToLed.bas
        '    Version    : 1.0
        '    Company    : Mister E 
        '    Programmer : Steve Monfette
        '    Date       : June 22, 2011
        '    Device     : PIC16F690
        '
        '---------------------------------------------------------------------------------                    
        
        '---------------------------< Project description >-------------------------------
        '
        '   Beginner code example to display the ADC reading from channel AN0 to 4 LEDs
        '   attached on PORTC<3:0>
        '       1) PBPDEMO version
        '       2) MPLAB
        '       3) PICKIT 2 Programmer
        '
        '---------------------------------------------------------------------------------                

        '----------------------------< Hardware listing >---------------------------------
        '
        '   - Microchip Low Pin Count Demo Board
        '   - PIC16F690 installed
        '   - *** All jumper have to be installed ***
        '   - Target board will be powered by the PICKIT 2
        '
        '---------------------------------------------------------------------------------                                        
      
        '
        '       Pic Configuration
        '       =================
                '   All PIC configuration fuses (Configuration bits) are listed in the 
                '   C:\PBPDEMO\p16f690.inc file.  Also see datasheet section 14.1
                '
        @  __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_ON & _PWRTE_ON
                '   _INTRC_OSC_NOCLKOUT: Using Internal Oscillator
                '   _WDT_ON: Enable Watch Dog Timer
                '   _MCLRE_ON: Enable MCLR 
                '   _CP_OFF: Disable Code Protection
                '   _CPD_OFF: Disable Data Code Protection
                '   _FCMEN_OFF: Disable Fail Safe Clock Monitor
                '   _IESO_OFF: Disable Internal/External switchover
                '   _BOR_ON: Enable Brown out detect
                '   _PWRTE_ON: Enable Power up Timer
                '
        OSCCON  = %01110000  ' datasheet section 3
                ' -x-------- n/a
                ' --111----- IRCF<2:0> Internal Oscillator Frequency Select Bits (8MHz)
                ' -----xxxx- Read Only
                '
        DEFINE OSC 8    ' tells PBP we use a 8 MHZ clock        
                
        '                      
        '       Hardware assignment
        '       ===================
                '   Here we assign Aliases to PORT pin
                '   this makes the code easier to read
                '   I'll use the Aliases name as written on the schematic
                '
                '   LEDs
                '   ----
                DS1     VAR PORTC.0 
                DS2     VAR PORTC.1 
                DS3     VAR PORTC.2 
                DS4     VAR PORTC.3
                LED     VAR PORTC
                 
        '
        '       Hardware configuration
        '       ======================
                '   
                '       I/Os (Datasheet section 4.0 & above)
                '       ------------------------------------
                TRISA = %00000001   
                      ' -xx------- n/a
                      ' ---00000-- Output: When capable of
                      ' --------1- Input: AN0, ADC input
                      
                TRISB = 0   ' All PORTB I/O set as Output
                TRISC = 0   ' All PORTC I/O set as Output
                '
                '       ADCs (datasheet section 9)
                '       --------------------------
                ANSEL  = %00000001 
                       ' -0000000-- AN<7:1> = Digital I/O
                       ' --------1- AN0 = Analog
                       
                ANSELH = 0  ' AN<11:8> = Digital I/O
                
                DEFINE ADC_BITS 8       ' Set number of bits in result
                DEFINE ADC_CLOCK 3      ' Set clock source (rc = 3)
                DEFINE ADC_SAMPLEUS 50  ' Set sampling time in   
                '
                '       Comparator (datasheet section 8)
                '       --------------------------------
                        '   At Power On, the comparator are already disabled
                        '   but let's play safe.
                        '
                CM1CON0 = 0 ' Disable comparator 1
                CM2CON0 = 0 ' Disable comparator 2
         
        '
        '       Software variable
        '       =================
        bADC    VAR BYTE    ' Hold the ADC reading
        
        '
        '       Software/Hardware initialisation
        '       ================================
        PORTA = 0   ' clear PORTA output pins (0v)
        PORTB = 0   ' clear PORTB output pins (0v)
        PORTC = 0   ' clear PORTC output pins (0v)
        
        WHILE !OSCCON.2 : Wend  ' Wait untill the internal OSC get stable 
        
        '------------------------------< Main program >-----------------------------------
        '
Start:
        ADCIN 0, bADC   ' read AN0 and store it to bADC variable
        '
        '       Since we use only 4 LED and the ADC is a 8 Bit result, we
        '       need to adjust it so the ADC range will fit a 4 BITs LED reading
        '       To do so we will shift the ADC by 4 bits
        bADC = bADC>>4
        LED = bADC ' show the result
        PAUSE 100   ' wait 100 mSec
        GOTO Start  ' do it again
        '
        '---------------------------------------------------------------
  • Compile
  • Program

Now see what happen when you play with the pot attached to AN0 input.

Soon you'll discover you can't turn on the 4 LED together. The reason is simple. Inside the PICKIT 2, both PGD & PGC (ICSPDAT & ICSPCLK) pins are pulled down with 4.7K resistor. Now leaving the PICKIT 2 connected to your board, R7 make a voltage divider with those internal internal pull-down. So the voltage never go up to 5 volt on the ADC input...

To solve this problem you could disconnect your PICKIT 2 and use an external power supply OR modify your code to use another ADC channel OR just lift the pin 4 of the ICSP header. Still plausible to trick the ADC by using anothe Vref... oh well it's up to you now.

Enjoy, be creative, have fun!

I know I know, it's almost a copy/paste thread from the MicroCode studio one... so?