Microcontrolador Hipotético Estudo e Simulação

Propaganda
Ministério da Educação
Universidade Tecnológica Federal do Paraná
Departamento Acadêmico de Eletrônica
Curso Técnico em Eletrônica
Disciplina: Microcontroladores 1
PR
UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ
Microcontrolador Hipotético
Estudo e Simulação
Material de Apoio
Cion Cassiano Basso
Curitiba, 02 de março de 2011
Estudo do Microcontrolador Hipotético
Página 1
Lista de Figuras
Figura 1 – Diagrama em blocos do computador digital. ............................................................................................. 5
Figura 2 – Diagrama em blocos do computador digital com o detalhamento da CPU. ................................... 6
Figura 3 – Microprocessador é uma CPU encapsulada em um CI. .......................................................................... 6
Figura 4 – Diagrama em blocos do microcomputador................................................................................................. 7
Figura 5 – Microcontrolador é um microcomputador encapsulado em um CI. ................................................. 8
Figura 6 – Exemplos de aplicação para o microcontrolador. .................................................................................... 9
Figura 7 – Modelo do programador para o microcontrolador hipotético..........................................................11
Figura 8 – Diagrama funcional do microcontrolador hipotético. ..........................................................................11
Figura 9 – Detalhamento do hardware do microcontrolador hipotético. ..........................................................13
Figura 10 – Componentes necessários para se implementar um bit do Bus de dados. ................................14
Figura 11 – O circuito de Clock sincroniza a transferência de dados entre os componentes da CPU.....15
Figura 12 – (a) Diagrama em blocos do registrador de um bit. (b) Implementação do registrador. ......15
Figura 13 – (a) Circuito do registrador de oito bits. (b) Representação sob a forma de bloco..................16
Figura 14 – Implementação do registrador A, com o flag Zero (ZA)....................................................................17
Figura 15 – Representação e implementação da porta P0.......................................................................................18
Figura 16 – Estrutura da Unidade Lógica e Aritmética (ULA). ...............................................................................20
Figura 17 – Diagrama da memória RAM e componentes associados. .................................................................20
Figura 18 – Estrutura da memória de programa (ROM). .........................................................................................21
Figura 19 – (a) Diagrama dos registradores PC e MROM. (b) Composição do registrador PC. .................22
Figura 20 – Ciclos de busca, decodificação e execução do programa (Firmware). .........................................23
Figura 21 – Estrutura da Unidade de Controle. ............................................................................................................24
Figura 22 – Implementação da Unidade de Controle pela técnica de Lógica de Controle Fixo. ................25
Figura 23 – Formas de ondas geradas pelo Contador em Anel. .............................................................................26
Figura 24 – Diagrama de temporização para o ciclo de busca do opcode. .........................................................27
Figura 25 - Implementação do circuito para o sinal LPC. .........................................................................................30
Figura 26 – Níveis de linguagens de programação. ....................................................................................................43
Figura 27 – Estrutura do programa Simulador. ...........................................................................................................44
Figura 28 – Tela de entrada do programa Simulador. ...............................................................................................45
Figura 29 – Tela de entrada do módulo do Editor do Firmware na ROM...........................................................46
Figura 30 – Apresentação do conteúdo da memória ROM, após a edição. ........................................................47
Figura 31 – Tela de entrada do módulo: Gravador do Firmware em Arquivo..................................................48
Figura 32 – Conteúdo gravado com o módulo Gravador do Firmware no arquivo C:/C1.TXT. .................48
Figura 33 – Tela para a opção de carregamento do Firmware. ..............................................................................49
Figura 34 – Firmware carregado na memória ROM....................................................................................................49
Figura 35 – Mensagem de ERRO apresentada na ocorrência de falha na leitura do arquivo.....................49
Figura 36 – Tela apresentada no módulo Desmontador do Firmware................................................................50
Figura 37 – Mensagem de erro devido a um opcode inválido.................................................................................50
Figura 38 – Tela gerada pelo módulo do Simulador do Firmware após a execução das instruções........51
Figura 39 – Apresentação do conteúdo da RAM após operação com a memória. ..........................................52
Figura 40 – Tela de entrada do Simulador das Microinstruções. ..........................................................................53
Figura 41 – Simulação da instrução MOV 01,A (p/A=22). .......................................................................................53
Figura 42 – Conteúdo da memória RAM após instrução MOV 01,A (p/A=22).................................................54
Estudo do Microcontrolador Hipotético
Página 2
SUMÁRIO
APRESENTAÇÃO...................................................................................................................................................4
I. CONCEITOS BÁSICOS...................................................................................................................................5
I.1. Computador Digital ....................................................................................................................................................... 5
I.2. Microcomputador e Microprocessador ................................................................................................................. 6
I.3. Microcontrolador ........................................................................................................................................................... 8
II. MICROCONTROLADOR HIPOTÉTICO................................................................................................... 10
II.1. Modelo do Programador..........................................................................................................................................10
II.2. Operação do Microcontrolador .............................................................................................................................11
II.3. Hardware do microcontrolador hipotético ......................................................................................................13
II.4. Descrição do Hardware ............................................................................................................................................14
II.5. Conjunto de Instruções.............................................................................................................................................30
II.6. Descrição das Instruções .........................................................................................................................................32
III. PROGRAMAÇÃO EM LINGUAGEM DE MÁQUINA ............................................................................... 42
III.1. Linguagem de Programação .................................................................................................................................42
III.2. Programa Simulador................................................................................................................................................44
III.3. Operação do Simulador ..........................................................................................................................................45
III.3.1. Módulo: Editor do Firmware na ROM .......................................................................................................45
III.3.2. Módulo: Gravador do Firmware em Arquivo .........................................................................................47
III.3.3. Módulo: Carregador do Firmware de Arquivo.......................................................................................48
III.3.4. Módulo: Desmontador do Firmware .........................................................................................................50
III.3.5. Modulo: Simulador do Firmware ................................................................................................................51
III.3.6. Módulo: Simulador das Microinstruções.................................................................................................52
Estudo do Microcontrolador Hipotético
Página 3
APRESENTAÇÃO
O objetivo deste material é iniciar o estudo microcontrolador 8051, conteúdo da disciplina
Microcontroladores 1, desenvolvida no 7º período do Curso Técnico em Eletrônica, ministrado no
Campus Curitiba da Universidade Tecnológica Federal do Paraná (UTFPR). A motivação para a sua
elaboração decorre da percepção de que o domínio do tema microcontrolador é facilitado quando o
estudante tem o conhecimento dos conceitos gerais envolvidos com computadores digitais,
principalmente quanto às terminologias, os blocos funcionais, os componentes de hardware, o
princípio de funcionamento e a noção de programação básica (software).
Os dois conhecimentos necessários que o estudante deve possuir para o melhor aprendizado,
compreendem: (i) programação em linguagem de alto nível, como C, Pascal ou outra; e (ii) Eletrônica
Digital, envolvendo o domínio das funções lógicas, circuitos combinacionais (multiplexadores,
demultiplexadores, codificadores, decodificadores, comparadores etc), circuitos sequenciais (flipflops, contadores e registradores) e memórias semicondutoras.
Assim, este estudo será desenvolvido em quatro etapas, abrangendo:
I.
o desenvolvimento dos conceitos básicos relacionados aos computadores digitais,
microcomputadores, microprocessadores e microcontroladores;
II. o estudo de uma arquitetura simplificada de um microcontrolador hipotético;
III. a elaboração e simulação de programas em linguagem de máquina para a arquitetura
simplificada com o emprego de um programa Simulador; e
IV. a programação em Linguagem de Montagem (Assembly), empregando um programa
Montador (Assembler), em conjunto com o Simulador.
Após concluir o aprendizado destes conteúdos, o estudante estará apto a compreender como
os computadores são estruturados, quais são seus principais componentes de hardware, como eles se
conectam e como são controlados a partir de um programa codificado em linguagem de máquina
armazenado na memória.
Também, o conhecimento básico de programação em linguagem de máquina exercitado
facilitará o aprendizado do microcontrolador 8051, ou outros dispositivos, possibilitando a
compreensão das etapas necessárias ao desenvolvimento de software de controle (Firmware).
Como este material está em contínuo processo de correção e construção, as sugestões, as
dúvidas geradas e as propostas de melhorias são bem vindas e podem ser encaminhadas para e-mail:
[email protected].
Estudo do Microcontrolador Hipotético
Página 4
I. CONCEITOS BÁSICOS
I.1. Computador Digital
Um computador digital, genericamente, é um equipamento eletrônico que aceita, armazena,
modifica e disponibiliza informações representadas no sistema de numeração binário, sendo
comumente estruturado a partir de três unidades denominadas de: (i) Unidade Central de
Processamento (UCP ou CPU - Central Processing Unit); (ii) Unidade de Memória; e (iii) Unidade de
Entrada/Saída.
A troca de informações entre estas três Unidades ocorre por intermédio de um sistema de
comunicação designado de Bus (em português, alguns autores empregam os termos: barramento, via
ou duto).
A interação do computador com o meio externo é realizada por diferentes dispositivos de
comunicação, denominados de Periféricos de Entrada/Saída. Os dispositivos de armazenamento de
dados de alta capacidade, conhecidos como memória secundária, também são conectados ao
computador por meio da Unidade de Entrada/Saída. Esses componentes estão representados sob
forma diagrama em blocos ilustrado na figura 1.
Figura 1 – Diagrama em blocos do computador digital.
Funcionalmente, a CPU é responsável pela execução de programas armazenados na Unidade de
Memória (também designada de memória principal) e que são desenvolvidos para uma determinada
aplicação, chamados de softwares aplicativos, tais como editores, navegadores, planilhas, jogos etc, ou
para controle das suas unidades internas, conhecidos como softwares de suporte, que é o caso, por
exemplo, do Sistema Operacional.
Um programa consiste de um conjunto de instruções organizadas de forma a solucionar um
problema computacional, sendo cada instrução uma ordem para que a CPU produza um determinado
resultado. Os dados temporários manipulados pelo programa são armazenados na memória principal.
A CPU, de maneira conceitual, é implementada a partir de três unidades funcionais
denominadas de: (i) Unidade Lógica e Aritmética (ULA ou ALU - Arithmetic Logic Unit); (ii) Unidade de
Controle (UC); e (iii) Unidade de Registradores (UR). Essas unidades trocam informações por um
sistema de Bus.
O diagrama em blocos da figura 2 apresenta a composição do computador digital, com as três
Unidades que implementam a CPU (ULA + UR + UC).
Estudo do Microcontrolador Hipotético
Página 5
Figura 2 – Diagrama em blocos do computador digital com o detalhamento da CPU.
A ULA é responsável pela realização de operações lógicas (E, OU, NÃO, OU exclusivo, entre
outras) e aritméticas (soma, subtração, entre outras), de acordo com a instrução que a CPU irá
executar.
A UC é responsável pela geração de todos os sinais elétricos de controle que comandam as
demais unidades internas à CPU (ULA e UR) e externas (Memória e Entrada/Saída). Estes sinais são
ativados de acordo com a execução de cada instrução.
A UR é constituída por um conjunto de registradores responsáveis pelo armazenamento de
dados e informações de controle necessárias à execução das instruções.
I.2. Microcomputador e Microprocessador
Um microcomputador é um computador digital no qual a CPU é um Circuito Integrado (CI),
denominado de microprocessador (μP)1, conforme ilustrado na figura 3.
Figura 3 – Microprocessador é uma CPU encapsulada em um CI.
1
O desenvolvimento da microeletrônica tem possibilitado a integração de dois ou mais núcleos de processadores
(arquiteturas multicores) em único CI, como estratégia de melhoria no desempenho dos computadores digitais,
Estudo do Microcontrolador Hipotético
Página 6
Adicionalmente ao μP, um microcomputador necessita de outros componentes, conforme
ilustrado no diagrama em blocos da figura 4.
Figura 4 – Diagrama em blocos do microcomputador.
•
•
•
•
•
•
Os componentes que integram o microcomputador, compreendem:
memórias semicondutoras que podem ser classificadas em dois tipos genéricos: (i) RAM
(Random Access Memory – Memória de Acesso Aleatório), capaz de realizar operações de
escrita e leitura e que são empregadas para o armazenamento temporário de dados (e/ou
programas); e (ii) ROM (Read Only Memory – Memória de Somente Leitura), capaz de efetuar
somente a operação de leitura, sendo empregada para armazenar programas e/ou dados
permanentes;
Interfaces de E/S empregados para compatibilizar os diferentes periféricos de E/S ao sistema
de Buses do μP;
um sistema de comunicação com três Buses, designados de Bus de Dados, Bus de Endereços e
Bus de Controle;
Periféricos de E/S para comunicação com o usuário e/ou armazenamento de dados em grande
quantidade e de forma não volátil2;
circuito de Clock para determinar a velocidade de execução das instruções e,
consequentemente, a velocidade na execução de programas; e
circuito de Reset empregado para inicializar o microcomputador ao ser energizado ou reiniciálo manualmente, no caso de travamento do programa ou reinício de operação.
2
Um sistema de armazenamento não volátil retém informações sem necessitar de fonte de energia como, por exemplo,
HDs, pen drivers, sistemas de back-up, entre outros.
Estudo do Microcontrolador Hipotético
Página 7
I.3. Microcontrolador
Um microcontrolador é um microcomputador encapsulado em um CI que pode conter, além
da CPU, memórias RAM e/ou ROM, Interfaces de E/S, circuitos de Clock e Reset, entre outros,
conforme ilustrado na figura 5.
Figura 5 – Microcontrolador é um microcomputador encapsulado em um CI.
Os fabricantes integram em seus microcontroladores diferentes componentes buscando
minimizar a conexão de circuitos externos e, com isso, facilitar o desenvolvimento de aplicações.
Assim, um microcontrolador pode ser comercializado com diferentes configurações, de acordo com os
componentes incorporados, que podem incluir: conversor A/D (analógico/digital), conversor D/A
(digital/analógico), PWM (Pulse Width Modulation - Modulação por Largura de Pulso), contadores,
temporizadores, interface serial, entre outros, bem como diferentes tipos memória (ROM, EPROM,
EEPROM, FLASH, RAM) e com diferentes capacidades.
Em geral, os microcontroladores são utilizados em aplicações nas quais não há a necessidade
da flexibilidade de interfaceamento dos microprocessadores com memórias e periféricos, bem como o
software que ele executa é único, é armazenado em ROM e é denominado de Firmware.
Dentre inúmeras aplicações, os microcontroladores são encontrados em dispositivos pessoais
móveis (tal como: celular, máquina fotográfica, câmera digital, reprodutores DVD e MP3, GPS, pen
drivers, calculadora etc), eletrodomésticos (televisor, lavadora de roupas e louças, forno de
microondas, videogame, ar condicionado, central de alarme etc), instrumental eletrônico
(osciloscópio, analisador de espectro, analisador lógico, frequencímetro, fontes programáveis etc),
equipamentos médico-hospitalares (medidor de pressão, monitor cardíaco, medidor de glicemia,
tomógrafo etc), equipamentos de automação bancária e comercial (caixa registradora, balança
Estudo do Microcontrolador Hipotético
Página 8
eletrônica, terminal de auto-atendimento, leitor de código de barras, impressora, máquina de café
etc), equipamentos de informática (teclado, monitor LCD, unidade de disco, roteador, modem,
impressora, escâner etc), equipamentos de automação industrial (inversor de frequência, controlador
de temperatura, robô, veículo auto-guiado, esteira, misturador, máquina operatriz etc). A figura 6
ilustra algumas destas aplicações.
Figura 6 – Exemplos de aplicação para o microcontrolador.
Estudo do Microcontrolador Hipotético
Página 9
II. MICROCONTROLADOR HIPOTÉTICO
Nesta seção, será desenvolvido o estudo de uma arquitetura simplificada de um
microcontrolador hipotético, com uma estrutura tenuamente assemelhada ao microcontrolador
8051.
Importante destacar que, por se tratar de um modelo didático, não são detalhados os aspectos
de implementação dos seus componentes, bem como foram adotadas inúmeras simplificações,
objetivando facilitar a sua compreensão.
II.1. Modelo do Programador
Para iniciar o estudo, apresenta-se o modelo do programador que é a representação do
diagrama funcional da arquitetura do microcontrolador, sem a preocupação do detalhamento e da
operação do hardware.
O sistema proposto, ilustrado na figura 7, é constituído pelos seguintes componentes:
a) Unidade Central de Processamento (CPU), com dois registradores de oito bits (um byte)
denominados de A e B; Unidade Lógica e Aritmética (ULA); e Bus de dados de oito bits. A
Unidade de Controle não está representada no modelo;
b) Memória de dados3 - RAM de 128 bytes;
c) Memória de programa (Firmware) – ROM de 1 K (1.024) bytes; e
d) Porta de Entrada/Saída (P0) de oito bits para conexão de periférico de E/S.
3 A separação entre memória de dados e memória de programas é conhecida com arquitetura Harvard (por ter sido
proposta nesta universidade). Caso um único espaço de memória seja compartilhado entre dados e programas, a
arquitetura é conhecida com von Neumann (proposta concebida pelo matemático húngaro John von Neumann – biografia
em http://pt.wikipedia.org/wiki/John_von_Neumann, última consulta em 27 de outubro de 2009).
Estudo do Microcontrolador Hipotético
Página 10
Figura 7 – Modelo do programador para o microcontrolador hipotético.
II.2. Operação do Microcontrolador
Para a compreensão do funcionamento do microcontrolador, quando da execução do
Firmware, será empregado o diagrama funcional apresentado na figura 8.
Figura 8 – Diagrama funcional do microcontrolador hipotético.
O programa que o microcontrolador executa é denominado de Firmware, que deve ser
carregado na memória de programa (ROM). A CPU, ao ser energizada, sofre um Reset fazendo com que
a primeira instrução do programa, localizada no endereço 0000H4 da ROM, seja buscada da memória,
decodificada e executada. Assim, este processo de busca, decodificação e execução é repetido para
cada instrução, até que uma instrução de fim de programa seja encontrada. O sinal de clock determina
a velocidade de realização das operações e, portanto, quanto maior for a frequência do clock, mais
rápida será a execução do programa.
Cada instrução é identifica por uma única codificação binária, denominada de código de
operação (operation code - opcode, em inglês) que a identifica entre as demais. Este opcode é lido da
memória ROM e carregado na Unidade de Controle.
4
O sufixo ″H″ indica um número no sistema de numeração hexadecimal.
Estudo do Microcontrolador Hipotético
Página 11
A Unidade de Controle decodifica o opcode e produz uma sequência de sinais elétricos que
ativam os componentes envolvidos com a execução da instrução. Os sinais de controle definem, assim,
o fluxo de dados entre os componentes que integram o microcontrolador.
O fluxo de dados ocorre com operações envolvendo a porta P0, os registradores A e B, a ULA, a
memória RAM e a memória ROM.
Essas operações são definidas pelas instruções e compreendem, como por exemplo, o seguinte
fluxo de dados:
• carregar o dado armazenado na porta P0, oriundo do periférico de entrada, para o
registrador A (A ← P05);
• carregar o dado armazenado no registrador A para a porta P0 e, consequentemente, ao
periférico de saída (P0 ← A);
• carregar o dado armazenado no registrador A para uma posição da memória RAM
(M[end]6 ← A);
• carregar o dado armazenado na memória RAM para o registrador A (A ← M[end]);
• carregar o dado armazenado no registrador A para o registrador B e vice-versa (B ← A
e A ← B);
• efetuar operações aritméticas (soma e subtração) entre os registradores A e B e salvar o
resultado no registrador A (A ← A + B e A ← A - B);
• efetuar operações lógicas (E, OU e Comparação) entre os registradores A e B (A ← A ∧
B7, A ← A ∨ B8 e A <= B);
• efetuar o complemento do conteúdo do registrador A (A ← ~A9); e
• desviar o fluxo de execução do programa, modificando-se o registrador (não
representado no diagrama da figura 7 por se tratar de registrador de uso especial) que
endereça a próxima instrução a ser executada.
5 Esta
notação é empregada para indicar o fluxo do dado, sendo o componente situado à direita da seta a fonte do dado e o
componente à esquerda o destino dado (destino ← fonte).
6 Utiliza-se a notação M[end] para indicar uma posição de memória, sendo o endereço colocado entre os colchetes.
7 O sinal de “∧” é empregado para representar a operação lógica E (AND).
8 O sinal de “∨” é empregado para representar a operação lógica OU (OR).
9 O sinal de “~” é utilizado para representar a operação lógica de complemento (inversão).
Estudo do Microcontrolador Hipotético
Página 12
II.3. Hardware do microcontrolador hipotético
O diagrama em blocos apresentado na figura 9 detalha o hardware do microcontrolador hipotético.
Figura 9 – Detalhamento do hardware do microcontrolador hipotético.
Estudo do Microcontrolador Hipotético
Página 13
II.4. Descrição do Hardware
O estudo do hardware do microcontrolador hipotético inicia-se pelo Bus de dados que tem por
finalidade possibilitar a transferência de dados entre os componentes que constituem a CPU.
Fisicamente, este Bus é o agrupamento de oito condutores paralelos aos quais são conectados os
registradores, buffers e memórias.
O princípio de operação do Bus, por se tratar de um recurso compartilhado, exige uma
disciplina no seu emprego. Em geral, um determinado componente tanto pode disponibilizar um dado
no Bus, quanto capturá-lo. Alguns componentes realizam ambas as operações, como os registradores
A e B, a memória RAM e a porta P0. Os registradores MRAM, Tmp1, Tmp2, PC e IR somente capturam
o dado do Bus. O buffer da saída da ULA e a memória ROM somente disponibilizam seus dados para o
Bus.
Para se implementar um sistema de Bus, para cada bit do dado, são necessários os
componentes apresentados na figura 10.
Figura 10 – Componentes necessários para se implementar um bit do Bus de dados.
De acordo com a figura 10, cada bit deve possuir dois componentes: (i) um flip-flop tipo D
(latch); e (ii) um buffer tri-state. O flip-flop é responsável pela captura do dado presente no Bus,
enquanto o buffer tri-state é responsável por disponibilizar o bit carregado no latch.
Na operação do latch, o bit do dado presente no Bus é capturado (Q ← D) quando o sinal Clk
(Clock) provocar uma borda de subida. Caso não ocorra esta borda, o latch mantém o bit previamente
armazenado (Q = Qo).
O buffer tri-state opera como uma chave controlada eletricamente pela entrada de controle E’
(Enable - habilitação). Se a entrada de controle E’ for ativada (E’ = 0), a saída Y terá o mesmo valor da
entrada A, ou seja, o buffer comporta-se como uma chave fechada (Y = A). Se a entrada E’ for
desativada (E’ = 1), a saída Y estará em estado de alta impedância, neste caso, o buffer é uma chave
aberta (Y = alta impedância). Importante observar que o buffer tri-state não efetua o armazenamento,
apenas conecta ou desconecta eletricamente o componente ao Bus.
A CPU do microcontrolador hipotético foi concebida como um circuito síncrono, no qual as
transferências de dados entre os diversos componentes ocorrem sob o comando de pulsos de Clock
(Clk), oriundos do circuito de Clock, conforme ilustra a figura 11.
Estudo do Microcontrolador Hipotético
Página 14
Figura 11 – O circuito de Clock sincroniza a transferência de dados entre os componentes da CPU.
Para possibilitar a transferência de dados entre os n componentes (C1, C2, ..., Cn) interligados
ao Bus, dois sinais de controle são necessários: (i) Ei’ – sinal de controle de habilitação do buffer tristate, responsável por disponibilizar dados no Bus; e (ii) Li – sinal de controle de captura ou carga (L
de Load – carga em português) do bit do dado presente no Bus.
A implementação de um registrador de um bit (bloco C da figura 11) é realizada pelo esquema
apresentado na figura 12.
Figura 12 – (a) Diagrama em blocos do registrador de um bit. (b) Implementação do registrador.
De acordo com a figura 12 (a), o registrador de um bit contém o latch, o buffer tri-state e um
multiplexador (Mux) 2:1. O Mux, sob o comando do sinal de controle L, seleciona ou o bit do dado
presente no Bus (entrada A), ou o bit previamente armazenado no latch (entrada B). Caso a entrada A
seja selecionada, na próxima ocorrência de uma borda de subida em Clk, o latch armazenará o bit do
dado presente no Bus. Caso a entrada B seja selecionada, na próxima ocorrência da borda de subida
em Clk, o latch realimentará o bit previamente armazenado, ou seja, mantém inalterado o bit do dado
armazenado no latch.
A figura 12 (b) apresenta o circuito que implementa este registrador de um bit, sendo o
multiplexador formado pelas portas P1, P2, P3, P4 e P5.
Para a implementação de um registrador paralelo de oito bits, como é o caso dos registradores
A e B do microcontrolador hipotético, o circuito deve ser o apresentado na figura 13.
Estudo do Microcontrolador Hipotético
Página 15
Figura 13 – (a) Circuito do registrador de oito bits. (b) Representação sob a forma de bloco.
No circuito da figura 13 (a), observa-se que os terminais Clk devem ser interligados, assim
como os terminais E’ e os terminais L e L’, aos oito conjuntos de flip-flops, buffer
tri-state e portas dos multiplexadores, também, cada bit do conjunto deve ser conectado a uma
linha do Bus de dados.
A figura 13 (b) corresponde à representação do registrador de oito bits sob a forma de blocos.
Observar que é exatamente esta a representação do registrador B, conforme o detalhamento do
hardware apresentado na figura 9.
O registrador A, apresentado na figura 14, é implementado de forma semelhante ao
registrador B, com a adição de um circuito detector de zero, responsável pelo sinal denominado de
Zero A. O circuito que implementa o detector de zero é uma porta NOU, cujas entradas estão ligadas
aos oito bits do registrador A. Assim, a saída Zero A assumirá o valor 1, se, e somente se, o registrador
A contiver o valor 000000002. A saída Zero A, sob o controle de uma porta E, é aplicada, ao flip-flop
que armazena este bit sinalizador (um sinalizador é denominado, em inglês, de flag). A saída do flag
ZA é levada à Unidade de Controle para ser empregado nas instruções de desvio condicional JZ e JNZ,
a serem apresentas na seção II.4.2.
Estudo do Microcontrolador Hipotético
Página 16
Figura 14 – Implementação do registrador A, com o flag Zero (ZA).
A porta P0, empregada para conectar periféricos de Entrada/Saída ao microcontrolador, é
constituída pelos componentes representados na figura 15.
Estudo do Microcontrolador Hipotético
Página 17
Figura 15 – Representação e implementação da porta P0.
De acordo com a figura 15, a estrutura da porta P0 é semelhante a dos registradores A e B, com
a adição de circuitos isoladores-inversores (MOSFETs) ligados às saídas Q’s dos flip-flops. Estes
isoladores operam como buffers inversores, podendo fornecer maiores correntes ao periférico de
Estudo do Microcontrolador Hipotético
Página 18
saída em relação aos níveis de corrente fornecidos pelos flip-flops. Como o bit do flip-flop é obtido da
saída Q’ e este é invertido pelo MOSFET, o nível lógico presente no pino P0.i (para i={0, 1, 2, 3, 4, 5, 6 e
7}) tem o mesmo valor do bit armazenado no flip-flop.
Na operação da porta P0 como saída, ou seja, o periférico recebe o dado do microcontrolador,
os bits de dado devem ser capturados do Bus e armazenados nos flip-flops. Este armazenamento irá
ocorrer quando a entrada LP0 receber nível lógico alto e o sinal Clk apresentar uma borda de subida.
Se LP0 receber um nível lógico baixo, o bit armazenado no flip-flop é realimentado para a entrada D,
não alterando o estado do flip-flop, mesmo quando este recebe uma borda de descida na entrada Clk.
Assim, caso, o flip-flop P0i tenha armazenado o bit “1”, a saída Q‘ terá o valor “0”, fazendo com
que o MOSFET opere em corte. Nesta situação, não há corrente de dreno (Id = 0) e o nível lógico alto é
aplicado ao pino P0.i, via resistor RPU10. Para um bit “0” armazenado no flip-flop, a saída Q’ terá valor
“1”, saturando o MOSFET. Nesta condição, a corrente de dreno é máxima e a tensão Vds será próxima
de 0 Volt, o que corresponde a nível lógico “0”.
Na operação como entrada, ou seja, o periférico fornece um dado para o microcontrolador, os
bits presentes nos pinos P0.0 a P0.7 são disponibilizados no Bus, quando a entrada EP0’ for ativada
(EP0’ = 0) e devem ser capturados pelo registrador A (neste microcontrolador hipotético, apenas o
registrador A é empregado nas operações de entrada/saída com periféricos).
Como, para a operação de entrada, há um MOSFET ligado ao pino P0.i e este, ou encontra-se
cortado ou encontra-se saturado, o estado do transistor pode alterar o bit fornecido pelo periférico.
Esta situação ocorre se o MOSFET estiver saturado e um nível lógico “1” for aplicado ao pino P0.i.
Neste caso, a tensão no pino é “puxada” para baixo e o bit lido será “0”. Para evitar este problema,
deve-se previamente carregar a porta P0 com o valor 111111112, levando os oito MOSFETs ao estado
de corte.
A Unidade Lógica e Aritmética (ULA), apresentada na figura 16, é um circuito combinacional11
responsável pela execução das operações lógicas e aritméticas
10
11
RPU – Resistor de Pull Up (elevador)
Um circuito combinacional não tem elementos de memória, assim a saída só depende dos valores da suas entradas.
Estudo do Microcontrolador Hipotético
Página 19
Figura 16 – Estrutura da Unidade Lógica e Aritmética (ULA).
De acordo com a figura 16, a ULA possui duas entradas (A e B) para operandos de um byte,
uma saída (F) de oito bits, uma entrada de carry (Cyi), uma saída de carry (Cyo) e seis entradas de
seleção da operação, sendo: ADD (soma), SUB (subtração), ANL (E lógico), ORL (OU lógico), CPL
(Complemento) e CMP (Comparação). Os operandos manipulados pela ULA devem ser capturados do
Bus de dados e carregados nos registradores temporários (Tmp1 e Tmp2). O resultado da operação
obtido na saída da ULA (F) é liberado para o Bus de dados quando o sinal EULA’ do buffer tri-state for
ativado (EULA’ = 0). O bit de carry (transporte) é gerado pela ULA para informar o estado das
operações aritméticas (ADD, SUB e CMP) e carregado no flip-flop Cy. Este bit de carry pode ser
empregado tanto pela própria ULA quanto pela Unidade de Controle para operações de desvio
condicional JC (jump if carry – salta se houver transporte) ou JNC (jump if not carry – salta se não
houver transporte)12. O flip-flop Cy é denominado de flag (sinalizador) de carry.
A memória de dados é uma RAM com 128 bytes (128 posições com oito bits por posição),
conforme ilustra o diagrama em blocos da figura 17.
Figura 17 – Diagrama da memória RAM e componentes associados.
Para endereçar esses 128 bytes são necessárias sete linhas de endereços (A0 a A6) e oito
linhas de dados (D0 a D7). O endereçamento da RAM é efetivado pelo registrador MRAM de oito bits,
que captura o endereço do Bus de dados quando a entrada LMRAM é ativada e ocorre uma borda de
subida em Clk.
A RAM possui duas entradas de controle, compreendendo: (i) CE’ (Chip Enable – habilitação da
pastilha) destinada ao controle do estado de alta impedância da RAM; e (ii) WE’ (Write Enable –
habilitação de escrita) destinada a definir se a operação na RAM será de escrita (R/W’ = 0) ou de
leitura (R/W’ = 1).
Como a RAM possibilita tanto a escrita (gravação) como a leitura (recuperação), o sinal R/W'
deve ser gerado pela Unidade de Controle quando uma instrução envolvendo a memória de dados for
executada.
Uma operação de escrita de um byte na RAM ocorre de acordo com a seguinte sequência de
operações: (i) o endereço da posição onde o byte será gravado deve ser carregado no registrador
12 Estas duas instruções JC e JNC não são implementadas, sendo indicadas como exercício complementar ao estudante.
Estudo do Microcontrolador Hipotético
Página 20
MRAM; (ii) o byte a ser armazenado na memória deve ser disponibilizado no Bus de dados; e (iii) a
Unidade de Controle determina que R/W' ← 0 (indicando uma operação de escrita) e CERAM’ ← 0 .
Uma operação de leitura de um byte da RAM ocorre de acordo com a seguinte sequência de
operações: (i) o endereço da posição de onde o byte será lido deve ser carregado no registrador
MRAM; (ii) a Unidade de Controle faz R/W' ← 1 (indicando uma operação de leitura) e CERAM’ ← 0; e
(iii) o dado liberado pela RAM será capturado por algum componente, de acordo com a instrução que
estiver sendo executada.
A ROM é empregada para armazenar as instruções que compõem o Firmware e possui
organização de 1 Kbytes (1.024 posições x 8 bits por posição). Para acessar as 1.024 posições são
necessárias 10 linhas de endereço (A0 a A9) e oito linhas de dados (D0 a D7) para a saída dos bytes
armazenados, conforme apresentado na figura 18.
Figura 18 – Estrutura da memória de programa (ROM).
O endereço de 10 bits é proveniente do registrador de endereçamento da ROM (MROM). Como
este registrador tem 16 bits, e somente 10 bits (A0 a A9) são utilizados, os 6 bits excedentes podem
ser empregados para expansão de memória, pois com 16 bits é possível endereçar até 65.536
posições = 64 K = 216.
O registrador MROM possui uma entrada para o sinal de Clock (Clk) e duas entradas de
controle, sendo: (i) entrada de carregamento (LMROM) que, quando ativada, carrega os 16 bits
oriundos do registrador Contador de Programa (PC) na próxima subida de Clk; e (ii) sinal de
incremento (+1MROM) que, quando ativado, incrementa em uma unidade o conteúdo de MROM. Este
sinal de +1MROM será ativado no processo leitura de dados ou endereços para determinadas
instruções, a ser detalhado no item II.4.1.
Quando a ROM é endereçada, o byte armazenado no endereço presente no MROM será
disponibilizado na saída de dados (pinos D0 a D7) e, portanto, no Bus de dados, após a ativação do
sinal OEROM‘ (Output Enable – habilitação de saída da ROM).
O Contador de Programa (PC – Program Counter), apresentado na figura 19, é o registrador
que retém o endereço do próximo opcode a ser buscado da ROM, ou seja, o PC contém o endereço da
próxima instrução a ser executada pela CPU.
Estudo do Microcontrolador Hipotético
Página 21
Figura 19 – (a) Diagrama dos registradores PC e MROM. (b) Composição do registrador PC.
O PC possui cinco entradas de controle sendo: (i) sinal de Clock (Clk); (ii) sinal de incremento
(+1PC) que, quando ativado, incrementa em uma unidade o conteúdo do PC (PC ← PC + 1); (iii) sinal
de carregamento (LPC) que habilita o carregamento de 8 bits do Bus de dados; (iv) sinal de limpeza
(CLRPC) que, quando ativado, zera o PC (PC ← 0000H); e (v) sinal de deslocamento para a esquerda
(SL8 – Shift Left), cuja finalidade é carregar os 8 bits menos significativos nos 8 bits mais significativos
do PC. Isto permite carregar 16 bits no PC a partir do Bus de dados, cujo tamanho é de 8 bits, sendo
empregado para carregar no PC um endereço de desvio, que ocorre nas instruções de salto (Jump).
A Unidade de Controle é constituída por um conjunto de circuitos responsável pela geração de
todos os sinais de controle do microcontrolador, abrangendo os componentes integrantes da CPU
(registradores de uso geral, registradores de uso específico, buffers tri-state e ULA), das memórias
RAM e ROM e da porta de saída P0.
Os sinais de controle são ativados seletivamente pela Unidade de Controle, de acordo com a
instrução que está sendo executada. Assim, uma instrução envolve um conjunto específico de sinais
de controle denominados de microinstruções, sendo detalhada no item II.5.
A execução completa de uma instrução, ou do seu conjunto de microinstruções, envolve três
ciclos, representados sob a forma de fluxograma na figura 20, e que são denominados de: (i) ciclo de
busca do opcode (opcode fetch); (ii) ciclo de decodificação; e (iii) ciclo de execução.
Estudo do Microcontrolador Hipotético
Página 22
Figura 20 – Ciclos de busca, decodificação e execução do programa (Firmware).
De acordo com a figura 20, após o Reset a Unidade de Controle realiza a busca de um código de
operação (opcode) na memória de programa (ROM). O opcode é, em seguida, decodificado visando
identificar se ele existe ou não e de que instrução ele se trata. No caso do opcode ser válido, a
instrução é executada e a Unidade de Controle retoma o ciclo de busca para um novo opcode. A
sequência do ciclo busca-decodifica-executa só é encerrada quando um opcode inexistente é buscado
da memória. Para retirar o microcontrolador do estado de parado, deve-se acionar o botão de Reset, o
que ocasiona o reinício da busca do primeiro opcode existente na ROM.
O conjunto de circuitos responsável pelos eventos descritos é denominado de Unidade de
Controle, cujo diagrama em blocos está apresentado na figura 21.
Estudo do Microcontrolador Hipotético
Página 23
Figura 21 – Estrutura da Unidade de Controle.
Para o diagrama da figura 21, ao se energizar o microcontrolador o sinal de Reset, produzido
pela rede RC, é aplicado à Unidade de Controle, informando que a execução do Firmware deve ser
iniciada. A partir do Reset, a Unidade de Controle inicia o ciclo de busca do opcode na memória ROM,
carregando-o no Registrador de Instrução (IR). Uma vez que o opcode foi armazenado no IR, inicia-se
o ciclo de decodificação, que ocorre quando o opcode é recebido pelo bloco denominado de
Decodificador de Instruções, cuja finalidade é ativar uma única saída correspondente ao código de
operação da instrução, mantendo as demais 16 saídas inativas. Em caso de opcode válido, ou seja, de
uma instrução existente, a Unidade de Controle inicia o ciclo de execução, ativando as microinstruções
correspondentes ao opcode decodificado. Uma vez concluído o ciclo de execução, a Unidade de
Controle retorna para um novo ciclo de busca. A parada do ciclo de busca - decodificação - execução
ocorre quando um opcode inválido for lido da ROM, o que, neste microcontrolador hipotético,
corresponde ao opcode fora do intervalo de 00H a 1FH (17 instruções válidas).
A velocidade de ativação dos sinais de controle, ou da execução das microinstruções, é
determinada pela frequência do sinal de Clock. Assim, quanto maior a frequência do Clock, mais rápida
será a execução do Firmware.
Estudo do Microcontrolador Hipotético
Página 24
Importante observar que os Flags de Cy e ZA, aplicados à Unidade de Controle, serão
empregados em instruções de desvio condicional, a ser abordado no item II.6.
O projeto do bloco da Lógica de Controle e Temporização pode ser desenvolvido segundo uma
das seguintes técnicas: (i) Controle Fixo13 (Hardwired Control); ou (ii) Controle por
Microprogramação (Microprogrammed Control). A técnica do Controle Fixo, a ser abordada neste
material, pode ser estudada a partir do diagrama em blocos apresentado na figura 22.
Figura 22 – Implementação da Unidade de Controle pela técnica de Lógica de Controle Fixo.
O bloco denominado de Lógica de Controle Fixo é um circuito combinacional que tem as
seguintes entradas: (i) os bits oriundos do Decodificador de Instruções; (ii) os pulsos de sincronização
gerados pelo Gerador de Temporização; (iii) os sinais dos Flag Cy e ZA; (iv) o sinal de sincronização
(Clk); e (iv) o sinal de Reset. Como saída, a Lógica de Controle Fixo produz os sinais de controle para
todos os componentes do hardware do microcontrolador.
De acordo com a figura 22, o Decodificador de Instruções é um circuito combinacional que
recebe como entrada o conteúdo do IR e leva a 1 a saída correspondente ao opcode válido. Assim, se o
opcode 00H for armazenado no IR, o qual corresponde à instrução NOP, a saída 00H irá para 1,
mantendo as demais em 0. Caso o Decodificador receba um opcode inválido, as 17 saídas terão valor 0,
ou seja, nenhuma saída será ativada. Neste microcontrolador hipotético, qualquer opcode inválido é
13 Também denominada de Lógica Aleatória.
Estudo do Microcontrolador Hipotético
Página 25
considerado como uma instrução de parada, cujo efeito é cessar a aplicação do sinal de Clock em todo
o hardware. O circuito que identifica o opcode inválido é denominado de Detector de opcode inválido e
é implementado com uma lógica OU envolvendo as 17 saídas do Decodificador de Instruções.
O bloco designado de Gerador de Temporização é um Contador em Anel (Ring Counter) que
produz as temporizações (T0, T1, ..., T5) e tem como função disciplinar a ativação dos sinais de
controle. A figura 23 apresenta as formas de onda geradas por este circuito.
Clk
T0
T1
T2
T3
T4
T5
Figura 23 – Formas de ondas geradas pelo Contador em Anel.
Para o projeto da Lógica de Controle Fixo, deve-se efetuar o estudo da execução das microinstruções
para cada uma das 17 instruções, incluindo o ciclo de busca do opcode na ROM. Este estudo é realizado por
intermédio dos diagramas de temporização dos sinais de controle, de acordo com o clock e os sinais
produzidos pelo Gerador de Temporização.
O diagrama de temporização para o ciclo de busca de opcode está apresentado na figura 24.
Estudo do Microcontrolador Hipotético
Página 26
Figura 24 – Diagrama de temporização para o ciclo de busca do opcode.
De acordo o diagrama de temporização da figura 24, a busca do opcode compreende os seguintes
eventos:
• no tempo de nível alto de T0, o sinal LMROM é ativado, habilitando o registrador MROM
receber o endereço diretamente do PC, responsável pelo armazenamento do endereço
da próximo opcode a ser buscado da ROM;
• na subida do Clk, em t2, ocorre o carregamento do endereço no MROM;
• a partir de t2, o endereço é aplicado aos pinos A0 até A9 da ROM (no tempo anterior à
t2, as linhas A0 até A9 continham o endereço do opcode da última instrução que fora
executada);
• em t3, quando inicia-se o tempo de nível alto de T1, os sinais CEROM’ e OEROM’ são
ativados, fazendo com que a ROM disponibilize o dado nas linhas D0 a D7, que, neste
caso, é o opcode;
• em T1, também é ativado o sinal LDIR, que habilita o carregamento do opcode no
registrador IR; e
• o carregamento do opcode no IR ocorre no tempo t4, quando há a subida do sinal Clk.
Observar que o ciclo de busca do opcode só necessita dos tempos T0 e T1. Os demais tempos do
Gerador de Temporização (T2 a T5), são empregados para os ciclos de decodificação e execução de cada
instrução.
Com base nos diagramas de temporização, pode-se mapear o momento em cada sinal de controle
será ativado de acordo com a instrução a ser executada, gerando uma matriz na qual as coordenadas das
linhas são os sinais de controle, as coordenadas das colunas o opcode decodificado e os elementos desta
matriz são os tempos T0 a T5, produzidos pelo Gerador de Temporização. A matriz dos sinais de controle
do microcontrolador hipotético está apresentada no quadro 1.
Estudo do Microcontrolador Hipotético
Página 27
T4
T4’
T3’
T3’
T3’
T2+T3
T3’
T3’
T2
T2+T3
T4’
T3
T3
T4’
06H
MOV A,n8
05H
T3’
T2
04H
T2
T2
03H
T2
T2+T3
02H
MOV B,#b MOV A,B MOV B,A MOV n8,A
T2
T2’
07H
MOV P0,A
T2
T2
08H
MOV A,P0
Estudo do Microcontrolador Hipotético
T4
T4
T4’
T4’
T4
T2
T2
T4
T3
T2
0AH
SUB
T3
T2
09H
ADD
T4’
T4
T4
T2
T3
T2
0BH
ANL
Página 28
T4’
T4
T4
T2
T3
T2
0CH
ORL
T4’
T4
T2
0DH
CPL
T4
T2
0EH
CMP
T4
T4
T3’+T5’
T3’+T5’
ZAT3+ZAT5
T3+T5
CERAM’
R/W’
LMRAM
EP0
LP0
Sinal
LS8
LMROM
ZAT2+ZAT4 +1MROM
T4
ZA’T3+ZA’T5 LPC
ZAT2+ZAT3 +1PC
11H
JZN
EULA’
CMP
CPL
ORL
ANL
SUB
ADD
LCy
LT1
LT2
LIR
ZAT3’+ZAT5’ ZA’T3’+ZA’T5’ OEROM’
ZAT3’+ZAT5’ ZA’T3’+ZA’T5’ CEROM’
ZA’T2+ZA’T4
ZA’T2+ZA’T3
10H
JZ
T2+T4
0FH
JMP
Quadro 1 – Matriz de tempos de ativação dos sinais de controle para cada instrução, incluindo a busca do
opcode.
T3’
T3’
T0
T1’
T1’
T1
LMROM
CEROM’
OEROM’
LIR
Sinal
LP0
EP0
LMRAM
R/W’
CERAM’
+1PC
LPC
LS8
+1MROM
LMROM
CEROM’
OEROM’
LIR
LT2
LT1
LCy
ADD
SUB
ANL
ORL
CPL
CMP
EULA’
Quadro 2 – Equações lógicas dos sinais de controle
Equação Lógica
08H.T2
07H.T2’
05H.T3+06H.T3
05H.T4’+06H.T4
05H.T4’+06H.T4
00H.T2+01H(T2+T3)+02H(T2+T3)+03H.T2+04H.T2+05H(T2+T3)+06H(T2+T3
)+07H.T2+08H.T2+09H.T2+0AH.T2+0BH.T2+0CH.T2+0DH.T2+0EH.T2+0FH(T2
+T4)+10H(ZA’T2+ZA’T3)+11H(ZAT2+ZAT3)
0FH(T3+T5)+10H(ZA.T3+ZA.T5’)+11H(ZA’.T3+ZA’.T5)
0FH.T4+10H.ZA.T4+11H.ZA’.T4
01H.T2+02H.T2+05.HT2+06.HT2+10H(ZA’.T2+ZA.T4)+11H(ZA.T2+ZA.T4)
T0
T1’+01.HT3’+02H.T3’+05H.T3’+06H.T3’+0FH(T3’+T5’)+10H(ZA.T3’+ZA.T5’)+11
H(ZA’.T3’+ZA’.T5’)
T1’+01.HT3’+02H.T3’+05H.T3’+06H.T3’+0FH(T3’+T5’)+10H(ZA.T3’+ZA.T5’)+11
H(ZA’.T3’+ZA’.T5’)
T1
09H.T3+0AHT3+0BHT3+0CHT3
09H.T2+0AHT2+0BHT2+0CHT2
09H.T4+0AHT4+0BHT4+0CHT4
09H.T4
0AH.T4
0BH.T4
0CH.T4
0DH.T4
0EH.T4
09H.T4’+0AH.T4’+0BH.T4’+0CH.T4’+0DH.T4’
Estudo do Microcontrolador Hipotético
Página 29
EULA’
CMP
CPL
ORL
ANL
SUB
ADD
LCy
LT1
+1MROM
LS8
LPC
+1PC
CERAM’
R/W’
LMRAM
EP0
LP0
LT2
T2
00H
T2
T2+T3
01H
MOV A,#b
NOP
Fetch
Sinal
A partir da matriz apresentada no quadro 1, pode-se equacionar os sinais de controle,
conforme apresentado na quadro 2.
LB
EB’
LA
EA’
LZA
02H.T3+04H.T2
03H.T2’+09H.T3’+0AH.T3’+0BH.T3’+0CH.T3’
01H.T3+03H.T2+06H.T4+07H.T2+09H.T4+0AH.T4+0BH.T4+0CH.T4
04H.T2’+05H.T4’+08H.T2’+09H.T2’+0AH.T2’+0BH.T2’+0CH.T2’+0DH.T2’
01H.T4+03H.T3+06H.T5+07H.T3+09H.T5+0AH.T5+0BH.T5+0CH.T5+0DH.T5
A partir destas equações, os circuitos para cada sinal de controle podem ser desenhados como,
por exemplo, o circuito do sinal LPC (do quadro 2, LPC = 0FH(T3 + T5) + 10H(ZAT3 + ZAT5’) +
11H(ZA’T3 +ZA’T5) = 0FH(T3 + T5) + 10HZA(T3 + T5’) + 11HZA’(T3 + T5)), apresentado na figura 25.
Figura 25 - Implementação do circuito para o sinal LPC.
II.5. Conjunto de Instruções
Uma instrução é uma ordem para que o hardware efetue alguma operação e produza algum
resultado. Uma sequência organizada de operações executada pelo hardware é denominada de
programa. Para se elaborar um programa, três conhecimentos devem ser dominados pelo
programador, compreendendo:
(i)
o algoritmo, que é o sequenciamento de operações que o hardware deve executar para
produzir o resultado desejado;
(ii)
os recursos que o hardware dispõe (registradores, operações da ULA, operações de E/S,
capacidade da memória RAM, entre outras) e como utilizá-los; e
(iii) o conjunto de instruções que o hardware é capaz de executar.
Estudo do Microcontrolador Hipotético
Página 30
A elaboração do algoritmo deve ser a primeira etapa a ser realizada na construção de um
programa. Uma vez concebida a solução algorítmica, ela deve ser codificada na linguagem de
programação do hardware. Assim, a codificação consiste em selecionar do conjunto de instruções
disponível aquelas que, quando executadas, produziram os resultados esperados.
Na sua forma mais reduzida, uma instrução é um código binário que deve ser armazenado na
memória de programa. Neste nível de hardware, a programação é denominada de linguagem de
máquina. Para se evitar a programação em linguagem binária utiliza-se a programação em um nível
de linguagem mais inteligível, denominada de linguagem de montagem (Assembly Language). Neste
nível de linguagem, cada instrução é escrita em uma forma mnemônica, de fácil leitura e
memorização.
O microcontrolador hipotético foi concebido para executar um conjunto simplificado de 17
instruções, observando o seguinte grupamento:
• instrução sem operação;
• instruções de movimento de dados;
• instruções lógicas;
• instruções aritméticas; e
• instruções de desvio.
O quadro 3 apresenta as 18 instruções que o microcontrolador é capaz de executar.
Quadro 3 – Conjunto de instruções do microcontrolador.
Opcode Mnemônico nBytes Operação
00
NOP
1
nenhuma
01
MOV
2
A ← byte; Se (A == 00H) ZA ← 1, Senão ZA ← 0
A,#byte
02
MOV
2
B ← byte
B,#byte
03
MOV A,B
1
A ← B; Se (A == 00H) ZA ← 1, Senão ZA ← 0
04
MOV B,A
1
B←A
05
MOV n8,A
2
RAM[n8] ← A
06
MOV A,n8
2
A ←RAM[n8]; Se (A == 00H) ZA ← 1, Senão ZA ← 0
07
MOV P0,A
1
P0 ← A
08
MOV A,P0
1
A ← P0; Se (A == 00H) ZA ← 1, Senão ZA ← 0
09
ADD A,B
1
A ← A + B; Se (A > FFH) Cy ←1, Senão Cy ← 0; Se (A == 00H) ZA ←
1, Senão ZA ← 0
0A
SUB A,B
1
A ← A - B; Se (A < 0) Cy ← 1, Senão Cy ← 0; Se (A == 00H) ZA ← 1,
Senão ZA ← 0
0B
ANL A,B
1
A ← A ^ B; Se (A == 00H) ZA ← 1, Senão ZA ← 0
0C
ORL A,B
1
A ← A ∨ B; Se (A == 00H) ZA ← 1, Senão ZA ← 0
0D
CPL A
1
A ← Ā; Se (A == 00H) ZA ← 1, Senão ZA ← 0
0E
CMP A,B
1
Se (A < B) Cy ← 1, Senão Cy ← 0
0F
JMP end16
3
PC ← end16
10
JZ end16
3
Se (ZA == 1) PC ← end16, Senão PC ← PC + 3
11
JNZ end16
3
Se (ZA == 0) PC ← end16, Senão PC ← PC + 3
Estudo do Microcontrolador Hipotético
Página 31
Na tabela 3, a coluna Opcode define o código de operação único de cada instrução e está
representado no sistema de numeração hexadecimal.
A coluna Mnemônico é a forma descritiva da instrução com a finalidade de facilitar a
memorização e leitura das instruções.
A coluna nBytes informa o tamanho da instrução em número de bytes. Este valor informa
quantas posições uma instrução ocupa na memória de programa (ROM). Conforme se observa na
tabela, o microcontrolador possui instruções de um, dois ou três bytes.
A coluna Operação é a representação simbólica da execução da instrução, com a indicação da
atuação dos flags ZA e Cy.
II.6. Descrição das Instruções
A seguir estão apresentadas as descrições de todas as instruções do microcontrolador.
Instrução: NOP (No Operation – Sem operação)
Opcode: 00H
Tamanho: 1 byte
Operação simbólica: Nenhuma
Ação: Não modifica o estado da CPU. Esta instrução é, em geral, empregada para duas finalidades: (i)
reservar espaço na memória de programa; e (ii) gastar tempo de execução do programa. Estas duas
finalidades serão abordadas na seção III, no assunto programação em assembly.
Exemplo:
Endereço(1) Código
Instrução
Comentário
0000
00
NOP
; sem operação
0001
00
NOP
; sem operação
0002
FF
END(2)
; fim do programa
(1) A coluna endereço indica a localização dos opcodes na memória ROM e, portanto, os
valores que o Contador de Programa (PC) assume na execução do programa.
(2) END não é uma instrução do microcontrolador. Ela é uma pseudo-instrução empregada
para informar ao hardware o término do ciclo de Busca.
Instrução: MOV A,#byte
Opcode: 01H
Tamanho: 2 bytes
Descrição: O prefixo “#” (sustenido) posicionado antes do byte, informa que o número que se segue é
uma constante de oito bits (um byte). O byte fonte será carregado no registrador destino A.
Operação simbólica: A ← byte; Se (A == 00H) ZA ← 1, Senão ZA ← 0.
Ação: Carrega o byte codificado após o sinal “#“ no registrador A. O byte é uma constante armazenada
na memória ROM, logo após o opcode da instrução MOV. O flag ZA é levado a 1 se o byte for igual a
00H. Caso o byte seja diferente de 00H, o flag ZA é levado a 0.
Estudo do Microcontrolador Hipotético
Página 32
Exemplo:
Endereço
0000
0002
Código
01 55
FF
Instrução
MOV A,#55
END
Comentário
; A ← 55H
; fim do programa
Resultado: A = 55H
Instrução: MOV B,#byte
Opcode: 02H
Tamanho: 2 bytes
Operação simbólica: B ← byte
Descrição: O prefixo “#” (sustenido) informa que o número que se segue é uma constante de oito bits
(um byte). O byte fonte será carregado no registrador destino B .
Ação: Carrega o byte definido após o sinal “#” no registrador B. O byte é uma constante armazenada
na memória ROM, logo após o opcode da instrução MOV.
Exemplo:
Endereço
0000
0002
Código
02 D3
FF
Instrução
MOV B,#D3
END
Comentário
; B ← D3H
; fim do programa
Resultado: B = D3H
Instrução: MOV A,B
Opcode: 03H
Tamanho: 1 byte
Descrição: O registrador B é a fonte do dado e o registrador A é o destino.
Operação simbólica: A ← B; Se (A == 00H) ZA ← 1, Senão ZA ← 0.
Ação: Carrega o registrador A com o byte armazenado no registrador B. Após a execução da instrução,
os registradores A e B terão os mesmos valores. Se o valor carregado no registrador A for igual a 00H,
o flag ZA será levado a 1, senão, será levado a 0.
.
Exemplo:
Endereço Código
Instrução
Comentário
0000
02 22
MOV B,#22
; B ← 22H
0002
03
MOV A,B
;A←B
0003
FF
END
; fim do programa
Resultado: A = 22H e B = 22H
Instrução: MOV B,A
Opcode: 04H
Estudo do Microcontrolador Hipotético
Página 33
Tamanho: 1 byte
Descrição: O registrador B é a fonte do dado e o registrador A é o destino.
Operação simbólica: B ← A.
Ação: Carrega o registrador B com o byte armazenado no registrador A. Após a execução desta
instrução os registradores A e B terão os mesmos valores.
Exemplo:
Endereço
0000
0002
0003
Código
01 4A
04
FF
Instrução
MOV A,#4A
MOV B,A
END
Comentário
; A ← 4AH
;B←A
; fim do programa
Resultado: A = 4AH e B = 4AH
Instrução: MOV n8,A
Opcode: 05H
Tamanho: 2 bytes
Descrição: O registrador A é a fonte do dado e o destino é a memória RAM, indicado por M[n8], onde
n8 é o endereço da posição destino. Como a RAM é de 128 bytes, o seguinte limite deve ser observado:
7FH ≥ n8 ≥ 00H (em decimal, 127 ≥ n8 ≥ 0).
Operação simbólica: M[n8] ← A.
Ação: Copia o byte armazenado no registrador A em uma determinada posição da memória RAM, cujo
endereço é o valor n8. Após a execução da instrução, o registrador A e a posição n8 da RAM terão os
mesmos valores.
Exemplo:
Endereço
0000
0002
0004
Código
01 7F
05 00
FF
Instrução
MOV A,#7F
MOV 00,A
END
Comentário
; A ← 7FH
; M[00] ← A
; fim do programa
Resultado: A = 7FH e M[00] = 7FH
Instrução: MOV A,n8
Opcode: 06H
Tamanho: 2 bytes
Descrição: A memória RAM é a fonte do dado e o registrador A é o destino. A posição da memória
RAM é indicada por M[n8], onde n8 é o endereço do byte que será carregado no registrador A.
Operação simbólica: A ←M[n8]; Se (A == 00H) ZA ← 1, Senão ZA ← 0.
Ação: O byte armazenado no endereço n8 da RAM é carregado no registrador A. Após a execução da
instrução, o registrador A e a posição n8 da RAM terão os mesmos valores.
Estudo do Microcontrolador Hipotético
Página 34
Exemplo:
Endereço
0000
0002
0004
0006
0008
Código
01 7F
05 00
01 22
06 00
FF
Instrução
MOV A,#7F
MOV 00,A
MOV A,#22
MOV A,00
END
Comentário
; A ← 7FH
; M[00] ← A
; A ← 22H
; A ← M[00]
; fim do programa
Resultado: A = 7FH e M[00] = 7FH (observar que a instrução MOV A,#22 não tem efeito ao final do
programa).
Instrução: MOV P0,A
Opcode: 07H
Tamanho: 1 byte
Descrição: O registrador A é a fonte do dado e a porta P0 é o destino.
Operação simbólica: P0 ← A
Ação: Copia na porta P0 o byte armazenado no registrador A, sendo este valor destinado ao periférico
de saída. Após a execução desta instrução, o registrador A e a porta P0 terão os mesmos valores.
Exemplo:
Endereço
0000
0002
0003
Código
01 F0
07
FF
Instrução
MOV A,#F0
MOV P0,A
END
Comentário
; A ← F0H
; P0 ← A
; fim do programa
Resultado: A = F0H e P0 = F0H
Instrução: MOV A,P0
Opcode: 08H
Tamanho: 1 byte
Operação simbólica: A ← P0; Se (A == 00H) ZA ← 1, Senão ZA ← 0.
Descrição: A porta P0 é a fonte do dado e o registrador A é o destino.
Ação: Copia no registrador A o byte armazenado na porta P0, sendo este valor oriundo do periférico
de entrada. Após a execução desta instrução, o registrador A e a porta P0 terão os mesmos valores.
Exemplo:
Endereço
0000
0001
Código
08
FF
Instrução
MOV A,P0
END
Comentário
; A ← P0
; fim do programa
Resultado: A = P0 (o valor de P0 corresponde ao byte fornecido pelo periférico de entrada).
Estudo do Microcontrolador Hipotético
Página 35
Instrução: ADD A,B
Opcode: 09H
Tamanho: 1 byte
Descrição: O registrador B e o registrador A são os operandos (ou parcelas) da soma. O resultado é
armazenado no registrador A.
Operação simbólica: A ← A + B; Se (A > FFH) Cy ←1, Senão Cy ← 0; Se (A == 00) ZA ← 1, Senão ZA
← 0.
Ação: Efetua a soma do conteúdo do registrador A com o conteúdo do registrador B e o resultado é
armazenado no registrador A. O valor anterior do registrador A é perdido. Caso o resultado da soma
seja maior do que 255 (FFH), o registrador A armazenará os oito bits menos significativos do
resultado e o flag de carry será levado ao estado de set (bit 1). Caso o resultado seja menor do que
255, o flag de carry é levado ao reset (bit 0). O flag ZA é levado ao set se o resultado da soma for igual a
00H. Caso o resultado da soma seja diferente de zero, o flag ZA é levado ao reset.
Exemplo:
Endereço
0000
0002
0004
0005
Código
01 5E
02 A7
09
FF
Instrução
MOV A,#5E
MOV B,#A7
ADD A,B
END
Comentário
; A ← 5EH
; B ← A7H
;A←A+B
; fim do programa
Operação:
ZA Cy registrador
binário
hexa decimal
A
0 1 0 1 1 1 1 0 5E
94
B
1 0 1 0 0 1 1 1 A7
167
0 1 A ← A + B 0 0 0 0 0 1 0 1 05
261*
* resultado: Cy = 1 e A = 05, onde: 256 (Cy) + 5 (reg. A) = 261
Resultado: A = 05H, B = A7H, ZA = 0 e Cy = 1
Instrução: SUB A,B
Opcode: 0AH
Tamanho: 1 byte
Descrição: O registrador B e o registrador A são os operandos da subtração. O resultado é
armazenado no registrador A.
Operação simbólica: A ← A - B;
Se (A < 00) Cy ←1, Senão Cy ← 0;
Se (A == 00) ZA ← 1, Senão ZA ← 0.
Ação: Efetua a subtração entre do conteúdo do registrador A e o conteúdo do registrador B, com o
resultado armazenado no registrador A. O valor anterior do registrador A é perdido. Caso o conteúdo
do registrador A seja menor do que o conteúdo do registrador B, antes da subtração, o flag de carry
Estudo do Microcontrolador Hipotético
Página 36
(na subtração funciona como borrow – empresta um) será levado a 1. Caso o conteúdo de A seja maior
do que o do B, o flag de carry é levado a 0. O flag ZA é levado a 1 se o resultado da subtração for igual a
00H. Caso o resultado seja diferente de 00H, o flag ZA é levado a 0.
Exemplo:
Endereço
0000
0002
0004
0005
Código
01 7F
02 A7
0A
FF
Instrução
MOV A,#7F
MOV B,#A7
SUB A,B
END
Comentário
; A ← 7FH
; B ← A7H
;A←A-B
; fim do programa
Operação: A subtração entre A e B (ou seja, A – B) é realizada pela ULA sob a forma: A + (-B), onde –B
é a representação em complemento de dois de B. O complemento de dois14 de um número binário b é
obtido efetuando-se o complemento de b (~b) e adicionando-se 1, ou seja: -b = ~b + 1.
Determinação do complemento de B
ZA Cy registrador
binário
hexa
B
1 0 1 0 0 1 1 1 A7
~B
0 1 0 1 1 0 0 0
+1
1
(-B)
0 1 0 1 1 0 0 1 59
Execução da subtração
A
0 1 1 1 1 1 1 1
+ (-B)
0 1 0 1 1 0 0 1
0 0 A ← A + (-B) 1 1 0 1 1 0 0 0
7F
59
D8*
decimal
127
89
216 (-40)
Resultado: A = D8H, B = A7H, ZA = 0 e Cy = 0
Instrução: ANL A,B
Opcode: 0BH
Tamanho: 1 byte
Descrição: O registrador B e o registrador A são os operandos da operação lógica E. O resultado é
armazenado no registrador A.
Operação simbólica: A ← A ∧ B; Se (A == 00) ZA ← 1, Senão ZA ← 0.
Ação: Efetua a operação lógica E (AND) entre do conteúdo do registrador A e o conteúdo do
registrador B, com o resultado armazenado no registrador A. O valor anterior do registrador A é
14
Na notação em complemento de dois, o bit mais significativo representa o sinal. Se este bit for igual a 1, o número é
negativo, se ele for igual a 0, o número é positivo. Para se encontrar o módulo deve-se efetuar a operação (~b + 1). Assim,
se b = D8H = 110110002, ele é um número negativo. O módulo vale: ~b = 001001112, ~b + 1 = 00101000 = 4010 e D8H = 4010.
Estudo do Microcontrolador Hipotético
Página 37
perdido. O flag ZA é levado a 1 se o resultado da operação E for igual 00H. Caso o resultado seja
diferente de 00H, o flag ZA é levado a 0.
Exemplo:
Endereço
0000
0002
0004
0005
Código
01 4A
02 A5
0B
FF
Instrução
MOV A,#4A
MOV B,#A5
ANL A,B
END
Comentário
; A ← 4AH
; B ← A5H
;A←A∧B
; fim do programa
Operação:
ZA registrador
A
0 1 0
B
1 0 1
1
A←A∧B 0 0 0
binário
hexa
0 1 0 1 0 4A
0 0 1 0 1 A5
0 0 0 0 0 00
Resultado: A = 00H, B = A5H e ZA = 1
Instrução: ORL A,B
Opcode: 0CH
Tamanho: 1 byte
Descrição: O registrador B e o registrador A são os operandos da operação lógica OU. O resultado é
armazenado no registrador A.
Operação simbólica: A ← A ∨ B; Se (A == 00) ZA ← 1, Senão ZA ← 0.
Ação: Efetua a operação lógica OU (OR) entre o conteúdo do registrador A e o conteúdo do
registrador B, com o resultado armazenado no registrador A. O valor anterior do registrador A é
perdido. O flag ZA é levado a 1, se o resultado da operação OU for igual 00H. Caso o resultado seja
diferente de 00H, o flag ZA é levado a 0.
Exemplo:
Endereço
0000
0002
0004
0005
Código
01 4A
02 A5
0B
FF
Instrução
MOV A,#4A
MOV B,#A5
ORL A,B
END
Comentário
; A ← 4AH
; B ← A5H
;A←A∨B
; fim do programa
Operação:
ZA registrador
A
0 1 0
B
1 0 1
0
A←A∨B 1 1 1
binário
hexa
0 1 0 1 0 4A
0 0 1 0 1 A5
0 1 1 1 1 EF
Estudo do Microcontrolador Hipotético
Página 38
Resultado: A = EFH, B = A5H e ZA = 0
Instrução: CPL A
Opcode: 0DH
Tamanho: 1 byte
Descrição: Esta é uma operação com um único operando armazenado no registrador A, que é tanto a
fonte quanto o destino.
Operação simbólica: A ← ~A; Se (A == 00) ZA ← 1, Senão ZA ← 0.
Ação: Efetua o complemento do conteúdo do registrador A. O valor anterior do registrador A é
perdido. O flag ZA é levado a 1 se o resultado da operação CPL for igual a 00H. Caso o resultado seja
diferente de 00H, o flag ZA é levado a 0.
Exemplo:
Endereço
0000
0002
0003
Código
01 83
0D
FF
Instrução
MOV A,#83
CPL A
END
Comentário
; A ← 83H
; A ← ~A
; fim do programa
Operação:
ZA registrador
binário
hexa
A
1 0 0 0 0 0 1 1 83
0
~A
0 1 1 1 1 1 0 0 7C
Resultado: A = 7CH e ZA = 0
Instrução: CMP A,B
Opcode: 0EH
Tamanho: 1 byte
Descrição: Os bytes armazenados nos registradores A e B são comparados e o flag Cy, se levado ao
estado de set, indicará a condição de A < B.
Operação simbólica: A - B; Se (A < B) Cy ←1, Senão Cy ← 0.
Ação: Efetua a subtração entre do conteúdo do registrador A e o conteúdo do registrador B, porém o
resultado é desprezado. Caso o conteúdo do registrador A seja menor do que o conteúdo do
registrador B, o flag de carry (na subtração funciona como borrow – empresta um) será levado ao
valor 1. Caso o conteúdo de A seja maior do que o B, o flag de carry é levado a 0.
Exemplo:
Endereço
0000
0002
Código
01 80
02 84
Instrução
MOV A,#80
MOV B,#84
Comentário
; A ← 80H
; B ← 84H
Estudo do Microcontrolador Hipotético
Página 39
0004
0005
0E
FF
CMP A,B
END
; compara A com B e afeta Cy
; fim do programa
Operação:
ZA Cy
registrador
binário
hexa
decimal
A
1 0 0 0 0 0 0 0 80
128
B
1 0 0 0 0 1 0 0 84
132
0 1
A-B
1 1 1 1 1 1 0 0 FC*
252 (-4)
* Resultado desprezado. Os conteúdos dos registradores A e B não se
alteram após a comparação.
Resultado:
A = 80H, B = 84H, ZA = 0 e Cy = 1
Instrução: JMP end16
Opcode: 0FH
Tamanho: 3 bytes
Descrição: O mnemônico JMP significa JuMP (salto) e a instrução é empregada para desviar o fluxo de
execução do programa. Este desvio é implementado com o carregamento do Contador de Programa
(PC) com o endereço da memória ROM para onde o programa deve ser executado.
Operação simbólica: PC ← end16
Ação: Efetua um desvio incondicional na execução do programa para o endereço codificado na
instrução (end16). Na execução desta instrução, o PC (Contador de Programa) assume os dois bytes
de end16. Os dois bytes de end16 devem compor um endereço válido no espaço de 1K da memória de
programa.
Exemplo: Implementar uma contagem crescente em módulo 25610 no registrador A, indefinidamente.
Endereço
0000
0002
0004
0005
0008
Código
01 00
02 01
09
0F 00 04
FF
Instrução
MOV A,#00
MOV B,#01
ADD A,B
JMP 0004
END
Comentário
; A ← 00H
; B ← 01H
; A ← A+ B
; PC ← 0004H
; fim do programa
Instrução: JZ end16
Opcode: 10H
Tamanho: 3 bytes
Descrição: O mnemônico JZ significa Jump Zero (salta se for zero) e a instrução é empregada para
desviar o fluxo de execução do programa, caso o byte armazenado no registrador A seja igual a 00H.
Estudo do Microcontrolador Hipotético
Página 40
Este desvio é implementado com o carregamento condicional do Contador de Programa (PC) com o
endereço da memória ROM para onde o programa deve ser executado.
Operação simbólica: Se (A == 00H) PC ← end16, Senão PC ← PC + 3;
Ação: Efetua um desvio na execução do programa, caso o conteúdo do registrador A seja igual a 00H.
Esta condição é definida pelo estado do flag ZA. Deste modo, se o flag ZA seja igual a 1, ou seja, o valor
corrente do registrador A é igual 00H, o PC é carregado com o endereço de desvio (PC ← end16), caso
contrário, o programa segue seu fluxo normal de execução (PC ← PC + 3).
Exemplo: Testar o conteúdo da porta P0. Caso ele seja igual a 00H, carregar o registrador B com o
byte 55H, caso contrário, carregá-lo com 66H.
Endereço
0000
0001
0004
0006
0009
000B
Código
08
10 00 09
02 66
09 00 0B
02 55
FF
Instrução
MOV A,P0
JZ 0009
MOV B,#66
JMP 000B
MOV B,#55
END
Comentário
; A ← P0
; se (A == 00H) PC ← 0009
; senão B ← 66H
; PC ← 000BH
; B ← 55H
; fim do programa
Instrução: JNZ end16
Opcode: 11H
Tamanho: 3 bytes
Descrição: O mnemônico JNZ significa Jump Not Zero (salta se não for zero) e a instrução é
empregada para desviar o fluxo de execução do programa, caso o byte armazenado no registrador A
seja diferente de 00H. Este desvio é implementado com o carregamento condicional do Contador de
Programa (PC) com o endereço da memória ROM para onde o programa deve ser executado.
Operação simbólica: Se (A != 00H) PC ← end16, Senão PC ← PC + 3;
Ação: Efetua um desvio, caso o conteúdo do registrador A seja diferente de 00H. Esta condição é
definida pelo estado do flag ZA. Deste modo, caso o flag ZA seja igual a 0, ou seja, o valor corrente do
registrador A é diferente de 00H, o desvio é executado (PC ← end16) . Caso contrário, o programa
segue seu fluxo normal de execução (PC ← PC + 3).
Exemplo: Testar o conteúdo da porta P0. Caso ele seja diferente de 00H, carregar o registrador B com
o byte 55H, caso contrário, carregá-lo com 66H.
Endereço
0000
0001
0004
0006
0009
000B
Código
08
11 00 09
02 66
09 00 0B
02 55
FF
Instrução
MOV A,P0
JNZ 0009
MOV B,#66
JMP 000B
MOV B,#55
END
Comentário
; A ← P0
; se (A != 00H) PC ← 0009
; senão B ← 66H
; PC ← 000BH
; B ← 55H
; fim do programa
Estudo do Microcontrolador Hipotético
Página 41
III. PROGRAMAÇÃO EM LINGUAGEM DE MÁQUINA
III.1. Linguagem de Programação
Os componentes eletrônicos que constituem o hardware operam em dois estados mutuamente
exclusivos (ligado ou desligado) para representarem os dois dígitos do sistema de numeração binário
(1 ou 0). Assim, um programa para ser interpretado pelo hardware deve ser carregado na memória
ROM tendo as suas instruções codificadas na forma binária. Este programa irá gerar no hardware a
execução das microinstruções que correspondem aos sinais de controle, gerados pela Unidade de
Controle, para os componentes envolvidos com as instruções, conforme apresentado na seção II.
Um programa em binário é denominado de programa em linguagem de máquina e era a forma
de programação dos primeiros computadores digitais desenvolvidos na década de 40. Esta forma de
programação é tediosa e sujeita a erros, pois, em um pequeno programa de 200 bytes, por exemplo,
necessita-se da codificação de 1.600 bits.
Para facilitar a leitura e codificação de programa em linguagem de máquina, pode-se representar
os número binários no sistema de numeração hexadecimal, em que cada nibble (1 nibble = ½ byte = 4
bits) equivale a 1 dígito hexadecimal. Assim, no programa de 200 bytes seriam necessários 100
dígitos hexadecimais.
Embora a codificação em hexadecimal simplifique o trabalho, a leitura e identificação do código,
ainda é difícil e sujeita a erros, principalmente se o programa não for pequeno (no máximo algumas
dezenas de bytes). Para tornar a leitura e a codificação mais próxima à linguagem humana, outro nível
de linguagem de programação foi desenvolvido - trata-se da programação em Linguagem de
Montagem (Assembly Language). Na programação, neste nível de linguagem, as instruções são
codificadas na sua forma mnemônica.
O processo de tradução do programa na forma mnemônica para programa em linguagem de
máquina é denominado de montagem e o programa computacional que realiza esta tarefa é
denominado de Programa Montador (Assembler Program).
Toda CPU tem uma linguagem mnemônica própria, definida pelo projetista em função dos
recursos de hardware disponíveis.
O próximo nível de programação, que se afasta do hardware e se aproxima mais ainda da
linguagem humana é denominada de programação em linguagem de alto nível (exemplo: C, Pascal,
Java, etc). Um programa denominado de Compilador é responsável pela tradução da linguagem de alto
nível para um programa assembly. Em geral, uma sentença na linguagem de alto nível é compilada em
várias instruções na linguagem assembly.
As linguagens de alto nível existem para desenvolver softwares de aplicação para os
computadores, tais como editores de texto, CADs, planilhas, jogos, etc.
A figura 26 ilustra estes níveis de linguagens de programação e os programas que convertem os
códigos para estes diferentes níveis.
Estudo do Microcontrolador Hipotético
Página 42
Figura 26 – Níveis de linguagens de programação.
Estudo do Microcontrolador Hipotético
Página 43
III.2. Programa Simulador
Para auxiliar no aprendizado do microcontrolador hipotético foi desenvolvido um programa
Simulador, escrito na linguagem C15 e que roda em DOS, cuja estrutura está apresentada na Erro!
Fonte de referência não encontrada..
SIMULADOR
Editor
do
Firmware
na ROM
Gravador
do Firmware
em Arquivo
Carregador
do
Firmware de
Arquivo
Firmware
Hexadecimal
Desmontador
do Firmware
Simulador
do Firmware
Editor
(Bloco de Notas)
Simulador
das
Microinstruções
Firmware
Mnemônico
Montador
Figura 27 – Estrutura do programa Simulador.
Os módulos que compõem o Simulador, compreendem:
• Editor do Firmware na ROM – Permite editar o código armazenado na memória ROM
(Firmware do microcontrolador hipotético).
• Gravador do Firmware em Arquivo – Possibilita armazenar, em disco, o Firmware que
está carregado na memória ROM.
• Carregador do Firmware de Arquivo – Permite ler, do disco, o Firmware e carregá-lo na
memória ROM.
• Desmontador do Firmware – Converte e apresenta o Firmware em linguagem
mnemônica.
• Simulador do Firmware – Executa, passo-a-passo, as instruções que compõem o código
do Firmware carregado na ROM.
• Simulador Microinstruções – Possibilita acompanhar, passo-a-passo, a ativação dos
sinais de controle (microinstruções) dos componentes que integram o hardware do
microcontrolador hipotético.
15
O Programa Simulador está disponível para download no endereço: www.pessoal.utfpr.edu.br/cion.
Estudo do Microcontrolador Hipotético
Página 44
O Firmware também pode ser digitado em um Editor externo ao Simulador, como, por exemplo,
o aplicativo Bloco de Notas do Windows. O arquivo deve ser salvo como texto puro e com extensão:
‘.TXT’.
Um programa Montador, independente do Simulador, foi desenvolvido para possibilitar a
programação na forma mnemônica. Este Montador efetua a conversão do arquivo com instruções
digitadas na forma mnemônica para os códigos hexadecimais lidos pelo módulo Carregador do
Firmware de Arquivo.
III.3. Operação do Simulador
Na execução do programa Simulador, a tela da Erro! Fonte de referência não encontrada. será
apresentada.
Figura 28 – Tela de entrada do programa Simulador.
Os seis módulos do Simulador podem ser selecionados de acordo com as teclas ‘1’ a ‘6’, além da
tecla ‘Q’ ou ‘q’ para sair do programa.
III.3.1. Módulo: Editor do Firmware na ROM
O módulo do Editor do Firmware na ROM possibilita modificar o conteúdo da memória ROM,
tendo como tela de entrada a apresentada na Erro! Fonte de referência não encontrada..
Estudo do Microcontrolador Hipotético
Página 45
Figura 29 – Tela de entrada do módulo do Editor do Firmware na ROM.
De acordo com a figura 29, ao entrar no módulo, são apresentada as opções de teclas de edição,
sendo:
• ‘0’ a ‘9‘, ‘A’ a ‘F’, para entrar com o novo byte na ROM (são necessários dois dígitos hexadecimais
para compor um novo byte);
• ‘←
←’, para corrigir somente o primeiro dígito fornecido (não é possível corrigir o último dígito
teclado);
• ‘Enter’ ou ‘↓
↓’, para avançar para o próximo endereço sem alterar o conteúdo (byte) do endereço
corrente;
• ‘↑’, para retroceder no endereço, sem alterar o conteúdo (byte) do endereço corrente; e
• ‘Q’ ou ‘q’, para sair deste módulo.
Para a edição do Firmware, o programa apresenta o endereço inicial da ROM (0000H) e o
conteúdo atualmente armazenado. No início de execução do Simulador, a ROM é totalmente
preenchida com o valor FFH, correspondendo à memória sem gravação.
A cada novo byte digitado, ou quando as teclas ‘Enter’ ou ‘↓
↓’ são pressionadas, o próximo
endereço e o seu conteúdo são apresentados. Este processo se repete até que a tecla ‘Q’ ou ‘q’ seja
pressionada.
Em seguida à tecla ‘Q’ ou ‘q’, todo o conteúdo da ROM é apresentado, possibilitando conferir a
editoração realizada no contexto deste módulo. A figura 30 apresenta a tela gerada para a visualização
do conteúdo da memória ROM, com organização sob o formato de matriz.
Estudo do Microcontrolador Hipotético
Página 46
Figura 30 – Apresentação do conteúdo da memória ROM, após a edição.
Na apresentação do conteúdo da ROM, a memória e particionada em três áreas (0000H a 013FH,
0140H a 027FH e 0280H a 03FFH), sendo inicialmente apresentada a área compreendida entre
0000H e 0013H. Para a apresentação das duas áreas complementares, deve-se digitar qualquer tecla,
exceto as teclas ‘q’ ou ‘Q’ empregadas para sair da apresentação da ROM.
Na tela da figura 30, os três dígitos das linhas da matriz correspondem à parte alta do endereço,
enquanto que o dígito na parte superior das colunas corresponde à parte baixa do endereço. Assim, a
tela da figura 30, tem a interpretação apresentada no quadro 4.
Quadro 4 – Conteúdo da ROM de acordo com a figura30.
Endereço Conteúdo
0000
01
0001
22
0002
02
0003
3A
0004
03
0005
FF
.
.
.
.
.
.
03FF
FF
O último endereço da ROM é 03FFH, pois esta memória tem organização de 1Kbytes (1.024
bytes).
III.3.2. Módulo: Gravador do Firmware em Arquivo
O módulo do Gravador do Firmware em Arquivo permite gravar o conteúdo da memória ROM
em arquivo. Este procedimento possibilitar salvar, em algum dispositivo de memória não volátil, o
Firmware em desenvolvimento, haja vista que eles são perdidos quando é encerrada a execução do
programa Simulador.
Estudo do Microcontrolador Hipotético
Página 47
A tela da figura Erro! Fonte de referência não encontrada.31 é apresentada na entrada deste
módulo.
Figura 31 – Tela de entrada do módulo: Gravador do Firmware em Arquivo.
De acordo com a tela da figura 31, pode-se optar por: (1) entrar com o caminho e nome do
Arquivo que receberá o Firmware que está armazenado na memória ROM; (2) empregar um Arquivo
Default com o diretório ‘C:/’ e nome ‘C1.TXT’ (ou seja: C:/C1.TXT); ou (‘Q’ ou ‘q’) para sair do módulo.
O arquivo gerado pode ser consultado por meio de Editor externo (exemplo: Bloco de Notas do
Windows), conforme apresentado na figura 32.
Figura 32 – Conteúdo gravado com o módulo Gravador do Firmware no arquivo C:/C1.TXT.
III.3.3. Módulo: Carregador do Firmware de Arquivo
O módulo do Carregador do Firmware de Arquivo permite efetuar o carregamento de Firmware
gravado em arquivo para a memória ROM, tendo como tela de entrada a apresentada na Erro! Fonte
de referência não encontrada..
Estudo do Microcontrolador Hipotético
Página 48
Figura 33 – Tela para a opção de carregamento do Firmware.
De acordo com a tela da figura 33, pode-se optar por: (1) entrar com o caminho e nome do
Arquivo que contém o Firmware que será armazenado na memória ROM; (2) empregar um Arquivo
Default com o diretório ‘C:/’ e nome ‘C1.TXT’ (ou seja: C:/C1.TXT); ou (‘Q’ ou ‘q’) para sair do módulo.
O código do Firmware deve estar gravado em um arquivo com somente texto (extensão: ‘TXT’ e
sem caracteres especiais de formatação), podendo-se utilizar o aplicativo Bloco de Notas do Window
para gerá-lo. Os bytes que constituem o Firmware devem ser digitados com os caracteres numéricos
(de ‘0’ a ‘9’) e caracteres alfabéticos do sistema hexadecimal (de ‘A’ a ‘F’) em caixa alta (maiúsculas),
conforme apresentado na figura 26.
Se não ocorrer erro no processo de leitura, cada byte do Firmware é carregado em posições
contíguas da memória ROM, conforme ilustra a Erro! Fonte de referência não encontrada..
Figura 34 – Firmware carregado na memória ROM.
Se a operação de leitura do arquivo não for bem sucedida, o Simulador informará com uma
mensagem de ERRO, de acordo com a tela apresentada na figura 35.
Estudo do Microcontrolador Hipotético
Página 49
Figura 35 – Mensagem de ERRO apresentada na ocorrência de falha na leitura do arquivo.
Em geral, um erro na leitura do arquivo decorre da especificação errada do seu nome ou do
diretório onde ele está armazenado.
III.3.4. Módulo: Desmontador do Firmware
O módulo do Desmontador do Firmware permite apresentar as instruções do Firmware
carregadas na ROM sob a forma mnemônica, tendo como tela de entrada a apresentada na figura 36.
Figura 36 – Tela apresentada no módulo Desmontador do Firmware.
Na tela da figura 36, a coluna ‘End.’ corresponde ao Endereço da memória ROM onde está
armazenado o código; a coluna ‘Hexa’ corresponde ao(s) byte(s) do código do Firmware; e a coluna
‘Mnemônico’ apresenta cada instrução na sua forma mnemônica. O mnemônico ‘END’, conhecido
como uma pseudo-instrução, foi automaticamente inserido pelo Simulador para indicar o fim do
Firmware.
No caso de erro na codificação de opcode, o Simulador informará esta condição com uma
mensagem, conforme apresentada na Erro! Fonte de referência não encontrada..
Estudo do Microcontrolador Hipotético
Página 50
Figura 37 – Mensagem de erro devido a um opcode inválido.
III.3.5. Modulo: Simulador do Firmware
O módulo do Simulador do Firmware permite apresentar a execução passo-a-passo das
instruções do microcontrolador, tendo como tela de entrada a apresentada na Erro! Fonte de
referência não encontrada..
Figura 38 – Tela gerada pelo módulo do Simulador do Firmware após a execução das instruções.
A cada instrução executada, o Simulador apresenta o estado (STATUS) do hardware que consiste
nas informações armazenadas nos registradores A e B, na porta P0, nos flags Cy e ZA e no PC.
Ainda, para as instruções ‘MOV n8,A’ e ‘MOV A,n8’, o conteúdo da RAM também é apresentado,
conforme ilustrado na Erro! Fonte de referência não encontrada..
Estudo do Microcontrolador Hipotético
Página 51
Figura 39 – Apresentação do conteúdo da RAM após operação com a memória.
Após a execução da última instrução, o Simulador entra em loop infinito, que é
observado quando o Contador de Programa (PC) não se altera mais. Nesta condição de loop infinito
faz-se necessário pressionar a tecla ‘Q’ ou ‘q’.
III.3.6. Módulo: Simulador das Microinstruções
O módulo do Simulador das Microinstruções permite acompanhar a ativação, passo-a-passo, dos
sinais de controle dos componentes que constituem o hardware do microcontrolador, tendo como tela
de entrada a apresentada na Erro! Fonte de referência não encontrada..
Estudo do Microcontrolador Hipotético
Página 52
Figura 40 – Tela de entrada do Simulador das Microinstruções.
Na apresentação da execução das microinstruções, o Simulador considera dois aspectos:
(i)
ao se iniciar a simulação, um sinal de Reset é aplicado ao hardware. Assim, todas as
instruções são buscadas no endereço 0000H da memória de programa (ROM); e
(ii)
para as opções de tecla igual a ‘3’ (MOV A,B) até a tecla ‘h’ (CMP A,B) são pré-definidos
os operandos fontes, cujos valores estão colocados entre parênteses, conforme
apresentado na figura 40.
Ao se teclar a opção disponível, o Simulador inicia com a ativação do sinal CLRPC (PC ← 0000H)
e segue ativando as demais microinstruções a cada tecla pressionada (exceto para a tecla ‘Q’ ou ‘q’,
empregadas para sair do módulo).
Ao se pressionar a tecla ‘5’, por exemplo, ocorre a simulação da instrução MOV 01,A (p/A=22H),
conforme apresentada na Erro! Fonte de referência não encontrada..
Figura 41 – Simulação da instrução MOV 01,A (p/A=22).
Estudo do Microcontrolador Hipotético
Página 53
Na simulação, cada tecla pressionada corresponde a um pulso de clock aplicado à Unidade de
Controle. Também, na simulação, conforme apresentado na figura 41, para cada sinal ativado é
possível visualizar o componente do hardware envolvido e o conteúdo nele carregado.
Após a ativação do último sinal de controle, que conclui a execução da instrução, o Simulador
apresenta o estado (STATUS DA CPU) final do hardware, abrangendo os registradores A e B; a porta
P0; os flags Cy e ZA; e o registrador PC.
Para as instruções que envolvem operações com a memória RAM (MOV n8,A e MOV A,n8), após a
apresentação do estado final do hardware, o conteúdo da RAM é mostrado, conforme apresentada a
Erro! Fonte de referência não encontrada..
Figura 42 – Conteúdo da memória RAM após instrução MOV 01,A (p/A=22).
Estudo do Microcontrolador Hipotético
Página 54
Download