Pular para o conteúdo principal

Talvez você goste

Pintura: "Sementes", acrílico sobre madeira 77 x 50 cm

    Pintura "Sementes", acrílico sobre madeira 77 x 50 cm por J. Caraumã Na base da economia yanomami, a floresta não é, para eles, um espaço de exploração de recursos; ao contrário, é uma entidade viva, intimamente ligada à sua cosmologia. No livro A queda do céu , conta-se que os espíritos xapiri , por exemplo, colhem seus cantos a partir das árvores: “Omama plantou essas árvores de cantos nos confins da floresta, onde a terra termina, onde estão fincados os pés do céu […]. É a partir de lá que elas distribuem, sem trégua, suas melodias a todos os xapiri que correm até elas. São árvores muito grandes, cobertas de penugem brilhante de uma brancura ofuscante. Seus troncos são cobertos de lábios que se movem sem parar, uns em cima dos outros.” Essa floresta é chamada de Hutukara . Segundo a mitologia yanomami, Omama a criou no “primeiro tempo”, quando havia apenas os yarori (ancestrais sobrenaturais que hoje são os animais de caça) e uma floresta frágil. Para criar outr...

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