Hola amigos, este es mi primer aporte: Dimmer controlado por rs232
Solo que hay un problema que no consigo resolver, y es por eso que pido su ayuda.
El pic se "traba" cuando recibe comandos, el primer comando funciona bastante bien, pero al 2, 3 o 4 comando se traba, ya no recibe mas comandos y el foco queda encendido, no se si sea por la programacion o sea algo fisico en el circuito.
Aqui el programa:
/////////////////////////////////////////////
Y aqui les dejo un video del funcionamiento, no se que mas pueda mostrarles para que encontremos la solucion.
La parte del circuito es:
Pic + cristal 16m + 2 capacitores 22p
Moc3011 0 3021 con 2 resistencias 220 para proteger la entrada
Triac bta08 600w
Resistencia 5m, a INT para la deteccion de cruce por cero
Puse un capacitor de 10n y uno de 10u cerca de la fuente de 5v
La parte de Eeprom es para asignarle un id ya que planeo usar varios dimmers y que solo acepte la orden si coincide la id.
Mejoras o cualquier cosa es aceptada !!!
Solo que hay un problema que no consigo resolver, y es por eso que pido su ayuda.
El pic se "traba" cuando recibe comandos, el primer comando funciona bastante bien, pero al 2, 3 o 4 comando se traba, ya no recibe mas comandos y el foco queda encendido, no se si sea por la programacion o sea algo fisico en el circuito.
Aqui el programa:
Código:
#include <16F887.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#fuses HS, NOWDT, BROWNOUT, PUT, NOLVP
#use delay(clock=16M)
#use RS232(BAUD=9600,XMIT=PIN_C6, RCV=PIN_C7)
char rs232[8];
int kbhit_rs232;
char idok[2];
char whoami[4];
int32 dlyid=001;
int1 flanco=0;
void load_preferences () {
idok[0]= read_eeprom(0);
idok[1] = "\0";
whoami[0] = read_eeprom(1);
whoami[1] = read_eeprom(2);
whoami[2] = read_eeprom(3);
whoami[3] = "\0";
}
void write_id () {
disable_interrupts(INT_RDA);
char id[5];
char one[2] = "1";
printf("\r\nEl actual id del dispositivo es: %s\n\r", whoami);
printf("\r\nIngrese el nuevo ID del dispositivo\n\r");
gets(id);
write_eeprom(0, one[0]);
write_eeprom(1, id[0]);
write_eeprom(2, id[1]);
write_eeprom(3, id[2]);
whoami[0] = read_eeprom(1);
whoami[1] = read_eeprom(2);
whoami[2] = read_eeprom(3);
whoami[3] = "\0";
printf("\r\nEl nuevo id ahora es %s\n\r", whoami);
enable_interrupts(INT_RDA);
}
void first_id (){
if (idok[0] != '1') {
write_id();
}
}
#int_EXT
void EXT_isr(void)
{
//if (flag == 0) {
output_low(PIN_D2);
if (flanco==1)
{
ext_int_edge(h_to_l);
set_timer0(255-dlyid);
while(get_timer0()>0); //espera hasta que timer0 se desborde
flanco=0;
output_high(PIN_D2);
}
else
{
set_timer0(255-dlyid);
while(get_timer0()>0); //espera hasta que timer0 se desborde
ext_int_edge(l_to_h);
flanco=1;
output_high(PIN_D2);
}
// }
/*
if (flag == 1) {
output_low(PIN_D2);
dly=1;
}
*/
}
#int_RDA
void RDA_isr(void)
{
disable_interrupts(INT_EXT);
gets(rs232);
kbhit_rs232=1;
enable_interrupts(INT_EXT);
}
void process () {
char id[4];
char option[2];
char comando[4];
char sensor[2];
id[0] = rs232[0];
id[1] = rs232[1];
id[2] = rs232[2];
id[3] = "\0";
option[0] = rs232[3];
option[1] = "\0";
comando[0] = rs232[4];
comando[1] = rs232[5];
comando[2] = rs232[6];
comando[3] = "\0";
sensor[0] = rs232[7];
sensor[1] = "\0";
if(!strcmp(whoami, id)) {
if (option[0] == '0') {
dlyid = atoi(comando);
}
if (option[0] == '1') {
//TODO
}
}
}
void main()
{
delay_ms(300);
enable_interrupts(INT_RDA);
enable_interrupts(int_ext | l_to_h);
enable_interrupts(GLOBAL);
setup_timer_0(rtcc_internal | rtcc_div_128 | rtcc_8_bit);
load_preferences();
printf("\r\nPrueba de comunicacion en: %s", whoami);
first_id();
// Inicio un bucle infinito
while(TRUE) {
printf("\n\rComando: \n\r");
//Espero a que llegue dato desde la PC
while(kbhit_rs232==0){}
// Reinicio bandera para proxima espera.
kbhit_rs232=0;
process();
}
}
/////////////////////////////////////////////
Y aqui les dejo un video del funcionamiento, no se que mas pueda mostrarles para que encontremos la solucion.
La parte del circuito es:
Pic + cristal 16m + 2 capacitores 22p
Moc3011 0 3021 con 2 resistencias 220 para proteger la entrada
Triac bta08 600w
Resistencia 5m, a INT para la deteccion de cruce por cero
Puse un capacitor de 10n y uno de 10u cerca de la fuente de 5v
La parte de Eeprom es para asignarle un id ya que planeo usar varios dimmers y que solo acepte la orden si coincide la id.
Mejoras o cualquier cosa es aceptada !!!
Adjuntos
Última edición: