Incrementar contador
2 participantes
picminas :: PIC 18F4550 :: PIC 18F4550 :: Firmware
Página 1 de 1
Incrementar contador
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.
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!!
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
Re: Incrementar contador
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
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
picminas :: PIC 18F4550 :: PIC 18F4550 :: Firmware
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|