I 'm using a pickit2 to power this test so an 0,1 are unavailable (used by pickit) so I changed code to use an3
and debug via serout . needless to say it works just fine.
you may need an oscilloscope to look at your an input and power supply for noise (dvm's won't do it)
have you installed bypass caps on the regulator input/output and the pic vdd pin ?
a bit of c across the pot wiper to gnd won't hurt either
Code:' **************************************************************** ' PIC16F1825 ' **************************************************************** ;#DEFINE USE_LCD_FOR_DEBUG ; comment out for non-debug use ' Vdd -> pin 1 -> +5V ' RC5/Rx -> pin 5 -> EUSART receive ' RC4/Tx -> pin 6 -> EUSART transmit (LCD) ' RA1 -> pin 12 -> trim pot input (1 uF electrolytic cap?) ' Vss -> pin 14 -> GND DEFINE OSC 16 ; Set oscillator 16Mhz ' *************************************************************** ' EUSART Settings for Tx/Rc (e.g. LCD) ' *************************************************************** ' > use Mister E PIC Multi-Calc application to get register/DEFINE settings ' > as the values are dependent on the OSC and desired baud rate DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1 DEFINE HSER_CLROERR 1 ' Clear overflow automatically DEFINE HSER_SPBRG 160 ' 9600 Baud @ 16MHz, -0.08% ' *************************************************************** ' Device Fuses ' *************************************************************** #CONFIG __config _CONFIG1, _FOSC_INTOSC & _WDTE_ON & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF __config _CONFIG2, _PLLEN_OFF & _STVREN_ON & _BORV_LO & _LVP_OFF #ENDCONFIG ' *************************************************************** ' Initialization ' *************************************************************** OSCCON = %01111000 ; 16MHz internal osc pause 100 APFCON0.2 = 0 ; Tx on RC4 for LCD display APFCON0.7 = 0 ; Rx on RC5 ' Some LCD serial modules need inverted data, some do not ' Enable the line below if needed, but for SparkFun SerLCD it should be ' commented out 'BAUDCON.4 = 1 ; Transmit inverted data to the Tx pin ' From Mister E's Multi-Calc (EUSART): ' ***************************************************************** SPBRGH = 1 BAUDCON.3 = 1 ' Enable 16 bit baudrate generator ' ***************************************************************** ANSELC = 0 ; Digital only for all PortC pins TRISC = 0 ; Make all PORTC pins output ANSELA = %00001000 ; Analog on PORTA.4(AN3) only ADCON1 = %10100000 ; Right-justified results in 10-bits; Fosc/32 as timer; ; VREF is connected to VDD TRISA = %111110 ' Make all pins output except for RA1 (trim pot input) FVRCON = 0 ; Fixed Voltage Reference is disabled ; ADCON0 = %00000101 ; ADC enabled on AN1 (RA1) only; ADC conversion enabled PAUSEUS 20 ; wait for the analog switch 'glitch' to die down ADCON1 = %10010000 ; Right-justified results in 10-bits; Fosc/8 as timer #IFDEF USE_LCD_FOR_DEBUG ' Display control codes for SerLCD serial LCD (SparkFun part #LCD-09395) ' (see 'Dropbox\PBP Projects\PIC Datasheets\SerLCD_V2_5 Datasheet.pdf' ' for list of control codes) LCD_INST CON 254 ' instruction LCD_CLR CON 1 ' Clear screen LCD_L1 CON 128 ' LCD line 1 LCD_L2 CON 192 ' LCD line 2 LCD_BR_CMD CON 124 ' command character for adjusting backlight brightness LCD_BR_LVL CON 140 ' 140==40% #ENDIF ' Should only need to do this one time to adjust backlight brightness '#IFDEF USE_LCD_FOR_DEBUG ' HSEROUT [LCD_BR_CMD, LCD_BR_LVL] ' PAUSE 5 '#ENDIF #IFDEF USE_LCD_FOR_DEBUG pause 1000 HSEROUT [LCD_INST, LCD_CLR, "LCD Init"] pause 5 HSEROUT [LCD_INST, LCD_L2, "SerLCD_V2_5"] pause 500 #ENDIF ADCInVal VAR WORD ; stores ADCIN result read from trim pot compVal VAR WORD ; stores last-changed ADC value GOSUB Do_ADC compVal = ADCInVal ; set initial compare value #IFDEF USE_LCD_FOR_DEBUG HSEROUT [LCD_INST, LCD_CLR] pause 5 HSEROUT ["ADCInVal=",DEC ADCInVal," "] pause 500 #ENDIF lata.0=1 pause 2000 serout2 PORTA.0,84, ["ready",13,10 ] Main: gosub Do_ADC pause 100 If (compVal > (ADCInVal + 1)) or (compVal < (ADCInVal - 1)) THEn ' If this method of reading ADC is as rock-solid as it appears. ' then I can remove the +/- 1 before doing anything; it would be ' IF ADCInVal <> compVal ' DO SOMETHING HERE compVal = ADCInVal #IFDEF USE_LCD_FOR_DEBUG HSEROUT [LCD_INST, LCD_CLR] pause 5 HSEROUT ["new ADCInVal", LCD_INST, LCD_L2, DEC ADCInVal, " "] #ENDIF endif GOTO Main Do_ADC: ADCON0 = %00001101 ' Select Channel 3, Turn-On A/D PAUSEUS 50 ' Wait for A/D channel acquisition time ADCON0.1 = 1 ' Start conversion WHILE ADCON0.1 = 1 ' Wait for it to complete WEND ADCInVal.HighBYTE = ADRESH ADCInVal.LOWBYTE = ADRESL serout2 PORTA.0,84, ["adc ",#ADCInVal,13,10 ] return




Bookmarks