View previous topic :: View next topic |
Author |
Message |
Chubbs
Joined: 02 May 2005 Posts: 14
|
strange results when put on PCB |
Posted: Wed Jun 08, 2005 10:16 pm |
|
|
Hi all,
I've been using the PIC16F876A on a modified smoke/CO detector. The system worked fine when I connected everything to the PIC on a bread-board. I have now transferred the system to a PCB, changing none of the connections or the code. The problem I now have is that the ADC conversion of the sensor inputs is a little off. For instance the output of the CO sensor is around a constant 0.9v the output from the PIC shown on an LCD jumps around the actual value, you can get 0.94, 0.84, 0.73, 0.97. Even the input from a pot does not give the correct output. The voltages at the pins of the PIC are constant, correct and do not change, however each time a sample is taken a slightly different result is obtained.
If the input from the pot is 2.5v the output may vary from 2.3 to 2.7v. Everything else seems to work ok the program runs as intented except for the conversions. When done on the bread-board the results were perfect, is there any reason anyone may know as to why this is happening?
Any help will be appreciated.
Thanks |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Jun 08, 2005 10:34 pm |
|
|
Quote: | Even the input from a pot does not give the correct output. |
What is different between the two boards ?
1. The crystal frequency: Is it different ?
2. Circuit wiring: Do you have a ground connection to your sensor ? |
|
|
jbmiller Guest
|
'off' adc readings |
Posted: Thu Jun 09, 2005 4:49 am |
|
|
Any chance you've changed the power supply feeding the PIC? How about some induced AC voltage ( hummmm ?)? Bad ground wiring or faulty bypass caps?
hope this helps
jay |
|
|
Chubbs
Joined: 02 May 2005 Posts: 14
|
|
Posted: Thu Jun 09, 2005 7:23 pm |
|
|
Since the system was working fine before the PCB, I've kept everything the same. It has the same crytals, same caps, same everything. I've checked over all the wiring and it seems fine.
Measuring all the voltages at the ADC input pins shows constant correct values , shouldn't this be enough to ensure a correct relult??
What could effect the result after this point?
All the known voltages on the PIC's pins look ok the reference voltages are ok ( 0.01v and 5.02v ).
What should the levesl be for the crystal??? |
|
|
jbmiller Guest
|
off adc readings |
Posted: Thu Jun 09, 2005 7:35 pm |
|
|
Hmm..don't get fooled by a digital voltmeter.they only take 3 or 4 readings per second so your voltage my 'look' stable but is actually dynamic. If you have an oscilloscope try looking with it. Is the PCB layout the same as your prototype? Could you have a 'noisey' line close by the adc pins ? Do you have a really good ground bus ? I know, you've probably already thought of these, just trying to help. heck I've got 20 year old wirewrapped boards still running and even a couple of 877s in those white 'experimentor's boards' that run fine. I suspect some kind of induce AC is leaking onto the adc pins. have you gronded the adc pins and read them ? they 'should' be all zeros..... How about the adc reference ? just more ideas....please let us know what you find out, these 'little problems' can be real head scratchers !!
jay |
|
|
jbmiller Guest
|
off adc readings |
Posted: Thu Jun 09, 2005 7:36 pm |
|
|
Hmm..don't get fooled by a digital voltmeter.they only take 3 or 4 readings per second so your voltage my 'look' stable but is actually dynamic. If you have an oscilloscope try looking with it. Is the PCB layout the same as your prototype? Could you have a 'noisey' line close by the adc pins ? Do you have a really good ground bus ? I know, you've probably already thought of these, just trying to help. heck I've got 20 year old wirewrapped boards still running and even a couple of 877s in those white 'experimentor's boards' that run fine. I suspect some kind of induce AC is leaking onto the adc pins. have you gronded the adc pins and read them ? they 'should' be all zeros..... How about the adc reference ? just more ideas....please let us know what you find out, these 'little problems' can be real head scratchers !!
jay |
|
|
A.Agiannidis
Joined: 04 Jun 2005 Posts: 2
|
|
Posted: Fri Jun 10, 2005 5:37 am |
|
|
Had a similar situation in the past. Check for some noise to your analog input pin. You will find that on a fast oscilloscope the level on the signal is not steady but in the form of a waveform. Find the period of that waveform and then instead of sampling one value , sample many times for that period. then average the values and you should see a steady, more realistic output. It is however, that you sample as long as the period. Otherwise, the non deterministic start of sampling would incur different results again. |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
Posted: Fri Jun 10, 2005 6:10 am |
|
|
Are you reading just one channel or multiple one?
Did you verify that all Vdd's and Vss's are connected? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jun 10, 2005 1:08 pm |
|
|
Try the program shown below. This is a minimalist test program
which should work on your board. I tested it with a 16F877A on
my board, with a 1K trimpot connected to pin RA0, so I could vary
the voltage on RA0 between 0 and +5v. It worked fine.
Here is a typical output, with the trimpot left sitting in one position.
Quote: | 0218
0218
0218
0219
0218
0218
0218
0218
0218
0217
0218
0218 |
Your version of the compiler does a have a bug. The startup code
sets the TRISA register to 0x00, so all Port A pins are outputs.
I had to put in a set_tris_a(0xFF) statement to fix this. Then I
was able to read the A/D without problems. But I think you are
already doing this.
Anyway, if the following program doesn't run OK on your board,
then I think you have a hardware problem. I tested it with your
version, PCM 3.213.
Code: | #include <16F876A.H>
#device adc=10
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
void main()
{
int16 result;
set_tris_a(0xFF);
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);
while(1)
{
result = read_adc();
printf("%lx\n\r", result);
delay_ms(500);
}
} |
|
|
|
|