View previous topic :: View next topic |
Author |
Message |
oneberto
Joined: 25 Aug 2004 Posts: 3 Location: Italy
|
ADC conversion problem on 16F747 |
Posted: Wed Aug 25, 2004 8:30 am |
|
|
I don't know why the function read_adc(), that works well in other
PIC like 16F877, ecc doesnt' work in 16F747. Listed above is a simply C program used for testing ADC conversion and PWM; the program seems to halt when the function is called. If i comment this line the program works well so if i push the button i can read the value initialized in the variable "valore".... can someone help me ??? the version of CCS compiler is 3.181 and the MPLab is 6.40
#include "C:\Documents and Settings\Administrator\Documenti\ampli\pwm.h"
#include <LCD_D.C>
#include <2402.C>
#include <stdlib.h>
#define tastopiu PIN_B0 //definisco tasti
#define tastomeno PIN_B1
#define tastomenu PIN_B2
#define tastoin PIN_B3
#define ingressoa PIN_E0 //definisco uscite comando rele ingressi
#define ingressob PIN_E1
#define ingressoc PIN_E2
#define ventola PIN_A6 // uscita comando ventola
unsigned long int valore=123;
void main()
{
setup_adc_ports(ANALOG_AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(00);
setup_vref(VREF_HIGH|6); //imposta limite ADC 1,25 Volt
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,251,1);
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
setup_ccp3(CCP_PWM);
setup_comparator(NC_NC_NC_NC);
set_tris_B(0b00010000); // imposta porta B5 PWM3 come uscita
port_b_pullups(TRUE); //abilita resistenze pull up su porte B
lcd_init();
//init_ext_eeprom();
do{
printf(lcd_putc,"\fAttendo Lettura");
delay_ms(150);
if(input(tastopiu)==FALSE){
valore=read_adc();
delay_ms(100);
printf(lcd_putc,"\fLeggo ADC : %lu",valore);
delay_ms(150);}
set_pwm1_duty(64);
set_pwm2_duty(128);
set_pwm3_duty(192);
}
while(true);
}
Many thanks in advance Umberto[/i][/b] |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Wed Aug 25, 2004 9:47 am |
|
|
A very strange problem, it looks like the internal RC clock of the ADC isn't working.
Please try if the problem also occurs when you change Code: | setup_adc(ADC_CLOCK_INTERNAL); | to Code: | setup_adc(ADC_CLOCK_DIV_32); |
|
|
|
oneberto
Joined: 25 Aug 2004 Posts: 3 Location: Italy
|
|
Posted: Wed Aug 25, 2004 10:28 am |
|
|
I've tryed this,but is the same... don't work....
Thanks Umberto |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Aug 25, 2004 11:54 am |
|
|
To find out what the compiler is doing, you should compile a short
test program and look at the .LST file. So I installed PCM vs. 3.181
and compiled the A/D portion of your code. From the .LST file, I
can that the compiler doesn't produce any code for the setup_adc()
function. This is a bug in that version.
When CCS adds support for new PICs to the compiler, it is very often
the case that the A/D functions do not work properly. It takes them
several versions to get bug reports and then fix it.
In the following code, I see several problems:
1. The initial A/D setup code at the beginning of main() is initializing
ADCON0 and ADCON1 incorrectly.
2. The setup_adc() function generates no code.
3. The set_adc_channel() function clears bits 6 and 7 in ADCON0,
and it should not do that.
To fix these problems for the 16F747 and PCM vs. 3.181, you need
to write your own functions to replace the bad ones listed above.
Code: |
.................... main()
.................... {
0004: CLRF 04
0005: MOVLW 1F
0006: ANDWF 03,F
0007: MOVLW 0F
0008: BSF 03.5
0009: MOVWF 1F
000A: MOVLW 07
000B: BCF 03.5
000C: MOVWF 1F
.................... int16 valore;
....................
.................... setup_adc_ports(ANALOG_AN0);
000D: MOVLW 0E
000E: BSF 03.5
000F: MOVWF 1F
.................... setup_adc(ADC_CLOCK_INTERNAL);
.................... set_adc_channel(00);
0010: MOVLW 00
0011: MOVWF 78
0012: BCF 03.5
0013: MOVF 1F,W
0014: ANDLW 03
0015: IORWF 78,W
0016: MOVWF 1F
.................... setup_vref(VREF_HIGH | 6);
0017: MOVLW 86
0018: BSF 03.5
0019: MOVWF 1F
.................... |
|
|
|
oneberto
Joined: 25 Aug 2004 Posts: 3 Location: Italy
|
|
Posted: Thu Aug 26, 2004 6:50 am |
|
|
Thank you, i apprecciate your replay.
In fact the assembler code generated is incomplete like you said.
But now i have another problem... i don't know how to correct the bug in assembly 'cos don't know it...
Can you help me another bit ???
many thanks in advance Umberto |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
|