Code Example 2: ADC Reading
Start a new project in Microcode studio then Copy/Paste the following code
Save the file as ADCToLed and, again, press F10 and see what happen when you play with the pot attached to AN0 input.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 ' '---------------------------------------------------------------------------------
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