Incremento e decremento de variável no pic - Eletrônica - Clube do Hardware
Incremento e decremento de variável no pic
Por Angelo Eletronic, 24 de setembro de 2009 em Eletrônica
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
Goto upapertado
Goto downapertado
upapertado: 'Rotina de Debounce
Goto botaoupconfirmado
botaoupconfirmado:
downapertado: 'Rotina de Debounce
Goto botaodownconfirmado
botaodownconfirmado
contador =contador -1
neto_e_khelen 1
jorgeletronico, só uma pergunta, que linguagem é essa que você escreveu o código?? pra qual compilador??
A linguagem é BASIC e pelo que vi, serve em todos os compiladores basic que conheço, pois são instruções bem simples.
Aliás, só tem 3:
IF - THEN - GOTO
Se - Então - Vá para..
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 !
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:
verificar se up pressionado e caso positivo, ir para incrementar.
verificar se down pressionado e caso sim, ir para decrementar.
Voltar para loop.
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
galera,era so um caminho,eu fiz assim aqui num circuito e funcionou exatamente como o amigo pretende,e claro q tem q terminar o resto nao.
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 !
#define TECLA_MAIS     PINX.0
#define TECLA_MENOS     PINX.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.
Editado 25 de setembro de 2009 por Maurício2006
Falta também algum tipo de delay, para fazer os incrementos ocorrerem, por exemplo, a cada 100 msegundos.
Micael77 0
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
#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
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
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.
aqui mais ações, como acender leds, displays, etc...
Não sei teste compilador, mas no bascom poderia ser feito:
if tecla_up = ligado then gosub incrementa
if tecla_dw = ligado then gosub decrementa
Editado 25 de setembro de 2009 por soschip
Valeu pessoal,realmente não sei nada de BASIC-o hauhauhauha
Agora to com outro problema,como faço para quando apertar um terceiro botão ele salvar o valor final na eprom?(alias na eeprom do pic,ao desliga-lo os dados continuam lá?)
ta ai uma boa ideia pro professor paulao colocar na apostila ein,como gravar na eeprom do pic.
Angelo, e pessoal, ja pensaram em usar a interrupção em um dos timers, isso daria idepencida da leitura dos botões equanto o resto do programa continua rodando.
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.
O que você postar aí na tela é cultura.
o paulao ,porque nao posta tbem sobre a eeprom.
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 :
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.
Editado 26 de setembro de 2009 por aphawk
to esperando ansioso kkkkkkkkkkkk.
heheh Jorge, eu estava editando o post quando voce postou, heheh leia acima do seu post ok ?
poxa ,aqui no meu nao vi esse comando eepron kkkkkkkkkkk,agora ficou mais fácil.
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 :
TRISB = 11111111b
TRISD = 00000000b
Symbol up = PORTB.0
Symbol down = PORTB.1
Symbol contagem = PORTD
Dim conttecla As Byte
conttecla = 0
Gosub teclaup
Gosub tecladown
teclaup:
If up = 1 Then Goto saiup  'tecla UP apertada
conttecla = conttecla + 1
If conttecla > 9 Then
conttecla = 9
If up = 1 Then Goto saiup
saiup:
tecladown:
If down = 1 Then Goto saidown
conttecla = conttecla - 1
If conttecla > 10 Then
Goto down1
saidown:
contagem = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), conttecla
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.