Valor del ADC no funciona en Proteus

Básicamente estoy haciendo un seguidor de linea, pero primero quise hacer una simulación en proteus para comprobar que sirviera, este es el codigo:
Código:
#include <18F47J53.h>

#device ADC=10

#FUSES NOWDT         //WDT disabled (enabled by SWDTEN bit)                    
#FUSES PLL3          //Divide by 3 (12 MHz oscillator input)            
#FUSES NOPLLEN       //PLL Disabled
#FUSES NOSTVREN      //stack overflow/underflow reset enabled                
#FUSES NOXINST       //Extended instruction set disabled            
#FUSES NOCPUDIV      //No CPU system clock divide         
#FUSES NOPROTECT     //Program memory is not code-protected          
#FUSES HSPLL         //HS oscillator, PLL enabled, HSPLL used by USB           
#FUSES SOSC_HIGH     //High Power T1OSC/SOSC circuit selected
#FUSES CLOCKOUT      //CLKO output enabled on the RA6 pin 
#FUSES NOFCMEN       //Fail-Safe Clock Monitor disabled
#FUSES NOIESO        //Two-Speed Start-up disabled
#FUSES WDT32768      //Watchdog Postscaler 1:32768
#FUSES DSWDTOSC_INT  //DSWDT uses INTOSC/INTRC as clock
#FUSES RTCOSC_INT    //RTCC uses INTRC as clock
#FUSES NODSBOR       //Zero-Power BOR disabled in Deep Sleep
#FUSES NODSWDT       //Deep Sleep Watchdog Timer Disabled
#FUSES DSWDT8192     //Deep Sleep Watchdog Postscaler: 1:8,192 (8.5 seconds)   
#FUSES NOIOL1WAY     //IOLOCK bit can be set and cleared
#FUSES ADC10         //ADC 10 or 12 Bit Select:12 - Bit ADC Enabed 
#FUSES MSSPMSK7      //MSSP 7 Bit address masking
#FUSES NOWPFP        //Write Protect Program Flash Page 0
#FUSES NOWPCFG       //Write/Erase last page protect Disabled
#FUSES WPDIS         //WPFP[5:0], WPEND, and WPCFG bits ignored 
#FUSES WPEND         //Start protection at page 0
#FUSES LS48MHZ       //Low Speed USB mode with 48 MHz System clock at 48 MHz USB CLKEN divide-by is set to 8 
#use delay(clock=48000000)

#pin_select U2TX=PIN_D2 //Selecciona hardware UART2
#pin_select U2RX=PIN_D3 //Selecciona hardware UART2




#define LOADER_END   0xFFF                        
#build(reset=LOADER_END+1, interrupt=LOADER_END+9)   //Protege posiciones de memoria desde la 0x0000 hasta la 0x1000   
#org 0, LOADER_END {}

#bit PLLEN = 0xf9b.6

#use  rs232(baud=9600,parity=N,UART1,bits=8,timeout=30)


/********************************************************/
/*------- Espacio para declaracion de constantes  ------*/
/********************************************************/
//!#define m_unoA  PIN_B4   // Pin controlador del motor 1
//!#define m_unoB  PIN_B5   // Pin controlador del motor 1
//!#define m_dosA  PIN_B6   // Pin controlador del motor 2
//!#define m_dosB  PIN_B7   // Pin controlador del motor 2
 
/********************************************************/
/*--- Espacio para declaracion de variables globales  --*/
/********************************************************/
unsigned int16 i,resolucion=100,SensorIzquierda,SensorDerecha;





/********************************************************/
/********************************************************/
/*-------------- Espacio para funciones  ---------------*/
/********************************************************/

#include <stdlib.h>
void sensores(void){

set_adc_channel(1);
delay_ms(2);
SensorDerecha=read_adc();
set_adc_channel(0);
delay_ms(2);
SensorIzquierda=read_adc();


}


/******************************************************************************/
/******************************************************************************/
/*--------------------- Espacio de codigo principal --------------------------*/
/******************************************************************************/ 
#zero_ram
void main(){
PLLEN = 1;          //Habilita PLL para generar 48MHz de oscilador*/\\ 
setup_adc_ports( sAN0 | sAN1,VSS_VDD );
 setup_adc(ADC_CLOCK_INTERNAL );
 setup_timer_2(T2_DIV_BY_16,149,1);
 setup_ccp4(CCP_PWM);
 setup_ccp5(CCP_PWM);
 setup_ccp6(CCP_PWM);
 setup_ccp7(CCP_PWM);
 for(;;){
 sensores();
 while(SensorIzquierda<resolucion && SensorDerecha<resolucion){
set_pwm4_duty(200);
set_pwm5_duty(0);
set_pwm6_duty(200);
set_pwm7_duty(0);
 sensores();
 }
   while(SensorIzquierda<resolucion && SensorDerecha>resolucion){
set_pwm4_duty(0);
set_pwm5_duty(0);
set_pwm6_duty(200);
set_pwm7_duty(0);
i=0;
sensores();
 }
 while(SensorIzquierda>resolucion && SensorDerecha<resolucion){
set_pwm4_duty(200);
set_pwm5_duty(0);
set_pwm6_duty(0);
set_pwm7_duty(0);
i=1;
sensores();
 }
 while(SensorIzquierda>resolucion && SensorDerecha>resolucion){

if(i==0){set_pwm4_duty(0);
set_pwm5_duty(0);
set_pwm6_duty(200);
set_pwm7_duty(0);
sensores();
 }
 if(i==1){
set_pwm4_duty(200);
set_pwm5_duty(0);
set_pwm6_duty(0);
set_pwm7_duty(0);
sensores();
 }
 }
//!set_pwm4_duty(1002);
//!set_pwm5_duty(0);
//!set_pwm6_duty(0);
//!set_pwm7_duty(0); 
//! 
 
 
}
}//end main
Pero cuando lo paso a proteus me aparece un error que dice [PIC18 ADC] PC=0x110A. ADC conversion started before \'wait\' time has expired following previous conversion or channel change. [U1]
Si alguno me pudiera ayudar a arreglar ese problema me ayudaría mucho ...
 
Prueba con poner un delay_ms, despues de cada read_adc.
Lo que dice es que estas leyendo el valor del puerto ADC antes que el cambio de canales se concrete.
 
Buenas
Prueba cambiando la configuración del adc en el main de tu código, así:
Código:
setup_adc_ports(sAN1|sAN0);
setup_adc(ADC_CLOCK_INTERNAL|ADC_TAD_MUL_6);//tomar la muestra cada 500ms
 
muchas gracias por la ayuda , al final lo que me funciono fue cambiar ese parte del código como dice roberttorres, ahora tengo otro problema y es que cuando le llegan voltaje a los puertos análogos a la vez no sale de ese while , que es el primero , no se que estoy haciendo mal o si hice mal el montaje.

Si me pudieran ayudar con eso también seria de mucha ayuda.
 

Adjuntos

  • Captura.jpg
    Captura.jpg
    120.8 KB · Visitas: 11
Arriba