Arne Basic 2k - Experiência 4.1 - Usando teclas com o Arne Basic 2k


A proposta

Nesta experiência vou demonstrar como utilizar teclas com o microcontrolador Embedded Arne Basic 2k. Nesta experiência vou explorar uma função bastante interessante do BASCOM, a função DEBOUNCE. Esta função analisa se um pino assume o estado esperado (0 ou 1 lógico), aguarda o tempo configurado para debounce e analisa o estado do pino novamente. Se o pino ainda estiver no mesmo estado aguarda o retorno ao estado inicial para evitar o repique da tecla. Após voltar ao estado inicial desvia para um label com o comando GOTO. Se o parâmetro SUB for inserido o desvio será feito com o comando GOSUB, e neste caso será necessário a inclusão do comando RETURN no final do label. O equivalente da função debounce seria: 

  if pinX.n = 0 then
    Waitms tempo de debounce
    while pinX.0 = 0
       $asm
          nop;
       $end asm
    wend
    gosub label
  end if


A experiência

Na figura abaixo você pode ver o circuito desta experiência. Basicamente utilizei para a mesma duas teclas, três resistores e um LED. Ao se pressionar a tecla S1 o LED acende, e ao se pressionar a tecla S2 o LED apaga.


Você pode ver o código fonte logo abaixo. Este programa é mais um excelente exemplo da estrutura da Linguagem de Programação BASIC utilizada pelo compilador BASCOM-AVR. Eu sei que esta ainda não é uma experiência "complexa", mas.... como diria o sr. Miagui - "Daniel San!!! Acabar pintar cerca lado de dentro e lado de fora!?! bom né... agora hora de lixar assoalho... Depois começar aprender karatê né!!!" ehehehehe

Código fonte:_
'*******************************************************************************
'* Programa TESTE_TECLAS_ARNEBASIC2K.BAS
'* Desenvolvido por Márcio José Soares
'* para do Arne Basic 2k
'*
'* Obs.: Este programa foi desenvolvido para testar o uso de chaves
'* com o Arne Basic 2k. Veja o circuito em www.arnerobotics.com.br
'*
'* A função debounce analisa se um pino assume o estado esperado, aguarda o tempo
'* configurado para debounce e se o pino ainda está no mesmo estado aguarda retorno
'* ao estado inicial evitando o repique da tecla. Após liberar desvia para um label
'* com o comando goto. Se o parâmetro SUB for inserido o desvio será feito com o
'* comando gosub, e neste caso é necessário a inclusão do comando RETURN no final do label.
'*
'* O equivalente da função debounce seria:
'* if pinX.n = 0 then
'*    Waitms tempo de debounce
'*    while pinX.0 = 0
'*       $asm
'*          nop;
'*       $end asm
'*    wend
'*    gosub label
'* end if
'*
'* Você neste caso poderia usar um goto label sem nenhum problema ;-)
'*
'* Obs.: Lembre-se apenas de colocar um resistor de pull-up no pino que você
'* ligar a chave para evitar danificar o pino de I/O do Arne Basic 2k!!!!
'*******************************************************************************
 
'*******************************************************************************
'Configs necessários ao microcontrolador
$crystal = 10000000
$regfile = "attiny2313.dat"
Config Portb = &B11101101               'todo portB é saída, exceto PB1 e PB4
Config Portd = &B11111110               'todo portD é saída, exceto PD0
 
Config Debounce = 30                    'tempo para debounce das chaves = 30 ms
 
'*******************************************************************************
'Liga pinos de I/O's a "nomes" mais fáceis ao entendimento humano ;-)
Led Alias Portb.0                       'pino de saída para led
S1 Alias Pinb.1                         'pino de entrada para chave 1
S2 Alias Pinb.4                         'pino de entrada para chave 2
 
'*******************************************************************************
'Declaração das subrotinas
Declare Sub Check_tec()
 
'*******************************************************************************
'Início do programa
Waitms 500                              'aguarda 0,5 segundo
 
'*******************************************************************************
'Laço principal... faz eternamente
Do
 
   Call Check_tec()                     'chama rotina para ver se tem tecla
 
Loop
 
 
'*******************************************************************************
'Subrotina para verificar se alguma tecla foi pressionada
'S1 acende LED
'S2 apaga LED
Sub Check_tec()
 
   Debounce S1 , 0 , Sled , Sub         'desvia para SLED se zero
   Debounce S2 , 0 , Rled , Sub         'desvia para RLED se zero
   Goto Fim                             'desvia para fim da subrotina
 
'Label para acender led
Sled:
Reset Led                               'liga led - modo dreno!!!
Return                                  'retorna para uma linha após função debounce
 
'Label para apagar led
Rled:
Set Led                                 ' desliga led  - modo dreno!!!
Return                                  'retorna para uma linha após função debounce
 
'Label para sair da função
Fim:
End Sub
 
 
End                                     'fim do program


Copyright deste conteúdo reservado para Márcio José Soares e protegido pela Lei de Direitos Autorais LEI N° 9.610, de 19 de Fevereiro de 1998. É estritamente proibida a reprodução total ou parcial do conteúdo desta página em outros pontos da internet, livros ou outros tipos de publicações comerciais ou não, sem a prévia autorização por escrito do autor.