Pular para o conteúdo principal

Talvez você goste

Pássaro azul

  Pássaro Azul É com a tinta da noite e os impulsos do coração que te escrevo A emoção que tua presença me inspira.  É na quietude das horas tardias, entre o arranhar e o lavar dos pratos,  Que te encontro na janela da minha alma,  Tua plumagem azulada refletindo o celeste dessa alma em paz.  Vejo-te no alto do mamoeiro, onde repousas majestoso em tua torre de contemplação,  És uma testemunha silenciosa do vento que adentra nesta casinha-mansão.  Ali, entre as folhas verdes e os murmúrios da brisa que acariciam os frutos dos teus desejos,  Tua presença é meu convite para olhar no espelho.  Mas como poderia descrever-te? Como outros poderiam te ver?  Sempre falo de ti e teus olhos negros cintilantes,  Mas quando apareces és tão singular, múltiplo e incerto,  Que nunca pareces com o desenho que fiz de ti!  E tenho de fechar meus olhos para ver-te!  - O Artientista Reflexões em 28 de abril de 2024.  Créditos da imagem: Vitória Régia Albuquerque da Silva (2024)

8051: Sequência de LEDs utilizando Interrupções INT0, INT1 e botões (Código em Assembly)

Pequeno circuito & código em assembly projetado com o objetivo de acender 8 LEDs em duas sequências diferentes através do uso das interrupções INT0 e INT1 do microcontrolador 8051.



 O Intel MCS-51 (também conhecido como Intel 8051) faz parte de uma família de microcontroladores de 8 bits lançada pela Intel em meados de 1980. Além disso, é um dos microcontroladores mais populares já produzidos e apresenta uma arquitetura relativamente simples. Assim, o presente artigo descreve brevemente a solução de um exercício proposto que faz uso de duas de suas interrupções (INT0 e INT1), acionadas distintamente por dois botões diferentes os quais permitem acender alguns LEDs em sequência.

Exercício Proposto: projetar um circuito que consiste em acender sequencialmente 8 LEDs utilizando interrupções, considerando o tempo de 1 (um) segundo entre ligar e desligar cada LED individualmente. E utilizando, ainda, dois botões (botão 1 e botão 2) com a função de determinar o sentido de acendimento dos LEDs, isto é, da esquerda para direita ou da direita para a esquerda, respectivamente.

Primeiro, observe que, vamos fazer uso das interrupções INT0 e INT1, respectivamente, para cada uma das rotinas de controle de acionamento dos LEDs em sequência. Dessa forma, conforme diagrama a seguir, fica definido a lógica que vamos utilizar a seguir no código de programação do microcontrolador.

A seguir, tem-se o diagrama sugerido do circuito do hardware utilizado na solução do exercício, de modo que é possível verificar os 8 (oito) LEDs e os 2 (dois) botões. Veja que os botões são de contato momentâneo e, inclusive, considerando-se que os LEDs serão acionados individualmente e segundo o intervalo de 1 (um) segundo entre ligar e desligar, tem-se que a alimentação de cada LED pode ser realizada através dos respectivos pinos do PORT 2 do microcontrolador, pinos estes aos quais também estão ligados resistores limitadores de corrente no valor de 220 Ω.


Assim, o circuito acima foi montado no software ISIS Proteus v8.3 para simulação. Em seguida, de acordo com o algoritmo sugerido acima, fez-se através da IDE MCU8051 o seguinte código em Assembly.

;
; MCU: AT89S5x, Clock: 12 MHz, Ciclo de Máquina: 1 us
;
; Autor: J. G. Silva Data: 14 de setembro de 2021
;

        ORG     000H          ; onde o programa começa após o RESET
        LJMP    INICIO        ; pula os endereços previstos de interrupção,
                              ; por meio do label INICIO.

                              ; --- INICIO DAS ROTINAS ATENDIDAS POR INTERRUPÇÃO
        ORG     0003H         ; endereço da interrupção INT0
        LJMP    LED_ESQ       ; pula para o serviço de interrupção INT0        
        ORG     0013H         ; endereço da interrupção INT1
        LJMP    LED_DIR       ; pula para o serviço de interrupção INT1
                              ; --- FIM DAS ROTINAS ATENDIDAS POR INTERRUPÇÃO

INICIO:
        MOV     IE,#10000101B ; habilita serviços de interrupção INT0 e INT1
        MOV     A,#00000001B  ; valor inicial armazenado no acc
LOOP:                         ; INICIO DO LOOP PRINCIPAL DO PROGRAMA
        MOV     P2,#000H      ; mantém os leds normalmente apagados
        SJMP    LOOP          ; permanece em loop

LED_ESQ:                      ; Faz com que os 8 LEDs acendam da esquerda para a direita
                              ; a cada 1s
        MOV     P2,A          ; envia o conteudo do acc para o port2
        RL      A             ; desloca à esquerda os bits do acc
        ACALL   DELAY1S       ; delay de 1s
        RETI                  ; fim do programa de interrupção INT0
                              

LED_DIR:                      ; Faz com que os 8 LEDs acendam da direita para a esquerda
                              ; a cada 1s
        MOV     P2,A          ; envia o conteudo do acc para o port2
        RR      A             ; desloca à direita os bits do acc
        ACALL   DELAY1S       ; delay de 1s
        RETI                  ; fim do programa de interrupção INT1
                              

DELAY1S:                      ; INICIO DAS ROTINAS DE TEMPORIZAÇÃO
        MOV     R5,#250D      ; 1 ciclo + 2 ciclos do mnemônico call
DELAY1X:ACALL   DELAY1MS      ; Chama-se a rotina de delay de 1ms
        ACALL   DELAY1MS      ; por cerca de 4 vezes por 250 vezes,
        ACALL   DELAY1MS      ; isto é, 4 x 1ms x 250 = 1000ms ~ 1s
        ACALL   DELAY1MS
        DJNZ    R5,DELAY1X
        RET
DELAY1MS:                     ; rotina de delay de cerca de 1 ms
        MOV     R6, #250D     ; 1 ciclo
        MOV     R7, #250D     ; 1 ciclo
DLYAUX0:DJNZ    R6, DLYAUX0   ; 2 ciclos
DLYAUX1:DJNZ    R7, DLYAUX1   ; 2 ciclos
        RET                   ; Total: 1us + 1us + 250 x 2us + 250 x 2us = 1002us ~ 1ms
END                           ; fim do programa

Por fim, utilizando-se a ferramenta de osciloscópio para as ponteiras de provas adicionadas ao circuito acima da simulação, pode-se obter o seguinte resultado gráfico de modo a verificar a temporização de acionamento para cada LED e comparar este valor ao longo do tempo.



Referências

NICOLOSI, Denys E. C. Microcontrolador 8051 Detalhado. Erica. 6ª Edição.



Comentários

Postagens mais visitadas