Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

02/05/2015 #21

Avatar de locodelafonola

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"
Código 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
Código PHP:
_delay_ms(4); //Si el for para el PWM es de 255 => el periodo final será 1,02 Seg 
o aca
Código PHP:
_delay_ms(1); //Si el for para el PWM es de 255 => el periodo final serán 255mS 
02/05/2015 #22

Avatar de cosmefulanito04

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.
02/05/2015 #23

Avatar de locodelafonola

bueno cosme
cosmefulanito04 dijo: Ver Mensaje
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
Código PHP:
 while(1)                                   
        {
        
get_dips();
         
          
//-------------------- PWM LED
          
for (PWM_timer=0PWM_timer<255 PWM_timer++) // Loop del timer aplicado al bucle while
          
{                                                                                                                        
              for(
canal=0canal<3canal++) //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
Código 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=0PWM_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
            
}
 
        }
      }

02/05/2015 #24

Avatar de cosmefulanito04

Verificá el mensaje que pusé, que en su momento corregí el if. Se complica escribir código en el foro y se me pasó.
02/05/2015 #25

Avatar de locodelafonola

Bueno
cosmefulanito04 dijo: Ver Mensaje
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
Código PHP:
while(1)                                   
        {
        
get_dips();
         
          
//-------------------- PWM LED
          
for (PWM_timer=0PWM_timer<255 PWM_timer++) // Loop del timer aplicado al bucle while
          
{                                                                                                                        
              for(
canal=0canal<3canal++) //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 ???
02/05/2015 #26

Avatar de cosmefulanito04

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
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.