Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

26/06/2012 #1

Avatar de IMASDPIC

no puedo leer mas de 1 canal adc con C18
Hola que tal ;

Les pregunto por ver si me pueden hechar una mano con el programa este ,tengo el problema de que el valor que me muestra en la lcd es el mismo tanto para el canal AN0 como AN1 ,he probado varios tipos de configuracion incluso cambiar de canal pero me pasa lo mismo
teniendo un potenciometro con un valor en AN0 y otro potenciometro con otro valor en AN1 siempre visualizo el mismo valor para el canal0 como para el canal1
uso el MPLAB v8.63 c18

Código:


Código:
#include<p18f2550.h>
#include<delays.h>
#include<LCD4b2x16.h>
#include<stdlib.h>//libreria para la conversion a string
#include<adc.h>

#pragma config FOSC=XT_XT,FCMEN=OFF,IESO=OFF,CPUDIV=OSC1_PLL2
#pragma config PWRT=ON,BOR=OFF,BORV=0,WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=OFF
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CPB=OFF,CPD=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF
#pragma config WRTB=OFF,WRTC=OFF,WRTD=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTRB=OFF

void DelayFor18TCY(void){
 Delay10TCYx(2);
}
void DelayPORXLCD(void){
 Delay1KTCYx(15);
}
void DelayXLCD(void){
 Delay1KTCYx(2);
}


void main(void){
unsigned int Canal0,Canal1;
char String[4];
char String2[4];


TRISB = 0XF0;//F0
TRISC = 0X00;

PORTB = 0X00;
PORTC = 0X00;
Inicializa_LCD();

Comando_LCD(CURSOR_OFF & BLINK_ON);

OpenADC(ADC_FOSC_RC & ADC_2_TAD & ADC_RIGHT_JUST,
        ADC_REF_VDD_VSS & ADC_INT_OFF , ADC_2ANA);

while(1){
 Datos_LCD("Presionar boton ");
while(PORTAbits.RA3==0){}   //ESPERO A QUE SE ACCIONE EL PULSADOR
SetChanADC(0);             //SELECCIONO EL CANAL A CONVERTIR
//Delay10TCYx(1);         //10us pra que se cargue el capacitor sample&hold
                          //solo cuando se selecciona ADC_0_TAD
ConvertADC();            //COMINEZA LA CONVERSION
while(BusyADC()==1){}    //hasta que finalice la conversion
Canal0=ReadADC();          //REALIZO LA LECTURA

//Delay10TCYx(1);          
SetChanADC(1);    //SELECCIONO EL CANAL A CONVERTIR
//Delay10TCYx(1); //10us pra que se cargue el capacitor sample&hold
                  //solo cuando se selecciona ADC_0_TAD
ConvertADC();
while(BusyADC()==1){} // Hasta que finalice la conversion
Canal1=ReadADC();    //REALIZO LA LECTURA

Comando_LCD(CLEAR);

 Datos_LCD("Canal 0 = ");
//Comando_LCD(String[1]);//+++++++++++++++++
itoa(Canal0,String);//Canal0
// Datos_LCD(String);
Dato_String_LCD(String);

Comando_LCD(DDRAM_LINEA_2);

Datos_LCD("Canal 1 = ");
itoa(Canal1,String2);
 //+++Datos_LCD(String);
Dato_String_LCD(String2);


Delay10KTCYx(100);
Comando_LCD(CLEAR);

}
}
26/06/2012 #2

Avatar de cosmefulanito04

En los atmega tenés que hacer una conversión dummy cuando cambias de canal, es decir:

- Convierto canal 0.
- Paso a canal 1.
- Convierto en canal 1 y descarto la conversión (dummy).
- Vuelvo a convertir canal 1 y recién ahí obtengo el valor del canal 1.
26/06/2012 #3

Avatar de IMASDPIC

hola cosmefulanito04
No se exactamente si en el pic18F2550 funcionara de la misma forma ,el tema es que leo un AN0 y se guarda en una variable luego cambio de canal y leo AN1 y lo guardo en otra variable
pero luego hago la conversion primero de una variable y despues de la otra pero aparece siempre el valor del AN0

si puedes aportar algo de codigo a ver sobre lo que te refieres

en principio he revisado el programa varias veces y todo parece estar correcto
seguramente sera una tonteria de esas que cuanto mas buscas menos encuentras

un saludo
26/06/2012 #4

Avatar de cosmefulanito04

Probá con esto, sino ya va a entrar alguien que maneje bien los PIC y te tire la solución:

Código:
#include<p18f2550.h>
#include<delays.h>
#include<LCD4b2x16.h>
#include<stdlib.h>//libreria para la conversion a string
#include<adc.h>

#pragma config FOSC=XT_XT,FCMEN=OFF,IESO=OFF,CPUDIV=OSC1_PLL2
#pragma config PWRT=ON,BOR=OFF,BORV=0,WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=OFF
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CPB=OFF,CPD=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF
#pragma config WRTB=OFF,WRTC=OFF,WRTD=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTRB=OFF

void DelayFor18TCY(void){
 Delay10TCYx(2);
}
void DelayPORXLCD(void){
 Delay1KTCYx(15);
}
void DelayXLCD(void){
 Delay1KTCYx(2);
}


void main(void){
unsigned int Canal0,Canal1;
char String[4];
char String2[4];


TRISB = 0XF0;//F0
TRISC = 0X00;

PORTB = 0X00;
PORTC = 0X00;
Inicializa_LCD();

Comando_LCD(CURSOR_OFF & BLINK_ON);

OpenADC(ADC_FOSC_RC & ADC_2_TAD & ADC_RIGHT_JUST,
        ADC_REF_VDD_VSS & ADC_INT_OFF , ADC_2ANA);

while(1){
 Datos_LCD("Presionar boton ");
while(PORTAbits.RA3==0){}   //ESPERO A QUE SE ACCIONE EL PULSADOR
SetChanADC(0);             //SELECCIONO EL CANAL A CONVERTIR
//Delay10TCYx(1);         //10us pra que se cargue el capacitor sample&hold
                          //solo cuando se selecciona ADC_0_TAD
ConvertADC();            //COMINEZA LA CONVERSION
while(BusyADC()==1){}    //hasta que finalice la conversion
Canal0=ReadADC();          //REALIZO LA LECTURA --- CONVERSIÓN DE DESCARTE 

ConvertADC();            //COMINEZA LA CONVERSION
while(BusyADC()==1){}    //hasta que finalice la conversion
Canal0=ReadADC();          //REALIZO LA LECTURA --- CONVERSIÓN VÁLIDA CANAL 0 

//Delay10TCYx(1);          
SetChanADC(1);    //SELECCIONO EL CANAL A CONVERTIR
//Delay10TCYx(1); //10us pra que se cargue el capacitor sample&hold
                  //solo cuando se selecciona ADC_0_TAD
ConvertADC();
while(BusyADC()==1){} // Hasta que finalice la conversion
Canal1=ReadADC();    //REALIZO LA LECTURA -- CONVERSIÓN DE DESCARTE

ConvertADC();
while(BusyADC()==1){} // Hasta que finalice la conversion
Canal1=ReadADC();    //REALIZO LA LECTURA -- CONVERSIÓN VÁLIDA  CANAL 1

Comando_LCD(CLEAR);

 Datos_LCD("Canal 0 = ");
//Comando_LCD(String[1]);//+++++++++++++++++
itoa(Canal0,String);//Canal0
// Datos_LCD(String);
Dato_String_LCD(String);

Comando_LCD(DDRAM_LINEA_2);

Datos_LCD("Canal 1 = ");
itoa(Canal1,String2);
 //+++Datos_LCD(String);
Dato_String_LCD(String2);


Delay10KTCYx(100);
Comando_LCD(CLEAR);

}
}
Fijate si eso funciona.
27/06/2012 #5

Avatar de IMASDPIC

hola que tal cosmefulanito04
probe lo que me decis pero no me funcionaba asi que despues de dejar pasar la noche para que se aclaren las ideas
cambié
SetChanADC(0);
SetChanADC(1);
por
SetChanADC(ADC_CH0);
SetChanADC(ADC_CH1);
y a funcionar
graias por tu apoyo
un saludo
27/06/2012 #6

Avatar de cosmefulanito04

IMASDPIC dijo: Ver Mensaje
hola que tal cosmefulanito04
probe lo que me decis pero no me funcionaba asi que despues de dejar pasar la noche para que se aclaren las ideas
cambié
SetChanADC(0);
SetChanADC(1);
por
SetChanADC(ADC_CH0);
SetChanADC(ADC_CH1);
y a funcionar
graias por tu apoyo
un saludo
jajaj, mirá lo que erá
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.