For sure you don't read the good pin. Must use the pin name or alias.
something like ADCIN PORTA.0, adval
For sure you don't read the good pin. Must use the pin name or alias.
something like ADCIN PORTA.0, adval
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
Hmm, the method I’m using to read the A/D is used on the melabs examples page. I have also used this method with a 16F688 without problems. I do get a varying number when I adjust a pot on the pin (0-256) for the 16F819. I need the 1024 resolution or I could use it as is. Something is setup wrong but I think I’m reading the A/D correctly. Correct me if I'm wrong. I will give your advice a try in a bit.
Thanks,
Mark
A melabs example;
' Read an analog voltage on RA0 and send the decimal representation
' of the value on the serial port at 2400 baud. 10-bit conversion
' yields 0-1023 result for 0-5 volt input.
' Define LOADER_USED to allow use of the boot loader.
' This will not affect normal program operation.
Define LOADER_USED 1
' Define ADCIN parameters
Define ADC_BITS 10 ' Set number of bits in result
Define ADC_CLOCK 3 ' Set clock source (3=rc)
Define ADC_SAMPLEUS 50 ' Set sampling time in uS
adval var word ' Create adval to store result
TRISA = %11111111 ' Set PORTA to all input
ADCON1 = %10000010 ' Set PORTA analog and right justify result
loop: ADCIN 0, adval ' Read channel 0 to adval
Serout2 PORTC.6,396,["Value: ",DEC adval,13,10] ' Display value
Pause 100 ' Wait .1 second
Goto loop ' Do it forever
End
Unfortunately your suggestion did not work. Here are some captured results. Starts with reading on ground, then roughly 2.5V then VDD (5V);
ADVAL_1 = 0
ADVAL_1 = 0
ADVAL_1 = 0
ADVAL_1 = 0
ADVAL_1 = 0
ADVAL_1 = 0
ADVAL_1 = 0
ADVAL_1 = 0
ADVAL_1 = 0
ADVAL_1 = 0
ADVAL_1 = 0
ADVAL_1 = 0
ADVAL_1 = 0
ADVAL_1 = 0
ADVAL_1 = 0
ADVAL_1 = 0
ADVAL_1 = 30912
ADVAL_1 = 31168
ADVAL_1 = 31104
ADVAL_1 = 31168
ADVAL_1 = 31040
ADVAL_1 = 31104
ADVAL_1 = 31040
ADVAL_1 = 31104
ADVAL_1 = 31168
ADVAL_1 = 31232
ADVAL_1 = 31040
ADVAL_1 = 31104
ADVAL_1 = 31104
ADVAL_1 = 31104
ADVAL_1 = 31040
ADVAL_1 = 31104
ADVAL_1 = 31104
ADVAL_1 = 31232
ADVAL_1 = 31104
ADVAL_1 = 31168
ADVAL_1 = 65216
ADVAL_1 = 65280
ADVAL_1 = 65280
ADVAL_1 = 65280
ADVAL_1 = 65216
ADVAL_1 = 65216
ADVAL_1 = 65344
ADVAL_1 = 65344
ADVAL_1 = 65280
ADVAL_1 = 65344
ADVAL_1 = 65344
ADVAL_1 = 65280
ADVAL_1 = 65344
Mark,
I have the same problem using a 16f873. I know that this is not the right way, but it was a temporary thing that I did til I could research more, which I have not had time to do, but I think this may work for you:
loop:
ADCIN 0, adval1 ' Read AN0
' adcin 1, adval2 ' Read AN1
LET adval1 = adval1/64
'LET adval2 = adval2/64
if adval1 < 512 then
high PORTB.4
else
low PORTB.4
endif
serout2 PORTB.3,16572,["ADVAL_1 = ",dec adval1,13,10]
pause 100
goto loop
End
But there are pro's here that will show you the proper way
Greg
oups, sorry, since a long time i didn't use this built-in ADCIN statement. Still prefer to read/write register myself.
BTW, what about now if you remove those PBP define and do something like
Code:ADCON0=%11000001 ADCON1=%10001110
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
Thanks both of you. After looking closer at the ADCON registers, which I had done a few dozen times, I noticed I only had seven not eight bits. Steve, thank you for your last post. When I pasted it to my program it was obvious I had left out one bit in each ADCON register. I did have to leave the DEFINE for number of bits and sample time to get it to work. The code is now working and returns 1024 for 5V.
Regards,
Mark
DEFINE OSC 20
' Define ADCIN parameters
Define ADC_BITS 10 ' Set number of bits in result
Define ADC_SAMPLEUS 50 ' Set sampling time in uS
ADCON0 = %11000001
ADCON1 = %10000100 ' AN4-AN0 D,A,D,A,A right justify
TRISA.0 = 1
TRISA.1 = 1
adval1 var word
adval2 var word
clear
High PORTB.5 ' turn on run LED
low PORTB.4 ' low voltage LED
loop:
ADCIN 0, adval1 ' Read AN0
adcin 1, adval2 ' Read AN1
if adval1 < 512 then
high PORTB.4
else
low PORTB.4
endif
serout2 PORTB.3,16572,["ADVAL_1 = ",dec adval1," ADVAL_2 = ",dec adval2,13,10]
pause 100
goto loop
End
MUC,
Great to know it's working now.
Have fun!
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
Bookmarks