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.
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:
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)
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.
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.
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:
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)

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: