ayuda con programa en C para Pic

Saludos amigos listeros, espero puedan ayudarme en lo siguiente: He realizado un programa sencillo en CCS para el 16F84A(un poquito antiguo en pic, pero para lo que quiero que haga es suficiente), la idea es que cuando se ponga a uno el RB0, despues de unos segundos se active el RB1 por un tiempo, luego se desactive éste y se active el RB2, en los tiempos dados. El circuito funciona bien, activo el RB0 y el RB1 se activa, se desactiva y luego el RB2, hace lo mismo. Pero el detalle esta que cuando lo hago esto más rápido de lo normal, es decir, active el RB0 y funciona bien, luego inmediatamente que activo nuevamente el RB0 ya no quiere funcionar el programa. Tengo que esperar unos segundo o hay veces tengo que reseteaer el pic o quitarle la alimentación para que funcione nuevamente. En cambio, cuando lo hago "lento", o sea, activo el RB0, funciona todo, luego de unos segundos, vuelvo activar el RB0 y funciona bien, pero no sé qué pasa cuando lo hago más "rápido" activando el RB0 una vez que "creo que el programa finalizó". Otra cosa amigos y discúlpenme mi insistencia, cuando activo el RB0 con un "sólo toque" ( o sea, que lo cierro y lo abro) ya no funciona el programa. No me preocupa el efecto rebote, aunque con el delay de 5 seg creo que es más que suficiente. Gracias por las repuestas.
Aqui el programa:
#include <16F84A.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
//------Programa principal-----
//Programa que activa un motor de cc durante 15 segundo y luego de
//un reposo de 4 seg. lo activa nuevamente por 15'' en sentido contrario
#byte port_b=0x06

void main(void)
{
set_tris_b(0xF9); //Salidas RB1 y RB2 como salida, el resto como entrada.
disable_interrupts(GLOBAL); //todas las interrupciones desactivadas
port_b=0;
do {
if(input(PIN_B0)){ //Si el pulsador esta en alto...
delay_ms(5000);
output_high(PIN_B1); //5 voltios en pin RB1.
delay_ms(2700); //activado 2.7 seg.
output_low(PIN_B1); //desactivado
delay_ms(200); //retardo de 200 mseg.
output_high(PIN_B2); //5 voltios en pin RB2
delay_ms(1100); //activado 1.2 segundos
output_low(PIN_B2);} //desactivado
port_b=0;
} while(TRUE); //Se repite sólo para cuando RB0 sea 1.
}


Saludos desde Lima-Perú.
Palmas.
 
Cuando pones port_b=0, estas poniento todo el puerto B a 0 teniendo algunos como entradas y otros como salidas. Prueba a poner solamente las salidas a 0 con una mascara. Un saludo
 
Atrás
Arriba