View previous topic :: View next topic |
Author |
Message |
duchonic
Joined: 14 Jul 2010 Posts: 9 Location: Switzerland
|
16F1823 ADC and Delay problems |
Posted: Thu Aug 19, 2010 6:08 am |
|
|
I have some problems with the CCS compiler 4.110 for the 16f1823 device.
SETUP_ADC_PORTS(sAN1|sAN3|sAN4|sAN5|VSS_VDD);
-> ANSEL A/C arent right if i watch dem with
the MPLAB/debugger/MPLAB SIM
DELAY_US(900);
-> won't work, delays bigger than 700us won't work
Anybody else has this problem?
Regards, Nicolas |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Aug 19, 2010 2:18 pm |
|
|
The setup_adc_ports() function is buggy for vs. 4.110 and 4.111. I can
see this by looking at the .LST file. The values and the register addresses
are wrong in some cases. I suggest that you write directly to the ANSEL
registers to setup the ports.
I can confirm that delay_us(900) does not work correctly. It fails with
both vs. 4.110 and 4.111. My suggestion is to use the sum of two smaller
delays that adds up to your desired value. Example:
Code: |
delay_us(500);
delay_us(400);
|
And then email CCS with a full report of these bugs. Tell them that it fails
in both vs. 4.110 and 4.111. If your maintenance period has ended, I
think they will upgrade you to the latest version when they fix it. |
|
|
duchonic
Joined: 14 Jul 2010 Posts: 9 Location: Switzerland
|
thank you. |
Posted: Sun Aug 22, 2010 11:37 pm |
|
|
I tried to write to ANSELA, ANSELC directly but this won't work.
I worked with the PIC16F1827 and the CCS 4.109 compiler before. Delays and setup_adc_ports worked fine.
Is it possible that with the CCS4.109 compiler my 16F1823 device could work?
PCM programmer wrote: | The setup_adc_ports() function is buggy for vs. 4.110 and 4.111. I can
see this by looking at the .LST file. The values and the register addresses
are wrong in some cases. I suggest that you write directly to the ANSEL
registers to setup the ports.
I can confirm that delay_us(900) does not work correctly. It fails with
both vs. 4.110 and 4.111. My suggestion is to use the sum of two smaller
delays that adds up to your desired value. Example:
Code: |
delay_us(500);
delay_us(400);
|
And then email CCS with a full report of these bugs. Tell them that it fails
in both vs. 4.110 and 4.111. If your maintenance period has ended, I
think they will upgrade you to the latest version when they fix it. |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Aug 24, 2010 12:45 pm |
|
|
Quote: | Is it possible that with the CCS4.109 compiler my 16F1823 device could work? |
It could be. These newer chips (16F1xxx) were recently added to the
compiler and CCS always takes several versions to get all the built-in
functions working correctly. I ordered a 16F1827 (I wanted one anyway)
because I couldn't get a 16F1823 in DIP. It has an ADC register map
which is similar to the 16F1823 (just 2-3 bits are different, I think). I'll
try to get the A/D working later in the week when it comes in. |
|
|
duchonic
Joined: 14 Jul 2010 Posts: 9 Location: Switzerland
|
|
Posted: Wed Aug 25, 2010 1:05 am |
|
|
This would work:
Code: |
#byte ADCON0 = 0x09D
ADCON0 = 0b00000001;
#byte ADCON1 = 0x09E
ADCON1 = 0b10110000;
#byte ANSELA = 0x18C
ANSELA = 0b00010010;
#byte ANSELC = 0x18E
ANSELC = 0b00000011;
unsigned int16 read_a2d(unsigned char channel){
unsigned int16 ADC_result;
channel&=0x07; // truncate channel to 3 bits
#byte ADCON0 = 0x09D
#byte ADRESH = 0x09C
#byte ADRESL = 0x09B
ADCON0=0x01; // clear current channel select
ADCON0|=(channel<<2); // apply the new channel select
delay_us(10);
ADCON0|=0x02; // initiate conversion on the selected channel
while(BIT_TEST(ADCON0,1))continue;
ADC_result = 0x0000;
ADC_result += ADRESH;
ADC_result <<= 8;
ADC_result += ADRESL;
return(ADC_result); // return 16 MSB of the result
}
|
|
|
|
|