![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
micro_debugger
Joined: 08 Oct 2009 Posts: 73
|
PIC18F25K20 comparator not working - PLS HELP |
Posted: Fri Jul 26, 2013 6:36 pm |
|
|
Hi,
Compiles 5.010 but tested also with 4.141
PIC18F25K20
Comparator is not working. COUT is always high or if inverted always low. If it is low fires interrupts as should be. I printed all registers after setup, seems to be set correctly. No idea anymore, may be somebody can take a look on it, I maybe something missing. Part of the listing
Code: |
setup_adc(ADC_CLOCK_DIV_4 | ADC_TAD_MUL_16);
setup_adc_ports(sAN12|sAN11|sAN9|sAN8|sAN2|sAN1|VSS_VDD);
setup_comparator(CP1_A1_VREF | CP1_FAST)
setup_vref(VREF_HIGH | 15 );
C1RSEL=1; // set manually - compiler not set it ( ???)
.....
.....
while(1)
{
if(C1OUT)
printf(bputc,"\n\rLOW");
else
printf(bputc,"\n\rHIGH");
} |
always the result is high or low (if inverted)
I add the following lines in order to check what is set by compiler in registers
Code: |
printf(bputc,"\n\r\n\rCM1CON0 C1ON:%x", C1ON);
printf(bputc,"\n\rCM1CON0 C1OUT:%x", C1OUT);
printf(bputc,"\n\rCM1CON0 C1OE:%x", C1OE);
printf(bputc,"\n\rCM1CON0 C1POL:%x", C1POL);
printf(bputc,"\n\rCM1CON0 C1SP:%x", C1SP);
printf(bputc,"\n\rCM1CON0 C1R:%x", C1R);
printf(bputc,"\n\rCM1CON0 C1CH1:%x", C1CH1);
printf(bputc,"\n\rCM1CON0 C1CH0:%x\n\r", C1CH0);
printf(bputc,"\n\rCVRCON CVREN:%x", CVREN);
printf(bputc,"\n\rCVRCON CVROE:%x", CVROE);
printf(bputc,"\n\rCVRCON CVRR:%x", CVRR);
printf(bputc,"\n\rCVRCON CVRSS:%x", CVRSS);
printf(bputc,"\n\rCVRCON CVR3:%x", CVR3);
printf(bputc,"\n\rCVRCON CVR2:%x", CVR2);
printf(bputc,"\n\rCVRCON CVR1:%x", CVR1);
printf(bputc,"\n\rCVRCON CVR0:%x\n\r", CVR0);
printf(bputc,"\n\rCM2CON1 C1RSEL:%x\n\r", C1RSEL);
printf(bputc,"\n\rCVRCON2 FVREN:%x\n\r", FVREN);
printf(bputc,"\n\rCVRCON2 FVRST:%x", FVRST);
printf(bputc,"\n\rLATA:%x\n\r", LATA);
printf(bputc,"\n\rANS1:%x\n\r", ANS1);
while(1);
|
an the results from terminal printout are here:
CM1CON0 C1ON:01
CM1CON0 C1OUT:00
CM1CON0 C1OE:01
CM1CON0 C1POL:00
CM1CON0 C1SP:01
CM1CON0 C1R:01
CM1CON0 C1CH1:00
CM1CON0 C1CH0:01
CVRCON CVREN:01
CVRCON CVROE:00
CVRCON CVRR:00
CVRCON CVRSS:00
CVRCON CVR3:01
CVRCON CVR2:01
CVRCON CVR1:01
CVRCON CVR0:01
CM2CON1 C1RSEL:01
CVRCON2 FVREN:00
CVRCON2 FVRST:00
LATA:23
ANS1:01
I tested with voltage provided to the C12IN1- pin from 0 up to VDD (3.3 V)
always the same result.
Any idea what can I do??
Thank you in advance
Best Regards |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Jul 27, 2013 12:04 am |
|
|
Quote: | setup_comparator(CP1_A1_VREF | CP1_FAST); |
The line above produces this ASM code in the .LST file (for both vs 4.141 and vs. 5.010):
Code: |
.................... setup_comparator(CP1_A1_VREF | CP1_FAST);
0026: BCF CM2CON1.C1RSEL
0028: BCF CM2CON1.C2RSEL
002A: CLRF CM2CON0
002C: MOVLW 8D
002E: MOVWF CM1CON0
0030: MOVF TRISA,W
0032: IORLW 01 <== Bug. Sets pin A0 to an input. Should be pin A1.
0034: MOVWF TRISA
0036: MOVF TRISB,W
0038: IORLW 01 <== Bug. Pin B0 is not used by comparator.
003A: MOVWF TRISB |
To fix the TRISA bug, insert the line in bold below, after the setup_comparator() line:
Quote: |
setup_comparator(CP1_A1_VREF | CP1_FAST);
output_float(PIN_A1);
setup_vref(VREF_HIGH | 15 );
C1RSEL=1;
|
|
|
![](templates/subSilver/images/spacer.gif) |
micro_debugger
Joined: 08 Oct 2009 Posts: 73
|
|
Posted: Sat Jul 27, 2013 2:42 am |
|
|
Thank you so much !!!!!
You save me a lot of time!!!
I'm going to test it and keep you informed.
Warmest regards |
|
![](templates/subSilver/images/spacer.gif) |
micro_debugger
Joined: 08 Oct 2009 Posts: 73
|
|
Posted: Sat Jul 27, 2013 2:47 am |
|
|
Tested
Working perfectly.
Thank you again.
Warmest regards |
|
![](templates/subSilver/images/spacer.gif) |
micro_debugger
Joined: 08 Oct 2009 Posts: 73
|
|
Posted: Sat Jul 27, 2013 5:54 pm |
|
|
Hi,
This is the final working version, I made also a small mistake in the register C1RSEL my own definition.
Code: |
setup_comparator(CP1_A1_VREF | CP1_FAST | CP1_INVERT);
output_float(PIN_A1);
setup_vref(VREF_HIGH | 15);
C1RSEL=1;
|
Compiler is not setting up the C1RSEL to 1, and always keep it as 0, just FYI
BR |
|
![](templates/subSilver/images/spacer.gif) |
jeremiah
Joined: 20 Jul 2010 Posts: 1328
|
|
Posted: Sat Jul 27, 2013 6:08 pm |
|
|
Make sure to submit those bugs to CCS support via their email address so they get fixes in upcoming versions |
|
![](templates/subSilver/images/spacer.gif) |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|