Ir ao conteúdo
  • 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:  
Fabio Munhoz

PIC Como usar biblioteca time no MikroC for pic

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

Compartilhar este post


Link para o post
Compartilhar em outros sites
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.

Editado por Fabio Munhoz

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

 

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






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×