Apostila de Programaç˜ao em 8051

Transcrição

Apostila de Programaç˜ao em 8051
1
Faculdade de Ciência e Tecnologia
Engenharia de Elétrica
Disciplina: Microprocessadores e Microcontroladores
Professor: Vitor Leão Filardi
Apostila de Programação em 8051
2
Sumário
1 Primeira Unidade
1.1 Explicação Intuitiva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Princı́pios Básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.1 Conceitos Básicos da Computação . . . . . . . . . . . . . . . . . . . . . . .
1.2.2 Blocos Básicos de microcomputadores . . . . . . . . . . . . . . . . . . . . .
1.3 Arquitetura do Microprocessador/Microcontrolador . . . . . . . . . . . . . . . . . .
1.4 A CPU Internamente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5 O Microcontrolador 8051 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5.1 Memória . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5.2 Circuito de Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5.3 O Gerador de Clock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5.4 Interrupção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5.5 Registro de Controle das Interrupções . . . . . . . . . . . . . . . . . . . . .
1.5.6 Tempo para Atendimento das Interrupções . . . . . . . . . . . . . . . . . .
1.5.7 Ajuste das Interrupções Externas para serem Ativas em Nı́vel ou Transição
1.5.8 Hardware para expandir as possibilidade de Interrupção Externa . . . . . .
1.5.9 Exercı́cios Resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5.10 Conjunto de Instruções . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 Segunda Unidade
2.1 Ciclos de Máquina . . . . . . . . . . . . . . . . . . . . . . .
2.2 Portas de I/O . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.1 Princı́pio de Funcionamento e Utilização . . . . . . .
2.2.2 Caracterı́sticas Gerais e de Tempo dos Ports . . . .
2.2.3 Uso das Portas de I/O para a Expansão da Memória
2.2.4 Seleção de Programa Externo ou Interno . . . . . . .
2.2.5 Uso dos Pinos da Porta 3 como funções Alternativas
2.2.6 Capacidade de Corrente nos Pinos de I/O . . . . . .
2.3 Modos de Endereçamento das Instruções . . . . . . . . . . .
2.3.1 Endereçamento por Registrador . . . . . . . . . . . .
2.3.2 Endereçamento Direto . . . . . . . . . . . . . . . . .
2.3.3 Endereçamento Indireto . . . . . . . . . . . . . . . .
2.3.4 Endereçamento Imediato . . . . . . . . . . . . . . .
2.3.5 Endereçamento Relativo . . . . . . . . . . . . . . . .
2.3.6 Endereçamento Absoluto . . . . . . . . . . . . . . .
2.3.7 Endereçamento Longo . . . . . . . . . . . . . . . . .
2.3.8 Endereçamento Indexado . . . . . . . . . . . . . . .
2.4 Temporizadores e Contadores . . . . . . . . . . . . . . . . .
2.4.1 Introdução . . . . . . . . . . . . . . . . . . . . . . .
2.4.2 Registros Envolvidos . . . . . . . . . . . . . . . . . .
2.4.3 Modos de operação . . . . . . . . . . . . . . . . . . .
2.4.4 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . .
3
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
de Dados e Programa
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7
7
8
8
9
12
13
14
15
21
24
25
29
32
32
33
34
36
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
41
41
42
42
45
46
47
47
48
48
48
48
49
50
50
51
51
51
52
52
52
55
58
4
3 Terceira Unidade
3.1 Comunicação Serial . . . . . . . . . . . . . . . .
3.1.1 Introdução . . . . . . . . . . . . . . . .
3.1.2 Registros Envolvidos . . . . . . . . . . .
3.1.3 Modos de Operação . . . . . . . . . . .
3.1.4 Cuidados com a Porta Serial . . . . . .
3.1.5 Comunicação entre vários 8051 . . . . .
3.1.6 Comunicação serial entre o 8051 e o PC
3.1.7 Exercı́cios . . . . . . . . . . . . . . . . .
3.2 Programação em Assembly . . . . . . . . . . .
3.2.1 Introdução teórica . . . . . . . . . . . .
3.2.2 Estratégias de elaboração de programas
3.2.3 Fluxogramas . . . . . . . . . . . . . . .
SUMÁRIO
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
65
65
65
65
67
70
72
73
74
76
76
77
78
Referências Bibliográficas
GIMENEZ, S. P. Microcontroladores 8051. [S.l.]: Editora Pearson Education do Brasil, 2002.
NICOLOSI, D. E. C. Microcontrolador 8051 Detalhado. [S.l.]: Editora Érica, 2000.
SILVA, V. P. da. Aplicações Práticas do Microcontrolador 8051. [S.l.]: Editora Érica, 1998.
5
Capı́tulo 1
Primeira Unidade
O que é Microcontrolador
1.1
Explicação Intuitiva
Vamos fazer de conta que somos meros aprendizes de cozinheiros, o chefe de cozinha teve que sair
e chega um pedido de uma torta de chocolate do gerente da casa. O primeiro passo que nos vamos
dar é em direção ao livro de receitas onde deverá ter impresso a rotina de como fazer uma ”Torta
de Chocolate”
Tudo bem até aqui. E agora como vamos acessar a receita da torta? De que se compõe uma receita?
Pois bem, vamos procurar a página que contém o tı́tulo ”Torta de Chocolate”, encontra-se
então a receita que é equivalente a um ”software” de construção da torta, que está gravada em um
página ”ABC” do livro de receitas. Notemos que, na página, apenas lemos; não escrevemos nada
lá, ou seja, em trocado de miúdo será a nossa futura ”ROM” - Read Only Memory - e página o nosso
endereço, pois toda vez quisermos tal informação basta acessar tal endereço e obtê-lá.
Poderı́amos ainda necessitar de uma cobertura para a torta caso fossemos mostrar serviço para
o chefe da casa, vejamos que no livro de receita exista em uma outra página a rotina ”Cobertura
para Tortas” e que esta por sua vez estava seperada por servir para mais de um tipo de torta, e
poderı́amos partir para a sua execução e depois retornar a torta, o que é chamado também como
subrotina de um programa.
Agora se fossemos complicar um pouco mais a nossa receita e fossemos fazer uma receita e meia da
torta? Precisarı́amos de uma folha de rascunho (a memória ”RAM”) para ajustarmos a receita,uma
vez que na receita da torta não devo anotar nada nela. Esta memória temporária, será utilizada para
cálculos, e depois podemos nos desfazer do seu conteúdo, ou seja, jogar no lixo.
Vejamos como ficaria esta estrutura intuitiva na figura abaixo.
Quais são as diferenças sutis e importantes entre o microprocessador e o cozinheiro e suas anotações?
Bem, é que o microprocessador, por ser uma máquina limitada, não atende ao rico vocabulário
do ser humano cozinheiro que, além de rico, é sofisticado, impreciso e de múltipla interpretação, que
só uma máquina inteligente como o homem entede ( vejamos o exemplo: para o homem as seguintes
palavras são equivalentes: fazer = realizar = trabalhar. Para o microprocessador, o vocabulário é bem
reduzido e especı́fico; não existem adjetivos, sinônimos, etec...).
Então vimos que o microprocessador entende apenas algumas instruções básicas e se nos quisermos
que ele faça alguma coisa precisamos estudar e compreender precisamente a sua linguagem e limitar-
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
Folha de Rascunho
Leio
Escrevo
C
o
z
i
n
h
e
i
r
o
Ingredientes
+
Utensilios
Livro de
Receitas
HARDWARE
SOFTWARE
READ
WRITE
Perifericos:
Teclado,mouse
Etc....
(Linguagem
Complexa)
So
Leio
RAM (Dados)
M
i
c
r
o
p
r
o
c.
ROM
(Programa de
Linguagem
Especifica
So
Leio
HARDWARE
SOFTWARE
Figura 1.1: Analogia da estrutura Intuitiva
se a ela para fazer a máquina trabalhar. Este é o ASSEMBLER do microprocessador, que é o seu
conjunto de instruções.
1.2
1.2.1
Princı́pios Básicos
Conceitos Básicos da Computação
Antes de iniciarmos o estudo de microcomputadores, vamos nos familiarizar com os termos técnicos
e saber o seu significado individualmente.
1.Bit: abreviação de dı́gito binário (binary digit), que corresponde ao valor zero lógico(0) ou ao
valor um lógico(1). Podemos fazer uma analogia ao sistema numérico como sendo uma unidade
de um valor qualquer.
2.Byte: representação numérica composta de 8 bits. Pode representar números de 00h(=0 10 ) a
FFh(=25510 ). Essa representação é vastamente utilizada na representação das instruções que
o microcontrolador é capaz de executar. Novamente fazendo analogia, teremos o similaridade
como as dezenas, centenas etc..., lembrando que em eletrônica digital corresponde como sendo
uma palavra.
3.Registradores: conjunto de flip-flop, geralmente do tipo D que são interligados em paralelo
entre si. Eles são responsáveis pelo armazenamento de uma informação que pode ter 8, 16,
32, 64 ou 128 bits, dependendo de quantos flip-flops do tipo D estão interligados entre si. Os
registradores apresentam caracterı́sticas voláteis e , quando eles são desenergizados, perdem suas
informações.
Página 8
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
4.Microcomputador: equipamento compacto cujo objetivo principal é simular eletronicamente
o sistema chamado ser humano. Suas principais vantagens são: grande velocidade do processamento das informações e alta confiabilidade nas atividades executadas. Ele é composto por
três blocos básicos: Unidade Central e de Processamento, Unidade de Memória e Unidade de
entrada e saı́da de informações.
5.Instrução: define uma única ação (tarefa) que o microcomputador pode executar por vez. As
ações das instruções podem corresponder a operações de leitura e escrita nos conteúdos dos registradores ou nas posições de memórias, a operação lógica e aritméticas, etc.
6.Equipamento Inteligente: equipamento com microprocessador ou com microcontrolador.
Também chamada de eletrônica embarcada
7.Programa ou software: definido por um conjunto de instruções arranjadas de maneira organizada por um programador, com o objetivo de informar ao microcomputador o que ele deve
executar, ou seja, o programa informa ao microcomputador quais as tarefas que devem ser executadas ao longo do tempo. Existem várias classificações de programas: os programas de sistema
operacional( linux, DOS, windows e etc.), os utilitários( Anti-virus,scandisk e etc.) e os aplicativos (WORD, EXCEL, Kile e etc.)
8.Firmware: programa (software) que está exclusivamente armazenado em uma memória nãovolátil(ROM/PROM/EPROM/E2PROM) de um equipamento inteligente. No mı́nimo o firmware
tem a finalidade principal de programar a forma de operação do hardware (número de portas de
entrada e saı́da, forma de comunicação serial, forma de operação dos timers/contadores etc.) e
de definir suas condições iniciais de operação.
9.Hardware: são as partes eletrônicas que compõem um microcomputador, como a mother board
(placa mãe que contém pelo menos o microprocessador ou o microcontrolador de um microcomputador), a placa de vı́deo de um microcomputador etc.
10.Microprocessador ou Unidade Central de Processamento(CPU):mais conhecido como
CPU. Fazendo analogia com o sistema ser humano, o microprocessador, ou CPU, de um microcomputador corresponde ao cérebro de um ser humana. Fisicamente é um dispositivo semicondutor (circuito integrado,CI) constituı́do por milhões de transistores que implementam uma
variedade de circuitos (registradores, máquinas seqüenciais, circuitos lógicos e etc.). Ele é responsável pela busca de um programa na memória e por sua execução.
11.Microcontrolador: dispositivo semicondutor em forma de CI, que integra todas as partes
básicas de um microcomputador - microprocessador(CPU), memórias não-voláteis (ROM /PROM
/EPROM /E2PROM), memórias voláteis(RAM, SRAM, DRAM, Flash RAM), portas de entrada e saı́das (portas de comunicação paralela e/ou serial, conversores analógicos/digitais,conversores
digitais/analógicos etc.). Ele é conhecido como ummicrocomputador implementado em um único
CI.
1.2.2
Blocos Básicos de microcomputadores
Qualquer computador, seja ele microcomputadores, computadores de médio porte ou ainda computadores de grande porte, são constituı́dos por três blocos básicos: a unidade central de processamento
(CPU), a unidade de memória (na qual são armazenados os programas e as informações) e a unidade
de entrada e saı́da (dispositivos que fazem a comunicação com o mundo externo).
Página 9
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
CPU
A CPU é responsável pela inteligência da máquina, ou seja, é ela que tem a capacidade de tomar
decisões (ações) no sistema microcomputadorizado, por meio da execução de um programa. É ela que
executa o programa armazenado na memória do microcomputador, que foi projetado por um programador. Ao executar um programa, ela é responsável pela obtenção das informações a serem analisadas
por meio de dispositivos de entrada (teclado, canal de comunicação serial etc.), pelo processamento
(interpretação, manipulação, ordenação, modificação, cálculos lógicos ou matemáticos etc.) das informações e pela resposta (ação) do sistema microcomputadorizado a uma determinada situação de
controle para a qual ele foi projetado a fim de controlar, por meio de um dispositivo de saı́da (escrita
na memória de vı́deo, transmissão de dados para outro microcomputador, acionamento de um relé,
acionamento de um bip,etc.). Assim, por exemplo, um microcomputador projetado para funcionar
como um caixa eletrônico de banco deve fazer as seguintes operações: leitura das informações contidas no cartão magnético (obtenção de informações), decodificação da senha digitada no teclado pelo
usuário, busca de saldo bancário nos bancos de dados do banco (processamento), disponibilização do
saldo bancário no monitor de vı́deo e a impressão em papel do referido saldo bancário (resposta do
sistema por meio da ação de gerar informações no monitor de vı́deo e também pela impressão em
papel das informações organizadas solicitadas pelo usuário).
De maneira simplificada, pode-se dizer que a unidade de processamento central (microprocessador)
apresenta duas funções básicas:
a)Leitura (busca) e interpretação do programa alocado na memória, instrução por instrução: como o programa fica alocado na memória do microcomputador, e não dentro do microprocessador/CPU, em primeiro lugar, o microprocessador precisa buscar as instruções, uma por uma,
na memória. Isso é feito por meio da operação de leitura de um byte na memória que corresponde
a uma determinada instrução e depois é realizada a interpretação da instrução lida (decodificação),
pois o microprocessador tem uma determinada quantidade de instruções que ele é capaz de executar.
Dessa maneira, ele precisa verificar qual dessas instruções deve ser executada. Assim, ao finalizar
essa etapa, o microprocessador/CPU sabe o que deve fazer. O próximo passo é a execução da instrução.
b)Execução do programa, instrução por instrução: a palavra execução de uma instrução pode
significar a transferência de dados dos registradores internos do microprocessador/CPU para a
memória ou para os dispositivos de entrada e saı́da, e vice-versa. Pode também significar a execução de operações lógicas e aritméticas etc.
Esse processo de buscar, interpretar e executar instrução por instrução é uma atividade contı́nua do
microprocessador e, dessa forma, um programa é processado por inteiro. A unidade de processamento
central (microprocessador) é constituı́da por três partes principais: a unidade lógica e aritmética, os
registradores internos e o bloco de temporização e controle.
a)Unidade Lógica e Aritmética (ULA): muitas vezes, também é chamada de ALU (Arithmetic
Logic Unit). Ela é responsável, principalmente, pela execução das instruções correspondentes às
operações aritméticas e lógicas. Além disso, uma caracterı́stica muitı́ssimo importante que deve
ser destacada, referente à ULA, é que, ao executar uma instrução de uma operação aritmética ou
lógica, ela também define a condição numérica do resultado por meio de alguns bits sinalizadores,
chamados de flags de sinalização, tornando-os iguais a um (setando-os) ou tornando-os iguais a
zero (resetando-os), e pela utilização de outras instruções que são ca- pazes de testar esses flags de
sinalização. Isso faz com que o sistema microcomputadorizado possa gerenciar uma determinada
situação de projeto ou desempenhar uma determinada tarefa bem-definida.
b)Registradores internos: são compostos por m registradores de n bits interligados em paralelo
entre si. Os valores m e n dependem das caracterı́sticas de cada microprocessador/microcontrolador
Página 10
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
(p. ex.: 32 registrado- res de 8 bits etc.). Como são formados por flip-flops, é possı́vel realizar
operações de leitura e escrita de informações. Quando a CPU é ”desenergizada”por apresentar caracterı́sticas voláteis, essas informações são perdidas. Geralmente, eles são capazes de armazenar:
•um byte se forem constituı́dos por registradores de 8 bits;
•um duplo byte ou address ou word, se forem constituı́dos por registradores de 16 bits;
•um duplo address ou duplo word, se forem constituı́dos por registradores de 32 bits etc.
Um microcomputador é chamado de microcomputador de 8 bits se ele for capaz de processar informações de oito em oito bits por vez (operações de movimentação de informações e operações
aritméticas e lógicas). Analogamente, para os microcomputadores de 16 e 32 bits, quanto maior for
a quantidade de bits processados em paralelo por vez, maior será sua capacidade de processamento.
A unidade utilizada para medir a capacidade de processamento é o Mips (milhões de informações
por segundo).
c)Bloco de temporização e controle: responsável pelo controle do fluxo de informações do microprocessador para as unidades de memória e para as unidades de entrada e saı́da. É esse bloco que
define os sinais de controle de temporização para o sincronismo do fluxo de informações no sistema
microcomputadorizado (p. ex.: liberação de informações da ULA para os registradores, memória
e unidades de entrada e saı́da etc.) por meio da definição dos sinais de leitura (read), de escrita
(write), de inicialização do sistema (reset), de liberação dos barramentos de dados e endereços, entre
outros.
Unidades de Memórias
As unidades de memórias são divididas em duas partes: memória de armazenamento de programa
e memória de armazenamento de informações (dados, bytes, bits etc.).
a)Memória de armazenamento de programa: todo microcomputador deve ter uma área de
memória na qual será armazenado o programa que definirá as tarefas que o microcomputador /
CPU deve executar. Esse programa define a função de um microcomputador e também diz ao microcomputador, instrução por instrução, o que ele deve fazer ao longo do tempo. Esse programa deve
ser implementado por um programador técnico, conhecedor do hardware do sistema microcomputadorizado e das instruções do microprocessador. O microcomputador não funcionará se não existir
um programa armazenado em sua memória de programa. Assim, uma vez energizado o microcomputador, esse programa será buscado e executado pelo microprocessador. Esse programa define a
caracterı́stica funcional do microcomputador (p. ex.: operar como um forno de microondas, como
uma máquina de lavar roupas ou como uma injeção eletrônica de automóvel etc.). Esse programa
não pode ser perdido na ausência de energia elétrica, pois isso acarretaria a perda da funcionalidade
desse microcomputador, para a qual foi projetado. Assim, o tipo de memória em que esse programa
deve ser armazenado é a memória não-volátil.
b)Memória de armazenamento de informações: todo microcomputador deve ter uma área de
armazenamento de informações. Essa memória deve permitir a escrita e a leitura de informações.
Para entender melhor, considere um microcomputador controlando uma determinada atividade.
Caso existam informações definidas pelo mundo externo por meio de chaves, sensores, teclados etc.,
elas devem ser lidas e armazenadas na memória, para depois serem lidas novamente e analisadas
(tratadas) pelo microprocessador por meio de um programa. Como exemplo, considere o acionamento das teclas do teclado de um microcomputador, ou seja, uma vez acionada uma tecla, a CPU
deverá ler a informação que foi gerada pelo hardware associado a essa tecla e executar o armaz namento dessa informação na memória. Depois, deverá fazer a leitura dessa informação, a fim de
analisá-la (interpretá- la), para verificar qual tecla foi acionada. Além disso, a informação deverá
ser mostrada no monitor de vı́deo. Repare que foram necessárias, nesse exemplo, várias operações
Página 11
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
de leitura e escrita na memória, para a realização dessa tarefa. Assim, é preciso utilizar uma
memória que tenha a caracterı́stica de realizar leitura e escrita de informações. Portanto, deve-se
utilizar memórias RAM (Random Access Memory). Lembre-se de que essas memórias apresentam
a caracterı́stica de se- rem voláteis. Portanto, sempre que o microcomputador for desenergizado, as
informações contidas nesse tipo de dispositivo serão perdidas.
Unidade de Entrada e Saı́da
Unidade de entrada e saı́da (E/S): também chamada pela abreviação de I/O (Input/Output),
é responsável pelo interfaceamento das informações entre o microcomputador e o mundo externo.
Geralmente são circuitos integrados (CIs) capazes de ler e armazenar as informações vindas do mundo
externo, por exemplo, informações originárias do teclado, do canal de comunicação serial de um microcomputador etc.; e que também podem definir informações do microcomputador para o mundo
externo, por exemplo, o acionamento de bips, alto-falantes, leds indicadores, displays, interfaces de
comunicação seriais e paralelas etc.
1.3
Arquitetura do Microprocessador/Microcontrolador
Como vimos até aqui o microprocessador é um elemento eletrônico, desenvolvido para executar tarefas especı́ficas, que dependem de uma linguagem própria para cada famı́lia de microprocessadores/microcontroladores. Quando falo em famı́lias estou me referindo ao tipo de linguagem
que o meu microprocessador/microcontrolador será capaz de interpretar, isto quer dizer que a linguagem a qual irei utilizar no programa está diretamente relacionada ao modelo do meu microprocessador/microcontrolador. Podemos ter no mesmo circuito diversos tipos de famı́lias diferentes que
trabalham entre si sem problemas, desde de que se respeite o programa individual de cada um, por
exemplo: o nosso celular não conecta no computador, um palm idem, são todos eles pertencentes a
diversas famı́lias, mas que interagem entre si.
Assim, ao programarmos a ROM com os códigos compatı́veis com a linguagem ou famı́lia pertencentes ao microprocessador, ele será capaz de executar as tarefas por esse código designadas. Cabe ao
projetista entender perfeitamente o conjunto de instruções da máquina (o tão famoso ASSEMBLER)
e a sua estrutura fisica, e de interfaces, também conhecida como hardware.
Vejamos como os três blocos visto até aqui se comunicam entre si para dar funcionalidade ao
microprocessador. As vias de comunicação entre os blocos básicos são chamadas de barramentos ou
do inglês bus. Cada barramento é constituı́do por um número de vias (trilhas de cobre), nas quais
fluem informações em paralelo. São três os barramentos existentes: o barramento de endereços, de
temporização e controle e o de dados.
1.Barramento de endereços: A CPU utiliza esse barramento para definir os endereços das
posições de memória de programa em que ela irá buscar as instruções a serem executadas e
também para definir os endereços de memória de dados ou dos dispositivos de entrada e saida
para a troca de informações. Esse barramento é unidirecional.
2.Barramento de temporização e controle: A CPU utiliza esse barramento para definir os
sinais de temporização e controle para gerenciar o tempo e a direção do fluxo de informações
nas operações de leitura e escrita nos dispositivos (unidades de memória ou unidades de entrada
e saida). Esse barramento é unidirecional.
3.Barramento de dados: A CPU utiliza esse barramento para receber as informações vindas da
memória ou dos dispositivos de entrada e saida ou então definir as informações para a memória
ou para os dispositivos de entrada e saı́da. Esse barramento é bidirecional. Vale ressaltar que
Página 12
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
nem todos os microprocessadores/microcontroladores não trocam informações diretamente com
os dispositivos de entrada e saida.
4.Oscilador: É o elemento que gera o ”marcapasso”da CPU, que permite que o microprocessador
realize as suas tarefas internas e externas de maneira sincronizada e com velocidade predeterminada.
5.Reset: É o elemento que faz a CPU iniciar suas rotinas internas e realizar também a primeira
leitura de instrução no endereço 0000h.
6.Interrupções: São pinos de acesso externo que permitem interromper o microprocessador, que
então interrompe suas tarefas atuais e atende aquelas planejadas pela interrupção solicitada.
Oscilador
Mem´oria
Microprocessador
E/S
ou
Reset
Nao−Volatil
(ROM)
Unidade Cental de
Processamento
ou
I/O
Volatil (RAM)
Interupcao
BUS Dados
BUS de Temp.
Controle
Bus Endereco
Figura 1.2: Arquitetura básica de um microprocessador
Como o computador só interpreta códigos binários, não existe a necessidade que nós programadores
converse no mesmo nı́vel, podemos utilizar os outros tipos de codificação Octal, Hexadecimal, Decimal e por Nomes Simbólicos, que representam uma instrução, como por exemplo: ”add”= ”Soma”=
Código Hexa 24 ou 00100100 em binário (no exemplo, add=add A,#valor), para o microprocessador
8051. A CPU só entende dı́gitos binários, mas nós a memorizarmos por ”add”, que é mais fácil de
se lembrar. Assim através de um software (interpretador) irá transformar este ”add”em 00100100,
quando gravamos a ROM.
1.4
A CPU Internamente
Veremos algumas de suas funcionalidades mais importantes
a)Registradores: São equivalentes a uma RAM, só que interna à CPU. Servem para armazenamento
temporário de informações de utilidade interna e externa à CPU. Existem registradores com função
definida: por exemplo, aquele que é imagem ou espelho de uma porta de ”I/O”. O sinal na porta
de I/O pode ser lido diretamente no registrador equivalente; por exemplo, a porta P̈O”tem um registrador imagem de ”PO”, cujo conteúdo é o reflexo do que há na entrada fı́sica dessa porta. Existem
registradores de Função Geral, que podem ser acessados pelas instruções do Mp (microprocessador)
e ainda podem ser conhecidos por nomes (registradores R0, R1 etc.) ou sem nomes (registradores
20h, 21h, etc.).
Página 13
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
b)Contador de Programa (Program Counter ou PC): É o indicador de endereço de memória externa. Ele serve para endereçar a próxima instrução a ser lida pelo Mp, a fim de que ela ”saiba”onde
estava e para onde deve ir (ler nova instrução no próximo endereço).
c)Registradores de Instrução (Instruction Register ou IR): É o local para onde se dirige o
código da instrução que foi retirada da ROM por meio do endereço dado pelo PC no ciclo de busca
(fetch) da instrução da memória. O IR é necessário para que, depois da busca, um decodificador
possa decodificar, ”abrir”a instrução e enviá-la à unidade de processamento (ALU-Aritmetic Logic
Unit), a fim de que, neste local, ela seja ”executada”.
d)Unidade de Decodificação (Decode Unit): É o local em que a instrução é decodificada, e
também são gerados os controles que, junto com a Unidade de Controle, permitem executar a
instrução na ALU.
e)Unidade Lógica e Aritmética (ALU-Arithmetic Logic Unit): É o local em que são realizadas
as operações de: lógica, aritmética e decisão/comparação. É o ”cérebro”da máquina.
f)Acumulador (Accumulator): É um registrador principal e muito ”popular”, pois várias instruções se referem a ele para operar.
g)Unidade de Controle (Control Unit): É o local em que se processa o controle do fluxo das
informações a fim de realizar a instrução recebida.
Exemplo de Funcionamento: Suponha que o Mp foi ler uma instrução na ROM. Os seguintes
passos serão dados:
1.O endereço de PC é posto na via de endereço (que é o endereço desta próxima instrução a ser
lida).
2.O sinal de controle da ROM, é ativado (pois vamos ler a ROM e não a RAM).
3.A instrução é lida da ROM, no endereço dado pelo PC (no caso, o endereço ”n”), e é lida pela
via de dados. Estes três itens correspondem ao ciclo de busca ou fetch.
4.A instrução é carregada e armazenada no IR (Registrador de Instruções).
5.O PC é incrementado para ler a próxima instrução (apontará para ”n+1”).
6.Inicia-se outro ciclo, o de execução interna da instrução, auxiliado pela Unidade de Controle e
pelos registradores, decodificado pela Unidade de Decodificação e executado pela ALU.
1.5
O Microcontrolador 8051
O 8051 é um microcontrolador rápido com clock tı́pico de 12 MHz sendo que existem versões de até
30 MHz, fornecidas por diversos fabricantes, e suas caracterı́sticas de hardware e software permitem
usá-lo como um poderoso controlador, sobretudo em sistemas para lógica seqüencial e combinatória.
Entre as suas caracterı́sticas de hardware, podemos destacar:
1)2 Kbytes de memória de programa (Flash)
2)128 Bytes de memória RAM
3)Duas portas de I/O de 8 bits
4)Comparador de tensão on-chip
5)Controlador de interrupção de 6 entradas com estrutura Nesting*
6)Canal serial UART Full-Duplex programável
Página 14
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
7)Dois contadores/temporizadores de 16 bits
8)Modos Power-Down e Power-Idle
[*] ”Nesting”é o nome que se dá ao processo pelo qual uma interrupção pode interromper outra que
já estiver sendo atendida, desde que tenha maior prioridade.
Entre as caracterı́sticas de software podemos destacar a capacidade de executar complexas operações
aritméticas e lógicas (multiplicação, divisão, permuta, e deslocamento de bits,. . . ), trabalhar com bancos de registradores nominais e inclusive trabalhar com 128 bits individualmente endereçáveis na RAM.
Há um tempo não muito distante, para realizar um projeto utilizando microcontroladores com
todas estas funcionalidades, era necessário agrupar diversas pastilhas com as funções descritas anteriormente. Isto tornava protótipo fisicamente maior, aumentaria o consumo de energia, diminuindo a
autonomia das baterias e inviabilizando a sua portabilidade que hoje são fundamentais para os sistemas embarcados.
Para compreendermos melhor o 8051 torna-se necessário conhecer a estrutura interna do microcontrolador e estudarmos cada uma delas detalhadamente. Para isso nos dividiremos da seguinte
forma:
1)Memória
2)Circuito de Reset
3)Gerador de Clock
4)Controlador de Interrupção
5)Conjunto de Instruções
Com esta divisão ficará mais claro definirmos todas as instruções realizadas pelo 8051 e, o funcionamento dos demais componentes associados ao microcontrolador.
1.5.1
Memória
Vejamos, o diagrama de blocos do 89C2051 na figura 1.3. Neste diagrama de blocos, temos uma
noção geral dos elementos internos ao 8051 e de suas ligações com o mundo externo.
A memória de programa do 8051 é do tipo Flash ROM (E2PROM), podendo sofrer um ciclo de
escrita/apagamento de 1000 vezes. Este tipo de memória de programa torna as tarefas de teste e
depuração dos programas bastante agradáveis, pois a antiga etapa de apagar a memória em luz ultravioleta não se faz mais necessária.
O segmento de programa da memória se inicia no endereço 0000h e pode ocupar todos os 2048
bytes da memória, a ATMEL oferece também outros modelos de microcontroladores com uma ROM
interna maior para que possamos utilizar programas maiores.
A memória RAM se divide conforme a figura 1.4
Os registradores de funções especiais incluem locações referentes às portas de I/O, ponteiros do
sistema, registros de interrupção, registros da porta serial, dos temporizadores e registros aritméticos.
A CPU trata os registros de funções especiais da mesma forma que trata a RAM, podendo ali
efetuar alterações e, o mais importante, endereçar algumas dessas posições como bit.
Esta facilidade de endereçar bits é muito interessante, pois facilita a vida do programador. Vamos
supor que temos de zerar o quinto bit de uma certa posição de memória. O método tradicional consiste
em fazer uma operação AND entre o conteúdo da memória especificada e o numero binário 11011111,
Página 15
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
Figura 1.3: Organização Interna do 8051
pois 1 AND X resulta X, logo não alteramos os bits 7, 6, 4, 3, 2, 1 e 0. Mas temos que 0 AND X
resulta 0, e desta forma zeramos o quinto bit.
Quando o sistema trabalha com bits, basta dar uma instrução do tipo ”zere o bit 5 na posição N”e
teremos efetuado a operação, sem nos preocuparmos com os demais bits.
A parte baixa da memória RAM interna (daqui a diante chamaremos apenas de RAM) está dividida em porções distintas, que incluem 4 bancos de registradores de 8 bytes cada, uma porção de
16 bytes cujos bits são individualmente endereçáveis pela CPU e o restante da memória, que somente
pode ser endereçado byte a byte.
Os bancos de registradores são simples posições de memória RAM que permitem seu endereçamento
pelo nome dado a cada registro, além de seu endereçamento pela posição de memória.
Página 16
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
Figura 1.4: Organização da RAM Interna do 8051
A vantagem dos bancos de registradores está em seu uso pelo sistema, como ı́ndice para endereçamento e pela facilidade de lembrança de seu nome, além de serem amplamente utilizados por
compiladores de linguagem de alto nı́vel.
Por exemplo, é mais fácil lembrar que um certo dado está no registro R2 do que lembrar que o
mesmo está na posição 02 de memória (Supondo Banco 0).
Página 17
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
A seleção de um certo banco de registradores se dá pelo valor dos bits RS1 e RS0 conforme a
tabela a seguir:
Posição de Memória
1F
1E
1D
1C
1B
1A
19
18
17
16
15
14
13
12
11
10
0F
0E
0D
0C
0B
0A
09
08
07
06
05
04
03
02
01
00
Nome do Registrador
R7
R6
R5
R4
R3
R2
R1
R0
R7
R6
R5
R4
R3
R2
R1
R0
R7
R6
R5
R4
R3
R2
R1
R0
R7
R6
R5
R4
R3
R2
R1
R0
Bit RS1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Bit RS0
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
BANCO
3
2
1
0
Tabela 1.1: Tabela de registradores do banco de memória
Conforme visto anteriormente, temos 16 bytes na RAM cujos bits são individualmente endereçáveis
pela CPU, conforme podemos ver pela tabela abaixo, dispostos da seguinte forma.
Página 18
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
7F
77
6F
67
5F
57
4F
47
3F
37
2F
27
1F
17
0F
07
Endereços
7E 7D
76 75
6E 6D
66 65
5E 5D
56 55
4E 4D
46 45
3E 3D
36 35
2E 2D
26 25
1E 1D
16 15
0E 0D
06 05
Individuais dos
7C 7B 7A
74 73 72
6C 6B 6A
64 63 62
5C 5B 5A
54 53 52
4C 4B 4A
44 43 42
3C 3B 3A
34 33 32
2C 2B 2A
24 23 22
1C 1B 1A
14 13 12
0C 0B 0A
04 03 02
bits
79
71
69
61
59
51
49
41
39
31
29
21
19
11
09
01
78
70
68
60
58
50
48
40
38
30
28
20
18
10
08
00
Endereços dos bytes
2F
2E
2D
2C
2B
2A
29
28
27
26
25
24
23
22
21
20
Tabela 1.2: Endereços de Memória endereçavel por byte e bit
Temos também alguns registros de funções especiais que têm seus bits endereçáveis, sendo que alguns deles têm, inclusive, um nome mnemônico, para maior facilidade de desenvolvimento de software
em compiladores.
Antes de estudarmos o mapa de memória dos registros de funções especiais, vamos estudar cada
um deles em separado para melhor compreensão do funcionamento interno do 89C2051.
Em seguida ao nome de cada registro, temos seu endereço em hexadecimal na RAM:
P1 (90) - Porta P1
P3 (B0) - Porta P3
São posições da RAM que contêm os dados das portas de I/O do micro, caso as mesmas sejam
usadas como tal.
Uma escrita num desses registros altera automaticamente o conteúdo presente na saı́da do chip, e
uma leitura dos mesmos coloca o estado presente nos pinos (ou nos latchs de saı́da, conforme veremos
adiante) dentro da posição desejada. Essa operação é possı́vel devido aos buffers e latchs de cada
porta, que só são ativos na leitura ou escrita das mesmas.
Página 19
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
SP (81) - Stack Pointer
É um registrador de 8 bits que contém o endereço de topo de uma ”pilha”realizada com os registradores,
em que se acumulam endereços de retorno, quando se trabalha com sub-rotinas e interrupções. Você
pode EMPURRAR (PUSH) dados para a pilha (STACK) ou TIRAR (POP) dados da pilha
(STACK).
A instrução PUSH incrementa o SP ”antes”de escrever os dados e a instrução POP lê o dado
da pilha e ”depois decrementa”o SP. A pilha é formada inicialmente dentro da RAM interna quando
se tem o RESET da máquina, e neste caso o SP é carregado com valor 07h. Isto é, qualquer dado
a ser armazenado na pilha causará primeiro o incremento do SP, isto é, irá para 08h, e depois será
gravado o dado na pilha nesta posição 08h. Isto é, ela estará ocupando a posição 08h da RAM que é
o registrador R0 do banco 1! Se você quiser utilizar esse banco e os outros seguintes, é melhor, logo
de ı́nicio, carregar o SP com outro valor de ponteiro, a partir do qual ele irá formar a pilha.
TH1 (8D) - Timer High 1
TL1 (8B) - Timer Low 1
TH0 (8C) - Timer High 0
TL0 (8A) - Timer Low 0
São os registros de dados dos temporizadores/contadores (1 e 0 respectivamente). Contem os valores contados, no caso de usarmos as funções desse importante periférico do 89C2051.
TCON (88) - Timer Control Register
TMOD (89) - Timer Mode Register
Registradores de controle e de modo de operação dos temporizadores/contadores. É nestes registros que efetuamos a programação de como queremos que esses periféricos trabalhem. Vale lembrar
que o 89C2051 possui dois temporizadores/contadores internos.
PCON (87) - Power Control
Este registro permite-nos adaptar o chip para situações em que não há processamento, mas não
desejamos perder o conteúdo das memórias internas do chip, como pode ocorrer numa falha da alimentação, assim podemos controlar o consumo de energia do sistema.
SCON (98) - Serial Port Control Register
SBUF (99) - Serial Buffer
No SCON, colocamos os bits que nos permitirão trabalhar com a porta de comunicação serial conforme desejamos, e o SBUF é o registro no qual a porta armazenará o dado recebido, ou escrevemos
o dado a ser transmitido.
IE (A8) - Interrupt Priority
IP (B8) - Interrupt Enable
Estes registros permitem-nos escolher qual ou quais interrupções serão habilitadas (ou desabilitadas) e qual a prioridade (maior ou menor) de cada uma.
Página 20
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
PSW (D0) - Program Status Word
O Program Status Word contém bits que indicam quais as ocorrências da ALU na ultima operação
lógica e aritmética, alem de indicar qual banco de registradores foi acessado pela ultima vez. Equivale
aos Flags dos microprocessadores de 8bits.
ACC (E0) - Accumulator
B (F0)
Equivalem ao acumulador e ao registro B dos microprocessadores de 8 bits. O interessante aqui é
que, inclusive os registros da CPU são acessı́veis como simples posições de memória.
DPH (83) - Data Pointer High
DPL (82) - Data Pointer Low
Estes dois registros de 8 bits podem ser referenciados como um registro de 16 bits, chamado DPTR
-Data Pointer. Este registro é usado quando desejamos fazer endereçamento indireto para a leitura de
constantes armazenadas na memória de programa, para ler ou escrever variáveis na memória externa
de dados e para desvio para memória de programa de até 64 Kbytes.
Não são todos os registros de funções especiais que tem seus bits individualmente endereçáveis.
Temos na tabela abaixo, os registros e seus bits com seus respectivos endereços. Assim como nos
registros endereçáveis (que são bytes), alguns destes bits também tem um nome mnemônico.
Este componente possui um poderoso conjunto de instruções que permite usar diversos modos de
endereçamento, admitindo desvios e leitura/escrita em toda a memória.
No momento oportuno, veremos como é acessada uma posição de memória, e também como a CPU
faz para acessar fisicamente essas posições.
1.5.2
Circuito de Reset
Agora, estudaremos como se processa a operação de RESET no 89C2051. É através desta função
que o chip se prepara para trabalhar, seja ao ligarmos a alimentação do sistema, ou forçosamente.
Embora o RESET não seja propriamente uma interrupção, muitas vezes é assim chamado devido
à semelhança de suas ações, já que o RESET interrompe o processamento e reinicializa o sistema.
O RESET no 89C2051 é ativo quando o pino 1 (RST/VPP) permanecer em nı́vel alto por dois ou
mais ciclos de maquina.
Neste caso, a CPU executa o que chamamos de reset interno, que consiste em preencher seus registros internos com os valores predeterminados, a saber:
a)O PC, o acumulador, o registro B, os flags, o DPTR e todos os registros dos temporizadores/contadores são ZERADOS.
b)No SP é colocado o valor 07h.
c)As portas P1 e P3 terão o valor FFh
Página 21
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
E7
F7
97
B7
E6
F6
96
B6
Endereços Individuais dos bits
E5
E4
E3
E2
F5
F4
F3
F2
95
94
93
92
B5
B4
B3
B2
EA
ES
ET1
1
AB
EX1
AF
AC
PX1
BC
PT1
1
BB
PS
AA
BA
E1
F1
91
B1
E0
F0
90
B0
Registradores
ACC
B
P1
P3
ET0
0
A9
EX0
0
A8
IE
PT0
0
B9
PX0
0
B8
IP
P
D0
PSW
CY
D7
AC
D6
FD
D5
RS1
D4
RS0
D3
OV
D2
SM1
9F
SM2
9E
SM3
9D
REN
9C
TB8
9B
RB8
9A
T1
99
R1
98
SCON
TF1
8F
TR1
8E
TF0
8D
TR0
8C
IE1
8B
IT1
8A
IE0
89
IT0
88
TCON
Tabela 1.3: Mnemônicos de cada bit
d)O SBUF estará com conteúdo indeterminado e o registro de controle da porta serial SCON
será zerado.
e)O registro PCON terá apenas seu bit mais significativo zerado.
f)Os registros de controle de interrupção (IE e IP) terão ambos o valor binário XXX00000,
onde X = irrelevante (pode ser 0 ou 1).
A RAM interna não é afetada pelo reset forçado, sendo que ao ligar (power-up), o seu valor é
aleatório, mas pode ser lido por software.
Geralmente, ao ligarmos o sistema, desejamos que o mesmo execute uma seqüência de funções de
inicialização, dividida em dois blocos, inicialização do sistema básico, que sempre ocorre no RESET,
e a inicialização do sistema montado, que prepara o equipamento para a operação para o qual foi
projetado, por exemplo, ajustando os contadores, as portas entre outros.
Embora estas funções sejam executadas pelo software que começa a rodar após o RESET, no endereço 0000h da memória de programa, costumamos chamá-lo de rotina de inicialização.
O 89C2051 pode ser automaticamente resetado ao ligar a fonte, pela colocação de um resistor de
8,2 kΩ entre seu pino seu pino de RESET e o terra, e pela colocação de um capacitor (preferencialmente de tântalo) de 10 µF entre o pino e o +Vcc, o que garante que este pino estará em nı́vel alto
por mais de 2 ciclos de maquina após a ligação da alimentação, pois o capacitor comporta-se como
um curto-circuito, provocando uma circulação de corrente pelo resistor, que terá uma tensão inicial
da ordem de +Vcc.
Após algum tempo, o capacitor ”estará carregado”e não circulará mais corrente na resistência, e
desta forma a diferença de potencial sobre a mesma será nula, garantindo que o pino RST/VPP esteja
Página 22
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
Figura 1.5: Mapa de Registradores e Valores de Reset do 8051
no nı́vel 0.
Na eventualidade de necessitarmos provocar o reset (reset forçado), basta então colocarmos uma
chave de contato momentâneo NA (push-botton NA) em paralelo com o capacitor, e ao pressiona-la
e soltá-la teremos provocado uma nova operação de reset.
Na entrada, o chip possui um Schmidt Trigger para garantir rejeição a ruı́do, sendo que a saı́da do
mesmo é amostrada a cada ciclo de maquina pelo hardware, para ver a ocorrência de reset.
Durante o reset, o nı́vel lógico dos pinos é indeterminado, indo a nı́vel lógico 1 ?após? a execução
da rotina interna de reset, de tal forma que devemos prever esta situação no projeto do hardware,
para evitar acionamento indesejável de qualquer periférico externo.
Página 23
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
Figura 1.6: Circuito de reset
1.5.3
O Gerador de Clock
Temos duas possibilidades para excitar o sistema: clock externo ou clock interno.
O uso do clock externo ajuda a economizar componentes quando do uso do sistema junto de outros
que já possuam um sinal TTL que possa ser aproveitado, como por exemplo, para trabalho junto a
contadores e outros equipamentos seqüenciais rápidos.
Sua implementação é simples, bastando desconectar o pino 4 (XTAL2) (deixar em aberto), e injetar o sinal externo no pino 5 (XTAL1), que desta forma irá diretamente para o sistema de controle e
temporização do chip (conforme a figura 1.7).
Figura 1.7: Clock Externo para o 8051
Se utilizarmos o clock gerado pelo oscilador interno, deveremos intercalar aos pinos XTAL1 e
XTAL2 um cristal ou um filtro cerâmico (o cristal e o mais indicado) na freqüência desejada, e dois
capacitores de realimentação conforme a figura 1.8
Os valores recomendados dos capacitores são os seguintes:
40 pF +/- 10 pF para filtro ressonante de cerâmica.
30 pF +/- 10 pF para cristal oscilador.
Em qualquer caso, a freqüência de oscilação mı́nima é de 3.5 MHz, é a máxima pode ser de 24
MHz conforme o modelo utilizado. Existem atualmente versões de outros fabricantes que trabalham
com freqüência de 30 MHz e superiores, sendo que o seu custo também é relativamente superior.
Página 24
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
Figura 1.8: Oscilador Interno
Quanto ao layout do circuito deve-se destacar o fato de que as ligações devem ser mantidas as
mais curtas possı́veis, para evitar capacitâncias parasitas que venham a interferir no funcionamento
do circuito, assim como uma boa malha de terra deve ser providenciada em toda a placa.
Figura 1.9: Layout Recomendado para o Oscilador Interno
1.5.4
Interrupção
A interrupção é, provavelmente, uma das mais importantes ferramentas nos sistemas de controle
microprocessados, pois é o processo pelo qual a execução de um programa é interrompida (ou não),
de acordo com as necessidades de eventos externos ou internos.
Temos dessa forma, que existem três fontes de interrupção: a interrupção por Software (instrução),
a pedida por periférico externo e a interrupção pedida por periférico interno (timer/counter, porta
serial, etc. . .).
A interrupção é um sinal, gerado de uma das três formas acima descritas, que pede para a CPU
parar o processamento corrente e efetuar outro, referente à interrupção solicitada, desde que a mesma
esteja habilitada e possa ser aceita.
A vantagem da interrupção está na simplificação do Hardware, pois não precisamos fazer com que
nosso sistema fique monitorando o funcionamento de certos dispositivos periféricos. Por exemplo, nos
computadores didáticos simples, e mesmo em alguns sistemas industriais, o teclado é um periférico
que é lido constantemente pelo monitor do sistema, para verificar se alguma tecla foi ou não apertada.
Página 25
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
Já nos computadores da linha IBM-PC, isso não ocorre, pois o teclado é um periférico inteligente, que
possui um microcontrolador interno que, caso uma tecla seja pressionada, pede uma interrupção ao
microprocessador para poder enviar o código da tecla pressionada para o mesmo.
Muitas vezes as entradas de interrupção são as principais entradas do sistema. Para o perfeito
entendimento das interrupções, devemos antes relembrar os seguintes conceitos:
a)Mascaramento
É a possibilidade de impedirmos, geralmente por Software, que uma certa interrupção seja atendida.
Existem sistemas que possuem interrupções não-mascaráveis, ou seja, jamais podem ser desabilitadas
por Software.
b)Prioridades
No caso do sistema poder atender mais de uma interrupção, devemos ter uma tabela de seqüência
de prioridades, para que o microprocessador saiba como agir, no caso de duas ou mais interrupções
chegarem simultaneamente.
c)Interrupção Vetorada e Não Vetorada
As interrupções vetoradas são aquelas que possuem o vetor de interrupção (endereço de inı́cio da
interrupção) fixo, e não pode ser mudado pelo usuário. É o caso do 8051, onde cada vetor de interrupção já está definido pelo fabricante. As interrupções não vetoradas são aquelas nas quais os
endereços de desvios do programa são escolhidos pelo programador, como é o caso do COP 68705.U3
da Motorola, por exemplo.
d)Tipo de Ativação das Interrupções
Existem três maneiras pelas quais um sistema pode reconhecer um sinal lógico:
•Pelo nı́vel (alto ou baixo).
•Pela borda de subida ou de descida.
•Pela soma de borda (subida ou descida) e um nı́vel correspondente.
Estudo das Interupções no 8051
0 8051 pode ser interrompido de 5 maneiras:
1)Pela interrupção externa INTO\;
2)Pela interrupção externa INT1\;
3)Pelo timer/counter interno TIMER0;
4)Pelo timer/counter interno TIMER1;
5)Pelo canal de comunicação serial.
O canal serial e as interrupções externas usam alguns pinos da porta três, conforme a seguir:
1.Porta 3, pino 0 = Receptor de dados seriais (RX);
Página 26
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
2.Porta 3, pino 1 = Transmissor de dados seriais (TX);
3.Porta 3, pino 2 = Entrada da interrupção externa INTO\;.
4.Porta 3, pino 3 = Entrada da interrupção externa INT1\.
OBSERVAÇÃO: Dessa forma, se usarmos algumas dessas interrupções, devemos tratar a porta
três como porta de I/O apenas bit endereçável.
No 8051, cada interrupção pode ser individualmente habilitada ou não, e podemos também desabilitar todas de uma só vez.
As interrupções podem ter apenas dois nı́veis de prioridade, e dessa forma, se duas ou mais ocorrerem ao mesmo tempo (algo ”praticamente”impossı́vel), a de maior prioridade será atendida primeiro.
Caso uma interrupção de prioridade 0 (menor) esteja em andamento, uma interrupção de prioridade 1 (maior) interromperá aquela e será atendida. Ao seu fim, a CPU retorna ao atendimento da
interrupção de nı́vel 0 que foi interrompida.
Este Microcontrolador possui ainda um processo de prioridade interno, para o caso de duas interrupções de mesma prioridade estarem aguardando atendimento.
Neste caso, esta é a ordem de atendimento das interrupções (IP):
1)Interrupção Externa 0 −→ Maior prioridade Timer 0
2)Interrupção Externa 1 Timer 1
Se a interrupção que chegar for de nı́vel igual ou menor da que já está sendo atendida, ficará
aguardando o fim desta para ser servida.
Quando atende uma interrupção, 0 8051 salva no Stack o valor do PC, ”mas não salva o acumulador e o registro Program Status Word (PSW)”. Os mesmos devem ser salvos e devolvidos pela
rotina de interrupção, se assim for necessário, assim como qualquer outro registro importante.
Endereços de Desvio
Neste Microcontrolador, cada interrupção é desviada para um certo endereço fixo, no qual começa
a nossa rotina de interrupção.
São os seguintes os endereços de desvio:
1.INT0\ −→ 03h
2.Timer/Counter 0 −→ 0Bh
3.INT1\ −→ 13h
4.Timer/Counter 1 −→ 1Bh
Como vimos, o Reset inicia em 00h, e desta forma, por exemplo, se usarmos todas as interrupções
teremos que usar os três Bytes disponı́veis para o reset, num desvio incondicional para outra parte da
memória, onde realmente teria inı́cio o programa.
Página 27
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
As interrupções INT0\, Timer/counter 0, INT1\ e Timer/counter 1 possuem apenas 8 Bytes
disponı́veis antes de sobrepor se com a próxima, e desta forma, provavelmente, deveremos efetuar um
desvio para outra parte da memória, sendo a única exceção a interrupção do canal serial, que por ser
a última não se sobrepõe a nenhuma outra. Temos na figura 1.10, um mapa parcial da memória de
programa com destaque para os endereços de desvio de cada interrupção.
00h
01h
02h
03h
04h
05h
06h
..
.
0Ah
0Bh
0Ch
0Dh
..
.
11h
12h
13h
14h
..
.
1Ah
1Bh
1Ch
1Dh
..
.
22h
23h
24h
25h
←−
Inicio
←−
End. de INT0\
Diferença de 8 bits
←−
↓
End. do Timer/Counter 0
←−
End. de INT1\
←−
End. do Timer/Counter 1
←−
End. do Canal Serial
Figura 1.10: Mapa parcial da memória de programa do 8051 com destaque ao inı́cio das interupções
Página 28
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
1.5.5
Registro de Controle das Interrupções
O 8051 possui dois registro de 8 bits cada um, na sua memória RAM mais alta (Registros de
Funções especiais-SFR) que servem para habilitação ou não das interrupções, e indica para a CPU a
prioridade de cada uma delas.
Sempre que uma interrupção é requisitada, um certo bit de controle dessa interrupção será setado
e assim permancerá até que essa interrupção seja atendida.
Exceção é a esta regra é a interrupção serial, que deve ter seu bit de controle resetado
pelo Software.
O primeiro de todos estes registros é o IE que tem por função indicar qual das interrupções está
ou não habilitada.Vejamos a figura 1.11
Bit 7
EA
X
X
ES
...
ET1
EXT1
ET0
Bit 0
EX0
Figura 1.11: Resgistro IE
EA - Enable All: Localizado no bit número 7, significa habilitar todos. Quando o em nı́vel 0,
desabilita todas as interrupções de forma geral, independente de qualquer outro controle. Se em nı́vel
1, permite-nos escolher qual interrupção em particular será habilitada, em função dos bits de controle
individuais a seguir.
ES: Enable Serial: Localiza-se no bit 4, significa habilitar a serial, quando em nı́vel lógico 1,
libera a interrupção pedida pelo canal serial.
ET1 - Enable Timer 1: Localiza-se no bit 3, significa habilitar a interrupção do timer 1 e quando
em nı́vel lógico 1, libera a interrupção pedida pelo Timer/Counter 1.
EX1 - Enable External 1: Localiza-se no bit 2, significa habilitar a interrupção externa (INT1\
e quando em nı́vel lógico 1, libera a interrupção pedida pelo dispositivo externo ligado a INT1\.
ET0 - Enable Timer 0: Localiza-se no bit 1, significa habilitar a interrupção do timer 0 e quando
em nı́vel lógico 1, libera a interrupção pedida pelo Timer/Counter 0.
EX1 - Enable External 0: Localiza-se no bit 0, significa habilitar a interrupção externa (INT0\
e quando em nı́vel lógico 1, libera a interrupção pedida pelo dispositivo externo ligado a INT0\.
Prioridade Natural das interrupções
1.INT0\
2.TIMER/COUNTER0
3.INT1\
4.TIMER/COUNTER1
5.Serial
Veremos agora o registro IP, nele fixaremos qual o nı́vel de prioridade de nossas interrupções. Vejamos o formato deste registro.
PS: Priority Serial: Localiza-se no bit 4, significa prioridade serial, quando em nı́vel lógico 1,
indica prioridade alta à interrupção gerada pelo canal serial, se a mesma estiver habilidade. Quando
Página 29
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
Bit 7
X
X
X
PS
...
PT1
PX1
PT0
Bit 0
PX0
Figura 1.12: Resgistro IP
em nı́vel 0, indica prioridade baixa.
PT1 - Priority Timer 1: Localiza-se no bit 3, significa prioridade do timer 1 e quando em
nı́vel lógico 1, indica prioridade alta à interrupção gerada pelo Timer/Counter 1, se a mesma estiver
habilidade. Quando em nı́vel 0, indica prioridade baixa.
PX1 - Priority External 1: Localiza-se no bit 2, significa habilitar a interrupção externa (INT1\
e quando em nı́vel lógico 1, indica prioridade alta à interrupção externa 1, se a mesma estiver habilidade. Quando em nı́vel 0, indica prioridade baixa.
PT0 - Priority Timer 0: Localiza-se no bit 1, significa prioridade do timer 0 e quando em
nı́vel lógico 1, indica prioridade alta à interrupção gerada pelo Timer/Counter 0, se a mesma estiver
habilidade. Quando em nı́vel 0, indica prioridade baixa.
PX1 - Priority External 0: Localiza-se no bit 0, significa habilitar a interrupção externa (INT0\
e quando em nı́vel lógico 1, indica prioridade alta à interrupção externa 0, se a mesma estiver habilidade. Quando em nı́vel 0, indica prioridade baixa.
Página 30
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
Veremos como é o registrador PSW (Program Status Word)
Lembrando que neste registrador representa o status da última operação realizada no acumulador,
vejamos a seguinte figura 1.13
Bit 7
PSW.7
CY
Bit 6
PSW.6
AC
Bit 5
PSW.5
F0
Bit 4
PSW.4
RS1
Bit 3
PSW.3
RS0
Bit 2
PSW.2
OV
Bit 1
PSW.1
-
Bit 0
PSW.0
P
Figura 1.13: Resgistros bit a bit do PSW
CY - Carry É um indicador de ”vai um”em operações aritméticas: vai para 1 quando uma soma
com A ”estoura”na sua capacidade (isto é, o sétimo bit ou ACC.7 vai um para uma próxima casa que
não existe; seria um nono bit, que é um ”estouro”da conta). Vai para ”1”se existir um empréstimo do
7 bit no caso de uma subtração com o acumulador.
Por exemplo:
Se ACC=FFh e após isto aparece a instrução: acc A,#01h: A soma de FFh com 01h fará com que
o resultado de A seja 00h e ”vai 1”para o carry, isto é,”CY”é setado no registrador PSW.
O carry ”CY”também é utilizado como se fosse o ”acumulador para um só bit”. Existem várias
instruções booleanas que usam o ”C”, isto é, o carry, como operando, em que se posiciona o resultado
das operações. Por exemplo:
anl C,ACC.0: Executa um AND booleano entre o carry e o bit ACC.0. O resultado da operação
fica em ”C”(ele é equivalente ao acumulador para operação com bytes), isto é, o resultado volta para
ele mesmo.
AC - Auxiliary Carry É um indicador de ”vai um”entre os quatro primeiros bit do acumulador,
isto é, é o ”vai um”de um ”nible”para outro ”nible”do acumulador.
Isto é muito útil em aritmética BCD em que os nibbles que correspodem a 4 bits são representados
por um número codificado em binário, mas que representa um decimal de 0 a 9.
Flag 0 É um bit registrador de uso geral, não tem nenhuma função especial e não indica nada.(literalmente
”sobrou”dentro do PSW, sem função)
RS1 e RS0 São dois bits que fazem mudar o banco de registradores a que se referem os nomes
R0 a R7, utilizados nas instruções que trabalham com esses registradores (por ex.: mov A,R0 = move
para o ”A”o conteúdo de ”R0”; mas qual R0? Os bits RS0 e RS1 é que dizem a qual R0 de qual banco
está se referindo).Vejamos na tabela 1.4
RS1
0
0
1
1
RS0
0
1
0
1
BANCO
Banco 0
Banco 1
Banco 2
Banco 3
Tabela 1.4: Seleção do banco de registradores pelos bit do PSW
Quando se dá o reset da máquina, ele aponta para o banco 0, isto é, as instruções que se referirem
a R0,R1,. . .R7 estão se referindo ao ”Rn”do banco O. Podemos utilizar a mudança de bancos e usar os
mesmos apelidos de R0 a R7 para o outro banco, ou usar o endereço absoluto de cada registrador. Em
geral, deixa-se que o microcontrolador aponte para o banco 0 direto e os outros registradores utilizam
os endereços absolutos deles, só para não ter i trabalho de mudar toda hora de banco. Isto depende
do gosto do programador.Quando se ”reseta”a máquina, os bits RS1 e RS0 ficam em 00h,
isto é, estão se referindo ao banco 0.
Página 31
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
OV É um bit que vai para 1 quando, após um adição ou subtração, acontece um ”estouro”da
conta. Resultados maiores que +127 ou menores que -128 ”setarão”o bit ”OV”. Paor exemplo:
0F
+7F
8E
⇒
⇒
e ”OV”
+15
+127
+142
Note que 8E é -116, que não é a resposta desejada +142, por isto OV é setado.
PSW.1 Não é um bit disponı́vel ao usuário.
P - Parity Bit que é ”setado”em ”1”quando a paridade do conteúdo do acumulador é par.
Por exemplo, seja A, contendo os seguintes dados:
Observação: Paridade é o resultado par ou ı́mpar do somatório binário do acumulador.
A=
N de ”1s”
1001
= Ímpar
1110
−→
P=1
A=
N de ”1s”
1001
= Ímpar
1111
−→
P=0
É útil quando se trabalha com o canal serial, pois ele muitas vezes necessita desta informação. Outra
maneira de saber se P é ”1”ou ”0”, é pensar que a soma dos bits ”1”do acumulador mais o
”P”tem sempre que ser par.
1.5.6
Tempo para Atendimento das Interrupções
Um certo tempo decorrerá entre o reconhecimento da interrupção, alterações nos registros internos
e efetivo desvio para o endereço. O melhor caso ocorre quando uma interrupção chega pouco antes
dos últimos 14 perı́odos de clock, que correspondam ao final da instrução; a próxima instrução não
seja multiplicação ou divisão; e temois mais 24 perı́odos de clock para a chamada da sub-rotina. Estes
tempos incorrem em atraso de 38 perı́odos de clock ou 3.2 µs para um clock de 12 MHz.
O pior caso ocorre se a interrupção chegar após os 14 últimos perı́odos da instrução em vigor, e
se a próxima instrução for multiplicação ou divisão, que consomem 48 perı́odos de clock, que resulta
num atraso de 86 perı́odos, ou 7.2 µs para clock de 12 MHz.
1.5.7
Ajuste das Interrupções Externas para serem Ativas em Nı́vel ou Transição
Podemos ajustar as interrupções externas para serem detectadas por transição de 1 para 0, ou pelo
nı́vel 0. Os bits de controle das interrupções externas estão no registro TCON (Controle do Timer),
e os que nos interessam são os quadro bits menos significativos.
Bit 7
...
IE1 IT1
IE0
Bit 0
IT0
Figura 1.14: Resgistro TCON com os bits relevantes às interrupções
IT0 - Interrupção Externa 0 (INT0\) : Localizado no bit 0 do TCON, indica qual o processo
para a chamada da interrupção INT0\ será aceita na transição de 1 para 0 do nı́vel pino, devendo
permanecer em 0 por pelo menos 12 perı́odos de clock. Se em nı́vel 0, INT0\ será aceita apenas pelo
nı́vel 0 presente no pino.
Página 32
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
IE0 - Habilitação da Interrupção Externa 0 (INT0\): Bit para o hardware de controle da
interrupção INT0\, localiza-se no bit 1. Este bit é setado pelo Hardware interno quando for detectada uma transição de 1 para 0 no pino INT0\. Tem por função sinalizar internamente o pedido da
interrupção. É resetado logo que a interrupção seja atendida.
IT1 - Interrupção Externa 1 (INT1\) : Localizado no bit 2 do TCON, indica qual o processo
para a chamada da interrupção INT1\ será aceita na transição de 1 para 0 do nı́vel pino, devendo
permanecer em 0 por pelo menos 12 perı́odos de clock. Se em nı́vel 0, INT1\ será aceita apenas pelo
nı́vel 0 presente no pino.
IE1 - Habilitação da Interrupção Externa 1 (INT1\): Bit para o hardware de controle da
interrupção INT1\, localiza-se no bit 3. Este bit é setado pelo Hardware interno quando for detectada uma transição de 1 para 0 no pino INT1\. Tem por função sinalizar internamente o pedido da
interrupção. É resetado logo que a interrupção seja atendida.
Como vimos, se a interrupção for ativa pela transição, é a esta que a CPU deverá detectar para atender à interrupção, por isso temos que esperar um perı́odo de 12 ciclos de clock, porque na amostragem
anterior, a CPU detectou nı́vel 1 e agora devemos esperar que a mesma detecte o nı́vel 0.
Já na detecção por nı́vel, a entrada deverá estar em nı́vel 0, apenas durante a amostragem que
ocorre ao fim de cada instrução executada. O interessante é que neste caso, o pino pode permanecer
em nı́vel 0 durante a execução da rotina de interrupção, mas deve estar em nı́vel 1 ao fim desta, senão
o sistema atenderá novamente à interrupção, visto que na amostragem da última instrução da rotina,
encontrará este pino em nı́vel adequado para a interrupção, o que não ocorre no caso anterior, pois lá
a CPU deve sentir a TRANSIÇÃO do nı́vel 1 para o O.
1.5.8
Hardware para expandir as possibilidade de Interrupção Externa
Na figura 1.15, temos uma porta AND de 8 entradas na qual todas as NOVAS 8 entradas de interrupção estarão ligadas. Estas 8 entradas também estão ligadas a um lacth, por exemplo o 74LS374.
A saı́da desta porta será ligada diretamente ao pino de interrupção externa INT0\, por exemplo,
e também a um inversor, e daı́ ao ”gate”do lacth, e as saı́das do lacth estão ligadas à porta P1.
Caso ocorra uma transição de 1 para 0 na porta AND, teremos sua saı́da indo para o nı́vel 0
também, ocasionando o pedido de interrupção e ”travando”o estado dos pinos I1 a I8 no lacth.cc
No momento do atendimento da interrupção, o valor a ser lido na porta P1 conterá o estado dos
bits que geraram a interrupção, e uma rotina verificará qual bit está em 0. Este bit é responsável pelo
pedido de interrupção, e basta ao Software encarregar-se de executar a rotina apropriada.
Página 33
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
+Vcc
I8
7430
INT0\
I1
8051
D0
D1
D2
D3
D4
D5
D6
D7
Q0
Q1
74LS374 Q2
Q3
Q4
Q5
Q6
Q7
P1.0
P1.7
Figura 1.15: Detalhe do Hardware para expandir o número de interrupções.
1.5.9
Exercı́cios Resolvidos
Questão 1 No microcontrolador da famı́lia 8051, programar as palavras IE (Interrupt Enable),
IP (Interrupt Priority) e TCON (Timer Control) de modo a:
a)INT1\ seja habilitado na máxima prioridade.
b)Timer/Counter1 seja habilitado em segunda prioridade.
c)INT0\ seja habilitado na terceira prioridade.
d)Serial e Timer/Counter0 não habilitadas.
Passo a):Interrupções liberadas pela palavra IE
INT0,INT1 e Timer1 liberados
Bit EA - Enable All ligado
Timer0 e Serial desativadas
EA
1
0
0
ES
0
ET1
1
EX1
1
ET0
0
EX0
1
Assim carrega-se o valor 8Dh para a palavra IE através do seguinte comando:
MOV IE,8Dh
Pbsso b):Prioridade programadas pela palavra IP
INT1 e Timer1: alta prioridade
INT0:
baixa prioridade
Página 34
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
-
-
-
PS
X
PT1
1
PX1
1
PT0
X
PX0
0
Questão 2 Obter a outra representação do endereço do bit 5Dh? (Ver tabela 1.2) Solução:
•Transformar o endereço do bit de hexadecimal para decimal 5 ∗ 16 1 + 13 ∗ 160 = 9310
•Dividir o valor do endereço em decimal (93 10 ) por 8 → 93/8, obtendo o quociente q=11 10 e o
resto r=510
•Transformar o quociente (q) e o resto (r) em hexadecimal: q=11 10 =Bh e r=510 =5h.
•Aplicar a fórmula: 5Dh = [20h+Bh]h.5=2Bh.5, ou seja, o endereço do bit 5 é igual a 2Bh.5.
Para transformar o endereço de um bit da representação 2Xh.Y para ZWh(2Xh.Y−→ZWh),basta
seguir o procedimento:
•Obter o quociente e o resto. O quociente (q) é obtido subtraindo 2Xh de 20h e transformando-o
em decimal, e o resto é obtido através do número após o ponto (.) de tal representação. Multiplicando o quociente em decimal por 8 e somando com o resto em decimal, obtém-se o endereço
em decimal. O valor do endereço em decimal deve ser transformado para hexadecimal.
Questão 3 Obter a outra representação do endereço do bit 2Ah.3? (Ver tabela 1.2)
•Obter o quociente (q) e o resto (r): q= 2Ah - 20h = Ah e r=3h.
•Transformar q e r de hexadecimal para decimal:
q=Ah = 1010 e r 3h = 310
•Multiplicar o quociente por 8 e somar o resultado com o resto em decimal: 10*8+3=83 10
•Transformar o endereço de decimal para hexadecimal: 83 10 = 5 ∗ 161 + 3 ∗ 160 =53h
Questão 4 Defina o tipo de endereçamento de cada uma das instruções dadas a seguir:
a)ADDC A,20h
Resposta: Endereçamento direto.
b)MOV @R0,55h
Resposta: Endereçamento combinado (misto), formado pelos endereçamentos direto e indireto ou
indexados por registrador.
c)MOV R7,6Ah
Resposta: Endereçamento indireto, pois R7 (Rn) é um registrador indexado (mnemônico).
Questão 6 Crie um programa que faça a operação OR-Exclusivo entre o conteúdo do acumulador
(A) e a constante 33h. O resultado deve ser armazenado no conteúdo do registrador R5 do segundo
banco de registradores.
Resposta:
XRL A,#33h
(A)←−(A)or-ex #33h
MOV PSW,#08h (PSW)←−#08h=#00001000 =⇒ (RS1)=0 e (RS0)=1=⇒ define o segundo banco de registradores (B1).
MOV R5,A
Armazena, no conteúdo do registrador R5 do segundo banco de registradores, o conteúdo do acumulador A.
Página 35
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
1.5.10
Conjunto de Instruções
Instruções Aritméticas
Mnemônico
ADD A,Rn
Opcode
Função
SUBB
A,#DADO
INC A
INC Rn
Soma o conteúdo de Rn ao acumulador
Soma o conteúdo da posição de
memória ao acumulador
Soma o conteúdo da RAM endereçada por Ri ao acumulador
Soma o dado ao acumulador
Soma o conteúdo de Rn e o carry ao
acumulador
Soma o conteúdo da posição de
memória e o carry o acumulador
Soma o conteúdo da RAM endereçada por Ri e o carry ao acumulador
Soma o dado e o carry ao acumulador
Subtrai o conteúdo de Rn e o Borrow do acumulador
Subtrai o conteúdo da posição de
memória e o Borrow do acumulador
Subtrai o conteúdo da RAM endereçada por Ri e o Borrow do acumulador
Subtrai o dado e o Borrow do acumulador
Soma 1 ao acumulador
Soma 1 ao conteúdo de Rn
INC DIRETO
INC @Ri
Soma 1 á posição de memória
Soma 1 á RAM endereçada por Ri
DEC A
DEC Rn
Subtrai 1 do acumulador
Subtrai 1 do conteúdo de Rn
DEC DIRETO
DEC @Ri
Subtrai 1 da posição de memória
Subtrai 1 da RAM endereçada por
Ri
Soma 1 ao registrador DPTR
Multiplica A e B resultado: BA
Divide A e B resultado: A inteiro B
resto
Ajuste decimal do acumulador
ADD A,Direto
ADD A,@Ri
ADD A,DADO
ADDC A,Rn
ADDC
A,DIRETO
ADDC A,@Ri
ADDC
A,#DADO
SUBB A,Rn
SUBB
A,DIRETO
SUBB A,@Ri
INC DPTR
MUL AB
DIC AB
DA A
Bytes
Clocks
Flags Afetados
B
1
12
CY
?
H
2
12
?
?
?
0010/011iB
1
12
?
?
?
24
0011/1
abc
35
H
B
2
1
12
12
?
?
?
?
?
?
H
2
12
?
?
?
0011/011iB
1
12
?
?
?
34
H
2
12
?
?
?
1001/1
abc
95
B
1
12
?
?
?
H
2
12
?
?
?
1001/011iB
1
12
?
?
?
94
H
2
12
?
?
?
04
H
0000/1 B
abc
05
H
0000/011 B
i
14
H
0001/1 B
abc
15
H
0001/011 B
i
A3
H
A4
H
84
H
1
1
12
12
-
-
-
2
1
12
12
-
-
-
1
1
12
12
-
-
-
2
1
12
12
-
-
-
1
1
1
24
48
48
0
0
?
?
0
1
12
?
?
-
0010/1
abc
25
D4
Página 36
H
AC
?
OV
?
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
Operações Lógicas
Mnemônico
Opcode
Função
ANL A,Rn
”e”entre registro e acumulador
ANL A,DIRETO
ANL A,@Ri
”e”entre memória e acumulador
”e”entre RAM indireta e acumulador
”e”entre dado e acumulador
”e”entre acumulador e memória.
Resultado na memória
”e”entre dado e memória
ANL A,#DADO
ANL DIRETO,A
ANL
DIRETO,#DADO
ORL A,Rn
ORL A,DIRETO
ORL A,@Ri
ORL A,#DADO
ORL DIRETO,A
ORL
DIRETO,#DADO
XRL A,Rn
XRL A,Direto
XRL A,@Ri
XRL A,#DADO
XRL DIRETO,A
XRL
DIRETO,#DADO
CRL A
CPL A
RL A
RL C
RR A
RRC A
SWAP A
”ou”entre registro e acumulador
”ou”entre memória e acumulador
”ou”entre RAM indireta e acumulador
”ou”entre DADO e acumulador
”ou”entre acumulador e memória.
Resultado na memória
”ou”entre DADO e memória
”ou exclusivo”entre registro e acumulador
”ou exclusivo”entre memória e acumulador
”ou exclusivo”? entre RAM indireta
e acumulador
”ou exclusivo”entre dado e acumulador
”ou exclusivo”entre acumulador e
memória. Resultado na memória
”ou exclusivo”entre dado e memória
Faz A = 0
Inverte o estado dos bits do acumulador
Desloca o acumulador à esquerda
Desloca o acumulador à esquerda
através do carry
Desloca acumulador à direita
Desloca acumulador à direta através
do carry
Troca os nibbles do acumulador.
Equivale a 4 RR A ou 4 RL A
Bytes
Clocks
Flags Afetados
0101/1 B
abc
55
H
0101/011iB
1
12
CY
-
2
1
12
12
-
-
-
54
52
H
H
2
2
12
12
-
-
-
53
H
3
12
-
-
-
0100/1 B
abc
45
H
0100/011iB
1
12
-
-
-
2
1
12
12
-
-
-
44
42
H
H
2
2
12
12
-
-
-
43
H
3
12
-
-
-
0110/1
abc
65
B
1
12
-
-
-
H
2
12
-
-
-
0110/011iB
1
12
-
-
-
64
H
2
12
-
-
-
62
H
2
12
-
-
-
63
H
3
12
-
-
-
E4
F4
H
H
1
1
12
12
-
-
-
23
33
H
H
1
1
12
12
?
-
-
03
13
H
H
1
1
12
12
?
-
-
C4
H
1
12
-
-
-
Página 37
AC
-
OV
-
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
Operações de Transferência de Dados
Mnemônico
Opcode
Função
MOV A,Rn
Move o registro para o acumulador
MOV A,Direto
MOV A,@Ri
MOV A,#DADO
MOV Rn,A
Move memória para o acumulador
Move RAM endereçada por Ri ao
acumulador
Move o dado para o acumulador
Move o acumulador para o registro
MOV Rn,Direto
Move memória para o registro
MOV
Rn,#DADO
MOV Direto,A
MOV Direto,Rn
Move o dado para o registro
MOV
Direto1,Direto2
MOV Direto,@Ri
MOV
Direto,#DADO
MOV @Ri,A
MOV @Ri,Direto
Move acumulador para a memória
Move o registro para a memória
Mova o conteúdo da memória Direta2 para Direta1
Move RAM endereçada por Ri para
a memória
Move o dado para a memória
Move o acumulador para a RAM endereçada por Ri
Move a memória para a RAM endereçada por Ri
Move o dado para a RAM indireta
MOV
@Ri,#DADO
MOV
Move dado de 16 bits para o DPTR
DPTR,#DADO16
MOVC A, @A + Soma A + DPTR obtendo um enDPTR
dereço de 16 bits na memória de programa. Carrega acumulador com
esta memória
MOVC
A, Idem ao anterior, mas soma A + PC
@A+PC
MOVX A,@Ri
Move RAM externa (End. 8 bits)
para o acumulador
MOVX
A, Move RAM externa (End. 16 bits)
@DPTR
para o acumulador
MOVX @Ri, A
Move o acumulador para a RAM externa (End. 8 bits)
MOVX @DPTR, Move o acumulador para a RAM exA
terna (End. 16 bits)
1110/1 B
abc
E5
H
1110/0111B
Bytes
Clocks
Flags Afetados
CY
AC
OV
1
12
-
-
-
2
1
12
12
-
-
-
H
B
2
1
12
12
-
-
-
B
2
24
-
-
-
B
2
12
-
-
-
H
B
2
2
12
24
-
-
-
H
3
24
-
-
-
1000/011iB
2
24
-
-
-
75
H
3
24
-
-
-
1111/011iB
1
12
-
-
-
1010/011iB
2
24
-
-
-
0111/011iB
2
12
-
-
-
90
H
3
24
-
-
-
93
H
1
24
-
-
-
83
H
1
24
-
-
-
1110/001iB
1
24
-
-
-
E0
H
1
24
-
-
-
1111/001iB
1
24
-
-
-
F0
1
24
-
-
-
74
1111/1
abc
1010/1
abc
0111/1
abc
F5
1000/1
abc
85
OBS: Continua na próxima página . . .
Página 38
H
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
Mnemônico
PUSH Direto
POP Direto
XCH A,Rn
XCH A,Direto
XCH A,@Ri
XCHD A,@Ri
Opcode
Função
Incrementa o SP e então coloca a
memória no stack
Retira dado do stack e coloca na
memória, depois decrementa SP
Troca entre si o conteúdo do acumulador e do registro
Troca memória com acumulador
Troca RAM indireta com acumulador
Troca nibble menos significativo do
acumulador e da RAM indireta entre si
Bytes
Clocks
Flags Afetados
C0
H
2
24
CY
-
AC
-
OV
-
D0
H
2
24
-
-
-
1100/1 B
abc
C5
H
1100/011iB
1
12
-
-
-
2
1
12
12
-
-
-
1101/011iB
1
12
-
-
-
Opcode
Bytes
Clocks
Instruções para Variáveis Booleanas
Mnemônico
CLR C
CLR bit
SETB C
SETB bit
CPL C
CPL bit
ANL C,bit
ANL C,/bit
ORL C,bit
ORL C,/bit
MOV C,bit
MOV bit,C
JC rel
JNC rel
JB bit,rel
JNB bit,rel
JBC bit,rel
Função
Zera o Carry
Zera o bit endereçado
Seta o carry
Seta o bit endereçado
Inverte o estado do carry
Inverte o estado do bit endereçado
”e”entre o bit endereçado e o carry
”e”entre o complemento do bit endereçado e o carry
”ou”entre o bit endereçado e carry
”ou”entre o complemento do bit endereçado e o carry
Move o bit endereçado para o carry
Move o carry para o bit endereçado
Desvia se o carry estiver setado
Desvia se o carry estiver zerado
Desvia se o bit endereçado estiver
setado
Desvia se o bit endereçado estiver
zerado
Desvia se o bit endereçado estiver
setado e depois zera o bit
Flags Afetados
C3
C2
D3
D2
B3
B2
82
B0
H
H
H
H
H
H
H
H
1
2
1
2
1
2
2
2
12
12
12
12
12
12
24
24
CY
0
1
?
?
?
72
A0
H
H
2
2
24
24
?
?
-
-
A2
92
40
50
20
H
H
H
H
H
2
2
2
2
3
12
24
24
24
24
?
-
-
-
30
H
3
24
-
-
-
10
H
3
24
-
-
-
Página 39
AC
-
OV
-
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi
Instruções de Desvio
Mnemônico
ACALL END11
LCALL END16
RET
RETI
AJMP END11
LJMP END16
SJMP rel
JMP
@A
+
DPTR
JZ rel
JNZ rel
CJNE A,Direto,
rel
CJNE
A,#Dado,rel
CJNE
Rn,#Dado,rel
CJNE
@Ri,#Dado,
rel
DJNZ Rn, rel
DJNZ Direto, rel
NOP
Opcode
Função
Chama sub-rotina numa faixa de
2kbytes da atual posição
Chama sub-rotina em qualquer
posição da memória de programa
Retorne da sub-rotina
Retorne da interrupção
Desvia para outro endereço numa
faixa de 2kbytes da atual posição
Desvia para qualquer posição da
memória de programa
Desvio curto relativo
Desvia para o endereço obtido da
soma do acumulador e do DPTR
Desvia se o acumulador for zero
Desvia se o acumulador não for zero
Compara e desvia se o acumulador
for diferente da memória endereçada
Compara e desvia se o acumulador
for diferente do dado
Compara e desvia se o registro for
diferente do dado
Compara e desvia se a RAM indireta for diferente do dado
Decrementa o registro e desvia se for
diferente de zero
Decrementa a memória e desvia se
for diferente de zero
Nenhuma Operação
Bytes
Clocks
Flags Afetados
-
-
2
24
CY
-
AC
-
OV
-
12
H
3
24
-
-
-
22
32
-
H
H
-
1
1
2
24
24
24
-
-
-
02
H
3
24
-
-
-
80
73
H
H
2
1
24
24
-
-
-
60
70
B5
H
H
H
2
2
3
24
24
24
?
-
-
B4
H
3
24
?
-
-
1011/1 B
abc
1011/011iB
3
24
?
-
-
3
24
?
-
-
1101/1
abc
D5
B
2
24
-
-
-
H
3
24
-
-
-
00
H
1
12
-
-
-
Página 40
Capı́tulo 2
Segunda Unidade
Dispositivos do 8051
2.1
Ciclos de Máquina
Como vimos na unidade passada o clock é o relógio interno do microprocessador para a execução
sequencial de qualquer atividade interna ou externa à máquina, ou seja, é o elemento que gera e controla os ciclos de trabalho da máquina. Cada ciclo de oscilação chamaremos de ”P”de pulso. A cada
dois pulsos ”P”caracteriza-se um estado ”S”. Uma sequência de seis estados, S1 a S6, corresponde a
um ciclo de máquina. Todas as atividades internas e externas do microprocessador são comandadas
por esses pulsos e seus seis estados.
Um ciclo de máquina se constitui de seis estados (S1 a S6) que, por sua vez, correspondem a
doze pulsos P do ”clock”.
1 Ciclo de Maquina
Estados
S1
P1
S2
P2
1 Estado
P1
S3
P2
P1
S4
P2
P1
S5
P2
P1
S6
P2
2 Pulsos
P1
P2
X
Figura 2.1: Ilustração de um ciclo de máquina do MSC8051
Por exemplo, o instante marcado como ”X”na figura é o ”S6P1”. Assim podemos ter um linguagem
comum de definição de instantes de um ciclo de máquina. Cada pulso P1 depende da frequência do
clock. Por exemplo, se o circuito oscilador for a cristal de 12MHz, teremos um ciclo de máquina = 12
x (Perı́odo de Clock) = 12 x (1/12*10 6 )= 1µs.
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
2.2
Portas de I/O
Temos no 8051 quatro grupos de saı́das denominados de PORTS, são eles P0,P1,P2 3 P3, comforme a versãoo do 8051 utilizado. No 8051 (ROM Interna) temos todos os quatro ports disponı́veis;
no 8031 (EPROM Externa) só temos os ports P1 e P3 disponı́veis como ”I/O”. Cada port tem oito linhas que podem ser programadas como entrada ou como saı́da, ou trabalhar com os periféricos internos.
2.2.1
Princı́pio de Funcionamento e Utilização
O uso das linha de I/O é simples e necessita apenas de que escrevamos o valor desejado (na caso
de utilização como saı́da), ou efetuarmos a leitura (no caso de entrada). Se o dado presente numa
porta configurada como entrada variar, a variação não será sentida pelo sistema, até que efetuemos
uma nova leitura dessa entrada.
Isto ocorre porque cada linha é, na realidade, um Buffer tri-state de um bit. Já no caso da escrita,
temos associado a esta linha um flip-flop D (latch) de um bit.
Na figura 2.2, temos um esquema simplificado de um bit de I/O, que nos ajudará a compreender
o funcionamento da porta. Os circuitos reais são ligeramente diferentes para cada uma das portas, e
mais complexos do que o apresentado aqui, mas para fins ditáticos e de entendimento este diagrama
básico é suficiente.
LE LATCH
VIA DE
DADOS
INTERNA
ESCREVE
D
CLK
Q
+
Q
PINO
LE PINO
Figura 2.2: Diagrama em blocos simplificado de um pino de I/O
Quando escrevemos um bit na porta, o mesmo vai pela via interna até a entrada D do flip-flop, e
então um pulso de clock em CLK coloca este bit em Q, que através da eletrônica associada leva este
nı́vel ao pino externo.
Já no caso da leitura, algumas instruções lêem o pino enquanto outras lêem o estado do latch, em Q.
As instruções que lêem o latch são aquelas que costumam ler, modificar e reescrever o bit, a saber
: INC, DEC, CPL, JBC, DJNZ, ANL, ORL, XRL, MOV Px.n,C, CLR Px.n e ainda SETB Px.n,
conforme vimos na unidade anterior.
As demais instruções de acesso aos ports lêem o estado presente nos pinos. E dai, qual a diferença
então?
Vamos supor que temos a base de um transistor NPN sendo acionada pelo pino de I/O. Quando
escrevemos 1 neste pino o transistor entrará em condução, e se a CPU ler o estado deste pino para
eventual confirmação, lerá a tensão na base do transistor e interpretará como nı́vel ZERO, então neste
Página 42
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
caso deve ser lido o valor de latch, que estará corretamente indicando nı́vel UM.
Um exemplo simples de conexão das linhas seria um sistema que em função de um certo bit, por
exemplo o bit 5 da porta 3 (escrito como P3.5), fará com que os leds colocados nos 8 pinos da porta
1 sejam acesos sequencialmente, conforme o estado daquele bit. Na figura 2.3, temos um diagrama
simples para este exemplo, e a seguir o Software simbólico para esta função.
Página 43
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
+
+
+
P1.0
P1.1
8051
P1.7
+
P3.5
Figura 2.3: Exemplo simples de utilização
SOFTWARE SIMBÓLICO
Inicio:
Faz
acumulador
=
00000001
binário
Lebit:
Se P3.5 = 0
então
roda acumulador à esquerda (coloca o bit D0 em D1, e assim
por diante, até colocar o bit D7 em D0).
move acumulador para a porta 1
perde um tempo
volta para ”lebit”
Senão (só pode
ser P3.5 =1)
roda acumulador à direita (coloca o bit D7 em D6, e assim
por diante, até colocar o bit D0 em D7).
move acumulador para a porta 1
perde um tempo
volta para ”lebit”
Página 44
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
Port P0
O P0 é uma estrutura de port bidirecional. Um certo pino ”i”do port Po é tomado como ilustração. O barramento interno do MC é utilizado para ler/escrever no latch interno, ou ler o pino fı́sico
”P0.i”em questão. Quando se utiliza uma instrução que ”escreve”um valor no Port P0.i, o dado se
apresenta na entrada D do flip-flop. Um pulso de ”escreve”(o ”CLK”do flip-flop) é imposto no fli-flop,
que transfere esse dados às saı́das ”Q”e ”Q”do latch.
O sinal de ”controle”atua para permitir que esse dado saia fisicamente no pino P0.i. Este sinal
de controle simboliza o gerenciamento que esse port tem para apresentar o dado fisicamente à saı́da.
Existem instruções que lêem o conteúdo armazenado no latch. Existem instruções que lêem o estado diretamente do pino. Em geral, as instruções que ”lêem o latch”são do tipo ”READ-MODIFY-WRITE”,
isto é, lê o conteúdo do latch, modifica conforme a instrução imposta e escreve de novo no latch. São
as instruções INC, DEC, CPL, JBC, DJNZ, ANL, ORL e XRL.
Quando P0 é usado como port, é como se ele fosse ”dreno aberto”, isto é, devemos utilizar resistores
de ”Pull-Up”nesses pinos para podermos excitar devidamente o ambiente externo ao MC. Quando ele
é usado apenas para controle de memória externa, esses resistores não são necessários, e neste caso o
port P0 é visto como um port ”Tri-State”.
O port P0 é multiplexado entre ”dados”e ”endereços”quando gerencia memória externa e, então,
utiliza o pino ALE para captar o endereço em um latch externo ao MC.
Port P1
Para finalizar este item, basta dizer que as possibilidades de uso destas linha de I/O são praticamente ilimitadas, ficando a cargo do projestista desenvolver novas aplicações para tal.
Os ports 1,2 e 3 possuem pull-ups internos e são chamadas de quase bidirecionais. Esta caracterı́sticas faz com que seus pinos tenham sempre um estado definido, ou seja, 0 ou 1, de forma que
mesmo quando as usamos como entrada, podemos medir seu nı́vel como se fosse de saı́da. Os ports
P1 e P3 podem ser configurados, pino a pino (bit a bit), ou totalmente (byte) como entrada ou saı́da.
Não se pode esquecer que o port P3 é utı́lizado como meio de comunicação externa entre os periféricos
”Timers”e ”Serial”e então os pı́nos só estarão disponı́veis para I/0, dependendo de utilizar ou não os
periféricos desse Mc.
O port 0 não possui estas caracterı́sticas, e quando configurada como entrada, terá seu nı́vel flutuando na ausência de nı́vel fixo no pino. Entretanto, para todos os efeitos de uso, podemos considerar
as portas como simples portas de I/O bidirecionais como veremos a seguir.
2.2.2
Caracterı́sticas Gerais e de Tempo dos Ports
Instruções que Alteram diretamente o Conteúdo dos Ports
É necessário ter cuidado com as instruções do tipo ”Read-Modify-Wrı̀te”citadas neste item, quando
são manipuladas diretamente com os ports. Por exemplo, a operação:
orl P1,#11111110b ; vai executar a leitura do Port P1 pelo ”latch”, vai operar a instrução
”OR”com o dado e devolver o resultado em P1.
Se a intenção é só realizar uma ”máscara”para ler o bit ”P1.0”, esta instrução está sendo mal aplicada, pois ela, além de realizar a máscara, pos valor ”1”em todos os outros bits do port P1, alterando
seus valores originais!
Página 45
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
Assim, se queremos só uma ”máscara”, devemos operar ”fora de P1”, isto é:
mov A,Pi ;lê P1 e carrega em A
orl A,11111110b ;faz a ”máscara”sem alterar P1
Esta e outras instruções abaixo listadas correm este ”perigo”de utilização e precisamos saber exatamente o que queremos antes de aplicá-las direto aos ports:
Instrução e Forma Básica
INC
DEC
CPL
JBC
DJNZ
ANL
ORL
XRL
Funçâo Exemplo
INC P1
DEC P3
CPL P1
JBC P1.0,#XX
DJNZ P1,#XX
ANL PO,A
ORL PO,A
XRL P1,#XX
Tabela 2.1: Instruções que afetam diretamente os ports quando aplicadas junto a eles.
Condições de Tempo Envolvendo os Ports
Cada pino do port é amostrado perto da ”descida”do pulso ”ALE”no instante de leitura de instrução, entre o perı́odo S5 do ciclo de máquina. É possı́vel que, se o pino, neste instante, estiver em
transição, o Mc possa ler dado errado. Quando se ”escreve”um dado no latch do pino do port, ele já
aparece efetivamente na saı́da do latch durante o perı́odo S6P2 do último ciclo de máquina necessário
para finalização da referida instrução. Assim, só aparecerá fisicamente no pino, no instante S1P1 do
próximo ciclo de máquina.
Observe que só se pode ler com confiabilidade um dado no pino do port que fique presente por
tempo acima de 1 valor de ”S”(com clock de 12 MHz teremos → perı́odo S ¿ 1 µs ou genericamente,
perı́odo maior que 1 ciclo de máquina).
2.2.3
Uso das Portas de I/O para a Expansão da Memória de Dados e Programa
As portas 0 e 2 possuem como função alternativa, endereçar memória extema, para que possamos
expandir a capacidade de dados e de programas no 8051. Neste caso, a porta 2 fornece a parte alta do
endereço (A8-A15) e a porta 0 fornece, multiplexada no tempo, a parte baixa de endereço (AO-A7) e
a via de dados (DO-D7).
0 pino 30 fornece o sinal ALE, que habilitará o latch de endereços a segurar a parte baixa do
mesmo, para que os dados possam transitar peia porta 0. Os outros sinais de controle são o PSEN\,
o RD\ e o WR\.
0 sinal PSEN\ habilita a saı́da da memória de programa (permite a (eitura na Eprom externa) de
forma que é ativo quando a CPU deseja ler programa da memória externa. Neste instante, os sinaı́s
RD\ e WR\ estão em nı́vel 1.
Os sinais RD\ e WR\ somente são ativos caso a CPU execute instruções de leitura e escrita na
memória de dados externa (lembre-se de que as instruções para memória externa são diferentes das
instrúções para memória interna). Temos então, que para leitura o pino RD\ irá a nı́vel 0, mantendo
o pino WR\ = 1, e vice-versa para escrita. LEMBRETE: OS SINAIS RD\ E WR\ S ÃO GERADOS ATRAVÉS DE PINOS DA PORTA 3 CONFORME VEREMOS NO ITEM 2.2.5
Página 46
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
2.2.4
Seleção de Programa Externo ou Interno
O pino 31 tem a função EA\ (extemal address) e quando em nı́vel 1 diz à CPU para procuraros primeiros 4 KBytes de programa intemamente, e o que exceder esta memória será procurado
extemamente. Quando em nı́vel 0, informa à CPU que deve procurar todos os passos de programa
externamente, ignorando a memória interna.
OBSERVAÇÃO:
Não confundir este pino com o bit EA, presente no registro IE.
Esta é a opção utilizada quando se usa o 8031, que é um 8051 mas que não tem a ROM interna,
ou quando não se deseja arcar com as despesas de encomendar grande quantidade de peças do 8051
gravadas em fábrica.
DEVE FICAR CLARO QUE QUANDO SE UTILIZA MEM ÓRIA EXTERNA DE PROGRAMAS, EM QUALQUER OPÇÃO NÃO PODEREMOS MAIS UTILIZAR OS PINOS DAS PORTAS
0 E 2 COMO I/0.
Na figura 2.4, temos um esquema de Hardware onde colocamos 8 KBytes de programa e 8 KBytes
de dados externos, sendo que neste caso, temos toda a memória de programa externa, utilizando 0 8031.
RD\
1
0
1
0
WR\
1
1
0
0
Função
Espera
Lendo na RAM
Escrevendo na RAM
Não ocorre
Tabela 2.2: Tabela de Acesso à RAM.
Figura 2.4: Seleção Externa
2.2.5
Uso dos Pinos da Porta 3 como funções Alternativas
A porta 3, conformejá foi visto, pode ter seus pinos usados de forma independente como pinos de
funções especiais. Por exemplo, para a expansão de memória de dados vista acima, são dois pinos da
porta 3 que fomecem os sinais RD\ e WR\ para controle.
Quando usamos os temporizadores internos como contadores de eventos, são outros dois pinos
desta porta que servem como entrada para o sinal de contagem. Se nosso projeto necessitar de interrupção extema, será através de dois pinos desta porta que as mesmas serão sinalizadas à CPU.
E finalmente, nos dois pinos restantes, temos os que permitem a implementação do canal serial. A
maneira pela qual utilizamos ou não uma função especial da porta 3, será vista no momento em que
a estudarmos o canal serial.
Com relação aos pinos RD\ e WR\ são os únicos com os quais não precisamos nos preocupar, pois
seu controle é efetuado pela CPU, e fica claro que se desejamos utilizar memória de dados externa,
não utilizaremos estes pinos como I/0.
CASO QUALQUER UMA DAS FUNÇÕES ESPECIAIS ESTEJA SENDO UTILIZADA, NÃO PODEREMOS MAIS ACESSAR A PORTA 3 COMO PORTA DE I/0
PARA BYTE, APENAS COMO BIT ENDEREÇÁVEL.
Página 47
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
2.2.6
Capacidade de Corrente nos Pinos de I/O
A porta 0, devido às suas caracterı́sticas de construção de dreno aberto (open-drain), pode fomecer
ou absorver 2 cargas TTL, e as portas 1, 2 e 3 podem absorver ou suprir uma carga TTL.
2.3
Modos de Endereçamento das Instruções
As instruções operam com dados que podem ser endereçados de várias formas, motivo pelo qual
devemos saber muito bem os modos de endereçamento que o microprocessador aceita. No caso da
famı́lia 8051/52, etc, dispõe-se dos seguintes modos:
1.Registrador
2.Direto
3.Indireto
4.Imediato
5.Relativo
6.Absoluto
7.Longo
8.Indexado
2.3.1
Endereçamento por Registrador
As instruções do 8051, quando se referem a registradores internos do microcontrolador, apresentamse como oito registradores com nomes R0, R1, R2, R3, R4, R5, R6 e R7. 0 nome genérico destes
registradores é Rn.
Por exemplo: add A,RO: Soma o conteúdo de ”A”com o conteúdo de ”RO”e o resultado fica em ”A”.
Não se esqueça que, neste caso, precisamos saber antes para qual banco está apontado o microcontrolador (nos bits PSW.4 e PSW.3).
As instruções que trabalham com registradores, acusam-no com o nome genérico ◦ Rn”, em que ”n◦ é
o registrador especı́fico (n = 0 a 7). Este tipo de instrução é codificado em apenas 1 byte.
OP CODE
RN
1 BYTE
2.3.2
Endereçamento Direto
As instruções do 8051, que usam endereçamento direto, referem-se aos registradores internos da
RAM do microprocessador pelo seu ”mnemônico”(apelido) ou seu endereço absoluto. Por exemplo:
a) mov A,P3: Move para ”A◦ o conteúdo do registrador ”P3”, que é o mesmo que o port fı́sico P3. b)
mov A,30h: Move para ”A”o conteúdo do registrador. interno de endereço 30h. Este tipo de instrução
é codificado em 2 bytes.
Página 48
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
OP CODE
END. DIRETO
2 BYTE
2.3.3
Endereçamento Indireto
As instruções do 8051, que usam endereçamento indireto, fazem uso de um registrador, que só
pode ser o RO ou R1, para se referir a outra posição de memória RAM. Por isto que é indireto: o
registrador RO ou R1 aponta para um endereço, isto é, ele contém o endereço de outra posição de
memória. Utiliza-se o sı́mbolo ” ◦ para indicar que a operação é de endereço indireto. O nome genérico
desse registrador indireto é Ri (i = 0 ou 1). Por exemplo: Supondo que temos na posição ”30h”da
RAM interna o valor ”05”em hexa e queremos nos referir à posição 30h indiretamente pelo registrador
”R1 ”, podemos fazer (vide figura 2.5)
RAM
INT
CONTEUDO
Posicao de Memoria
05
30h
MOV A,@R1
A=05
CONTEUDO
R1
30
01h
00h
Figura 2.5: Ilustração da operação de endereçamento indireto
•mov 30h,#05h: Carrego a posı́ção da RAM interna de endereço ”30h”, com o valor ”05”(conteúdo=05).
•mov R1,#30h: Carrego o registrador ”R1”com o valor ”30”(conteúdo=30h).
•mov A,@Rl: Carrego ou movo para ”A”o conteúdo da memória apontada por R1,que é 30h,
isto é, ele sabe que é endereço indireto. Logo, ele sabe que o valor ”30h”dentro de R1 é um
endereço e não um conteúdo. Assim, ele vai na posição de memória com endereço ”30h”, pega
Página 49
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
o conteúdo de ”30h”, que é ”05”, e carrega em A.Logo, A = 05 e não A = 30; entendeu?
Olhando a ilustração da figura 2.5 deste item para melhor compreensão e leia este texto de novo.
Este tipo de instrução é codificado em 1 byte.
OP CODE
Ri
1 BYTE
2.3.4
Endereçamento Imediato
As instruções do 8051, quando se referem a endereçamento imediato, significam que o código da
instrução já é codificado junto com uma constante, chamado ”dado imediato”. Operandos do tipo
imediato são precedidos do sinal ”#”. Por exemplo:
•mov A,#25: Move para A o valor 25 em decimal.
•mov A,#25h: Move para A o valor 25 em hexadecimal.
•mov A,#00100101b: Move para A o valor 25h em binário.
•mov DPTR,#1FFFh: Move para o DPTR, o endereço ”1FFF”em hexadecimal.
As instruçôes deste tipo são de 2 bytes, ou de 3 bytes quando se usa o DPTR.
OP CODE
VALOR IMEDIATO
1 BYTE
1 OU 2 BYTES
A única exceção é a ı̀nstrução [mov DPTR,#data(16)], que é de 3 bytes, pois o endereço dela é de
2 bytes (16 bits).
2.3.5
Endereçamento Relativo
As instruções do 8051, com endereçamento relativo, são utilizadas com instruções que permitem
realizar um ”pulo”direto no passo cadenciado de um programa. Este endereço relativo (chamado ”offset”) é um dado de 8 bı̀ts com sı̀nal, ı̀sto é, realiza um salto relatı̀vo ao endereço que está no Program
Counter, PC, de -128 a +127 posı̀ções. Este endereço relativo é lı̀gado à instrução por um outro byte.
Antes de achar o endereço fı̀nal de salto, o PC é incrementado ao endereço da próxima instrução e este
é o endereço ao qual se soma o endereço relativo: vide ilustração seguinte, pois a explicação verbal é
muito difı́cil de absorver. Vejamos o exemplo:
Página 50
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
CODIGO
NA ROM
0100
0101
0102
0103
0104
0105
0106
0107
0108
ROM
SJMP DESVIO= Salto pequeno para ¨ DESVIO¨
Exemplo 1: 80 DESVIO = 8003h
80
03
Endereco de DESVIO=03
Codigo do comando
xx
PC (Apos o inicio da instrucao SJMP 03=8003h)
PC+3
OBS: Em geral, não fazemos estas contas, pois o compilador, quando usamos ”labels”(nomes) como desvio, calcula tudo isto sozinho automaticamente.
As instruções deste tipo são de 2 bytes
OP CODE
2.3.6
PONTO RELATIVO
Endereçamento Absoluto
Instruções do 8051, que se utilizam de endereço absoluto, são as ACALL e AJMP. São instruções
de 2 bytes que permitem desvio de até 2 Kbytes relativo, em apenas 2 bytes (endereço total da
faixa teria que ser em 3 bytes; não é?).
2.3.7
Endereçamento Longo
As instruções no 8051, que usam endereçamento do tipo longo, são LCALL e LJMP. Permitem
endereçamento de 16 bits que mapeia todo o espaço disponı́vel de endereços (64 Kbytes). A única
desvantagem destas instruções é que elas consomem 3 bytes de programa, o que só será
um problema quando o processo exigir tempo de execução muito pequeno (em que 1 µs a
mais ou a menos é vital, por exemplo). Tem o problema, também, de ser um endereço absoluto que
não muda; logo, se você necessita executar esse programa em outra parte do espaço de memória, deve
repensar neste endereço absoluto, ou se utilizar sempre de ”labels”na criação do programa, para que,
na compilação, o compilador acerte os endereços absolutos para você.
Este tipo de instrução consome 3 bytes:
2.3.8
Endereçamento Indexado
As instruções do 8051, que usam endereçamento do tipo indexado, são JMP ou MOVC em uma
de suas formas. São instruções cujo endereço de destino depende não só do endereço inserido na
instrução, mas também do conteúdo de ”A”naquele instante. É melhor explicá-los com um exemplo:
jmp @A+DPTR: Salta para a posição dada pelo DPTR + conteúdo de ”A”, isto é, o ”A”pode
ser um contador de passos e o DPTR um ponteiro de faixas. Supondo que: ”DPTRH = meses do
ano e ”An = dias do mês. Logo, o DPTR aponta para a ucabeça”da tabela de cada mês, e em ”A”eu
insiro 0 ”ı́ndice”do dia do mês desejado. Assim, se vario ”An, já estou alterando o dia daquele mês
fixo, sem alterar mais o DPTR.
Página 51
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
2.4
2.4.1
Temporizadores e Contadores
Introdução
O 8051 tem dois registros contadores de 16 bits, denominados TIMER 0 e TIMER 1, dedicados
às funções de contagem e temporização (counter/timer-contador/temporizador). Há uma importante
distinção entre os conceitos de contador e temporizador.
Quando opera como temporizador, o registro é incrementado a cada ciclo de máquina (usa como
base o cristal da CPU). O sinal de contagem aparece com 1/12 da freqüência do clock.
Quando opera como contador, o registro é incrementado de acordo com o sinal que se coloca nas
entradas T1 e T0, ou seja, o contador opera a cada transição de 1 para 0 (borda de descida ↓) na
entrada T0 ou T1.
Deve-se ter um cuidado quando em operações em modo contador: já se sabe que as entradas são
amostradas durante S5P2 de cada ciclo de máquina (figura 2.1). Quando em um ciclo de máquina a
entrada é detectada em 1 e depois em 0, no próximo ciclo o contador é incrementado. O incremento
acontece em S3P1 do ciclo seguinte ao que foi detectada a transição. Para garantir que o nı́vel correto
tenha sido amostrado, é necessário que o sinal de entrada (o sinal que vai acionar os contadores) permaneça pelo menos um ciclo de máquina em nı́vel alto e pelo menos outro ciclo de máquina em nı́vel
baixo, quer dizer, a máxima freqüência que responderá o contador é de 1/24 da freqüência de clock. O
sinal de entrada pode ter qualquer ”duty cycle”, desde que se respeite a restrição antes mencionada.
2.4.2
Registros Envolvidos
Dois registros SFR são utilizados para controlar as funções e operações do temporizador/contador:
em TMOD especifica-se o modo de operação e em TCON controla-se a operação. A figura 2.6 ilustra
o registro TMOD e a figura 2.7 ilustra o registro TCON.
Página 52
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
Figura 2.6: Descrição do Registro TMOD
GATE →
especifica como será feito o controle:
se GATE = 1 → conta somente se TR1=1 e INT1=high, (idem para TR0 e INT0)
se GATE = 0 → conta somente se TR1=1 (controle somente por software)
(GATE especifica se INT1 será usado para controlar o funcionamento do contador/temporizador ⇒ pode ser usado para medir a largura de pulsos externos ligados a
INT0 ou INT1)
C/*T →
seleciona modo contador ou temporizador:
se C/*T = 1 modo contador (conta usando a entrada T1)
se C/*T = 0 modo temporizador (conta a cada ciclo de máquina)
M1
0
0
1
1
M0
0
1
0
1
→
→
→
→
→
→
→
seleciona o modo de operação:
THi é temporizador/contador de 8 bits e TLi é um pre-scaler de 5 bits,
THi e TLi formam um temporizador/contador de 16 bits,
contador/temporizador de 8 bits com auto-recarga (TLi conta e THi valor para recarga),
TL0 contador/temporizador de 8 bits (usando TR0, *INT0 e TF0)
TH0 contador/temporizador de 8 bits (usando TR1, *INT1 e TF1)
TH1 e TL1 parado (mas pode operar em outros modos)
Página 53
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
Figura 2.7: Descrição do Registro TCON
TF1 →
TR1 →
TF0 →
TR0 →
IE1 →
IT1 →
E0 →
IT0 →
flag de transbordamento (overflow) do contador/temporizador 1. Ativado por hardware
quando há transbordamento no timer 1. É apagado por hardware quando o processamento
é desviado para a rotina de interrupção.
bit de partida/parada (run/stop) do contador/temporizador 1.
flag de transbordamento (overflow) do contador/temporizador 0. Ativado por hardware
quando há transbordamento no timer 0. É apagado por hardware quando o processamento
é desviado para a rotina de interrupção.
bit de partida/parada (run/stop) do contador/temporizador 0.
flag da interrupção externa 1. Ativada por hardware quando é detectada uma interrupção.
Apagado por hardware (somente se for modo borda) quando a interrupção é processada,
ou seja, quando se desvia para a rotina de interrupção.
indica se a interrupção externa 1 opera por borda ou por nı́vel:
1 → borda de descida (↓),
0 → nı́vel baixo.
flag da interrupção externa 0. Ativada por hardware quando é detectada uma interrupção.
Apagado por hardware (somente se for modo borda) quando a interrupção é processada,
ou seja, quando se desvia para a rotina de interrupção.
indica se a interrupção externa 0 opera por borda ou por nı́vel:
1 → borda de descida (↓),
0 → nı́vel baixo.
Página 54
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
2.4.3
Modos de operação
Os dois contadores/temporizadores (timer1 e timer0) podem trabalhar em 4 modos de operação
que são selecionados empregando os bits M1 e M0 do registro TMOD. Os modos 0, 1 e 2 são iguais
para os 2 contadores/temporizadores mas o modo 3 é diferente.
Modo 0
Este modo é idêntico para os dois contadores/temporizadores. Neste modo tem-se um contador
de 8 bits com um divisor (pre-scaler) de 5 bits. Resulta então em um contador/temporizador de 13
bits, compatı́vel com o que havia no MCS-48. Os 13 bits são formados pelos 8 bits do registro THi
e pelos 5 bits menos significativos do registro TLi. Os outros 3 bits do TLi são indeterminados. O
transbordamento (overflow) é gerador quando a contagem faz a transição de 1FFFH para 0000; neste
instante ativa-se o bit de overflow (TF1 ou TF0).
A figura 2.8 apresenta um diagrama em blocos do contador/temporizador 1 operando em modo 0. A
mesma figura é válida para o contador/temporizador 0.
O controle da contagem é simples:
•se GATE = 0, TR1 controla o contador/temporizador (controle por software)
•se GATE = 1, TR1 e INT1 controlam o contador/temporizador (permite também um controle
externo por hardware)
Figura 2.8: Diagrama de Blocos para o TIMER 1 em MODO 0
Página 55
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
Modo 1
Este modo de operação é o mais simples e por isto é muito utilizado. É idêntico ao modo 0, mas
os contadores são de 16 bits. A figura 2.9 ilustra o diagrama em blocos para este modo, que é idêntico
para os dois timers.
Figura 2.9: Diagrama de Blocos para o TIMER 1 em MODO 1
Modo 2
Neste modo tem-se um contador/temporizador de 8 bits (TLi) com registro de recarga (THi) para
quando ocorre o transbordamento. Neste modo os dois contadores/temporizadores operam de forma
idêntica. O transbordamento (overflow) não somente ativa TFi como também recarrega TLi com o
valor guardado em THi (este permanece inalterado). O valor de recarga deve ser fornecido por software.
Figura 2.10: Diagrama de Blocos para o TIMER 1 em MODO 2
Página 56
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
Modo 3
Este é o único modo onde os contadores/temporizadores têm um comportamento diferente. Neste
modo, o contador/temporizador 1 simplesmente suspende a contagem (é como se estivesse com
TR1=0), enquanto o contador/temporizador 0 se divide em dois contadores de 8 bits:
•TH0 → contador/temporizador de 8 bits usando C/*T, GATE, TR0, *INT0 e TF0,
•TL0 → contador/temporizador de 8 bits usando TR1 e TF1 (ou seja, provoca a interrupção do
timer 1).
É como se existem 2 contadores/temporizadores de 8 bits (TH0 e TL0) e outro de 16 bits (timer 1). O
timer 1, entretanto, pode ser usado para operar em qualquer outro modo (0, 1 ou 2) e usa-se o modo
3 para detê-lo. Não há problemas porque os modos são independentes. Também se pode usar o timer
1 (em modo 2) para gerar o ”baud rate”da porta serial.
Figura 2.11: Diagrama de Blocos para o TIMER 1 em MODO 3
Página 57
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
2.4.4
Exercı́cios
LED 10HZ
Acender os leds vermelho, amarelo e verde a uma freqüência de 10 Hz. Para solucionar esse
exercı́cio é necessário gerar um retardo equivalente ao perı́odo de 10 Hz. A figura 2.12 ilustra o cálculo
do valor do contador para gerar esse retardo.
Figura 2.12: Cálculo de N para determinar uma frequência
Se F=10 Hz e CLOCK=3,575611 Hz, então N=29797. Como este é um contador que conta para
cima, temos que subtrair este valor de 65536. Com isto, N=65536-29797=35739 ou 8B9BH. Na
realidade, a freqüência gerada não será exatamente 10 Hz mas de um valor muito próximo:
F = 3,575611 / 12*29797 = 9,99 Hz Será utilizado o timer 0 no modo 1; a cada interrupção a rotina
acende um novo led e recarrega o timer.
TMOD
GATE
0
IE EA
1
C/*T M1 M0
0
0
0
- - ES ET1
0 0
0
0
GATE C/*T M1
0
0
0
EX1 ET0 EX0
0
1
0
;LED_10HZ.ASM;
DEFSEG PROG, CLASS=CODE, START=0
SEG
PROG
;
DEZ_HZ
;
EQU
35739
ORG
AJMP
RESET
INIC
ORG
AJMP
TIMER0
TIM0
ORG
50H
;
;
INIC
MOV
MOV
MOV
MOV
MOV
MOV
CLR
SETB
SJMP
TL0,#LOW DEZ_HZ
TH0,#HIGH DEZ_HZ
TMOD,#1 ;TIMER 0 EM MODO 1
IE,#82H
P1 ,#0 ;APAGAR TODOS OS LEDS
A,#01001001B
C
TR0
$
;
TIM0
ORG
MOV
MOV
RLC
MOV
RETI
END
100H
TL0,#LOW DEZ_HZ ;REINICALIZAR
TH0,#HIGH DEZ_HZ ;O CONTADOR
A
P1,A
Página 58
M0
1
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
Notar que na rotina de interrupção está a recarga dos temporizadores que é feita com a instrução
”MOV direto,#data”mas que consome 2 ciclos de máquina, ou seja, que há um retardo que se acumula. Para evitar ou corrigir isso, pode-se adicionar ao contador o retardo da instrução; é mais preciso
usar ”MOV TL0,# LOW (DEZ HZ+2)”.
Quando existem várias interrupções, não se sabe com certeza quando uma interrupção do temporizador pode ser aceita; isso implica um erro maior que se acumula. Há uma solução simples porque
depois do transbordamento o temporizador segue contando e esta contagem é exatamente o tempo
que atrasou o serviço da interrupção; basta usar esse valor na recarga.
As instruções a seguir ilustram a idéia.
MOV
ADD
MOV
MOV
A,#LOW (DEZ_HZ+2)
A,TL0 ;1 ciclo
TL0,A
;1 ciclo
TH0,#HIGH (DEZ_HZ+2)
Página 59
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
LED 1HZ
Acender os leds vermelho, amarelo e verde a uma freqüência de 1 Hz. A solução é idêntica ao
exercı́cio anterior, mas vai surgir uma dificuldade ao calcular os valores de recarga:
CLOCK=3575611 Hz e F=1 Hz
N=3575611 / 12*1 = 297968
Como se pode ver, o valor de recarga é muito grande (297 968 > 65 536) e impede a utilização do
temporizador. Uma boa saı́da é utilizar o esquema do exercı́cio anterior (com 10 Hz) e adicionar, por
software, um divisor por 10.
;LED_1HZ.ASM
;
DEFSEG PROG, CLASS=CODE, START=0
SEG PROG
;
DEZ_HZ
DIVISOR
;
EQU
EQU
32203
10
ORG
AJMP
RESET
INIC
ORG
AJMP
TIMER0
TIM0
ORG
MOV
MOV
MOV
MOV
MOV
MOV
MOV
CLR
SETB
SJMP
50H
TL0,#LOW DEZ_HZ
TH0,#HIGH DEZ_HZ
R7,#DIVISOR
;PREPARAR DIVISAO POR 10
TMOD,#1
;TIMER 0 EM MODO 1
IE,#82H
P1,#0
;APAGAR TODOS OS LEDS
A,#01001001B
C
TR0
$
ORG
MOV
MOV
DJNZ
MOV
RLC
MOV
RETI
END
100H
TL0,#LOW DEZ_HZ ;REINICALIZAR
TH0,#HIGH DEZ_HZ ;O CONTADOR
R7,FIM
;DIVIDIR POR 10
R7,#DIVISOR
A
P1,A
;
;
INIC
;
TIM0
FIM
Página 60
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
ONDA1
Gerar através de P1.7 uma onda com o seguinte formato:
Figura 2.13: Sinal a ser gerado na P1.7
Usando N = (t*CLOCK)/12, calcula-se o valor de recarga para o temporizador. Serão programados
dois retardos alternadamente de forma a gerar o sinal pedido.
Para t=1 ms → N=298 → 65536-298=65238
Para t=40 µs → N=12 → 65536-12 =65524
;ONDA1.ASM
DEFSEG PROG, CLASS=CODE, START=0
SEG PROG
;
SAIDA
EQU
P1.7
R_1MS
EQU
65238
;RETARDO DE 1 MILISEG
R_40MICRO
EQU
65524
;RETARDO DE 40 MICROSEG
;
ORG
RESET
AJMP
INICIO
;
ORG
TIMER0
AJMP
TIM0
;
ORG
50H
INICIO
MOV
TL0,#LOW R_1MS
MOV
TH0,#HIGH R_1MS
MOV
TMOD,#1
;TIMER 0 EM MODO 1
MOV
IE,#82H
;EA=1 E ET0=1
CLR
SAIDA
SETB
TR0
;PARTIDA DO TIMER 0
SJMP
$
;LOOP INFINITO
;
TIM0
JB
SAIDA,LB1
;2 CICLOS
MOV
TH0,#LOW (R_40MICRO+4)
;2 CICLOS
MOV
TL0,#HIGH (R_40MICRO+4)
;2 CICLOS
SETB
SAIDA
;1 CICLO
RETI
;2 CICLOS
LB1
MOV
TH0,#LOW (R_1MS+4)
MOV
TL0,#HIGH (R_1MS+4)
CLR
SAIDA
RETI
END
Notar que a rotina que atualiza o temporizador para gerar o retardo de 40 µs consome 9 ciclos de
máquina, quer dizer, consome 30,2 µs. Pode parecer que se o tempo de 40 µs fosse mudado para 25
µs não haveria solução.
Página 61
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
ONDA2
Gerar através de P1.7 uma onda com o seguinte formato:
Figura 2.14: Sinal a ser gerado na P1.7
Usando N = (t*CLOCK)/12, calcula-se o valor de recarga para o temporizador. O segredo será
trabalhar com o temporizador em modo 2 (os dois valores de recarga são menores que 256) e a rotina
de interrupção apenas muda o valor da recarga (que está em TH0).
Para t=600 µseg → N=179 → 256-179=77
Para t=25 µseg → N=7 → 256-7 =249
;ONDA2.ASM
DEFSEG PROG, CLASS=CODE, START=0
SEG PROG
;
SAIDA
R_600MICRO
R_25MICRO
;
EQU
EQU
EQU
P1.7
77
249
ORG
AJMP
RESET
INICIO
ORG
AJMP
TIMER0
TIM0
;RETARDO DE 600 MICROSEG
;RETARDO DE 25 MICROSEG
;
;
INICIO
;
TIM0
;
LB1
ORG
MOV
MOV
MOV
MOV
CLR
SETB
SJMP
50H
TL0,#R_600MICRO
TH0,#R_25MICRO
TMOD,#2
IE,#82H
SAIDA
TR0
$
JB
MOV
SETB
RETI
SAIDA,LB1
TH0,#R_25MICRO
SAIDA
MOV
CLR
RETI
END
TH0,#R_600MICRO
SAIDA
Página 62
;PRIMEIRA CONTAGEM
;CONTAGEM SEGUINTE
;TIMER 0 EM MODO 2
;EA=1 E ET0=1
;PARTIDA DO TIMER 0
;LOOP INFINITO
;2
;2
;1
;2
CICLOS
CICLOS
CICLOS
CICLOS
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi
LEDS1
Acender os leds vermelho, amarelo e verde em seqüência, mudando a cada 10 pulsos em T1. Será
usado o contador/temporizador 1 como contador e programado para operar em modo 2, com um valor
de recarga igual a 246 (256-10). O acumulador e carry serão usados para acender os leds na seqüência
correta.
TMOD
IE
EA
1
GATE
0
0
0
C/*T
1
ES
0
M1
1
ET1
1
M0
0
EX1
0
GATE
0
ET0
0
C/*T
0
M1
0
M0
1
EX0
0
;LEDS1.ASM
DEFSEG PROG, CLASS=CODE, START=0
SEG PROG
;
CONTA_10
;
EQU
246
ORG RESET
AJMP INICIO
;
ORG TIMER1
AJMP TIM1
;
INICIO:
ORG 50H
MOV A,#01001001B
CLR C
MOV P1,A
MOV TL1,#CONTA_10
MOV TH1,#CONTA_10
MOV TMOD,#60H
MOV IE,#88H
SETB TR1
SJMP $
;CARREGAR CONTADOR
;VALOR DE RECARGA
;CONTADOR 1, MODO 2
;EA=1, ET1=1
;LIGAR CONTADOR
;LOOP INFINITO
;
TIM1:
RLC A
MOV P1,A
RETI
END
A chave SW3 aciona diretamente a entrada T1, mas há bouncing e por isso serão notadas mudanças nos leds antes de 10 acionamentos. Para esse caso especı́fico o bouncing deverá ser eliminado
por hardware.
Página 63
Capı́tulo 3
Terceira Unidade
Porta Serial
3.1
3.1.1
Comunicação Serial
Introdução
A porta serial existente na famı́lia MCS-51 é ”full duplex”, quer dizer, pode transmitir e receber
dados simultaneamente. Tem um buffer que permite receber um segundo byte antes que o byte previamente recebido tenha sido retirado (lido) do registro de recepção. Mas, se o primeiro byte não tiver
sido lido no tempo em que o segundo byte se completa, um dos dois será perdido.
3.1.2
Registros Envolvidos
A porta serial possui um registrador chamado SBUF, o mesmo que se usa para enviar ou receber
dados pela porta serial. Na realidade, o nome SBUF se refere a dois registros, um somente para leitura
por onde se recebem os dados que chegam pela porta serial e outro somente para escrita por onde se
transmitem dados pela porta serial.
O modo de operação da porta serial é controlado pelo registro SCON, que é ilustrado na figura
3.1. A figura 3.2 apresenta um resumo dos modos de operação.
Figura 3.1: Descrição do Registro SCON
SM0
0
0
1
1
SM1
0
1
0
1
MODO
0
1
2
3
DESCRIÇÃO
registro de deslocamento
UART de 8 bits
UART de 9 bits
UART de 9 bits
FREQÜÊNCIA
clock/12
variável
clock/12 ou clock/64
variável
SM2 → comunicação multiprocessador (habilitada com SM2=1):
•SM2=1 e em modo 1 ==¿ interrupção (RI=1) com o bit de parada (stop bit) igual a 1.
•SM2=1 e em modo 2 ou 3 ==¿ interrupção (RI=1) se for recebido RB8=1.
REN → habilita a recepção serial (Reception Enable)
TB8 → oitavo bit a ser transmitido nos modos 2 e 3.
RB8 → oitavo bit recebido nos modos 2 e 3.
TI → flag de interrupção por término de transmissão pela porta serial:
•MODO 0 → ativado no final do oitavo bit
•DEMAIS → ativado no começo do bit de parada
RI → flag de interrupção por recepção pela porta serial:
•MODO 0 → ativado no final do oitavo bit.
•DEMAIS → ativado na metade do bit de parada.
Observação: Os flags TI e RI não são apagados por hardware e por isso a rotina de interrupção
deve fazê-lo, ou seja, estes flags devem ser zerados por software.
O registro PCON também toma parte na geração do baud rate da porta serial. Este registro é
ilustrado na figura 3.2.
Figura 3.2: Descrição do Registro PCON
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi
3.1.3
Modos de Operação
Existem quatro modos de operação da porta serial, cada um com uma finalidade. Será apresentado
um resumo de cada modo:
Modo 0 (sı́ncrono, 8 bits)
Neste modo os dados entram e saem pelo pino RXD. O pino TXD fornece o clock para o deslocamento (shift). São transmitidos e recebidos dados de 8 bits (LSB primeiro). O baud rate é de 1/12
da freqüência do clock (igual a 1 ciclo de máquina).
Figura 3.3: Esquema da Porta Serial em MODO 0
Este modo pode ser utilizado para expandir as portas de I/O do microcontrolador, utilizando o
esquema a seguir:
Figura 3.4: Expansão das Portas de I/O
Página 67
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi
Modo 1 (assı́ncrono, 8 bits)
No Modo 1 são operados 10 bits com um baud rate programável. Recebe-se pelo pino RXD e
transmite-se pelo pino TXD. A tabela 3.1 ilustra o frame de bits serial. O bit de partida (START) é
sempre zero e o bit de parada (STOP) é sempre um na transmissão. Na recepção o bit de parada é
colocado no bit RB8.
START
Bit 0
Bit 1
Bit 2
Bit 3
Bit 4
Bit 5
Bit 6
Bit 7
STOP
Tabela 3.1: Frame de bits gerado pela porta serial em MODO 1
Neste modo o baud rate é gerado pelo contador/temporizador 1. A cada 16 (SMOD=1) ou 32
(SMOD=0) transbordamentos (overflows) é enviado um pulso para o circuito serial. A figura 3.5
ilustra o esquema do gerador do baud rate e também apresenta algumas fórmulas para o cálculo do
valor a ser programado no contador/temporizador.
Figura 3.5: Esquema para a geração do Baud Rate (BR) em MODO 1
Usando o contador/temporizador 1 programa-se qualquer baud rate. Na grande maioria dos casos
tem-se o baud rate e é buscado o valor N a ser programado no contador/temporizador 1 (o mais
cômodo é usar o modo 2 - auto recarga). Um problema que sempre existe é o erro gerado pela aproximação do valor a ser programado no contador/temporizador. Isto provoca a geração de baud rates
ligeiramente diferentes.
Exemplo: Usando um cristal de 3,575611 MHz, qual é o valor a ser programado no timer 1 para
operar a 9600 bauds (usar SMOD=0)?
N = 3575611 / (384*9600) = 0,9699 (aproximadamente 1)
Usando timer 1 no modo 2 tem-se: 256 - 1 = 255 (TH1=TL1=255).
Observação: a transferência do dado recebido para o registro SBUF (e RB8, que guarda o stop
bit) e a ativação do flag RI somente acontecerá se:
RI = 0 e (SM2= 0 ou o bit de parada =1).
Página 68
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi
Modo 2 (assı́ncrono, 9 bits, baud rate fixo)
Este modo opera com 11 bits e o baud rate pode ser de 1/32 ou 1/64 do clock. O bit TB8/RB8
serve para transmitir a paridade ou gerar um segundo bit de parada (TB8=1). O frame de bits usado
neste modo é ilustrado na tabela 3.2.
START
Bit 0
Bit 1
Bit 2
Bit 3
Bit 4
Bit 5
Bit 6
Bit 7
TB8
STOP
Tabela 3.2: Frame de bits gerado pela porta serial em MODO 2
O único controle que se tem sobre o baud rate é através do uso do bit SMOD. Se SMOD=0,
trabalha-se com BR=clock/32 e se SMOD=1, trabalha-se com BR=clock/64. A figura 3.6 ilustra o
esquema para geração do baud rate no modo 2.
Figura 3.6: Esquema para a geração do Baud Rate (BR) em MODO 2
Na transmissão o bit 8 é copiado do bit TB8. Na recepção o bit 8 é copiado para o bit RB8. Os
bits TB8 e RB8 estão no registro SCON.
O dado recebido somente é carregado no SBUF (e RB8) se:
RI=0 e (SM2=0 ou bit 9 (stop bit) = 1).
Página 69
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi
Modo 3 (assı́ncrono, 9bits, baud rate variável)
É idêntico ao modo 2, exceto que a geração do baud rate é idêntico ao modo1. A tabela 3.3 e
figura 3.7 ilustra o frame de bits e a geração do baud rate.
START
Bit 0
Bit 1
Bit 2
Bit 3
Bit 4
Bit 5
Bit 6
Bit 7
TB8
STOP
Tabela 3.3: Frame de bits gerado pela porta serial em MODO 3
Figura 3.7: Esquema para a geração do Baud Rate (BR) em MODO 3
3.1.4
Cuidados com a Porta Serial
Nos quatro modos a transmissão se inicia quando é escrito um byte em SBUF. A recepção é habilitada quando REN=1 (no MODO 0 exige-se também RI=0). Não se esqueça de que somente existe
uma única interrupção dedicada à porta serial, portanto ela é gerada por duas condições:
a)Término da transmissão de um byte → flag TI
b)Término da recepção de um byte → flag RI
Deve-se testar os flags RI e TI para determinar se a interrupção foi por transmissão ou por recepção.
Os flags RI e TI devem ser apagados por software.
Um outro cuidado muito importante é com a geração do baud rate. Muitas vezes não se consegue
a comunicação serial devido à imprecisão do baud rate. Portanto o problema a seguir é proposto:
Programar o contador/temporizador 1 para gerar 9600 bauds para a porta serial operando em modo
3, sendo que o cristal é de 4 MHz.
Solução: N = 4000000/(384*9600) = 1,085 (SMOD=0).
Na solução calculou-se que N=1,085 mas somente podem ser programados números interos; assim,
caso se aproxime para 1, o baud rate gerado será de BR=4000000/384=10416,7. Será que irá funcionar
bem com esse baud rate ?
Para responder esta pergunta é necessário compreender o que acontece com a transmissão serial.
Esta transmissão é assı́ncrona, quer dizer, pode iniciar em qualquer instante; o inicio é caracterizado
pela presença de um bit de partida (START). Uma vez iniciada, deve-se garantir a duração de cada
bit. Para cada byte é transmitido um bit de partida, os bits de dados e um ou dois bits de parada.
O que se deve buscar é garantir que não haja um erro muito grande neste frame de bits. A figura 3.8
ilustra o caso da porta serial operando em modo 3.
Página 70
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi
Figura 3.8: Erros provocados pela diferença no baud rate
A fase mais critica é a recepção do último bit porque poderá apresentar uma defasagem muito
grande (rotuladas de E1 e E2 na figura). Não se pode especificar um valor limite para esses erros pois
diversos fatores, particulares para cada caso, precisam ser levados em consideração. Como um valor
prático e que funciona na grande maioria dos casos arbitra-se que o valor do erro, para o último bit,
deve ser menor que 40% da duração de um bit (usando BR exato).
|
11
40
1
11
−
|≤
∗
BRp BR
100 BR
A equação pode ser simplificada para: |
11
11
1
−
|≤
BRp BR
27, 5 ∗ BR
Como pode ser verificado, com um cristal de 4Mhz não se conseguirá transmitir a 9600 pois o baud
rate será muito grande.
|
11
1
11
−
|≤
10416, 7 9600
27, 5 ∗ 9600
8,167 µs≤3,788µs→falso
Página 71
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi
3.1.5
Comunicação entre vários 8051
Figura 3.9: Comunicação entre vários 8051
Os modos 2 e 3 permitem interligar vários 8051, sendo um mestre e vários escravos. Nestes modos
temos:
*1 start bit;
*8 bits de dados;
*um nono bit que vai para o bit RB8 ( na recepção) ou pode ser escolhido 0 ou 1 na transmissão
escrevendo-se em TB8;
*1 stop bit
Note que se SM2 = 1 e RB8 = 1, a interrupção da serial será atendida.
O algoritmo de comunicação consiste em:
1)No inı́cio, todos os escravos estão com SM2 = 1
2)Quando o mestre quiser enviar dados para algum escravo, ele escreverá 1 em seu bit TB8 e
então enviará serialmente o endereço do escravo desejado, e como teremos todos os bits RB8
em 1, todos escravos serão interrompidos para verificar se é seu o endereço enviado.
3)O escravo selecionado zerará o seu bit SM2 e estará preparado para receber os dados, os quais
terão agora o nono bit (RB8) em 0.
4)Os demais escravos permanecerão com SM2 em 1 e, dessa forma, não serão mais interrompidos
pois os dados têm RB8 = 0.
5)Em resumo, o mestre envia endereços com o nono bit em 1 e os dados com o nono bit em 0,
portanto, se o mestre desejar se comunicar com outro escravo basta enviar o novo endereço
com o nono bit em 1.
Página 72
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi
3.1.6
Comunicação serial entre o 8051 e o PC
Devido à diferença de tensão entre os nı́veis TTL e os usados no padrão RS-232C (PC), é necessário
usar circuitos conversores para interfacear o microcontrolador com a porta serial do PC. A conversão
pode ser feita através de circuitos transistorizados discretos (veja as figuras 11.10,11.11 e 11.12 e leia
a seção 11.4) ou através de circuitos integrados como o 1488 (conversor de TTL para RS-232C) e o
1489 (conversor de RS-232C para TTL). A seguir estão os esquemas dos dois integrados e o esquema
básico de interligação entre o 8051 e a serial do PC.
Figura 3.10: Esquema de ligação entre o computador(PC) e o 8051
Página 73
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi
3.1.7
Exercı́cios
TX SER
Usando um loop infinito, transmitir pela porta serial todos os caracteres ASCII de ”0”a ”Z”. Usar
9600 bauds, 8 bits de dados, 1 bit de partida e 2 bits de parada.
Para este caso o modo 3 é o mais adequado e TB8=1 será usado para gerar um bit de parada. A
transmissão será feita por interrupção, quer dizer, a cada byte transmitido haverá uma interrupção.
O contador/temporizador 1 será programado para modo 2 (auto-recarga).
SCON
TMOD
SM0
1
GATE
0
IE
EA
1
SM1
1
SM2
0
C/*T
0
M1
1
-
-
ES
1
REN
0
M0
0
ET1
0
TB8
1
RB8
0
GATE
0
EX1
0
TI
0
C/*T
0
ET0
0
EX0
0
Cálculo do divisor formado pelo contador/temporizador 1:
N = 3575611/(384*9600) = 0,9699 ∼
= 1. (TH1 = TL1 = 256 - 1 = 255).
;TX_SER.ASM
DEFSEG PROG, CLASS=CODE, START=0
SEG PROG
;
BR_9600
;
EQU
255
ORG
AJMP
RESET
INIC
ORG
AJMP
SINT
SERIAL
ORG
MOV
MOV
MOV
SETB
MOV
MOV
MOV
SETB
SJMP
50H
TMOD,#20H
TH1,#BR_9600
TL1,#BR_9600
TR1
SCON,#0C8H
IE,#90H
A,#"0"
TI
$
ORG 100H
CLR
MOV
INC
CJNE
MOV
TI
SBUF,A
A
A,#"Z"+1,SER1
A,#"0"
;
;
INIC:
;TIMER 1 EM MODO 2
;PROGRAMAR BAUD RATE
;INICIAR TIMER 1
;MODO 3 COM TB8=1
;HAB INTERRUP SERIAL
;PRIMERO ASCII
;TX PRIMEIRO ASCII
;LOOP INFINITO
;
SERIAL:
;
SER1:
;
RETARDO:
;
AQUI:
ACALL
RETI
RETARDO
MOV
R7,#0
DJNZ
RET
R7,AQUI
;APAGAR FLAG
;TRANSMITIR
;FOI O ULTIMO ?
;REINICIALIZAR
;ATRASAR TRANSMISSAO
;
END
Página 74
M1
0
RI
0
M0
0
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi
RX SER
O circuito deverá responder aos seguintes comandos que chegam pela porta serial:
1 → acender todos os leds
R → acender led vermelho
A → acender led amarelo
V → acender led verde
0 → apagar todos os leds
r → apagar led vermelho
a → apagar led amarelo
v → apagar led verde
Estes comandos vão chegar pela porta serial usando o formato: 1 bit de partida, 8 bits de dados,
2 bits de parada, com um baud rate de 9600.
;RX_SER.ASM DEFSEG PROG, CLASS=CODE, START=0SEG PROG
;
BR_9600
EQU
255
LED_VERMELHO
EQU
P1.0
LED_AMAR
EQU
P1.1
LED_VERDE
EQU
P1.2
CHEGOU
EQU
32.0
;
ORG
RESET
AJMP
INIC
;
ORG
SINT
AJMP
SERIAL
;
ORG
50H
INIC:
MOV
TMOD,#20H
MOV
TH1,#BR_9600
MOV
TL1,#BR_9600
SETB
TR1
MOV
SCON,#0D0H
MOV
IE,#90H
CLR
CHEGOU
;
ESPERA:
JNB
CHEGOU,ESPERA
CLR
CHEGOU
;
CJNE
A,#"0",LB1
CLR
LED_VERMELHO
CLR
LED_AMAR
CLR
LED_VERDE
SJMP
ESPERA
;
LB1:
CJNE
A,#"1",LB2
SETB
LED_VERMELHO
SETB
LED_AMAR
SETB
LED_VERDE
SJMP
ESPERA
;
LB2:
CJNE
A,#"R",LB3
SETB
LED_VERMELHO
SJMP
ESPERA
;
LB3:
CJNE
A,#"r",LB4
CLR
LED_VERMELHO
SJMP
ESPERA
;
LB4:
CJNE
A,#"A",LB5
SETB
LED_AMAR
SJMP
ESPERA
Página 75
;TIMER 1 EM MODO 2
;PROGRAMAR BAUD RATE
;INICIAR TIMER 1
;MODO 3 COM REN=1
;HAB INTERRUP SERIAL
;APAGAR FLAG
;AGUARDAR UM COMANDO
;CHEGOU 0
;CHEGOU 1
;CHEGOU R
;CHEGOU r
;CHEGOU A
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi
;
LB5:
CJNE
CLR
SJMP
A,#"a",LB6
LED_AMAR
ESPERA
;CHEGOU a
CJNE
SETB
SJMP
A,#"V",LB7
LED_VERDE
ESPERA
;CHEGOU V
CLR
SJMP
LED_AMAR
ESPERA
;CHEGOU v
CLR
MOV
SETB
RETI
RI
A,SBUF
CHEGOU
;APAGAR FLAG DE INTERRUP
;COLOCAR DADO NO Acc
;
LB6:
:
LB7:
;
SERIAL:
END
3.2
3.2.1
Programação em Assembly
Introdução teórica
Este parte da apostila é de fundamental importância para quem deseja adquirir conhecimentos
básicos em programação (software). Aqui, é ensinado passo a passo o procedimento da elaboração de
programas simples e com loops; utilizando a linguagem Assembly aplicada aos microcontroladores da
famı́lia MCS-Sl da Intel.
Uma vez que nós aprendemos e praticamos as técnicas de programação ensinadas, poderemos
aplicar tal metodologia de implementação de programas a qualquer outra linguagem de programação,
seja ela de baixo, médio ou alto nı́vel.
Existem muitas linguagens de programação que podem ser utilizadas na programação de sistemas
inteligentes, utilizando mierocontroladores, além do Assembly (nı́vel baixo), tais como as linguagens
estruturadas de programação C (nı́vel médio), BASIC e PL/M (nı́vel alto). A escolha de uma delas
na elaboração de um projeto de software é muito importante é envolve o conhecimento técnico especializado.
A caracterı́stica de uma linguagem de nı́vel baixo, como o Assembly, é a de apresentar o mesmo
conjunto de instruções que aquele definido pelo fabricante da famı́lia de microprocessadores ou microcontroladores, com a qual se deseja desenvolver os projetos de programa. Isso permite um total
controle sobre os registradores intemos do dispositivo e as posições de memória e, conseqüentemente,
são gerados programas muito mais compactos em relação às outras linguagens. Assim, sempre que existirem limitações de memória (pouca memória) e limitações de velocidade de processamento (máxima
velocidade de processamento), recomenda-se a utilização da linguagem de programação de nı́vel baixo,
ou seja, o Assembly. Portanto, pelas próprias caracterı́sticas dos microcontroladores, é muito comum
a utilização do Assembly na elaboração de projetos de equipamentos inteligentes. Em contrapartida, a
única desvantagem da linguagem Assembly em relação às outras linguagens é sua caracterı́stica de ser
rica em detalhes, solicitando dos programadores um conhecimento bastante grande sobre o dispositivo
a ser programado.
A caracterı́stica de uma linguagem de nı́vel médio, como o C, é a de apresentar os aspectos de
uma linguagem de nı́vel baixo (manipulação bit a bit ou byte a byte dos registradores internos e das
posições de memória), como também as caracterı́sticas de uma linguageni de nı́vel alto, que definimos
a seguir. Atualmente, essa é uma das linguagens de programação mais utilizadas em projetos de
equipamentos inteligentes.
Página 76
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi
A caracterı́stica de uma linguagem de nı́vel alto é a de ser muito mais próxima da linguagem do
ser humano. Trata-se de uma linguagem descritiva, cujas instruções são palavras escritas em inglês e
que estão muito longe das instruções em Assembly. Cada instrução de uma linguagem de nı́vel alto
é representada por muitas instruções de uma linguagem de nı́vel baixo. Programar utilizando uma
linguagem de nı́vel alto é muito mais fácil que programar com uma linguagem de nı́vel baixo ou médio.
Mas quando se utiliza uma linguagem de programação de nı́vel alto, são gerados programas maiores e
com menor velocidade de processamento. Outra desvantagem da linguagem de nı́vel alto, que muitas
vezes é interpretada como vantagem, é a de não exigir do programador o conhecimento completo e
detalhado do dispositivo que se deseja programar.
Um programa em código de máquina (código-objeto) é composto por bytes que representam as
instruções do dispositivo. É a linguagem que o microcontrolador sabe e pode executar. Assim, sempre que for desenvolvido um programa em uma determinada linguagem de programação, é necessário
fazer a compilação desse programa para transformá-lo em linguagem de máquina. O programa em
linguagem de máquina deve ser simulado por meio de um simulador (AVSIM5l, Pinnacle etc.) ou
gravado em uma memória para verificar seu funcionamento por meio da utilização do próprio hardware do produto. A seguir inicia-se o estudo das técnicas de programação em Assembly para a famı́lia
de microcontroladores MCS-51 da Intel.
3.2.2
Estratégias de elaboração de programas
É muito importante para um programador, antes de implementar um programa, seguir uma determinada metodologia. A seguir, é descrita uma metodologia de elaboração de programas que é
independente da linguagem de programação.
Pré-requisitos do técnico que desenvolverá o projeto
a)Conhecer a estrutura interna (hardware) do dispositivo com que se deseja desenvolver o projeto;
b)Conhecer o conjunto de instruções do dispositivo.
Viabilidade do projeto
a)Obter e entender claramente as especificações do cliente (desejos do cliente, caracterı́sticas
do produto e do sistema, modo de funcionamento etc.);
b)Elaborar diferentes estratégias de soluções para o projeto. Isso pode ser feito utilizando-se
diagramas de fluxo de dados (DFD), diagramas de blocos, desenhos etc.;
c)Elaborar a viabilidade do projeto com relação ao hardware e ao software para verificar a
possibilidade de sua implementação junto ao cliente. Algumas perguntas são utilizadas para
garantir a viabilidade do projeto: Quais são as necessidades de hardware? Qual será o custo
final do produto (o cliente pagará por esse valor)? Qual será a quantidade de equipamentos a ser fabricada (a fábrica comporta essa quantidade)? Como serão feitas as entregas do
produto? Existem fornecedores de componentes no Brasil? Quais componentes devem ser
importados? Existem concorrentes? etc.;
d)Escolher a melhor solução junto com o cliente, ou seja, aquela que utilizará o menor número
de componentes e a que apresenta maior velocidade de processamento. Isso afeta diretamente
o custo final do hardware e traz uma maior flexibilidade funcional do produto.
Página 77
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi
Implementação do projeto
a)Elaborar o fluxograma do programa em Assembly: os fluxogramas devem ser implementados
desde o nı́vel de ’macrodetalhamento’ até o nı́vel de ’microdetalhamento’. Um fluxograma
representando o nı́vel de ’macrodetalhamento’ deve conter as idéias e os objetivos dentro dos
blocos representativos. Um fluxograma representando o nı́vel de ’microdetalhamento’ deve
utilizar as representações simbólicas dos mnemônicos das instruções dentro dos blocos representativos. Exemplo: dentro de um bloco do fluxograma, representar (A) ← (B): significa
a instrução MOV A,B;
b)A partir do fluxograma, gerar o programa-fonte na linguagem de programação escolhida (arquivo em código ASCII que contém as instruções que compõem o programa);
c)Compilar o programa-fonte para gerar o arquivo binário que corresponde ao programa em
códigos de máquina;
d)Fazer a linkagem dos arquivos binários para agrupar de maneira organizada, os diferentes
blocos de programa que compõem o programa final;
e)Efetuar a simulação do programa para verificar seu funcionamento e corrigir os possı́veis erros
de lógica. Nessa fase, não é necessário 0 hardware do produto;
f)Realizar a gravação da EPROM, inserção no hardware do produto e teste fı́sico de sua funcionalidade;
g)Efetuar a emulação do programa (é necessário um sistema emulador) para corrigir erros de
lógica ou eventuais falhas de algum componente, utilizando o próprio hardware do produto;
h)Fazer testes rápidos de bancada para verificar o funcionamento do produto final;
i)Realizar testes de longa duração (confiabilidade), em condições de estresse’, para a homologação do produto.
3.2.3
Fluxogramas
Essa ferramenta de programação é fundamental para a implementação de qualquer rotina de um
programa de microcomputador. É por meio dessa ferramenta que se pode observar como foi implementada a estratégia de solução de uma necessidade de programação elaborada por um programador.
O fluxograma representa como o fluxo de informações será processado pelo microprocessador.
Página 78