• Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Victor  222222

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

4 posts neste tópico

#1   Postado (editado)

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

Editado por Victor 222222
esqueci um detalhe

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obg vou tentar fazer essa logica, mas aonde você configurou  os timer?

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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