Dimmer controlado por rs232

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:

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

  • slaveAM2.rar
    1.3 KB · Visitas: 33
  • IMG_20130202_130524.jpg
    IMG_20130202_130524.jpg
    251.1 KB · Visitas: 20
Última edición:
Saludos. Mira por pura observación puedo notar un par de cosas.

La primera es que el estado inicial del dimmer es encendido completo, asi que la primera orden siempre sera disminuir. Eso indicaria que el problema siempre se sucita al aumentar el brillo desde un nivel bajo o al llegar a cierto brillo. Por software habria que probar reduciendo el tiempo que asignas al triac encendido para ver que no este en conflicto con la interrupcion del cruce a cero. Por hardware habria que ver que no se dispare el voltaje en la patilla de la int de cruce a cero puesto que no tiene un divisor de tensión propiamente.

Eso tambien habra de analizarse. La resistencia de 5MΩ va conectada directa desde el pin a una de las fases. No alcanzo a distinguir de donde esta tomando la referencia, pero si la toma directo de la otra fase, tambien va a circular una corriente inversa en esa terminal, lo cual podria hacer que el integrado se trabe (y a la larga que se queme). Podria agregar un diodo desde la fase para leer solo la tensión positiva y hacer un divisor de tension (5MΩ y 180KΩ te darian arribita de 4V). Algunos esquemas que he visto usan diodos zener.

Espero te pueda servir de algo
 
Atrás
Arriba