View previous topic :: View next topic |
Author |
Message |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
ADC setup code is strange for 16F877 (PCM 3.202) |
Posted: Mon Jun 14, 2004 5:36 pm |
|
|
PCM vs. 3.202 is doing something weird with the ADC setup functions.
Instead of writing to ADCON0 and ADCON1 as a single byte operation,
the compiler is doing it one bit at a time. This must have something
to do with the major changes that CCS did for vs. 3.200.
What I dislike about this method is that it cycles the Port A pins
through several different modes before they reach the intended mode.
That's just wrong on a philosophical level. It could potentially
cause some problem with external circuits by switching a pin into
a mode that's not intended.
In addition to that, I noticed that the startup code for ADCON1 is
probably incorrect. Traditionally, CCS has initialized Port A as all
digitial. But look at the code right below main(). They're doing
a BSF on bits 0-3 of ADCON1. That sets it to 0x0F, which has AN0
as analog, and AN2 and AN3 as Vref pins. For years, they have
initialized ADCON1 to 0x07 (all digital). Why this change ?
I have to assume it's a mistake.
The code below was compiled for a 16F877 with PCM vs. 3.202:
Code: | 0000 00293 .................... void main()
0000 00294 .................... {
0004 0184 00295 CLRF 04
0005 301F 00296 MOVLW 1F
0006 0583 00297 ANDWF 03,F
0007 1683 00298 BSF 03.5 // ADCON1
0008 141F 00299 BSF 1F.0
0009 149F 00300 BSF 1F.1
000A 151F 00301 BSF 1F.2
000B 159F 00302 BSF 1F.3 // This should likely be BCF.
0000 00303 .................... int16 result;
0000 00304 ....................
0000 00305 .................... setup_adc_ports(ALL_ANALOG);
000C 101F 00306 BCF 1F.0
000D 109F 00307 BCF 1F.1
000E 111F 00308 BCF 1F.2
000F 119F 00309 BCF 1F.3
0000 00310 ....................
0000 00311 .................... setup_adc(ADC_CLOCK_DIV_8);
0010 1283 00312 BCF 03.5 // ADCON0
0011 171F 00313 BSF 1F.6 // ADSC0 bit
0012 139F 00314 BCF 1F.7 // ADSC1 bit
0013 1683 00315 BSF 03.5 // ADCON1
0014 139F 00316 BCF 1F.7 // ADFM bit
0015 1283 00317 BCF 03.5 // ADCON0
0016 141F 00318 BSF 1F.0 // ADON bit
|
The other ADC functions, set_channel() and read_adc(), don't appear
to be affected by these problems. |
|
|
Guest
|
|
Posted: Tue Jun 15, 2004 1:17 am |
|
|
It must be a mistake, indeed. The ADC with 3.202 not works properly.
With a well-tested source code I got 0 for all channels. Downgrading to 3.191 and everything is fine. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jun 15, 2004 1:26 am |
|
|
Quote: | The ADC with 3.202 not works properly.
With a well-tested source code I got 0 for all channels |
What PIC are you using ? |
|
|
Guest
|
|
Posted: Tue Jun 15, 2004 1:46 am |
|
|
I have tested this with:
16F877
18F452
12F675
getting the same result. It must be something "orbital" about the new ADC handling style. |
|
|
Haplo
Joined: 06 Sep 2003 Posts: 659 Location: Sydney, Australia
|
|
Posted: Tue Jun 15, 2004 4:20 am |
|
|
Thanks for sharing this, guys...Yesterday I was thinking about updating my compiler from 3.190 to 3.202 in a 16F877 based project with a lot of ADC code, but thanks to your warnings I'll hold off.
Had I changed it, I would've spent days trying to figure out what was wrong. A broken ADC code is the last thing you expect from the new version of the compiler, afterall. |
|
|
Kieran
Joined: 28 Nov 2003 Posts: 39 Location: Essex UK
|
ADC setup and Vn3.202 |
Posted: Tue Jun 15, 2004 4:33 am |
|
|
I have just recompiled a project for a 16F876 using ADC and it works fine.
Code: |
.................... setup_adc_ports(RA0_RA1_RA3_ANALOG);
085B: BSF 03.5
085C: BCF 1F.0
085D: BCF 1F.1
085E: BSF 1F.2
085F: BCF 1F.3
.................... setup_adc(ADC_CLOCK_INTERNAL);
0860: BCF 03.5
0861: BSF 1F.6
0862: BSF 1F.7
0863: BSF 03.5
0864: BSF 1F.7
0865: BCF 03.5
0866: BSF 1F.0
|
I agree that the code is messy.
Have you reported this to CCS? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jun 15, 2004 11:45 am |
|
|
Quote: | I agree that the code is messy. Have you reported this to CCS? |
Yes, I sent them an email just now. |
|
|
|