Formulas DMX de multiplicacion y division en AVRstudio lenguaje C

#21
Gracias cosme ., bueno al unica duda que tengo es ¿¿ donde coloco el valor de "delay" como vos indicaste .,​
porque en el codigo hay dos sentencias "DELAY"​
PHP:
 }//if(flag_estrobo)

                 if(DmxRxField[4]!=255) //Pregunto si son tiempos cortos o largos
                 {
                    _delay_ms(1); //Si el for para el PWM es de 255 => el periodo final serán 255mS
                 }
                 else
                 {
                   _delay_ms(4); //Si el for para el PWM es de 255 => el periodo final será 1,02 Seg    
                 }

              }// for(canal=0; canal<3; canal++)
es aqui​
PHP:
_delay_ms(4); //Si el for para el PWM es de 255 => el periodo final será 1,02 Seg
o aca​
PHP:
_delay_ms(1); //Si el for para el PWM es de 255 => el periodo final serán 255mS
 
#22
En los dos lugares, uno será para imponer el tiempo corto y el otro el largo, según mencionaste, eso estará dado si DmxRxField[4] es igual a 255 o un valor distinto.

Después los valores esos cambiarán según tu criterio que la fórmula que te puse arriba.
 
#23
bueno cosme
En los dos lugares, uno será para imponer el tiempo corto y el otro el largo, según mencionaste, eso estará dado si DmxRxField[4] es igual a 255 o un valor distinto.

Después los valores esos cambiarán según tu criterio que la fórmula que te puse arriba.
NO me funciono ., acá te pongo la compilación ., le puse eso valores al "delay" para probar​
PHP:
 while(1)                                   
        {
        get_dips();
         
          //-------------------- PWM LED
          for (PWM_timer=0; PWM_timer<255 ; PWM_timer++) // Loop del timer aplicado al bucle while
          {                                                                                                                        
              for(canal=0; canal<3; canal++) //Canal: 0= Rojo, 1= Verde, 2= Azul
              {
                 if(!flag_estrobo) //Enciendo los leds!
                 {
                   control_maestro_aux=DmxRxField[0];
                   control_maestro_aux=control_maestro_aux*DmxRxField[3];
                   control_maestro_aux=(control_maestro_aux>>8);
                 
                 if(flag_estrobo) //El flag estrobo habilita o no el encendido/apagado de LEDS!   
                 {
                   if (((unsigned char)(control_maestro_aux)>PWM_timer))        //Cada canal.
                   {
                      PORTB &= ~(1<<0);                //LED OFF (APAGADO)
                   }else{
                      PORTB |= (1<<0);                //LED ON  (ENCENDIDO)        
                   }
                 }//if(flag_estrobo)

                 if(DmxRxField[4]!=255) //Pregunto si son tiempos cortos o largos
                 {
                    _delay_ms(3.92); //Si el for para el PWM es de 255 => el periodo final serán 255mS
                 }
                 else
                 {
                   _delay_ms(22.0); //Si el for para el PWM es de 255 => el periodo final será 1,02 Seg    
                 }

              }// for(canal=0; canal<3; canal++)
          }//for (PWM_timer=0; PWM_timer<255 ; PWM_timer++)    
          
          if(DmxRxField[4])  //Si el estrobo está habilitado!
          {
            flag_estrobo ^= 1; //Cambia el estado del flag estrobo, habilita o no destello
          }
          else
          {
            flag_estrobo=1; //Si el estrobo no está habilitado => los leds están siempre funcionando.
          }
		
              
                 if(!flag_estrobo) //Enciendo los leds!
                 {
                   control_maestro_aux=DmxRxField[1];
                   control_maestro_aux=control_maestro_aux*DmxRxField[3];
                   control_maestro_aux=(control_maestro_aux>>8);
                 
                 if(flag_estrobo) //El flag estrobo habilita o no el encendido/apagado de LEDS!   
                 {
                   if (((unsigned char)(control_maestro_aux)>PWM_timer))        //Cada canal.
                   {
                      PORTB &= ~(1<<1);                //LED OFF (APAGADO)
                   }else{
                      PORTB |= (1<<1);                //LED ON  (ENCENDIDO)        
                   }
                 }//if(flag_estrobo)

                 if(DmxRxField[4]!=255) //Pregunto si son tiempos cortos o largos
                 {
                    _delay_ms(3.92); //Si el for para el PWM es de 255 => el periodo final serán 255mS
                 }
                 else
                 {
                   _delay_ms(22.0); //Si el for para el PWM es de 255 => el periodo final será 1,02 Seg    
                 }

              }// for(canal=0; canal<3; canal++)
          }//for (PWM_timer=0; PWM_timer<255 ; PWM_timer++)    
          
          if(DmxRxField[4])  //Si el estrobo está habilitado!
          {
            flag_estrobo ^= 1; //Cambia el estado del flag estrobo, habilita o no destello
          }
          else
          {
            flag_estrobo=1; //Si el estrobo no está habilitado => los leds están siempre funcionando.
          }
 
                 if(!flag_estrobo) //Enciendo los leds!
                 {
                   control_maestro_aux=DmxRxField[2];
                   control_maestro_aux=control_maestro_aux*DmxRxField[3];
                   control_maestro_aux=(control_maestro_aux>>8);
                 
                 if(flag_estrobo) //El flag estrobo habilita o no el encendido/apagado de LEDS!   
                 {
                   if (((unsigned char)(control_maestro_aux)>PWM_timer))        //Cada canal.
                   {
                      PORTB &= ~(1<<2);                //LED OFF (APAGADO)
                   }else{
                      PORTB |= (1<<2);                //LED ON  (ENCENDIDO)        
                   }
                 }//if(flag_estrobo)

                 if(DmxRxField[4]!=255) //Pregunto si son tiempos cortos o largos
                 {
                    _delay_ms(3.92); //Si el for para el PWM es de 255 => el periodo final serán 255mS
                 }
                 else
                 {
                   _delay_ms(22.0); //Si el for para el PWM es de 255 => el periodo final será 1,02 Seg    
                 }

              }// for(canal=0; canal<3; canal++)
          }//for (PWM_timer=0; PWM_timer<255 ; PWM_timer++)    
          
          if(DmxRxField[4])  //Si el estrobo está habilitado!
          {
            flag_estrobo ^= 1; //Cambia el estado del flag estrobo, habilita o no destello
          }
          else
          {
            flag_estrobo=1; //Si el estrobo no está habilitado => los leds están siempre funcionando.
          //}
		}
	}
//}
bueno aca te pongo lo que a mi si me funciona ., pero mal .,los errores son : el tiempo largo lo tengo en el potenciometro virtual en 249/250 y el tiempo corto máximo en 255​
me usa los tres canales ., no puedo darle valor individual de dimer y tampoco me funciona DmxRxField(3) ., máster general no funciona​
PHP:
char strobo = FALSE;
	int strobo_timer=0;					                //
	while(1)									//
	{
		get_dips();								//
 
		// ------------- Obsługa strobo
		if(DmxRxField[4]>10){				
			if(strobo_timer>(255-DmxRxField[4]) *4)
				strobo_timer=0;                                //
				if(strobo){ strobo=FALSE;}else{ strobo=TRUE;}  
 
				}else{
				strobo_timer++;
			}
			}else{
			strobo=FALSE;		//
		}
 
		//-------------------- PWM ledów
		for (PWM_timer=0; PWM_timer<255 ; PWM_timer++) //
		{
			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
			}
 
		}
	  }
}
 
#25
Bueno
Verificá el mensaje que pusé, que en su momento corregí el if. Se complica escribir código en el foro y se me pasó.
me compila bien no tira ningún error ahora cundo de doy a simular ., no queda haciendo el bucle de "While(1) .,lee un canal y se va ala IRS del timer0 ., luego vuelve al canal siguiente ., donde pasa lo mismo​
es asi con los tres .,en lo fisico ., no prenden ninguno y no hace nada acá te pongo lo que esta ., tal vez hice algún error yo​
PHP:
while(1)                                   
        {
        get_dips();
         
          //-------------------- PWM LED
          for (PWM_timer=0; PWM_timer<255 ; PWM_timer++) // Loop del timer aplicado al bucle while
          {                                                                                                                        
              for(canal=0; canal<3; canal++) //Canal: 0= Rojo, 1= Verde, 2= Azul
              {
                 if(flag_estrobo) //El flag estrobo habilita o no el encendido/apagado de LEDS!   
                 {
                   control_maestro_aux=DmxRxField[canal];
                   control_maestro_aux=control_maestro_aux*DmxRxField[3];
                   control_maestro_aux=(control_maestro_aux>>8);
                 
                   if (((unsigned char)(control_maestro_aux)>PWM_timer))        //Cada canal.
                   {
                      PORTB &= ~(0<<canal);                //LED OFF (APAGADO)
                   }else{
                      PORTB |= (0<<canal);                //LED ON  (ENCENDIDO)        
                   }
                 

                 if(DmxRxField[4]!=255) //Pregunto si son tiempos cortos o largos
                 {
                    _delay_ms(3.95); //Si el for para el PWM es de 255 => el periodo final serán 255mS
                 }
                 else
                 {
                   _delay_ms(22.0); //Si el for para el PWM es de 255 => el periodo final será 1,02 Seg    
                 }
                }
                
                  
          
             if(DmxRxField[4])  //Si el estrobo está habilitado!
               {
              flag_estrobo ^= 1; //Cambia el estado del flag estrobo, habilita o no destello
               }
             else
               {
               flag_estrobo=1; //Si el estrobo no está habilitado => los leds están siempre funcionando.
                }
             if(flag_estrobo) //El flag estrobo habilita o no el encendido/apagado de LEDS!   
                 {
                   control_maestro_aux=DmxRxField[canal];
                   control_maestro_aux=control_maestro_aux*DmxRxField[3];
                   control_maestro_aux=(control_maestro_aux>>8);
                 
                   if (((unsigned char)(control_maestro_aux)>PWM_timer))        //Cada canal.
                   {
                      PORTB &= ~(1<<canal);                //LED OFF (APAGADO)
                   }else{
                      PORTB |= (1<<canal);                //LED ON  (ENCENDIDO)        
                   }
                 }

                 if(DmxRxField[4]!=255) //Pregunto si son tiempos cortos o largos
                 {
                    _delay_ms(3.95); //Si el for para el PWM es de 255 => el periodo final serán 255mS
                 }
                 else
                 {
                   _delay_ms(22.0); //Si el for para el PWM es de 255 => el periodo final será 1,02 Seg    
                 }

              
             
          
          if(DmxRxField[4])  //Si el estrobo está habilitado!
          {
            flag_estrobo ^= 1; //Cambia el estado del flag estrobo, habilita o no destello
          }
          else
          {
            flag_estrobo=1; //Si el estrobo no está habilitado => los leds están siempre funcionando.
          }
               if(flag_estrobo) //El flag estrobo habilita o no el encendido/apagado de LEDS!   
                 {
                   control_maestro_aux=DmxRxField[canal];
                   control_maestro_aux=control_maestro_aux*DmxRxField[3];
                   control_maestro_aux=(control_maestro_aux>>8);
                 
                   if (((unsigned char)(control_maestro_aux)>PWM_timer))        //Cada canal.
                   {
                      PORTB &= ~(1<<canal);                //LED OFF (APAGADO)
                   }else{
                      PORTB |= (1<<canal);                //LED ON  (ENCENDIDO)        
                   }
                    

                 if(DmxRxField[4]!=255) //Pregunto si son tiempos cortos o largos
                 {
                    _delay_ms(3.95); //Si el for para el PWM es de 255 => el periodo final serán 255mS
                 }
                 else
                 {
                   _delay_ms(22.0); //Si el for para el PWM es de 255 => el periodo final será 1,02 Seg    
                  }
                 }
                
              }
          
             if(DmxRxField[4])  //Si el estrobo está habilitado!
              {
             flag_estrobo ^= 1; //Cambia el estado del flag estrobo, habilita o no destello
              }
            else
             {
            flag_estrobo=1; //Si el estrobo no está habilitado => los leds están siempre funcionando.
             }
 
          if(flag_estrobo) //El flag estrobo habilita o no el encendido/apagado de LEDS!   
                 {
                   control_maestro_aux=DmxRxField[canal];
                   control_maestro_aux=control_maestro_aux*DmxRxField[3];
                   control_maestro_aux=(control_maestro_aux>>8);
                 
                   if (((unsigned char)(control_maestro_aux)>PWM_timer))        //Cada canal.
                   {
                      PORTB &= ~(2<<canal);                //LED OFF (APAGADO)
                   }else{
                      PORTB |= (2<<canal);                //LED ON  (ENCENDIDO)        
                   }
                 }

                 if(DmxRxField[4]!=255) //Pregunto si son tiempos cortos o largos
                 {
                    _delay_ms(3.95); //Si el for para el PWM es de 255 => el periodo final serán 255mS
                 }
                 else
                 {
                   _delay_ms(22.0); //Si el for para el PWM es de 255 => el periodo final será 1,02 Seg    
                 }
              }
              
          }
          
          if(DmxRxField[4])  //Si el estrobo está habilitado!
          {
            flag_estrobo ^= 1; //Cambia el estado del flag estrobo, habilita o no destello
          }
          else
          {
            flag_estrobo=1; //Si el estrobo no está habilitado => los leds están siempre funcionando.
          }
 
         }
EDITO:
cosme me acabo de dar cuenta de algo ., vos cambiaste la definición de los puertos por "(1<<canal)" pero no habría que redefinirlos ???​
 
Última edición:
#26
Es lo mismo, pero si dudás, probalo con el código anterior que te funcionó, el que repetía el mismo código con c/canal, en vez de usar el "for(canal=0; canal<3; canal++)".

Llegado a este punto, lo conveniente es que intentes comprender el funcionamiento de los condicionales if, que se pregunta en c/u y como se desarrolla el flujo del programa. Para eso, tal vez te conviene hacer un diagrama de flujo para facilitar el entendimiento del código:

http://es.wikipedia.org/wiki/Diagrama_de_flujo
 
Arriba