Paradas espontaneas con PIC16F628A

Buenos días a todos!
Antes de nada perdón por el tostón que os presento a continuación, pero creo que la forma de que alguien pueda ayudarme es explicando bien el problema. :rolleyes:
Hace ya un tiempo que tenía pendiente un pequeño proyecto para mi casa. La idea era controlar con un solo interruptor dos luces, de forma que si encendemos una vez se activa una luz, si apagamos y rápidamente volvemos a encender se activa la otra, y si repetimos el proceso se activan las 2 a la vez. En caso de dejar el interruptor en off un momento se apagan las luces.
El esquema es el siguiente:


aossux.jpg



Como podéis ver uso una alimentación de 230V, convierto y rectifico para alimentar las bobinas de 2 relés y el pic. Luego hice una PCB (En realidad la hice a través de PCBway, pues hacia tiempo que quería probar como trabajaban)
2vigvh5.png

En la PCB ya he encontrado un fallo, y es que tendría que haber puesto una pista directa del condensador de desacoplo al PIC.
Esto me ha ocasionado que el pic fallase casi siempre, sobre todo al acercarle un destornillador, entiendo que "concentraba" el campo magnético generado por los cables de 230C que pasan cerca... Al ver el fallo he soldado un segundo condensador directamente entre las patillas del PIC y el problema parece haber desaparecido. Salvo por un pequeño problema: de forma espontánea, sin previo aviso y sin que haya ninguna razón aparente el PIC se para, y apaga las luces. Descarto interferencias generadas por los relés, pues me ocurre aunque no esté realizando cambios de estado. Así que me veo obligado a sospechar de interferencias electromagnéticas, o que entren directamente a través de la red...

Alguien ve algo en el esquema o en el PCB que sea una tontería? o que eche en falta algo?
Os ha pasado algo similar?

Al final os dejo el programa que he realizado para el control, aunque diría que el problema no está aquí.


Muchas gracias de antemano!

Saludos,

PD: Si alguien tiene cualquier duda con el circuito o el programa que no dude en preguntármelo.

Código:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <xc.h> //llibreria del compilador

#define _XTAL_FREQ 4000000
//#define TRUE 1
//#define FALSE 0
//#define BOOL int
// CONFIG

bool Estat0, Estat1, Estat2, Estat3;
int contador=0;
/*
 * 
 */
void main() {
    
    Estat0 = 1;
    Estat1 = 0;
    Estat2 = 0;
    Estat3 = 0;
    CMCON = 7;
 TRISA = 0b11111111; //Tot el port A com a entrades
 TRISB = 0b00000000; //Tot el port B com a sortides
 //PORTB 0b00000000; //Tots els bits del port B a 0
  //loop del programa
// PORTBbits.RB0=1;
    
 
     
 while(1){
     
     if (Estat0 == 1){
         PORTBbits.RB0 = 0; //Si estem a l'estat 0 els dos reles estan parats
         PORTBbits.RB1=0; 
         if (PORTAbits.RA0 == 0){ //Si pulsem l'interruptor entrem l'estat1 i reiniciem el 0
             Estat1 = 1;
             Estat0 = 0;
             }
     }
     else if (Estat1 == 1){ //Si estem a l'estat 1
         PORTBbits.RB0 = 1; //Activem unicament el rele d'RB0
         PORTBbits.RB1 = 0;
         if (PORTAbits.RA0 == 1){ //en cas que desactivem l'interruptor
             contador++;    //posem el contador +1 a cada cicle
             if (contador > 30000){ //Si el contador arriba a 10.000 (falta mirar el valor pertinent)
                 Estat0=1; //Tornem a l'estat0 (Em apagat el llum molta estona)
                 Estat1=0; 
                 contador = 0; //Posem el contador a 0
             }
      
         }
         if((PORTAbits.RA0 == 0) & (contador > 50)){ //Si l'interruptor esta activat i el contador ha avançat (s'ha apagat un moment l'interruptor)
             Estat2 = 1; //(anem a l'estat')
             Estat1 = 0;
             contador = 0; //Posem el contador a 0
         }
     }
     else if (Estat2 == 1){
         PORTBbits.RB0=0;
         PORTBbits.RB1 = 1; //Activem el rele d'RB1
         if (PORTAbits.RA0 == 1){
             contador++;
             if (contador > 30000){
                 Estat0=1;
                 Estat2=0;
                 contador = 0;
             }
             
         }
         if((PORTAbits.RA0==0) & (contador>50)){
             Estat3=1;
             Estat2=0;
             contador = 0;
         }
     }
     else if (Estat3 == 1){
         PORTBbits.RB0=1;
         PORTBbits.RB1 = 1; //Activem el rele d'RB1
         if (PORTAbits.RA0 == 1){
             contador++;
             if (contador > 30000){
                 Estat0=1;
                 Estat3=0;
                 contador = 0;
             }
             
         }
         if((PORTAbits.RA0==0) & (contador>50)){
             Estat1=1;
             Estat3=0;
             contador = 0;
         }
     }
     else {
         Estat0=1;
         Estat1=0;
         Estat2=0;
         Estat3=0;
     }
     CLRWDT();
 }
}
 
Última edición por un moderador:
Lo primero:
Imagino que el pin MCLR lo tendrás declarado como entrada y debidamente polarizada y si no igualmente lo tendrás polarizado a positivo. Esta siempre si o si.

Después:
Si te pasa sin realizar maniobras yo haría lo siguiente:
Cambiar C1 y C2 (son muy pequeños funcione o no funcione el circuito están mal, a no ser que la fuente sea una batería o pila entonces serían pasables pero muy justos).
C1 = 470uF y C2 = 220uF
Añadir en paralelo con C1 un C de 10nF.
Añadir en paralelo con C2 un C de 100nF.
Poner un varistor de 275V (VDR) en paralelo con la entrada de 220AC del transformador, después del fusible. Esta siempre si o si.
Todos los pin que no se utilizan tienen que estar configurados como salida y si son entras tienen que estar polarizados. Esta siempre si o si.

Y para terminar:
Llevas la alimentación de 5v por los pulsadores, si los pulsadores no están en placa tendrás que pasarla con cables que harán de antena.
Yo haría la maniobra de forma distinta, un pin del pulsador a masa y un condensador de 1nF a 10nF en paralelo con el pulsador, una resistencia de 10K de positivo al otro terminal del pulsador y de este punto una resistencia de 330oh al pin del pic, posiblemente te invierta la maniobra pero es la que yo usaría. Al alimentar el circuito el condensador en paralelo con la tecla puede darte un falso pulso, por lo que tienes que poner un pequeño retardo de unos cuantos mSeg. en el arranque antes de leer las teclas. Esta última solo a gusto del consumidor.
 
Última edición:
Para empezar, agrega una red de Snubber sobre cada relee.

Fogonazo una pregunta, ¿si el rele es de 9v, con poner un diodo no es suficiente?, y si no es suficiente puedes explicar por que.



Y para terminar:
Llevas la alimentación de 5v por los pulsadores, si los pulsadores no están en placa tendrás que pasarla con cables que harán de antena.
Yo haría la maniobra de forma distinta, un pin del pulsador a masa y un condensador de 1nF a 10nF en paralelo con el pulsador, una resistencia de 10K de positivo al otro terminal del pulsador y de este punto una resistencia de 330oh al pin del pic, posiblemente te invierta la maniobra pero es la que yo usaría. Al alimentar el circuito el condensador en paralelo con la tecla puede darte un falso pulso, por lo que tienes que poner un pequeño retardo de unos cuantos mSeg. en el arranque antes de leer las teclas. Esta última solo a gusto del consumidor.

dogflu66 si no te importa puedes poner una imagen, gracias.

como retardo que os parece este, yo lo uso y me va bien: do {}while(input(pin_xx));
 
Última edición:
La conmutación de "Cargas" inductivas provoca la generación EMI (ElectroMagnetic Interference), estas interferencias pueden afectar el funcionamiento de la lógica de control.

El diodo Freewheeling evita (también) que se generen interferencias EMI y además protege al dispositivo que controla al relee de las sobre-tensiones que genera la bobina de este al conmutar.
 
Gracias fogonazo, esto no lo sabia.

Entonces, por lo que entiendo, un simple 1n4001 no es lo mas adecuado.

Y si el rele esta separado del microcontrolador? entonces si podria servir?.

Voy a mirar esa clase de diodos que has indicado y ya lo se para futuras veces.
 
Un diodo es indispensable, pero si estás teniendo problemas de "Alteración de la lógica" hay que atacar con artillería pesada, por ejemplo esto:


. . . . ¿ De donde provienen los 9V de alimentación de los relee ? . .


No es para nada conveniente alimentar todo con la misma línea de tensión.
 
A mi me parece que ese esquema deberia funcionar, no es lo ideal pero deberia funcionar.

yo me iria por el lado del pulsador, poner un capacitor de 1uF de tantalio en paralelo al pulsador y poner un antirebote en el codigo, que por lo que vi no tiene (a menos que me lo haya brincado XD)
 
Gracias fogonazo, esto no lo sabia.

Entonces, por lo que entiendo, un simple 1n4001 no es lo mas adecuado.

Y si el rele esta separado del microcontrolador? entonces si podria servir?.

Voy a mirar esa clase de diodos que has indicado y ya lo se para futuras veces.

El diodo 1n4001 es para rectificación, para un relé sugiero un diodo rápido como el 1n4148 que va a tardar menos tiempo en conducir. Cuanto más tiempo pasa sin conducir, mayor tensión va a haber en el colector del transistor, y más riesgo para el circuito.

Y si siguen los problemas y vas a hacer compras te sugiero que agregues al carrito un ULN2803, que está pensado para manejar ese tipo de cargas sin poner más que el integrado, un par de capacitores, y listo. Te olvidas de los transistores, los resistores para los transistores, el diodo...
Maneja hasta 8 cargas, pero si va a estar activo un buen tiempo vas a tener que ponerle un disipador.

Hajamm, en esto tampoco habia pensado nunca, de hecho en varios proyectos que he realizado utilizo la misma linia de alimentacion.

Esta claro que nunca te acostaras sin saber algo mas, gracias fogonazo.

Viendo el esquemático me parece que el problema más grande que hay en la alimentación es que el capacitor C1 entre el puente rectificador y el regulador 7805 es muy chico, solo 1 uf.
Ahí deberías poner de mínima un capacitor de 100uF (de 16V, que no te vendan de 25V porque sino vas a precisar un valor más grande), y a la salida del regulador te diría por los menos 10uF.
Cualquier pico de corriente que haya de los 9V "para abajo" va a provocar un bajón de tensión en esos supuestos 9V, suficiente para que el regulador deje de regular por no tener una tensión suficiente a la entrada.
Eso lo dice el parámetro "dropout voltage" aprox = 2V para el 7805, si la tensión a la entrada es menos de 7V -aunque sea por 1 milisegundo- el regulador deja de regular los 5V a la salida, y si esa tensión baja de cierto límite el pic se resetea (ver hoja de datos del pic, supply voltage min que depende a que velocidad corre el micro, y también podes tener un brown-out reset).

Por eso es importante poner capacitores más grandes, para que los picos de corriente no provoquen una bajada de tensión tal que haga que el regulador deje de regular, y por lo tanto el pic se resetee.

A mi me parece que ese esquema deberia funcionar, no es lo ideal pero deberia funcionar.

yo me iria por el lado del pulsador, poner un capacitor de 1uF de tantalio en paralelo al pulsador y poner un antirebote en el codigo, que por lo que vi no tiene (a menos que me lo haya brincado XD)

En el esquemático hay un capacitor (y también un resistor) en paralelo con RA0, lo que veo es que no puso un resistor en serie entre el pulsador y el capacitor, con lo cual no se filtraría nada por hardware y entrarían todos los rebotes al software.

El software no me parece muy claro, pero usa algunos contadores, quizás eso está haciendo de filtro, o mejor dicho, de ventana de exclusión para leer las entradas.

Bueno, ojalá que la respuesta no sea muy abrumadora, cuando tengas alguna novedad no dejes contarnos la experiencia!!!
 
Aunque ya lo indique mas arriba en un post vuelvo a decirlo, podeis poner algun esquema de como poner los pulsadores y sus componentes perifericos.
 
En el esquemático hay un capacitor (y también un resistor) en paralelo con RA0, lo que veo es que no puso un resistor en serie entre el pulsador y el capacitor, con lo cual no se filtraría nada por hardware y entrarían todos los rebotes al software.

bueno si vi, ese capacitor y resistor pero no le vi sentido, o no mucho, casi siempre los pongo asi:

Esquema.gif


o de menos un solo capacitor de 1uF en paralelo al pulsador, tambien funciona.

El software no me parece muy claro, pero usa algunos contadores, quizás eso está haciendo de filtro, o mejor dicho, de ventana de exclusión para leer las entradas.

yo pienso que no son ventanas, sino temporizadores para "hacer algo".. (la verdad es que casi nunca me detengo a analizar a detalle los codigos, si encuentro algo al primer vistazo, bueno.. lo comento y vuelta de pagina XD... a menos que me interese el codigo la cosa cambia XD)

donde vi mal algo es en esto:
Estat0 = 1;
Estat1 = 0;
Estat2 = 0;
Estat3 = 0;
CMCON = 7;
TRISA = 0b11111111; //Tot el port A com a entrades
TRISB = 0b00000000; //Tot el port B com a sortides
//PORTB 0b00000000; //Tots els bits del port B a 0
//loop del programa
// PORTBbits.RB0=1;



while(1){

if (Estat0 == 1){
PORTBbits.RB0 = 0; //Si estem a l'estat 0 els dos reles estan parats
PORTBbits.RB1=0;
if (PORTAbits.RA0 == 0){ //Si pulsem l'interruptor entrem l'estat1 i reiniciem el 0
Estat1 = 1;
Estat0 = 0;

}
}

ahi no hay nada de antirebote... que es por lo menos la primer sentencia que se ejecuta.
 
No uso el condensador propiamente como antirebotes, más bien como desparasitario, aún qué también ayuda.

por eso... es lo mismo que comento, 1uF sirve mas como desparasitante, que 1nF, si tienes osciloscopio dale una mirada, yo le he puesto hasta 100nF y se ve el ruido fuerte del momvimiento mecanico del switch, claro que en gustos se rompen generos y si asi te agrada y te da resultados pues esta bien. XD.

y no el 1uF tampoco sirve de antirrebote o depende de que resitencia se ponga, la respuesta que se necesite y etc.
 
papirrin una pregunta, realmente puede afectar tanto ese ruido al que comentas, si no lleva el filtro? a fin de cuentas solo se da una pulsacion.

Si se pone el condensador ya no es preciso hacer ningun antirrebote?.
 
Última edición:
papirrin una pregunta, realmente puede afectar tanto ese ruido al que comentas, si no lleva el filtro? a fin de cuentas solo se da una pulsacion.

Si se pone el condensador ya no es preciso hacer ningun antirrebote?.

No es solo una pulsación.

Es una violenta serie de pulsos proveniente de rebotes en el contacto del switch mecánico
 
Si se pone el condensador ya no es preciso hacer ningun antirrebote?.

yo si lo hago, pongo el filtro para los parasitos o como dice Don Fogonazo los violentos pulsos en el switch, y aparte pongo en el codigo el antirrebote.

en muchos circuitos a nivel fabricante lo hacen asi, lo de poner condensadores, y he notado que en diferentes "maneras" supongo que a cada quien le va mejor su manera, es cuestion de que tomen cualquier placa de algun tv, modular o etc. y observen como estan las lineas de los pulsadores.

en este caso en particular y por los sintomas yo pienso que va por ahi, aunque no es lo unico que le hace falta al circuito, yo pienso que deberia funcionar a nivel de prueba o en protoboard, y de cualquier manera hace falta lo que han comentado de la red snubber, quizas un filtro de red y etc. para hacer un circuito mas estable.
 
Atrás
Arriba