Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Dúvida Debouncer em Assembly 8051

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    Dúvida Debouncer em Assembly 8051

    Olá, estou fazendo um experimento para a faculdade, no qual tenho que criar um contador de 3 bits que acende alguns leds de uma placa P5C e vai contando de 0 a 7.

    Estou usando o simulador Edsim51
    Link para download do Edsim51:
    Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...

    Já consegui fazer quase tudo, faltam duas coisas!

    1. O professor falou que preciso criar um debouncer (algo que espere 5ms para garantir que o botão está em nível baixo e depois mais 5ms para garantir que está em nível alto novamente).

    2. Quando eu aperto o botão o programa vai contando repetidamente de 0 a 7 depois novamente de 0 a 7 e faz isso 255 vezes, sem que eu precise apertar o botão novamente. Meu objetivo era que cada vez que apertasse o botão a contagem fosse mudando.

    Alguém pode ajudar?? Segue meu código até o momento:

    RESET:
    MOV A, #11111111b ; Liga 8 bits do acumulador
    MOV R0, #8 ; Contador dos leds
    MOV R1, #255 ; Contador do programa
    SUBTRAIR:
    JB P2.1, $
    MOV P1, A
    SUBB A, #10000b ; Subtração para desligar 1 led por vez (Contando de 0 a 7)
    DJNZ R0, SUBTRAIR ; Quando o contador dos leds chegar a 0, passa para o contador do programa
    DJNZ R1, RESET ;Enquanto o contador do programa não chegar a 0, reinicia a contagem


    O professor apresentou um exemplo de debouncer mas não estou conseguindo aplicar no meu código! Segue o exemplo:

    BOTAO1: JB P1.0, BOTAO1 ; aguarda até que o botão seja pressionado
    MOV R7,#10
    TEMPO1: MOV R6,#255 ; função para passar o tempo
    DJNZ R6, $
    DJNZ R7, TEMPO1

    BOTAO0: JNB P1.0, BOTAO0 ; permanece enquanto o botão estiver pressionado
    MOV R7,#10
    TEMPO0: MOV R6,#255 ; função para passar o tempo
    DJNZ R6, $
    DJNZ R7, TEMPO0

    Assim que o botão é pressionado, o programa passa para a rotina TEMPO1 para gastar tempo e garantir que foi pressionado uma vez, e então permanece na instrução BOTAO0 até que o botão seja solto, seguindo para a rotina TEMPO0 para também gastar tempo e garantir que o botão foi solto.

    As funções TEMPO0 e TEMPO1 definem R7 com o valor 10 e R6 com 255. Em seguida decrementa o valor de R6 até 0, e então decrementa R7, voltando ao inicio onde define novamente R6 com o valor 255, repetindo a rotina até que R7 seja 0.

    Desta forma, R6 é decrementado de 255 até 0 por 10 vezes (de acordo com o valor de R7), e como a operação DJNZ usa 2 ciclos de máquina, temos 5120 ciclos de máquina utilizados nestas rotinas, gerando um tempo de aproximadamente 5,12 ms.
    Similar Threads
X
Working...
X