desktop

Problema circuito PIC12F675 simple

Soy más fan de los ZIP que de los RAR, porque así lo cargo directo a la nube para importarlo en el MPLAB Xpress, desde que es raro que use un PIC no instalo el compilador.
Viendo el código tienes un error catastrofico en la lógica

C:
while(1){
    //TEMPORIZADOR
        if (GPIObits.GP1 ==1){
        contador++;
        __delay_ms(50);
    }
    //CARGAMOS OBJETIVO TIEMPO
    if (GPIObits.GP5==1){
        contval=100; //6000 (5MIN)
    }
    if (GPIObits.GP4==1){
        contval=200; //12000 (10MIN)
    }
    if (GPIObits.GP4==0 & GPIObits.GP5==0){
        contval=300; //18000 (15MIN)
    }
    //ACCION AL TIEMPO DETERMINADO
    if (contval==contador){
        GPIObits.GP2=1;
        __delay_ms(1000);
        __delay_ms(1000);
        __delay_ms(1000);
        // Esperar hasta que la entrada GP0 sea igual a 1
        while (GPIObits.GP0 == 0) {
        }
        GPIObits.GP2=0;
        contador=0;
        }       
    }


Si estas usando pull-up los valores de GPx serán siempre 1 cuando no presiones los botones, ¿sí conectaste los botones a tierra?
Lo otro que recomiendo es que cambies la comparación a la siguiente forma
if (contval <= contador)
De lo contrario tendrás problemas en el desborde no contemplado si presionas los botones a un valor inferior al del contador, deberías replantear la lógica para contemplar ese escenario.
Solo porque resulta que tengo un PIC12F675 por ahí es que se me ocurrió probarlo.
Funciona en la medida de que hace algo, si así es cómo debería hacerlo no tengo idea.
 
Buenas,
No funciona nada. Si le hago un programa de prueba simple. Cuando activas la entrada activa el motor. Y si que funciona. He tenido que añadir una resistencia de 10kOhm en las entradas para mitigar los falsos 1 que llegaban al micro. El problema debe venir de la logica espantosa que tiene el codigo. Alguna idea para mejorarlo?
Primero coloca tu código;
El ABC de lo que hay y no hacer antes de postear

Segundo, lee sobre circuito anti-rebote para entradas digitales.

Tercero, haz un simple código, del tipo "si entrada A == 1 entonces salida B = 1 sino salida B= 0"
 
Yo prefiero hacerlo al revés
If contador >= contval then...
porque contador es la variable que va aumentando y contval la fija
hace el código más legible.

Tiene más cosas a mejorar:
while (GPIObits.GP0 == 0) {
}
GPIObits.GP2=0;
contador=0;
}

Bucle while empeñado en poner a 0 sólo dos de las variables.

__delay_ms(1000);
__delay_ms(1000);
__delay_ms(1000)
;
Delays que no conocen el número 3000
 
Última edición:
De hecho, así es su código, pero como está planteado cuando A ya no es 10 sino 5 pero el contador ya iba en 6 la cosa se desborda.
Claro, pero la idea de lo que planteé es no usar mas que 1 y 0, sin intermedios, ésto para descartar errores o horrores de programación, librerías, etc...

Si usa un contador, ya hay que analizar un poco mas...
 
Atrás
Arriba