hola a todos . soy novato , actualmente estoy en un proyecto que usa varias funciones, usando el pic 16f877a un lcd 16*4 , donde en cada una de las funciones uso varias teclas donde una de las teclas uso una rutina para salirme de los bucles " usando unos if leyendo una entrada, con un push button en la tecla ya definida como SALIR (#define SALIR PIN_E2). dicho pin ya antes configurado como entrada en el main, todo perfecto funciona como quiero en cada función . pero en una función en especifica donde uso el adc el timer_0 y el puerto CCP1 para generar una señal pwm ,esta función entra en un bucle para leer constantemente la entrada analogica en AN0 , PERO AL ENTRAR EN ESTE BUCLE el programa funciona y muestra los resultados esperados en el lcd y hasta lee la entrada analogica en AN0. casi todo ok, PERO al parecer se desactivan las ENTRADAS DIGITALES y cuando quiero usar la tecla salir, o quiero usar cualquier otra tecla no funciona a menos que haga un reset al micro , es como sin se desactivaran las entradas digitales o no me reconoce ningún botton , todavia no consigo el error , si hay alguien que sepa ayudarme estare muy agradecido . aclaro que la funcion que quiero usar es esta , y funciona perfectamente en cualquier otra función donde no use el adc los timers y ccp1 // ESTA SIGUIENTE INSTRUCCION NO ME FUNCIOINA YA QUE NO RECONOCE LAS ENTRADAS DIGITALES EN DICHO PUERTO
// EN OTRAS FUNCIONES SI FUNCIONA MIENTRAS NO USE EL TIMER 2 O EL MODULO modulo CCP1
if (input(SALIR) == 0) {
DELAY_MS(250);
if (input(SALIR) == 1) {
DELAY_MS(10);
men = 6;
break;
}
}
y aquí la funcion completa
void PWM_SENAL() {
lcd_putc("\f");
lcd_gotoxy(1, 1);
lcd_putc("\fGENERANDO SEÑAL ");
lcd_gotoxy(1, 2);
lcd_putc("PWM DE 0 A 1KHZ ");
lcd_gotoxy(1, 3);
lcd_putc("AJUSTAR ANCHO ");
// Generemos una Señal cuadrada de 1 Khz
Timer2 = 249; //Se carga timer 2 con 249 como lo vimos en la pagina
//Preescaler=4; //Preescaler solo puede tomar valores de: 1 - 4 - 16
//Para el preescaler colocamos "t2_div_by_4"
Poscaler = 1; //Preescaler solo puede tomar valores de: 1
//setup_timer_2(T2_DIV_BY_16, 15, 1);
// setup_timer_2(T2_DIV_BY_4,249,1);
//Configuracion de Timer 2 para establecer frec. PWM a 1kHz
setup_timer_2(t2_div_by_4, Timer2, Poscaler);
//Configurar modulo CCP1 en modo PWM
setup_ccp1(ccp_pwm);
//Configurar ADC
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
// aqui entro en el bucle
while (TRUE) {
set_adc_channel(0);
delay_us(100);
duty = read_adc();
set_pwm1_duty(duty);
lcd_gotoxy(1, 4);
printf(lcd_putc, " PWM: %4Lu ", duty);
// RUTINA PARA SALIR DEL BUCLE usando la tecla salir
DELAY_MS(10);
// ESTA SIGUIENTE INSTRUCCION NO ME FUNCIOINA YA QUE NO RECONOCE LAS ENTRADAS
// DIGITALES EN DICHO PUERTO
// EN OTRAS FUNCIONES SI FUNCIONA MIENTRAS NO USE EL TIMER 2 O EL MODULO modulo
//CCP1
if (input(SALIR) == 0) {
DELAY_MS(250);
if (input(SALIR) == 1) {
DELAY_MS(10);
men = 6;
break;
}
}
}
}