Autor Tema: secuencia de encendido gradual  (Leído 1417 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado lyberocks

  • PIC10
  • *
  • Mensajes: 6
secuencia de encendido gradual
« en: 05 de Junio de 2016, 16:04:19 »

Hola que tal! soy nuevo en esto del ccs y he tenido algunas dudas de como hacer lo siguiente, espero que me puedan ayudar.
Tengo que realizar un encendido de leds de manera gradual hasta que se cumpla una condicion. La condicion es que cuando el voltaje leido (ADC) sea mayor que 3v la secuencia se detenga y deje encendido el led justo donde se ha cumplido, las salidas son 5 (c0,c1,c2,c3,c4), espero me haya explicado.


#include<16f876A.h>
#device adc=10
#use standard_io(C)
#use standard_io(B)
#fuses XT,NOWDT
#use delay(clock=4000000)


int16 lectura;
float voltaje,v;

Void main()
{

while(true){
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);

set_adc_channel(0);
delay_us(20);
lectura=read_adc();  //lectura del canal 0
voltaje=5*lectura/1024.0; //conversion a tensión
delay_ms(100);

 v=voltaje;
   
    if(v<3){
    output_high(pin_c0);
    }
    delay_ms(1000);
   
    v=voltaje;
   
     if(v<3){
    output_low(pin_c0);
    output_high(pin_c1);
    }
    delay_ms(1000);
   
   if(v<3){
    output_low(pin_c1);
    output_high(pin_c2);
    }
    delay_ms(1000);
   
    if(v<3){
    output_low(pin_c2);
    output_high(pin_c3);
    }
    delay_ms(1000);
   
   
    if(v<3){
    output_low(pin_c3);
    output_high(pin_c4);
    }
    delay_ms(1000);
  }
}

he hecho esto pero solo se repite y se apaga todo cuado no se cumple  :x, no se si este correcta la manera en que llamo el voltaje en el programa. La manera en que vario el voltaje es con un pot teniendo  de 0 a 5 v.


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:secuencia de encendido gradual
« Respuesta #1 en: 05 de Junio de 2016, 17:07:37 »
Código: C
  1. int8 salidas[4] = {0b0001,0b0010,0b0100,0b1000};
  2. int8 i=0;
  3.  
  4. void main(void)
  5. {
  6.  
  7.         // Aca el setup de los modulos y no dentro del while
  8.  
  9.         setup_adc_ports(AN0);
  10.         setup_adc(ADC_CLOCK_INTERNAL);
  11.         set_adc_channel(0);
  12.         delay_us(20);
  13.  
  14.         output_C(salidas[i]);
  15.  
  16.         while(true)
  17.         {
  18.  
  19.                 lectura=read_adc();  //lectura del canal 0
  20.  
  21.                 if(lectura<614)              // 614 en la lectura es 5*614 / 1024 = 2.998V
  22.                 {
  23.                         delay_ms(1000);
  24.                         i++;
  25.                         if ( i > 3 )
  26.                         {
  27.                                 i=0;
  28.                         }
  29.                         output_c(salidas[i]);
  30.                 }
  31.         }
  32. }

Aunque no me gusta como queda, ahi seria algo parecido.
Por que no lo paso a voltaje ? por que la division y trbajar con flotantes ocupa demasiadas instrucciones para el micro, a pesar que tenes un delay de 1s, es bueno que comienzes a entenderlo.

Por otro lado, el puerto C va a ser todo salida culpa del output_c, sino tendrias que usar FAST_IO y setear los tris.

Desconectado lyberocks

  • PIC10
  • *
  • Mensajes: 6
Re:secuencia de encendido gradual
« Respuesta #2 en: 05 de Junio de 2016, 17:41:27 »
Agradezco tu respuesta KILLERJC , ahora que veo tu codigo se me ocurrio que ¿que pasaria si necesito hacer un corrimiento del led en dos puertos?. De nuevo muchas gracias y tambien por la informacion acerca de la division y los datos de tipo flotante.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:secuencia de encendido gradual
« Respuesta #3 en: 05 de Junio de 2016, 18:13:51 »
Agradezco tu respuesta KILLERJC , ahora que veo tu codigo se me ocurrio que ¿que pasaria si necesito hacer un corrimiento del led en dos puertos?. De nuevo muchas gracias y tambien por la informacion acerca de la division y los datos de tipo flotante.

Si podes hacer uso del mismo retardo ( delay ) entonces lo pones alli, y usas otra variable para tener la salida del otro puerto. Asi tambien otra variable para el indice del mismo.

Si son 2 delays distintos, pero que pueden funcionar casi juntos, supongamos 250ms y 500ms, solo usas el de 250ms, y cada 2 veces que pasa cambias el que deberia ocurrir con 500ms.

Si ya son 2 delays que no poseen ninguna realacion supongamos 133ms y 233ms , por dar valores, entonces te conviene usar timers uno para cada caso, o podes usar un delay de 1ms, cuando pase 133 veces cambias el primer puerto, y cuando pase 233 veces cambias el otro.

Son opciones a tomar. Pero de todas formas los delays hay que evitarlos lo mayor posible.


 

anything