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
'
'---------------------------------------------------------------
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?
Bookmarks