Code Example 2: ADC Reading
Start a new project in Microcode studio then Copy/Paste the following code
Code:
'-------------------------------< Blinky LED >------------------------------------
'
' 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) MicroCode Studio
' 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
'
'---------------------------------------------------------------------------------
Save the file as ADCToLed and, again, press F10 and 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. It's up to you
Enjoy, you're now a professional :P
Bookmarks