Ir ao conteúdo
  • Cadastre-se

PIC Bloqueador Temporizador usando Pic12F675


Posts recomendados

Pessoal queria uma ajuda de vocês..

 

Estou com um projeto de um circuito bloqueador temporizado veicular usando um Pic 12F675, que eu queria montar..

 

Eu sou um pouco leigo com microcontroladores, conheço o básico do básico mesmo..

 

Montei o circuito e simulei no Proteus e esta funcionando direito, só que queria incrementar o código dele, ele tem um botão que quando apertado ele para a contagem do temporizador. queria saber se consigo fazer um outra função nesse mesmo botão que ao ser pressionado por cerca de 5 segundos ele desativasse o circuito e ou ser pressionado novamente ela ativasse o circuito..

 

Eu tenho o Código, só queria incrementar ele..

 

Se alguém puder me ajudar

 

/*******************************************************************************

    BLOQUEDOR VEICULAR TEMPORIZADO (ANTI-FURTO)
    
    
    C/ PIC 12F675


    *******************************************************************************/
//OPÇÃO DO USUÁRIO:
//Defina abaixo o tempo de temporização desejado:

  #define VALOR_MIN   1  // 2 MINUTOS
  #define VALOR_SEG   00  // 15 SEGUNDOS


/******************************************************************************/

#include <12F675.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,INTRC_IO, NOCPD, NOPROTECT, NOMCLR, PUT, BROWNOUT
#ROM  0X2100 = {VALOR_MIN,VALOR_SEG ,0,0}//MIN,SEG,DISP,BLOQ

#byte  tmr0   = 0x01
#byte  gpio   = 0x05
#byte  trisio = 0x85
#byte  intcon = 0x0b
#byte  option_reg = 0x81


#bit   sw_desbloqueia  =  0x05.3 // pino 4
#bit   sw_temp =  0x05.1 // pino 6
#bit   rele   =  0x05.4 // pino 3
#bit   led    =  0x05.5 // pino 2
#bit   gie    =  0x0b.7 // geral das interrupções
#bit   t0ie    =  0x0b.5 //liga interrupção do timer 0
#bit   t0if    =  0x0b.2 //flag de over flow do timer0

//enderelos na EEprom Interna do PIC
#define  BLOQ     3
#define  DISP     2
#define  END_MIN  0
#define  END_SEG  1
/******************************************************************************/

//variaveis globais
  unsigned int8   pisca=0;
  unsigned int1 f_pisca;
  unsigned segundos;
  unsigned minutos;

/******************************************************************************
                     Interrupção do Timer 0
 ******************************************************************************/
#int_timer0
void isr_tmr0(){
 static unsigned int32 cnt32=0;

 //interrupção a cada 65536 useg
//gera 1 segundos com metodo de acumulo de erro

 #define FATOR  65536
 #define F_XTAL 1000000 // para xtal 4Mhz 20ppm   (freq/4)

   cnt32+=FATOR ;
   if(cnt32>=F_XTAL){
       cnt32-= F_XTAL;
       
       if(--segundos==0xff){
        segundos=59;
        if( minutos>0){
         minutos--;
        }
       }

       if(!minutos && !segundos){
        rele=0;
        f_pisca=1; //pisca led
        write_eeprom(DISP,0);//sai do modo disparado
        write_eeprom(BLOQ,1); //entra em modo bloqueado
        disable_interrupts(int_timer0);//para a contagem de tempo
       }
  }
  // t0if = 0;  // apaga flag de over flow do Timer1 (redundância no CCS C)
 }
/******************************************************************************
                     Rotina Main
 ******************************************************************************/
void main() {

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
   setup_timer_1(T1_DISABLED);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   trisio=0b001010;
   gpio=0;
   t0ie=0;
   gie=1;


   if(read_eeprom(BLOQ)){// estava bloqueado
       f_pisca=1;//liga o pisca do led
       pisca=0;
       disable_interrupts(int_timer0);
       rele=0;//desliga rele
       //
       }
       else{//se não estava
          rele=1;//liga rele
          f_pisca=0;//desliga piscadas do led
          led=1;//acende led
          pisca=0;
       }



     if(read_eeprom(DISP)){//estava disparado

          minutos=read_eeprom(END_MIN);// carrega valor de tempo
          segundos= read_eeprom(END_SEG);//idem
          
          if(segundos>=15){
               segundos-=15;//subtrai 15 segundos a cada reset
               write_eeprom(END_SEG,segundos);
               enable_interrupts(int_timer0);
               gie=1;
               led=0;
               }
          else{
            if(minutos){
                  minutos--;
                  segundos=45;
                  
                  write_eeprom(END_SEG,segundos);//salva novo valor na EEprom
                  write_eeprom(END_MIN,minutos);//idem
                  enable_interrupts(int_timer0);//habilita interrupção do timer0
                  gie=1;//liga geral
                  led=0;
                  }
            else{
              disable_interrupts(int_timer0);
              write_eeprom(BLOQ,1);//bloqueia
              write_eeprom(DISP,0);//sai do modo disparado
              f_pisca=1;//liga o pisca do led
              pisca=0;
              rele=0;
            }
         }
     }
 /******************************************************************************
                     Laço Principal
 ******************************************************************************/
   for(;;){
   #define VALOR_FREQ_PISCA 4  // aprox. 2 Hz

      if(!sw_desbloqueia){//se interruptor secreto foi acionado para liberar
          disable_interrupts(int_timer0);
          rele=1;
          f_pisca=0;//desliga piscadas do led
          led=1;
          pisca=0;
          if((read_eeprom(BLOQ))||(read_eeprom(DISP))){
            write_eeprom(DISP,0);//sai da condição de disparo
            write_eeprom(BLOQ,0);//sai da condição de bloqueio
            write_eeprom(END_MIN,VALOR_MIN);//recupera valor original de minutos
            write_eeprom(END_SEG,VALOR_SEG);//recupera valor original de segundos
            segundos=VALOR_SEG;
            minutos=VALOR_MIN;
        }
      }

      if(sw_desbloqueia == 0){//se interruptor secreto foi acionado para liberar
          disable_interrupts(int_timer0);
          rele=1;
          f_pisca=0;//desliga piscadas do led
          led=1;
          pisca=0;
          if((read_eeprom(BLOQ))||(read_eeprom(DISP))){
            write_eeprom(DISP,0);//sai da condição de disparo
            write_eeprom(BLOQ,0);//sai da condição de bloqueio
            write_eeprom(END_MIN,VALOR_MIN);//recupera valor original de minutos
            write_eeprom(END_SEG,VALOR_SEG);//recupera valor original de segundos
            segundos=VALOR_SEG;
            minutos=VALOR_MIN;
        }
      }

      if(!sw_temp){//dispara se porta do motorista foi aberta (ou acionado botão secreto)
         if(!read_eeprom(DISP)&& !read_eeprom(BLOQ)){
           led=0;
           write_eeprom(DISP,1);//entra na condição de disparado
          // segundos=0;
          // minutos=0;
           enable_interrupts(int_timer0);//contando tempo pelo timer 0
           gie=1;
         }
      }


      if(f_pisca){  //pisca se veiculo estiver bloqueado
           if(t0if){
             t0if=0;
             pisca++;
             if(pisca>=VALOR_FREQ_PISCA){led=!led; pisca=0;}
           }
       }
   }//for(;;)
}//main()

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...