Buenos días compañeros,
Ahora tengo otra pregunta, se podrán controlar varios dimmers con un solo pic?, lo he tratado de hacer y me hace efectos no deseados les dejo el codigo:
/*
Dimmer gobernado por puerto serie rs485
2010_12_03
*/
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use i2c(master,sda=PIN_C4, scl=PIN_C3) // Definición I2C estándar
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define ON output_high
#define OFF output_low
#define tx_rs485 output_high(pin_c5)
#define rx_rs485 output_low(pin_c5)
#define dir_local 0xA2
#define ejecutar 'X'
#define pregunta '?'
#define enter 0X0D
//aqui se pueden cambiar los pines de los actuadores
int act[16] = {pin_d2,pin_d3,pin_d4,pin_d1,pin_d0,pin_c2,pin_c1,pin_c0,
pin_b5,pin_b4,pin_b3,pin_b2,pin_b1,pin_d7,pin_d6,pin_d5};
byte i=1,cont2=0,i_buffer=0,i_act=0;
int16 cuenta=0;
byte intensidad[16], i_cont=0, cont[16];
byte buffer_in[32];
byte buffer_out[32];
int1 buffer_rs485_lleno=0, z=0,flag_dim[16];
/////////////////////////////////////////////////////////////////////
// subrutina que recibe datos del pc////////////////////////////////
////////////////////////////////////////////////////////////////////
#int_rda
void rda_isr() {
if(kbhit()){
buffer_in[i_buffer] =getc();
if( buffer_in[i_buffer]==0x7e){
i_buffer=0;
}
if( buffer_in[i_buffer]==enter){
buffer_rs485_lleno=1;
i_buffer=0;
tx_rs485;
putc('R');
rx_rs485;
}
i_buffer = i_buffer+1;
}
}
/////////////////////////////////////////////////////////////////////
// interruciones externas///////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
#int_ext
void interrup_RB0() {
enable_interrupts(INT_TIMER0); //activo int por timer0
set_timer0(0);//11-40-----
}
////////////////////////////////////////////////////////////////////////////////
//interrupciones por desborde de timer0
////////////////////////////////////////////////////////////////////////////////
#int_RTCC
void reloj_isr(){
for(i_cont=0;i_cont<=15;++i_cont){
cont[i_cont]++; //cuenta las veces que se entra a la int
if (cont[i_cont]==intensidad[i_cont]){ // de 1 a 80
cont[i_cont]=0; //borro contador
if(flag_dim[i_cont]==1){
disable_interrupts(INT_TIMER0);
ON (act[i_cont]) ;// el led cambia de estado cada segundo
//delay_us(100);
OFF(act[i_cont]);
}
}
}
}
/////////////////////////////////////////////////////////////////////
// bloque principal/////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
void analiza_buffer_rs485(){
if(buffer_in[1]==dir_local){
if(buffer_in[3]==ejecutar){
intensidad[buffer_in[4]]=buffer_in[6];
flag_dim[buffer_in[4]]=buffer_in[5];
}
}
buffer_rs485_lleno=0;
}
void main(void) {
//intensidad[i_cont]=5;
for(i_cont=0;i_cont<=15;++i_cont){
intensidad[i_cont]=30;
flag_dim[i_cont]=0;
cont[i_cont]=0;
}
rx_rs485;
enable_interrupts(int_rda); //habilito interrupciones puerto serial
enable_interrupts(int_ext); //habilito interrupciones externas
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2|RTCC_8_BIT); //ver cabecera
enable_interrupts(INT_TIMER0); //activo int por timer0
ext_int_edge(L_TO_H); //defino primer flaco interruciones
setup_adc_ports (NO_ANALOGS); //no analogos
enable_interrupts(global); //habilito interruciones
flag_dim[0]=1;
//intensidad[2]=40;
//intensidad[3]=15;
while (1)
{
rx_rs485;
if(buffer_rs485_lleno==1){
analiza_buffer_rs485();
}
}
}
Mientras utilice una sola salida todo bien, o todos tengan la misma intensidad funciona bien, pero si las intensidades son diferente se porta de forma irregular, será que no es posible?