Bueno .,he estado buscando info en internet hace tiempo
pero muchos datos no he encontrado ., el caso es que vi ejemplos en bascon y asm
pero nada para C .,tampoco ejemplos validos de guiá para DMX
Lo que si encontré son las formulas que usan en C pero en los pic (supongo que son iguales o que se pueden aplicar)
EJEMPLO master RGB:[/LEFT] ch = ch *dim / 255 seria asi (creo)if ((DmxRxField [0] * DmxRxField [3]) / 255> PWM_timer)//rojo y el strobo [/LEFT] ch = timer *ch*4 seria asi (creo) if(strobo_timer>(255-DmxRxField[4]) *4) yo hice un burdo intento de compilar ., tengo demasiados errores
esta es mi configuración de timer
PHP:
// ***** inicializacion del timer****//
void init_timer(){
TCCR0|= (1<<CS02) ; // Precontador 256
TIMSK|= (1<<TOIE0); // desbordamientos de la interrupción
TCNT0= OV_SIZE;
}
// Restablecer el temporizador
void reset_timer(){
TCNT0= OV_SIZE; // Worth ?? comenzando Contador inicial
timer_counter=0;
esto es lo que arme (no me funciona)
PHP:
enum strobo{ON=1,OFF=0}; //Strobe permite o no permite
strobo=ON; // La conexión ?? iluminación stroboscopica habilitada
int strobo_timer=0; // Contador Strobe
while(1) // bucle central principal
{
get_dips(); // Comprobar dip-switch y descargar la dirección DMX
for (PWM_timer=0; PWM_timer<255 ; PWM_timer++) // bucle PWM a aplicar a través de una serie de relleno
{
if (DmxRxField[0]>PWM_timer) //ROJO
{
PORTB &= ~(1<<PB0); //LED OFF (APAGADO)
}else{
PORTB |= (1<<PB0); //LED ON (ENCENDIDO)
}
if (DmxRxField[1]>PWM_timer) //VERDE
{
PORTB &= ~(1<<PB1); //LED OFF (APAGADO)
}else{
PORTB |= (1<<PB1); //LED ON (ENCENDIDO)
}
if (DmxRxField[2]>PWM_timer) //AZUL
{
PORTB &= ~(1<<PB2); //LED OFF (APAGADO)
}else{
PORTB |= (1<<PB2); //LED ON (ENCENDIDO)
}
// ------------- Apoyo estroboscópica
if(DmxRxField[4]>0){ // si el canal Strobe = 0 siempre ., led encendido normales ., lo contrario luz estroboscópica
if(strobo_timer_count>(255-DmxRxField[4]) *4) // La multiplicación por 4 retarda el tiempo estroboscópica 1 - tiempo máximo , 255 - min Tiempo
strobo_timer_count=0; // Cambiar el estroboscopico temporizador ?
strobo=0 ; strobo=ON; // Cambiar ., habilitacion strobo
}else{
strobo_timer++;
}
}else{
strobo=1; // Strobe apagado
}
// -------------------- PWM LED
//for (PWM_timer=0; PWM_timer<255 ; PWM_timer++) // Loop explican que muestra un ciclo de llenado
{
if (( (DmxRxField[0]*DmxRxField[3])/255>PWM_timer) & strobo) //red
{
PORTB &= ~(1<<PB0); //LED OFF
}else{
PORTB |= (1<<PB0); //LED ON
}
if ( ((DmxRxField[1]*DmxRxField[3])/255>PWM_timer) & strobo) //green
{
PORTB &= ~(1<<PB1); //LED OFF
}else{
PORTB |= (1<<PB1); //LED ON
}
if ( ((DmxRxField[2]*DmxRxField[3])/255>PWM_timer) & strobo) //blue
{
PORTB &= ~(1<<PB2); //LED OFF
}else{
PORTB |= (1<<PB2); //LED ON
}
me gustaria ir desglosando poco a poco las funciones ., asi aprendo
aca tengo un ejemplo de lo que funciona ., pero tiene los timer distintos .,y ami no me funciona .,
PHP:
// Temporizador 0 Contador de tiempo de interrupción DMX y PWM
TCCR1A |= (1<<WGM01);
TCCR1B |= (1<<CS00);
TIMSK |= (1<<OCIE1A);
OCR1A = F_OSC/1024/100 - 1; // Marque 1 ms
aca los enuciados de dicha cabecera
PHP:
unsigned long strobe_counter = 0;
unsigned char tmp1,tmp2,tmp3;
aca el ejemplo de C
PHP:
if(dmx_lost==DMX_LOST_TIMEOUT)
{
dmx_buffer[1] = 0;
dmx_buffer[2] = 0;
dmx_buffer[3] = 0;
dmx_buffer[4] = 0;
}
tmp1 = dmx_buffer[1]*dmx_buffer[4]/255;
tmp2 = dmx_buffer[2]*dmx_buffer[4]/255;
tmp3 = dmx_buffer[3]*dmx_buffer[4]/255;
if(dmx_buffer[5]<10)
{
led_kanal[0] = tmp1;
led_kanal[1] = tmp2;
led_kanal[2] = tmp3;
}
else
{
strobe_counter++;
if(strobe_counter > (256 - dmx_buffer[5]))
{
led_kanal[0] = tmp1;
led_kanal[1] = tmp2;
led_kanal[2] = tmp3;
}
else
{
led_kanal[0] = 0;
led_kanal[1] = 0;
led_kanal[2] = 0;
}
if(strobe_counter > (2 * (256 - dmx_buffer[5])))
{
strobe_counter = 0;
led_kanal[0] = 0;
led_kanal[1] = 0;
led_kanal[2] = 0;
}
}
}
}
Última edición: