Autor Tema: sensor de caida (cronómetro (16f877a))  (Leído 1420 veces)

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

Desconectado daniel_908

  • PIC10
  • *
  • Mensajes: 11
sensor de caida (cronómetro (16f877a))
« en: 22 de Noviembre de 2015, 17:23:50 »
buenas tardes estimados

estoy programando un sensor de caida libre (cronómetro) en pic c compiler, tengo dos pulsadores que simulan sensores de movimiento, el detalle es que no logro hacer que se pause por ejemplo: el pusador de RA4 simula el sensor de inicio. Cuando le arrojo el 1 lógico empieza a contar hasta que el pulsador rb7 se active, no logro hacer que se pause y reinicie.

aquí dejo el código:

Código: [Seleccionar]
#include <16f877a.h>
#fuses HS
#use delay(clock=20M)
#byte portb=0x06
#byte porta=0x05
int8 display[10]={63,6,91,79,102,109,125,7,127,103};

int8 unid,dec,cent,mil;







void main()
{
  set_tris_b(0x00);
  set_tris_a(0x00);
 

 
  output_b(display[0]);
  output_a(0b00);
 
      while(1)
           
        {
                         
        if(bit_test(porta,4)==1)
         {
       
            while(1)
             {   
           
              {for(mil=0;mil<10;mil++)
                     {  mil:
                        for(cent=0;cent<10;cent++)   
                            { centena:
                               for(dec=0;dec<10;dec++)
                                {
                                   decena:
                                   for(unid=0;unid<10;unid++)
                                   {
                                   unidad:
                                       for(int8 tiempo=0;tiempo<4;tiempo++)
                                     {           
                                                   
                                         output_a(0b01);
                                         output_b(display[unid]);
                                         delay_us(450);       
                                         output_a(0b10);
                                         output_b(display[dec]);
                                         delay_us(450);
                                         output_a(0b100);
                                         output_b(display[cent]);
                                         delay_us(450);
                                         output_a(0b1000);
                                         output_b(display[mil]);
                                         delay_us(450);
                                   
                                     
                                   } //for 5
                                       if(bit_test(portb,7)==1)
                                       {
                                       goto unidad;
                                       delay_ms(5000);
                                        break;
                                       
                                       }
                                   
                                   } // For 4
                                   
                                   if(bit_test(portb,7)==1)
                                   {
                                   
                                   goto decena;
                                   delay_ms(5000);
                                   break;
                                   
                                   }
                                   
                               }// For 3
                               
                               if(bit_test(portb,7)==1)
                               {
                              goto centena;
                              delay_ms(5000);
                               break;
                             
                               }
                               
                   
                             } // For 2
                             
                            if(bit_test(portb,7)==1)
                              {
                                goto mil;
                                delay_ms(5000);
                             break;
                             
                              }
                             
                             
                          } //For 1 
                         
                       
                       
                        } //if 1     
                         
 
 
                      } //While2
                     
                 
                     
                 } //if0
                 
         
         
         
         
            } //While
           
         
         } //void

aquí una imagen en proteus:

* cronómetro.png
(29.12 kB, 827x578 - visto 355 veces)


espero puedan ayudarme

saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:sensor de caida (cronómetro (16f877a))
« Respuesta #1 en: 22 de Noviembre de 2015, 17:28:40 »
Tenes que usar interrupciones, con delays no va a haber forma que obtengas un buen valor.

Podrias usar el modulo CCP el cual mediria el tiempo, y conectas los 2 "sensores" al pin de entrada del CCP.

La otra es un timer + usar Rb0 y el mismo objetivo, . En fin todas interrupciones queda en vos averiguar como funcionan los modulos y que prvecho le podes sacar, ademas de buscar como se programa una interrupcion y se habilita.

Desconectado daniel_908

  • PIC10
  • *
  • Mensajes: 11
Re:sensor de caida (cronómetro (16f877a))
« Respuesta #2 en: 22 de Noviembre de 2015, 19:08:32 »
Tenes que usar interrupciones, con delays no va a haber forma que obtengas un buen valor.

Podrias usar el modulo CCP el cual mediria el tiempo, y conectas los 2 "sensores" al pin de entrada del CCP.

La otra es un timer + usar Rb0 y el mismo objetivo, . En fin todas interrupciones queda en vos averiguar como funcionan los modulos y que prvecho le podes sacar, ademas de buscar como se programa una interrupcion y se habilita.

lo intentaré, gracias por las pistas! haha  :)