TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Hansot en 19 de Septiembre de 2014, 22:16:20

Título: Ayuda con un contador (del 0 al 9)
Publicado por: Hansot en 19 de Septiembre de 2014, 22:16:20
Quiero hacer una banda transportadora utilizando el micro controlador 16F84A y motores a pasos y al final de la banda me gustaría poner un sensor infrarrojo, de tal modo que cuando un objeto llegue al final obstruya la linea de visión del sensor, entonces un display de 7 segmentos va haciendo la cuenta de los objetos que pasan.
Pero no tengo idea de como hacer la programación de dicha precúspide.

(http://i.imgur.com/AE4fhqg.png)

En ese diagrama el motor de corriente directa abre una especie de puerta que deja caer los objetos, el motor paso a paso es el encargado de mover la banda y el display lleva la cuenta de los objetos que pasan por la banda (solo necesito ayuda con la programación del contador).

Perdonen mi ignorancia  :( solo soy una simple estudiante de 15 años... Gracias por la ayuda!!  :g)
Título: Re: Ayuda con un contador (del 0 al 9)
Publicado por: AngelGris en 20 de Septiembre de 2014, 08:52:05
  Perdón pero no parece que estés buscando ayuda, más bien parece que buscas que te hagan el programa.

  Hay varios ejemplos de contadores en el foro.
Título: Re: Ayuda con un contador (del 0 al 9)
Publicado por: allennet en 20 de Septiembre de 2014, 13:48:35
si muestras el avance que has logrado te podemos ayudar
Título: Re: Ayuda con un contador (del 0 al 9)
Publicado por: Hansot en 20 de Septiembre de 2014, 17:13:38
Este es el contador del 0 al 9, ya lo simule y parece que esta bien

Código: [Seleccionar]
#include <16F84A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)

#byte PORTA=5
#byte PORTB=6

void main()
{

set_tris_A(0xff);      // Puerto A como entradas
set_tris_B(0b00);      // Puerto B como salidas
portb=0b00;            // Puerto B puesto en cero
                      
      
          int i;
          i=0;
        
          do{
          do{
          }
          while (bit_test(PORTA,0));
          
          (bit_clear(PORTB,3));
          (bit_set(PORTB,0));          
          delay_ms(2000);
          
          i=i+1;
          
          do{
          }
          while (bit_test(PORTA,0));
          
          (bit_clear(PORTB,0));
          (bit_set(PORTB,1));
          delay_ms(2000);
          
          i=i+1;
          
          do{
          }
          while (bit_test(PORTA,0));
          
          
          (bit_set(PORTB,0));
          delay_ms(2000);
          
          i=i+1;
          

          do{
          }
          while (bit_test(PORTA,0));
          
          (bit_clear(PORTB,0));
          (bit_clear(PORTB,1));
          (bit_set(PORTB,2));
          delay_ms(2000);
          
          i=i+1;
          
          do{
          }
          while (bit_test(PORTA,0));
          

          (bit_set(PORTB,0));
          delay_ms(2000);
          
          i=i+1;
          
          do{
          }
          while (bit_test(PORTA,0));
          
          (bit_clear(PORTB,0));
          (bit_set(PORTB,1));
          delay_ms(2000);
          
          i=i+1;
          
          do{
          }
          while (bit_test(PORTA,0));
          

          (bit_set(PORTB,0));
          delay_ms(2000);
          
          i=i+1;
          
          do{
          }
          while (bit_test(PORTA,0));
          
          (bit_clear(PORTB,0));
          (bit_clear(PORTB,1));
          (bit_clear(PORTB,2));
          (bit_set(PORTB,3));
          delay_ms(2000);
          
          i=i+1;
          
          do{
          }
          while (bit_test(PORTA,0));
          
          (bit_set(PORTB,0));
          delay_ms(2000);
          
          i=i+1;
          }
          while (i<=9);
          
          }

Hay alguna manera mas simple de hacerlo?

Por cierto cuando simulo el movimiento de la banda transportadora en proteus hay un punto donde se queda "congelado" y después de unos 15 segundos sigue con el funcionamiento ¿Alguien sabe por que?
Título: Re: Ayuda con un contador (del 0 al 9)
Publicado por: donvalles en 23 de Septiembre de 2014, 00:25:58
Código: C++
  1. #include <16F84A.h>
  2.  
  3. #FUSES NOWDT                    //No Watch Dog Timer
  4. #FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
  5. #FUSES NOPUT                    //No Power Up Timer
  6. #FUSES NOPROTECT                //Code not protected from reading
  7.  
  8. #use delay(clock=4000000)
  9.  
  10. #USE FAST_IO (all)
  11.  
  12. void main()
  13. {
  14.    int8 i=0;
  15.    
  16.    set_tris_A(0xFF);      // Puerto A como entradas
  17.    set_tris_B(0x00);      // Puerto B como salidas
  18.                        
  19.    output_b(0x00);        //imprimo cero en display
  20.    
  21.    while(true)
  22.    {
  23.       while(!input(PIN_A0)); // mientras pin es cero queda en el bucle
  24.       if(i==9)
  25.          {
  26.             i=0;
  27.             output_b(i);        //imprimo cero en display  
  28.          }else  output_b(i++);        //imprimo en display contador de 1 a 9
  29.        
  30.    }
  31. }