Hi T.Jackson. I will try it out tomorrow. I think it is caused by configuring the VREF+ and VREF-. I configured them as VREF+=Vdd and VREF-=Vss. So I think this why the negative sinusoidals are truncated. But in spite of this I think the A/D module must work. I don't have a chance to change the offset voltage to 2,5 volts as you offered. But I think can figure this out with VREF+=AN2 and VREF-=AN3 by pulling AN2 to +2,5 volt and AN3 to -2,5 volt.
Here is the code I used:
W0 VAR WORD
TRISA.0 = 1 ' Set pin 0 of PORTA an input
TRISA.1 = 0 ' Set pin 1 of PORTA an output
PORTA.1 = 0 ' Clear pin 1 of PORTA
ADCON0 = %00000001 ' Configuring Analog Channel Select bits, A/D
' Conversion Status bit, A/D On bit
ADCON1 = %00001110 ' Configuring Voltage Reference Configuration bits,
' A/D Port Configuration Control bits
ADCON2 = %10010000 ' Configuring A/D Result Format Select bit (Right justified ),
' A/D Acquisition Time Select bits (4 TAD), A/D Conversion
DEFINE OSC 4
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 1
DEFINE ADC_SAMPLEUS 11
Conversion:
ADCON0.1 = 1 ' Set GO/(DONE)' bit. Wait the Automatic Acquisition Time and Start Conversion
PAUSEUS 50
IF ADCON0.1 = 0 THEN ADC_BIT_RECEIVING
IF ADCON0.1 = 1 THEN Conversion
ADC_BIT_RECEIVING:
ADCIN 0,W0
W0.0 = PORTA.1
PAUSEUS 10
W0.1 = PORTA.1
PAUSEUS 10
W0.2 = PORTA.1
PAUSEUS 10
W0.3 = PORTA.1
PAUSEUS 10
W0.4 = PORTA.1
PAUSEUS 10
W0.5 = PORTA.1
PAUSEUS 10
W0.6 = PORTA.1
PAUSEUS 10
W0.7 = PORTA.1
PAUSEUS 10
W0.8 = PORTA.1
PAUSEUS 10
W0.9 = PORTA.1
END
Don't worry be happy....
Suggest some good reading material on OPAMPS - Operational Amplifiers. You need to vertically shift up that sine wave so that 0v is actually 2.5v
What is this program supposed to do anyways?Code:w0 var word:trisa.0=1:trisa.1=0:porta.1=0:adcon0=1:adcon1=14:adcon2=$90 DEFINE OSC 4 DEFINE ADC_BITS 10 DEFINE ADC_CLOCK 1 DEFINE ADC_SAMPLEUS 11 Conversion: ADCON0.1 = 1:PAUSEUS 50 :IF ADCON0.1 = 0 THEN ADC_BIT_RECEIVING IF ADCON0.1 = 1 THEN Conversion ADC_BIT_RECEIVING: adcin 0,w0:w0.0=porta.1:pausus 10:w0.1=porta.1:pausus 10:w0.2=porta.1:pausus 10 w0.3=porta.1:pausus 10:w0.4=porta.1:pausus 10:wo.5=porta.1:pausus 10 w0.6=porta.1:pausus 10:w0.7=porta.1:pausus 10:w0.8=porta.1:pauseus 10 w0.9=porta.1 END
Might help if we saw the whole thing...
Hi Skimask. Thank you for concerning with my problem. Now I am working on a little project or the beginning of a big project. I will explain it shortly.
I am applying a sinusoidal signal with the offset voltage of 2,5 volts and an amplitude of 5 volts to PORTA.0 . Its frequency is 1khz. So, it varies between (0~5) volts. I want a digital output coming from PORTA.1 . But however, so far
I get 5V(DC) from PORTA.1 . By the way, I use 10 bit ADC and the converted
digital values I want to get serially every time when the conversion is over.
The detail is as follows: When the GO/DONE bit is set, the ADC starts. It gathers
the 10 bit sampled value and writes it into ADRESH(highest 2 bits) and ADRESL(least 8 bits). I did not use it. I used ADCIN 0,W0 which reads the values
from PORTA.0 and writes to W0. After that, if you look at the code you can see that I am trying to get those values with delay(PAUSEUS). I am using 18F2455
and could not find much relating A/D Conversion with it. Maybe you have some suggestions. Because you know it is nothing but the beginnig of the project
and you can not come over the problem. It makes me really crazy. I need working ADC.
Don't worry be happy....
1st problem - A/D inputs on a PIC don't work with negative voltages. See Post #4.
Do you mean you want to output, on A.1, a serial output representation of the analog input on A.0?Its frequency is 1khz. So, it varies between (0~5) volts. I want a digital output coming from PORTA.1
That's good because I don't see anything in your program that says to change the output on PortA.1 other than it's initial setup.But however, so far I get 5V(DC) from PORTA.1
And again, I don't see any serial output commands.By the way, I use 10 bit ADC and the converted digital values I want to get serially every time when the conversion is over.
And again, how do you plan to see this output? Serial output? LCD? There aren't any in the program.I used ADCIN 0,W0 which reads the values from PORTA.0 and writes to W0. After that, if you look at the code you can see that I am trying to get those values with delay(PAUSEUS).
You're kidding me right? Section 21 of the 18F2455 has no information in it that you can use?I am using 18F2455 and could not find much relating A/D Conversion with it.
You've got a working ADC, what you need to do is to get it to work FOR you. I think what you need to do is play around with the PIC and PBP first. Get an LCD working, get a pushbutton or something working with it...then, hook up a POT across an A/D input pin, then display the value of the POT, doesn't have to be resistance, doesn't have to be voltage, doesn't have to be anything in particular, just display a number that corresponds with the position of the POT as you turn it. Then when you get that working, you can easily work on reading a sine wave.I need working ADC.
And besides, even though the A/D on a '2455 is rated for 100ksps and the PIC can run at 48Mhz, you won't be able to get any useful DSP out it. Not enough horsepower under the hood.
Last edited by skimask; - 6th May 2007 at 19:03.
Bookmarks