TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: edutd 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.
-
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á