Autor Tema: Contador en pic 16f84a  (Leído 1808 veces)

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

Desconectado Viju7

  • PIC10
  • *
  • Mensajes: 4
Contador en pic 16f84a
« en: 13 de Abril de 2015, 08:39:42 »
Hola, tengo que realizar una práctica de que RA1 simula un sensor y cuando pasan 10 objetos desactiva rb0 y acativa RB1. No sé como hacer para que cuente esas 10 veces, esas 10 veces tiene que ser mediante flancos con un interrupor, es decir tengo que subir y bajar el intrerruptor 10 veces. Tengo esto echo pero sólo me van los dos primeros pasos. Ayuda por favor.

#include <16F84a.h>
#byte port_a=5
#byte port_b=6
#fuses XT
#use delay(clock=4000000)

int contador=0;

main()
{
set_tris_a (0b00001111);
set_tris_b (0b00000000);
output_b(0);

while(1)
{
while(!input(PIN_A0));
while(input(PIN_A0));
output_high(PIN_B1);

while(!input(PIN_A2));
while(input(PIN_A2));
{
output_high(PIN_B0);
output_low(PIN_B1);
}
while(!input(PIN_A1));
while(input(PIN_A1));
{
{contador ++;}
delay_ms(500);
}
if (contador==10)
{
output_high(PIN_B2);
output_low(PIN_B0);
contador=0;
}
}
}
« Última modificación: 13 de Abril de 2015, 08:44:26 por Viju7 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Contador en pic 16f84a
« Respuesta #1 en: 13 de Abril de 2015, 11:21:33 »
demasiados while por lo que veo...

Tambien como no entendi sobre lo de "me van los dos primeros pasos" me refiero a que no se cuales son los pasos. puse 2 opciones como salidas, vos elegiras cuales queres, ahi esta explicado en el comentario que hace cada una.

while(1)
{
   if (input(PIN_A1))
   {                                       // Aca entra si detecto algo
          while(input(PIN_A1));   // No cuenta hasta que la señal desaparece ( o paso el objeto )
          contador++;
   }
   if (contador==10)
   {
          // 1era opcion pasa por todo el portB, deberias poner a 1 PORTB0 al comienzo, explicacion en el comment

          if (input(PIN_B7))
          {
                output_high(PIN_B0);
                output_low(PIN_B7);
          }
          else
          {
                output_b(PORTB < 1);         // Esto es si cada 10 se deben activar las salidas de la forma -> RB0 RB1 RB2 RB3 RB4 RB5 hasta RB7 y de vuelta al comienzo, sino usa las otras opciones
          }
           

           // 2da opcion Alternar B0 y B1 cada 10 objetos
          output_toggle(PIN_B0);
          output_toggle(PIN_B1);

          contador=0;

   }
}

Desconectado Viju7

  • PIC10
  • *
  • Mensajes: 4
Re: Contador en pic 16f84a
« Respuesta #2 en: 14 de Abril de 2015, 04:41:49 »
Gracias @KILLERJC pero aún no me va :? con lo de los dos primeros pasos me refiero a las dos primeras ordenes de flancos, las de while, lo que no me va es lo del contador ya que no sé introducirlo. Lo que tiene que hacer el contador es contar uno cada vez que el interruptor esté a 1 osea, pongo el interruptor a 1 entonce cuenta1, lo pongo a 0 ylo vuelvo a poner a uno y cuenta 2. Un saludo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Contador en pic 16f84a
« Respuesta #3 en: 14 de Abril de 2015, 05:04:23 »
es lo que hace esto:


Código: C
  1. if (input(PIN_A1))
  2.    {                                       // Aca entra si detecto algo
  3.           while(input(PIN_A1));   // No cuenta hasta que la señal desaparece ( o paso el objeto )
  4.           contador++;
  5.    }

Si esta en 1 entra.. y luego se queda esperando en el while hasta que se haga 0 (es decir la entrada se haga 0), cuando se hace cero recien ahi suma 1 y sale del if, no vuelve a entrar hasta que se presione nuevamente A1.
En realidad aqui estarias contando el flanco descendente, pero si cambias de orden el while y contador++ , lo harias en ascendente. pero no cambia nada. Ya que para tener un descendente tenes que tener un ascendente si o si.

Ascendente:
Código: C
  1. if (input(PIN_A1))
  2.    {                                       // Aca entra si detecto algo
  3.           contador++;
  4.           while(input(PIN_A1));   //Suma pero no sale hasta que se suelte el boton.
  5.    }
Asi que la cuenta deberia estar bien. Lo unico que puede pasar es que no tengas un antirebote y cuente varias veces debido a los rebotes, pero le agregas un delay y se soluciona.

Ascendente y con delay por si existe algun rebote y hace que cuente mas de 1 cuando lo presionas.
Código: C
  1. if (input(PIN_A1))
  2.    {    
  3.           delay_ms(20);                                  // Aca entra si detecto algo
  4.           contador++;
  5.           while(input(PIN_A1));   // Cuenta 1 pero no sale hasta que se suelte el boton
  6.    }

Citar
lo que no me va es lo del contador ya que no sé introducirlo

A que te referis con que no te va lo del contador?, introducirlo donde ?. Cuenta bien ? suma bien? o suma de a muchos valores por cada ves que presionas ?.
Lo estas simulando? Lo estas probando en fisico ?

Te pregunto para intentar comprender tu problema. Ya que no se cual es exactamente, que es lo que funciona mal ?, que hace el micro?

Lo que yo entendi es: Cuenta 10 pulsos ( flanco ascendente o descendente ) y luego activa RB1 y desactiva RB0, luego vuelve a contar 10 y que sucede ? o hay que resetearlo ? para que comienze todo de vuelta?
« Última modificación: 14 de Abril de 2015, 07:05:28 por KILLERJC »

Desconectado Viju7

  • PIC10
  • *
  • Mensajes: 4
Re: Contador en pic 16f84a
« Respuesta #4 en: 14 de Abril de 2015, 07:57:33 »
necesito unprograma que haga:

1º- cuando RA0 es 1, RB1 es 1
2º- Cuando RA2 es 1, RB1 es 0 y RB0 es 1.
3º- Cuando se activa RA1 10 veces RB0 es 0 y RB2 es 1.

los dos primeros pasos ya me salen pero el contador hasta 10 no.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Contador en pic 16f84a
« Respuesta #5 en: 14 de Abril de 2015, 08:07:19 »
Esto deberia hacerlo todo. Lo unico que se obserba que RB1 y RB2 jamas se ponen a 0, al menos no en la explicacion que me diste. asi que verias alternar solo RB0 al presionar 10 veces el boton ( cuando lo haces por segunda ves en adelante )

Código: C
  1. // Aca configuracion de puertos
  2.  
  3. int contador=0;
  4.  
  5. while(1)
  6. {
  7.  
  8.   if (input(PIN_A1))
  9.    {    
  10.           delay_ms(50);                                  // Aca entra si detecto algo
  11.           contador++;
  12.           if(contador==10)
  13.           {
  14.                 output_low(PIN_B0);
  15.                 output_high(PIN_B2);
  16.                 contador=0;
  17.           }
  18.           while(input(PIN_A1));   // Cuenta 1 pero no sale hasta que se suelte el boton
  19.    }
  20.  
  21.   if (input(PIN_A2))
  22.    {    
  23.           output_low(PIN_B0);
  24.           output_high(PIN_B1);
  25.    }
  26.  
  27.   if (input(PIN_A0))
  28.    {    
  29.           output_high(PIN_B1);
  30.    }
  31.  
  32. }
« Última modificación: 14 de Abril de 2015, 08:13:22 por KILLERJC »