Ir ao conteúdo
  • Cadastre-se

PIC 18F4520 preciso fazer uma varredura de botões utilizando timer1


Posts recomendados

Preciso fazer uma varredura de botões utilizando timer1  (não pode ser utilizado delay)

O programa tem que começar com o LED2 piscando e quando apertado o botão B1 o LED   começa a piscar e quando e apertado B2 o LED1 e apagado

meu código só ta fazendo com que o LED2 pisque ,segue meu codigo abaixo:

#include <p18f4520.h>     //bibiblioteca do PIC18f4550 
#include <stdio.h>        //bibilioteca  de entradas e saídas
#include <delays.h>
#include <adc.h>
#include <timers.h>       // Low power programming Digital

#pragma config OSC = HS     //Oscilador e cristal 20Mhz
#pragma config PWRT = ON     //Power Up Time Enable 
#pragma config BORV = 1
#pragma config WDT = OFF     //Desabilita o Watchdog Timer
#pragma config PBADEN = OFF  //RB0:RB4 I/O Digital
#pragma config LVP = OFF     //ICSP. Low power programming Digital
#pragma config LPT1OSC = ON

#define B1 PORTBbits.RB0
#define B2 PORTCbits.RC0
#define LED2 LATDbits.LATD2
#define LED1 LATDbits.LATD1

unsigned  char conta_100ms =0,segundo                                                                                                                                                                                                                                          ;
void ISR_alta_prioridade(void); //Protótipo da função de interrupção
#pragma code int_alta=0x08      //Vetor de interrupção de alta prioridade 

void int_alta(void)
{
    _asm goto ISR_alta_prioridade _endasm  //Desvia o programa para a função ISR_alta_prioridade

#pragma code 
#pragma interrupt ISR_alta_prioridade

void ISR_alta_prioridade(void)
{
         if(!B1)
         { 
         conta_100ms;
         LED1 =1;
        }
        else{
            if(!B2){
                 conta_100ms;
                LED1=0;
            }
        }
}            
         
void main(){
TRISA = 0x00;
TRISB = 0x01;
TRISC = 0x01;
TRISD = 0x03;
TRISE = 0x00;
ADCON1 = 0x0F;
    RCONbits.IPEN = 1;
    INTCONbits.GIEH = 1;
    INTCONbits.GIEL = 1;
     OpenTimer1(TIMER_INT_OFF
                 &T1_8BIT_RW
                 &T1_SOURCE_INT
                 &T1_OSC1EN_ON
                 &T1_SYNC_EXT_OFF
                 &T1_PS_1_1);
     PORTD = 0x00;
     PORTE = 0x00;
     Delay10KTCYx(255);     
     
     PIR1bits.TMR1IF = 0;
     IPR1bits.TMR1IP = 1;
     PIE1bits.TMR1IE = 1;
     RCONbits.IPEN = 1;
       INTCONbits.GIEH = 1;
     INTCONbits.GIEL = 1;

while(1){
    
    LED2 = 0;
     conta_100ms;
    LED2 = 1;

}
}    

ALGUEM PODE ME AJUDAR

Link para o comentário
Compartilhar em outros sites

@Victor 222222  Você colocou a varredura dos botões dentro da interrupção, eu tentaria fazer diferente, usaria a interrupção apenas para sinalizar que ela aconteceu e o restante seria dentro do main.

 

Não sei como está funcionando esta sua interrupção nem sei como ela foi configurada, mas a minha lógica seria assim:

 

bool piscou=false;

void ISR_alta_prioridade(void)
{
	piscou=true;
}            

 

daí dentro do main, no laço eterno while, faça o restante:

int piscaLed1=0;

while(1){
  	//checa se houve interrupção
	if(piscou){//caso tenha havido interrupção...
      if(piscaLed1==1){//se o botão foi pressionado...
      	LED1 = 1;	  //acende o led
      }else{//se não foi pressionado...
        LED1 = 0;     //apaga o led 
      }
      
      LED2 = 1;  //acende o led 2
            
      piscou = false;//aguarda nova interrupção
    }else{//se a não houve ou se a interrupção já passou, apaga o led
	  LED1 = 0;  
      LED2 = 0; //apaga o led 2     
    }
  
  	//varre o botão 1
  	if(B1){//se o botao 1 foi pressionado...
      while(B1){}//como não pod usar delay, pode usar esta trava para evitar que o botão seja apertado repetitivamente
      piscaLed1=1;//autoriza o led1 a pescar
    }
  
  	//varre o botão 2
  	if(B2){//se o botão 2 foi pressionado...
      while(B1){}//como não pod usar delay, pode usar esta trava para evitar que o botão seja apertado repetitivamente
      piscaLed1=0;//proíbe o led1 de piscar
    }
}

Não sei se está correto, fiz de cabeça, podem haver erros, mas lógica seria essa.

Link para o comentário
Compartilhar em outros sites

@Victor 222222 Na verdade eu não configurei nada, neste exemplo que te dei apenas mostrei a lógica, neste caso estou pressupondo que todas as configurações já estão corretas inclusive essa sua rotina de interrupção:

 

ISR_alta_prioridade(void) { piscou=true; }

 

Pois a velocidade (frequência ) das piscadas vai depender disso.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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...