Incrementar contador

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Incrementar contador

Mensagem  vinicius loureiro em Seg Set 13, 2010 1:32 pm

Olá

Estou estudando o funcionamento do display 7 segmentos e caí no problema de interrupção.

Como já tem uma biblioteca pronta para escrever números no display, parti para criar algo diferente, que eu tivesse que pensar, e assim, aprender melhor.



Código:


void main(void)
{
   int contador=100;
   //int contador = led + 1;
   ConfiguraSistema();      // Configura as portas e periféricos do PIC.
   ConfigDisplay();  // Configura o display 7 seg duplo
   desligatodososleds();
   
while (1)            //laço infinito que executa o funcionamento do projeto.
   {
   
   Espera(contador);
   a1=0;
   Espera(contador);
   a1=1;
   Espera(contador);
   a2=0;
   Espera(contador);
   a2=1;
   Espera(contador);
   b2=0;
   Espera(contador);
   b2=1;
   Espera(contador);
   c2=0;
   Espera(contador);
   c2=1;
   Espera(contador);
   d2=0;
   Espera(contador);
   d2=1;
   Espera(contador);
   d1=0;
   Espera(contador);
   d1=1;
   Espera(contador);
   e1=0;
   Espera(contador);
   e1=1;
   Espera(contador);
   f1=0;
   Espera(contador);
   f1=1;
   Espera(contador);
   
   if (BOTAO1==1)
     if (contador<250)
      {Espera(100);
      contador=contador+50;
      BUZZER=1;
      Delay10KTCYx(244);
      BUZZER=0;
      }

   
   if (BOTAO2==1)
      if (contador>49) {
         Espera(100);
         contador=contador-50;
         BUZZER=1;
         Delay10KTCYx(244);
         BUZZER=0;
      }   

      
   }//end while


}//end main


O problema é o seguinte:
Os botões funcionarão apenas quando o Laço While estiver no final, então tenho que ficar pressionando o botão até o contador ser incrementado ou decrementado.
Eu poderia chamar uma função sempre antes de ligar ou desligar um pino, mas isto, ao meu ver, tornaria o firmware bem lento (já basta o não uso de um array para armazenar os pinos) e gastaria mais processamento, pois sempre vai executar uma função antes de alterar um pino do display de 7 segmentos.

Imaginei que um IRQ para o botão resolveria este problema. Sempre que o botão fosse pressionado, ele chamaria a função Espera e o display mostraria os leds na velocidade escolhida, independente de onde está sendo executado o While. Li sobre IRQ na web e no datasheet do pic, mas está confuso.

O uso do IRQ para este recurso exige quais procedimentos ?
Tem outra forma de parar o WHILE quando eu apertar o botao 1 e depois continuar de onde estava no While?

TIA!!




vinicius loureiro

Mensagens : 3
Data de inscrição : 10/09/2010

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Incrementar contador

Mensagem  Bruno S. Avelar em Seg Set 13, 2010 8:31 pm

Boa noite Vinicius Loureiro,

Primeiramente bem vindo ao forum, fico feliz de você querer expandir seus conhecimentos criando algo diferente do que existe aqui no forum e no curso PIC MINAS.

O seu problema é que boa parte do seu programa é espera ocupada para contar tempo. E esta espera ocupada "bloqueia" a leitura do botão. Existem dois modos de resolver este problema além da maneira que você comentou colocando em diversas partes uma verificação do botão.
A primeira usar botões ligados a portas que possam gerar interrupções externas. No PIC18 PORTB. Esta interrupção manda o programa para uma rotina de tratamento te interrupção independente dele estar ou não em espera ocupada no momento. No KIT PIC MINAS o botão ligado a uma PORTB é o botão boot (RB4). Voce pode ver mais sobre interrupções no datasheet do PIC18F4550.

A segunda é mais elegante e mais geral. Não faça espera ocupada para contar tempo. O PIC18F4550 possui módulo TIMERs que fazem contagem e geram interrupção ao final da contagem. Então todo o tempo da contagem seu microcontrolador pode ficar fazendo puling nos botões e processando outras coisas.
Você pode ver mais sobre timer em C:\MCC18\doc\periph-lib\timer.html e no datasheet do PIC18F4550.

Claro, você pode implementar a primeira e a segunda solução juntas. Dependendo do projeto que você esteja fazendo isto é o ideal pois economiza muito a CPU deixando ela livre para outras tarefas.

Caso tenha dúvidas ao implementar uma destas soluções é só postar a dúvida que eu respondo.

PS: TIA? Que isso? =P
Espero ter ajudado,
Bruno S. Avelar
avatar
Bruno S. Avelar
Admin

Mensagens : 74
Data de inscrição : 26/07/2009
Idade : 33
Localização : Belo Horizonte MG

Ver perfil do usuário http://picminas.forumeiros.com

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum