Autor Tema: Contador ascendente y descendente ayuda!  (Leído 5298 veces)

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

Desconectado lyberocks

  • PIC10
  • *
  • Mensajes: 6
Contador ascendente y descendente ayuda!
« en: 26 de Junio de 2016, 00:21:09 »
Hola amigos, anteriormente los habia consultado para algo parecido pero no he encontrado la solucion a mi problema.
plantendo de una manera distinta mi duda es la siguiente. Quiero hacer un conteo ascendente y descendente e ir recorriendo 5 leds. Eso ya lo he hecho pero lo que no puedo hacer es como detener la cuenta justo cuando se cumple la condicion  y comenzar a decrementarla, osea

si el v>3 recorre led hacia abajo
si el v<3 cuenta hacia arriba

El voltaje yo lo vario manualmente con un pot a la entrada del ADC.


este es parte del codigo q implemento para ir recorriendo el led:
 
cont=1;
   for(x=1;x<=5;x++){
    output_c(cont);
    delay_ms(500);
    cont=cont*2; 
   }

entonces lo que haria seria:empieza a recorrer el led desde la primera posicion hasta la 5ta con voltaje<3 y asi se repetira, si despues lee el adc Voltaje>3 detiene la secuencia ahora comenzaria a ir para abajo. Ojala me puedan ayudar, estoy empezando con ccs y ya llevo varios dias sin resolverlo. Gracias amigos!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contador ascendente y descendente ayuda!
« Respuesta #1 en: 26 de Junio de 2016, 01:32:03 »
Hay varias formas de hacerlo, pero creo que Esta podria ser la mas simple y general para lo que quieras hacer.

Código: C
  1. int8 Salida[5] = {0b00001,0b00010,0b00100,0b01000,0b10000};
  2. int8 Indice;
  3.  
  4.  
  5. void main(void)
  6. {
  7.  
  8.         //Aca configurar el ADC y seleccionar el canal
  9.  
  10.  
  11.         while(1)
  12.         {
  13.                 if(read_adc()<512)
  14.                 {
  15.                         Indice++;
  16.                         if(Indice>4) Indice=0;
  17.                 }
  18.                 else
  19.                 {
  20.                         if(Indice == 0) Indice=5;
  21.                         Indice--;
  22.                 }
  23.                 output_c(Salida[Indice]);
  24.                 delay_ms(500);
  25.         }
  26. }

El if solo controla el indice del array, esto te puede permitir cambiar cuando quieras el valor de la secuencia sin ningun problema.
La instruccion de Salida y delay es igual para todos. Y utilizo el read_adc para poder leer el valor del ADC, si este es de 10bits, entonces son 1024 posiblidades, o mejro dicho de 0 a 1023.
Te faltaria el codigo para el setup del ADC, yo no uso CCS, asi que ahi no te puedo ayudar.

Desconectado lyberocks

  • PIC10
  • *
  • Mensajes: 6
Re:Contador ascendente y descendente ayuda!
« Respuesta #2 en: 26 de Junio de 2016, 02:07:24 »
Gracias KILLERJC me has ayudado bastante, y esque es un proyecto el cual compartire cuando haya quedado, el pic que estoy utilizando es el PIC16f876a, el cual dispone de 3 puertos los cuales de los cuales me gustaria usar 16 de sus salidas en vez de las 5 con las que me has apoyado en el codigo que me proporcionaste, como haria la modificacion porder aprocharlos?

Hay varias formas de hacerlo, pero creo que Esta podria ser la mas simple y general para lo que quieras hacer.

Código: C
  1. int8 Salida[5] = {0b00001,0b00010,0b00100,0b01000,0b10000};
  2. int8 Indice;
  3.  
  4.  
  5. void main(void)
  6. {
  7.  
  8.         //Aca configurar el ADC y seleccionar el canal
  9.  
  10.  
  11.         while(1)
  12.         {
  13.                 if(read_adc()<512)
  14.                 {
  15.                         Indice++;
  16.                         if(Indice>4) Indice=0;
  17.                 }
  18.                 else
  19.                 {
  20.                         if(Indice == 0) Indice=5;
  21.                         Indice--;
  22.                 }
  23.                 output_c(Salida[Indice]);
  24.                 delay_ms(500);
  25.         }
  26. }

El if solo controla el indice del array, esto te puede permitir cambiar cuando quieras el valor de la secuencia sin ningun problema.
La instruccion de Salida y delay es igual para todos. Y utilizo el read_adc para poder leer el valor del ADC, si este es de 10bits, entonces son 1024 posiblidades, o mejro dicho de 0 a 1023.
Te faltaria el codigo para el setup del ADC, yo no uso CCS, asi que ahi no te puedo ayudar.
« Última modificación: 26 de Junio de 2016, 02:24:35 por lyberocks »

Desconectado lyberocks

  • PIC10
  • *
  • Mensajes: 6
Re:Contador ascendente y descendente ayuda!
« Respuesta #3 en: 26 de Junio de 2016, 23:57:10 »
#include<16f876A.h>
#device adc=10

« Última modificación: 26 de Julio de 2016, 14:06:44 por lyberocks »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contador ascendente y descendente ayuda!
« Respuesta #4 en: 27 de Junio de 2016, 08:43:29 »
Bien pero el A1 pertenece a otro puerto, hacer ouput_c() solo cambia el puerto C. Ademas es todo 8 bits

Código: C
  1. #include<16f876A.h>
  2. #device adc=10
  3. #use standard_io(C)
  4. #use standard_io(A)
  5. #fuses XT,NOWDT
  6. #use delay(clock=4000000)
  7.  
  8.  
  9. int16 lectura;
  10. int8 cont;
  11. int8 salida[9] = {0b00000001,0b00000010,0b00000100,0b00001000,0b00010000,0b00100000,0b01000000,0b10000000};
  12.  
  13.  
  14. void main(void)
  15. {
  16.  
  17.         setup_adc_ports(AN0);
  18.         setup_adc(ADC_CLOCK_INTERNAL);
  19.         set_adc_channel(0);
  20.         delay_us(20);
  21.  
  22.    
  23.         while(true)
  24.         {
  25.                 lectura=read_adc();  //lectura del canal 0
  26.            
  27.                 if(lectura<500)
  28.                 {
  29.                         cont++;
  30.                         if(cont>8) cont=0;
  31.                 }
  32.                 else
  33.                 {
  34.                         if(cont==0) cont=9;
  35.                         cont--;
  36.                 }  
  37.            
  38.                 if(contador<8)
  39.                 {
  40.                         output_c(salida[cont]);
  41.                 }
  42.                 else
  43.                 {
  44.                         output_a(0b10);
  45.                 }
  46.                 delay_ms(500);
  47.         }
  48. }

Desconectado lyberocks

  • PIC10
  • *
  • Mensajes: 6
Re:Contador ascendente y descendente ayuda!
« Respuesta #5 en: 27 de Junio de 2016, 21:36:50 »

Gracias KILLERRJ he conseguido que haga el corrimiento en todo los 9 bits aunque   hice algo para que no dejara encendido algunos leds en la secuencia, pues funciona, se que no es la manera correcta de implementar pero seguire con esto para mejorar y en algun momento poder colaborar, te agradezco y bueno pongo la pequeña modificacion en el codigo:

 
   if(lectura<500)
     {
          cont++;
          if(cont>8) cont=0;
     }
    else
     {
         if(cont==0) cont=9;
         cont--;
     }   
     
   
                   if(cont<8)
                {
                        output_c(salida[cont]);
                        output_low(pin_a1);
                }
                else
                {
                        output_high(pin_a1);
                        output_low(pin_c7);
                        output_low(pin_c0);
                }
   
    delay_ms(500);
     }
   
 



Bien pero el A1 pertenece a otro puerto, hacer ouput_c() solo cambia el puerto C. Ademas es todo 8 bits

Código: C
  1. #include<16f876A.h>
  2. #device adc=10
  3. #use standard_io(C)
  4. #use standard_io(A)
  5. #fuses XT,NOWDT
  6. #use delay(clock=4000000)
  7.  
  8.  
  9. int16 lectura;
  10. int8 cont;
  11. int8 salida[9] = {0b00000001,0b00000010,0b00000100,0b00001000,0b00010000,0b00100000,0b01000000,0b10000000};
  12.  
  13.  
  14. void main(void)
  15. {
  16.  
  17.         setup_adc_ports(AN0);
  18.         setup_adc(ADC_CLOCK_INTERNAL);
  19.         set_adc_channel(0);
  20.         delay_us(20);
  21.  
  22.    
  23.         while(true)
  24.         {
  25.                 lectura=read_adc();  //lectura del canal 0
  26.            
  27.                 if(lectura<500)
  28.                 {
  29.                         cont++;
  30.                         if(cont>8) cont=0;
  31.                 }
  32.                 else
  33.                 {
  34.                         if(cont==0) cont=9;
  35.                         cont--;
  36.                 }  
  37.            
  38.                 if(contador<8)
  39.                 {
  40.                         output_c(salida[cont]);
  41.                 }
  42.                 else
  43.                 {
  44.                         output_a(0b10);
  45.                 }
  46.                 delay_ms(500);
  47.         }
  48. }

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Contador ascendente y descendente ayuda!
« Respuesta #6 en: 04 de Julio de 2016, 10:56:13 »
Hola. Metiendome solo en el contador, mentalmente  esto es lo que me sale
Código: [Seleccionar]
//f(nº a incrementar,llegada a total,devolver)
f(1,500,0);
f(-1,-10,-9);

signed int8 f(signed incre,int16 signed total,signed fin){
signed co;
if(incre>0){//incremento
for(co=0;total>co;co+=incre){
......//lo que sea
delay_ms(500);
}
} else { //decremento
for(co=0;total<co;co+=incre){
delay_ms(500);
}
return fin;
}
No lo e probado el incremento 0 es erroneo y puede ser total>= en vez de total> pero me da que funcionaria