Autor Tema: Duda con el convertidor A/D y el timer 0  (Leído 1830 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado edutd

  • PIC10
  • *
  • Mensajes: 27
Duda con el convertidor A/D y el timer 0
« en: 23 de Agosto de 2006, 19:54:13 »
Hola, estoy teniendo un problema con el convertidor A/D y el timer 0 y no entiendo por que es, utilizo el pic 18F4550, bueno por partes, el siguiente código me funciona bien :

unsigned char
X
;
double
Vmuestra,
D,
E
;

//--------------------------------------------------------
//Prototipos de funciones
//--------------------------------------------------------

void rutint(void);

//--------------------------------------------------------
//Codigo de interrupcion
//--------------------------------------------------------

#pragma interrupt rutint  //declaracion de funcion como ISR.
#pragma code isrcode=0x0008   //High priority interrupt
void isrhandler(void)
{
_asm
goto rutint
_endasm
}
#pragma code

//--------------------------------
//Interrupcion   
//--------------------------------

void rutint(void)
{
      INTCONbits.TMR0IF = 0;   
      TMR0H = 0x00;                   
      TMR0L = 0x0B;     
                 if ( CCP1CON == 0x6C )
            {
               CCP1CON = 0xEC;
            }
      else
            {
               CCP1CON = 0x6C;
            }
}
//--------------------------------
//Inicio del programa   
//--------------------------------

void main(void)
{
ADCON1 = 0x0F;
TRISA = 0x0F;
TRISC = 0x00;
TRISD = 0x00;
TRISB = 0x07;
PORTA = 0x00;
PORTC = 0x00;
PORTD = 0x00;
PORTB = 0x00;

INTCON = 0x20;               
INTCON2 = 0x84;             
RCONbits.IPEN = 1;           
TMR0H = 0x00; 
TMR0L = 0x0B;               
T0CON = 0xC6;               
INTCONbits.GIEH = 1;         

OpenTimer2( TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_1);
      
CCP1CON = 0x6C;

OpenADC( ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_2_TAD, ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS, 12);  //AN0,    AN1, AN2 el resto son digitales,valores de referencia Vdd y Vss
SetChanADC(ADC_CH0);      //seleccionar canal analogico->AN0
ConvertADC();                      //iniciar la conversion ADC
while(BusyADC());                //esperar a que finalice la conversion
Vmuestra = ReadADC();       //guardar el valor
E = Vmuestra / 205;                                                   
D =  0.075 / E;
X = D * 125;                         
OpenPWM1(30);
SetDCPWM1(X);
}

Con este código el convertidor analógico digital funciona bien y la interrupción del timer0 tambien funciona bien, cambia el CCP1CON cuando corresponde. Sin embargo yo quiero capturar la señal y convertirla en digital costantemente, añado un bucle y el código queda asi:

unsigned char
A,
X
;
double
Vmuestra,
D,
E
;

//--------------------------------------------------------
//Prototipos de funciones
//--------------------------------------------------------

void rutint(void);

//--------------------------------------------------------
//Codigo de interrupcion
//--------------------------------------------------------

#pragma interrupt rutint  //declaracion de funcion como ISR.
#pragma code isrcode=0x0008   //High priority interrupt
void isrhandler(void)
{
_asm
goto rutint
_endasm
}
#pragma code

//--------------------------------
//Interrupcion   
//--------------------------------

void rutint(void)
{
      INTCONbits.TMR0IF = 0;   
      TMR0H = 0x00;                   
      TMR0L = 0x0B;     
                 if ( CCP1CON == 0x6C )
            {
               CCP1CON = 0xEC;
            }
      else
            {
               CCP1CON = 0x6C;
            }
}
//--------------------------------
//Inicio del programa   
//--------------------------------

void main(void)
{
ADCON1 = 0x0F;
TRISA = 0x0F;
TRISC = 0x00;
TRISD = 0x00;
TRISB = 0x07;
PORTA = 0x00;
PORTC = 0x00;
PORTD = 0x00;
PORTB = 0x00;

INTCON = 0x20;               
INTCON2 = 0x84;             
RCONbits.IPEN = 1;           
TMR0H = 0x00;                 
TMR0L = 0x0B;               
T0CON = 0xC6;               
INTCONbits.GIEH = 1;         

OpenTimer2( TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_1);
      
CCP1CON = 0x6C;

OpenPWM1(30);
SetDCPWM1(27);

OpenADC( ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_2_TAD, ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS, 12);    //AN0, AN1, AN2 el resto son digitales, valores de referencia Vdd y Vss
SetChanADC(ADC_CH0);      //seleccionar canal analogico->AN0
A = 0;
while ( A == 0 )
{
ConvertADC();                      //iniciar la conversion ADC
PIR1bits.ADIF = 0;
while(BusyADC());                //esperar a que finalice la conversion
Vmuestra = ReadADC();       //guardar el valor
E = Vmuestra / 205;           
D = 0.075 / E;
X = D * 125;                     
SetDCPWM1(X);
}
}

Aqui actualizo constantemente el valor de que me llega por AN0 y funciona perfectamente, pero me surge un problema con la interrupción, que no me cambia CCP1CON, no entra en la interrupción y nose porque.

Nose se si esta claro, a ver si alguien encuentra cual es el fallo porque yo le estoy dando mil vueltas y no encuentro el error.

Gracias por la ayuda, un saludo.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Duda con el convertidor A/D y el timer 0
« Respuesta #1 en: 23 de Agosto de 2006, 20:22:32 »
Edu,sería bueno que utilizaras la herramienta Geshi para publicar tu código...así sin tabulados ni coloreados cuesta entenderlo.Usa la herramienta "Código" que para eso está


 

anything