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