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

Incremento e decremento de variável no pic

Recommended Posts

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

Editado por Bcpetronzio
Melhorar título

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites
_xyko_    789

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

que significam

Se - Então - Vá para..

Editado por soschip

Compartilhar este post


Link para o post
Compartilhar em outros sites
aphawk    2.452

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

Compartilhar este post


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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites
aphawk    2.452

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

Compartilhar este post


Link para o post
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

Editado por Maurício2006

Compartilhar este post


Link para o post
Compartilhar em outros sites
aphawk    2.452

Falta também algum tipo de delay, para fazer os incrementos ocorrerem, por exemplo, a cada 100 msegundos.

Paulo

Compartilhar este post


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

Compartilhar este post


Link para o post
Compartilhar em outros sites
_xyko_    789

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

Editado por soschip

Compartilhar este post


Link para o post
Compartilhar em outros sites
Angelo Eletronic    1
  • Autor do tópico
  • 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á?)

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    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.

    é so uma sugestão.

    abs.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    aphawk    2.452

    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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    aphawk    2.452

    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.

    Editado por aphawk

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    aphawk    2.452

    heheh Jorge, eu estava editando o post quando voce postou, heheh leia acima do seu post ok ?

    Paulo

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    aphawk    2.452

    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

    Editado por aphawk

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    eu fiz esse codigo pra teste e acho q ta funcioando olhem

    TRISB = 0

    EEPROM 0, 00000001b

    Dim a As Byte 'eeprom address

    Dim b As Byte 'eeprom data

    Read 0, a

    PORTB = a

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    aphawk    2.452

    Funciona sim, Jorge !!!

    Não precisa disto : Dim b As Byte 'eeprom data ok ? pois voce não usa essa variável ( até agora ! )

    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

    ×