Ir ao conteúdo

Posts recomendados

Postado

Boa tarde, estou fazendo um projeto para faculdade, utilizando um PIC18F4520, estou programando pelo Mikroc pro for pic, preciso fazer uma coisa simples que é saber por quanto tempo segurei um botão para poder resetar um contador, no Arduino usa a função milis, e no mikroc pro achei uma biblioteca que pode fazer tal função porém não consigo entender e quando tento dar include nela no programa da erro, link da biblioteca: https://download.mikroe.com/documents/compilers/mikroc/pic/help/time_library.htm

Tem um exemplo no final que eu simplesmente copiei e colei no programa para testar e ver como funciona, porém  da erro logo no include.

Agradeço desde ja qualquer ajuda.

Postado

@Fabio Munhoz ,

 

Me parece que você quer usar um canhão para matar uma formiguinha ....

 

Existem Timers justamente para esse tipo de necessidade .... quando o botão for apertado você dispara o Timer, e quando o botão for solto voce pára o Timer, pega o valor dele, faz as contas para obter o tempo, e então zera o timer novamente...

 

Mas, do mesmo jeito que no Arduíno,

tem de usar algum tipo de Debouncing ou vai ter resultados malucos.

 

Paulo

Postado
1 hora atrás, aphawk disse:

@Fabio Munhoz ,

 

Me parece que você quer usar um canhão para matar uma formiguinha ....

 

Existem Timers justamente para esse tipo de necessidade .... quando o botão for apertado você dispara o Timer, e quando o botão for solto voce pára o Timer, pega o valor dele, faz as contas para obter o tempo, e então zera o timer novamente...

 

Mas, do mesmo jeito que no Arduíno,

tem de usar algum tipo de Debouncing ou vai ter resultados malucos.

 

Paulo

 

@aphawk

Nossa, realmente, posso usar as interrupções né? O timer, achei um modelo na internet explicando bem como usar, porém o timer que ele configura é para contar um certo tempo e quando der esse tempo ja zerar o contador, porém como eu faço para somente soltar o timer quando o botão for acionado, vou copiar o código que vi no site como exemplo aqui, não é o meu código. 

 

 

unsigned contagem;

void interrupt()

contagem++;       //para cada interrpção do TMR0 incrementa a variável contagem
TMR0 = 0; 
INTCON.TMR0IF = 0;  //limpa o overflow.
}

void main()
{
INTCON.GIE = 1; //habilita interrupção global;
INTCON.PEIE = 1; //habilita interrupção dos perifericos;
INTCON.TMR0IE = 1; //habilita interrupção do TMR0;
TMR0 = 0; // TIMER0 inicia com o valor 0;
OPTION_REG = 0b10000001; // Modo Temporizador, prescaler 1:4;
//tempo =1us * 4 * 256 = 1ms
...
while (1)
{
   if(contagem == 1000)    //quando o contagem = 1000, tempo = 1000 * 1ms = 1s;
   {
     portb.RB0 = ~portb.RB0;  //inverte o estado do pino rb0
     contagem = 0; //reseta a variavel contagem 
   }                     
}
}

 

 

 

De acordo com esse código, quando o timer bate 1 segundo ele ja inverte o estado do pino, e ja começa a contar o timer de novo, porém eu so quero contar o timer quando o botão for pressionado, como eu faria isso? tentei colocar uma função if dentro da void interrupt o programa compilo porém não rolou no pic. 

Muito obrigado pela ajuda.

  • Membro VIP
Postado

Não devo te ajudar com a moleza sw mas se algo duro hw lhe atender, vejamos.

Ao ver esta img (>1k txt), você deve ter uma boa luz de como usar o hw a seu favor...

pic-microcontrollers-programming-in-basi

https://www.mikroe.com/ebooks/pic-microcontrollers-programming-in-basic/timer1 )

Essencialmente você deve programar o hw do mc pra que o timer libere a contagem pelo T1G. Ou seja, só conta se T1G=1 o que equivale a quanto tempo o pino fica em 1.

 

É... rapadura é doce mas num é mole não... Se preferir maria mole, me inclua fora desta :P

Postado

@Fabio Munhoz ,

 

Na verdade nem precisa de interrupção !!!!!

 

O Hardware do Timer faz a contagem diretamente pelo clock, pode ser dividido pelo prescaler ou não, o truque é você deixar tudo preparado, e só habilitar a contagem ( é um bit de um registrador ... ) quando apertar o botão.... se usar o Timer1, de 16 bits, e calibrar algo tipo a cada milisegundo ( ou perto disso ) o timer anda uma contagem, você pode medir até 65 segundos de tempo.... e sem interrupção nenhuma !

 

Após a leitura dessa contagem, você zera esse contador do Timer, e depois tá tudo prontinho de novo !

 

Um bit apenas inicia a contagem do hardware, e um bit interrompe !

 

Não sei como te passar isso em C, mas se olhar o datasheet, tem exemplos em C e em Assembly na parte que fala do Timer1 ok ?

 

Pode usar outros times também, mas seriam de apenas 8 bits, se usar uma contagem a cada 10 milissegundos a contagem máxima seria de 2,5 segundos... teria de usar interrupção nesse caso...

 

Paulo

 

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!