Ir ao conteúdo
  • Cadastre-se

Incremento e decremento de variável no pic


Angelo Eletronic

Posts recomendados

Olá.

Tenho dois botões ligado a um pic,up e down, ao apertar up ele incrementa a uma variavel,e ao apertar down ele decrementa essa variavel.

Duvida: Como faço para segurar apertado e ele ir incrementando/decrementando sózinho?sem precisar ficar apertando

Em C de preferência

Link para o comentário
Compartilhar em outros sites

If up = 0 Then

Goto upapertado

End if

If down = 0 Then

Goto downapertado

End if

Goto sempre

upapertado: 'Rotina de Debounce

delay_ms(50)

If up = 0 Then

Goto botaoupconfirmado

End if

Goto upapertado

botaoupconfirmado:

contador = contador + 1

End if

Goto saida

downapertado: 'Rotina de Debounce

delay_ms(50)

If down = 0 Then

Goto botaodownconfirmado

End if

Goto downapertado

botaodownconfirmado

contador =contador -1

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Pela instrução de delay, é o Mikrobasic ou o PIC BASIC.

Dá para usar no PSI, mas esta instrução muda para WAITMS 50 .

Mas o programa não vai funcionar do jeito que foi postado !

Paulo

Com certeza!

Inclusive se ele chagar na ultima linha, não tem mais pra onde ir.

De uma maneira bem simples, a estrutura deveria (ou poderia) ser assim:

-------------------------------------------------

loop:

verificar se up pressionado e caso positivo, ir para incrementar.

verificar se down pressionado e caso sim, ir para decrementar.

Voltar para loop.

incrementar:

delay_up ' aproveita esse delay e usa conforme a taxa de repetição de incremento.

ver se ainda pressionado e se sim, volta para incrementar.

se não, volta para loop

decrementar: 'semelhante a incrementar, claro que com decremento.

-----------------------------------------------------

Bem mais simples... não!

Daí para transformar em basic, usa até menos palavras...heheh

Link para o comentário
Compartilhar em outros sites

soschip,

Caramba, isso é que é um fluxograma bem comentado !

Faltou pouco mesmo para já dizer a mesma coisa já em Basic hehehehehe

Jorge, não esquenta com isso, é que tanto eu como o soschip achamos melhor dizer que não ia funcionar, já pensou se o Angelo começa a converter para o C e não entende a lógica ???????

Agora, bem que alguém podia já postar o exemplo "perfeito" do soschip para o C ..... eu não manjo patavina disso !

Paulo

Link para o comentário
Compartilhar em outros sites

Experimenta isso aqui:

#define TECLA_MAIS     PINX.0
#define TECLA_MENOS PINX.1

unsigned char var = 0;

void main ( void )
{
while ( 1 )
{
while ( TECLA_MAIS ) var++;
while ( TECLA_MENOS ) var--;
}
}

ENQUANTO (while) a tecla MAIS estiver pressionada, ele incrementa VAR.

Se soltar a tecla ele cai no segundo while e testa. Se a tecla MENOS estiver apertada, ele vai decrementar VAR, até que a tecla seja solta.

Se nenhuma das teclas estiver pressionada, nada acontece e o programa segue e espera pelo pressionamento de alguma tecla.

Óbvio que falta um monte de configurações no programa. Configurações da sua CPU, claro. E o programa também não tem nenhum filtro pra tratamento de debouncing.

[]´s

Link para o comentário
Compartilhar em outros sites

eu acho que assim ficaria melhor

o codigo é para o pic16F877 ou 16F877A, mas a lógica é a mesma

(e os comandos também, é só mudar o modelo do pic na 1 linha)


#include <16f877.h> // identifica microcontrolador alvo
#use delay (clock=4000000) // <- define cristal para 4Mhz. Para outros valores, mude e recompile.

#define botao_up pin_d0//definee o botao up como o pino D0
#define botao_down pin_d1//definee o botao down como o pino D1

void main()//inicio do programa - função main
{
unsigned int cont = 0;//declara e inicializa a variavel
while(1)//inicio do ciclo infinito(por ter 1 dentro dos parenteses)
{
if (botao_up)//se botao up pressionada
{
cont++;//incrementa a variavel
}
if (botao_down)//se botao down pressionado
{
cont--;//decrementa a variavel
}
delay_ms(100);//espera 100 milisegundos para a variavel nao ser incrementada que nem louca
}//fim do ciclo
}//fim da função main - fim do programa

uma observação

como o while tem 1 dentro dos parenteses ele ira sempre ser executado

então esse programa na verdade não tem fim

espero ter ajuado

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Micael77, só que ele não pode só ficar incrementando e decrementando sem fazer mais nada... não é?

Então por isso que incremento e decremento são subrotinas.

loop:

verificar se up pressionado e caso positivo, ir para incrementar.

verificar se down pressionado e caso sim, ir para decrementar.

...

aqui mais ações, como acender leds, displays, etc...

...

Voltar para loop.

Não sei teste compilador, mas no bascom poderia ser feito:

loop:

if tecla_up = ligado then gosub incrementa

if tecla_dw = ligado then gosub decrementa

..

...

goto loop

incrementa:

....

return

decrementa:

...

return

Link para o comentário
Compartilhar em outros sites

Jorge, vou colocar sim, eu realmente comí bola, vou colocar na primeira apostila , junto com uma dica legal que o amigo TcheCara passou no tópico da apostila, assim fica tudo atualizado.

Eu ví que mais alguém teve dúvida sobre como gravar e ler na Eprom do Pic, mas algém também postou a solução correta, porisso que passei " em branco " ...

Felipe, para usar como interrupção, o programa tem de ser escrito já prevendo isso, desde o início. Se o programa já estiver pronto, não fica fácil ser alterado inteiro. Acho melhor continuar tratando do jeito que o soschip falou.

Pessoal, se quiserem, eu posto aqui em Basic um exemplo completo, e algém converte para o C, se acharem viável é só falar ok ?

Também posso postar um exemplo fazendo isso por interrupção, se quiserem.

Paulo

Link para o comentário
Compartilhar em outros sites

Bom, vou explicar aqui sobre o acesso à Eprom do Pic, e depois eu faço um programinha usando a Eprom e tratando do incremento / decremento pedido, farei um novo post com o programinha ok ?

No PSI, temos 3 comandos que mexem com dados na Eprom :

O primeiro deles é este aqui :

EEPROM endereço, dado

IMPORTANTE - quando falo variável, quero dizer sempre uma variável tipo Byte ok ?

Onde o primeiro parâmetro, que é o endereço, é um endereço que pode ir de 0 até 255, e a seguir vem o segundo parâmetro, dado, que é uma lista dos dados que queremos colocar no endereço definido por adress , em diante.

Vou mostrar os exemplos do manual :

EEPROM 0, 0x55

EEPROM 253, 0x01, 0x02, 0x03

O primeiro exemplo guarda o valor 0x55 no primeiro endereço ( o endereço 0 ) na EEprom do Pic.

O segundo exemplo guarda os seguintes valores na EEprom :


[COLOR=#0000c0][COLOR=Black]ENDEREÇO CONTEÚDO
253 0x01
254 0x02
255 0x03[/COLOR][/COLOR]

Normalmente esse comando é usado na inicialização do conteúdo da EEprom, no início do programa.

Os outros dois comandos são usados normalmente em qualquer posição no programa. São os comandos que nos permitem ler e gravar os dados na memória EEprom :

READ endereço ( ou variável) , variável

WRITE endereço ( ou constante ), variável ( ou constante )

Ou seja, no comando WRITE a,b estamos gravando no endereço contido na variável a, o valor contido na variável b.

Write a,10 grava o valor 10 no endereço definido pela variável a.

Write 12,0xAA armazena o valor 0xAA no endereço 12 da EEprom.

Write 12,a armazena o conteúdo da variável a no endereço 12 da EEprom.

Já na leitura, sempre temos de armazenar numa variável o que estamos lendo, seja um endereço direto ou um endereço contido em uma variável. Por exemplo :

Read a,b armazena na variável b o conteúdo do endereço definido pela variável a.

Read 123, dado lê o valor armazenado no endereço 123 da EEprom, e armazena esse valor na variável dado.

Link para o comentário
Compartilhar em outros sites

Heheheh Jorge, viu que é fácil não é ?

Às vezes, a resposta está tão na cara que não conseguimos enxergar ela em foco hihihihhi !

Bom, agora segue o programinha, usando a lógica que o soschip colocou, ou seja, direto, simples, sem interrupção :


Define CONF_WORD = 0x3f72

AllDigital

TRISB = 11111111b
TRISD = 00000000b
Symbol up = PORTB.0
Symbol down = PORTB.1
Symbol contagem = PORTD
Dim conttecla As Byte

conttecla = 0
gosub mostra
loop:
Gosub teclaup
Gosub tecladown
Goto loop
End

teclaup:
If up = 1 Then Goto saiup 'tecla UP apertada
up1:
conttecla = conttecla + 1
If conttecla > 9 Then
conttecla = 9
Endif
WaitMs 200
Gosub mostra
If up = 1 Then Goto saiup
Goto up1
saiup:
Return

tecladown:
If down = 1 Then Goto saidown
down1:
conttecla = conttecla - 1
If conttecla > 10 Then
conttecla = 0
Endif
WaitMs 200
Gosub mostra
If down = 1 Then Goto saidown
Goto down1
saidown:
Return

mostra:
contagem = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), conttecla
Return

Bom, este programa é para um hardware que tem dois botões ligados aos pinos PORTB bit 0 ( botão UP ) e PORTB bit 1 ( Botão DOWN ).

No PORTD está ligado um display de 7 segmentos, tipo catodo comum.

Quando o programa roda, ele mostra ZERO na saída, e aguarda os botões serem pressionados. Se mantivermos apertado por mais de 200 msegundos, ele vai continuar incrementando ou decrementando, conforme o botão apertado.

Os valores máximos e mínimos são 0 a 9 .

Se forem simular no PSI, mudem WAITMS 200 para WAITMS 3 ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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