Disciplina: SEL0433 - Aplicação de Microprocessadores
Autores:
- Eduardo Gondim Rezende (15448693)
- Matheus Herberts Rios de Lima (15653174)
Este projeto consiste no desenvolvimento de um firmware escrito em Assembly para a arquitetura do microcontrolador 8051. O trabalho foi estruturado com base na metodologia PBL (Problem-Based Learning) para resolver uma situação teórica: o controle de um módulo dosador rotativo numa linha de produção.
Como a implementação é focada exclusivamente no software, os componentes (como o motor e o sensor de voltas) são abstraídos e representados pela manipulação direta das portas lógicas no simulador EdSim51. Os pinos P3.0 e P3.1 representam os sinais de acionamento do sentido, enquanto a chave SW0 em P2.0 funciona como o seletor de sentido de rotação.
A construção do código foi dividida em três entregas parciais evolutivas (Checkpoints), onde cada etapa permitiu o domínio de recursos específicos do microcontrolador, como I/O digital, sub-rotinas e temporizadores. Na etapa final, todos os blocos foram integrados, utilizando interrupções do Timer 1 para gerir o ciclo de dosagem de forma eficiente.
O objetivo desta primeira etapa foi estabelecer a base de interação com o hardware, compreendendo os conceitos iniciais de entrada e saída digital (I/O) do 8051 e o acesso a dados gravados na memória de programa.
O que foi desenvolvido:
O programa lê continuamente o estado de um banco de chaves (SW0 a SW7) conectadas à porta P2. Quando o operador aciona uma dessas chaves, o sistema identifica qual foi pressionada e exibe o número correspondente (de 0 a 7) em um display de 7 segmentos conectado à porta P1.
Lógica e Arquitetura em Assembly:
Para realizar a conversão do número do botão para o padrão visual do display (do tipo ânodo comum), utilizamos uma estratégia de mapeamento via memória de programa:
- Look-up Table: Criamos uma tabela estática chamada
TABELAcontendo os valores hexadecimais dos padrões de segmento para os dígitos de 0 a 7. - Ponteiro de Dados: O registrador
DPTRfoi configurado para apontar para o endereço inicial dessa tabela na memória de programa (ROM). - Busca com MOVC: Após identificar o botão pressionado e armazenar seu índice numérico no Acumulador (
A), utilizamos a instruçãoMOVC A, @A+DPTR. Essa instrução soma o valor do Acumulador com o endereço base doDPTR, acessando diretamente o padrão binário correto na ROM — diferentemente deMOV, que acessa a RAM de dados. - Subrotina MOSTRAR: O envio do padrão ao display foi encapsulado em uma sub-rotina, que recebe o índice em
A, faz a busca na tabela e escreve o resultado na portaP1.
Nesta segunda etapa, o objetivo foi desenvolver a lógica de controle do sentido de rotação (simulado pelos pinos de saída), introduzindo a organização do programa em blocos funcionais e o uso de variáveis de estado.
O que foi desenvolvido:
O sistema monitora continuamente a chave SW0 no pino P2.0. Dependendo do estado desta chave, o programa define o sentido de rotação através dos pinos P3.0 e P3.1. Se a chave for alterada, o "motor" inverte o sentido imediatamente.
Lógica e Arquitetura em Assembly:
A principal evolução técnica nesta fase foi a implementação de uma lógica condicional com uso de sub-rotinas:
- Variável de Estado (Bit F0): Utilizamos o bit de propósito geral
F0do registrador de status (PSW) para armazenar o sentido atual de rotação. Isso permite que o programa compare o estado lido da chave com o estado armazenado, agindo apenas quando há uma mudança efetiva. - Sub-rotinas: O código foi estruturado com as sub-rotinas
VERIFICA_SW(leitura e comparação da chave comF0) eATUALIZA_MOTOR(atualização das saídasP3.0eP3.1). Essa separação facilita a reutilização e a manutenção nas etapas seguintes. - Manipulação de Saídas: O controle é feito alternando os níveis lógicos nos pinos
P3.0eP3.1. Para o sentido 0,P3.0é ativado (SETB) eP3.1desativado (CLR); para o sentido 1, os estados são invertidos. - Uso da Pilha: Com o uso de
ACALLeRET, os endereços de retorno das sub-rotinas são gerenciados automaticamente pela pilha do 8051. Neste checkpoint, o Stack Pointer (SP) ainda utiliza seu valor padrão; a inicialização explícita doSPpara uma região segura da RAM foi introduzida a partir do Checkpoint 3.
O objetivo deste checkpoint foi incorporar o uso de temporizadores, configurando o Timer 1 do 8051 como um contador de eventos externos para registar os pulsos simulados do sensor de voltas.
O que foi desenvolvido:
O código passou a contabilizar as rotações por meio de pulsos externos simulados no EdSim51. O valor acumulado é exibido no display de 7 segmentos no intervalo de 0 a 9, com atualização contínua a cada iteração do laço principal.
Lógica e Arquitetura em Assembly:
- Inicialização do Stack Pointer: O
SPfoi movido para60H(MOV SP, #60H) para garantir que a pilha opere em uma região da RAM que não conflite com as variáveis do programa. - Configuração do TMOD: O registrador
TMODfoi carregado com o valor50H. Esse valor configura o Timer 1 no Modo 1 (contador de 16 bits) operando como contador de eventos externos — diferentemente do modo temporizador interno, onde o contador avança a cada ciclo de máquina; neste modo, ele avança apenas a cada pulso aplicado no pino externoT1. - Leitura de Pulsos: O valor acumulado é lido diretamente do registrador
TL1(parte baixa do contador de 16 bits), que é incrementado automaticamente pelo hardware a cada pulso externo. - Variável de Contagem: O valor lido de
TL1é armazenado na variávelCONTAGEM(endereço30Hna RAM), que serve como índice para a look-up table do display. - Atualização do Display: O índice em
CONTAGEMé usado comMOVC A, @A+DPTRpara buscar o padrão de segmentos correto e enviá-lo à portaP1. - Modularidade: As sub-rotinas
VERIFICA_SWeATUALIZA_MOTORdo checkpoint anterior foram reutilizadas diretamente no laço principal, permitindo que o sistema monitore a chave de sentido e a contagem de forma integrada.
Na entrega final, unimos as funcionalidades dos três checkpoints e implementamos as regras de negócio exigidas pelo projeto, utilizando interrupções de hardware para tornar o controle do contador mais organizado e eliminar a necessidade de polling contínuo.
Principais Funcionalidades Integradas:
-
Reset Automático via Interrupção (Ciclo de Dosagem): O Timer 1 é inicializado com o valor
FFF6H(TH1 = FFH,TL1 = F6H). Como o contador é de 16 bits, ao receber 10 pulsos externos (FFF6H + 10 = 10000H), ocorre overflow e a flagTF1é setada, disparando a interrupção do Timer 1. O vetor de interrupção está definido no endereço001BH, conforme a arquitetura do 8051. -
ISR do Timer 1 (
ISR_TIMER1): A rotina de serviço de interrupção salva o contexto (PUSH ACC/PUSH PSW), para o timer, recarregaTH1eTL1comFFF6H, zera a variávelCONTAGEMe reinicia o timer — garantindo um novo ciclo de 10 pulsos de forma automática e sem bloquear o laço principal. -
Cálculo da Contagem na Exibição: Como
TL1parte deF6H(e não de00H), a subrotinaMOSTRA_CONTAGEMnão usa o valor bruto deTL1diretamente como índice. Em vez disso, calculaA = TL1 - F6H, convertendo o valor do timer para o índice real entre 0 e 9 antes de acessar a look-up table. Uma proteção foi adicionada para o caso de leitura ocorrer durante um overflow. -
Reset Direcional: Sempre que a chave
SW0aciona a reversão do motor, o sistema primeiro para as saídas viaPARA_MOTOR, atualizaF0, chamaRESET_TIMER1(zerando timer eCONTAGEM) e só então liga o motor no novo sentido. Isso garante que o display represente apenas as voltas do sentido atual. -
Indicação Visual do Sentido (Ponto Decimal): O bit
P1.7do display (ponto decimal) reflete o estado deF0. Como o display é ânodo comum,CLR ACC.7acende o ponto eSETB ACC.7o apaga. O bit é ajustado diretamente no padrão de segmentos antes do envio à portaP1, dentro da subrotinaMOSTRA_CONTAGEM.
O vídeo abaixo apresenta o projeto final em execução no simulador EdSim51, demonstrando as funcionalidades implementadas ao longo dos checkpoints.