Você está na página 1de 514

Capa

Do Livro e Dos Autores


Direitos Autorais

Todos os direitos sobre esta obra esto reservados para os autores do livro. Texto
registrado na Biblioteca Nacional. Nenhuma parte deste livro poder ser reproduzida,
transmitida e gravada, por qualquer meio eletrnico, mecnico, por fotocpia ou outros,
sem a prvia autorizao, por escrito, dos autores. Apenas a MZ Editora Ltda. tem a
autorizao para a publicao desta obra.

Marcas Registradas
Vrias Marcas Registradas aparecem no decorrer deste livro. Mais do que simplesmente
listar esses nomes e informar quem possui seus direitos de explorao, ou ainda imprimir
os logotipos das mesmas, os autores declaram estar utilizando tais nomes apenas para
fins editoriais, em benefcio exclusivo do dono da Marca Registrada, sem a inteno de
infringir as regras de sua utilizao.

Produo

Capa e diagramao: Alexandre Mendona e Ricardo Zelenovsky

Dedicatrias:

Correspondncia:
Prof. Ricardo Zelenovsky,
Faculdade de Tecnologia - Dep. de Engenharia Eltrica
Campus Universitrio Darcy Ribeiro
CEP: 70.910-900, Braslia-DF

Prof. Alexandre Mendona,


Departamento de Engenharia Eltrica (DE/3),
Instituto Militar de Engenharia, Praa General Tibrcio, 80,
Urca, Rio de Janeiro, RJ, Brasil, CEP: 22.290-270.

e-mail:
zele@unb.br (Ricardo Zelenovsky)
alexmend@ime.eb.br (Alexandre Mendona)
mz@mzeditora.com.br (MZ Editora Ltda.)

Cursos, Dvidas e Sugestes

Contactar mz@mzeditora.com.br

Os Autores

Ricardo Zelenovsky graduou-se em Engenharia Eletrnica pelo IME (Instituto Militar de


Engenharia) em 1984, onde tambm concluiu seu Mestrado, em 1988. Em 2001, obteve seu ttulo de
Doutor em Cincias pelo Programa de Engenharia Eltrica da PUC-RJ. Foi professor do IME por
mais de 15 anos, tendo ministrado as disciplinas "Microprocessadores", "Projetos de Computadores
Digitais", "Processadores Digitais de Sinais (DSP)" e "Projetos de Circuitos Lgicos". Desde 2002,
professor adjunto do Departamento de Engenharia Eltrica da UnB, onde leciona as disciplinas
"Arquitetura de Processadores" e "Sistemas Digitais 2". Na Ps-Graduao, realiza pesquisas na
rea de sensores inteligentes e processamento de sinais. Ao longo de sua carreira, sempre participou
de orientaes acadmicas e projetos relacionados com microcontroladores, interfaceamento e
processadores digitais de sinais.

Alexandre Mendona graduou-se em Engenharia Eletrnica pelo IME (Instituto Militar de


Engenharia) em 1991, onde tambm concluiu seu Mestrado, em 1996. Obteve o ttulo de Doutor em
Cincias pelo Programa de Engenharia Eltrica da COPPE/UFRJ, em 2003. professor do IME,
desde 1996, onde ministra as disciplinas "Circuitos Combinacionais e Seqenciais", "Eletrnica
Digital" e "Microprocessadores", na Graduao, alm de atuar tambm na Ps-Graduao. Orienta
teses e projetos de fim de curso sobre assuntos relacionados a processamento de sinais, viso
computacional, reconhecimento de padres, interfaceamento com computadores pessoais, circuitos
com FPGA, programao orientada a hardware e instrumentao eletrnica.

Ricardo Zelenovsky e Alexandre Mendona so tambm pesquisadores, foram colunistas da


Revista Developers' Magazine por 8 anos, editores da pgina http://www.mzeditora.com.br e
escreveram os livros "Microcontroladores: Programao e Projeto com a Famlia 8051" (2005),
"Eletrnica Digital: Curso Prtico e Exerccios" (2004), "Monte seu Prottipo ISA Controlado por
FPGA" (2001), "Hardware: Programao Virtual de I/O e Interrupes" (2001), "PC e Perifricos:
um Guia Completo de Programao" (1996) e "PC: um Guia Prtico de Hardware e Interfaceamento"
(3 edies - 1996, 1999, 2002).
Prefcio

Este livro foi preparado para quem deseja conhecer e trabalhar com os microcontroladores
da extensa famlia 8051. Ao longo de seu estudo, o leitor constatar que procuramos
premiar tanto a teoria quanto a prtica. preciso lembrar que a prtica em
microcontroladores deve ir alm da programao e, obrigatoriamente, chegar at os
projetos. Assim, houve grande dedicao dos autores para desenvolver no leitor a
capacidade de projetar e programar sistemas microcontrolados. Alis, espera-se que o
estudo de projetos seja o grande diferencial desta publicao.

A abordagem cuidadosa dos assuntos e a grande quantidade de exerccios tornam este


livro adequado para os cursos e disciplinas de microcontroladores. Um outro ponto positivo
a diversidade de perifricos abordados, tanto nos textos, quanto nos exerccios. Citamos
mostradores LCD, alfanumrico e grfico, display de 7 segmentos, motores de passo,
motores CC, acionamento de tiristores, teclado, etc..

De uma maneira bem abrangente, o livro est dividido em cinco partes:

estudo da arquitetura dos microcontroladores;


programao com o conjunto de instrues;
emprego dos recursos embutidos (portas paralela e serial, temporizadores e

interrupes);
projetos envolvendo microcontroladores 8051;
descrio detalha de um projeto ilustrativo (P5C) com o 8051, empregando

11 perifricos.

Um ponto que merece destaque a ltima parte: o estudo do projeto ilustrativo


denominado Pentacontrolador, abreviado por P5C. Sua finalidade desenvolver e
estudar um sistema microcontrolado sofisticado, envolvendo os mais diversos perifricos.
Seu diagrama de blocos apresentado na pgina seguinte. O P5C faz uso do membro
mais simples da famlia 8051, que o 8031. Isto para que enfrentssemos o desafio de
adicionar externamente todos os recursos presentes no diagrama de blocos. claro que
este projeto permite o emprego de microcontroladores mais atuais, desde que
encapsulados em DIP40. possvel ainda empregar e programar, sem a necessidade de
remover do circuito, microcontroladores com memria flash interna, como os da Dallas e
os da Atmel.

No P5C, foram construdos diversos canais de comunicao, sendo que merecem


destaques as interfaces USB, IrDA, infravermelha, SPI e I2C. Existe a disponibilidade de
um conversor A/D de 13 bits, um conversor D/A de 8 bits e de um canal de udio, com
microfone de eletreto e fone de ouvido. Devido versatilidade desta placa, em nossas
universidades, j fizemos inmeros experimentos interessantes. Citamos o sistema para o
posicionamento de um arranjo de antenas com dois graus de liberdade empregando
motores CC, um veculo motorizado inteligente, uma interface para receber sinais da HP48
e imprimir em impressora laser, um sistema de controle de temperatura de gua e uma
comunicao USB com o PC. No momento, estamos desenvolvendo experimentos de
comunicao com IrDA, conexo com a Internet, eletrocardiograma e digitalizao de voz
com o intuito de trabalhar (com o auxlio de um computador) com voz sobre IP.

Todas essas aplicaes so por demais longas para serem includas no presente livro. Por
isso, disponibilizamos, atravs da pgina www.mzeditora.com.br, uma srie de
experimentos. Esses experimentos sempre traro uma pequena parte terica e programas,
incluindo o programa fonte. Os leitores tambm so convidados a disponibilizar seus
experimentos nesse mesmo local. Tambm estaro disponveis em formato eletrnico os
esquemas eltricos (Orcad) e o arquivo com a placa de circuito impresso j roteada
(Power PCB). Enfim, disponibilizamos todos os recursos necessrios para que o leitor,
caso deseje, fabrique sua prpria placa P5C. inteno dos autores, em funo dos
pedidos, fornecer a placa de circuito impresso (sem componentes) do Pentacontrolador.
Descrevemos agora os assuntos abordados nos diversos captulos do livro.

O Captulo 1 faz uma distino entre os conceitos de microprocessadores e de microcontroladores,


caracterizando muito bem estes ltimos. Apresenta tambm um pequeno histrico dos
microcontroladores. O Captulo 2 descreve a arquitetura bsica da famlia 8051. Ele inicia
conceituando a arquitetura von Neumann e a arquitetura de Harvard. Em seguida, so estudadas as
diversas reas de memria da famlia 8051, os registradores (R0, R1, ..., R7), os registradores para
funes especiais (SFR) e o espao acessvel bit-a-bit. Enfim, aqui descrita toda a RAM interna.

O Captulo 3 aborda as 111 instrues da famlia 8051. Elas so divididas em aritmticas, lgicas,
transferncia de dados, booleanas e saltos. Um conjunto de tabelas permite a rpida visualizao das
diversas instrues.

O Captulo 4 destinado pratica com a programao envolvendo o conjunto de instrues estudado


no captulo anterior. Como o aprendizado e a habilidade no uso das instrues assembly somente so
conseguidos com a prtica, neste captulo esto disponveis 29 exerccios resolvidos e mais 43
exerccios propostos.

O Captulo 5 orienta sobre o uso do montador, sendo que o escolhido foi o ASM51 da Metalink, por
ser bastante funcional, de larga aceitao e gratuito. So abordados os conceitos de smbolos,
rtulos, operadores, macros, etc., ou seja, tudo que necessrio para preparao de um bom
programa em assembly.

O Captulo 6, aproveitando que o leitor j sabe programar, d inicio seqncia de estudo dos
recursos embutidos no 8051. O recurso abordado neste captulo o das portas paralelas. Estudam-se
as portas com relativa profundidade e existe tambm uma grande quantidade de exemplos e
exerccios.

O Captulo 7 enfoca os contadores/temporizadores desta arquitetura. So estudados os modos de


operao e quando se deve empreg-los. Os exerccios ao final do captulo permitem uma boa
sedimentao dos conceitos abordados.

O Captulo 8 apresenta as interrupes disponveis na arquitetura 8051. So abordados os


registradores envolvidos, a latncia das interrupes e ainda uma maneira fcil para a execuo de
instrues passo a passo.

O Captulo 9 aborda o ltimo recurso interno ainda no estudado, que a porta serial. Aqui se
desenvolve o conceito de comunicao serial e o estudo da porta serial do 8051, incluindo
problemas de comunicao resultantes de imprecises na gerao do taxa de transmisso. Este
captulo termina com uma breve apresentao da porta serial do PC, j que se pretende empreg-la
para comunicao com os nossos prottipos.

O Captulo 10 destina-se a estudar a pinagem e a temporizao dos sinais gerados pelos membros da
famlia 8051. So conceituados Ciclo de Mquina, Ciclo de Barramento e os demais ciclos para
acesso memria de programa e memria de dados. Ao final, apresentado um estudo sobre a
gerao do sinal de reset para este microcontrolador.

O Captulo 11, que acreditamos ser um dos mais importantes do livro, desenvolve os conhecimentos
necessrios para que o leitor projete seus sistemas microcontrolados. Para tanto, aqui so abordados
os conceitos para a construo dos barramentos de dados e de endereos. Em seguida, estudam-se as
alternativas para fazer-se a conexo do microcontrolador com memrias externas (EPROM ou
SRAM), tais como projetar e conectar dispositivos de entrada e sada.

O Captulo 12 apresenta e estuda todo o projeto do Pentacontrolador, que, como j se afirmou, traz
uma grande quantidade de perifricos e recursos. Aqui o leitor encontra o ponto de partida para os
mais diversos problemas de projeto, pois so apresentadas solues para conexo com memrias,
com conversores A/D, com conversores D/A, com relgios permanentes, com dispositivos de
comunicao (USB e IrDA), com mostradores de cristal lquido (alfanumricos e grficos), com
memrias flash seriais, com dispositivos SPI e I2C, dentre outros.

Finalmente, o Captulo 13 apresenta de maneira simples a programao para microcontroladores


empregando a linguagem C com o compilador SDCC. Aqui no se pretende ensinar C com grande
profundidade e nem estudar a fundo o compilador. Fornece-se apenas o ponto de partida para que o
leitor depois continue com seu estudo. O compilador SDCC foi escolhido por estar disponvel
gratuitamente na Internet.

Os Apndices apresentados ao final fazem a complementao dos assuntos correlatados ao estudo de


microcontroladores. Destacam-se os apndices que tratam dos mostradores LCD e do teclado do PC,
alm do apndice G, que mostra como empregar e programar microcontroladores com memria flash
interna sem remov-los da placa Pentacontroladora.

Antes de finalizarmos este prefcio, importante relatarmos, um pouco da estria deste livro e, ao
mesmo tempo, dar crdito a diversas pessoas que diretamente ou indiretamente, participaram de sua
criao. Comeamos em 1983, quando o Dr. Wendelin Lotze, um dos principais acionistas e diretor
da empresa Multitron, procurou o professor do IME Pedro Paulo Leite do Prado, buscando por um
estagirio para auxiliar no projeto do sistema de controle de uma mquina de solda eltrica que seria
construda para soldar varetas de elemento combustvel nuclear. O indicado foi um dos autores deste
livro, Ricardo, que na poca cursava o 4o ano do curso de Engenharia Eletrnica do IME. O outro
autor, Alexandre, muito mais jovem, obviamente no participou por ainda estar cursando seu
primeiro grau.

Foi assim que em 1983 comeamos a trabalhar com um dos primeiros 8031 que chegaram no Brasil.
A nica fonte de consulta que tnhamos era a cpia de um manual terrvel, com todas a pginas
carimbadas pela Intel com a palavra preliminar. Pudemos comprovar a mxima que diz: os
manuais no foram escritos para serem entendidos. Na poca, no existia Internet e os computadores
PC eram extremamente caros. Iniciamos com uma pequena montagem que usava memrias estticas
2114 (quem se lembra?) e a programao era feita em octal empregando chaves tumb-wheel. A carga
do programa era feita endereo a endereo. Registrvamos nas chaves o endereo e o byte e, em
seguida, com o acionamento de um boto, escrevamos na memria. Um bit errado punha tudo a
perder. Depois de muito assembler no brao e bolhas nos dedos, aprendemos o suficiente para
desenvolvermos um gravador de EPROM com teclado e mostrador de 7 segmentos, que permitiu
acelerar o trabalho.

A etapa seguinte foi a preparao de uma interface serial deste gravador de EPROM com o
computador Epson HX20, que tinha um display LCD de 4 linhas de 20 caracteres. Era uma maravilha
poder armazenar os programas na fitas (sim, ele usava fitas) desse computador. Quando o Dr. Lotze
escreveu um pequeno montador em Basic, o trabalho decolou. Decolou segundo nossos padres, pois
esse montador, escrito numa linguagem interpretada, era muito lento. Algo perto de 10 instrues por
minuto, mas certamente muito mais rpido e confivel que o montador de papel e lpis, onde sempre
se erra alguma coisa. Assim desenvolvemos o sistema de controle para as mquinas de solda de
vareta de combustvel, que nunca foram compradas. Em seguida, para aproveitar o projeto e visando
ao mercado industrial, aperfeioamos o sistema de controle das mquinas de solda, tornando-as mais
versteis, quando ento conseguimos vender umas poucas.

Um trabalho interessante com a Multitron aconteceu nos anos de 1987 e 1988, sendo que a empresa
j estava com outro grupo acionrio e a engenharia de projeto estava com Paulo Csar Lopes Leite.
A proposta era por mquinas para medir a viscosidade da borracha. A norma especifica que o
ensaio, de acordo com o tipo da borracha, deva ser feito em temperaturas especficas, dentro da faixa
de 40 a 200C, com preciso de 0,5C. A amostra de borracha colocada sobre um rotor e
prensada entre dois blocos de alumnio j aquecidos na temperatura do ensaio. Depois de uma espera
de 4 minutos, verifica-se a viscosidade atravs do torque experimentado ao fazer girar o rotor. Neste
projeto, estavam envolvidos comandos pneumticos, controle de potncia por meio de TRIACs,
conversores A/D para monitorar a temperatura dos dois blocos e fazer a leitura do torque, interface
com a impressora e ainda um sistema para o controle PID para garantir a temperatura de cada bloco
na preciso exigida. Tudo isso escrito em assembly, inclusive os clculos diferenciais e integrais do
PID. O resultado foi excelente e ganhamos de longe das mquinas alems e americanas.

Em paralelo com esses projetos industriais, como professores no IME, desenvolvamos diversos
projetos didticos ou de pesquisa empregando este microcontrolador. Contvamos com uma
ferramenta excepcional, o HP 64000, que dentre outros processadores, emulava o 8031. Em 1992, o
outro autor, o Alexandre, j formado em engenharia eletrnica pelo IME, passou a trabalhar no
Instituto de Pesquisa e Desenvolvimento do Exrcito (IPD), onde fez diversos projetos empregando o
8051. Dentre eles, o mais importante foi o Sistema de Medio de Tempos entre Eventos da Arma
Anti-Carro para Pequenos Escales. O projeto consistia em medir o comportamento da presso dos
gases no interior do tubo da arma durante um tiro. Quando o atirador pressionava o gatilho, a
aquisio de dados comeava. Aps o ensaio, transmitia-se por porta serial toda a informao
capturada para um PC. Uma pequena adaptao deste sistema deu origem ao Sistema de Medidas de
Telemetria do Mssil Solo-Ar, que visava a adquirir informaes transmitidas por um mssil logo
aps seu lanamento.

O embrio deste livro foi escrito em 1993, sob a forma de uma apostila em espanhol, durante o
perodo em que Ricardo trabalhou com professor na Escola Politcnica do Exrcito Equatoriano
(EsPE), fruto de um acordo do Brasil com o Equador. Em 1995, surgiu a sociedade que no futuro iria
dar origem MZ Editora, pois os dois autores, recm transferidos para o IME, se encontraram e
mesclaram tudo que tinham escrito, dando origem aos diversos livros da editora. Devido falta de
tempo e a diversos aspectos de mercado, o livro sobre 8051 sempre ficou com baixa prioridade.
Durante esse perodo, muitos foram os alunos que estudaram 8051 na apostila em espanhol, tanto no
Brasil, quanto no Equador.

Em 2002, decidimos consolidar, reescrever e ampliar tudo que tnhamos sobre 8051, dando origem a
este livro. Apesar das mudanas de mercado e do surgimento de outros microcontroladores, o espao
dedicado ao 8051 ainda grande e este microcontrolador continua vigoroso. A cada ano, as fbricas
despejam no mercado novos membros desta antiga famlia. importante explicar que, em 2002,
enquanto desenvolvamos uma das primeiras verses do projeto que iria acompanhar este livro, o
Brasil conquistava o ttulo de pentacampeo. Desde essa poca, graas a uma idia do colega Altair
Alves Costa, passamos a nos referir ao projeto ilustrativo deste livro como o Pentacontrolador.

Ao longo desses anos, diversos trabalhos foram realizados e o conhecimento adquirido est todo
aqui presente. preciso agradecer a todos que, trabalhando em projetos que orientamos, ou que
atravs de sugestes e incentivos, de uma forma ou de outra, colaboraram para a preparao deste
livro. Comeamos com alguns colegas da EsPE (Escola Politcnica do Exrcito Equatoriano), os
Engenheiros Ruben Lon, Ramiro Rios, Fabrcio Morales. preciso citar o projeto orientado na
EsPE com os alunos de graduao Hugo Fernando Cordova Guerra e Eduardo Gonzalez Salazar, que
construram um buffer de impresso inteligente onde o 8051 trabalhava com 1 M de memria
dinmica com refresh.

No IME, diversos alunos fizeram projetos de graduao, mas devemos destacar:

os alunos que construram a Multi-Interface Programvel, que fazia converso entre os


padres RS 232C, Centronics, IEEE-488 (GPIB) e TDI (mainframe), trazendo
versatilidade para o laboratrio de microcomputadores;
os alunos Eduardo Camilo da Silva, Eduardo Tetsuo Haranaka e Juan Carlos Castro y

Castro, que, em 1987, desenvolveram o software da Multi-Interface Programvel;
os alunos Daniel de Arajo Lima, Frank Koji Mygiama e Jlio Csar Cardoso
Tesolim, que, em 1997, construram uma interface que permitia HP48 imprimir em
impressoras compatveis com PC.
os alunos Walter Jos Guimares Junior, Saulo Pimentel Wulhynek e Roberto Miller
Fernandes Vianna Junior, que participaram do projeto de modernizao de uma
estao rdio do Exrcito Brasileiro.

No IPD, aos colegas Bruno Conseza de Carvalho e Eduardo Mota Henriques, que participaram
ativamente do projeto do Sistema de Medio de Tempos.

Na UnB, os projetos orientados mais recentes foram feitos por:

Gustavo Vincius Loureno Moiss, que empregou o microcontrolador para construir


um arranjo de microfones para a localizao e o rastro de fontes sonoras empregando
motores CC.
Augusto Csar Mendona de Sousa, que desenvolveu um sistema de controle de

temperatura de gua utilizando o microcontrolador 8051.
Doaldo Navai Jnior, que construiu uma plataforma mvel microcontrolada para a

medio de ambientes, empregando motores de passo.
Gabriel Malta Castro e Rodrigo Duarte Lorea Zunino, com uma nova verso da

interface com HP48, permitindo que ela empregasse impressoras laser da HP.
Andrei Salomo e Alberto de Carvalho Friedman, que levaram adiante o trabalho
iniciado pelo ento aluno Joverlndio e construram todo o firmware para operao
da interface USB com a ponte USBN9603.
Carlos Eduardo Coutinho Nogueira e Tiago Alves da Fonseca, que preparam algumas
rotinas para a interface IrDA e prepararam nosso Pentacontrolador, ainda que de
maneira limitada, para conectar-se Internet.

No momento em que fechamos este prefcio, estamos iniciando com nossos alunos projetos com o
P5C para:

completar as rotinas de comunicao IrDA;


a aquisio e a exibio de sinais de eletrocardiograma em LCD grfico.
o controle de telefone convencional via acesso a voz sobre IP (VOIP);
ensaios com USB 2.0.

Diversas foram as pessoas que participaram da elaborao da placa Pentacontroladora. Na


concepo e ensaio das primeiras verses, tivemos a colaborao do engenheiro Altair Alves Costa.
A primeira verso do roteamento da placa Pentacontroladora foi feita, de maneira abnegada, por
Augusto Jos de Oliveira Martins, mas, devido a sua viagem para a Austrlia, o projeto e a
abnegao foram passados para o aluno Igor Ferreira Cardoso. Em virtude de uma srie de
alteraes, o Igor praticamente fez um novo roteamento e sempre recebeu com sorriso e otimismo as
alteraes que toda hora fazamos na placa j roteada. importante ainda comentar a colaborao de
Sebastio Fabiano Leme, que, empregando sua experincia, fez diversas correes na placa do
Pentacontrolador. Agradecemos ainda ao CEPESC, que, em parceria com a UnB, viabilizou a
construo do circuito impresso das diversas verses de nossa placa controladora.

Finalmente, pedimos desculpas a muitos outros colaboradores que, por limitao de nossas
memrias, cometemos o equvoco de no cit-los. Esperamos que o nosso leitor receba um produto
de excelente qualidade.

Rio de Janeiro, 02 de agosto de 2005.

Ricardo Zelenovsky e Alexandre Mendona.


Prefcio da Verso Eletrnica

J se passaram 8 anos desde a publicao em papel da primeira edio deste livro. Com
o esgotamento dessa edio e decidimos lanar uma verso eletrnica e assim
experimentar esta nova forma de mercado.

fcil preparar a verso eletrnica de um livro que apenas faz uso de texto. Entretanto,
devemos confessar que o grande desafio foi a preparao das figuras e tabelas de forma
a ficarem apresentveis nos mais diversos dispositivos de leitura. Para dar segurana aos
nossos leitores, decidimos disponibilizar as principais figuras na pgina da MZ Editora
(www.mzeditora.com.br).

A edio atual apresenta pequenas melhoras e faz as correes dos erros detectados na
edio anterior. A maioria desses erros foi detectada pelos nossos alunos, entretanto,
precisamos fazer um agradecimento especial ao ento aluno Odair Cerajolis que teve a
pacincia de fazer uma grande busca. Esperamos que este livro continue a atender s
necessidades dos estudantes e projetistas brasileiros. Crticas e sugestes so sempre
bem vindas.

Braslia, 24 de junho de 2013.

Ricardo Zelenovsky e Alexandre Mendona.


1. Microcontroladores

O atual momento tecnolgico, gerado principalmente pela capacidade de integrao


eletrnica, marcado pela presena macia de sistemas inteligentes. O barateamento da
eletrnica integrada fez cair vertiginosamente o preo de processadores e memria,
viabilizando suas implantaes nos mais diversos equipamentos. Tm-se processadores
nos telefones celulares, toca-CD, videocassetes, televisores, relgios, mquinas de lavar
roupa, fornos de microondas e at em automveis. o que se denomina computao
invasiva, ou seja, a computao presente nos nossos diversos equipamentos. Um grande
agente desta computao invasiva o microcontrolador, que ser objeto de estudo ao
longo deste livro.

importante comentar que o termo computao aqui empregado no seu sentido mais
amplo, porm, na verdade, os motores dos principais equipamentos modernos so os
denominados microcontroladores e microprocessadores.

Neste captulo, faremos um breve estudo dos conceitos de microprocessadores e


microcontroladores. Vamos dedicar bastante esforo na sua diferenciao, j que motivo
de muita dvida. Em seguida, abordaremos de maneira breve o mercado de
microcontroladores, indicando os principais fabricantes. Finalmente, apresentaremos a
famlia de microcontroladores 8051 ou MCS-51 junto com um pequeno histrico. Como o
leitor poder constatar, existe uma grande quantidade de fabricantes de semicondutores
trabalhando com a famlia 8051. Este fato uma grande vantagem pois, alm da
diversidade de opes, no se fica preso a um nico fabricante.
1.1. O Que Um Microcontrolador?

Para tornar bem claro o conceito de microcontrolador, consideremos o projeto de um


sistema bem simples, por exemplo, o controlador para um elevador. No entanto, como os
microcontroladores ainda no foram apresentados, faremos o projeto com um
microprocessador, desses clssicos usados para montar computadores. Como o controle
de um elevador no pede grande capacidade de processamento, podemos optar por uma
CPU (processador) mais simples, como um 8086 ou 80286. At mesmo um processador
de 8 bits, como um 8085 ou Z-80, j seriam suficientes.

O que tal processador deveria controlar? Talvez uma srie de itens: os comandos para
abrir e fechar a porta da cabine, para controlar o tempo de abertura e fechamento dessa
porta, para ligar e desligar o motor, para controlar sua direo de rotao (subir ou
descer), para receber os pedidos via teclado, para monitorar a entrada e sada de
pessoas atravs da interrupo de um feixe infravermelho junto porta e at um sensor de
peso para verificar o limite de carga do elevador. Com o intuito de fazer tudo isso,
propomos a arquitetura da figura 1.1.
Ao observamos a arquitetura proposta, notamos uma srie de blocos, que sero justificados a seguir.
A memria ROM usada para armazenar o programa de controle (firmware), de forma que, ao ser
ligado, o sistema de software esteja sempre pronto. Alm desta memria, necessria uma memria
RAM para armazenar as varveis do programa e os resultados intermedirios, ou seja, uma memria
que sirva de rascunho. Para monitorar as entradas de teclado e de sensores infravermelhos, usamos a
porta paralela, onde cada bit corresponde entrada da informao de cada um destes sensores. Para
gerar as sadas que iro acionar o motor da porta e o motor principal, tambm nos valemos da porta
paralela, sendo um bit para acionar cada motor. Essa porta paralela ainda serve para comandar o
painel e acender luzes de alerta.

Para controlar o tempo em que a porta fica aberta ou fechada, a pausa entre a parada do elevador e a
abertura da porta, alm de uma srie de outros intervalos, foi necessrio o emprego de
temporizadores. Para ler o sensor que indica o peso do elevador, adicionamos um conversor
analgico/digital (A/D). Usando a informao desse sensor, a CPU verifica se o elevador est
sobrecarregado. A utilizao do conversor digital/analgico (D/A) justificado pelo fato do
comando do motor principal poder ser um motor controlado por tenso. Quanto maior a tenso, maior
a velocidade de rotao, o que permitiria um controle suave para a partida e a parada do elevador.
Finalmente, para monitorarmos o funcionamento deste sistema de controle, conhecer seu estado e
adquirir relatrios de falha, colocamos uma porta serial. Assim, com um computador porttil (PC)
seria possvel fazer um diagnstico completo do controlador.

Portanto, para executar uma tarefa simples como a de controlar um elevador, chegamos facilmente a
um sistema com um total de 6 ou 7 circuitos integrados (CI). A montagem deste controlador exige
uma placa de circuito impresso de tamanho razovel, envolve tempo no desenvolvimento do projeto
eletrnico e demanda um custo de montagem que proporcional ao nmero de componentes do
sistema. Isso sem falar da probabilidade de falhas, que tambm proporcional quantidade de
componentes.

Da surge a pergunta: no possvel reunirmos tudo isso em um nico circuito integrado? A resposta
sim. Mas que vantagens haveria ao colocar todos aqueles blocos da figura 1.1 integrados dentro de
um nico chip?

menor tamanho do controlador;


menor consumo de energia;
reduo do tempo de projeto;
reduo do custo do projeto;
maior confiabilidade e
facilidade de manuteno.

Portanto, esta uma idia muito interessante. Mas, o que devemos esperar da CPU que ser integrada
dentro deste processador? Ser que ela vai precisar de fazer contas em ponto-flutuante? Sero
necessrias operaes MMX? claro que no. Ento, qual deve ser o perfil desta CPU?

baixa capacidade de processamento;


instrues compactas e velozes;
capacidade de manipular bits;
operao somente com inteiros;
facilidade para adicionar-se hardware;
facilidade de programao;
flexibilidade na arquitetura de memria.

Chegamos assim a um circuito integrado que j traz incorporado todos os blocos apresentados na
arquitetura da figura 1.1. Uma arquitetura com estas caractersticas est claramente voltada para o
controle de dispositivos e, por isso, recebe o nome de microcontrolador. De maneira bem simples
podemos definir microcontrolador como um microprocessador simples, ao qual se incorporou uma
grande quantidade de dispositivos com o intuito de us-lo nas mais diversas aplicaes de controle.
O diagrama de figura 1.2 apresenta o microcontrolador adequado para o controle do elevador.

Desta forma, ressaltamos agora a diferena entre microprocessador e microcontrolador. O


microprocessador (P) dedicado ao processamento, oferece uma grande quantidade de modos de
acesso a dados, permite uma srie de operaes sobre esses dados e trabalha com operaes em
ponto-flutuante. Resumindo, serve para sistemas que fazem grandes quantidades de operaes sobre
os dados. J com o microcontrolador (C) a idia outra. Sua finalidade principal o controle
digital. Deve oferecer uma grande quantidade de recursos para entradas e sadas digitais,
possibilidade de medir intervalos de tempo e viabilizar sistemas de pequeno tamanho fsico. Ele no
precisa de realizar operaes sofisticadas sobre os dados. Resumindo, nunca um microcontrolador
ser usado para construir um computador.
1.2. O Mercado de Microcontroladores.

Existe uma grande disponibilidade de fabricantes de microcontroladores, cada um com


suas caractersticas. Entretanto, ao olharmos com cuidado, verificamos que as diferenas
no so assim to grandes e que, em essncia, todos oferecem recursos semelhantes. Ao
selecionarmos um microcontrolador, devemos tomar como base as exigncias do sistema
onde ele ser empregado. Um outro ponto importante com relao ao mercado, pois
precisamos de facilidade na obteno do chip. sempre interessante dispormos de
multiplicidade de fornecedores, especialmente se for um projeto industrial.

Os principais microcontroladores disponveis no mercado esto listados a seguir:

Intel: famlia 8051, 8052 e 8096


National: famlia COP
Zilog: famlia F8
Motorola: famlia 6811
Microchip: famlia PIC
Atmel: famlia AVR
Texas Instruments: famlias MSP430, TMS 470 e C2000

Deve ser notado que se usa o termo famlia, isso porque, para todos os
microcontroladores, define-se uma arquitetura bsica, com os recursos mnimos. Cada vez
que a essa arquitetura se adiciona algum recurso extra, cria-se um novo membro da
famlia. Em todas essas famlias, h a preocupao de manter-se a compatibilidade com
essa arquitetura bsica.

Todas essas famlias disputam mercado. Entretanto, a maior fatia est ocupada pela
famlia 8051. Essa fatia deve ultrapassar os 50% do mercado. Outros microcontroladores
bastante populares so os da famlia PIC e os da Motorola. Um aspecto muito confortvel
da famlia 8051 a existncia de diversos fabricantes, fato que no ocorre com as demais.
Como cada fabricante coloca em seu produto alguma caracterstica extra, a famlia
numerosa e flexvel. Chegamos a afirmar que, para qualquer que seja a aplicao, sempre
existe um microcontrolador 8051 adequado. Listamos a seguir os principais fabricantes da
famlia 8051:
Intel
Philips
Atmel
Maxim-Dallas
Analog Devices
Cygnal Integrated Products
Texas Instruments
Standard Microsystems Corporation (SMSC)
Siemens
Integrated Silicon Solution (ISSI)
Matra (MHS)
Infineon
Winbond
OKI
Clones Russos (1816BE31 e 1830BE31)
1.3. Histrico dos Microcontroladores 8051

Nesta seo, comentaremos alguns fatos interessantes na evoluo dos P e C. O


primeiro P surgiu em 1971: foi o processador 4004, projetado para ser um controlador
genrico e que tambm servia para se construir uma calculadora. Ele surgiu como
solicitao de projeto para uma calculadora muito sofisticada. At ento, as calculadoras
eram baseadas em mquinas de estado. Diante da complexidade do projeto, Marcian Hoff
teve a idia de construir um controlador programvel que, dentre outras coisas, pudesse
ser programado para funcionar como uma calculadora. Como as calculadoras daquela
poca operavam em BCD (Binary Coded Decimal), fazendo uso de apenas 4 bits para
cada dgito, esse primeiro microprocessador foi projetado para operar com 4 bits.

Demorou um pouco, mas a idia de um microprocessador acabou vingando, especialmente


depois que a Intel lanou, no ano seguinte, uma verso de 8 bits, denominada processador
8008. Com o incio da aceitao, a Intel lanou em 1974 uma verso mais eficiente e fcil
de ser usada, denominada 8080. Surgia o mercado de microprocessadores e diversos
fabricantes de semicondutores comearam a disput-lo. Como principais competidores
dessa poca, tinha-se a Zilog com o Z-80 que, a nvel de programa objeto, era totalmente
compatvel com o 8080, a MOS Technology com o processadores 6501 e o 6502, que
acabaria sendo usada no Apple II, e a Motorola com o processador 6800.

Em 1976, a Intel lanou o primeiro microcontrolador, denominado 8048, que mais tarde
definiria a famlia MCS-48. Quatro anos mais tarde, em 1980, a Intel lanou uma evoluo
deste microcontrolador, denominado 8051, ou MCS-51. Este microcontrolador teve uma
grande aceitao, tanto que, passados mais de 20 anos, ele ainda est presente no
mercado. Um pouco mais tarde, em 1982, a Intel lana seu microcontrolador de 16 bits,
formando assim a famlia 8096, ou MCS-96. Assim, existem trs famlias de
microcontroladores da Intel:

MCS-48 ou 8048 obsoleta;


MCS-51 ou 8051 ser objeto de estudo neste livro e
MCS-96 ou 8096 no conseguiu conquistar um grande mercado.
1.4. A Famlia 8051 ou MCS-51

A famlia 8051 composta por uma grande quantidade de microcontroladores, vindos de


diversas fbricas. Entretanto, todos eles guardam compatibilidade com o ncleo bsico e
executam o mesmo conjunto de instrues, apesar das diferentes caractersticas de cada
um. A figura 1.3 apresenta o diagrama em blocos do ncleo bsico do 8051, que muito
semelhante ao que obtivemos na figura 1.2 e que listamos logo a seguir.

CPU de 8 bits, eficiente para realizar operaes de controle.


Contador de Programa (PC) de 16 bits, o que significa que o espao total para

memria de programa de 64 KB (216 bytes).
Apontador de Dados (DPTR) de 16 bits, capaz, portanto, de enderear 64 KB de

memria de dados.
RAM interna com 128 bytes dedicados aos registradores especiais.
RAM interna com 128 bytes para uso do programador.
ROM interna, presente em algumas verses, onde se armazena o programa a ser

executado logo aps a energizao do sistema.
Quatro Portas Paralelas, sendo que, dependendo do projeto, nem todas estaro

disponveis.
Porta Serial bidirecional.
Dois Contadores/Temporizadores de 16 bits.
Controlador de Interrupes capaz de gerenciar at cinco interrupes: duas
interrupes externas, duas interrupes originadas pelos dois temporizadores e uma
interrupo dedicada porta serial.

Essa uma lista dos recursos mnimos presentes em qualquer membro da famlia 8051. Os diversos
fabricantes, de acordo com o mercado que pretendem atingir, adicionam recursos a essa arquitetura
bsica. Dentre os muitos recursos extras, citamos: conversor A/D, conversor D/A, um terceiro
temporizador, mais uma porta serial, gerador de PWM e interrupes adicionais. Todos esses
recursos so mapeados na rea de registradores especiais, pois como veremos mais adiante, existe
um grande espao disponvel nesta rea de memria.

O processador 8052, com exceo da adio de uma pequena rea interna de 128 bytes e de um
terceiro contador/temporizador, em todo o resto idntico ao 8051. Assim tudo que aqui for
estudado tambm se aplica ao 8052.
1.5. Exerccios.

1-1) Explique a diferena entre microprocessador e microcontrolador. Faa uma tabela


indicando as caractersticas e particularidades de cada um.

1-2) Cite aplicaes que so exclusivas dos microprocessadores.

1-3) Cite aplicaes onde seria mais indicado o uso de microcontroladores.

1-4) Organize uma lista de caractersticas e depois um diagrama de blocos para o sistema
de controle de alguns dos equipamentos abaixo. Ser que em alguns desses sistemas se
faz necessrio um microprocessador?

a) toca DVD,
b) toca MP3,
c) videocassete,
d) microondas,
e) mquina de lavar rouca,
f) injeo eletrnica de um carro,
g) cmara fotogrfica normal,
h) cmara fotogrfica digital,
i) osciloscpio digital.

1-5) Com a ajuda da Internet, acesse as pginas dos diversos fabricantes e tabele as
principais caractersticas dos microcontroladores da Atmel, Motorola, National, Zilog,
Microchip e algum outro que voc encontrar. Compare com as caractersticas do 8051.

1-6) Esboce o diagrama em blocos para os microcontroladores do exerccio anterior.


2. Microcontroladores

Neste captulo, estudamos com detalhes o ncleo da arquitetura 8051. Ela sofisticada e
oferece recursos que, quando mal compreendidos, transformam-se em empecilhos ao
programador. Essa arquitetura foge ao usual, pois trabalha com duas memrias
separadas: uma para os programas e outra para os dados. Como existem duas memrias
separadas, claro que existem dois espaos de endereamento. Entretanto, como
veremos, o espao de endereamento no fica por a, pois existe ainda o endereamento
da RAM interna e o endereamento de bits. Assim, no total, so quatro espaos de
endereamento. Os tpicos estudados ao longo deste captulo so essenciais para a
perfeita compreenso dos recursos de programao e das instrues.
2.1. Arquitetura von Neumann Versus Arquitetura de Harvard.

Usualmente, todo processador tem a sua disposio uma nica rea de memria onde se
colocam os programas a serem executados e os dados a serem processados. Nos
computadores pessoais, essa memria denominada memria RAM e, em termos atuais,
seu tamanho deve estar na faixa de 256 MB a 1 GB. Qualquer que seja o processador, ele
est constantemente acessando esta memria para buscar as instrues a serem
executadas ou para buscar os dados a serem processados, ou ainda, para armazenar os
dados j processados. Uma forma simples de se acessar essa memria com o emprego
de barramentos. Assim, usa-se um barramento de endereos, um barramento de dados e
dois sinais, um para indicar leitura, denominado #RD (Read) e outro para indicar escrita,
denominado #WR (Write). O smbolo #, colocado no incio do nome, indica que o sinal
ativado em nvel baixo, ou seja, que est em zero quando ativado. A figura 2.1 apresenta,
de maneira simplificada, uma tpica arquitetura de memria.

O funcionamento desta arquitetura muito simples. Quando preciso escrever na memria, o


processador emite, pelo barramento de endereos, o endereo aonde deseja escrever, envia o dado
pelo barramento de dados e, finalmente, gera um pulso em nvel baixo pela linha #WR: o pulso de
escrita. Assim, quando recebe o pulso de escrita, a memria armazena o dado fornecido no endereo
indicado.
A operao de leitura bem parecida, entretanto os dados so enviados no sentido oposto. Quando o
processador deseja ler o dado que est armazenado num determinado endereo da memria, ele
envia esse endereo pelo barramento de endereos e, em seguida, gera o pulso de leitura ao colocar
a linha #RD em nvel baixo. A memria, ao receber o endereo e o pulso de leitura, entrega o dado
que est armazenado no endereo indicado. Um pouco antes de retirar o pulso de leitura, o
processador l o barramento de dados, obtendo assim a informao solicitada.

As operaes de leitura e escrita recm apresentadas so denominadas de ciclos do barramento e


envolvem uma seqncia de sinais muito bem definida. No Captulo 10, estudaremos com detalhes os
ciclos de barramento do 8051.

Devemos notar que a arquitetura da figura 2.1 no faz distino entre programa e dado, ou seja, usa
uma nica memria para armazenar os programas e os dados. Essa arquitetura foi proposta em junho
de 1945 por von Neumann que, em seu trabalho First Draft of a Report on the EDVAC, apresentou
trs postulados para a construo de computadores automticos, como eram denominados na poca.
Apenas por curiosidade, o termo EDVAC representa Electronic Discrete Variable Automatic
Computer. O interessante que, aps 60 anos, esses trs postulados, apresentados a seguir, ainda
norteiam os processadores que equipam nossos computadores:

Um nico controle central de maneira bem simples, o fato de ter-se nos


1.
processadores um nico contador de programa, ou PC (Program Counter);
Uma nica memria para programas e dados a memria RAM dos computadores
2.
compartilhada para cdigo e dados;
As instrues devem fazer operaes elementares sobre os dados sugere que as
3.
operaes efetuadas pelas instrues sobre os dados deveriam ser operaes simples.

Qualquer processador que no siga um desses trs postulados dito ter uma arquitetura no von
Neumann. Os computadores que fazem processamento paralelo no seguem arquitetura de von
Neumann, pois tm vrias unidades de controle, ou seja, o controle no centralizado. O C 8051,
que objeto de nosso estudo, tambm no uma mquina von Neumann, mas por ferir o segundo
postulado, ou seja, trabalha com a memria de programa separada da memria de dados. Todo
processador que trabalha dessa forma dito seguir a arquitetura de Harvard, em homenagem ao
computador Harvard Mark I, do ano 1944, que foi o primeiro a empregar as memrias em separado.

Perguntamos agora: o que significa ter memria de programa e memria de dados separadas?
simples, basta projetar o processador com os recursos necessrios para gerar sinais de leitura e
escrita distintos para cada memria. Uma das vantagens dessa arquitetura evitar que a memria se
torne um gargalo, pois possvel fazer acesso simultneo s duas memrias, desde que se
disponibilize barramentos separados. Isso foi muito importante no passado, quando as memrias
eram lentas e no se fazia uso das memrias cache. Quem estuda arquitetura de processadores j
deve ter notado que, nos processadores modernos, as memrias cache L1 esto separadas em cache
de programa e cache de dados, o que lembra a arquitetura de Harvard. A Figura 2.2 apresenta uma
tpica arquitetura de Harvard.
Nessa arquitetura da Figura 2.2, importante notarmos que os barramentos de endereos e de dados
so comuns s duas memrias, o que impede que elas sejam acessadas ao mesmo tempo. Existem
quatro sinais de controle para acessar as memrias. Dois sinais, denominados #PRD e #PWR, para
acessar a memria de programa e dois sinais, denominados #RD e #WR, para acessar a memria de
dados. Agora, fica bem claro o que se entende por ter memrias separadas. Simplesmente, gerar
sinais de controle distintos. Hoje em dia, com as memrias rpidas e o emprego de memrias cache
em dois nveis, no h motivo para empregar essa arquitetura. Algumas aplicaes, no entanto, como
o caso dos microcontroladores, podem se beneficiar das memrias separadas.

As aplicaes mais usais de microcontroladores, tais como em videocassete, toca-CD, microondas,


mquina de lavar, elevadores, fazem uso de um programa que j foi desenvolvido no passado e que
est acessvel via memria ROM. preciso que seja desta forma, pois imagine o problema que seria
dar o boot numa mquina de lavar roupa. Por outro lado, tais programas no so freqentemente
alterados. Em tais situaes, pode ser til ter memrias separadas, com uma ROM para o armazenar
o programa e uma RAM para se trabalhar com os dados. Alm disso, existem processadores em que
a memria de programa est integrada dentro do C e a memria de dados adicionada externamente
pelo usurio. Assim, para facilitar e flexibilizar o projeto dos controladores, os membros da famlia
8051 fazem uso da arquitetura de Harvard.

A figura 2.3 apresenta a tpica arquitetura da famlia 8051. Devemos notar que no existe sinal para
escrever na memria de programa, apenas o sinal de leitura, agora denominado #PSEN (Program
Select Enable). Isso porque se projetou este processador para trabalhar com o programa armazenado
em uma memria ROM, que j foi previamente gravada. Uma outra razo a possibilidade da ROM
estar integrada dentro do chip do C e, se for o caso, coloca-se externamente apenas a memria de
dados.

A arquitetura de Harvard no to incompatvel com a arquitetura von Neumann. Na verdade, fcil


converter a arquitetura de Harvard em von Neumann, como est mostrado na figura 2.4. Ressaltamos
que os dois sinais de leitura foram combinados, atravs de uma porta AND, para gerar um nico
sinal de leitura, denominado #RD2. Este sinal #RD2 vai para zero quando qualquer um dos dois
sinais (#PSEN ou #RD) for ativado. Em outras palavras, se for leitura de memria de programa
(#PSEN = 0) ou leitura de memria de dados (#RD = 0), o sinal #RD2 vai para zero. Agora temos
uma nica memria, tanto para programas como para dados. O contrrio, ou seja, converter
arquitetura von Neumann em arquitetura Harvard no to trivial.
2.2. Espao de Endereamento do 8051.

O espao de endereamento da famlia 8051 bem diversificado, o que pode primeira


vista assustar. Entretanto, uma vez bem compreendido, esse espao pode ser explorado
para facilitar a programao e gerar solues sofisticadas. So quatro as reas de
endereamento:

bvio que, para a arquitetura 8051, no basta indicar o endereo, pois preciso informar tambm
qual rea de memria ele se refere. Um pouco mais adiante, veremos que essas reas so bastante
intuitivas.

Memria de Programa onde ficam residentes os programas a serem executados. Essa memria
tambm denominada de memria de cdigos (cdigos de programa) e, em vrias ocasies, a letra C
para indicar que uma instruo est se referenciando memria de cdigos. Isto ser visto, por
exemplo, quando estudarmos as instrues para transferncia de dados. Normalmente, essa memria
construda com o uso de memrias ROM, habilitadas pelo sinal de controle #PSEN. Em alguns
membros da famlia MCS-51, um trecho desse espao de 64 KB pode estar integrado dentro do chip
do microcontrolador. Como essa rea tem o tamanho de 64 KB, so necessrios 16 bits de endereos
para referenciar todas as posies (216 = 64 KB).

Memria de Dados Externa onde ficam os dados que so manipulados e processados pelo
programa. Essa memria, na grande maioria das vezes, do tipo RAM (leitura e escrita), sendo
acessada pelos sinais de controle #RD e #WR. Por ser uma memria externa ao C, usa-se a letra X
para indicar que o endereo faz referncia a essa rea. Por exemplo, costume cham-la de XRAM.
Como essa rea tem o tamanho de 64 KB, so necessrios 16 bits de endereos para referenciar
todas as posies (216 = 64 KB).

RAM Interna, como o prprio nome diz, uma memria RAM que j est integrada com o chip do
C. Como ela interna, seu emprego extremamente simples e no pede a adio de qualquer
hardware externo. A no ser que se diga o contrrio, todo acesso memria de dados acontece na
RAM Interna. Como este espao de 256 bytes, so ento necessrios 8 bits de endereos para se
varrer todo esse espao (28 = 256). Essa memria est dividida na metade. A primeira parte est
disponvel ao usurio, sendo que a segunda usada para mapear os registradores de funes
especiais (SFR). Dessa memria, 32 bytes podem ser acessados bit a bit, como veremos a seguir.

rea de Bits um espao onde se tem acesso individual aos bits. Esse espao construdo com o
uso de 32 bytes da RAM interna, o que resulta num total de 256 bits. Para enderear todos esses bit,
so necessrios endereos de 8 bits (28 = 256). Normalmente, essa rea usada para mapear
variveis lgicas.

realmente um extenso e diversificado espao de endereamento apresentado, no entanto, no gera


confuso, pois, na maior parte do tempo, usa-se a RAM interna, a rea de bits e, claro,
indiretamente, a memria de cdigos, pois o C est sempre acessando essa memria para buscar a
prxima instruo a ser executada. A busca e execuo das instrues ocorrem automaticamente sem
a interveno do programador. Para acessar a memria de dados externa XRAM, ou a memria de
cdigos, necessrio o emprego de instrues especficas.

A figura 2.5 apresenta as quatro reas de endereamento recm estudadas. Dentro do retngulo que
representa cada rea, na lateral esquerda, foi colocado em hexadecimal o endereo da primeira e da
ltima posio. Assim, para as memrias externas, ROM e RAM, o primeiro endereo o 0 e o
ltimo FFFFH (65.535 decimal) e, para as reas internas, o primeiro endereo o 0 e o ltimo
FFH (255 decimal).

Em alguns membros da famlia, parte do espao de cdigos pode estar mapeada numa memria ROM
j integrada com o C. So os chamados microcontroladores com ROM interna. Isto interessante
porque o programa pode ser armazenado nesta ROM e assim no h necessidade de se colocar
externamente a memria de cdigos. Alm disso, se a quantidade de dados a ser processada couber
dentro da RAM interna, dispensa-se a XRAM. Isto diminui o tamanho e o custo do projeto, que
praticamente se resumir no C e no cristal oscilador.
A figura 2.6 ilustra o caso de C com os primeiros 4 KB de ROM j integrados dentro do chip. Isto
significa que o espao de endereamento de programa externo comea na primeira posio acima de
4 KB (1000H). Atravs de um pino do C, o usurio indica se quer usar ou no essa ROM interna.
Caso decida usar a ROM, os acessos a cdigos abaixo de 4 KB no geram sinais no barramento,
trafegando apenas internamente. Por outro lado, se decidir no usar a ROM interna, todos os acessos
memria de programa geram ciclos de barramento. Enfim, tudo se passa como se essa ROM interna
no existisse. Existe disponibilidade de C com os mais variados tipos e tamanhos de ROM interna,
indo desde 4 KB at 64 KB. claro que, com uma ROM de cdigos de 64 KB, toda memria de
programa est integrada dentro do chip.
2.3. RAM Interna.

A maioria das operaes feitas com este C ocorre na RAM interna. Esta afirmao pode
soar estranha pois, para os padres atuais, uma RAM 256 bytes parece exageradamente
pequena. No entanto, devemos ter em mente que, quando usamos um C, no
pretendemos fazer processamento pesado e tampouco executar programas sofisticados,
como acontece no PC. O emprego de microcontroladores est voltado para aplicaes de
controle digital e sistemas dedicados. Para tais tarefas, o tamanho da RAM interna pode
ser suficiente. Uma das vantagens de se usar a RAM interna o fato de no gerar ciclos
de barramento, ou seja, se a rea de dados puder ser encaixada dentro desta RAM
interna, no haver a necessidade de se colocar uma RAM externa. Isto facilita e barateia
o projeto.

A RAM interna est dividida em duas partes, formando duas reas. A primeira ocupa os
endereos de 0 at 7FH (de 0 at 127) e a outra ocupa os endereos de 80H at FFH (de
128 at 255). A primeira metade recebe o nome de 128 Inferior ou, em ingls, 128
Lower. J a segunda metade denominada Registradores de Funes Especiais,
representado pela sigla SFR (Special Function Registers). A figura 2.7 apresenta um
esquema da RAM interna onde se pode ver suas metades, seu espao de endereamento
e as subdivises da metade inferior.

Na metade inferior da RAM interna, esto mapeados dois recursos importantes: os bancos
de registradores e parte do espao acessvel bit a bit (rea de bits). As instrues que
este processador oferece trabalham com 8 registradores, denominados R0, R1, R2, ...,
R7. Cada registrador ocupa uma posio da RAM interna. A arquitetura disponibiliza ao
programador 4 conjuntos de registradores, sendo que cada conjunto recebe o nome de
Banco de Registradores. Esses bancos so numerados de 0 at 3, como mostrado na
figura 2.7. O programador pode escolher, a qualquer instante, qual banco deseja usar. Um
pouco mais adiante, veremos que existem dois bits, denominados RS1 e RS0, onde o
programador indica qual banco deve estar ativo.
A disponibilidade de bancos de registradores muito til e simplifica a separao de contexto entre
os programas. Por exemplo, podemos imaginar uma situao onde o programa principal usa o banco
0, as subrotinas usam o banco 1, a interrupo serial o banco 2 e as interrupes externas o banco 3.
Para salvar ou recuperar seu contexto, cada subrotina necessita apenas de mudar o banco de
registradores. Cada um desses registradores est mapeado em um determinado endereo da RAM
interna, como mostrado na figura 2.8. Assim, a posio de memria (0, 8, 10H ou 18H) usada para
representar o registrador R0, por exemplo, depende do banco selecionado.

Ocupando os endereos de 20H at 2FH esto 16 bytes cujos bits so acessveis individualmente.
Esses bytes fornecem 128 bits (16 x 8 bits), que exatamente metade do espao disponvel aos bits.
Os outros 128 bits esto mapeados em registradores da rea SFR. Para as referncias aos bits,
fazemos uso da notao byte.bit, sendo o bit mais direita (menos significativo) numerado com
zero e o mais esquerda (mais significativo) com 7, como mostrado na figura 2.9. Para facilitar a
leitura, toda vez que escrevermos os bits de um byte, faremos uma separao em grupos de 4 bits. Na
figura, esta separao est indicada pela pequeno espao entre os bits 3 e 4. Assim, um byte igual a
7AH tem seu bit 0 igual a 0, seu bit 3 igual a 1 e seu bit 7 igual a 0. A expresso 20H.0, refere-se ao
bit 0 do byte 20H.
importante comentarmos que os bits podem ser acessados individualmente ou ento em grupo de 8,
quando se acessa o byte. O mais comum usarmos esses bits como variveis booleanas ou lgicas.
A figura 2.10 apresenta os 128 bits que esto mapeados nos bytes 20H at 2FH. A coluna mais
direita, marcada em cinza, indica o byte ao qual pertencem os bits e a linha do topo indica a
numerao dos bits. Assim, o bit 20H.0 tem endereo 0; o bit 22H.1 tem endereo 11H e o bit 2AH.5
tem endereo 55H. Os outros 128 bits que faltam para inteirar o total de 256 bits esto mapeados na
rea SFR e, como j foi dito, sero abordados um pouco mais adiante.

J estudamos os 32 bytes que compem os 4 bancos de registradores e o 16 bytes que tm seus bits
acessveis. Sobram 80 bytes que so voltados para um uso genrico. Nessas posies, armazenam-se
as variveis usadas pelo programa do usurio. tambm nesta rea que normalmente se constri a
pilha deste processador. A pilha um recurso que ser estudado no Captulo 4. Assim, conclumos o
estudo dos primeiros 128 bytes da RAM interna.

A partir de agora, abordamos a rea dedicada aos registradores de funes especiais, ou SFR. A
figura 2.11 apresenta um mapa completo destes 128 bytes. Nesta figura, a coluna mais direita indica
um endereo para referncia. Assim, por exemplo, o registrador P0 est mapeado no endereo 80H,
o registrador SP no endereo 81H, o registrador PCON no endereo 87H. Para auxiliar na
determinao dos endereos dos SFR, existe a ltima linha, que indica o incremento a ser somado na
referncia. Assim, o endereo do registrador TH1 88H + 5 = 8DH.
Ainda na figura 2.11, interessante notarmos que o registrador A ocupa o endereo E0H. Este
registrador muito importante, pois ele o acumulador, onde se coloca o resultado da grande
maioria das operaes lgicas e aritmticas. Devemos indicar tambm a existncia do registrador B,
que serve de registrador auxiliar. medida que estudarmos os recursos deste C, abordaremos cada
um desses registradores especiais. Podemos notar uma grande rea em vazio onde os fabricantes
mapeam os registradores que controlam os recursos adicionais de seus microcontroladores
compatveis com a famlia 8051.

As posies de memria 80H, 88H, 90H, 98H, ..., F8H podem se acessadas bit a bit, ou seja, nessas
16 posies esto mapeados os demais 128 bits, que so os bits de endereos 80H (128) at FFH
(255). Isso corresponde a dizer que os registradores mapeados nesses endereos so acessveis bit a
bit. So eles: B, A, PSW, IP,..., TCON, P0. Mais adiante, veremos que o fato de podermos acessar
diretamente os bits desses registradores facilita muito o controle dos recursos do processador. A
figura 2.12 apresenta esses 128 bits e o nome (rtulo) dado aos seus bits. Nessa figura, as duas
colunas mais direita indicam o nome do registrador e o endereo do primeiro bit desse registrador.
Assim o bit P0.0 tem endereo 80H, o bit P0.1 tem endereo 81H. O bit C, que representa o carry
(vai um) o bit 7 do PSW e ocupa o endereo D7H. Para facilitar a obteno do endereo do bit, a
ltima linha traz o valor a ser adicionado ao endereo apresentado na ltima coluna.

Para no dar margem a dvidas, enfatiza-se que a rea de memria acessvel bit a bit formada por
256 bits, sendo 128 bits fornecidos pelos bytes que esto nos endereos de 20H a 2FH e mais 128
bits fornecidos pelos bytes que ocupam o endereos 80H, 88H, 90H, ..., FFH (coluna indicada na
figura 2.11).

Alguns membros da famlia MCS-51 possuem uma RAM interna um pouco maior, como o caso do
8052. Neste C, h a adio de mais 128 bytes na RAM interna, ocupando os mesmos endereos dos
SFR, mas, para evitar a dualidade de acessos, essa rea no pode ser endereada diretamente. Ela s
pode ser endereada indiretamente, ou ento ser empregada como pilha. No captulo 4, estudaremos
com detalhes o que endereamento direto e indireto. Essa rea adicional recebe o nome de 128
Superior ou, do ingls, 128 Upper. A vantagem que, com essa rea adicional, pode-se aumentar
bastante a pilha, que sempre foi um recurso escasso neste controlador. A figura 2.13 apresenta o
esquema de RAM interna para o C 8052.
2.4. Palavra de Estado do Programa.

Todo processador possui um registrador especial onde ficam armazenadas informaes


sobre o estado do processamento e tambm sobre a ltima operao realizada pela
unidade de lgica e aritmtica. Usam-se vrios nomes para design-lo, sendo o mais
comum Registrador de Flags. Entretanto, na arquitetura 8051, ele recebe o nome Palavra
de Estado do Programa, representado pela sigla PSW (Program Status Word). Esse
registrador, apresentado na figura 2.14, de 8 bits e est mapeado na posio D0H da
RAM interna.

A seguir, descrevemos as finalidades de cada bit.

P o bit de paridade gerado a partir do contedo do acumulador.


P = 1 indica uma quantidade mpar de bits 1.
P = 0 indica uma quantidade par de bits 1.

Ov o bit de overflow, ou estouro. Ele s tem significado em operaes de soma e


subtrao envolvendo nmeros representados em complemento 2.

RS1:RS0 permitem que o programador selecione o banco de registrador:

F0 um bit de uso genrico.

Ac o carry auxiliar, correspondendo ao vai-um do bit 3 para o bit 4. Ele empregado pela
instruo de ajuste decimal (DA A), que deve ser executada logo aps uma soma de nmeros
representados em BCD.

C o carry das operaes lgicas e aritmticas. Tem uso nas mais diversas operaes e
corresponde tambm ao vai-um do bit 7 para o bit 8 nas operaes de soma.
2.5. Exerccios.

2-1) Enumere e explique os trs postulados de von Neumann e em seguida comente sobre
sua importncia.

2-2) Explique o que uma arquitetura de von Neumann. D exemplos.

2-3) Explique o que uma arquitetura de Harvard. D exemplos.

2-4) Por que a famlia 8051 segue a arquitetura de Harvard? D os principais motivos.

2-5) Por que os computadores modernos ainda fazem uso da arquitetura von Neumann?

2-6) Foi estudado que simples converter a arquitetura de Harvard numa arquitetura von
Neumann. Por que o reverso no to simples, ou seja, por que difcil converter uma
arquitetura von Neumann numa arquitetura Harvard?

2-7) Explique a diferena entre Memria de Programa Externa e Memria de Dados


Externa.

2-8) Mostre diferenas entre Memria de Dados Externa e RAM Interna.

2-9) Enumere os espaos de endereamento do 8051, indicando suas faixas de endereos


e finalidades.

2-10) De acordo com o banco selecionado, indique os 4 possveis endereos do


registrador R5.

2-11) Faa comentrios sobre as seguintes posies da RAM Interna: 6, 12H, 22H, 30H,
60H, 80H, 82H, 83H, 87H, 90H, 99H, A0H, B0H, D0H, E0H, F0H e F8H.

2-12) Qual o endereo do primeiro bit do byte 20H e do primeiro bit do byte 80H?

2-13) Calcule o endereo dos seguintes bits: 20H.1, 20H.6, 21H.0, 23H.5, 27H.4, 2EH.3,
2FH.7, P0.0, P0.1, P0.5, P1.3, IE.2, P3.7, C0H.3, PSW.5, Acc.3, B.6, F8H.0 e F8H.7.

2-14) Usando a notao byte.bit, indique o bit de endereo 200 (decimal).


2-15) Indique o endereo dos seguintes registradores: P0, P1, A, B, SP, DPL, DPH,
PCON, SBUF e marque os que so endereveis bit a bit.

2-16) Indique o nome dos bits: 8EH, 93H, 9CH, D7H, B8H.

2-17) Por que, nos microcontroladores 8052, a rea extra de 128 bits (128 Upper) no se
confunde com a regio denominada SFR?

2-18) Qual a finalidade do registrador denominado PSW?

2-19) Como o programador indica qual banco de registradores deseja empregar?


3. Conjunto de Instrues

Neste captulo, estudamos o conjunto de instrues oferecido por todos os membros da


arquitetura 8051. muito importante conhec-lo em detalhes. Entretanto, esse conjunto
extenso e somente a prtica levar ao completo conhecimento. Aqui fazemos apenas uma
breve exposio de todas as instrues. No captulo seguinte, com uma grande quantidade
de exerccios resolvidos e propostos, oferecemos ao leitor um novo suporte para
desenvolver a habilidade para a confeco de programas com esse conjunto de instrues.

As instrues disponveis so otimizadas para aplicaes de controle digital em 8 bits. Elas


permitem um rpido endereamento da RAM interna, facilitando operaes de bytes em
pequenas estruturas de dados. Esse conjunto de instrues oferece ainda recursos para
manipular e operar variveis de um bit, gerando solues eficientes para sistemas lgicos
que necessitem de operaes booleanas.
3.1. Sobre o Conjunto de Instrues.

Antes de iniciarmos o estudo do conjunto de instrues, voltamos a discutir o conceito de


acumulador. Os primeiros computadores eram bem simples, tinham uma unidade de lgica
e aritmtica (ULA) bem elementar e um nico registrador. A maioria das operaes
envolvia esse registrador e uma posio de memria. O resultado da operao, via de
regra, era armazenado de volta nesse registrador. Em operaes encadeadas, esse
registrador acumulava o s resultados. Da vem o nome acumulador. As arquiteturas
modernas esto bastante evoludas, oferecem uma grande quantidade de registradores,
mas ainda existe um registrador especial que normalmente recebe os resultados das
operaes e, por tradio, ainda hoje se usa o termo acumulador para design-lo.

Alguns processadores, como os da famlia 680x0 da Motorola, no tm acumulador, ou


seja, qualquer operao pode ser executada com qualquer registrador e o resultado
tambm pode ser armazenado em qualquer registrador. J a arquitetura 8051 faz uso de
registradores privilegiados, sendo que algumas operaes so mais rpidas e eficientes
quando executadas com o uso de certos registradores.

A famlia 8051 oferece um total de 111 instrues distribudas na proporo apresentada


na tabela:

Instrues aritmticas: envolvem operaes do tipo soma, subtrao, multiplicao,


diviso, incremento e decremento. Em geral, essas operaes finalizam com o
resultado no acumulador.
Instrues lgicas: fazem operaes bit a bit com registradores e tambm rotaes.
Em geral, o resultado tambm vai para o acumulador, porm existem vrias instrues
desse tipo que armazenam o resultado na RAM interna.
Instrues de transferncia (cpia) de dados: copiam bytes entre os diversos
registradores e a RAM interna. Nesta classe, esto as nicas instrues capazes de
acessar a RAM externa e a memria de cdigos.
Instrues booleanas: resolvem expresses booleanas, como as que se obtm dos
mapas de Karnaugh. Nessas operaes, usado um bit especial, denominado carry,

representado pela letra C. No clculo de expresses booleanas, o carry faz o papel do
acumulador.
Instrues de salto: desviam o fluxo de execuo do programa, chamam subrotinas,

fazem desvios condicionais e executam laos de repetio.

No 8051, assim como em todo processador, as instrues so codificadas atravs de uma seqncia
de bytes. O processador possui uma grande tabela onde, para cada seqncia, existe a indicao das
operaes as serem realizadas. Essa seqncia de bytes que designa ou identifica cada instruo
recebe o nome de cdigo de operao ou, em ingls, operational code, ou ainda, opcode. Existem
instrues cujo opcode faz uso de apenas um byte e existem outras que demandam trs bytes. claro
que, quanto maior for o tamanho dos opcodes empregados, maior fica o programa.

Observao: Salvo quando explicitamente indicado, todos os opcodes sero sempre indicados na
base hexadecimal.

Alm do opcode, outro ponto importante o tempo consumido na execuo de cada instruo.
Algumas instrues so rpidas, enquanto que outras demandam uma quantidade maior de tempo. O
tempo consumido na execuo de uma instruo importante quando se trabalha em sistemas de
controle digital onde existam restries de tempo, ou seja, onde importante o tempo disponvel para
cada rotina. Na famlia 8051, o tempo gasto por cada instruo medido em ciclos de mquina, ou
MC (Machine Cycle). Na arquitetura 8051 clssica, um ciclo de mquina corresponde a 12 perodos
do oscilador do processador. Por exemplo, caso se use um cristal (xtal) de 12 MHz, o ciclo de
mquina ser:

fcil ver que, para um cristal de 12 MHz, o ciclo de mquina ser de 1 s. Boa parte das instrues
da famlia 8051 executada em um ciclo de mquina. Atravs das tabelas que indicam quantos MC
cada instruo consome, possvel calcular o tempo total gasto por um programa. A tabela seguinte
apresenta a distribuio das instrues de acordo com o tamanho do opcode e de acordo com o
tempo de execuo.
Ao estudarmos a tabela 3.2, conclumos que 98% das instrues so executadas em 1 ou 2 ciclos de
mquina, o que garante uma boa velocidade. Alm disso, vemos que 85% das instrues fazem uso
de opcodes de 1 ou 2 bytes, o que garante programas compactos. Tem-se assim atendidos dois itens
muito importantes quando se trata de microcontroladores: instrues pequenas e velozes.
3.2. Convenes.

Para facilitar o estudo das instrues, adotaremos as convenes apresentadas na tabela


a seguir:

Um ponto que gera muita confuso a existncia dos smbolos A e Acc. O smbolo A usado toda
vez que fazemos referncia ao acumulador. Entretanto, nessa arquitetura, o acumulador est mapeado
na RAM interna, no endereo E0H, ou seja, tambm podemos acessar o acumulador atravs de seu
endereo. Para evitar confuso entre o acumulador e seu endereo, existem essas duas
representaes. Em resumo: A o acumulador e Acc o endereo do acumulador. importante
comentarmos que o registrador B somente pode ser acessado atravs de seu endereo F0H. Isto
significa que, apesar do nome registrador B, ele na verdade apenas uma posio da RAM interna.
Os nicos registradores, seguindo o verdadeiro significado da palavra registrador, so: A, R0 , R1,
..., R7.

Os montadores usados para montar cdigos 8051, via de regra, j tm definidos os endereos de
todos os registradores. Isso facilita muito o trabalho de programao, pois eles j trazem embutidos
os endereos de A, B, PSW, P3, P2, P1, P0, DPH, DPL, etc.. Com a inteno de facilitar o
entendimento das instrues, vamos agora apresentar e analisar, de forma breve e prematura, uma
pequena rotina assembly.
Ainda no estudamos as instrues, entretanto possvel, apesar da dificuldade inicial, entendermos
essa pequena rotina: do contedo de R7, subtrado o contedo de R6 e, se o resultado for diferente
de zero, ele escrito em R5, seno escrito o nmero 100 em R5.

O primeiro ponto importante notarmos que um programa em assembly composto por quatro
colunas distintas:

A primeira coluna usada para especificar os rtulos que identificam o endereo de uma
determinada instruo, por exemplo, o rtulo LB faz referncia ao endereo da instruo MOV
R5,A. Dentre muitas finalidades, os rtulos servem para as instrues de desvio fazerem referncias.
A instruo JNZ LB indica que, se resultado for diferente de zero, a execuo deve continuar a partir
do rtulo LB.

A segunda coluna reservada para os mnemnicos das instrues, ou seja, uma pequena seqncia
de letras que nos ajuda a lembrar da instruo.

Na terceira coluna, colocam-se os operandos que sero manipulados pela instruo. Devemos notar
que o fluxo de dados da direita para esquerda. A instruo MOV A,R7 diz ao C para colocar no
acumulador uma cpia do contedo de R7. Notar que a execuo desta instruo no altera o valor
de R7. Toda vez que se precisar especificar um nmero (uma constante), preciso indic-la com o
smbolo #, do contrrio ela ser interpretada como endereo.

Finalmente, a quarta coluna reservada para os comentrios, que obrigatoriamente comeam com um
ponto e vrgula. Tudo que estiver aps o ponto e vrgula e at o final da linha, ignorado.

Passemos ento ao estudo das instrues. Por hora, o leitor no se deve preocupar com o
entendimento e a criao de programas, pois isto ser assunto do prximo captulo.
3.3. Instrues Aritimticas.

So instrues destinadas a operaes de soma, subtrao, multiplicao e diviso. Em


geral, o acumulador um dos operandos e o resultado armazenado no acumulador.

Na descrio destas instrues, em particular, haver um nvel maior de detalhamento para permitir
que o leitor se habitue com a metodologia empregada. Existem quatro instrues de soma, como
mostrado a seguir:

ADD A,Rn faz a soma do contedo do acumulador com o contedo do registrador especificado.
Notar que Rn representa um dos 8 registradores (R0, R1, ..., R7). O resultado armazenado de volta
no acumulador. Isto significa que o valor original do acumulador perdido. interessante que o
leitor j se habitue a ler os operandos na ordem correta: da direita para a esquerda. Exemplo: ADD
A,R3 (soma ao acumulador uma cpia do contedo do registrador R3 e armazena o resultado de volta
no acumulador).

ADD A,#dt8 soma ao acumulador uma constante de 8 bits. O resultado armazenado no


acumulador. Exemplo: ADD A,#100 (soma ao acumulador o nmero 100 e armazena o resultado no
acumulador).

ADD A,end8 soma ao acumulador o contedo do endereo end8 da RAM interna. O campo
end8 tem oito bits, ou seja, especifica posies de 0 at 255, o que suficiente para varrer toda a
RAM interna. Exemplo: ADD A,100 (soma ao acumulador o contedo do endereo 100 da RAM
interna). Notar que existe uma grande diferena entre essa instruo e a anterior.

ADD A,@Ri faz a soma do acumulador com a posio de memria cujo endereo est em Ri.
Notar que, nessa operao, s se pode usar dois registradores: R0 e R1. Em outras palavras, essa
instruo diz para usar o contedo de Ri como endereo para obter o valor que ser somado ao
acumulador. Para quem conhece a linguagem C, como se Ri fosse um ponteiro e @Ri fizesse
referncia ao contedo da posio apontada. Exemplo: ADD A,@R0 (soma ao acumulador o contedo
da posio da RAM interna apontada por R0).

Para facilitar a apresentao das instrues, compactamo-las em uma tabela, onde tambm
apresentamos a quantidade de bytes usada no seu opcode, a quantidade de ciclos de mquina (MC)
necessrios para sua execuo e ainda seu opcode. Nesta tabela, cada linha representa, de forma
compacta, uma instruo. Com tabelas neste formato, apresentamos de maneira simples todo o
conjunto de instrues. importante lembrar que os opcodes esto em hexadecimal.

claro que o C no sabe reconhecer as instrues atravs dos mnemnicos, pois estes servem
apenas para facilitar o trabalho de programao. Para cada instruo, existe um cdigo que a
representa e atravs desse cdigo que o C identifica cada instruo.

A primeira idia seria empregar um byte para identificar cada instruo. Assim, seria possvel
codificar 256 instrues. Entretanto, algumas instrues precisam de usar mais de um byte, como o
caso das que acessam a memria, onde necessrio um campo a mais para especificar o endereo da
memria. Com essa idia, apresentamos o cdigo de operao para exemplos com as quatro
instrues recm estudadas.

Agora, de posse dessa tabela, fica evidente que existem duas instrues de soma aritmtica que
consomem dois bytes na representao do seu opcode. Somente o byte 28H suficiente para indicar
ao C que se quer somar ao acumulador o contedo de R0. J para indicar ao C que se quer somar
ao acumulador o nmero 43H, so necessrios dois bytes: o primeiro, para indicar que a soma de
uma constante ao acumulador, e o outro byte para especificar a constante a ser somada. Assim, faz-se
o uso de dois bytes, que nesse caso so: 24H e 43H. Por outro lado, para indicar ao C que se quer
somar ao acumulador o contedo da posio de memria 43H, so tambm necessrios dois bytes, o
primeiro para indicar que a soma do contedo de uma posio de memria ao acumulador e outro
byte para especificar o endereo a ser acessado. Portanto, so empregados dois bytes, que nesse caso
so: 25H e 43H.

Esta instruo orienta ao C para fazer a soma do acumulador com o operando especificado, mais o
carry, sendo que o resultado colocado no acumulador. Esta instruo usada para se fazerem
somas com nmeros inteiros representados com mais de 8 bits.

Com esta instruo, subtrai-se do acumulador o operando especificado e tambm o borrow. Em


portugus, o borrow denominado de empresta-um. O resultado armazenado de volta no
acumulador. Por exemplo: SUBB A,R7 significa A A R7 C, onde C representa o borrow. Os
microprocessadores no possuem um bit especial para representar o empresta-um e usam o carry
para essa funo. Deve ser notado que no existe uma subtrao sem o empresta-um, por isso,
antes de uma subtrao, deve-se zerar o carry caso no se saiba qual seu valor naquele momento.

A instruo de incremento, como o nome indica, usada para somar um ao operando. Essa
operao interessante por no alterar as flags> de C e Ac (vide seo 2.4 e figura 2.14). Ao final
deste captulo, ofereceremos um pouco mais de detalhes sobre essas flags. Em operaes aritmticas
que envolvam nmeros com mais de 8 bits, possvel usar as operaes de incremento para atualizar
os ponteiros sem que se interfira nas flags. Existem 4 instrues de incremento.

A instruo de decremento usada para subtrair um do operando. Elas existem pelas mesmas
razes que as instrues de incremento.

No conjunto de instrues do 8051, existe apenas um nico incremento de 16 bits e envolve o DPTR,
que o registrador de 16 bits dessa arquitetura. Deve-se notar que no existe uma instruo para
decremento de 16 bits.
Essas so operaes realizadas sobre nmeros inteiros representados em 8 bits. Tanto na
multiplicao, quanto na diviso, so envolvidos os registradores A e B. Elas so as instrues de
mais longo tempo de execuo. Na multiplicao de dois nmeros de 8 bits, necessita-se de at 16
bits para representar o resultado e, por isso, sua parte mais significativa (MSB) armazenada em B e
parte menos significativa (LSB) fica armazenada em A. J na diviso, o acumulador recebe o
quociente e o registrador B recebe o resto da diviso.

Observao: na diviso, se B = 0, o resultado de A e B indeterminado e a flag de overflow


ativada, ou seja, Ov = 1. Caso contrrio, Ov = 0.

O ajuste decimal usado apenas para somas com nmeros representados em BCD. Existe uma nica
instruo, que somente vlida quando executada logo aps a instruo ADD ou ADDC. O ajuste
decimal no serve para subtrao.
3.4. Instrues Lgicas.

So instrues que operam de uma vez, sobre todos os bits dos operandos, realizando
operaes do tipo E (AND), OU (OR) e OU-Exclusivo (XOR). Nestas instrues, o
resultado nem sempre precisa ficar armazenado no acumulador, pois existem instrues
que permitem indicar o endereo da RAM interna onde deve ser armazenado o resultado.

O nome dado a essa instruo AND Lgico e, por isso, seu mnemnico ANL (Logical AND).
Como o nome indica, realizado o AND bit a bit dos operandos. Existem 6 instrues, reunidas em
dois grupos segundo o destino do resultado.

O nome dado a essa instruo OR Lgico e, por isso, seu mnemnico ORL (Logical OR). Como o
nome indica, realizado o OR bit a bit dos operandos. Existem 6 instrues, reunidas em dois grupos
segundo o destino do resultado.
O nome dado a essa instruo XOR Lgico e, por isso, seu mnemnico XRL (Logical XOR).
Como o nome indica, realizado o XOR bit a bit dos operandos. Existem 6 instrues, reunidas em
dois grupos segundo o destino do resultado.

Observao: com certa freqncia, preciso efetuar manipulaes de bits. As instrues recm
estudadas so adequadas para gerar solues nesse sentido. A operao AND serve para zerar bits, a
operao OR serve para ativar (colocar em 1) bits e a operao XOR serve para inverter bits.
Apresentamos alguns exemplos, onde deve ser notado que alguns bits so preservados enquanto que
outros so alterados. O contedo do acumulador est indicado por XXXX XXXX.
Existem instrues para realizar diversas operaes com os bits do acumulador. possvel zerar
todos os bits do acumulador ou ento invert-los. H tambm operaes que permitem rodar os bits
do acumulador para direita ou para esquerda, usando ou no a flag carry. Tambm possvel
trocar de posio as nibbles do acumulador (uma nibble formada por 4 bits, o que significa que um
byte possui 2 nibbles ). A lista a seguir descreve as operaes realizadas por essas instrues.
3.5. Instrues de Transferncia (Cpia).

Essas instrues servem para transferir (copiar) dados entre as diversas regies de
memria e tambm entre os registradores. Em sua maioria, elas operam com a RAM
interna, a no ser que se especifique outra rea de memria. importante um
comentarmos que a transferncia , na verdade, uma cpia. Por exemplo, quando pedimos
a transferncia do registrador B para o acumulador, o que o C faz copiar no
acumulador o contedo do registrador B. Aps essa operao, o registrador B permanece
intacto. Desde os primeiros processadores, usa-se o termo transferncia para designar
tais operaes.

Existem 3 tipos de instrues de transferencia de dados:

as que trabalham com a RAM Interna (22 instrues),


as que trabalham com a Memria de Dados Externa (4 instrues) e
as que trabalham com a Memria de Programa (2 instrues).

Estas instrues so usadas para copiar dados entre posies da RAM interna, registradores e
acumulador. Em geral, todas as transferncias so permitidas, porm existem algumas excees.
Como o leitor deve ter percebido, os operandos mais comuns so: A, Rn, @Ri, end8e #dt8.
Podemos dizer que possvel qualquer combinao desses operandos, como mostrado na tabela
3.18, apresentada a seguir, mas com as 5 excees listadas na tabela 3.19.
Uma operao muito comum em programao assembly a troca de contedo entre dois
registradores. Por exemplo, seja o caso de precisarmos de trocar o contedo dos registradores A e
B. Seria necessrio o uso de um terceiro registrador para receber valores intermedirios. Com o
oferecimento de uma instruo para realizar essa permutao, fica facilitada a tarefa do programador.
Existem 3 instrues de permutao, todas envolvendo o acumulador e uma posio da RAM interna.

A figura 3.2 apresenta um diagrama ilustrando o que se entende por permutao de nibbles. Nota-se
que feita a troca das nibbles menos significativos. Esta instruo muito til quando se trabalha
com representao BCD e com converses entre hexadecimal e ASCII. Deve-se notar que existe
somente uma instruo envolvendo o acumulador e que o endereamento faz uso de um registrador.

A pilha um recurso muito til em diversos casos, especialmente para trabalhar com subrotinas,
quando ento ela serve para armazenar o endereo de retorno e tambm o contedo de registradores
e parmetros que poderiam ser destrudos pelas operaes da subrotina. A pilha trabalha
exclusivamente com a RAM interna e, por isso, ela pequena e, em alguns casos, se torna um recurso
escasso. A pilha pode ser localizada em qualquer posio da RAM interna, mas no dentro da rea
SFR. Entretanto, dos 128 bytes (128 Lower), bom lembrar que 48 bytes ou so usados como bancos
de registradores ou para endereamento bit a bit e que talvez no seja interessante consumi-los na
pilha. Como foi citado na seo 2.3 (figura 2.13), o microcontrolador 8052 traz mais 128 bytes (128
Upper), mapeados junto com os SFR e usados exclusivamente para pilha ou endereamento indireto.
Com isso, no h duplicidade de endereos, ou seja, no h confuso com os endereos da rea 128
upper e com os endereos dos SFR.

Existem apenas duas instrues para operar a pilha: PUSH e POP. Ambas pedem como operando um
endereo da RAM interna. Estudamos a seguir um ponto que gera muita confuso . J foi visto que o
registrador B sempre acessado via endereo, ou seja, B na verdade um rtulo para o endereo
F0H. Assim, pode-se usar a instruo PUSH B. Reservou-se a letra A para o acumulador, mas esse
A no um rtulo. Assim, no faz sentido o uso de PUSH A, j que a instruo pede que se
especifique um endereo. Para solucionar esse problema, criou-se um rtulo para o endereo do
acumulador, que o smbolo Acc (E0H), vide seo 3.2. Usa-se, portanto, PUSH Acc e no PUSH A.
Pela mesma necessidade de se especificar o endereo a ser operado na pilha, no existem as
instrues PUSH Rn ou PUSH @Ri.

A posio do topo da pilha indicada pelo valor do registrador SP. A instruo de PUSH sempre
incrementa o ponteiro da pilha (SP) antes de escrever na memria. Assim, se SP = 7 e for executada
a instruo PUSH Acc, o contedo do acumulador ser escrito no endereo 8 da RAM interna. J a
operao de POP trabalha da maneira inversa, ou seja, ela primeiro faz o acesso de leitura na RAM
interna, para depois decrementar o ponteiro da pilha (SP). No prximo captulo, na seo 4.4,
faremos um estudo criterioso da operao da pilha do 8051.

Todas as instrues at agora estudadas operam com a RAM interna. Entretanto, existem quatro
instrues disponveis para acessar a memria de dados externa. Nessas instrues, usa-se o
mnemnico MOVX, onde a letra X adicionada para indicar que se trata da memria de dados
externa. Essas instrues sempre envolvem o uso do acumulador, que a origem do dado, no caso de
uma escrita, ou o destino, no caso de uma leitura. O endereo a ser acessado especificado pelo
ponteiro de dados @DPTR ou por @R0 ou @R1. No caso do uso de R0 ou R1, deve ser observado
que so fornecidos apenas os 8 bits menos significativos do endereo, sendo que os 8 bits mais
significativos sero fornecidos pelo estado atual da porta P2.
So duas as instrues para acesso memria de programa. Ao mnemnico adiciona-se a letra C,
para indicar que se faz referncia memria de programa. Convm lembrar que, em geral, na
arquitetura 8051, a memria de programa s pode ser lida. Essas duas instrues so teis para a
construo de tabelas que sero acessadas durante a execuo do programa. Deve ser notado que so
as nicas instrues onde o endereo calculado de forma indexada.
3.6. Instrues Booleanas.

Essas instrues so denominadas booleanas porque trabalham com variveis lgicas


(varivel de 1 bit). Como o prprio nome sugere, elas so talhadas para resolver
expresses booleanas. Para representar as variveis lgicas, usado o espao de
endereamento de bits. O interessante que, nesse tipo de instruo, o Carry (C) se
comporta como se fosse o acumulador, ou seja, ele envolvido na maioria das operaes
e normalmente recebe o resultado. Algumas dessas instrues booleanas permitem
desvios do fluxo de execuo dos programas, ou seja, so instrues de saltos. Como
ser visto mais adiante, estes saltos so relativos posio atual do contador de
programa.

Estas instrues permitem ativar (colocar em 1), zerar (colocar em 0) ou complementar (inverter o
nvel lgico) qualquer bit do espao de endereamento bit a bit. O leitor deve notar que as instrues
que operam com o carry possuem opcode de apenas um byte. Para as demais instrues, necessrio
especificar o endereo do bit a ser operado, o que consome um byte extra. So trs instrues:

para zerar um bit, se usa a instruo: CLR


para ativar um bit, se usa a instruo: SETB
para complementar um bit, se usa a instruo: CPL
Na tabela, verifica-se que existem duas instrues tanto para o AND quanto para o OR. No existe
uma instruo para XOR. Empregam-se os mnemnicos ANL para Logical AND e ORL para
Logical OR. Nestas duas instrues, a flag C trabalha como acumulador, ou seja, ela um dos
operandos e tambm recebe o resultado. Por exemplo, a instruo ANL C,bit executa a operao C
C AND bit. Nas instrues em que o bit aparece precedido por uma barra (/bit) a operao ser
realizada com o complemento do bit, no entanto o bit original no alterado. Como podemos
perceber, essas instrues so adequadas para a resoluo de expresses booleanas.

Nas instrues de transferncia (cpia) de bits, a flag carry (C) sempre est envolvida. No
permitida a transferncia (cpia) direta entre bits, mas sim apenas por intermdio do carry.

Essas instrues controlam o fluxo de execuo do programa em funo do estado dos bits. So cinco
instrues: duas tomam como base o carry e as outras trs operam com qualquer bit da rea
enderevel bit a bit. A instruo JC faz um desvio se o carry estiver em um, caso contrrio passa
para a prxima instruo. A instruo JNC faz o desvio se o carry estiver em zero. De maneira
anloga, existem as instrues JB e JNB que fazem o desvio se o bit especificado estiver em 1 ou em
0, respectivamente. Existe ainda a instruo JBC que faz um desvio se o bit especificado estiver em 1
e logo em seguida complementa o bit. Essa uma instruo atmica do tipo testa e complementa e
til para a construo de semforos, como os estudantes de Sistemas Operacionais j devem ter
percebido.
3.7. Instrues de Desvio.

Essas instrues so usadas para alterar e controlar o fluxo de execuo de programas. A


instruo de desvio mais simples o salto (jump). Alguns saltos so incondicionais, ou
seja, acontecem sempre, enquanto que outros so efetivados ou no dependendo da
condio especificada. Uma outra instruo muito empregada a chamada de subrotina
(call). Quando se chama uma subrotina, o C guarda na pilha o endereo de regresso,
para que, quando terminar a execuo da subrotina (instruo RET), ele possa voltar
execuo do fluxo normal.

A instruo LJMP (long jump) o salto longo e capaz de desviar a execuo para qualquer posio
da memria de programa, pois oferece um campo de 16 bits para a especificao do endereo de
destino. Essa instruo, portanto, consome trs bytes no seu opcode. Existe a instruo de salto
absoluto, AJMP (absolute jump), que, por oferecer um campo de 11 bits para o endereo de destino,
fica limitada dentro de pginas de 2 KB. Entretanto, seu opcode precisa apenas de 2 bytes. O salto
curto, SJMP (short jump), toma como base a posio atual da instruo para desviar o fluxo de
execuo do programa e, por isso, denominado de salto relativo. Ele permite especificar um salto
de at 127 posies (bytes) para diante ou at 128 posies (bytes) para trs. Finalmente, existe a
instruo de salto indexado, JMP, usando A e DPTR. Mais adiante, no prximo captulo, existe uma
grande quantidade de exerccios que serviro para exemplificar e solidificar esses conceitos.

Observao: a operao << 5 significa deslocar o byte cinco bits para a esquerda. O opcode da
instruo AJMP adr11 fica mais fcil de ser entendido com o seguinte formato, onde Ai representa os
bits do endereo:
Esses saltos so efetivados ou no de acordo com a condio especificada. Na seo 3.6.4, j foram
estudados os saltos baseados no estado do carry (C) e no estado de um bit. Aqui, so abordadas as
instrues que fazem ou no o salto segundo a comparao do acumulador com o nmero zero e ainda
alguns saltos que permitem repetir trechos de programas. A instruo JZ efetiva o salto se o contedo
do acumulador for igual a zero e a instruo JNZ faz o salto se o contedo do acumulador for
diferente de zero. Deve ser observado que, nesta arquitetura, no existe a flag zero (Z) e, por isso,
essas duas instrues verificam o contedo atual do acumulador. A instruo compare e salte se no
for igual, CJNE (compare and jump if not equal), que pode ser traduzida como compare e salte se
no for igual, permite fazer diversas comparaes com o acumulador ou registradores e saltar se os
valores forem diferentes. Todos esses saltos so relativos.

As subrotinas so teis para evitar a repetio de trechos de programas. Antes de efetivar o desvio
para a subrotina, o processador armazena na pilha o endereo de retorno, para que possa recuper-lo
por ocasio do regresso. Esse empilhamento de endereos permite que, de dentro de uma subrotina,
se faa chamada para uma outra subrotina. Em outras palavras, o empilhamento do endereo de
retorno permite que se aninhem diversas chamadas de subrotinas.
De maneira semelhante s instrues de saltos, existe uma chamada de subrotina com endereo de 16
bits (LCALL) e que, por isso, pode alcanar qualquer posio da memria de programa, mas
consome trs bits para seu opcode. Existe uma outra instruo (ACALL), com apenas 11 bits de
endereo, e que por isso est restrita pgina de 2 KB, mas consome apenas 2 bytes no seu opcode.

Observao: a operao << 5 significa deslocar o byte cinco bits para a esquerda. O opcode da
instruo ACALL adr11 fica mais fcil de ser entendido com o seguinte formato, onde Ai representa
os bits do endereo:

Para indicar ao C que terminou a subrotina e que o processamento deve retornar para o endereo
armazenado no topo da pilha, existe a instruo de retorno, representada pelo mnemnico RET. Existe
uma outra instruo de retorno, mas para as subrotinas que atendem s interrupes, que a instruo
RETI. As interrupes ainda no foram abordadas e, por ora, pode-se encarar a interrupo como
uma chamada de subrotina ativada por um sinal digital, ou seja, uma chamada de subrotina ativada
por hardware.

Em programas, comum a repetio de determinados trechos de cdigos. Para facilitar seu uso, a
arquitetura 8051 oferece a instruo DJNZ (decrement and jump if not zero), que pode ser traduzida
como decremente e salte se no for igual a zero. Essa instruo especifica um contador na RAM
interna ou num registrador (Rn) para ser decrementado e, caso o valor deste contador seja diferente
de zero, o C salta para a posio especificada. Deve-se notar que o contador de 8 bits e, por isso,
com um lao simples, consegue-se um mximo de 256 repeties. claro que os laos podem ser
aninhados, gerando qualquer quantidade de repeties. O salto especificado relativo e, por isso,
seu alcance de 127 posies (bytes) para frente ou de 128 posies (bytes) para trs. Essa
instruo anloga ao comando for que existe em C ou Pascal.

Existe uma instruo que no faz nada, apenas consome um ciclo de mquina. a instruo NOP (no
operation). Tal instruo pode parecer intil, mas usada nos laos de programa para gerar
intervalos de tempo especficos ou serve para reservar espaos de memria de programa para
expanses futuras ou remendos, especialmente quando se trabalha com EPROM.
3.8. Instrues e Flags.

Para que possamos programar corretamente e explorar o mximo de cada instruo,


importante sabermos como elas afetam as flags, que pertencem ao registrador PSW. A
seguir, apresentada uma tabela onde esto listadas as instrues que modificam as
flags. Nesta tabela, o nmero 0 (zero) indica que a flag apagada, o nmero 1 (um) indica
que a flag ativada e a letra X usada para indicar que a flag ser alterada (para 1 ou
para 0), de acordo com o resultado da operao realizada. O smbolo - indica que a flag
no alterada.
3.9. Tabelas com Cdigos de Operao.

A seguir, apresentamos todas as instrues 8051 arrumadas em uma tabela segundo seus
opcodes. Esta tabela interessante porque permite verificar como foram arrumadas as
instrues da famlia 8051 e tambm verificar que no existe instruo atribuda ao opcode
A5H. O leitor deve notar que, ao longo das colunas, esto posicionadas instrues
semelhantes.

A linha sombreada no topo da tabela indica a nibble mais significativo, ou MSN (Most
Significant Nibble), e a coluna sombreada no lado esquerdo da tabela indica a nibble
menos significativo, ou LSN (Least Significant Nibble) do primeiro byte do opcode. Assim,
o opcode da instruo DIV AB 84H. Por outro lado, fcil verificar que o opcode 48H
corresponde instruo ORL A,R0.

importante que fique claro que a tabela apresenta apenas o primeiro byte das instrues
que possuem opcodes com vrios bytes.
3.10. Instrues por Ordem Alfabtica.

A seguir, apresentamos uma lista por ordem alfabtica de todas as 111 instrues da
famlia 8051, junto com seu respectivo opcode. Esta lista muito til para montarmos
manualmente um programa em assembly. Todos os nmeros esto indicados em
hexadecimal.

1) ACALL end11
2) ADD A,Rn 28+n
3) ADD A,end8 25 end8
4) ADD A,@Ri 26+i
5) ADD A,#dt8 24 dt8
6) ADDC A,Rn 38+n
7) ADDC A,end8 35 end8
8) ADDC A,@Ri 36+i
9) ADDC A,#dt8 34 dt8
10) AJMP end11
11) ANL A,Rn 58+n
12) ANL A,end8 55 end8
13) ANL A,@Ri 56+i
14) ANL A,#dt8 54 dt8
15) ANL end8,A 52 end8
16) ANL end8,#dt8 53 end8 dt8
17) ANL C,bit 82 bit
18) ANL C,/bit B0 bit
19) CJNE A,end8,rel B5 end8 rel
20) CJNE A,#dt8,rel B4 dt8 end8
21) CJNE Rn,#dt8,rel B8+n dt8 rel
22) CJNE @Ri,#dt8,rel B6+i dt8 rel
23) CLR A E4
24) CLR bit C2 bit
25) CLR C C3
26) CPL A F4
27) CPL bit B2 bit
28) CPL C B3
29) DA A D4
30) DEC A 14
31) DEC Rn 18+n
32) DEC end8 15 end8
33) DEC @Ri 16+i
34) DIV AB 84
35) DJNZ Rn,rel D8+n rel
36) DJNZ end8,rel D5 end8 rel
37) INC A 04
38) INC Rn 08+n
39) INC end8 05 end8
40) INC @Ri 06+i
41) INC DPTR A3
42) JB bit,rel 20 bit rel
43) JBC bit,rel 10 bit rel
44) JC rel 40 rel
45) JMP @A+DPTR 73
46) JNB bit,rel 30 bit rel
47) JNC rel 50 rel
48) JNZ rel 70 rel
49) JZ rel 60 rel
50) LCALL end16 12 MSB(end16) LSB(end16)
51) LJMP end16 02 MSB(end16) LSB(end16)
52) MOV A,Rn E8+n
53) MOV A,end8 E5 end8
54) MOV A,@Ri E6+i
55) MOV A,#dt8 74 dt8
56) MOV Rn,A F8+n
57) MOV Rn,end8 A8+n end8
58) MOV Rn,#dt8 78+n dt8
59) MOV end8,A F5 end8
60) MOV end8,Rn 88+n end8
61) MOV end8,end8 85 end8(fonte) end8(destino)
62) MOV end8,@Ri 86+i end8
63) MOV end8,#dt8 75 end8 dt8
64) MOV @Ri,A F6+i

65) MOV @Ri,end8 A6+i end8


66) MOV @Ri,#dt8 76+i dt8
67) MOV bit,C 92 bit
68) MOV C,bit A2 bit
69) MOV DPTR,#dt16 90 MSB(dt816) LSB(dt816)
70) MOVC A,@A+DPTR 93
71) MOVC A,@A+PC 83
72) MOVX A,@Ri E2+i
73) MOVX A,@DPTR E0
74) MOVX @Ri,A F2+i
75) MOVX @DPTR,A F0
76) MUL AB A4
77) NOP 00
78) ORL A,Rn 48+n
79) ORL A,end8 45 end8
80) ORL A,@Ri 46+i
81) ORL A,#dt8 44 dt8
82) ORL end8,A 42 end8
83) ORL end8,#dt8 43 dt8
84) ORL C,bit 72 bit
85) ORL C,/bit A0 bit
86) POP end8 D0 end8
87) PUSH end8 C0 end8
88) RET 22
89) RETI 32
90) RL 23
91) RLC A 33
92) RR A 03
93) RRC A 13
94) SETB bit D2 bit
95) SETB C D3
96) SJMP rel 80 rel
97) SUBB A,Rn 98+n
98) SUBB A,end8 95 end8
99) SUBB A,@Ri 96+i
100) SUBB A,#dt8 94 dt8
101) SWAP A C4
102) XCH A,Rn C8+n
103) XCH A,end8 C5 end8
104) XCH A,@Ri C6+i
105) XCHD A,@Ri D6+i
106) XRL A,Rn 68+n
107) XRL A,end8 65 end8
108) XRL A,@Ri 66+i
109) XRL A,#dt8 64 dt8
110) XRL end8,A 62 end8
111) XRL end8,#dt8 63 end8 dt8
3.11. Exerccios.

3-1) Por que importante para um microcontrolador oferecer instrues compactas e


velozes?

3-2) Na tabela 3.3, dito que o smbolo rel representa um deslocamento de 8 bits,
indicado em complemento de 2. Por que tal deslocamento fica limitado faixa de 128 a
+127 posies?

3-3) Seguindo o estrito significado da palavra registrador, quais so os registradores da


arquitetura 8051?

3-4) Por que o registrador B no , na verdade, um registrador?

3-5) Indicando suas finalidades, enumere as quatro colunas que compem um programa
em assembly.

3-6) Indique alguns usos para a instruo de soma com carry.

3-7) Por que importante zerar a flag carry antes de uma instruo de subtrao?

3-8) Tente explicar por que a execuo das instrues de multiplicao e diviso consome
tanto tempo.

3-9) Explique a diferena entre as instrues ADD A,#1 e INC A. Comente tambm sobre o
tempo de execuo e tamanho do opcode.

3-10) Explique a diferena entre as instrues SUBB A,#1 e DEC A. Comente tambm sobre
o tempo de execuo e tamanho do opcode.

3-11) Supondo que R0 = 40H, o que acontece na instruo INC @R0?

3-12) Indique a instruo para zerar os bits pares de um byte?

3-13) Indique a instruo para ativar (colocar em 1) os bits pares de um byte?

3-14) Indique a instruo para inverter os bits pares de um byte?


3-15) correto afirmar que uma instruo SWAP A eqivale a quatro instrues RL A ou a
quatro instrues RR A? Compare as duas solues, comentando sobre tempo de
execuo e quantidade de bytes do opcode.

3-16) Tente escrever uma pequena rotina que troque o contedo dos registradores A e B.
permitido o uso de R0 como registrador auxiliar. Levando em conta o tempo de execuo
e quantidade de bytes, compare essa rotina com a instruo XCH A,B.

3-17) O que uma subrotina?

3-18) Por que, na tabela da seo 3.9, existem 8 campos marcados com a instruo
AJMP end11 e 8 campos marcados com a instruo ACALL end11?

3-19) Monte o cdigo de operao e indique o tempo de execuo das seguintes


instrues.
4. Programao Assembly

O captulo anterior apresentou a extensa lista das instrues disponveis na famlia 8051.
O leitor h de concordar que so muitas instrues e, sem uma boa prtica, no se
consegue adquirir a desenvoltura necessria para escrever programas. Assim, neste
captulo, damos nfase prtica da programao assembly. Programar em assembly
muito diferente de se programar em C ou Pascal pois, nesse nvel, o programador
responsvel por tudo que seu programa faz. Em especial, quando se trabalha com
microcontroladores, j que raramente h a disponibilidade de um sistema operacional. O
programador passa a ser responsvel por gerenciar a memria, por indicar onde deve
carregar o programa, por reservar memria para seus dados, por dar significado s suas
variveis e ainda por trabalhar de maneira correta com a representao numrica adotada.

Ao longo deste captulo e com a ajuda de uma srie de exerccios resolvidos,


desenvolveremos a habilidade em programao assembly, ao mesmo tempo em que forem
fixados os pontos mais importantes do conjunto de instrues do 8051. De incio, os
exerccios sero simples e envolvero operaes aritmticas elementares. Paulatinamente,
iremos aumentando a complexidade dos exerccios e dos tipos de dados envolvidos e
chegaremos at a operar com vetores elementares. Depois, passamos a praticar com
cdigos ASCII e representao BCD. Aps essa prtica de programao assembly,
estudaremos a montagem das instrues. Essa parte dar ao leitor uma boa idia dos
cdigos de operao e da forma como eles so arrumados na memria. Em seguida,
vamos aprender a calcular o tempo consumido por nossas rotinas, que um tpico
importante para conseguirmos escrever programas rpidos. Bem mais adiante, veremos
detalhadamente o funcionamento da pilha. Terminamos este captulo com um estudo dos
modos de endereamento deste microcontrolador.
4.1. Exerccios Resolvidos.

Some dois nmeros de 8 bits. Armazene em R7 o resultado da soma de R1 com R0.

Soluo

Como a soma aritmtica somente pode ser feita com o uso do acumulador, preciso antes
copiar para l uma das parcelas. A soluo ento pode ser colocada da seguinte forma:

interessante ter a certeza de que a soma dos dois registradores no levar a um resultado maior que
255 (maior nmero que pode ser armazenado no acumulador). Caso isso acontea, ser necessrio
um bit adicional para guardar o resultado. A flag carry (C) ativada toda vez que uma soma
ultrapassar 255. A figura 4.1-(a) apresenta a soma de dois nmeros, sendo que o resultado (50) pode
ser representado em um byte. J a figura 4.1-(b) mostra a soma de 200 + 100 = 300 e, como fcil de
ser constatado, o resultado ultrapassa 255, ativando o carry. Assim, so necessrios nove bits para
representar esse resultado, sendo que o carry fez o papel do nono bit.

Some dois nmeros de 8 bits aproveitando o potencial carry. Armazene em R7 (MSB) e R6 (LSB) o
resultado da soma de R1 com R0. Daqui em diante, introduzimos a notao: [R7 R6] R1 + R0.
Primeira Soluo:

Agora existe espao para armazenar o carry. Assim, aps realizar a soma dos operandos,
contabilizamos o carry atravs de uma soma (ADDC).

preciso notar que, aps armazenar a poro menos significativa (LSB) do resultado em R6, o
acumulador foi zerado para, em seguida, atravs da instruo ADDC, ser adicionado com zero mais
o carry. O uso desta soma com zero foi somente para aproveitar o carry. Em seguida, essa poro
mais significativa (MSB) do resultado foi guardada em R7. Existe uma outra forma de se aproveitar o
carry, atravs do uso da instruo RLC A, como apresentado na soluo alternativa a seguir. Essa
rotao coloca o carry na posio menos significativa do acumulador e oferece a vantagem de
economizar um byte no tamanho da rotina.

Segunda Soluo:

Agora, aps realizar a soma dos operandos, aproveita-se o carry usando uma rotao do acumulador
(RLC).

Some dois nmeros de 16 bits. Armazene em [R7 R6] o resultado da soma de [R3 R2] com [R1 R0].
Note a indicao de nmeros de 16 bits por: [MSB LSB]. Ou seja, faa [R7 R6] [R3 R2] + [R1
R0]

Soluo:

So feitas agora duas somas de um byte e a concatenao entre elas possvel atravs do carry.
Novamente enfrentamos o problema de, aps a ltima soma, aproveitarmos ou no o carry. Se o
resultado da soma puder ser representado em 16 bits, no h problema, como mostrado na figura 4.2.
Entretanto, pode ser que o resultado da soma no caiba em 16 bits e neste caso seria necessrio um
bit a mais, como proposto no prximo exerccio resolvido.

Some dois nmeros de 16 bits, sem ignorar o carry. Armazene em [R7 R6 R5] o resultado da soma
de [R3 R2] com [R1 R0]. Ou seja, faa [R7 R6 R5] [R3 R2] + [R1 R0].

Soluo:

Como pode ser notado, ser usado mais um registrador, pois o resultado pode chegar a 17 bits.
Fazemos agora duas somas de um byte e a concatenao entre elas dada pelo carry. Ao final,
realizamos ainda uma soma com zero e o carry, de forma a aproveitar seu estado.

Caso a soma de 16 bits gere um carry, ser necessrio um bit adicional para armazen-lo. Como no
se pode usar registradores de forma fracionada, foram alocados trs registradores [R7 R6 R5], ou
seja, 24 bits para receber o resultado. Sabemos, entretanto, que sero aproveitados apenas 17 bits. A
figura 4.3 apresenta o caso de uma soma com nmeros de 16 bits, onde o resultado precisa de ser
representado em 17 bits.

Subtraia dois nmeros de 8 bits. Armazene em R7 o resultado da subtrao de R1 menos R0,


supondo R1 R0. Ou seja, faa R7 R1 R0.

Soluo:

Deve-se lembrar que, no 8051, a subtrao sempre envolve o empresta um (borrow), que
representado pelo carry. Por isso, antes de fazer a subtrao, preciso ter certeza de que C = 0.

A rotina SUBTR1 muito semelhante SOMA1. Enfatizamos que a instruo de subtrao SUBB
sempre usa o borrow, que representado pelo carry (C) e como seu valor no era conhecido, fomos
obrigados a zer-lo. Para garantir um resultado positivo, consideramos R1 R0. Por enquanto, no
trataremos de nmeros negativos.

Subtraia dois nmeros de 16 bits. Armazene em [R7 R6] o resultado da subtrao de [R3 R2] menos
[R1 R0], supondo [R3 R2] [R1 R0]. Ou seja, faa [R7 R6] [R3 R2] [R1 R0].

Soluo:

A subtrao aritmtica de 16 bits ser feita em duas pores de 8 bits e a concatenao entre elas
ser dada pelo borrow (representado pelo carry).
importante notar que, antes do primeiro uso da instruo SUBB, o borrow (C) zerado. Entretanto,
no se deve fazer isso por ocasio do segundo SUBB, pois naquele instante o borrow indicava o
resultado da subtrao anterior.

Multiplique dois nmeros de 8 bits. Armazene em [R7 R6] o resultado da multiplicao de R1 por
R0. Ou seja, faa [R7 R6] R1 x R0.

Soluo:

Existe apenas uma instruo de multiplicao que envolve necessariamente os registradores A e B.


Assim, deve-se copiar os fatores para A e B e depois usar a instruo MUL AB. Uma multiplicao de
dois nmeros de 8 bits pode resultar em um nmero de at 16 bits. Por isso, so disponibilizados
dois registradores para receber o resultado.

Multiplique dois nmeros de 16 bits. Armazene no conjunto [R7 R6 R5 R4] o resultado da


multiplicao de [R3 R2] por [R1 R0]. Ou seja, faa [R7 R6 R5 R4] [R3 R2] x [R1 R0].

Soluo:

Agora devemos efetuar uma multiplicao de 16 bits usando multiplicaes de 8 bits. Na verdade,
so necessrias 4 multiplicaes de 8 bits. Para a soluo deste exerccio, preciso verificar que um
nmero de 16 bits, como por exemplo 479CH, pode ser representado por (47H * 28) + 9CH. Assim o
produto escrito como:
So feitas 4 multiplicaes de 8 bits, porm deve-se tomar cuidado com as potncias de 2, que
indicam a posio relativa de cada produto. O fator "2 elevado oitava potncia" significa que o
resultado deve ser deslocado 8 bits para a esquerda e, por sua vez, "2 elevado dcima sexta
potncia" indica um deslocamento de 16 bits para a esquerda. Isto est ilustrado na figura 4.4. Para
chegar soluo final, ainda so necessrias trs somas de 16 bits.
Divida dois nmeros de 8 bits. Armazene em R7 o quociente e em R6 o resto da diviso de R1 por
R0, supondo R0 0. Segundo a notao, faa: R7(q) e R6(r) R1 / R0.

Soluo:

Existe apenas uma instruo de diviso e, para empreg-la, preciso ter em A o dividendo e em B o
divisor. Aps a execuo da instruo DIV AB, o quociente estar no acumulador e o resto no
registrador B. Para resolver o exerccio, basta copiar o dividendo e o divisor nos registradores
corretos, usar a instruo de diviso e depois armazenar o quociente e o resto.

Quando se trabalha em 8 bits, a diviso fica muito fcil. A dificuldade surge quando so envolvidos
nmeros representados em mais de 8 bits. Quando o divisor est limitado em 8 bits, ainda existe uma
soluo relativamente simples, vide exerccio 4-7. Uma diviso de dois nmeros de 16 bits j
problemtica, pois no se consegue facilmente dividi-la em divises de 8 bits. Uma soluo criar
um subrotina para fazer a diviso via subtraes sucessivas. O exerccio 4-8 pede uma subrotina
para efetuar diviso de dois nmeros de 16 bits.

Calcule o somatrio de um vetor com elementos de 8 bits. Escreva um programa que armazene, na
primeira posio aps o final do vetor, a soma de todos os elementos do vetor que inicia no endereo
20H. Para simplificar a soluo, vamos supor que este somatrio seja passvel de ser representado
em 8 bits.

Antes de comearmos a resoluo do exerccio, abordamos o problema da arrumao de vetores na


memria do microcontrolador. Existem diversas maneiras de se fazer isso. Vamos sugerir uma forma
muito simples, que est apresentada na figura 4.5-(a). Note que o vetor comea no endereo M, com
um nmero N que indica seu tamanho. Logo em seguida, vm os elementos do vetor. Essa forma
interessante pois basta indicarmos o endereo de incio do vetor e todo o resto fica subentendido. A
figura 4.5-(b) apresenta o exemplo para o vetor de 5 elementos: [7, 4, 13, 22, 6], armazenado a partir
do endereo 20H.

Soluo:

preciso notar que, no momento em que se escreve o programa, no se conhece o tamanho do vetor.
Esse tamanho s fica conhecido no momento da execuo da rotina, atravs da leitura do valor
armazenado no endereo 20H, que o endereo de incio do vetor. Para resolver esse exerccio,
usaremos o endereamento indireto para acessar os diversos elementos do vetor. Para tanto, R0
inicializado com o valor 21H, que endereo do primeiro elemento. Aps calcular a soma, o
resultado deve ser armazenado na primeira posio aps o fim do vetor, que a posio de endereo
20H+N+1.

Note que o tamanho do vetor foi copiado para R7 e que R0 foi inicializado com o endereo do
primeiro elemento do vetor. Muita ateno ao uso do smbolo #, que indica dado imediato (nmero
constante). Como foi usado o endereamento indireto, convm lembrar que o smbolo @R0 indica
que se deve buscar o contedo da posio de memria cujo endereo est em R0. Os leitores que
programam em C j devem ter notado a semelhana com ponteiros. Graas a esse endereamento
indireto, foi possvel, em cada lao do programa, acessar um diferente elemento do vetor. Uma outra
instruo interessante a DJNZ, que decrementa uma determinada posio e, se o resultado for
diferente de zero, salta para o rtulo indicado. Para fazer desvios, ou seja, saltar para uma posio
qualquer, faz-se uso de rtulos. No programa, a palavra ROT1 um rtulo e indica o local para onde
deve ser desviado o processamento. Note que SOMAT1 tambm um rtulo, que indica o endereo
de incio do programa. Finalmente, deve ser notado que, quando terminar o lao, R0 estar apontando
para a primeira posio de memria logo aps o final do vetor (20H+N+1). Assim, bastou o uso da
instruo MOV @R0,A para armazenar o resultado do somatrio.

Observao: at agora, foram mostradas pequenas rotinas sem qualquer preocupao com o seu
trmino. Entretanto, o C no pra no final dos programas. Ele segue adiante executando os prximos
cdigos presentes na memria, quer sejam parte de um programa, que sejam lixo. Assim, ao final de
um programa, preciso parar o processamento. Uma maneira muito fcil de fazer isso usar um lao
infinito. Essa soluo muito empregada quando se trabalha com simuladores para comprovar o
funcionamento de pequenas rotinas. O prximo problema aborda a paralisao do processamento
atravs de um lao infinito.

Realize o somatrio em 16 bits de um vetor com elementos de 8 bits. Armazene a soma em 16 bits de
todos os elementos do vetor, que se inicia no endereo 20H, nas duas primeiras posies livres aps
o fim do vetor na seguinte ordem: primeiro o LSB e depois o MSB do somatrio. Ao final da
execuo, o programa deve parar num lao infinito.

Soluo:

A soluo muito parecida com a anterior, entretanto a soma deve ser feita em 16 bits. Alm de usar
R7 como contador e R0 como ponteiro, toma-se [R6 R5] para armazenar o somatrio em 16 bits. O
resultado ser armazenado nas duas primeiras posies aps o fim do vetor, que so as posies de
endereo 20H+N+1 e 20H+N+2.
Note que a ltima instruo deste programa uma instruo de salto para seu prprio endereo.
Assim, o processamento fica eternamente preso nessa instruo. muito comum uma instruo
fazer referncia ao seu endereo, tanto que se usa o smbolo $ para indic-lo. Assim, a ltima
instruo do programa poderia ser substituda por SJMP $. A instruo de salto usada, o SJMP, deve
ser empregada sempre que possvel, pois ela ocupa apenas dois bytes e um salto relativo, como
veremos mais adiante.

Escreva um programa para inverter a ordem de um vetor com elementos de 8 bits que est no
endereo 20H, como mostrado na figura 4.6. Ao final da execuo o programa deve parar num lao
infinito.

Soluo:
claro que agora so necessrios dois ponteiros. Um dever varrer o vetor do incio at o meio
enquanto que outro o varrer do final at o meio. A cada repetio, as posies apontadas por esses
dois ponteiros sero trocadas. Para descobrir o endereo do fim do vetor, necessrio fazer a soma
20H+N. A troca deve continuar at os ponteiros se encontrarem (N par) ou se cruzarem (N mpar).
Existe uma forma mais fcil de controlar a repetio do lao, j que basta notarmos que a quantidade
de repeties deve ser igual a N/2 (diviso inteira). Para o caso da figura, temos N = 5, o que
significa que o lao de troca deve ser repetido duas vezes.

Existem dois pontos a serem comentados. A diviso por 2 usou uma simples rotao para a direita
(RRC A), pois a diviso inteira por potncias de 2 pode ser feita com o emprego de rotaes: um
deslocamento para direita corresponde a uma diviso por 2; dois deslocamentos fazem a diviso por
4 e assim por diante. Note que foi usada a rotao com o carry (previamente zerado) para garantir
que o bit mais a esquerda do acumulador seja zero. Essa diviso poderia ter sido feita com a
instruo DIV AB, mas seriam gastos 4 ciclos de mquina, contra um ciclo gasto pela rotao. Com o
emprego de dois ponteiros, a troca de posio entre os elementos do vetor pode ser feita de maneira
simples usando trs instrues XCH A,@Ri. O leitor convidado a fazer um esboo dessa troca de
posies.

Compare dois nmeros inteiros sem sinal que esto localizados em R7 e R6. Armazene o maior em
R7 e o menor em R6. Termine o programa com um lao infinito.

Soluo:

A maneira mais fcil de comparar dois nmeros inteiros sem sinal atravs da subtrao e a
posterior interpretao do borrow. Deve ser lembrado que, na subtrao, o carry desempenha a
tarefa do borrow. A figura 4.7 ilustra como interpretar o carry logo aps uma subtrao. A soluo
do exerccio simples, pois basta subtrair R6 de R7 e, se der carry, trocam-se os contedos dos
dois registradores.

O truque de comparar dois nmeros sem sinal atravs da subtrao muito usado. Se os nmeros
forem de 16 bits, basta realizar a subtrao de 16 bits. A troca de contedo entre R7 e R6 foi muito
semelhante do exerccio anterior e est ilustrada na figura 4.8. Neste exemplo, usamos a instruo
JNC ROT1, que efetiva o desvio se C = 0, do contrrio continua com a prxima instruo.

Encontre o maior elemento do vetor de nmeros de 8 bits que est no endereo 20H e armazene-o na
primeira posio livre ao final do vetor.

Soluo:

No exerccio anterior, foi mostrado como comparar dois nmeros para descobrir qual o maior. Este
conceito agora aplicado de forma encadeada ao longo de um vetor.

Nessa rotina, inicializamos o acumulador com o menor valor possvel (zero) e, em seguida, usando
R0 como ponteiro, comparamos o acumulador com cada elemento do vetor. Caso o nmero do
acumulador seja menor, o valor apontado por R0 copiado para o acumulador. Na quinta instruo,
antes da subtrao, apagamos o carry, pois nesse instante desconhecamos seu valor. Um outro ponto
a comentar que a subtrao destri o valor do acumulador. Assim, para no perd-lo, ele foi salvo
na pilha, atravs da instruo PUSH Acc. Aps a subtrao, esse valor recuperado com a instruo
POP Acc. Vemos que a pilha um recurso muito til!

Apresentamos agora uma segunda soluo, onde apenas mudamos o incio do programa. Ao invs de
inicializarmos o acumulador com zero, colocamos ali o primeiro elemento do vetor (usando R0) e
depois decrementamos o contador, pois nesse caso so feitas N-1 comparaes.
Escreva uma subrotina que ordene de forma crescente os nmeros das posies @R0 e @(R0+1).
Em outras palavras, a subrotina recebe um endereo em R0 e arruma em ordem crescente essa
posio e a prxima. A figura 4.9 ilustra melhor a idia.

Soluo:

importante notar que se recebe um endereo em R0. Os dois valores a serem comparados esto
nessa posio de memria e na seguinte, ou seja, de acordo com a figura 4.9, tem-se @R0 = x e
@(R0+1) = y. A comparao feita atravs da subtrao (x y).
Se a subtrao no resultar em carry, ento necessrio trocar de posio os dois nmeros e isso
feito atravs das trs instrues XCH A,@R0, junto com incremento e decremento do ponteiro R0.
Como o pedido do problema especificava que essa era uma subrotina, devemos termin-la com uma
instruo de retorno: RET. A chamada de uma subrotina feita por uma instruo ACALL ou LCALL e o
retorno de uma subrotina por uma instruo RET. A instruo RET faz o fluxo de processamento
continuar a partir da primeira instruo logo aps a chamada de subrotina. O prximo exerccio
trabalha esse conceito.

Toda vez que se escreve uma subrotina, interessante deixar bem claro os parmetros que ela recebe
e os que ela retorna. No caso deste exerccio, o nico parmetro recebido foi o endereo (M) do
primeiro nmero, armazenado em R0. J a subrotina retorna os dois nmeros ordenados e o contedo
de R0 incrementado (R0 = M+1). Devemos marcar os recursos que a subrotina faz uso, que neste
caso so o acumulador (A) e o PSW. Isso importante para que o programador possa fazer uso da
subrotina e saber quais recursos do C sero alterados.

Escreva uma subrotina que ordene de forma crescente o vetor com elementos de 8 bits, cujo incio
est armazenado em R0. Suponha que exista a disponibilidade da rotina COMP, escrita no exerccio
anterior.

Soluo:

A lgica do programa bastante simples. Se varrermos o vetor do incio at o final, fazendo o


ordenamento dois a dois (subrotina COMP), ao final teremos o maior elemento do vetor ocupando a
ltima posio. Em seguida, repetimos o processo, mas agora parando uma posio antes do final do
vetor e teremos ali o segundo maior elemento do vetor. Repetimos este processo por diversas vezes,
parando, a cada repetio, uma posio antes. Ao final, todo o vetor estar ordenado. Este processo
de ordenamento clssico e recebe o nome de Mtodo da Bolha.

A subrotina ficou bem pequena e compacta. Era necessrio colocar em R7 o tamanho do vetor e,
como no existe a instruo MOV R7,@R0, fomos obrigados a fazer uma passagem intermediria pelo
acumulador, por isso foram usadas as instrues MOV A,@R0 e MOV R7,A. Algo semelhante ocorreu
quando foi preciso copiar em R6 o contedo de R7. Neste caso, usamos o acumulador como ponte,
atravs das instrues MOV A,R7 e MOV R6,A. Devemos ressaltar que a instruo MOV R0,B incua
por ocasio da primeira repetio, mas, nas repeties seguintes, ela serve para restaurar em R0 o
endereo de incio do vetor. A figura 4.10 apresenta a ordenao para um vetor com 4 elementos.

Deve ser observado que, para um vetor de N elementos, usa-se um lao principal repetido (N-1)
vezes e, com essa finalidade, usou-se R7. Um outro ponto que ajuda verificar que a quantidade de
repeties do lao secundrio igual ao contedo de R7. Assim, para o caso da figura 4.10, o vetor
tem 4 elementos, ento o lao principal ter 3 repeties. Para cada repetio do lao principal, o
contador do lao secundrio (R6) inicializado com o valor de R7. Finalmente, deve ser notado que
a ltima iterao no precisaria de ser realizada, pois o vetor j est ordenado, ou seja, a subrotina
pode retornar quando R7 = 1. Entretanto, para o programa ficar mais elegante, deixa-se esta ltima
repetio ocorrer, pois assim pode-se usar a instruo DJNZ R7.
Programe uma subrotina que escreva zero em todas as posies da RAM interna, ou seja, do
endereo 0 at o endereo 127 da RAM interna. Suponha que o banco 0 (BK 0) esteja selecionado.

Soluo:

Ao ser ligado o processador, o contedo da RAM interna indeterminado, por isso esta subrotina
interessante por escrever zero em todas essas posies. Assim, todas as variveis e flags definidas
na RAM interna partem com valor zero. Outro ponto interessante que ela extremamente compacta.
O registrador R0 faz ao mesmo tempo o papel de ponteiro e de contador. Esta subrotina s funciona
corretamente se o banco zero estiver selecionado, situao padro logo aps o reset. Note que o lao
interrompido quando R0 = 0, significando que no se escreve na posio de endereo zero.

Gere o caracter ASCII hexadecimal correspondente a uma nibble (4 bits). Antes de iniciarmos a
soluo preciso explicar que nibble um conjunto de quatro bits. A Tabela ASCII uma forma de
representar letras e smbolos atravs de valores numricos. Ela usada quando se enviam dados
para uma impressora, quando se precisa exibir textos num monitor e tambm quando se enviam letras
para um mostrador LCD. Segundo essa tabela, usa-se o nmero 41H para representar a letra A, o
nmero 42H para a letra B, etc.. Um problema muito comum o de apresentar no mostrador LCD,
em hexadecimal, um nmero de 8 bits. A Tabela 4.1 apresenta os caracteres ASCII em questo: 0, 1,
..., 9, A, B, ..., F. Assim, se a nibble a ser convertida for o 3, a resposta ser dada pelo caracter
ASCII de 3, que 33H.

Soluo:

Essa subrotina, denominada NIB_ASC, bastante fcil, pois basta testarmos o valor da nibble
recebida: se for menor que 10, somamos 30H e, se for maior que 10, somamos 37H. Deve ser notado
que a subrotina espera receber o valor posicionado na nibble menos significativa (LSN) e que a
nibble mais significativa (MSN) do acumulador deve estar zerada. Alm disso, observe que o valor
original do acumulador guardado na pilha (PUSH Acc) e depois recuperado (POP Acc).
possvel propor uma segunda soluo onde somamos 30H ao nmero que est no acumulador e
depois testamos se o resultado maior que 39H. Em caso positivo, somamos mais 7. Note que, antes
da subtrao, efetuamos uma adio que com toda certeza no gera carry. Assim, no foi necessrio
zer-lo antes. O leitor convidado a comparar essas duas rotinas levando em conta o tamanho e
tempo de execuo.

Sugerimos uma terceira segunda soluo, muito parecida com a primeira, sendo que no precisamos
guardar na pilha o valor recebido. Se o valor recebido for maior que 10, soma-se 7. Depois, soma-se
3AH (30H + 10), compensando o valor 10 que foi subtrado na segunda linha.

Empregando a subrotina NIB_ASC1, escreva uma subrotina que receba um byte no acumulador e
retorne os dois caracteres ASCII correspondentes, sendo o mais significativo armazenado no
acumulador e o menos significativo no registrador B.

Soluo:

Antes de iniciarmos a soluo, vamos explicar a motivao deste exerccio. Um problema muito
comum o de apresentar no mostrador LCD, em hexadecimal, um nmero de 8 bits. Mas, para ser
apresentado no LCD, o byte precisa de ser convertido para ASCII. Assim, se o byte for 37H, a
resposta ser dada pelos caracteres ASCII de 3 e de 7, que so 33H e 37H, respectivamente. Se, por
acaso, o byte for igual a 5BH, a resposta ser 35H e 42H.
De posse da rotina NIB_ASC1, o problema fica muito simples, restando apenas gerenciar a
arrumao das nibbles para serem enviadas subrotina NIB_ASC1.

Note que primeiro guardamos em B uma cpia do byte recebido. Em seguida, calculamos o ASCII
(LSN). A troca, feita com a instruo XCH A,B, no s recuperou em A o byte original como tambm
guardou em B parte da resposta desejada. Para finalizar, bastou separar o MSN e chamar novamente
a subrotina NIB_ASC1, que ela j devolveu o ASCII (MSN) no acumulador, como solicitado.

Escreva uma subrotina que receba um byte no acumulador e retorne em [R7 R6 R5] os trs caracteres
ASCII correspondente a suas representaes em octal. Exemplos: se recebe A = 73H (115 decimal
ou 163 em octal), retorna R7 = 31H, R6 = 36H e R5 = 33H e se recebe A = ECH (236 decimal ou
354 em octal), retorna R7 = 33H, R6 = 35H e R5 = 34H.

Soluo:

necessrio representar na base oito o nmero recebido no acumulador. Uma forma de se fazer isto
atravs de divises pelo valor da base, como mostrado na figura 4.11 (vide apndice A). O resto
da primeira diviso por 8 gera o terceiro dgito octal (o menos significativo). Seu quociente
dividido novamente por 8, sendo que, desta diviso, o resto corresponde ao segundo dgito octal e o
quociente, ao primeiro dgito (o mais significativo).
Escreva uma subrotina que receba um byte no acumulador e retorne em [R7 R6 ... R0], do banco um,
os oito caracteres ASCII correspondentes a sua representao binria. Exemplo: se receber A = 6AH
(106 decimal ou 0110 1010 binrio), retorna R7 = 30H, R6 = 31, R5 = 31H, R4 = 30H, R3 = 31, R2
= 30H, R1 = 31H e R0 = 30.

Soluo:

Uma forma muito simples de se resolver este problema testar os bits do acumulador e armazenar
30H ou 31H de acordo com o valor de cada bit. Para podermos fazer o teste, usamos a rotao do
acumulador para levar cada bit para o carry. Note que o armazenamento deve acontecer no banco 1,
que se inicia no endereo 8, vide figura 2.8. Como foi feita nas demais resolues, foi considerado
que o banco ativo o de nmero zero.
Some o nmero BCD que est em [R5 R4] com o nmero BCD que est em [R3 R2], colocando o
resultado em [R7 R6]. Ou seja, faa [R7 R6] [R5 R4] + [R3 R2].

Soluo:

Esse exerccio visa a preparar terreno para os prximos exerccios. A soma de dois nmeros BCD
muito simples, pois basta usar a instruo de ajuste decimal DA A aps cada soma. preciso lembrar
que essa instruo s trabalha corretamente com a soma. Exemplo, se [R5 R4] = 2345H e [R3 R2] =
3872H, ento o resultado ser [R7 R6] = 6217H.

Subtraia 23 do nmero BCD que est em [R7 R6], ou seja, faa [R7 R6] [R7 R6] - 23 (em BCD).
Soluo:

A subtrao em BCD precisa de ser feita com cuidado pois, como j foi visto, a instruo DA A s
opera logo aps uma soma. A soluo empregar um conceito anlogo ao complemento 2, mas
agora, ser o complemento 10, pois se est trabalhando com BCD. Basta notar que, numa soma, o
nmero 99 pode ser visto como 1, o nmero 98 como 2 e assim por diante. Veja o exemplo da
figura 4.12, onde, entre outros exemplos, subtrado de 76 o nmero 23. Assim, o 67 usado para
representar o 23.

Converta para BCD um nmero binrio na faixa de 0 a 99. Escreva uma subrotina para colocar sob a
forma BCD o contedo do acumulador, sabendo-se que seu valor est na faixa de 0 a 99. O resultado
deve ser regressado no prprio acumulador. Exemplo, se A = 43 (2BH), deve retornar A = 43H.

Soluo:
Na soluo deste exerccio, muito importante tomar cuidado para no confundir as representaes
em decimal, hexadecimal e BCD. Um truque muito simples para fazer essa converso de binrio para
BCD quebrar o nmero em potncias de 10, como mostrado na figura 4.13. Faz-se isso atravs da
diviso por 10. Se A = 43 (2BH), divide-se por 10: o quociente ser igual a 4 e o resto igual a 3. A
resposta ser A = 43H.

Note que, para montar o resultado, usamos a instruo SWAP A seguida por um ADD A,B. Assim, as
nibbles que representavam o quociente e o resto foram colocadas nas posies corretas.

Escreva uma subrotina para colocar sob a forma BCD o contedo do acumulador. Note que no se
faz qualquer restrio sobre seu valor. Como sero necessrios trs dgitos BCD, o resultado dever
ser guardado em [R7 R6], segundo a notao: [R7 R6] BCD(A). Exemplo, se A = 237 (EDH),
deve retornar R7 = 02H e R6 = 37H. Sugesto: use a subrotina anterior.

Soluo:
A soluo continua a mesma. Divide-se o nmero por 100 e tem-se o dgito das centenas. Depois,
divide-se o resto por 10 e tm-se a dezena e a unidade.

Escreva uma subrotina que faa [R5 R4] BCD([R3 R2]). Ou seja, armazene em [R5 R4] o valor
BCD do nmero em [R3 R2]. Sabe-se que este nmero menor ou igual a 999. Exemplo, se [R3 R2]
= 827 (33BH), deve retornar R5 = 08H e R4 = 27H. Sugesto: use a subrotina anterior.

Soluo:

Esse exerccio apresenta uma dificuldade maior, pois preciso dividir por 100, que um nmero
cuja representao BCD possui mais de um byte. Entretanto, possvel usar um truque, que consome
um pouco de tempo, mas que simples. Basta notar que o nmero em R3 representa a multiplicidade
por 256: nmero = 256 x R3 + R2. Assim, a converso feita em duas etapas. Na primeira, somam-
se 256 (em BCD) a [R5 R4] um nmero de vezes igual a R3. Depois, usa-se a subrotina
BIN_BCD255 para converter o que ficou em R2 e adicionar ao resultado anterior.
Empregando uma tabela, escreva uma subrotina que retorne no acumulador o caracter ASCII
correspondentes a uma nibble (4 bits). Este exerccio semelhante ao exerccio resolvido 4.18, onde
se determinou o caracter ASCII correspondente a uma nibble com o uso de comparaes e somas
aritmticas. O objetivo daquele exerccio era praticar comparaes aritmticas. Agora, o objetivo
apresentar o emprego de tabelas.

Soluo:

As tabelas usualmente so construdas na memria de programa (ROM) e, por isso, seu acesso feito
com o uso de instrues do tipo MOVC. Precisamos de construir em memria a tabela 4.2. Com o
emprego da diretiva DB (essas diretivas sero estudadas no prximo captulo), possvel indicar ao
montador a inteno de armazenar determinados bytes na memria.
O programa extremamente simples, mas preciso tomar cuidado, pois a tabela est definida na
memria de programa. Note que o endereo de incio da tabela foi colocado no DPTR, mas o
endereo acessado o corresponde soma do acumulador com o DPTR.
4.2. Montagem das Intrues.

Como j se afirmou anteriormente, o C no capaz de entender diretamente os


mnemnicos. Esses mnemnicos tm a finalidade de facilitar o entendimento e a
documentao dos programas. Para que possam ser executados, esses programas devem
ser convertidos em uma lista de cdigos de operao ou opcodes, que sero armazenados
na memria. Alm dessa converso, preciso especificar um endereo na memria, a
partir do qual o programa ser armazenado. Essa tarefa de converter uma lista de
mnemnicos em opcodes recebe o nome de montagem, isso porque, os bytes relativos a
cada mnemnico so realmente montados, muitas vezes bit a bit. Ao conjunto de bytes que
se obtm logo aps a montagem se denomina programa montado ou programa
executvel. Existem programas responsveis por transformar uma lista de mnemnicos
num arquivo executvel e, como bvio, esses programas so denominados montadores,
em ingls assemblers. No prximo captulo, um desses montadores ser estudado.

interessante e enriquecedora a experincia de montar manualmente alguns pequenos


programas, pois isto possibilita melhor compreenso de como so arrumados os opcodes
e tambm da quantidade de bytes consumida por cada instruo. Alm disso, fica-se com
uma excelente compreenso das instrues de salto relativo e de chamadas e desvios
restritos a pginas de 2 KB. Para iniciar, vamos montar o programa SOMA1, apresentado
como soluo para o exerccio resolvido 4.1. Por convenincia ele foi repetido a seguir.

Precisamos agora de descobrir o cdigo de cada instruo. Isto conseguido com o uso da tabela
apresentada na seo 3.9 ou com a lista das instrues e opcodes, que est disponvel na seo 3.10.
Abaixo, segue uma tabela com cada instruo e seu cdigo.
Assim, a montagem do programa SOMA1 consiste dos cdigos E9, 28, FF. Montar um programa
resume-se em consultar a tabela de cdigos de operao. Entretanto, propositadamente, omitimos o
endereo a partir de onde o programa deveria ser carregado.

Vamos agora montar o programa SOMA5 (exerccio resolvido 4.4), que est repetido adiante e cujas
instrues e opcodes esto apresentados na Tabela 4.4.

interessante notar que a instruo ADDC A,#0 usa dois bytes para seu opcode. Esse programa,
carregado a partir do endereo 200H, assume o seguinte aspecto:
As instrues foram apresentadas apenas para auxiliar a compreenso. O programa montado se
resume apenas no endereo e lista de opcodes. O fato de o programa ser carregado a partir do
endereo 200H em nada alterou seus opcodes. Por isso, pode-se dizer que este programa
independente do endereo de carga. Programas que apresentam essa propriedade so denominados
Programas Relocveis.

A questo agora : o que acontece quando se monta um programa que usa desvios? Inicialmente,
trabalharemos com instrues de desvios relativos e vamos constatar que tais desvios so relocveis.
Um desvio relativo sempre calculado tomando como base a posio da instruo de desvio. Como
o campo reservado para se especificar o valor do desvio de um byte, tm-se desvios que vo desde
128 (para trs) a +127 (para frente).

Para a prtica com saltos relativos, vamos montar e carregar, a partir do endereo 200H, o programa
COMP (exerccio resolvido 4.13), onde existe a instruo JNC ROT1, que um salto relativo. Como
mostrado na tabela 4.5, ao serem montadas as instrues em seqncia, chega-se instruo JNC
ROT1 sem o conhecimento do endereo de ROT1. O endereo de ROT1 s ser conhecido ao
montarmos a ltima instruo. Assim, deixamos uma posio reservada para o desvio ROT1. O
mesmo aconteceu com a instruo SJMP $.
Usamos ?? para indicar que, no momento, valor do desvio relativo desconhecido. De posse dos
opcodes e comeando a partir do endereo 200H, carregamos o programa:

Ao montarmos o programa, descobrimos que o valor do rtulo COMP 200H (bvio) e que o valor
de ROT1 208H. Note que as posies 204H e 209H ainda no foram preenchidas. No endereo
204H, devemos colocar quantos posies precisamos de avanar para chegar ao rtulo ROT1
(endereo 208H). Basta contar as posies. Elas esto marcadas na coluna mais da esquerda, na
listagem seguinte. importante ter em mente que, quando o C est executando uma instruo, o
contador de programa (PC) j est apontando para a prxima instruo. Isto significa que se conta a
partir da prxima instruo e se inicia a contagem com zero. Assim, a conta fcil: 208H 205H =
3.

Falta ainda resolver o desvio relativo a ser colocado no endereo 209H. Note que essa instruo,
como a final do programa, deve tomar como referncia a prxima posio, que est livre. A
contagem est marcada abaixo.
Para a instruo SJMP $ desviar para si mesma, necessrio retroceder duas posies, ou 2, que
em complemento 2 corresponde ao byte FEH. Devemos ressaltar que os desvios relativos so
simplesmente somados ao PC, o que resulta no salto. Como esses desvios tomam por base a posio
da instruo, eles so ditos relativos. Note que o programa COMP continua o mesmo, independente
de seu endereo de carga.

Faremos agora uma pequena alterao que vai ilustrar bem a diferena entre endereamento relativo
e endereamento absoluto. Trocamos a ltima instruo do programa, a que gera o lao infinito, pela
instruo AJMP ROT1. Para a lgica do programa no faz qualquer diferena e o tempo de execuo e
o tamanho continuam os mesmos, mas com essa alterao o programa deixa de ser relocvel.

interessante ver como se montam instrues do tipo AJMP e ACALL, pois o endereo toma parte na
montagem da instruo, como mostrado na figura a seguir. Esta figura, inicialmente, apresenta os dois
bytes que formam o opcode da instruo. importante notar a posio onde os bits do endereo (A0
at A10) so usados para montar esse opcode e que os cinco bits mais significativos do endereo
(A11 at A15) so ignorados. O opcode da instruo AJMP possui apenas 5 bits (iguais a 0 0001) que
so fixos. Como, no primeiro byte, existem trs bits de endereo (A8 at A10), essa instruo
aparece 8 vezes na tabela da seo 3.9. Efetivamente, o que faz essa instruo substituir os onze
bits menos significativos do contador de programa (PC).

O mais importante disso tudo perceber que o programa no mais relocvel, ou seja, se for
necessrio mud-lo de endereo, ser necessrio alterar o opcode da instruo AJMP ROT1. Essa
instruo muda de acordo com o valor do rtulo ROT1. Agora, o programa classificado como
Programa No Relocvel ou Programa Absoluto, pois depende dos valores absolutos dos rtulos
dos endereos.

Os programas relocveis so bem versteis, pois podem ser montados e depois armazenados em
qualquer posio da memria. Na descrio das instrues, feita no captulo anterior, o smbolo
rel foi usado para indicar o deslocamento relativo (gera instruo relocvel). A tabela a seguir
apresenta uma lista das instrues de que fazem desvios absolutos e desvios relativos.

Para finalizar o assunto sobre montagem de instrues, montamos agora uma subrotina que faz a
chamada de outra subrotina. A subrotina BYTE_ASC (exerccio resolvido 4.19) deve ser
armazenada a partir do endereo 200H e a subrotina NIB_ASC (exerccio resolvido 4.18) deve ser
armazenada logo a seguir. Novamente, fazemos a montagem em duas passagens. Na primeira
passagem, arrumamos os opcodes a partir do endereo especificado, deixando espaos que sero
preenchidos na segunda passagem, aps conhecermos os valores de todos os rtulos.

Note que as subrotinas foram armazenadas na memria uma em seguida da outra. Ao terminarmos a
primeira passada, sabemos que os rtulos tm os seguintes valores: BYTE_ASC = 200H, NIB_ASC
= 20E e ROT = 21A. As posies de memria: 204H, 205H, 20BH, 20CH e 216H, que estavam em
aberto, so agora preenchidas durante a segunda passagem. Como fazem referncia ao mesmo
endereo, as duas instrues absolutas ACALL NIB_ASC tm o mesmo opcode, que igual a 51H e
0EH. J para a instruo de salto relativo JNC ROT, ficou em aberto apenas uma posio, que onde
se indicam quantas posies devem ser avanadas. Pelo programa, fcil verificar que devem ser
avanadas 3 posies de memria (lembre-se de iniciar a contagem com o zero, a partir da prxima
instruo). Assim, aps a segunda passagem, a montagem assume a forma mostrada a seguir.
Essa forma de montar os opcodes em duas passagens a mais comum e empregada pelos
montadores que recebem o nome de Montadores de Duas Passagens ou duas fases.
4.3. Tempo de Execuo.

Existem diversos parmetros para a medida de eficincia de um programa. Um desses


parmetros o tempo de execuo. bvio que, ao se compararem duas rotinas distintas
que resolvem o mesmo problema, deve-se optar pela que gasta menos tempo. Nesta
seo, vamos estudar como calculado o tempo de execuo de uma rotina. Tambm
mostramos como criar trechos de programa que gastam intervalos de tempo previamente
determinados. O tempo de execuo das rotinas medido em ciclos de mquina, ou MC
(Machine Cycle). O Capitulo 10 apresenta uma definio completa e diversos detalhes
sobre o ciclo de mquina. Por hora, a necessidade muito simples, pois queremos apenas
saber quantos MC cada instruo consome.

Com o 8051 padro, o MC igual a doze perodos de relgio, entretanto existem diversos
fabricantes oferecendo C extremamente rpidos com MC igual a um perodo do relgio.
Assim sendo, importante verificar o manual do C para relacionar o MC com a freqncia
do cristal oscilador. Neste estudo, adotamos o padro MC = 12 / fXtal, onde fXtal
representa a freqncia do cristal oscilador. Assim, se fXtal = 12 MHz, conclui-se que 1
MC = 1 s.

Iniciamos com o estudo do tempo consumido pela subrotina SOMA5 (exerccio resolvido
4.4), que faz a soma de dois nmeros de 16 bits. Note que, para transform-la em
subrotina, adicionamos uma instruo de retorno no seu final. A seguir, apresenta essa
subrotina com os MC que cada instruo consome.

Agora fcil verificar que essa subrotina consome 11 MC e, se for executado em um C com cristal
de 12 MHz, gastar 11 s. Quando trabalhamos com programas que possuem laos de repetio, o
clculo do tempo de execuo deve ser feito com um pouco mais de cuidado. Calculamos agora o
tempo consumido pela subrotina ZERAR (exerccio resolvido 4.17) que escreve zero em todas as
posies da RAM interna, que apresentado a seguir, j com a quantidade de MC consumida por
cada instruo.

Nota-se que o lao consome 3 MC e que ele repetido 127 vezes. Fora do lao, tem-se um consumo
de 4 MC. Assim, o tempo total 4 + 127 x 3 = 385 MC, ou 385 s considerando um relgio de 12
MHz.

Em projetos com microcontroladores, comum a necessidade de se gerarem intervalos de tempo


precisos, para acionar um dispositivo ou para aguardar uma resposta. Escreva uma subrotina para
consumir 500 s, ou seja, que gere um intervalo de tempo de 500 s, considerando que se usa um
cristal de 12 MHz. No Captulo 7, sero estudados os contadores e temporizadores do 8051, que
oferecem recursos para gerar intervalos de tempo com preciso usando uma soluo muito mais
simples que a realizada aqui.

Soluo:

Uma forma muito prtica de gerarmos atrasos de tempo com a instruo DJNZ, que consome 2 MC.
Como o pedido especifica 500 s, necessrio consumir 500 MC. Usamos ento um lao que
repetido 250 vezes, como mostrado a seguir.

Ao fazermos as contas, notamos que a subrotina consome 3 + 250 x 2 = 503 MC. Para que a conta
fique exata, o lao de repetio deve consumir 497 MC, entretanto, claro que no se consegue gerar
uma quantidade mpar de MC, pois a instruo DJNZ gasta 2 MC. A soluo consumir 496 MC
com o lao e usar uma instruo NOP para ajustar a diferena, como mostrado a seguir.
Agora temos: 4 + 248 x 2 = 500 MC. Para gerarmos intervalos de tempo com diferentes valores,
podemos escrever uma subrotina que consuma, por exemplo, 20 s, e cham-la tantas vezes quantas
forem necessrias. claro que os intervalos de tempo sero mltiplos de 20 s. Entretanto, preciso
computar tambm os 2 MC que so consumidos pela instruo de chamada de subrotina. Na soluo
do exerccio resolvido 4.27, foi usado um registrador como contador. Essa soluo boa quando se
precisa gerar intervalos curtos. Porm, para gerar intervalos de tempo relativamente longos, deve-se
chamar diversas vezes uma subrotina, como foi sugerido, ou aninhar diversos laos, como no
exerccio resolvido a seguir.

Escreva uma subrotina que consuma exatamente 10 ms, considerando um cristal de 12 MHz com o
8051 padro.

Soluo:

O intervalo de 10 ms corresponde a 10.000 MC, um valor muito grande para ser gerado usando um
nico contador. Uma soluo fazer um aninhamento de laos, com o emprego de dois contadores. A
rotina a seguir apresenta uma soluo genrica, usando constantes M e N.

O lao interno composto apenas pela instruo DJNZ R6,$ e sua durao igual a N x 2 MC. Deve
ser notado que, cada vez que o contador do lao interno chega a zero, realizada uma repetio do
lao externo, onde se inicializa o contador do lao interno. Assim, a durao total (T) dada pela
expresso:

claro que dificilmente encontraremos valores de M e N que gerem exatamente 10.000, mas
possvel achar valores que levem a uma quantidade prxima. Por exemplo, com N = 58 e M = 84,
chegamos a 9.999 MC. Assim, usando NOP, adicionamos os MC que faltam. Obtemos o mesmo
resultado com N = 72 e M = 68. Assim, chegamos soluo:
4.4. Usa da Pilha.

A pilha, ou stack, um conceito muito importante para qualquer processador. Ela muito
simples e sua simplicidade, algumas vezes, dificulta seu entendimento. O nome pilha
muito propcio, pois se trabalha com uma srie de dados que so empilhados numa
determinada ordem e desempilhados na ordem inversa. algo semelhante a uma pilha de
latas de conserva num supermercado: a primeira lata a sair da pilha a ltima que foi
colocada. Por isso, a pilha denominada uma estrutura de dados LIFO (Last In First Out),
significando que o ltimo dado a entrar na pilha o primeiro a sair.

Construir uma pilha de dados na memria de um computador muito simples, pois precisa-
se apenas de um ponteiro para indicar a posio de memria do ltimo dado empilhado.
Aps cada empilhamento, incrementa-se esse ponteiro. Para retirar dados da pilha,
procede-se de forma inversa: l-se a posio de memria apontada pelo ponteiro e, em
seguida, este decrementado. Assim, para construir a pilha preciso apenas do ponteiro
e do espao na memria.

O tamanho da pilha dado pelo espao de memria a ela reservado. Se nada foi
empilhado, diz-se que a pilha est vazia. J na situao oposta, caso se coloquem dados
at ocupar todo o espao disponvel, diz-se que a pilha est cheia. Se esse espao for
ultrapassado, provoca-se o estouro da pilha. H duas situaes de erro: tentar colocar
mais um dado numa pilha cheia ou tentar retirar um dado de uma pilha vazia. Alguns
processadores possuem recursos para avisar quando uma dessas condies ocorrer.
Porm, isso no acontece com o ambiente 8051, onde o programador responsvel por
verificar essas duas condies.

As duas operaes bsicas com a pilha so o push e o pop. O push usado para
empilhar um dado a mais na pilha e o pop usado para desempilhar o ltimo dado
empilhado. O programador pode operar diretamente com a pilha usando as instrues
PUSH end8 ou POP end8. As instrues de chamada de subrotina ( ACALL e LCALL) fazem uso
da pilha para armazenar (push) o endereo de retorno. Por sua vez, as instrues de
retorno (RET e RETI) fazem uso da pilha para recuperar (pop) o endereo de regresso.
Mais adiante, veremos que as interrupes tambm fazem uso da pilha. No 8051, a pilha
obrigatoriamente construda dentro da RAM interna e, como seu ponteiro, usa o
registrador SP (Stack Pointer).

importante deixar claro que as instrues PUSH e POP sempre fazem referncia a um
endereo da RAM interna. As figuras 4.16 e 4.17 apresentam detalhes do funcionamento
dessas duas instrues. No existe a instruo PUSH A e nem a instruo POP R7. J foi
visto que o acumulador ocupa o endereo E0H da RAM interna e usado o rtulo Acc para
represent-lo. Assim, no existe a instruo PUSH A, mas existe a instruo PUSH Acc. J a
instruo PUSH B existe, pois B apenas o rtulo do endereo F0H. Se o banco 0 estiver
selecionado, a instruo POP 7, faz a mesma coisa que a hipottica instruo PUSH R7.
Essas instrues foram apresentadas na seo 3.5.4.

Cabe ao programador reservar a rea a ser usada pela pilha e, claro, tomar cuidado para que seus
programas no tentem colocar mais dados que o espao reservado e ou tentem retirar dados com a
pilha vazia. Como j comentamos, a pilha tambm usada para guardar endereos de retorno nas
chamadas de subrotinas. Assim, erros na pilha normalmente so fatais, pois podem provocar retornos
para endereos equivocados.

No exerccio resolvido 4.14, usamos a pilha para guardar um dado e, depois da operao de
subtrao, recuperamos esse dado. Esse um tpico uso da pilha. Passaremos agora a analisar o uso
da pilha nas subrotinas. J sabemos que, quando encontra uma chamada de subrotina, o processador
guarda na pilha o endereo da prxima instruo (endereo de retorno) e desvia para o endereo
especificado na instruo. Quando encontra a instruo de retorno, ele retira do topo da pilha o
endereo de retorno e o copia para o PC.
Analisemos o exemplo da subrotina BYTE_ASC, apresentada no exerccio resolvido 4.19. Vamos
supor que, no momento do incio desta subrotina, tnhamos SP = 10 e que, no acumulador, fora
passado o byte 3BH. Esse exemplo interessante por trazer duas chamadas subrotina NIB_ASC1.
Vamos supor tambm que o endereo da subrotina BYTE_ASC seja 200H e que o da subrotina
NIB_ASC1 seja 20EH, como na montagem feita na seo 4.2.

interessante estudar o estado do C antes e logo aps a execuo da instruo que est no endereo
204H. Note que a instruo de retorno a do endereo 206H. Para armazenar na pilha esse endereo
de retorno, que tem 16 bits, empilha-se primeiro o LSB e depois o MSB, como mostrado na figura
4.18.
A primeira instruo da subrotina NIB_ASC1 (endereo 20EH) exatamente uma operao de PUSH
Acc. A finalidade desta instruo guardar na pilha o contedo do acumulador. Assim, como
mostrado na figura 4.19, a pilha sofre a seguinte alterao:

Um pouco mais adiante, logo aps subtrair 10 do acumulador (endereo 210H), a subrotina restaura
o valor do acumulador com a instruo POP Acc. Com isso, a pilha evolui para a condio que est
mostrada na prxima figura.
Se o nmero for maior que 9, o programa efetua o salto para o endereo ROT, soma 37H ao
acumulador e, ao chegar o endereo 21CH, o C encontra uma instruo de retorno, orientando que
terminou o subrotina e que hora de retirar da pilha o endereo para regressar ao programa que
chamou a subrotina. A figura 4.21 ilustra essa situao.

Assim, o programa prossegue e, nas figuras seguintes (4.22 a 4.25), so apresentadas algumas
posies interessantes da pilha, pois, no endereo 20BH, novamente chamada a subrotina
NIB_ASC1.
Finalmente, a execuo do programa chega ao endereo 20DH, onde est a instruo de retorno que
finaliza a subrotina BYTE_ASC. Nesse instante, o C retira mais um endereo da pilha (duas
posies) e retorna para o programa chamador. importante notar que a subrotina BYTE_ASC
recebeu SP = 10H e, por isso, para ela no faz a mnima diferena conhecer o que havia na pilha da
posio 10H para baixo. O importante que a subrotina desempilhe tudo que foi empilhado, como
mostrado a seguir.

Esta forma de trabalhar com a pilha permite o aninhamento de subrotinas, ou seja, uma subrotina
pode chamar diversas outras subrotinas e, por sua vez, cada uma dessas subrotinas chamadas pode
chamar outras subrotinas e assim por diante, desde que no se ultrapasse o limite da pilha. Alm
dessas chamadas, possvel usar a pilha para armazenamento temporrio. Devemos ter o cuidado
para no misturarmos armazenamentos de dado com endereos de retorno.

Na famlia 8051, a pilha construda na RAM interna e, por isso, ela um recurso escasso. Faamos
uma pequena conta. Suponhamos que o projeto aninhe at 6 subrotinas e que cada uma delas, para
armazenamento temporrio, faa uso de 3 posies da pilha. Portanto, as 6 subrotinas demandam 12
posies da pilha para os endereos de retorno e, como cada subrotina usa 3 posies, 18 posies
para dados. Assim o tamanho mnimo da pilha deve ser de 12 + 18 = 30 posies. Uma boa sugesto
seria inicializar o ponteiro da pilha para 127 30 = 97, que no final da RAM interna. Sobram ento
98 bytes da RAM interna. Como muitas vezes se reservam 48 bytes, sendo 32 bytes para os bancos e
mais 16 para o espao enderevel bit a bit, sobram 98 48 = 50 bytes para o armazenamento de
variveis, o que em alguns casos pode ser pouco. Para contornar esse problema, como j foi visto, a
famlia 8052 possui mais 128 bytes na RAM interna que s so acessveis via endereamento
indireto, mas que tambm podem ser usados para a pilha. Assim, num 8052, o mais usual fazer SP =
127 e aproveitar toda a regio 128 Upper para a pilha.

importante no nos esquecermos de inicializar o ponteiro da pilha, pois, logo aps o reset, seu
valor igual a 7. Se no for inicializado, a primeira posio a ser ocupada a de endereo 8, que
corresponde ao registrador R0 do banco 1. O ideal , logo no comeo do programa, junto com a
inicializao do sistema, colocar SP apontando para o endereo de incio do espao reservado para
a pilha.
4.5. Modos de Endereamento.

Esta seo aborda o conceito de modo de endereamento e apresenta os modos


empregados pela famlia 8051. Colocado de uma forma bem simples, Modo de
Endereamento a forma usada para especificar o operando de uma instruo. A famlia
8051 faz uso dos seis modos de endereamento listados a seguir:

Imediato
Direto
Indireto
Registrador
Registrador especfico
Indexado
Modo Imediato quando o valor a ser operado especificado no prprio opcode da
instruo. No 8051, todo endereamento imediato indicado com o smbolo #. O nome
pertinente, pois o operando especificado imediatamente, dispensando acessos
memria ou a registradores. A tabela a seguir apresenta trs exemplos, onde deve ser
notado que um byte do opcode usado para indicar o operando.

Modo Direto quando o operando especificado atravs de um endereo da RAM interna, ou seja,
quando se faz uso diretamente de um endereo para especificar o operando. A seguir, so
apresentados trs exemplos onde deve ser notado que o endereo do operando est especificado no
opcode de cada instruo. Propositadamente, as instrues desse exemplo so muito semelhantes s
do exemplo anterior.
Modo Indireto quando se indica um registrador onde est o endereo do operando. Note que o
ltimo bit do opcode usado para indicar o registrador envolvido.

Modo Registrador quando operando est em um registrador. O registrador especificado atravs


de trs bits do prprio cdigo de operao, evitando assim a necessidade de um byte extra s para
especific-lo. Note que os trs ltimos bits de cada opcode indicam o registrador envolvido.

Modo Registrador Especfico quando a instruo especfica para um determinado registrador.


A se enquadram instrues que no possuem em seu opcode qualquer campo para especificar o
operando. Normalmente, para que o programador se lembre do registrador envolvido, ele indicado
no mnemnico.
Modo Indexado quando o endereo do operando gerado atravs da soma de um endereo base
com um indexador. No 8051, fazendo uso desse modo de endereamento, existem apenas as trs
instrues indicadas a seguir, onde o endereo da memria de programa dado pela soma do DPTR
(base) ou PC (base) com o acumulador (indexador). Esse modo muito usado para acessar tabelas
construdas na memria de programa ou para uma tabela de desvios.
4.6. Exerccios.

4-1) Escreva uma subrotina que efetue: [R7 R6 R5] [R3 R2] + [R0].

4-2) Escreva uma subrotina que efetue: [R7 R6 R5 R4] [R3 R2 R1] + [R0].

4-3) Escreva uma subrotina que efetue: [R7 R6 R5] [R3 R2] + 256 * [R0], onde o *
indica a operao produto.

4-4) Escreva uma subrotina que some dois nmeros, representados em 64 bits,
armazenados em [R7 R6 ... R0] dos bancos 1 e 2, devolvendo o resultado no banco 3 e o
vai um, se houver, no carry. Sugesto: use ponteiros e laos.

4-5) Refaa os exerccios resolvidos 4.5 e 4.6, mas sem a restrio de que o minuendo
seja maior que o subtraendo. Estude o Apndice A para ver a representao de nmeros
negativos.

4-6) Escreva uma subrotina que efetue: [R7 R6 R5] [R3 R2] * [R0].

4-7) Escreva uma subrotina que efetue: [R7 R6](q) e [R5 R4](r) [R3 R2] / [R0], onde q
indica o quociente e r, o resto.

4-8) Escreva uma subrotina que, atravs de subtraes sucessivas, efetue a diviso entre
dois nmeros de 16 bits: [R7 R6](q) e [R5 R4](r) [R3 R2] / [R1 R0].

4-9) No exerccio resolvido 4.11, para zerar os registradores R7 e R6 foram empregadas


as instrues:

Uma alternativa seria zerar o acumulador e depois copi-lo para os registradores, como mostrado a
seguir:
Compare as duas solues com relao a tamanho de programa e tempo de execuo.

4-10) A tabela a seguir apresenta trs possveis solues para o problema de se zerarem os oito
registradores [R7, ... R0] do banco 0. Compare as solues levando em conta o tamanho do programa
e tempo de execuo.

4-11) Escreva uma subrotina para calcular o somatrio de um vetor com elementos de 16 bits, cujo
endereo est em R0. Para cada elemento, no sentido crescente dos endereos, so armazenados
primeiro o LSB e depois o MSB. O resultado, em 24 bits, deve ser armazenado logo aps o final do
vetor. Teste a possibilidade do vetor estar vazio.

4-12) Escreva uma subrotina para inverter ordem dos elementos de um vetor, cujo endereo est em
R0. Esse vetor possui elementos de 16 bits (vide exerccio anterior). Cuidado na troca!

4-13) Escreva uma subrotina para determinar o menor elemento de um vetor cujo endereo est em
R0 e armazen-lo na primeira posio logo aps o final do vetor. Esse vetor possui elementos de 8
bits.

4-14) Escreva uma subrotina para determinar o maior elemento de um vetor com elementos de 8 bits
e tambm contar quantas vezes ele repetido. Armazene o maior elemento na primeira posio logo
aps o final do vetor e a quantidade de ocorrncias na segunda posio. O endereo de incio do
vetor est em R0.

4-15) Escreva uma subrotina para determinar o maior elemento de um vetor com elementos de 16 bits
e armazen-lo nas duas primeiras posies logo aps o final do vetor. O endereo de incio do vetor
est em R0.

4-16) Escreva uma subrotina para determinar o maior e o menor elemento de um vetor com elementos
de 16 bits (palavras de 16 bits) e armazen-los nas duas primeiras posies logo aps o final do
vetor. O endereo de incio do vetor est em R0. Cada elemento de 16 bits composto, claro, por 2
bytes que so armazenados da seguinte forma: na ordem crescente do vetor est primeiro o LSB
(Least Significant Byte ou byte menos significativo) e depois o MSB (Most Significant Byte ou byte
mais significativo).

4-17) Escreva uma subrotina para determinar o maior e o menor elemento de um vetor com elementos
de 8 bits, com nmeros negativos representados em complemento dois, e armazen-los nas primeiras
posies logo aps o final do vetor (primeiro o maior elemento). O endereo de incio do vetor est
em R0.

4-18) Escreva uma subrotina para determinar o maior e o menor elemento de um vetor com elementos
de 16 bits, com nmeros negativos representados em complemento dois, e armazen-los nas
primeiras posies logo aps o final do vetor (primeiro o maior elemento). O endereo de incio do
vetor est em R0.

4-19) Escreva uma subrotina para transformar os elementos de um vetor com elementos de 8 bits,
com nmeros negativos representados em complemento dois, em um vetor com a mesma quantidade
de elementos, mas com esses elementos representados em 16 bits. O endereo de incio do vetor est
em R0.

4-20) Com relao subrotina ZERAR (exerccio resolvido 4.17), responda s perguntas. Existe
alguma posio da RAM interna onde no se escreve com a instruo MOV @R0,A? Qual essa
posio? Considerando um relgio de 6 MHz, quanto tempo esta subrotina consome? Por que ela s
funciona corretamente se o banco zero estiver selecionado? O que aconteceria se ela fosse executada
com o banco 3 selecionado?

4-21) Escreva uma subrotina para zerar toda a RAM interna de um 8052, ou seja, as regies 128
lower e 128 upper (vide figura 2.13).

4-22) Na soluo do exerccio resolvido 4.18, foram propostas duas subrotinas, denominadas
NIB_ASC1 e NIB_ASC2. Compare as duas e indique se existe alguma mais vantajosa. Leve em
conta o tamanho das duas subrotinas e calcule quanto tempo elas consomem, considerando um relgio
de 12 MHz.

4-23) Escreva a subrotina ASC_NIB, que faz o inverso da subrotina NIB_ASC, ou seja, a subrotina
ASC_NIB recebe um caracter ASCII (vlido) no acumulador e devolve a nibble correspondente na
posio menos significativa do acumulador.

4-24) Escreva a subrotina ASC_NIBT, semelhante ao pedido anterior, entretanto, que leve em conta
que, para gerar uma nibble, os smbolos ASCII vlidos so: 30H, 31H, ..., 39H, 41H, ..., 46H. Assim,
esta subrotina, antes de fazer a converso, testa se o ASCII recebido est dentro da faixa vlida e, em
caso negativo, chama a subrotina ERRO.

4-25) Escreva a subrotina ASC_BYTE, que faz a operao inversa da subrotina BYTE_ASC, ou
seja, ela recebe dois caracteres ASCII, sendo o menos significativo (LSN) no registrador B e o mais
significativo (MSN) no acumulador. Sugesto: use a subrotina pedida no problema anterior.

4-26) Escreva uma subrotina que calcule o complemento 10 do nmero BCD que est em [R7 R6],
devolvendo o resultado no mesmo local.

4-27) Considerando um relgio de 12 MHz, calcule, na pior das hipteses, quanto tempo consome a
rotina BIN_BCD999 (exerccio resolvido 4.26).

4-28) Escreva uma subrotina que converta para BCD, armazenando o resultado em [R7 R6 R5], o
nmero de 16 bits apresentado em [R4 R3]. Note que esse nmero pode ter qualquer valor entre 0 e
65535. Calcule o tamanho e o tempo consumido pela subrotina, considerando um relgio de 12 MHz.
Sugesto: usando a subrotina BIN_BCD255, converta o LSB para BCD, depois converta o MSB para
BCD. Use multiplicaes por 256. Multiplicar por 256 fcil: multiplique por 200 (multiplique por
2 e desloque 2 posies BCD para esquerda), multiplique por 50 (multiplique por 5 e desloque 1
posio para esquerda), multiplique por 6 e, finalmente, some os resultados.

4-29) De acordo com o que foi estudado no captulo 3, classifique as instrues apresentadas
listadas a seguir. Exemplo: MOV 20H,R7 MOV end8,Rn.

MOV A,#20H
MOV 0E0H,#20H
MOV B,#20
MOV A,B
MOV P1,B
XRL B,A
INC A
INC B
INC DPTR
CLR C
CLR P
CLR B.0

4-30) Indique a instruo mais eficiente para substituir as apresentadas a seguir. Considere que o
Banco 0 esteja selecionado.
MOV 0E0H,33
MOV 0E0H,#0
INC 0

4-31) Gere o cdigo executvel (lista de endereos e opcodes ) para a rotina SOMA4, apresentada
no exerccio resolvido 4.3, considerando que seu endereo de carga seja 100H. Essa rotina
relocvel?

4-32) Gere o cdigo executvel (lista de endereos e opcodes ) para a rotina SOMAT2, apresentada
no exerccio resolvido 4.11, considerando que seu endereo de carga seja 200H. Essa rotina
relocvel?

4-33) Gere o cdigo executvel (lista de endereos e opcodes ) para as rotinas ORD e COMP
(exerccio resolvidos 4.16 e 4.15), considerando os endereos de carga 300H e 400H,
respectivamente. Dessas duas subrotinas, qual relocvel?

4-34) Gere o cdigo executvel (lista de endereos e opcodes ) para as rotinas BIN_BCD999 e
BIN_BCD255, considerando os endereos de carga de 100H e 200H, respectivamente. Alguma
dessas subrotinas relocvel?

4-35) Como soluo ao pedido de escrever uma subrotina que consumisse exatamente 1 ms, foi
apresentada a listagem a seguir, que faz uso da subrotina ROT_500 (exerccio resolvido 4.28).
Verifique se a soluo est correta e, caso contrrio, calcule seu erro.

4-36) Escreva uma subrotina que gere atrasos em mltiplos de 100 s. O nmero passado atravs do
acumulador especifica o atraso a ser gerado em centenas de microssegundos. Exemplo, se A = 75,
indica que se necessita de um atraso de 7500 s. Sugesto: escreva uma pequena subrotina para gerar
um atraso aproximado de 100 s e repita-a o nmero de vezes especificado no acumulador.

4-37) O que aconteceria se, no exemplo que ilustrou o uso da pilha (seo 4.4), a instruo POP Acc,
que est no endereo 213H, fosse substituda por duas instrues NOP?

4-38) Supondo que o topo da pilha seja a posio 127 da RAM interna, escreva uma subrotina
QTD_PILHA que devolva no acumulador a quantidade de espao livre na pilha. Nesse clculo, no
deve ser computado o espao da pilha usado pela subrotina QTD_PILHA.

4-39) Entende-se por mdulo o resto da diviso de um nmero por outro. Seja a notao MOD (X,Y)
significando o resto da diviso de X por Y. Por exemplo: MOD(17,3) = 2 e MOD(21,2) = 1. Alm
disso, ser empregada a pilha para passagem de parmetros, como mostrado a seguir.

muito comum que a passagem de parmetros para a subrotina seja feita atravs da pilha. No caso
deste exerccio, o programa principal est chamando a subrotina que implementa a funo mdulo.
Note que, antes de chamar essa subrotina, o programa empilhou os dois parmetros X e Y e reservou
espao (Z) para o retorno do resultado. Depois disso, chamou a funo Z = MOD (X,Y). EH e EL
representam, a parte mais significativa (EH) e a menos significativa (EL) do endereo de retorno.
Note que importante apenas a posio relativa dos parmetros.
Escreva uma subrotina que, empregando a passagem de parmetros apresentada, calcule o mdulo de
X por Y, armazenando o resultado na posio Z, retornando em seguida. Considere X e Y menores
que 256.

4-40) Refaa o problema anterior de forma a retornar o parmetro pelo acumulador, ao invs de
retornar pela posio Z da pilha. Esta a forma usada pelos compiladores C.

4-41) Escreva um cdigo de programa para chamar a subrotina do exerccio 4-39, fazendo com que
R2 MOD(R1,R0).

4-42) Escreva um cdigo de programa para chamar a subrotina do exerccio 4-40, fazendo com que
R2 MOD(R1,R0).

4-43) Escreva a subrotina PUSH_R0 que coloca R0 no topo da pilha, como se existisse a instruo
PUSH R0. Devem ser preservados o acumulador e todos os registradores do 8051.

4-44) A estrutura de chamada de subrotinas foi criada para trabalhar com aninhamento de subrotinas,
como mostrado a seguir.

Na listagem apresentada, usou-se a letra I para representar as instrues. A rotina ROT1 chama a
rotina ROT2 que, por sua vez, chama a rotina ROT3. No regresso da rotina ROT3, retorna-se para
ROT2 (instruo I22) e desta para ROT1 (instruo I12). Ao terminar ROT1, h o regresso para o
programa chamador.

Este exerccio pede que se troque esse aninhamento. Assim, escreva o trecho de programa
TROCA_RET (no subrotina) que troque a ordem de regresso do aninhamento. Na chamada, como
j foi visto, ROT1 chama ROT2 que chama ROT3. No retorno de ROT3, regressa-se para ROT1
(instruo I12) e desta para ROT2 (instruo I22) que, ao terminar, faz o regresso para o programa
chamador. Veja ilustrao a seguir.

4-45) Classifique as instrues abaixo de acordo com o modo de endereamento.


5. Programa Montador

No captulo anterior, atravs de exemplos, estudamos diversos programas para o 8051.


Alguns desses programas foram montados manualmente, o que muito trabalhoso e
sujeito a erros. Nesse captulo, mostramos como montar programas assembly com o uso
de um programa montador.

Como j dissemos, o montador responsvel por receber as instrues em um arquivo


texto e gerar na sua sada um arquivo j montado, ou seja, um arquivo com os opcodes de
todas as instrues presentes no programa. Todo o montador traz uma srie de opes,
denominadas pseudo-instrues, que servem para o programador orientar a montagem de
seu programa. importante conhecermos esses recursos para tirarmos o mximo de
proveito do montador.

O nome Montador ou Assembler usado para designar o programa que gera cdigos
para o processador associado e, como exemplo, cita-se um montador para o PC gerando
cdigos para o processador 80x86. Quando usado o montador, montando cdigos para
um outro processador, ele denominado de Montador Cruzado ou Cross-Assembler.

Existem diversos montadores 8051 disponveis no mercado, cada um oferecendo


diferentes recursos. Como nossa inteno trabalhar com sistema de baixo custo, os
autores buscaram por um montador que pudesse ser obtido gratuitamente na Internet e
que fosse disseminado pela comunidade de programadores 8051. Nossa seleo apontou
para o ASM51 da Metalink Corporation (http://www.metaice.com). Entramos em contato
com a empresa questionando sobre o uso do montador e, como pode ser constatado pela
resposta do Sr. Martin Pawloski, fomos autorizados a us-lo desde que ficasse claro que
um produto Metalink e que no fosse vendido separadamente. possvel fazer o
download do montador e de seu manual no endereo
http://www.metaice.com/ASM51/ASM51.htm. Assim, vamos nos concentrar nesse
montador. Isso no uma grande restrio, pois os montadores possuem muita coisa em
comum e tudo que for estudado neste captulo provavelmente servir para outros
montadores.

No nosso objetivo fazer um estudo profundo e detalhado deste montador. Chegaremos a um nvel
que permitir montarmos a grande maioria de nossos programas. Entretanto, recomendvel uma
leitura completa do manual do montador, pois permitir a explorao plena de seus recursos.
5.1. Escrevendo Programas para ASM51.

Os programas, para serem montados pelo ASM51, devem ser escritos com um editor
ASCII, como o Bloco de Notas (Notepad) ou o editor Edit.exe dos DOS, ou ainda o editor
JFE, conseguido gratuitamente no endereo
http://home.arcor.de/jensaltmann/JFE/jfe_eng.htm Este ltimo um editor ASCII simples e
muito verstil escrito por Jens Altmann. Tambm servem os editores que acompanham
pacotes de linguagem C ou Pascal. No podem ser usados editores do tipo Word,
Wordperfect, etc..

Escrever um programa em assembly simplesmente reunir em um arquivo a lista de


instrues que se deseja empregar, alm de algumas orientaes e parmetros para o
montador, como por exemplo, o endereo a partir de onde o programa ser carregado. A
listagem a seguir apresenta o programa escrito para o exerccio resolvido 4.17, que faz a
zeragem da RAM interna. Note que introduzimos algumas linhas extras. O arquivo final foi
denominado ZERAR.ASM. Emprega-se a extenso .ASM para programas a serem
montados.

A linha $MOD51 uma diretiva para o montador, indicando que desejamos usar os smbolos definidos
para a famlia 8051. Isto poupa ao programador a tarefa de definir cada registrador que ele usar. Em
outras palavras, essa definio cria o smbolo B com o valor 0F0H, que o endereo do registrador
B, Acc com o valor 0E0H e assim por diante. Cada membro da famlia 8051 usa um conjunto maior
ou menor de registradores. Por isso, importante a definio do C que est sendo usado.

A linha $NOPRINT indica ao montador que no se deseja gerar um arquivo de listagem (arquivo para
impresso). Esse montador foi preparado para gerar, alm do arquivo montado, todas a mensagens
num arquivo de listagem. Entretanto, da forma como desejamos empregar esse montador,
interessante que as mensagens saiam na tela do computador. Assim, quando especificamos que no
estamos usando impressora, o montador indica na tela os avisos e os erros encontrados.

A linha ORG 100H uma diretiva para o montador indicando que o programa deve ser preparado
para ser carregado a partir do endereo 100H. Esse smbolo a representao da palavra origem,
ou origin em ingls.

A linha END indica ao montador que o arquivo a ser montado termina com esta linha. Tudo que
estiver aps essa diretiva ser ignorado.

Para invocar o programa montador necessrio usar uma janela DOS. A linha de comando tem a
seguinte forma:

ASM51 ZERAR.ASM

Com esse comando, o montador gera o arquivo ZERAR.HEX, que contm os opcodes referentes s
instrues especificadas em ZERAR.ASM. Esse montador gera a sada no formato INTEL.HEX, que
uma forma padronizada de se indicarem os bytes e os endereos onde eles devam ser carregados.
Esse o arquivo que se usa para carregar o programa na memria ou para gravar em EPROM ou
EEPROM.

Caso no seja usada linha $NOPRINT, o montador vai gerar o arquivo de impresso que est
apresentado a seguir. Pode ser observado o endereo e o opcode de cada instruo e, ao final, existe
uma tabela com os rtulos usados e seus valores.
5.2. Convenes para o ASM51.

Cada montador emprega uma srie de regras para criar smbolos, rtulos e requer
convenes para o uso de controles, de diretivas e de endereamento. Tudo isso existe
para facilitar o trabalho do programador. Nesta seo, fazemos uma breve abordagem de
alguns desses itens, sem a pretenso de substituir o manual do montador, cujo estudo e
leitura so recomendados.

Esse montador trabalha com duas passagens. Conforme j estudamos, na primeira


passagem ele gera uma tabela com os valores de todos os smbolos usados no programa.
Durante a segunda passagem, ele efetivamente traduz as instrues em cdigo de
mquina. claro que durante a segunda passagem que a listagem gerada.

Para facilitar a leitura e o entendimento dos programas, faz-se uso de smbolos. Os smbolos so
seqncias de letras e nmeros (caracteres) usadas para representar endereos, constantes, etc.. So
vlidas todas as letras (A, ..., Z, a, ..., z), os dgitos numricos (0,..., 9), o ? e o _. Esse
montador, antes de iniciar a montagem, converte todas as letras para maisculas. Por isso, ele no faz
distino entre letras maisculas e minsculas. Os smbolos devem comear com uma letra, o que
evita a confuso com nmeros. Cada smbolo s pode ser definido uma nica vez e seu comprimento
pode chegar a at 255 caracteres. Entretanto, apenas os primeiros 32 caracteres so usados para
distinguir os smbolos. claro que no podem ser usados como smbolos seqncias idnticas s das
instrues do 8051. Por exemplo, o smbolo MOV no permitido. O manual oferece uma lista
completa dos smbolos reservados. A seguir, esto apresentados alguns exemplos de smbolos.
junho, Rotina_Serial, Chegou_byte_?, Programa_1, Programa_2.

Os exemplos a seguir apresentam smbolos com algum erro:


7_verso (no pode iniciar com dgito numrico)
R7 (smbolo reservado)
Rotina_#1 (no pode conter #)

Os rtulos so usados para identificar endereos aos quais o programador quer fazer referncia.
Vimos, nos exerccios resolvidos do captulo anterior, diversos exemplos de uso de rtulos. Por isso,
os rtulos s podem ser usados com instrues ou pseudo-instrues que estejam associadas com
endereos. Os rtulos seguem a mesma regra de criao de smbolos, mas devem obrigatoriamente
terminar com dois pontos :.

Esses controles servem para dar orientao ao montador sobre onde buscar os arquivos de entrada,
onde armazenar os arquivos de sada e ainda sobre o formato a ser usado na listagem. Segue uma
lista dos controles mais interessantes. A lista completa e maiores detalhes sobre esses controles
devem ser buscados no manual. Note que os controles obrigatoriamente iniciam com o smbolo $ e
no se permitem espaos entre o $ e o incio da palavra. Somente admitido um controle por linha,
mas nessa linha pode haver um comentrio.

As diretivas so usadas para definir constantes numricas, reservar espao em memria, armazenar
valores numricos em memria e indicar qual espao de memria se deseja empregar. A tabela a
seguir apresenta as diretivas mais empregadas. Uma lista completa est disponvel no manual do
montador. Mais adiante, nos exemplos, ficar mais claro o emprego dessas diretivas.
Quando se trabalha com bits, comum usar o ponto . para indic-los. Assim, para indicarmos que
estamos fazendo referncia ao bit mais significativo do registrador B, escrevemos B.7. Tambm
vlido seu uso com endereo de byte. Por exemplo, para nos referirmo-nos ao bit 6 do byte 22H,
usamos 22H.6. Tambm vlido, claro em decimal, 34.6. possvel usar tambm um smbolo aps
o ponto, por exemplo, se declaramos que PRONTO vale 6, podemos usar 22H.PRONTO no lugar de
22H.6.

Este montador permite o uso de expresses aritmticas onde diversos operadores so vlidos. Essa
expresso aritmtica calculada no momento da montagem e resulta numa constante numrica.
Durante o clculo, a preciso de 16 bits. A tabela a seguir apresenta os principais operadores. A
lista completa desses operadores deve ser buscada no manual do montador.
Comeamos esta seo pela representao de nmeros. Na declarao de um nmero, se nada for
especificado, ele ser sempre encarado como decimal. Entretanto, possvel especificar valores
numricos em binrio, octal, decimal e hexadecimal, desde que, ao final do nmero, se indique a
base:
Na representao de nmeros em octal, fcil confundir a letra O com o zero, por isso, existe a
opo de empregar-se a letra Q. O nmero hexadecimal deve, obrigatoriamente, iniciar com um
caracter numrico. Por exemplo, 5B7H inicia com um caracter numrico (o nmero 5). J o
nmero A73H inicia com a letra A. Nesse caso, deve-se colocar um zero no incio do nmero, que
fica 0A73H. Isso evita que o nmero hexadecimal seja confundido com um smbolo.

As letras ou cadeias de letras podem ser declaradas com o uso de apstrofe simples (). Para fazer
referncia apstrofe, usam-se duas apstrofes seguidas. Exemplo, a instruo MOV A,#m coloca
no acumulador o caracter ASCII correspondente letra m, que o nmero 6DH.

O comentrio, como j estamos acostumados, indicado por um ponto e vrgula. Ele pode aparecer
em qualquer lugar do programa. Tudo que estiver na linha, depois do ponto e vrgula at o final da
linha, ignorado. Por isso, o comentrio deve ser o ltimo campo presente na linha.

O 8051 oferece trs tipos de desvios, SJMP, AJMP e LJMP, que devem ser selecionados de acordo
com a posio do rtulo de destino. Esse montador permite usar o smbolo JMP, que no uma
instruo 8051, mas, durante a montagem, o montador escolhe o salto que resulta no menor emprego
de bytes. Entretanto, esta flexibilidade s vlida para desvios para trs, pois os destinos de tais
saltos j esto presentes na tabela de smbolos. Para os saltos adiante, o montador sempre usa LJMP
em substituio ao JMP. O mesmo acontece com CALL usado, no lugar de ACALL e LCALL.
5.3. Uso do Montador ASM51.

Para trabalharmos em assembly, costume criar um diretrio e a colocar o programa


ASM51.EXE, o arquivo MOD51 e os arquivos de programa a serem montados. Abrimos
ento uma janela DOS e a posicionamos no diretrio recm-criado. Como o montador
ASM51 um programa DOS, seu uso atravs de linha de comando. A forma mais
simples de invoc-lo com o comando ASM51. Feito isso, ele imprime informaes de
copyright e pede o nome do arquivo fonte (source file). Devemos agora digitar o nome do
arquivo com o programa a ser montado. Se no for especificada qualquer extenso, o
montador ir supor que a extenso .ASM. Desde que forneamos o caminho completo,
possvel montarmos arquivos em outros diretrios. Na invocao do montador, possvel
j fornecer o nome do arquivo a ser montado. Isso torna o uso mais simples. Exemplo:

ASM51 ZERAR.ASM

Aps a especificao do arquivo com o programa assembly, o montador inicia seu trabalho
imprimindo a mensagem First pass e em seguida Second pass. Aps isso, ele termina a
montagem e exibe a mensagem final e a quantidade de erros, se for o caso.
5.4. O Processador de Macros.

Em programao, comum encontrarmos trechos de programa que se repetem. Nestes


casos, para evitar a tediosa repetio de instrues e o desperdcio de memria, usamos
as subrotinas, com as instrues CALL. Entretanto, as subrotinas demandam tempo para a
chamada e retorno, alm de consumirem rea da pilha. Algumas vezes, o trecho de
programa que se repete muito curto, de duas ou trs instrues, o que talvez no
justifique o uso de uma subrotina. Para estes casos, existem as macros. Usando a
definio da macro, o programador indica a seqncia de instrues a ser repetida.
Depois, basta substituir os trechos repetidos pelo nome da macro.

Toda macro, antes de ser usada, precisa de ser definida. Nesta definio, especificam-se
trs partes:

cabealho, que define o nome da macro e sua lista de



parmetros;
corpo, com a parte repetitiva do programa e
terminador, que indica o fim da macro.

As definies de macros no podem ser aninhadas, entretanto, uma macro j definida


pode ser usada na definio de outra macro. Nesse caso, pode-se chegar at nove nveis.
O montador, toda vez que encontrar o nome da macro, substitui-a pelo seu corpo. Um
exemplo facilita a compreenso. J vimos que no existem instrues para fazer
transferncia entre registradores, como MOV R3,R2 e tampouco troca entre dois
registradores, como XCH R2,R3. Escrevendo uma macro, criamos essa instruo:

Toda vez que o montador encontra a macro XCH_R2_R3, ele a substitui pelas trs instrues que
compem o corpo da macro. Essa substituio recebe o nome de expanso da macro. Como pode ser
notado, a macro recm criada permite a troca apenas de R2 e R3. Seria interessante criarmos uma
macro mais flexvel, que permitisse a troca entre dois registadores quaisquer. Nessa caso, faremos o
uso de parmetros na definio da macro.

Agora, o nome da macro precisa de ser seguido por dois parmetros, por exemplo, XCH_Regs
R7,R6. O montador encarrega-se de substituir o nome da macro pelo seu corpo, trocando ainda RX
por R7 e RY por R6. Os smbolos usados na lista de parmetros so usados apenas pela macro, ou
seja, eles no precisam de ser nicos em todo o programa. O montador empregado ainda oferece uma
srie de outros recursos para criao de macros e interessante que o leitor consulte o manual.
5.5. Formato INTEL.HEX.

Todo montador deve fornecer ao final um arquivo absoluto. Por arquivo absoluto entende-
se uma lista com os endereos e os cdigos das instrues que estavam no arquivo fonte.
Existem diversas formas de se arrumarem os dados de um arquivo absoluto. A forma mais
simples a usada nos chamados arquivos binrios. Tais arquivos simplesmente trazem
uma lista seqencial dos cdigos das instrues. como se fosse uma fotografia da
memria. Um outro formato, um pouco mais elaborado, e que usado ao longo deste livro
o chamado INTEL.HEX, que est apresentado na figura 5.2.

Uma grande vantagem do formato INTEL.HEX que ele emprega exclusivamente


caracteres ASCII, ou seja, pode ser exibido ou impresso sem problemas, o que j no
possvel com um arquivo binrio. Ele est organizado em uma srie de registros, que
sempre iniciam com o caracter :. Dentro dos registros, cada cdigo (cada byte)
representado em hexadecimal, usando para isso dois caracteres ASCII. Como pode ser
notado na figura 5.2, existem dois tipos de registros.

O Registro de Dados, caracterizado pelo campo Tipo = 00, usado para especificar os
cdigos (bytes) que sero armazenados na memria. O campo Contador indica quantos
bytes esto presentes no campo de Dados. Por exemplo, se no campo de dados existem
5 bytes, ento o valor do Contador ser feito igual a 5. Note que, para representar esses 5
bytes, so necessrios 10 caracteres ASCII. O campo Endereo indica o endereo inicial a
partir do qual os bytes deste registro sero armazenados na memria. O campo Dados
traz os dados que sero armazenados a partir do endereo inicial. O campo Check-sum,
que seria traduzido como soma de verificao, nada mais que o complemento dois da
soma em 8 bits de todos os dados que compem o registro instrues, junto com o campo
de endereo e o tipo do registro. Deve ser ressaltado que, nesta soma, se usa o valor dos
bytes de dados e no seus caracteres ASCII. Alm disso, a soma limitada em 8 bits, ou
seja, o que ultrapassa a 8 bits ignorado. Para verificar se h erros no registro, basta
calcular o check-sum dos registros recebidos e adicion-lo ao valor do check-sum indicado
no registro. O registro ser considerado confivel se essa soma resultar em zero. Os dois
caracteres finais, CR (Carriage Return) e LF (Line Feed) servem para retorno do carro de
impresso e alimentao de uma nova linha.
O Registro de Final, caracterizado pelo campo Tipo = 01, usado para indicar o final do arquivo de
dados. O campo Contador deve ser igual a zero. O campo Endereo Incio indica o endereo inicial
para execuo do programa. Para muitas aplicaes, esse campo no tem uso e pode ser ignorado.
Agora o campo Check-Sum calculado apenas com o campo de endereo e o tipo do registro. Em
muitas aplicaes, esse registro interpretado como fim do arquivo. Existem outros tipos de
registros, mas que so pouco empregados. O exemplo a seguir traz o arquivo resultante da montagem
do programa ZERAR.ASM, que nesse caso recebeu no nome ZERAR.HEX.

Foram inseridos espaos para facilitar a identificao dos campos. No primeiro registro, o campo
Tipo igual a 00 indica que esse um Registro de Dados. O campo Contador especifica que existem 7
bytes para serem armazenados: E4 78 7F F6 D8 FD 22. Compare esses valores com o arquivo de
listagem deste programa apresentado algumas pginas atrs. O campo Endereo informa que a
armazenagem de comear a partir do endereo 100H. Finalmente o campo Check-Sum traz para
verificao o byte 30H. Segue logo abaixo a soma de verificao desse registro. O registro seguinte,
o que possui tipo igual a 01, indica fim do arquivo e sua soma de verificao tambm est
apresentada a seguir.

07 + 01 + 00 + 00 + E4H + 78H + 7FH + F6H + D8H + FDH + 22H + 30 = 00 (OK !)

00 + 00 + 01 + FFH = 00 (OK !)
5.6. Exerccos.

5-1) Usando o programa montador ASM51, confira a soluo dos exerccios 4-31, 4-32, 4-
33 e 4-34.

5-2) Transforme a macro XCH_Regs em uma subrotina. Compare as duas solues (macro
e subrotina) levantando a quantidade de bytes, espao em pilha e tempo em ciclos de
mquina.

5-3) Escreva uma macro, denominada Dobro_Reg que multiplique por 2 o contedo de um
registrador usando uma operao de soma.

5-4) Discuta se necessrio que toda a macro salve o contexto antes usar os recursos.

5-5) Crie uma macro que simule a instruo PUSH Rn. importante preservar o contedo
dos demais registradores do 8051, especialmente o do acumulador.
6. Portas Paralelas

Com este captulo, iniciamos o estudo dos recursos internos comuns a todos membros da
famlia 8051. Estudaremos as portas paralelas, os contadores e temporizadores, as
interrupes e a porta serial. Terminado o estudo desses recursos, j no Captulo 10,
iniciaremos o estudo do projeto de sistemas com microcontroladores e concluiremos, no
captulo 12, com a apresentao detalhada de um sistema microcontrolado.

Um recurso muito til, disponvel na grande maioria dos microcontroladores, o conjunto


de portas paralelas. Com essas portas, possvel gerar sadas ou receber e monitorar
informaes sob a forma digital. Assim, fica fcil criar interfaces para acionamento de
motores, sensores de velocidade, fazer a comunicao com equipamentos digitais e muitas
outras solues. O interessante das portas paralelas da famlia 8051 que elas podem
ser configuradas para trabalhar como entrada ou como sada e, alm disso, cada bit pode
ser acessado individualmente. Como ser visto mais adiante, essas portas no so
verdadeiramente bidirecionais, mas trabalham de uma forma denominada quasi-
bidirecionais.

Iniciamos o captulo com o estudo individual de cada uma das quatro portas disponveis na
famlia 8051: P0, P1, P2 e P3. Para possibilitar o pleno entendimento, esse estudo feito
com o detalhamento eletrnico, mas sem tornar o assunto extremamente tcnico. So
abordados os principais pontos sobre o emprego dessas portas para a leitura e para a
escrita e o que acontece quando o microcontrolador as emprega na gerao sinais de
endereos, dados e controle. Terminamos o captulo com o exemplo de um mostrador de 7
6.1. As Portas Paralelas da Famlia 8051.

No 8051, esto disponveis quatro portas paralelas, denominadas portas P0, P1, P2 e P3.
Cada bit dessas portas corresponde a um pino do microcontrolador. Cada porta est
mapeada em um registrador da rea SFR, de mesmo nome. Uma escrita nesse registrador
altera a porta correspondente. Como esses registradores esto em uma rea acessvel
bit-a-bit, ao alterar os bits desses registradores, altera-se o estado dos pinos do C. Para
ler a porta, basta ler o registrador.

De acordo com a configurao do projeto, uma ou mais portas so usadas completamente


ou parcialmente. As portas da famlia 8051 so usadas para:

barramento de dados (D0, ...,D7) e parte baixa do barramento de endereos (A0,


P0
...,A7);
P2 parte alta do barramento de endereos (A8, ...,A15);
P3 Sinais de controle e de comunicao
P3.0 RXD, entrada serial;
P3.1 TXD, sada serial;
P3.2 #INT0, entrada para interrupo externa 0;
P3.3 #INT1, entrada para interrupo externa 1;
P3.4 T0, entrada para o contador 0;
P3.5 T1, entrada para o contador 1;
P3.6 #WR, pulso que sinaliza uma escrita na memria de dados;
P3.7 #RD, pulso que sinaliza uma leitura na memria de dados;
P3 Sinais de controle e de comunicao
P1 porta paralela livre.

Ao examinarmos a lista acima, notamos que somente a porta P1 est completamente livre,
j que as demais so aproveitadas para viabilizar barramentos e recursos do
microcontrolador. claro que os bits das portas ficam disponveis quando os
correspondentes recursos no so necessrios. Por exemplo, se os contadores 0 e 1 no
forem empregados, os pinos P3.4 e P3.5 estaro disponveis e podero ser utilizados para
outra finalidade qualquer. Na eventualidade de no se fazer uso de memria de dados
externa, os pinos P3.6 e P3.7 podero ser destinados a outra finalidade. Numa situao
mais extrema, caso se empregue uma verso do C com ROM ou memria flash interna e
que no se faa uso da memria de dados externa, no h necessidade de barramentos
de dados e de endereos. Assim, as portas P0 e P2 estaro completamente disponveis.
Cabe portanto ao projetista decidir sobre os recursos que sero usados e as portas
paralelas que se fazem necessrias ao seu projeto.

A regra para se empregar essas portas paralelas como entrada ou sada muito simples:

Sada: Elas esto sempre prontas para serem empregadas como sada. Para colocar um
determinado pino da porta paralela em 0 ou 1, basta alterar o correspondente bit no
registrador. O nvel lgico surge no pino do microcontrolador. claro que, ao se escrever
num desses registradores, alteram-se simultaneamente os 8 bits da porta paralela.

Entrada: qualquer bit das portas colocado no modo entrada ao se escrever 1 nesse bit.
Aps isso, qualquer circuito externo pode puxar o nvel lgico desse pino para 0 ou deix-
lo em 1. Ao se escrever o nmero FFH no registrador de uma porta, programam-se todos
os seus bits como entrada. Em suma, ao colocar um bit da porta paralela em 1, programa-
se esse bit como entrada. O nome quasi-bidirecional vem do fato de se necessitar
colocar o bit em 1 para program-lo como entrada.

Cada bit das portas paralelas possui os seguintes recursos bsicos: um latch, que
armazena o estado do bit, um driver, para gerar sua sada, e um buffer, para permitir a
leitura. Tudo isso ficar mais claro quando estudarmos a arquitetura interna das portas.
Veremos tambm que existem particularidades para cada porta.
6.2. A Porta P1.

Como a porta P1 no atende a qualquer recurso extra, ela de fcil entendimento. A figura
6.1 traz o esquema eltrico para um bit desta porta. Esse esquema o mesmo para todos
os oitos bits que compe a porta P1. O latch i representa um dos oito bits do registrador
P1. Deve ser notado que existe um sinal escrever-latch, controlado pelo C, que serve
para atualizar o latch com o dado Di enviado atravs do barramento interno. A sada
invertida do latch () aciona a porta G (gate) de um transistor de efeito de campo (FET).

Esse transistor trabalha como uma chave digital que liga (transformada num curto) quando
G = 1. Quando ligado, diz-se que o transistor est saturado. Quando desligado, diz-se que
o transistor est cortado. Assim, quando se escreve 0 no latch, faz-se Q = 0 e, em
conseqncia, = G = 1, o que leva o transistor para a saturao (curto para o terra). Nela,
o pino do C fica em nvel baixo. J o contrrio, quando se escreve 1 no latch, faz-se = G
= 0. Com isso, o transistor fica cortado, mas, graas ao resistor de pull-up, o pino do
processador levado para nvel alto. Tudo isso acontece automaticamente em hardware,
pois a nica atuao do programador escrever 0 ou 1 no latch. Esta operao feita
facilmente com as instrues de SETB P1.i e CLR P1.i. Em resumo, quando se escreve no
bit:

J a leitura pede um pouco mais de ateno pois, como pode ser observado pela figura, existe a
possibilidade de ler-se o pino e de receber o contedo do latch. A maioria das instrues de
leitura recebe a informao a partir do pino, porm, umas poucas trabalham com o contedo do
latch. Mais adiante, detalharemos essas instrues.

Como j vimos, quando se escreve 0 num bit da porta, o transistor correspondente satura e coloca
em nvel baixo o pino do C. Note que o transistor funciona como um curto para o terra e que no h
meio de alterar, externamente, esse nvel lgico. Porm, tudo se passa de forma diferente quando se
coloca um determinado bit da porta em 1. Nesse caso, o transistor est cortado e o nvel alto
garantido pelo resistor de pull-up interno. Nessa situao, possvel conectar um sinal digital ao
pino correspondente, como mostrado na figura 6.2.

O interessante que, como o nvel alto garantido apenas pelo resistor de pull-up, ele pode ser
facilmente alterado por um dispositivo digital. Na figura 6.2, foi usada uma porta E para representar
um dispositivo digital cuja informao precisa de ser lida pelo C. Caso a sada dessa porta E esteja
em 1, o nvel lgico do pino no ser alterado e a leitura do pino vai resultar em 1. Caso a sada
da porta E esteja em 0, ela vai fornecer um curto para o terra, levando assim o pino para nvel
baixo. Nesse caso, a leitura do pino vai resultar em 0. Assim, apesar de ter sido programado 1
no pino, esse nvel pode ser puxado para 0. Vem da o nome quasi-bidirecional, pois cada bit
da porta precisa de estar em 1 para poder trabalhar como entrada. Uma porta bidirecional
verdadeira, se programada para entrada, no oferece qualquer nvel lgico.

A figura 6.3 apresenta um pouco mais de detalhe para o caso de um bit da porta ser programada
como entrada. Quando o dispositivo digital que aciona esse pino estiver em 1, praticamente no
haver fluxo de corrente. Entretanto, caso o dispositivo digital esteja em 0, como o caso da figura
6.3, o pino do processador fornecer corrente ao dispositivo. No caso da figura 6.3, est
representada uma sada TTL que, quando est em nvel baixo, tem o seu transistor T1 cortado e o seu
transistor T2 saturado, o qual fornece um caminho da baixa impedncia para o terra.
6.3. A Porta P3.

Aps o estudo da porta P1, fica mais fcil entendermos as demais portas. A porta P3,
como j vimos, atende a diversas funes, denominadas funes alternativas, abreviadas
pela sigla AOF (Alternate Output Function). Elas so: RXD, TXD, #INT0, #INT1, T0, T1,
#WR e #RD. Por isso, essa porta compartilhada, na sua totalidade ou parcialmente, ora
como porta paralela, ora como sada ou entrada de algumas dessas funes alternativas.
O esquema eltrico de um bit da porta P3 est apresentado na figura 6.4.

Note que o esquema para leitura da porta P3 idntico ao da porta P1, porm existem diferenas na
gerao da sada. Suponha de incio AOF = 1. Assim, ao se escrever 1 no latch, a sada Q vai para
1, a sada da porta NO-E vai para 0 e, em conseqncia, o transistor corta, levando o pino para 1
(graas ao resistor de pull-up ). Ao escrever 0, a sada Q vai para 0 e, a sada da porta No-E, ser
1, o que leva o transistor saturao, resultando ento nvel baixo no pino. A lista a seguir apresenta
o resumo, considerando AOF = 1:

Verificamos agora como o C, atravs do sinal AOF, consegue mudar o nvel lgico do pino.
Suponha que o latch esteja em 1 (Q = 1). Neste caso, o C altera o valor do pino em funo do
sinal AOF. Se AOF = 0, ento a sada da porta NO-E vai para 1, o que satura o transistor,
resultando nvel 0 no pino. Se AOF = 1, ento a sada da NO-E vai para 0, o que corta o transistor.
Com isso, graas ao pull-up, o pino vai para nvel alto. importante deixar claro que AOF
representa uma das quatro sadas geradas atravs da porta P3: RXD, TXD, #RD e #WR. Um fato
interessante acontece caso o latch seja colocado em zero (Q = 0). Nesse caso, a sada da porta
NO-E ser sempre 1, independente do sinal AOF. Nessa situao, transistor est saturado, gerando
um nvel baixo no pino. Note ento que o pino ficou preso em 0. Assim, para usar algumas das
funes atravs da porta P3, importante colocar o pino correspondente em 1.
6.4. A Porta P2.

A porta P2 compartilhada para gerar os bits de endereo mais significativos (A8, ...,
A15). O projeto do 8051 foi feito para que o C consiga gerar os endereos, independente
do que o usurio programe nessa porta. Por isso, ela precisa de ser diferente da porta P3,
onde o usurio pode prender um pino em 0. O projeto da porta P2 faz uso de um
multiplexador, o que garante a gerao das linhas de endereo mais significativas. A figura
6.5 apresenta o esquema eltrico de um bit da porta P2.

Note que, para a leitura, o esquema apresentado idntico aos anteriores. J na escrita, existem
alteraes. A parte central o multiplexador 2 para 1, que possui as entradas I0 e I1 e a sada
O. Com CTRL = 0, o multiplexador d sada entrada I0 e, quando CTRL = 1, dada sada
entrada I1.

Na situao em que o controle do multiplexador esteja em 0, quando se escreve 0 no latch, tem-


se Q = 0. Esse nvel surge na sada do multiplexador, que, aps passar pelo inversor, faz G = 1,
forando a saturao do transistor e levando o pino correspondente para zero. Quando se escreve
1, tem-se Q = 1 que, aps o multiplexador e o inversor, faz G = 0, o que corta o transistor e assim,
graas ao pull-up, faz o pino ir para nvel alto. Seguem os dois casos, considerando CTRL = 0:
Contudo, o C emite os endereos pelos pinos da porta P2, sem que o nvel programado pelo usurio
venha a interferir. Quando isto necessrio, o C faz CTRL = 1, saindo pelo multiplexador um bit de
endereo, ou seja, qualquer um dos bits da faixa de A8 at A15. No caso da figura, representou-se o
bit de endereo por Ai. Se Ai = 0, surge nvel baixo na sada do multiplexador e, aps o inversor,
feito G = 1, o que satura o transistor e gera um nvel baixo na sada. Por outro lado, se Ai = 1, esse
nvel alto surge na sada do multiplexador e, aps o inversor, tem-se G = 0, o que corta o transistor,
levando o pino para nvel alto graas ao resistor de pull-up. Assim, independente do que o usurio
programou nos bits da porta P2, o C sempre capaz de enviar por essa porta os bits de endereo de
A8 at A15. Seguem os dois casos, considerando CTRL = 1:
6.5. A Porta P0.

O controle da porta P0 ainda mais sofisticado, pois por ela so emitidos os endereos
menos significativos (A0, ..., A7). Tambm por ela trafegam os dados quando se efetuam
operaes com memrias externas. importante comentarmos que, nas operaes de
leitura de memria externa, essa porta precisa de entrar em alta impedncia. A figura 6.6
apresenta o esquema para o bit i da porta P0.

Devemos notar que a leitura permanece inalterada, mas h grandes alteraes quando se escreve na
porta P0, pois agora existem dois transistores. Inicialmente, suponha CTRL = 0. Nesse caso, graas
porta E, tem-se G1 = 0, o que leva o transistor Q1 para o corte. Note que no h mais o resistor de
pull-up. Quando se escreve 0 em um bit da porta P0, tem-se Q = 0, = 1 e, aps o multiplexador, G2 =
1, saturando o transistor Q2 e levando o pino para nvel baixo. Por outro lado, quando se escreve 1
no latch, tem-se Q = 1, = 0 e, aps o multiplexador, G2 = 0, cortando o transistor Q2. Como nesse
caso no existe resistor de pull-up, o pino entra em alta impedncia. Segue um resumo, supondo
CTRL = 0:
Entretanto, quando CTRL = 1, o transistor Q1 poder saturar, funcionando ento como pull-up e
assim o C ter condies de emitir endereos ou dados pelo barramento. Caso seja necessrio
emitir um bit de endereo ou um bit de dado igual a zero, a porta E ter nvel baixo na sua sada e,
em conseqncia, o transistor Q1 estar cortado. Por outro lado, esse bit aps o inversor e o
multiplexador faro G2 = 1, o que satura o transistor Q2, colocando o pino correspondente em nvel
baixo. Caso o bit de endereo ou dado seja igual a 1, a porta E ter nvel alto na sua sada, fazendo
G1 =1, o que satura Q1, levando-o a operar como pull-up. Por outro lado, o bit 1, aps passar pelo
inversor e multiplexador, faz G2 = 0, o que corta o transistor Q1. Assim, o pino vai para nvel alto
graas ao pull-up formado pelo transistor Q1. A lista a seguir apresenta tais detalhes, considerando
CTRL = 1:

Note que nunca os dois transistores estaro ligados, pois nesse caso haveria um curto. Essa
sofisticao da porta P0 existe porque, para se ler a memria, necessrio um barramento
bidirecional verdadeiro, ou seja, preciso um barramento que entre em alta impedncia quando
programado para leitura. Note que isso possvel quando CTRL = 0 e se escreve 1 no latch.
Assim, quando o C vai ler a memria, ele fora os latches de P0 para 1 e, com isso, toda a porta
P0 entra em alta impedncia, o que permite a leitura do dado enviado pela memria. Aps a leitura, o
contedo original dos latches de P0 restaurado. claro que o C faz a leitura atravs da
habilitao do sinal LER-PINO.

Nos casos onde se emprega exclusivamente a memria interna, as portas P0 e P2 esto


completamente livres. Entretanto, deve ser lembrado que a porta P0, quando operando com porta
paralela comum, no possui o resistor de pull-up. Desta forma, ela entra em alta impedncia quando
programada em 1. Para conseguir que ela opere como as demais portas, necessrio a adio de
resistores de pull-up externos. Uma boa sugesto so resistores na faixa de 4,7 k a 10 k.
6.6. Escrita nas Portas.

Podemos verificar que, em todas as portas estudadas, existe um resistor de pull-up, mas,
na realidade, esse resistor construdo com um transistor FET no modo depleo, com o
pino G (porta) conectado ao pino S (fonte), vide figura 6.7-(a). feito assim porque os
transistores FET so mais fceis de serem integrados que os resistores. Por esse pull-up,
passa uma corrente de 0,25 mA quando o pino do microcontrolador for conectado ao terra.

importante estudarmos o comportamento da porta paralela nas transies de 1 para


0 e de 0 para 1. A transio de nvel alto (1) para nvel baixo (0) eficiente porque ela
feita com um transistor que, ao ser saturado, oferece um caminho de baixa impedncia
para o terra. Entretanto, a transio de nvel baixo (0) para alto (1) mais complicada,
pois o pull-up oferece apenas 0,25 mA, o que resulta numa transio muito lenta. Por outro
lado, a alternativa bvia, que a de diminuir o valor do resistor de pull-up, resulta num
grande desperdcio de corrente.

A soluo encontrada o emprego de um FET denominado enhanced, capaz de fornecer


30 mA, como mostrado na figura 6.7-(b), mas que ligado apenas por um breve perodo
de tempo, exatamente no momento em que feita uma transio de nvel baixo (0) para
nvel alto (1). Note que o FET enhanced assinalado com a letra E. Assim, ele fornece
uma grande quantidade de corrente, acelerando a transio, mas apenas por um breve
perodo de tempo, o que no onera o consumo do processador. Esse FET enhanced no
colocado na porta P0.
Precisamos agora de fazer referncia a alguns instantes de tempo que esto definidos no captulo 10,
seo 10.4 e figura 10.12. Uma breve consulta j suficiente para entender o que ser apresentado a
seguir. Na execuo de qualquer instruo que altere o latch de uma porta, o novo valor escrito no
latch durante o perodo E6F2, que corresponde ao final do ciclo de instruo. Entretanto, os valores
dos latches so enviados para os buffers de sada durante a fase F2 de todo perodo de relgio, ou
seja, durante a fase F1 mantido o valor antigo. O novo valor s aparecer no pino do C durante a
fase F1 do prximo ciclo de instruo (E1F1). Quando se faz necessria uma mudana de 0 para 1
nas portas P1, P2 e P3, o pull-up dever entregar bastante corrente ao pino, para que essa transio
seja rpida. Assim, durante E1F1 e E1F2, colocado em atividade o pull-up adicional construdo
com o FET enhanced, capaz de fornecer at 100 vezes mais corrente que o pull-up normal. O
esquema est mostrado na figura 6.8.

Note que, se o latch esteve em 1 ou em 0 h muito tempo, a sada da porta NO-OU estar em 0,
mantendo cortado o FET enhanced. Entretanto, nas transies de 0 para 1, a sada desta porta ir
para 1 durante dois perodos do relgio, ligando assim o transistor de alta capacidade de corrente e
oferecendo uma rpida transio.

Considerando o 8051 padro, seus buffers de sada podem acionar at 4 cargas TTL/LS. Eles podem
ser acionados por circuitos TTL ou NMOS. Devido existncia do pull-up interno, essas portas
tambm podem ser acionadas por sadas a coletor-aberto. A porta P0 pode acionar at 8 cargas
TTL/LS quando opera no modo barramento (dados ou endereos), entretanto, ao operar como porta
paralela, como j vimos, necessita de um resistor de pull-up para levar suas sadas para nvel alto.
6.7. Leitura nas Portas.

Algumas instrues de leitura fazem uso do valor presente no pino, enquanto que outras
trabalham com o bit que est armazenado no latch da porta. As instrues que usam o
contedo do latch (ao invs do valor do pino) so aquelas do tipo l-modifica-escreve.
Essas instrues esto listadas a seguir:

Pode-se ter a impresso de que as trs ltimas instrues no se enquadram no tipo l-modifica-
escreve, entretanto, nessas instrues lido todo o byte da porta, o bit de interesse alterado e o
novo valor escrito de volta ao latch. As instrues do tipo l-modifica-escreve fazem isto porque,
algumas vezes, mesmo aps a escrita de 1 no latch, o pino correspondente continua com valor baixo.
Vamos analisar o caso do acionamento de um transistor atravs de um pino da porta paralela, como
mostrado na figura 6.9.

Pela figura, vemos que o led deve acender quando colocamos P1.0 em nvel alto. Entretanto, mesmo
tendo colocado o pino em nvel alto, seu potencial ser de 0,7 V, que corresponde tenso da juno
base-emissor do transistor, quando polarizada diretamente. Assim, a leitura do pino resulta sempre
em nvel baixo. Se as instrues usassem sempre o nvel lgico do pino, haveria problemas, por
exemplo, para fazer o led piscar atravs do uso da instruo CPL P1.0.
6.8. Detalhes Sobre o Emprego de Portas.

Dada a grande diversidade de fabricantes de membros da famlia 8051, ao empregarmos


as portas paralelas deste C para acionar outros dispositivos, preciso consultar o manual
do fabricante para conhecermos a especificao eltrica das portas, particularmente com
relao capacidade de fornecer e drenar corrente. Por exemplo, para acender um led
empregando a porta paralela, a primeira idia seria a apresentada na figura 6.10-(a).
Entretanto, para que o led acenda com intensidade razovel, necessrio uma corrente
acima de 12 mA. Considerando uma queda de tenso sobre o led de 2,2 V, chega-se a um
resistor perto de 220 . Com essa soluo, a porta drena uma corrente de 12 mA, que
fere a especificao do 8051 padro. Por isso, a melhor sada usar um driver TTL para
drenar toda essa corrente, como mostrado na figura 6.10-(b).

Um outro ponto que merece comentrio o emprego da porta paralela para monitorar o estado de
chaves. A maneira mais simples conectar a chave diretamente a um pino da porta paralela, como
mostrado na figura 6.11-(a). Quando a chave est aberta, o pull-up interno da porta garante o nvel
alto e, quando a chave fechada, ela faz um curto para o terra. Uma maneira mais cuidadosa de se
conectar a chave (especialmente um teclado) com um diodo e um resistor de pull-up externo, como
mostrado na figura 6.11-(b). O pull-up interno da porta paralela eqivale a um resistor de 20 k, o
que torna lenta a transio de nvel baixo para nvel alto. A adio de um resistor de pull-up externo
de valor de 1,2 k torna essa transio mais rpida, reduz os rebotes, mas leva a um maior consumo
de corrente maior (cerca de 20 vezes) quando a chave fechada. A presena do diodo para garantir
que a corrente sempre flua num nico sentido, ou seja, evita que rebotes da chave gerem uma tenso
elevada sobre o pino da porta paralela.
A figura 6.12 apresenta um esquema muito simples para se acionar um display de 7 segmentos com o
emprego da porta P1. Como essa porta no tem condies de drenar a corrente necessria foi usado
um 74LS244, que funciona como buffer. Note que, para acender um segmento do display,
necessrio colocar em nvel baixo o pino correspondente. Por exemplo, para mostrar o nmero 1
(acender segmentos a e b), necessrio colocar todos os pinos da porta P1 em nvel alto, com
exceo de P1.5 e P1.6, que devero ser colocados em nvel baixo. Escreva uma subrotina que
apenas exiba no display o nmero que foi entregue atravs do acumulador e mantenha o ponto
decimal (dp) apagado. Utilize a porta P1.

Soluo:
Esse exerccio interessante, pois faz uso de tabela em assembly. necessrio construir uma tabela
que relacione os nmeros de 0 a 9 com o cdigo a ser escrito na porta P1. Assim, a subrotina
resume-se a receber um nmero no acumulador, consultar a tabela e escrever o cdigo na porta P1. A
tabela est mostrada a seguir.

O programa extremamente simples, mas preciso tomar cuidado pois a tabela est definida na
memria de programa. Note que o endereo de incio dela foi colocado no DPTR, mas o endereo
acessado o corresponde soma do acumulador com o DPTR.
6.9. Exerccios.

Em muitos dos exerccios propostos a seguir, ser necessrio gerar intervalos de tempo.
Para tanto, supomos o emprego de um cristal de 12 MHz. At o presente momento, s foi
mostrado como gerar tais intervalos com o emprego de laos de programa. Devido ao
emprego de tais laos, algumas solues no ficaro muito elegantes e outras at
apresentaro algumas pequenas imprecises. No prximo captulo, sero apresentados os
contadores e temporizadores, que oferecem recursos interessantes para o controle de
intervalos de tempo.

6-1) Explique por que as portas P0, P2 e P3 so empregadas para diversas outras
funes. No seria melhor que elas fossem portas paralelas exclusivas?

6-2) Explique a diferena entre uma porta bidirecional verdadeira e uma porta quasi-
bidirecional. Qual delas oferece mais flexibilidade?

6-3) Considerando a porta P1 (figura 6.1), explique o que aconteceria se fossem


removidos seus resistores de pull-up internos.

6-4) Explique por que no possvel gerar as funes alternativas (AOF) pela porta P3
quando esta programada em zero.

6-5) Explique por que foi introduzido um multiplexador no projeto da porta P2. Esta porta
no poderia seguir o esquema da porta P3?

6-6) Explique por que a porta P0 no tem resistores de pull-up internos.

6-7) Explique por que se precisa colocar resistores de pull-up externos para empregar a
porta P0 como uma porta paralela comum. Que desvantagem advm do uso de resistores
de pull-up ( pull-up passivo)?

6-8) Usando o esquema da figura 6.6, mostre que os dois transistores da porta P0 nunca
ficam saturados ao mesmo tempo.

6-9) Explique a importncia do transistor FET enhanced empregado nas sadas das portas
paralelas. O que aconteceria se esse FET no estivesse presente?

6-10) A figura 6.13 apresenta o bit 0 da porta P1 acionando diversas cargas digitais TTL.
Para efeito deste exerccio, que estuda o transiente da porta, cada carga digital ser
modelada por um pequeno capacitor de 1 F, como mostrado na figura. O pull-up interno
feito com um FET em modo depleo ser modelado por um resistor de 20 k (5V / 0,25
mA), enquanto que o FET enhanced ser modelado por um resistor de 167 (5V / 30
mA). Considere ainda que, na transio de 0 para 1, a sada 1 efetivamente a partir do
momento em que o pino ultrapassa 2,2 V. Supondo que o processador esteja operando
com cristal de 12 MHz, responda os itens a seguir.

a) Considerando apenas o FET comum e uma nica carga TTL, quantos ciclos de mquina
so necessrios para a transio de 0 para 1?

b) Considerando apenas o FET comum e dez cargas TTL, quantos ciclos de mquina so
necessrios para a transio de 0 para 1?

c) Considerando a presena do FET enhanced e uma nica carga TTL, quantos ciclos de
mquina so necessrios para a transio de 0 para 1?

d) Considerando a presena do FET enhanced e dez cargas TTL, quantos ciclos de


mquina so necessrios para a transio de 0 para 1?

6-11) Esboce a forma-de-onda que a seguinte rotina gera pelo pino P1.0.
6-12) Esboce a forma-de-onda que a seguinte rotina gera pelo pino P1.0.

6-13) Esboce as formas-de-onda que a seguinte rotina gera pelos oito pinos da porta P1.

6-14) Escreva uma rotina que gere, pelo pino P1.0, a seguinte forma-de-onda (figura 6.14):

6-15) Escreva uma rotina que gere, pelos pinos P1.0 e P1.1, as seguintes formas-de-onda (figura
abaixo):

6-16) Escreva uma rotina que gere, pelo pino P1.0, a seguinte forma-de-onda (figura 6.16):
6-17) Escreva uma rotina que gere, pelos pinos P1.0 e P1.1, as seguintes formas-de-onda (figura
abaixo):

6-18) Com base na figura 6.18, escreva uma rotina que faa o led piscar na freqncia de 10 Hz.

6-19) Escreva uma rotina que, empregando os quatros leds da figura 6.19, gere um contador binrio
trabalhando na freqncia de 1 Hz, ou seja, um contador de segundos. O led menos significativo est
conectado ao pino P1.0.
6-20) O circuito da figura 6.20 apresenta uma soluo para acionar um display de 7 segmentos com o
emprego da porta P1. Escreva uma rotina faa o display contar na freqncia de 1 Hz. Use uma
tabela para simplificar os cdigos enviados para o display. Vide exerccio resolvido 6.1.

6-21) O circuito da figura 6.21 apresenta um display de 7 segmentos sendo acionado com o emprego
da porta P1, mas com a alimentao (A1 e A2) controlada pelo pino P3.4, atravs de um transistor.
Assim, atravs de P3.4, o display pode ser ligado ou desligado. Esses displays consomem muita
energia. Por exemplo, se for considerado que cada segmento consome 15 mA, ento, com o display
todo aceso, o consumo chega a 120 mA. Uma tcnica para economizar energia no deixar o display
aceso permanentemente, mas sim faz-lo piscar numa freqncia superior a 24 Hz, pois, acima dessa
freqncia, o olho humano no percebe variao luminosa ou cintilao. Escreva uma rotina que faa
o display contar na freqncia de 1 Hz e, ao mesmo tempo, que o ligue e o desligue na freqncia de
100 Hz.

6-22) A figura apresenta a chave CH conectada ao pino P1.0. Considerando essa chave ideal,
explique quais os nveis lgicos lidos no pino quando a chave est aberta e quando a chave est
fechada.

6-23) A figura apresenta uma chave CH e um led ligados porta P1. Considerando a chave ideal,
escreva um programa que mantenha o led aceso enquanto a chave estiver acionada.

6-24) A figura 6.24 apresenta um esquema que faz uso de uma chave e de um display de 7 segmentos.
Considerando a chave ideal, escreva um programa que mostre no display o nmero de vezes que a
chave foi acionada.

6-25) Resolva o exerccio 6-24, mas sem considerar que a chave seja ideal. Agora, quando a chave
acionada ou quando liberada, ela gera uma grande quantidade de rudo, chamado de rebote, ou
bounce. A questo que o C, por ser rpido, pode interpretar esses rebotes como mltiplos
acionamentos da chave. Uma soluo , aps cada acionamento, ignorar o estado da chave por um
certo perodo de tempo, maior que a durao do rebote. O problema saber quanto tempo dura o
rebote. Na verdade, a durao do rebote no fixa, j que ela varia com a chave, com a quantidade
de conexes e at com o desgaste da chave. O melhor determin-la empiricamente. Contudo, para
este exerccio, usa-se o valor de 1 ms.

6-26) O exerccio anterior prope a eliminao dos rebotes com uma subrotina que consuma 1 ms.
Entretanto, enquanto espera por esse perodo de tempo, o C est ocioso. Alm disso, com o
envelhecimento da chave, a durao dos rebotes pode variar. A seguir, so apresentadas duas
subrotinas que detectam o acionamento (FECHOU) e a liberao (ABRIU) da chave. Desenhe o
fluxograma dessas duas subrotinas. Explique seu funcionamento. Elas podem ajustar-se ao aumento
ou diminuio do tempo de rebote? Existe alguma desvantagem com o emprego dessas subrotinas?

6-27) Um teclado nada mais que a reunio de uma grande quantidade de chaves. Para economizar a
quantidade de portas, comum organizar o teclado sob a forma matricial. A figura a seguir apresenta
um teclado de 12 teclas conectado porta P1. Em cada cruzamento de fios, existe uma pequena chave
que, quando acionada, fecha contato entre eles. Assim, a tecla 1 est no cruzamento dos fios
ligados a P1.4 e P1.3. J a tecla 5 conseguida com o cruzamento de P1.5 com P1.2.
O princpio para leitura do teclado muito simples. Inicialmente, toda a porta P1 colocada em
nvel alto. Com P1.4 = 0, possvel verificar o estados das teclas 1, 4, 7, *. Por exemplo, se a tecla
7 estiver pressionada, ento apenas o pino P1.1 em nvel baixo. Em seguida feito P1.4 = 1 e P1.5 =
0, agora verifica-se o estado das teclas 2, 5, 8, 0. Assim por diante. Pelos pinos P1.4, P1.5 e P1.6
feita a varredura (scan) e o resultado lido por P1.0, P1.1, P1.2 e P1.3. O C, de tempos em tempos,
faz uma varredura do teclado para verificar se alguma tecla foi acionada.

A figura a seguir apresenta exemplos de varredura do teclado. Para saber que tecla foi acionada,
basta verificar onde surgiu o zero. Se no for lido qualquer valor zero, ento nenhuma tecla foi
acionada. Por outro lado, se forem lidos dois ou mais zeros, duas ou mais teclas esto acionadas.
Nesse caso, costume rejeitar a leitura. preciso tomar cuidado para no se detectarem mltiplas
vezes o acionamento de uma mesma tecla. Por isso, para que se aceite uma nova tecla, o teclado
precisa obrigatoriamente de passar pelo estado de nenhuma tecla acionada.

Considerando o teclado sem rebotes, escreva uma subrotina que faa a varredura do teclado e
retorne:

nenhuma tecla acionada Carry = 0;


uma tecla acionada Carry = 1 e acumulador = cdigo da tecla acionada;
duas ou mais teclas acionadas Carry = 1 e acumulador = 15.
Obs.: o cdigo de cada tecla corresponde ao seu valor numrico, exceo de * (cdigo 10) e de
# (cdigo 11).

6-28) Refaa o exerccio 6-27, mas agora considerando que o teclado tenha rebotes.

6-29) Escreva uma subrotina que receba 50 bytes de dados, armazenando-os na RAM interna, a partir
do endereo 20H. Os dados so validados pelo flanco de descida de um sinal de strobe (#STRB),
como mostrado na figura 6.27.

6-30) Este exerccio emprega um barramento paralelo assncrono para enviar dados a um receptor,
cujo protocolo apresentado na figura 6.28. O C disponibiliza os dados pela porta P1 e indica este
fato atravs do pino P3.4, com um pulso de strobe (#STRB). Esse pulso deve ter a durao mnima
de 1 s. O receptor confirma o recebimento do dado atravs de um pulso de acknowledge (#ACK)
que recebido pelo pino P3.2. Um novo dado s pode ser disponibilizado aps a chegada do #ACK
do dado anterior. O sinal de ocupado (BUSY) recebido pelo pino P3.5. Enquanto BUSY = 1,
nenhum dado pode ser enviado. O protocolo recm apresentado usado pelo PC para enviar dados
para a impressora.

Escreva uma subrotina que, empregando o protocolo recm descrito, transmita de forma contnua as
letras de A at Z.

6-31) O teclado do PC um dispositivo com uma interface serial sncrona muito simples. Por um
condutor, chegam os dados (KBDT) e, pelo outro, chega o sinal de sincronismo (KBCLK), como
mostrado na figura 6.29. O dado enviado corresponde ao cdigo de varredura e no ao cdigo ASCII
da tecla que foi pressionada. Escreva uma subrotina que monte o dado vindo do teclado e o retorne
no acumulador. Ignore o bit de paridade. O teclado estudado com detalhes no Apndice D.

6-32) Refaa o exerccio 6-31, mas agora com uma subrotina que retorne o cdigo ASCII da tecla
acionada. O cdigo da tecla liberada deve ser ignorado. Estude o Apndice D.

6-33) Existem quatro chaves ideais, denominadas A, B, C e D conectadas a quatro pinos da porta P1,
conforme mostrado na figura a seguir. Escreva uma rotina que acenda os leds Z e Y quando as
seguintes expresses booleanas forem verdadeiras:
6-34) Na soluo do exerccio anterior, possvel que as chaves mudem de estado enquanto a
expresso estiver sendo avaliada, o que pode resultar em impreciso. Rescreva a rotina de forma a
evitar esse problema.

6-35) Refaa o exerccio anterior, mas considerando que as chaves gerem rebotes.

6-36) Devido simplicidade de seu controle, os motores de passo so muito empregados em


comandos digitais. Para o caso deste problema considera-se um motor com passo de 5 graus e 4
bobinas, denominadas de L1, L2, L3 e L4. A seqncia de alimentao das bobinas determina o
sentido de rotao do motor:

Esse motor gira 5 graus a cada vez que uma nova bobina alimentada. claro que, para dar uma
volta completa, so necessrios 72 passos. Como exemplo de funcionamento, a tabela abaixo
apresenta os comandos para o motor girar 35 no sentido horrio, retroceder 25 no sentido anti-
horrio e depois avanar 10. Note que o dgito 1 diz que a bobina est alimentada.
O circuito a seguir apresenta uma interface simples para o motor de passo, onde as quatro bobinas
so alimentadas por transistores comandos pelos pinos da porta P1. Usam-se transistores porque as
portas do 8051 no tm capacidade para drenar a corrente necessria. Note que, em paralelo com
cada bobina, foi colocado um diodo de proteo, tambm denominado de diodo free-wheeling. Esse
diodo colocado porque, enquanto a bobina estiver alimentada, ela gera um campo magntico ao seu
redor, mas, quando cortada sua alimentao, esse campo magntico entra em colapso, o que gera
uma elevada tenso reversa atravs da bobina, o que pode queimar o transistor. Para evitar esse
perigo, coloca-se um diodo em paralelo com a bobina de forma a curto-circuitar essa tenso.

Escreva uma subrotina para o controle do motor, atendendo aos seguintes parmetros de entrada:

Obs.: como essa subrotina pode ser chamada vrias vezes, interessante armazenar a ltima fase
alimentada.

Alimente cada bobina durante 50 ms.


6-37) Qual a velocidade, em rotaes por minuto (RPM), do motor acionado no exerccio anterior?

6-38) Ainda considerando o problema 6-36, escreva uma subrotina que acione o motor na direo e
velocidade determinadas. Use os parmetros:

6-39) Um motor de corrente contnua (motor CC) oferece muito mais torque e velocidade que um
motor de passo. Por outro lado, pede um controle um pouco mais sofisticado. A figura 6.32,
desenhada a partir do CI L298, apresenta uma ponte H para controle de um motor CC. Se os
transistores Q1 e Q4 estiverem ligados, diz-se o motor est girando no sentido normal. J com os
transistores Q3 e Q2 ligados, o giro ser no sentido reverso. Os diodos D1, D2, D3 e D4 devem ser
adicionados externamente e tm a funo de proteger os transistores das altas tenses geradas quando
se corta a energia das bobinas do motor.
O controle dos transistores feito com uma habilitao, identificada por EN, e duas entradas,
denominadas IN1 e IN2. Se EN = 0, todos os transistores esto desligados e, com isso, o motor est
livre. Se EN = 1, atravs de IN1 e IN2 controla-se o sentido da rotao do motor. A tabela a seguir
resume as possibilidades de operao. O CI L298 oferece duas pontes H, trabalha com
alimentao de at 46 V e corrente de at 4 A. O fabricante a STMicroelectronics e sua pgina
pode ser acessada em www.st.com.

A maneira mais fcil de se controlar a velocidade de rotao de um motor CC atravs da


modulao por largura de pulso, designada pela sigla PWM (Pulse Width Modulation). Deve-se
usar perodos de 100 ms e resoluo de 100 divises. Em outras palavras, a resoluo ser de 1 ms.
A figura 6.33 ilustra quatro situaes da modulao PWM. Com modulao de 0%, o motor est
parado, j com modulao de 100%, o motor est na velocidade mxima. Entre 0% e 100%,
convencionam-se 100 passos, disponibilizando assim diversos valores intermedirios de rotao.

Considere as seguintes conexes:

Escreva uma subrotina que controle o sentido e a velocidade de rotao do motor, ao receber os
parmetros listados a seguir.

6-40) Uma forma de controlar-se a potncia entregue a dispositivos ligados rede eltrica, tais como
lmpadas incandescentes, aquecedores eltricos ou motores CA, com o emprego de tiristores.
Neste exerccio ser empregado um tipo de tiristor denominado TRIAC. A figura a seguir apresenta
uma sugesto para controle da potncia entregue carga RL com o emprego de um TRIAC (Q1).
Como o TRIAC vai operar diretamente com a rede eltrica, bom prever uma proteo para o resto
do circuito, que no caso foi feita com o foto-TRIAC ISO1 (MOC3020), que oferece isolao ptica.
Considere que o a CPU trabalha com um relgio de 12 MHz.

Sempre que o pino P1.0 for colocado em nvel baixo, o foto-TRIAC conduz, o que leva condio
de disparo para o terminal de Gate do TRIAC, que passa a conduzir. Se o TRIAC conduz, a
energia da rede chega at a carga RL. Para evitar disparos indevidos, adiciona-se o capacitor C1.
Para eliminar um pouco os rudos gerados pelo chaveamento do TRIAC, usa-se o filtro formado por
C2 e R4.

Para que se tenha noo dos instantes em que se deve disparar o TRIAC, necessria a
sincronizao com a rede eltrica. Uma maneira simples de se conseguir tal sincronizao atravs
de um circuito que detecte as passagens pelo zero, ou seja, um circuito que avise quando a tenso
alternada da rede estiver passando pelo valor zero. A figura 6.35 apresenta este circuito.

O transformador com tomada central (center tap) e os diodos D1 e D2 fazem um retificador de onda
completa. Enquanto houver tenso, o acoplador ptico IS02 conduz e, com isso, tem-se um nvel
baixo em P3.2. Mas, quando a rede estiver passando pelo zero, no haver tenso para acender o led
do acoplador e, com isso, o foto-transistor vai para o corte. Nesse caso, graas ao resistor de pull-
up, o pino P3.2 ir para nvel alto, como mostrado na figura 6.35. Os pulsos de sincronizao com a
rede surgiro em conformidade com a figura 6.36.

O controle de potncia feito a cada semiciclo. O instante de disparo do TRIAC, comandado atravs
de P1.0, deve tomar como referncia a passagem pelo zero (pino P3.2), como mostrado na figura
6.37. Se o disparo for logo aps a passagem pelo zero, como o caso do pulso P1, a carga recebe
quase que todo o semiciclo. Um disparo um pouco mais tarde, como acontece com P2, entrega um
pouco menos de potncia. Por outro lado, se o disparo for muito tarde, como o caso de P4, quase
nenhuma potncia chega at a carga. Desta forma, atravs do instante de disparo do TRIAC, controla-
se a potncia que entregue carga.
Suponha que, alm dos circuitos apresentados, existam duas teclas ligadas aos pinos P1.1 e P1.2,
semelhante ao que foi feito no exerccio 6-22, com os seguintes significados:

Escreva uma rotina que inicie com a carga recebendo potncia zero. Controlado pelo acionamento
das teclas, essa potncia ser aumentada ou diminuda, dentro de uma faixa de 0 a 100. O semiciclo
da rede tem a durao de 8,33 ms. Para simplificar, deve-se dividir o semiciclo em 100 passos, ou
seja, cada passo tem a durao de 83,3 s. Lembre-se de que:

Obs.: o pulso de disparo gerado por P1.0 no pode ser muito estreito; um valor perto de 50 s j
deve ser suficiente.
6-41) No exerccio anterior, dividiu-se o semiperodo em 100 intervalos de 83,3 s. Entretanto, cada
um desses intervalos no corresponde a 1/100 da potncia total. Refaa o exerccio anterior
recalculando os instantes de disparo de tal forma que realmente se trabalhe com incrementos de
1/100 da potncia plena. Sugesto: Considerando a carga RL, a senide de freqncia f e amplitude
A e o intervalo de conduo de 0 a , tem-se que a potncia na carga dada por:
7. Contadores e Temporizadores

Em muitos sistemas microcontrolados, necessrio medir intervalos de tempo, enviar


pulsos com durao definida e at gerar sinais digitais com formas-de-onda especiais.
Tudo isso possvel ser conseguido com o emprego de contadores e temporizadores.
Esses contadores e temporizadores so construdos com o emprego de simples
contadores binrios. Com um contador binrio e conhecendo sua freqncia de contagem,
podemos facilmente medir ou gerar intervalos de tempo. Por exemplo, imaginemos um
contador de 16 bits acionado por um relgio de 1 MHz. Isto significa que tal contador faz
uma contagem a cada 1 s. Para gerar um intervalo de tempo de 1 ms, basta esperar que
esse contador realize 1.000 contagens. Se for necessrio medir a durao da ativao de
um sinal, basta calcular a diferena entre os valores que o contador mostrava no instante
em que o sinal foi ativado e no instante em que ele foi desativado. Portanto, tudo se
resume no emprego e no controle de um contador binrio.

Neste captulo, estudaremos os dois contadores e temporizadores que o 8051 nos oferece
(a arquitetura 8052 possui trs contadores e temporizadores). Iniciamos o estudo fazendo
a distino entre os conceitos de contador e de temporizador. Em seguida, apresentamos
os registradores que a arquitetura nos disponibiliza para controlarmos tais recursos e seus
modos de operao. De acordo com a necessidade do usurio, os contadores e
temporizadores podem operar em quatro modos distintos. Esses modos sero estudados
em detalhes com o emprego de diagramas de blocos. Ao final do captulo, apresentamos
quatro exerccios resolvidos, onde ilustramos a gerao de diversas formas-de-onda. No
prximo captulo, aps o estudo das interrupes, veremos formas alternativas de
7.1. Conceitos Sobre Os Contadores e Temporizadores.

A famlia 8051 disponibiliza dois contadores, denominados contador/temporizador 0 e


contador/temporizador 1. Doravante, para simplificar o texto, eles sero designados por
CT0 e CT1 e o smbolo CTi ser empregado para designar um contador/temporizador
genrico. Eles so construdos com dois contadores binrios independentes, de 16 bits,
como mostrado na figura 7.1. Como este C trabalha com bytes, usaram-se dois bytes
para formar cada contador. Esses bytes esto mapeados na rea SFR e recebem os
nomes TH0, TL0, TH1 e TL1, podendo ser lidos ou escritos a qualquer momento. Tais
contadores binrios contam de forma ascendente e, a cada vez que ultrapassam seu limite,
que o valor 65.535, a flag de overflow ativada. O interessante que essa flag, alm de
poder ser consultada a qualquer instante, tambm pode provocar interrupo, o que facilita
as operaes quando precisamos de realizar aes em instantes de tempo especficos. As
interrupes sero estudadas no prximo captulo.

Neste ponto, fazemos a distino entre os conceitos de contador e temporizador. Quando


o contador binrio de 16 bits opera com base na freqncia do oscilador do C, diz-se que
um temporizador. No caso do 8051, a contagem feita com base no sinal do oscilador
dividido por 12. Isto significa que, se for empregado um cristal de 12 MHz, o temporizador
trabalhar na freqncia de 1 MHz, ou seja, uma contagem a cada 1 s. Quando opera
como contador, a contagem feita com base no sinal aplicado a uma das entradas do C,
denominadas T0 e T1. Em suma, ele conta os pulsos apresentados nas entradas T0 ou T1.
A figura 7.2 torna esse conceito mais claro.
Quando operando como contador, uma contagem feita quando, na entrada (T0 ou T1), surge uma
transio de 1 para 0. importante comentar que as entradas T0 e T1 so amostradas uma nica vez
em cada ciclo de mquina. Isto significa que o sinal aplicado nessas entradas dever ter o semi-
perodo superior a um ciclo de mquina.

No Captulo 10, figura 10.12, estudaremos que as entradas do C, incluindo T0 e T1, so amostradas
no instante E5F2 de cada ciclo de mquina. Quando, num ciclo de mquina, uma entrada detectada
em 1 e no ciclo seguinte em 0, o contador efetua uma contagem. A contagem acontece no instante
E3F1 do ciclo seguinte ao que foi detectada a transio. Nota-se ento que, para haver certeza de que
o C amostre os valores corretos, necessrio que o sinal que aciona a entrada do contador
permanea, pelo menos, um ciclo de mquina em nvel alto e um ciclo de mquina em nvel baixo.
Isto significa que a mxima freqncia com que o contador pode operar 1/24 da freqncia do
relgio. O sinal no precisa de ser quadrado, mas deve obedecer a essa restrio de tempo.

Independente de estar trabalhando como temporizador ou como contador, quando o registrador chega
ao valor limite (65.535d ou FFFFH), o prximo incremento o leva para 0. Esse evento do contador
ultrapassar seu limite denominado overflow. Quando ocorre o overflow, ele marcado nas flags de
overflow. Existem duas flags de overflow, TF0 e TF1, uma para cada contador. Mais adiante,
veremos que essas flags podem gerar interrupes. Elas tambm podem ser consultadas a qualquer
instante e, por software, o programador pode ativ-las ou apag-las. Um ponto a ficar claro que,
aps o overflow, os CT continuam a contagem a partir do zero. Caso se deseje uma nova contagem,
necessrio recarreg-los, como ser visto nos exerccios resolvidos.
7.2. Registradores Envolvidos.

Existem dois registradores, da rea denominada SFR, que esto destinados a controlar as
funes e a operao dos CT. O modo de operao selecionado com o uso do
registrador TMOD e a operao controlada com o registrador TCON. A figura 7.3
descreve o registrador TMOD, enquanto que o registrador TCON ser descrito logo mais
adiante.

necessria uma pequena explicao para o entendimento das informaes apresentadas


na figura 7.3. Iniciamos com os bits que definem o modo de operao. So quatro os
modos de operao. O modo 0 existe para oferecer compatibilidade com os antigos
controladores 8048. O modo 1 oferece um contador binrio de 16 bits. O modo 2 oferece
um contador binrio de 8 bits, mas com recarga automtica, e o modo 3 s existe para o
CT0, que nesse caso dividido em dois CT de 8 bits. Quando colocado no modo 3, o CT1
pra. Entretanto, ele pode trabalhar em qualquer dos outros modos. A tabela 7.1
apresenta um sumrio dos modos de operao. Mais adiante, detalharemos esses modos.
O bit C/#T seleciona a operao como temporizador (C/#T = 0) ou como contador (C/#T = 1). O bit
GATE permite uma sofisticao maior no controle do CT. Com GATE = 1, possvel controlar a
contagem externamente atravs de nveis lgicos apresentados nos pinos INT0 e INT1. A figura 7.4
ilustra esse controle de contagem. O controle por software feito atravs do bit TRi (registrador
TCON), que pode ligar ou desligar o contador. Para viabilizar um controle externo, por hardware, o
bit GATE quando ativado permite que um sinal externo aplicado ao pino #INTi ligue ou desligue o
contador. Neste caso, o contador ligado se #INTi = 1 e desligado se #INTi = 0. Em resumo:

GATE = 0 contagem se bit TRi = 1;


GATE = 1 contagem se bit TRi = 1 e pino #INTi = 1.
Estudemos agora o registrador TCON que, alm de ser usado pelos CT, tambm controla alguns
recursos de interrupo. Sua descrio apresentada na figura 7.5. Para o estudo dos CT, daremos
ateno aos bits 4, 5, 6 e 7, porm a figura apresenta a totalidade dos bits. Com esse registrador,
pode-se ligar e desligar a contagem dos CT, via bit TRi. Ele tambm traz o bit de overflow que,
como j dissemos, pode ser consultado a qualquer momento.
7.3. Modo 0.

Os dois CT podem operar neste modo. Ele existe para oferecer compatibilidade com o CT
do antigo 8048 (MCS-48). Esse modo oferece um contador binrio de 8 bits com um pr-
escalador de 5 bits. Efetivamente, isto resulta num CT de 13 bits, que idntico ao que
existe nos membros da famlia MCS-48. So usados 8 bits do registrador THi e os 5 bits
menos significativos do registrador TLi. Os 3 bits que sobram no registrador TLi so
indefinidos. A flag de overflow ativada quando a contagem transiciona do valor limite
(1FFFH) para 0. A figura 7.6 apresenta o diagrama de blocos deste modo de operao.
Supondo um relgio de 12 MHz, esse modo permite que se trabalhe com intervalos de
tempo de at 8.192 s.
7.4. Modo 1.

Os dois CT podem operar neste modo. Este modo de operao muito simples, pois se
usa THi e TLi para compor um contador binrio de 16 bits. Considerando um relgio de 12
MHz, pode-se medir intervalos de tempo de at 65.536 s. A figura 7.7 apresenta o
diagrama de blocos deste modo.
7.5. Modo 2.

Os dois CT podem operar neste modo. Em todos os modos estudados at agora, aps o
overflow, o CT seguia com a contagem a partir do zero, o que, na maioria das vezes,
obriga o programa a fazer a recarga de THi e TLi com o valor adequado.

claro que essa recarga consome tempo e pode gerar pequenos atrasos, caso no se faa correes.
Para facilitar esse problema de recarga, existe o modo 2. Neste caso, a parte mais significativa (THi)
do contador de 16 bits sacrificada para armazenar o valor de recarga e o contador passa a ter
apenas 8 bits (TLi). Quando ocorre o overflow, alm da ativao do bit TFi, o contedo de THi
copiado (por hardware) para TLi e assim a contagem sempre reiniciada com o valor desejado. A
figura 7.8 apresenta o diagrama em blocos para este modo de operao.
7.6. Modo 3.

O modo 3 um pouco mais sofisticado, oferecendo um total de trs CT. O CT1 fica
parado ao ser colocado neste modo, ou seja, ele pode ser usado em qualquer outro modo.
J o CT0 dividido em dois contadores de 8 bits, com distintos recursos para controle de
contagem:

TH0 contador de 8 bits usando GATE, C/#T, TR0, #INT0 e TF0;


TL0 contador de 8 bits usando TR1 e TF1.

Assim, o saldo final de dois contadores binrios de 8 bits (TH0 e TL0) e um contador
binrio de 16 bits (TH1 e TL1). O CT1 ainda pode ser usado nos modos 0, 1 e 2, sendo
que o modo 3 usado para par-lo, quando for necessrio. A figura 7.9 apresenta o
diagrama em blocos de quando o CT0 opera no modo 3.
7.7. Exerccios Resolvidos.

A seguir, so apresentados diversos exerccios resolvidos, onde demonstramos o emprego


dos contadores/temporizadores. Em todos esses exerccios, supomos que o C faz uso de
um relgio de 12 MHz, o que resulta numa contagem a cada 1 s. Mais adiante, quando
estudarmos as interrupes, empregaremos os CT de maneira mais elegante.

Usando o CT0, gere pelo pino P1.7 uma onda quadrada de 2,5 kHz.

Soluo:

O perodo de uma onda quadrada de 2,5 kHz de 400 s, o que significa que o pino P1.7 deve,
repetitivamente, ficar 200 s em nvel baixo e 200 s em nvel alto, como mostrado na figura 7.10.

Assim, programamos o CT0 para ativar seu bit de ultrapassagem (overflow), TF0, a cada 200 s.
Cada vez que TF0 for feito igual a 1, invertemos o pino P1.7 e apagamos TF0 para que se possa
ativ-lo novamente. O modo mais fcil de trabalhar neste problema com o modo 2, pois no haver
atrasos para a recarga dos contadores. O contador deve ser preparado para sofrer a ultrapassagem
aps 200 contagens e, como a contagem ascendente, ele deve ser programado com o valor 256
200 = 56. A contagem sempre comea em 6 e a ultrapassagem acontece aps 200 contagens.
Usando o CT0, gere pelo pino P1.7 a onda apresentada na figura 7.11.

Soluo:

O problema agora um pouco mais complexo porque a onda no quadrada. Entretanto, observando
os intervalos de tempo, notamos que eles so mltiplos de 50 s. Podemos ento programar o
contador/temporizador para 50 s e ento aguardarmos uma ultrapassagem com P1.7 em nvel alto e
5 ultrapassagens com P1.7 em nvel baixo. Usamos o acumulador como um contador auxiliar.
Novamente, programamos o CT0 para o modo 2 e para 50 contagens, o que implica em usar como
carga: 256 50 = 206.
Usando o CT0, gere pelo pino P1.7 a onda apresentada na figura 7.12.

Soluo: Agora, necessrio gerar quatro perodos distintos. Como todos os perodos so mltiplos
de 500 s, tomamos esse intervalo como base. Entretanto, como o modo 2 usa contador de 8 bits
apenas, o mximo intervalo que se consegue gerar de 256 s.

Uma alternativa ento usarmos o contador para ativar o bit de ultrapassagem a cada 250 s.
Novamente, programamos o contador/temporizador 0 para o modo 2, preparando-o para 250
contagens, o que implica em usar como carga: 256 250 = 6. Para facilitar a soluo do problema,
escrevemos uma subrotina que recebe no acumulador a quantidade de ultrapassagens a ser contada.
Usando o CT0, gere pelo pino P1.7 a onda apresentada na figura 7.13.

Soluo:

Neste exerccio, os intervalos so bem maiores. Ainda poderamos usar o modo 2, entretanto os
valores de contagem ficariam elevados. Por exemplo, para obtermos um intervalo de 900 ms, seriam
necessrias 3.600 contagens de 250 s. Uma alternativa usar o modo 1. Neste modo, possvel
marcar intervalos de at 65.536 s. Dado o intervalo do sinal desejado, usamos o CT0 para gerar
intervalos de 50 ms (50.000 s). Para tanto, como precisamos de 50.000 contagens, o valor a ser
carregado ser de 65.536 - 50.000 = 15.536. Como no modo 1 no existe recarga automtica, a cada
ultrapassagem ser necessrio recarregar os contadores. Novamente usamos uma subrotina que
recebe no acumulador a quantidade de ultrapassagens a ser contada.

Obs.: deve ser notado que, a cada ultrapassagem, o valor de TH0 e TL0 recarregado para que a
contagem reinicie em 15.536. Temos a um pequeno problema pois, entre o instante da ultrapassagem
e a recarga do contador, existe um atraso. Se no for possvel tolerar esse atraso, possvel corrigi-
lo. A instruo JNB TF0,$ consome dois ciclos de mquina e no temos como saber se o bit TF0 foi
colocado em nvel alto durante o primeiro ou o segundo ciclo de mquina. J a recarga do TL0
consome um ciclo de mquina. Portanto, h um atraso de 2 ou 3 ciclos de mquina. Para simplificar,
tomamos o atraso como sendo de 2 ciclos de mquina e, portanto, para corrigi-lo, programamos o
contador para efetuar duas contagens a menos, ou seja, basta recarregarmos com 15538.
7.8. Exerccios.

7-1) Usando um contador/temporizador, resolva o exerccio 6-14.

7-2) Usando um contador/temporizador, resolva o exerccio 6-15.

7-3) Usando um contador/temporizador, resolva o exerccio 6-16.

7-4) Usando um contador/temporizador, resolva o exerccio 6-17.

7-5) Usando um contador/temporizador, resolva o exerccio 6-18.

7-6) Usando um contador/temporizador, resolva o exerccio 6-19.

7-7) Usando um contador/temporizador, resolva o exerccio 6-20.

7-8) Usando um contador/temporizador, resolva o exerccio 6-21.

7-9) Usando um contador/temporizador, resolva o exerccio 6-27, de tal forma que se


realize uma varredura do teclado a cada 0,1 s.

7-10) Usando um contador/temporizador para controlar o tempo de alimentao (50 ms) de


cada bobina, resolva o exerccio 6-36.

7-11) Usando um contador/temporizador, resolva o exerccio 6-38.

7-12) Usando um contador/temporizador, resolva o exerccio 6-39.

7-13) Usando um contador/temporizador, resolva o exerccio 6-40.

7-14) Usando um contador/temporizador, resolva o exerccio 6-41.

7-15) preciso medir a periodicidade de um sinal digital, ou seja, deseja-se saber quanto
tempo este sinal fica em nvel alto e quanto tempo ele fica em nvel baixo. Para tanto,
proposto o esquema apresentado na figura 7.14, que faz uso do controle externo dos
contadores. Escreva uma subrotina que faa tal medio, dando a resposta em s. Quais
os limites de medio para sua rotina?
8. Interrupes

A interrupo um recurso que traz muita flexibilidade aos sistemas processados. Graas
a ela, eventos importantes podem receber a ateno imediata do processador. A
interrupo, como o prprio nome diz, interrompe o fluxo normal de processamento e
desvia a execuo para um endereo previamente especificado. Comparamos a
interrupo com a chamada de subrotina, s que, ao invs de usar uma instruo do tipo
CALL, a chamada feita por um evento gerado por hardware. Dizemos ento que
interrupo uma chamada de subrotina ativada por hardware. subrotina que atende a
uma interrupo d-se o nome de Servio de Interrupo, Rotina ISR (Interrupt Service
Routine) ou Rotina Manipuladora de Interrupo. Como toda subrotina, ela deve
terminar com uma instruo de retorno, que, no caso do 8051, a RETI.

Para melhor entendermos a flexibilidade propiciada por uma interrupo, propomos o


seguinte problema: preciso receber uma certa quantidade de bytes, sendo que estes so
validados por um sinal de strobe (#STRB) ativado em nvel baixo, como mostrado na figura
8.1 (veja exerccio 6-28). Usando nossos conhecimentos sobre as portas paralelas,
podemos ligar o barramento de 8 bits porta P1 e o sinal de strobe a um bit da porta P3
como, por exemplo, o pino P3.2. Feito isso, basta a rotina de recepo monitorar
constantemente o pino P3.2. Aps isto, cada vez que ele for para zero, fazemos a leitura
da porta P1 e armazenamos o byte recebido. Sendo bastante detalhista, a rotina precisa
esperar o pino P3.2 ir para zero, quando ento faz a leitura dos dados pela porta P1. Aps
isso, preciso esperar o pino P3.2 voltar para um e s depois esperar uma nova descida
do pino P3.2. importante notar que toda a capacidade processamento foi consumida em
monitorar o pino P3.2. O C no tem tempo para mais nada. Essa tcnica de recepo
denominada de polling. Ela simples, porm pouco eficiente.

Propomos agora a soluo usando o recurso de interrupo. Pelo pino P3.2, possvel
invocar uma interrupo. Com isso, chamamos uma subrotina automaticamente toda vez
que esse pino amostrar uma transio de nvel alto para nvel baixo. Agora, o C pode
dedicar tempo a outras tarefas e o hardware se encarrega de chamar a subrotina de
recepo cada vez que o strobe for validado em nvel baixo.
8.1. Conceitos Bsicos de Uma Interrupo.

Prosseguindo com o estudo das interrupes da famlia 8051, abordamos agora alguns
tpicos importantes, listados a seguir:

O primeiro conceito trata do evento gerador do pedido de interrupo. Diversos eventos podem gerar
uma interrupo como, por exemplo, um nvel baixo num determinado pino do C, o overflow num
contador/temporizador ou ainda a recepo ou a transmisso de um byte pela porta serial. Existe um
conjunto mnimo de interrupes implementado na famlia 8051. Os fabricantes podem adicionar
outras interrupes, de acordo com os recursos que oferecem.

Para cada interrupo, preciso prever uma forma de habilit-la e desabilit-la. Quando a
interrupo est desabilitada, mesmo que ocorram pedidos, eles so ignorados. Normalmente, a
habilitao controlada pelos bits de algum registrador. Por exemplo, a interrupo somente pode
acontecer se um determinado bit estiver em 1. costume usar a palavra mscara para se referir
desabilitao. Assim, usa-se o termo mascarar uma interrupo para indicar que se est
desabilitando a interrupo. A desabilitao importante porque, muitas vezes, existem trechos de
programa que so crticos e que no podem ser interrompidos.

preciso, de alguma forma, especificar o endereo da subrotina a ser chamada para cada
interrupo. Esse endereo recebe o nome de Vetor de Interrupo, j que ele aponta para o local
onde est a subrotina a ser chamada. Essa subrotina que atende a uma interrupo denominada de
Rotina ISR ou simplesmente Rotina de Interrupo. Assim, preciso especificar o endereo de uma
rotina de servio para cada interrupo. Algumas arquiteturas usam um vetor fixo, ou seja, para cada
interrupo, existe um endereo de subrotina fixo. Nesse caso, a definio dos endereos feita pelo
fabricante e nunca pode ser mudada. Outras arquiteturas trabalham com vetores mveis, ou seja,
atravs de uma tabela em memria, o usurio define o endereo da subrotina de servio para cada
interrupo. A CPU do PC trabalha dessa forma e reserva os primeiros endereos de memria para a
construo dessa tabela. J o C 8051 trabalha com uma tabela fixa de vetores de interrupo.

Para o programa que est em execuo, a interrupo um evento assncrono, ou seja, pode
interromp-lo a qualquer momento. Entretanto, preciso ficar bem claro que a interrupo s aceita
ao final da execuo de uma instruo, ou seja, a interrupo no interrompe a execuo de uma
instruo. A lgica de controle da CPU espera terminar a instruo que est sendo executada para
aceitar a interrupo e desviar para a subrotina de servio. Antes do desvio, ele armazena na pilha o
endereo de regresso. Ao terminar a subrotina de interrupo, o que obrigatoriamente feito com a
instruo RETI, esse endereo retirado da pilha e a execuo retoma o fluxo original.

A figura 8.2 ilustra o caso de um pedido de interrupo chegando no exato momento em que estava
sendo executada a instruo do endereo 201H: CPL A. O processador termina a execuo dessa
instruo, armazena na pilha o endereo de regresso (202H), que o endereo da prxima instruo,
e escreve no contador de programa o endereo (previamente definido) da subrotina de servio da
interrupo que, para esse exemplo, suposto ser igual a 500H. Note que a rotina de interrupo faz
uso do acumulador (ACC) e, para evitar que suas aes interfiram no programa principal, ela
armazena na pilha o valor do acumulador antes de us-lo. Ao regressar, essa subrotina restaura o
acumulador para seu valor anterior. Isso feito retirando da pilha o valor que ali foi armazenado.
Somente aps essa restaurao, executada a instruo de retorno de interrupo (RETI). Essa
instruo RETI faz o processamento retomar a partir do endereo que est armazenado no topo da
pilha, que, neste exemplo, o endereo 202H. Assim, aps terminar a rotina de servio de
interrupo, o processamento continua exatamente a partir do ponto onde havia sido interrompido.

Note que, em geral, o programa principal no percebe que houve interrupo. Por isso, a rotina de
interrupo tem por obrigao armazenar todos os registradores que ir utilizar (e que estejam sendo
usados pelo programa principal) para que, antes de retornar, restaure o contexto do programa
principal. A subrotina da figura 8.2 recebe um dado atravs da porta P1, armazena-o no endereo
apontado por R0 e em seguida incrementa esse registrador. Note que houve a preocupao de guardar
apenas o valor do acumulador. Supe-se que o outro registrador que foi usado, o R0, esteja
reservado para trabalhar como ponteiro de dados nessa recepo, ou seja, ele usado
exclusivamente pela rotina de interrupo. Nunca se pode esquecer que a rotina de interrupo deve
armazenar em algum lugar o contedo de todos os registradores que usa. o que se chama de salvar
o contexto. Normalmente, faz-se uso da pilha para salvar e recuperar o contexto. Ao preparar a
programao de um sistema, interessante separar alguns registradores para serem usados
exclusivamente pelas rotinas de interrupo. Em alguns casos, pode-se at reservar um banco de
registradores, por exemplo, o banco 3. Isso minimiza o trabalho de salvar o contexto do programa
principal a cada interrupo.

Um outro ponto importante definir o que deve ser feito se chegar um novo pedido de interrupo
enquanto se estiver atendendo o atual? Essa pergunta respondida com a seguinte frase: uma
interrupo no interrompe a si mesma, ou seja, esse pedido de interrupo no aceito. A grosso
modo, podemos dizer que um novo pedido s poder ser aceito aps a instruo RETI. Um recurso
que traz bastante agilidade a capacidade de atribuir prioridades aos pedidos de interrupo.
Consideremos um ambiente onde se usam diversas interrupes, sendo que uma delas muito
importante e deva sempre ser aceita. Note que, enquanto o processador estiver atendendo a uma
interrupo, ele no poder atender a qualquer outra interrupo, inclusive a essa de alta
importncia. Porm, se houver disponibilidade do recurso de prioridade e este for atribudo a essa
interrupo, consegue-se uma soluo para o problema. Assim: uma interrupo no pode
interromper outra de mesma prioridade, entretanto, uma interrupo de alta prioridade pode
interromper uma de baixa prioridade. Portanto, se for atribuda uma alta prioridade a essa
interrupo muito importante, tem-se certeza de que ela sempre ser aceita.
8.2. Interrupes Bsicas da Famlia 8051.

O ncleo bsico da famlia 8051 prev a disponibilidade de interrupo para 5 eventos:

Assim, diz-se que a famlia 8051 oferece 5 interrupes. Com a aplicao de um nvel baixo ou de
um flanco de descida () no pino #INT0 (a programar), consegue-se gerar o pedido para a
interrupo Externa 0. O nome externa usado porque esse pedido se origina externamente ao C. O
mesmo acontece com o pino #INT1 e a interrupo Externa 1. As interrupes Timer 0 e Timer 1
so invocadas pelos dois contadores/temporizadores e servem para marcar intervalos de tempo. J a
interrupo Serial, apesar de ser nica, responde a dois eventos: recepo serial e transmisso
serial. possvel gerar essa interrupo cada vez que for transmitido um byte pela porta serial ou
toda vez que for recebido um byte pela porta serial.

Como j dissemos, a famlia 8051 trabalha com vetores de interrupo fixos, ou seja, o fabricante j
definiu o endereo da subrotina a ser chamada por cada interrupo, sendo que no h como alterar
isso. A tabela a seguir a apresenta os cinco vetores de interrupo da famlia 8051. Nessa tabela, na
primeira coluna, est listado o bit onde fica marcada a existncia de um pedido de interrupo. Esses
bits sero estudos com detalhes logo a seguir.

Pela Tabela 8.1, ao verificarmos os endereos, notamos que existe pouco espao (8 posies) entre
os vetores de interrupo. A no ser nos casos em que a rotina de interrupo seja muito curta,
coloca-se nesses endereos uma instruo de desvio para a verdadeira rotina de interrupo. O
mesmo procedimento feito com o endereo 0000H pois, aps a inicializao (reset), a execuo
comea a partir do endereo 0000H. Como h vetores de interrupo logo a partir do endereo
0003H, coloca-se em 0000H apenas uma instruo de desvio para o incio do programa principal.
Vide exerccio resolvido 8.1.
8.3. Registradores Envolvidos nas Interrupes.

So trs os registradores usados no controle de todo o sistema de interrupes da famlia


8051:

O registrador IE (Interrupt Enable) permite um controle completo e individual sobre a habilitao e


a desabilitao das interrupes. A figura 8.3 apresenta os detalhes desse registrador. Para habilitar
uma interrupo, coloca-se o respectivo bit em 1 e, para desabilit-la, coloca-se esse bit em 0.
Existe um bit de habilitao geral, denominado EA. As interrupes s podem acontecer se esse bit
estiver em 1. Ao fazer EA = 0, nenhuma interrupo aceita. Por exemplo, para usarmos apenas as
interrupes Externa 1 e Temporizador 0, devemos fazer EX0 = 0, ET0 = 1, EX1 = 1, ET1 = 0, ES =
0 e EA = 1. A operao de reset zera todos os bits desse registrador.

A prioridade das interrupes definida pelo registrador IP (Interrupt Priority). Esto disponveis
dois nveis de prioridade: o alto e o baixo. possvel definir, como alta ou baixa, a prioridade de
cada interrupo. Entretanto, deve-se ficar atento s seguintes regras:

A figura 8.4 apresenta os detalhes do registrador de prioridade de interrupes. Ao se colocar um


determinado bit em 1, define-se a respectiva interrupo como sendo de alta prioridade. Para baixa
prioridade, coloca-se o bit correspondente em 0. Assim, para definirmos somente a interrupo
Externa 0 como de alta prioridade, fazemos: PX0 = 1, PT0 = 0, PX1 = 0, PT1 = 0 e PS = 0. A
operao de reset zera todos os bits desse registrador.
Um outro detalhe a ser resolvido o que fazer quando chegam simultaneamente dois pedidos de
interrupo. A lgica de controle verifica a existncia de pedidos de interrupo usando uma
seqncia pr-definida, denominada de seqncia de polling. Essa seqncia define, no caso de
simultaneidade de pedidos, qual interrupo ser atendida primeira. Note que a seqncia monitora
primeiro as interrupes definidas como alta prioridade e depois as que esto definidas como baixa
prioridade.

Por exemplo, suponha que foram especificadas, como alta prioridade, as interrupes Serial e
Externa 1 e, como baixa prioridade, as demais. Caso cheguem ao mesmo tempo pedidos para as
interrupes Externa 0 e Temporizador 1, a Externa 0 ser aceita primeiro. Somente aps o seu
trmino, o processador atender ao Temporizador 1. Se, nesse nterim, chegar um pedido para a
interrupo Externa 1, esta ser imediatamente aceita. Se houver simultaneidade nos pedidos para
interrupes Externa 0 e Externa 1, como esta ltima tem alta prioridade, ela ser aceita primeiro.
Convm lembrarmos que o sistema no se esquece dos pedidos de interrupes no atendidos. Esses
pedidos ficam marcados nos bits listados na tabela 8.1 e so atendidos assim que as condies de
prioridade permitirem.

Normalmente, permite-se que as interrupes ativadas por eventos externos, como o caso das
interrupes Externa 0 e 1, trabalhem por nvel ou por flanco. Consideremos um caso, ilustrado na
figura 8.6, onde o pedido de interrupo apresentado no pino #INT0, que foi selecionado para
trabalhar por nvel. A palavra nvel indica que o sistema aceita um pedido de interrupo sempre que
encontrar o pino #INT0 em nvel baixo. Suponhamos tambm que a subrotina que atenda
interrupo Externa 0, cuja listagem apresentada a seguir, dure 10 s, pois est sendo usado um
microcontrolador 8051 com relgio de 12 MHz. Como pode ser visto, essa rotina calcula a
expresso: Z = S' + R' (O sinal ' indica negao), cada vez que for chamada. Neste ponto, fazemos
uma anlise sobre o que acontece quando a entrada #INT0 acionada por pulsos com diferentes
larguras, como mostrado na figura 8.6.
Neste anlise, adotamos algumas simplificaes: ignoramos os tempos de latncia (demora no
atendimento) das interrupes e consideramos que a interrupo Externa 0 esteja habilitada e
preparada para trabalhar como uma interrupo por nvel. Alm disso, devemos lembrar que, para a
famlia 8051, o final de uma interrupo marcado pela execuo da instruo RETI. Na figura 8.6-
(a), o pedido de interrupo tem uma durao menor que a subrotina de interrupo (3 s < 10 s),
isto significa que, quando a subrotina termina, executando a instruo RETI, o pedido de interrupo
j foi removido. J para o caso da figura 8.6-(b), o pedido de interrupo maior que o tempo
necessrio para executar a subrotina de interrupo (25 s > 10 s). Isto significa que, ao retornar da
subrotina de interrupo, o pedido ainda estar presente (#INT0 = 0), o que faz o sistema invocar
novamente a mesma interrupo. A anlise ainda permite concluir que, neste caso, a mesma
interrupo ser invocada trs vezes: uma vez quando o pino #INT0 vai para nvel baixo e mais duas
vezes antes dele voltar para nvel alto. A repetio da mesma interrupo pode ser desejvel ou no.
Existem casos em que determinadas aes precisam de ser repetidas continuamente, como neste caso
em que o sistema d sada pelo pino P1.2 (expresso Z = S' + R') enquanto o pino #INT0 estiver em
nvel baixo.

Consideremos agora uma outra situao onde no temos certeza da durao do pulso que pede
interrupo, mas que desejamos que a rotina de interrupo seja invocada uma nica vez. Para esse
caso, usa-se a interrupo por flanco. No 8051, a ativao no flanco de descida, o que significa que
um pedido de interrupo gerado quando o pino #INT0 passa do nvel alto para o nvel baixo. Note
que agora, independente da largura do pulso aplicado ao pino #INT0, somente uma interrupo
gerada. Aps o surgimento de um flanco de descida (), para que uma nova interrupo seja
invocada, o pino #INT0 deve voltar para 1, para depois ir para 0, provocando assim um novo flanco
de descida.

Como o C amostra as flags de interrupo uma nica vez a cada ciclo de mquina (ver figura
10.12), os sinais usados para gerar as interrupes externas possuem algumas restries de tempo.
Quando trabalhando por nvel, o pino do C deve permanecer no mesmo estado por pelo menos 12
perodos de relgio, do contrrio o pedido de interrupo pode ser ignorado. Quando trabalhando
por flanco, o pino deve permanecer, pelo menos, 12 perodos de relgio em nvel alto e depois, por
pelo menos 12 perodos de relgio em nvel baixo. Somente assim o controle do 8051 vai reconhecer
que houve um flanco de descida.

Os dois modos, flanco ou nvel, so usados para gerar as mais diversas solues com as
interrupes. A figura 8.7 apresenta o registrador TCON (Timer Controller) que, apesar do nome,
tambm usado para indicar como se deseja trabalhar com as interrupes externas.

Como pode ser notado, existe sempre uma flag (vide tabelas 8.1 e 8.2) que ativada toda vez que se
concretiza um pedido de interrupo. Em geral, essa flag apagada quando C desvia para o
endereo da rotina de servio da interrupo. No caso da interrupo no poder ser atendida
imediatamente, talvez por estar desabilitada ou talvez por no ter a prioridade necessria, o pedido
permanece ativo. claro que, se uma interrupo estiver com pedido pendente (flag ativada) e
chegar uma nova solicitao para a mesma interrupo, essa nova solicitao no ser percebida
pelo C, pois a flag j est ativada. Um fato interessante que, por software, pode-se ativar uma
dessas flags, como se tivesse chegado um pedido de interrupo. o que se denomina interrupo
ativada por software. A tabela a seguir lista as flags das cinco interrupes da famlia 8051.

A figura 8.8 apresenta uma ilustrao completa do sistema de interrupes da famlia 8051. Nessa
figura, cada bit est modelado por uma chave de duas posies, que representa o que acontece
quando o bit ativado (colocado em 1) ou desativado (colocado em 0). interessante que o leitor
identifique as flags listadas na Tabela 8.2.
8.4. Latncia das Interrupes.

importante conhecer como a lgica do 8051 trata as interrupes. As flags de


interrupo so amostrados na segunda fase do quinto estado (E5F2) de cada ciclo de
mquina (vide figura 10.12). No ciclo de mquina seguinte, realizado o polling para
identificar que pedido ser aceito. A figura 8.9 ilustra a seqncia de interrupo, desde o
pedido at o atendimento.

Se uma das flags de interrupo estiver ativa durante o perodo E5F2, o polling realizado no
prximo ciclo de mquina vai identificar a interrupo a ser atendida e ser feita uma chamada para
o endereo da subrotina de interrupo, sempre que no estiver bloqueada por:

O intervalo de tempo que decorre desde o pedido at o incio da subrotina servio de interrupo
denominado de latncia da interrupo. Vrios fatores influenciam na latncia das interrupes. O
caso ilustrado na figura 8.9 corresponde menor latncia possvel, que de 5 ciclos de mquina.
Isso acontece quando o ciclo denominado MC2 corresponde ao final de uma instruo e esta no
um RETI, nem uma escrita em IP ou IE. Caso contrrio, ser executada mais uma instruo antes da
vetorizao da interrupo. Logo aps o trmino de uma instruo RETI, ou de uma instruo de
escrita em IP ou IE, o sistema obrigatoriamente executa mais uma instruo antes de aceitar o
prximo pedido de interrupo. A maior latncia possvel ocorre quando, no ciclo marcado como
MC2, for executada uma instruo RETI e a instruo do programa principal, que obrigatoriamente
executada, for uma instruo do tipo multiplicao ou diviso, que consome 4 ciclos de mquina.
Essa situao gera uma latncia de 9 ciclos de mquina. A figura 8.10 apresenta a menor e a maior
latncia para uma interrupo.

A seqncia de polling repetida a cada ciclo de mquina e as flags analisadas so aquelas que
estavam ativas no instante E5F2 do ciclo de mquina anterior. Deve ser ressaltado que, se uma flag
de interrupo foi ativada, mas no pde ser atendida por um dos motivos j listados, o pedido
permanece ativo e toma parte nos prximos pollings, at ser atendida. Entretanto, se por software o
pedido for apagado antes de poder ser atendido, sua interrupo nunca acontecer.

O 8051 indica que reconheceu o pedido de uma interrupo atravs de sua vetorizao.
Normalmente, nesse instante, apaga-se a flag que gerou a interrupo, com exceo da lista
apresentada a seguir. Nesses casos, a rotina de interrupo responsvel por apagar a flag que gerou
a interrupo.

A instruo RETI usada para indicar a finalizao da subrotina servio de uma interrupo.
Atravs dela, o sistema de controle do 8051 sabe que pode aceitar uma nova interrupo. Uma
instruo do tipo RET tambm faz o retorno da subrotina de interrupo, entretanto, o sistema de
controle fica sem saber que a rotina de interrupo terminou e permanece bloqueando as interrupes
de prioridade igual ou inferior.
8.5. Modo Passo a Passo.

A estrutura de interrupo disponvel nos microcontroladores 8051 permite, de uma forma


muito simples, a execuo de programas passo a passo. Por execuo passo a passo se
entende uma forma do usurio executar seu programa de maneira controlada, indicando o
instante em que a prxima instruo deva ser executada, de forma que possa monitorar os
registradores do C. Como j foi visto, uma interrupo no ser atendida enquanto uma
interrupo de igual ou maior prioridade estiver em execuo. Quando essa interrupo
termina, com a instruo RETI, o sistema obrigatoriamente executa uma instruo antes de
aceitar uma nova interrupo.

Assim, o bsico para um modo passo a passo : uma interrupo no interrompe a si


mesma, a interrupo deve terminar com um RETI e, aps um RETI, executa-se mais uma
instruo antes de se aceitar nova interrupo.

Consideremos o caso onde se deseja executar passo a passo um programa principal.


Vamos tambm supor que se construiu uma rotina atendendo s exigncias para o passo a
passo e que essa rotina esteja instalada como rotina de servio da interrupo 0. Se, por
exemplo, a interrupo Externa 0 estiver habilitada e for programada para trabalhar por
nvel, esta interrupo estar sempre sendo invocada se o pino #INT0 estiver aterrado.
Assim, a cada vez que se retornar (com RETI) dessa rotina de interrupo, o sistema
executa uma instruo do programa principal e novamente interrompido, logrando o
modo passo a passo.
8.6. Exerccios Resolvidos.

Os prximos exerccios resolvidos serviro para ilustrar o emprego das interrupes.


Alguns desses exerccios j foram resolvidos no Captulo 7, mas sem o emprego de
interrupes. Para tornar claros os conceitos, supomos que tais programas sero os
nicos presentes na memria de programa e, por isso, eles devem comear a execuo a
partir do endereo 0. O relgio considerado igual a 12 MHz.

Usando o CT0 e o recurso de interrupo, gere pelo pino P1.7 uma onda quadrada de 2,5 kHz.

Soluo:

O perodo de uma onda quadrada de 2,5 kHz de 400 s, o que significa que o pino P1.7 deve,
repetitivamente, ficar 200 s em nvel baixo e 200 s em nvel alto, como mostrado na figura 8.11.

Assim, programamos o CT0 para ativar seu bit de ultrapassagem (TF0) a cada 200 s e habilitamos
sua interrupo. Cada vez que TF0 for feito igual a 1, a interrupo acontece e invertemos o estado
do pino P1.7. Trabalhamos em modo 2, pois nesse modo h a recarga automtica dos contadores, o
que evita atrasos. O contador deve ser preparado para sofrer a ultrapassagem aps 200 contagens,
logo o valor a ser programado 256 200 = 56. O programa ser escrito como se fosse o nico a
ser executado.
Note que o programa principal termina num lao infinito e que, de tempos em tempos, interrompido
pelo CT0 que, atravs da interrupo, inverte o estado do pino P1.7. A flag que invoca a interrupo
(TF0) apagada automaticamente quando o processamento desviado para o endereo 0BH.

Usando interrupo e o CT0, gere pelo pino P1.7 a onda quadrada apresentada na figura 8.12.

Soluo:

O problema agora um pouco mais complexo porque a onda no quadrada. Entretanto, observando
os intervalos de tempo, notamos que eles so mltiplos de 50 s. Assim, programamos o CT0 para
gerar interrupes a cada 50 s. A cada seis interrupes, uma interrupo coloca P1.7 em nvel alto
e as outras cinco interrupes deixam P1.7 em nvel baixo. O registrador R7 usado como um
contador auxiliar. Novamente, programamos o CT0 para o modo 2 com 50 contagens, o que implica
em usarmos como carga: 256 50 = 206.
Usando interrupo e o CT0, gere pelo pino P1.7 a onda apresentada na figura 8.13.

Soluo:

Agora, necessrio gerar quatro perodos distintos. Como todos os perodos so mltiplos de 500
s, podemos tomar esse intervalo como base. Entretanto, o modo 2 usa um contador de 8 bits,
possibilitando intervalos de at 256 s. Assim, ele usado para ativar o bit de ultrapassagem a cada
250 s. Novamente programamos o CT0 0 para o modo 2, preparado para 250 contagens, o que
implica em usar como carga: 256 250 = 6. A cada interrupo, para gerar o prximo perodo,
preciso saber qual foi o ltimo perodo gerado. Para esta finalidade, usamos R6, que decrementado
a cada interrupo.
Usando interrupo e o CT0, gere pelo pino P1.7 a onda apresentada na figura 8.14.

Soluo:

Neste exerccio, os intervalos so bem maiores. possvel usarmos o modo 2, mas os valores de
contagem seriam elevados para obtermos um intervalo de 900 ms (seriam necessrias 3.600
contagens de 250 s). Uma possvel soluo aproveitarmos o modo 1 e a recarga. Neste modo,
possvel marcar intervalos de at 65.536 s. Dados os intervalos do sinal desejado, programamos o
CT0 para gerar intervalos de 50 ms (50.000 s). Para as 50.000 contagens, o valor de carga ser de
65.536 50.000 = 15.536. Como no modo 1 no existe recarga automtica, a cada ultrapassagem
ser necessrio recarregarmos os contadores. Esta soluo lembra muito a anterior, onde usamos R6
para marcar o perodo que est sendo gerado.
Para o esquema apresentado na figura 8.15 e considerando a chave SW sem rebotes, escreva um
programa que, com o uso da interrupo, conte no DPTR o nmero de acionamentos da chave.
Soluo:

Para resolvermos o problema, basta prepararmos a interrupo para atuar por flanco e, na rotina de
interrupo, incrementarmos o DPTR.

Implemente o software de controle do cronmetro apresentado na figura 8.16. Para tornar o problema
simplificado, este cronmetro conta apenas de 00,0 at 59,9 segundos e volta a zero. A preciso de
dcimos de segundo. As chaves CH1 e CH2 permitem o controle do cronmetro.
Soluo:

Note que os trs displays, atravs de um buffer (74LS244), esto conectados porta P1. A seleo
do display a ser aceso feita pelos sinais ACD0, ACD1 e ACD2, por intermdio de trs transistores.
Este esquema traz duas vantagens: simplifica as conexes e permite economizar energia. Um
mostrador de sete segmentos, quando aceso, consome perto de 105 mA (7 x 15 mA). Os trs
displays, quando acesos, iriam consumir 315 mA. Para evitar esse consumo elevado, basta acender
um display por vez, mas numa taxa tal que o olho humano no perceba a cintilao. A sensibilidade o
olho humano para variaes de luminosidade est limitada em 25 Hz. Em outras palavras, um led
piscando em 25 Hz parecer aceso. Para a soluo deste problema, consideramos ser suficiente
acender cada display durante 10 ms. Desta forma, a freqncia de varredura ser de 33,3 Hz (1/30
ms).

Para fazermos aparecer no display o nmero correto, necessria a construo de uma tabela que
relacione o nmero que desejamos mostrar com os segmentos que devam ser acesos. Essa tabela est
apresentada a seguir. No programa, ela est armazenada a partir do endereo 40H, com o rtulo
TAB7SEG. Um dos objetivos deste exerccio, alm de demonstrar o emprego simultneo de diversas
interrupes, tambm enfatizar a construo de tabelas. Como essa tabela fica armazenada na
memria de programa, sua consulta feita com uma instruo de leitura do tipo MOVC. Sua consulta
extremamente simples. O ponteiro de dados deve apontar para o incio da tabela (MOV
DPTR,#TAB7SEG). Em seguida, coloca-se no acumulador o nmero (de 0 at 9) a ser exibido e acessa-
se a tabela (MOVC A,@A+DPTR).
Como a preciso de 10 ms, preparamos o CT0 para interromper a cada 10.000 contagens, j que o
cristal de 12 MHz. O valor de recarga ser 55.5536 (65.536 10.000 = 55.536). A cada
interrupo do CT0, mudamos o display a ser aceso (ATD0, ATD1 e ATD2) e incrementamos o
contador de centsimos de segundos (C_SEG). A partir do contador de centsimos de segundos, em
cascata, incrementamos os demais contadores (D_SEG, SEG e SEG10). Quando a flag PARAR
estiver em 1, o incremento desses contadores no feito.

As chaves de CORRE/PRA e ZERAR esto ligadas s interrupes, o que simplifica o


programa e permite uma resposta rpida ao seu acionamento. Como as chaves so ideais, no haver
problemas de rebotes e as interrupes externas 0 e 1 sero preparadas para trabalhar por flanco.
Cada vez que ocorrer a interrupo 0 (ZERAR), todos os contadores so zerados. Cada vez que
ocorrer a interrupo 1 (CORRE/PRA), a flag PARAR invertida. A interrupo que controla a
parada do cronmetro precisa de ser a de maior prioridade. Como a base de tempo de 10 ms, esse
cronmetro apresenta, no incio da contagem, um erro de at um centsimo de segundo (10 ms).

Como pode ser visto na soluo apresentada, o programa principal fica preso em um lao infinito,
atualizando os displays. Para fazermos a sincronizao entre o programa principal e a rotina do CT0,
empregamos trs flags, denominados ATD0, ATD1 e ATD2, que servem para indicar qual display
deve ser atualizado.
Execute passo a passo a rotina que calcula a seguinte expresso booleana: Z = S'A.SC + SA.S'B
(Lembrando que o sinal ' indica negao). A figura 8.17 apresenta o esquema eltrico sugerido, onde
a chave CH0 controla a entrada e sada do modo passo a passo, enquanto que a chave CH1
empregada para comandar um passo de cada vez. As chaves devem ser consideradas ideais.

Soluo:

Para entrar no modo passo a passo, basta fechar a chave CH0, o que deixa claro que o passo a passo
ser construdo com o emprego da interrupo externa 0.

A chave CH0 fechada pede, constantemente, a interrupo externa 0. Note que o programa principal,
logo no seu incio, habilita essa interrupo. A rotina de servio dessa interrupo apenas aguarda
que a chave CH1 seja acionada. Cada vez que isso ocorre, essa subrotina termina, executando a
instruo RETI. Mas, o pedido da interrupo externa 0 (CH0) continua ativo e, assim, o C executa
uma instruo antes de aceitar novamente a interrupo. Desta forma, a cada acionamento da chave
CH1, executada uma instruo do programa principal.
8.7. Exerccios.

8-1) Usando um contador/temporizador e interrupes, resolva os exerccios:

(a) 6-14
(b) 6-15
(c) 6-16
(d) 6-17
(e) 6-18
(f) 6-19
(g) 6-20
(h) 6-21

8-2) Usando um contador/temporizador e interrupes, resolva o exerccio 6-27, de tal


forma que se realize uma varredura do teclado a cada 0,1 s.

8-3) Usando um contador/temporizador e interrupes para controlar o tempo de


alimentao (50 ms) de cada bobina, resolva o exerccio 6-36.

8-4) Usando um contador/temporizador e interrupes, resolva os exerccios:

(a) 6-38
(b) 6-39
(c) 6-40
(d) 6-41

8-5) Resolva os exerccios resolvidos 8.5 e 8.6, mas considerando que a chave tenha
rebotes.

8-6) Resolva o exerccio resolvido 8.5 e 8.6, mas programando a interrupo por nvel.

8-7) A soluo apresentada para o exerccio resolvido 8.6, como faz uso do CT0 no modo
1, perde algum tempo na recarga dos contadores. Resolva o exerccio resolvido 8.6
empregando o CT0 no modo 2, que oferece recarga automtica.

8-8) Modifique a soluo do exerccio resolvido 8.6, de tal forma que o cronmetro
somente possa ser zerado quando estiver parado, ou seja, se a chave de zerar for
acionada enquanto o cronmetro estiver correndo, ela ser ignorada.
8-9) preciso medir a periodicidade de um sinal digital, ou seja, deseja-se saber quanto
tempo este sinal fica em nvel alto e quanto tempo ele fica em nvel baixo. Para tanto, foi
proposto o esquema apresentado na figura 8.18. Empregando interrupes, escreva uma
subrotina que faa tal medio, dando a resposta em s. Quais os limites de medio para
sua rotina?

8-10) O circuito abaixo apresenta um cronmetro, muito semelhante ao do exerccio resolvido 8.6,
mas tem preciso de centsimos de segundo e capaz de contar at 99 horas. Escreva o programa
para este cronmetro.
9. Porta Serial

A necessidade de comunicao uma constante nos sistemas de controle. Normalmente,


precisamos comunicar-nos com os sistemas projetados para obter valores das diversas
variveis de controle e tambm para enviar parmetros de configurao. A comunicao
muito til enquanto estamos desenvolvendo programas. Um meio de comunicao ainda
muito empregado a comunicao serial. Ela interessante pela simplicidade do protocolo
e do cabo de conexo. Na forma mais simples, bastam trs fios: um para transmisso,
outro para recepo e o ltimo ligado ao terra para fornecer a referncia de tenso.
Devemos comparar esse cabo com o cabo usado numa comunicao paralela, por
exemplo, que faz uso de pelo menos dez condutores. Especialmente quando se trabalha
com grandes distncias, o cabo serial oferece uma boa economia. O preo pago por essa
simplicidade a velocidade, pois, a grosso modo, a comunicao serial mais lenta que a
paralela. Isso intuitivo: mais rpido enviar 8 bits de uma s vez, por 8 caminhos
independentes, que enviar 8 bits seqencialmente atravs de um nico caminho.
Entretanto, com a evoluo da tecnologia, esto surgindo canais seriais extremamente
rpidos, que conseguem conciliar a simplicidade do cabo com a velocidade. O melhor
exemplo o canal USB, mas que faz uso de um protocolo sofisticado. Existem diversos
outros protocolos como o I2C, o SPI, o Microwire, etc..

Neste captulo, damos grande nfase comunicao serial. Iniciamos com conceitos
bsicos sobre comunicao serial. Depois descrevemos a porta serial do 8051, seus
modos de operao e os registradores empregados no seu controle. Em seguida,
analisamos os problemas que possam surgir na programao da velocidade da
comunicao. Fazemos ainda um breve estudo da porta serial do PC (RS 232), que
muito empregada, e finalizamos com quatro exerccios resolvidos.
9.1. Alguns tpicos Sobre Comunicao Serial.

Um conceito fundamental em comunicao serial a distino entre comunicao sncrona


e comunicao assncrona. Na comunicao serial sncrona, como o nome indica, existe
um sinal que marca o instante em que cada bit disponibilizado no canal serial. Esse sinal
recebe o nome de relgio (clock). O cabo necessrio bem simples e faz uso de trs fios:
um para o canal de dados, outro para o relgio e o terceiro (terra) para a referncia das
tenses. Normalmente, os canais so bidirecionais, sendo o transmissor responsvel por
gerar os dados seriais e o relgio. A figura 9.1 apresenta um exemplo de transmisso
serial sncrona, onde foram transmitidos os bytes 97H (1001 0111b) e B6H (1011 0110b).
Note que os bits so transmitidos na ordem inversa da que usa para escrever, ou seja,
transmite-se primeiro o bit menos significativo e por ltimo o bit mais significativo. A
validao de cada bit marcada pelo flanco positivo () do relgio. Pode-se imaginar
diversas outras formas de validao do bit de dado, por exemplo, ele pode ser validado no
flanco negativo, ou quando o relgio permanecer em nvel alto, ou ainda, enquanto o
relgio permanecer em nvel baixo. O mais comum empregar um dos flancos do relgio.

J na comunicao serial assncrona, no existe o relgio para validar os bits de dados. Na sua
forma mais simples, so necessrios apenas trs condutores: um para transmisso, outro para
recepo e um terceiro para ser a referncia de terra. Como no existe relgio, preciso que, antes
de se iniciar a comunicao, se saiba quantos bits sero transmitidos por segundo, pois isto define a
janela de tempo na qual o transmissor envia (e o receptor recebe) cada bit. O nome correto baud
rate, que abreviaremos por BR. costume usar tambm as expresses taxa de bits ou velocidade
de transmisso. As taxas mais comuns so de 9.600 bauds, 19.200 bauds e 28.800 bauds. Para que o
receptor possa reconhecer o incio de uma transmisso, usa-se um bit especial, denominado bit de
partida. O final indicado com um ou outro bit especial, denominado bit de parada. A figura 9.2
apresenta o exemplo de uma transmisso serial assncrona. Uma velocidade de 9.600 bauds significa
que so transmitidos 9.600 bits por segundo. Assim, cada bit tem uma janela de tempo de 1/9.600
segundos (104,17 s).

importante olharmos com um pouco de ateno para entendermos o que significam os bits de
partida e parada. Note que, de acordo com a figura, a comunicao inativa (ociosa) indicada pela
linha em 5 V. Quando o transmissor vai iniciar, ele coloca a linha em nvel baixo por um intervalo de
tempo igual a 1/BR, sinalizando o bit de partida. Logo em seguida, o transmissor coloca a linha em
nvel alto ou nvel baixo, de acordo com os valores dos bits, em intervalos de 1/BR. Note que o bit
menos significativo (bit 0) transmitido primeiro e, em conseqncia, o bit mais significativo (bit 7)
transmitido por ltimo. Aps transmitir o ltimo bit, o transmissor deixa a linha em nvel alto por
um intervalo de tempo igual a 1/BR, gerando assim o bit de parada. Note que o bit de parada
indistinto da linha inativa (ociosa). Essa a finalidade do bit de parada: garantir que a linha fique
algum tempo em estado ocioso, para assim assegurar que o prximo bit de partida seja percebido.
Em verdade, os bits de partida e parada nada tm de especial. A figura 9.3 apresenta o exemplo da
transmisso dos bytes 97H e B6H.

Quando se trabalha com a comunicao serial, importante caracterizar se o canal serial empregado
permite a transmisso e a recepo ao mesmo tempo, ou se permite a transmisso ou a recepo em
instantes diferentes. No exemplo apresentado na figura 9.1, vemos que a comunicao sempre
unidirecional, ou seja, no possvel fazer a transmisso e a recepo ao mesmo tempo. J no caso
da comunicao assncrona, dado o fato de haver duas linhas de dados, possvel transmitir e
receber ao mesmo tempo. A figura 9.4 ilustra esses dois casos.
Note que, na figura 9.4-(a), o equipamento E1 transmite para o equipamento E2 atravs da linha de
dados D, ao mesmo tempo em que envia o relgio pela linha R. A figura 9.4-(b) apresenta a
transmisso no sentido inverso. J na figura 9.4-(c), ambos equipamentos transmitem e recebem ao
mesmo tempo. Quando o canal de comunicao, apesar de ser bidirecional, s pode ser usado em um
sentido por vez, ele recebe o nome de half-duplex. J o canal que permite simultaneidade na
transmisso e recepo recebe o nome full-duplex. Para tornar completo o conceito, falta
abordarmos o termo simplex, que usado para indicar situaes onde exista apenas um transmissor e
um receptor, ou seja, o canal de comunicao usado num nico sentido apenas.

Antes de fechar esse tpico, importante esclarecer a sigla UART, do ingls Universal Asychronous
Receiver/Transmiter, que em portugus significa Receptor/Transmissor Assncrono Universal.
Assim, UART descreve um conversor paralelo/serial e serial/paralelo para realizar a comunicao
serial e inclui hardware para tratar os bits de partida e parada. Em suma, o circuito transmissor e
receptor serial.
9.2. A Porta Serial da Famlia 8051.

A famlia 8051 oferece uma porta serial que pode trabalhar de forma sncrona ou
assncrona em full-duplex. A recepo feita pelo pino P3.0 (RXD) e a transmisso pelo
pino P3.1 (TXD). Toda vez que o circuito serial recebe um byte, ele o apresenta no
registrador SBUF e, por sua vez, todo byte escrito no SBUF imediatamente transmitido.
Existem na realidade dois registradores SBUF, um que funciona apenas para leitura e
armazena o byte recebido e outro registrador SBUF, que s funciona para escrita e recebe
o byte a ser transmitido.

A construo de uma porta serial muito simples, envolvendo um relgio e um registrador


de deslocamento. A cada batida do relgio, o registrador de deslocamento recebe um bit
ou transmite um bit. A presena do registrador SBUF permite que o registrador de
deslocamento inicie a recepo do prximo byte mesmo que o anterior ainda no tenha
sido lido. A figura 9.5 apresenta um diagrama em blocos da porta serial da famlia 8051.
Devem ser notados os dois registradores com nome SBUF.

Como veremos no prximo tpico, esta porta possui quatro modos de operao. No modo
sncrono, ela trabalha com freqncia fixa igual a 1/12 do relgio. J no modo assncrono,
possvel trabalhar com baud rate fixo, igual a 1/12 do relgio, ou com baud rate varivel,
gerado pelo contador/temporizador 1 (CT1).
9.3. Os Registradores SCON e PCON.

O registrador SCON, que permite controlar os principais recursos da porta serial, est
apresentado na figura 9.6. Logo a seguir, feita uma descrio detalhada da finalidade e
emprego de cada bit.

Os bits SM0 e SM1 servem para selecionar um dos quatro modos de operao, como
mostrado na tabela 9.1. Quando no Modo 0, a porta serial trabalha de forma sncrona,
como um registrador de deslocamento, e com baud rate fixo igual 1/12 da frequncia do
relgio do C.
Como foi visto no captulo anterior, existe um nico vetor para atender interrupo da porta serial,
o que significa que a interrupo ser provocada tanto na recepo de um byte quanto no trmino do
envio de um byte. Para que o programador possa distinguir que situao provocou a interrupo,
existem as flags RI e TI. Por isso, elas no so apagadas automaticamente por ocasio da vetorizao
da interrupo, mas sim devem ser apagadas pelo programador.

A verso CHMOS deste microcontrolador possui um registrador, denominado PCON, destinado a


controlar seu consumo de energia. Os bits desse registrador sero detalhados mais adiante,
entretanto, um deles, de nome SMOD, usado na gerao do baud rate da porta serial e, por isso,
ser apresentado a seguir. Esse bit, quando colocado em nvel alto, serve para dobrar o baud rate
gerado pelo contador/temporizador 1 (CT1). A figura 9.7 apresenta o registrador PCON. Deve ser
observado que esse registrador no enderevel bit a bit. Por isso, qualquer atualizao feita
sobre todos seus bits.
9.4. Modo 0.

Esse modo recebe o nome de registrador de deslocamento, pois simplesmente apresenta,


no pino RXD, o acesso ao registrador de deslocamento e, no pino TXD, o relgio que
comanda esse registrador. O pino RXD pode ser usado para transmitir ou receber os bits
seriais. So sempre transmitidos e recebidos 8 bits de dados e o baud rate fixo em 1/12
da freqncia do cristal oscilador. A figura 9.8 apresenta um diagrama da porta serial
operando no modo 0.
9.5. Modo 1.

Neste modo, possvel programar a taxa de transmisso com o uso do CT1. Para cada
byte, transmitido um trem de 10 bits, como mostrado na figura 9.9. Note que o primeiro
bit o de partida (nvel lgico zero), que o dcimo bit o de parada (nvel lgico um) e que
a ordem do bit menos significativo para o mais significativo. Por ocasio da recepo, o
bit de parada copiado para o bit RB8, do registrador SCON.

A gerao do baud rate toma como base o overflow do CT1. Assim, atravs de sua programao,
possvel atender a diversas taxas de transmisso. O esquema est apresentado na figura 9.10. Note
que o relgio dividido por 12 antes de chegar ao CT1, que, por sua vez, efetua uma diviso por N,
sendo que N programvel pelo usurio. Em seguida, de acordo com o estado do bit SMOD, pode
ser feita uma diviso por 2. Aps uma diviso por 16, chega-se ao valor do baud rate que ser
entregue aos registradores de deslocamento de transmisso e recepo.

O valor do baud rate (BR) facilmente calculado com o uso da expresso 9.1. Com uma pequena
manipulao, podemos explicitar o valor de N em funo do baud rate (expresso 9.2).
Normalmente, programa-se o CT1 para operar no modo 2, que o modo com auto recarga. Lembre-
se de que o contador temporizador no modo 2 deve ser programado com 256 N.
9.6. Modo 2.

Quando opera no Modo 2, a porta serial transmite, para cada byte, um trem de 11 bits
com o baud rate fixo em 1/32 ou 1/64 da freqncia do relgio (de acordo com o bit
SMOD). O trem de bits est apresentado na figura 9.11, onde se pode notar a existncia
do nono bit. No caso da transmisso, o nono bit a ser transmitido copiado do bit TB8 do
registrador SCON. J no caso de recepo, o nono bit recebido copiado em RB8. Esse
nono bit pode ser usado para transmitir ou receber o bit de paridade. Numa outra situao,
pode-se optar por dois bits de parada. Neste caso, possvel simular o segundo bit de
parada colocando TB8 em nvel alto, pois assim ele passa a ter mesmo nvel lgico que o
bit de parada. Como vimos, o baud rate fixo em 1/32 ou 1/64 do relgio do
microcontrolador, como est mostrado na figura 9.12.
9.7. Modo 3.

O Modo 3 semelhante ao Modo 1, porm faz uso do trem de bits apresentado na figura
9.11. Com o emprego do Modo 3, resolve-se a maioria dos casos de comunicao serial.
9.8. Cuidados com a Taxa de Comunicao (Baud Rate).

Aqui, vamos apontar um problema muito comum quando se emprega a porta serial do
8051. Partimos com a suposio de que estamos usando um microcontrolador com relgio
(cristal) de 12 MHz e que desejamos nos comunicar com um PC usando modo 1, a 9.600
bauds. Com o emprego da equao 9.2 e considerando SMOD = 0, calculamos:

Como no podemos programar valores fracionrios, arredondamos o valor calculado e trabalhamos


com N = 3. Programamos ento 256 3 = 253 no CT1. Parece que tudo est certo, mas h
possibilidade de erros na comunicao serial com o PC. Como j estamos percebendo, o erro deve-
se ao arredondamento do valor de N. Vejamos o que obtemos com o uso da equao 9.1:

O valor do baud rate est diferente dos 9.600 desejados. Vem agora a pergunta: ser que essa
diferena grande o suficiente para inviabilizar a comunicao serial? Para responder, vamos olhar
com um pouco mais de cuidado a comunicao assncrona. Apesar do nome assncrono, o bit de
partida pode ser encarado como um sinal de sincronismo, para indicar a janela temporal dos bits. O
problema que, quando existe um erro no baud rate, os bits no ocupam a janela temporal desejada
e surge um erro. Esse erro se acumula ao longo do trem de bits, ou seja, se houver problemas, ele
ser cumulativo e se manifestar de forma pior nos ltimos bits. Vejamos a durao de um bit para os
dois casos:

BR = 9.600 cada bit dura 104,17 s


BR = 10.416,7 cada bit dura 96,0 s

Como pode facilmente ser concludo, temos o erro de 104,17 96 = 8,17 s a ser acumulado em
cada bit. Como no Modo 1 so transmitidos 10 bits, o erro ao final do ltimo bit ser de 81,7 s, o
que corresponde a 78 % da durao do ltimo bit. No nosso exemplo, o PC transmite a 9.600 bauds
para o 8051 que, devido ao arredondamento, est preparado para receber a 10.416,7 bauds, como
mostrado na figura 9.13. Pode-se notar claramente a diferena ao final dos dois trens de bits. Isto
resulta que a recepo no 8051 praticamente perde o bit de parada. bem provvel que essa
comunicao no funcione. A deficincia semelhante no caso do 8051 transmitir para o PC.

Fazemos agora a pergunta: at quanto podemos tolerar de diferena no baud rate? Para respond-la,
preciso analisar como trabalha o receptor serial, ou seja, em que instante o receptor amostra cada
bit. Existem diversas maneiras de se construir uma lgica para recepo serial. claro que, na
recepo do bit, devemos fugir dos extremos da janela temporal, ou seja, evitamos amostrar o bit no
incio e no final da janela temporal. intuitivo que o melhor momento para ler-se o bit bem no
meio da janela. Entretanto, uma nica leitura perigosa e extremamente vulnervel a rudos. Assim,
h receptores que fazem trs leituras seguidas e, logo aps, uma votao para decidir o valor do bit a
ser aceito. Podemos imaginar um receptor que faa trs leituras, uma no primeiro quarto, outra na
metade e a ltima no quarto final, como mostrado na figura 9.14-(a).

J o receptor 8051 divide a janela temporal do bit em doze partes e amostra nas partes de nmero 5,
6 e 7, como mostrado na figura 9.14-(b). Tomando como base o pior caso, fica claro que, para se ter
completa certeza da comunicao serial, no devemos tolerar um erro total maior que da janela de
um bit. Entretanto, possvel sugerir uma regra mais otimista que possa ser empregada quando no
existe muito rudo nas linhas. A sugesto tolerarmos um erro total de at 50% da janela de um bit,
pois, mesmo com esse erro, ainda teremos duas leituras corretas. Como resposta pergunta inicial,
afirmamos que, se o erro total for superior a 50% da durao de um bit, a comunicao dever
apresentar muitos erros.

Vimos que o baud rate impreciso surgiu pela necessidade de arredondarmos o valor a ser
programado no CT1. Para terminar esse assunto, fazemos ainda mais uma pergunta: qual deve ser o
cristal, mais prximo de 12 MHz, que permite gerar baud rate corretamente. A soluo uma conta
muito simples, usando a expresso 9.1, onde explicitamos o valor do relgio e, claro, usamos N =
3. A resposta um cristal de 11,0592 MHz, como calculado na expresso 9.5. Esse valor de cristal
bastante conhecido e comum vermos sistemas com 8051 trabalhando nessa freqncia.
9.9. Comunicao Entre 8051.

Os Modos 2 e 3 permitem criar uma estrutura de comunicao entre diversos 8051, sendo
um deles o mestre e os demais os escravos. A comunicao ser sempre unidirecional, do
mestre para os escravos, ou seja, o escravo apenas escuta e nunca fala, como mostrado
na figura 9.15. possvel, com o uso de alguns recursos, permitir que o escravo
selecionado envie dados para o mestre. Veja o exerccio 9-4.

Propositadamente, deixamos para comentar somente agora que, quando no Modo 2 ou 3 e com o bit
SM2 ativado, a interrupo poder ser gerada quando se recebe RB8 = 1. Isso permite que se crie um
sistema de comunicao capaz de enderear individualmente os escravos. Usam-se duas classes de
palavras de 8 bits. A palavra de endereo, que possui TB8 = 1, e a palavra de dado, que possui TB8
= 0. Na inicializao, todos os escravos esto com o bit SM2 = 1. Assim, quando o mestre transmitir
um endereo (que possui TB8 = 1), todos os escravos recebero o byte de endereo e RB8 = 1.
Todos sero interrompidos, mas apenas o escravo cujo endereo for igual ao endereo enviado
selecionado e faz seu bit SM2 = 0. Com isso, esse escravo passa a ser interrompido na recepo de
qualquer byte. Os demais escravos permanecem com SM2 = 1, ou seja, apenas sero interrompidos
quando for recebido RB8 = 1. O mestre, uma vez tendo selecionado um escravo, passa a enviar os
dados, mas com o cuidado de manter TB8 = 0. Assim, apenas o escravo anteriormente selecionado
recebe os dados, via interrupo.
9.10. A Porta Serial do PC.

Devido ao seu grande uso, interessante fazermos um pequeno estudo da porta serial
disponvel nos computadores da linha PC, que emprega o protocolo RS 232. Esse
protocolo assncrono, full-duplex e especifica dois nveis de tenso para representar os
bits 0 e 1. O bit 0 representado por um nvel de tenso de +12 V e o bit 1
representado usando um nvel de tenso de 12 V. interessante fazer uma comparao
com os nveis TTL, que usam +5 V e 0 V para codificar respectivamente os bits 1 e 0,
como mostrado na Tabela 9.2. Para permitir flexibilidade e tolerar perdas no cabo, a
interpretao dos nveis de tenso no cabo no rgida e existe uma grande tolerncia.

Assim, fica claro que, para trabalhar com TTL e RS 232, necessrio converter nveis de tenso.
Esse trabalho de converso feito por um circuito denominado driver RS 232. O trabalho inverso
feito pelo denominado receiver RS 232. A figura 9.16 apresenta um sistema onde se faz uso de
drivers e receivers. No mercado, existe uma grande quantidade de drivers e receivers para emprego
em RS 232C. No passado, foram comuns os circuitos da Motorola MC1488 e MC 1489. Existia,
entretanto, o inconveniente de se preverem no circuito fontes de tenso de +12 V e 12 V. A
evoluo da eletrnica e da capacidade de integrao permitiu o surgimento de circuitos,
denominados conversores CCCC, que so capazes de gerar +12 V e 12 V usando exclusivamente a
fonte de +5 V. O mais comum o MAX 232, da Maxim, que, num nico CI alimentado por +5 V, j
traz os drivers e receivers. Ao final desta seo, apresentaremos um exemplo de seu emprego.
O protocolo RS 232C orientado a bytes e os bits de cada byte so transmitidos seqencialmente. A
ordem de envio do bit menos significativo (bit 0) para o bit mais significativo (bit 7).
Obrigatoriamente, o incio da transmisso de um byte marcado por um bit de partida. Logo aps a
esse bit de partida, seguem-se os bits de dados e, obrigatoriamente, ao final existe um bit de parada.
opcional o envio de um bit de paridade entre o ltimo bit de dado (mais significativo) e o bit de
parada. Essa arrumao de bits est mostrada na figura 9.17. De acordo com o que foi apresentado na
figura 9.2, como bit de partida, usa-se o bit igual a 0, o que resulta na transmisso de um bit em +12
V. J como bit de parada, usa-se o bit igual a 1. Por isso, o bit de parada sempre em 12 V.

H razes para isso tudo! Por definio do protocolo, uma linha RS 232C inativa (ociosa) est
sempre em 12 V. Assim, o fato do bit de partida ser em +12 V serve para indicar o incio de um
trem de bits. Aps o bit de partida, seguem-se os bits de dados, que podem ser 1 ou 0, resultando em
bits +12 V ou 12 V. O bit de paridade opcional e, para indicar o trmino do trem de bits, vem o
bit de parada, que em 12 V, ou seja, j colocando a linha em estado ocioso. O bit de parada serve
ento para garantir que se tenha condies de identificar o prximo bit de partida. Em alguns casos,
usam-se dois bits de parada, o que separa ainda mais os trens de bits. A figura 9.18 apresenta o
exemplo da transmisso do byte 97H, usando paridade par e dois bits de parada.
O bit de paridade serve para detectar a presena de erros durante a transmisso. Usando o bit de
paridade, o receptor tem uma forma de verificar se os dados recebidos esto livres de erros.
possvel usar dois tipos de paridade: par ou mpar. Seu uso muito simples. Quando se usa paridade
par, o trem de bits deve sempre conter um nmero par de 1's, sendo que o bit de paridade tal que
isso acontea. Por exemplo, no caso de se transmitir o byte AAH (1010 1010b), ele j possui um
nmero par de 1's, por isso o bit de paridade feito igual a 0. J no caso do byte 85H (1000 0101b),
ele possui um nmero mpar de 1's, por isso seu bit de paridade feito igual a 1, para que resulte
numa quantidade par. De maneira anloga usa-se a paridade mpar.

Deve ser observado que o uso de bit de paridade permite detectar o erro de apenas um bit. Se
ocorrer erro em dois bits, o sistema no percebe. A gerao e a verificao do bit de paridade ficam
disposio do programador. Levando em conta que os sistemas no esto sujeitos grandes
quantidades de rudos, na maioria das vezes, os bits de paridade so ignorados.

Existem dois conectores seriais usados no PC. As mquinas mais antigas trazem um conector de 25
pinos, enquanto que a tendncia atual usar conectores de 9 pinos. A tabela 9.3 traz a descrio dos
pinos desses dois conectores. Deve-se notar que, para nossos propsitos de comunicao serial,
apenas os pinos de transmisso (TD), recepo (RD) e terra (GND) so necessrios. Os demais
pinos so teis para o controle de outros dispositivos, como o modem.
A implementao da porta serial do PC traz uma boa tolerncia para os nveis +12 V e 12 V.
Qualquer nvel de tenso acima de +3 V interpretado como 0 lgico e, por sua vez, qualquer nvel
de tenso abaixo de 3 V interpretado como 1 lgico. Os limites extremos esto em 15 V e +15 V,
como mostrado na figura 9.19. importante notar que a faixa de tenso entre 3 V e +3 V
considerada invlida.

Atualmente, a melhor soluo para converter os sinais TTL para RS 232 e vice-versa emprega o CI
MAX232, que j traz internamente circuitos necessrios para gerar +10 V e 10 V, usando
exclusivamente a alimentao de +5 V. Entretanto, necessria a adio de 4 capacitores de 1 F /
25V, como mostrado na figura 9.20.
Na impossibilidade de se encontrar o MAX 232, existe uma soluo simples empregando apenas
componentes discretos e que tambm dispensa a fonte negativa. Esse esquema est apresentado na
figura 9.21, onde a converso dos nveis RS 232 para TTL feita pelos componentes: R3, R4, R5,
D3 e Q2. Atravs de R4, o pino de transmisso do PC (DB9, pino 3) est conectado base de Q2.
Quando a base de Q2 estiver negativa, ele fica cortado. Em conseqncia, a sada RXD vai para
nvel alto graas a R5 (resistor de pull-up ). J na situao oposta, quando a base de Q2 estiver com
tenso positiva, ele satura levando a sada RXD para nvel baixo. Assim, est facilmente resolvida a
recepo.

Entretanto, para a transmisso, somos obrigados a injetar no pino 2 do conector DB9 sinais positivos
e negativos. Ao invs de trabalhar com +12 V, vamos usar a prpria alimentao de +5 V. Entretanto,
permanecemos com o problema de gerar o sinal negativo, mas existe um detalhe que podemos tirar
partido. O PC, quando transmite pela porta serial, usa pulsos positivos e negativos. Alm disso,
enquanto no estiver transmitindo, mantm seu pino em 12 V. Por que no roubamos essa tenso
para gerar nosso sinal negativo? Esse o papel desempenhado por D1, D2 e C1. Pelo diodo D1,
carregamos o capacitor C1 com uma tenso negativa, enquanto que D2 trabalha como proteo,
evitando que, por algum motivo, a carga de C1 fique positiva. Atravs de R2, conectamos o coletor
de Q1 com essa fonte negativa. Quando o 8051 enviar pelo pino TXD um sinal positivo, o transistor
Q1 corta e no pino 2 do conector DB9 surge a tenso de nossa fonte negativa. J quando no pino
TXD surge um nvel baixo, o transistor Q1 conduz, entregando +5 V para o pino de sada. Esse
esquema funciona muito bem quando se trabalha com distncias pequenas e no h muito rudo.
9.11. Exerccios Resolvidos.

A seguir, apresentamos diversos exerccios resolvidos que pretendem demonstrar o


emprego da porta serial e do CT1 na gerao de baud rate. Em todos esses exerccios
suposto que o C faa uso de um relgio de 11,0592 MHz.

Escreva uma rotina que faa o 8051 transmitir continuamente os caracteres ASCII de A at Z.
Use a taxa de 9600 bauds e um bit de parada.

Soluo:

Como foi pedido somente um bit de parada e no estamos usando paridade, devemos empregar o
modo 1, pois assim obtemos o trem de bits da figura 9.9. Vamos gerar a taxa de transmisso (baud
rate) com o CT1 programado para operar no modo 2. O valor do divisor N calculado com o uso da
equao 9.6, que resulta no valor de recarga: 256 3 = 253. Note que zeramos o bit dobrador de
velocidade (SMOD).
Note que nos aproveitamos do fato dos caracteres ASCII das letras de A at Z estarem em
seqncia. Como incrementamos o acumulador aps cada escrita no SBUF, varremos todos os
caracteres. Devido a esse incremento, logo aps a transmisso do caracter Z, o acumulador ficar
igual ao prximo caracter depois do Z, que Z+1 (o montador faz essa conta). Um outro ponto a
ser observado que no podemos fazer escrita no SBUF enquanto no terminar de transmitir o byte
anterior. Um novo byte escrito em SBUF somente aps a ativao do bit TI.

Como pode ser notado no exerccio anterior, o C fica completamente consumido na tarefa de
escrever o caracter no SBUF e aguardar sua transmisso. Escreva um programa que resolva o
exerccio anterior com o uso de interrupo, liberando o C para outras tarefas.

Soluo:

Vamos aproveitar tudo que foi calculado para o exerccio resolvido 9.1 e fazer uso do recurso de
interrupes. Com a interrupo serial habilitada, o programa principal interrompido aps a
transmisso de cada byte. Aps preparar o CT1, a porta serial e as interrupes, a primeira
interrupo forada ao fazermos SETB TI. Com isso, a transmisso iniciada. Como no temos
recepes, a rotina de servio da interrupo serial no checa o valor de RI e apaga apenas TI. Note
que o programa principal ficou parado num lao infinito, que poderia ser o lao principal de um
programa.
Este exerccio, que faz uso da figura 9.22, semelhante ao exerccio resolvido 8.6, cujo objetivo foi
construir um cronmetro que trabalhe de 00,0 at 59,9 segundos, ou seja, um cronmetro de segundos
com preciso de dcimos de segundo. Via porta serial, operando a 9.600 bauds, sem paridade e com
um bit de parada, chegam os comandos de Correr, Parar e Zerar, identificados respectivamente pelos
cdigos ASCII de C, P e Z. Alm disso, a cada dcimo de segundo, devem ser enviados pela porta
serial os trs dgitos exibidos no mostrador, usando o formato #XXX, onde o smbolo # serve
para indicar o incio do campo. A leitura deve ser enviada pela porta serial mesmo quando o
cronmetro estiver parado.

Programe o software responsvel pelo gerenciamento deste sistema.

Soluo:

A soluo deste exerccio aproveita bastante o que foi apresentado para o exerccio resolvido 8.6,
mas preciso substituir os comandos que eram feitos via teclas. A rotina de servio da interrupo
serial ser responsvel por receber esses comandos (C, P e Z) e tambm por enviar o valor do
cronmetro. Uma mudana muito grande que agora o cristal trabalha na freqncia de 11,0592
MHz. Para gerar interrupes a cada 10 ms, vamos programar para 9.216 contagens, como mostrado
na equao 9.7, e assim o valor de recarga do contador/temporizador ser 56.320.

A cada vez que os contadores do cronmetro forem incrementados, a flag TI ser ativada para assim
iniciar a transmisso serial. Um problema interessante o de enviar a leitura do cronmetro via porta
serial. Para isso, ser usado o contador CONT, que indica qual dgito deve ser enviado, como
mostrado a seguir.

CONT = 0 faz TI = 0, envia # e incrementa CONT


CONT = 1 faz TI = 0, envia SEG10 e incrementa CONT
CONT = 2 faz TI = 0, envia SEG e incrementa CONT
CONT = 3 faz TI = 0, envia D_SEG e incrementa CONT
CONT = 4 faz TI = 0 e CONT = 0

O CT1, no modo 2, ser usado para gerar os 9.600 bauds da porta serial e seu valor de recarga (253)
foi calculado no exerccio resolvido 9.1 (vide equao 9.6).
Quando se trabalha com cabos seriais longos, como os de 1 km, sempre fica a dvida sobre a
possibilidade de erros durante a comunicao. Uma boa maneira de verificar a possibilidade de
erros empregar um C para transmitir e receber pelo cabo, como mostrado na figura 9.23. Escreva
um programa que, empregando interrupes, execute 1.000 ensaios para verificar a possibilidade de
erros em um cabo serial operando em 28.800 bauds. O teste dever ser feito com os bytes 55H e
AAH e a quantidade de erros dever estar disponvel no DPTR.
Soluo:

Os bytes 55H (0101 0101B) e AAH (1010 1010B) so indicados para ensaios de transmisso, pois
apresentam intensas variaes de 0 e 1. O programa muito simples e consiste em transmitir um byte
e receb-lo de volta, verificando se retornou o que foi transmitido. Cada vez que houver um erro,
incrementamos o DPTR. Tudo ser feito por interrupo e o programa principal ficar preso em um
lao infinito. Para trabalhar a 28.800, ser necessrio usar a recarga de 255 (256 1), como
calculado na expresso 9.8.
9.12. Exerccios.

9-1) Na seo 9.8, estudamos alguns cuidados que se deve ter com a seleo do cristal e
da velocidade de uma porta serial. Suponha que voc tenha que trabalhar com a porta
serial usando a velocidade de 9.600 bps e que haja a disponibilidade de dois cristais: 4
MHz e 3,575611 MHz. Qual deles voc escolheria? Justifique sua resposta. Observao:
esses dois cristais so facilmente encontrados no mercado, sendo que o segundo a
freqncia da portadora de cor para o nosso sistema a cores: PAL/M.

9-2) O clculo do baud rate para o 8031 est reapresentado na equao 9.9,
considerando SMOD = 0. J para o PC, o clculo feito com a equao 9.10. Supondo
um 8031 com cristal de 12 MHz, calcule a maior taxa de transmisso que pode ser
empregada na comunicao com o PC. Tolere um erro mximo de 25% (da janela de um
bit) ao final do trem de bits.

9-3) Escreva um programa que transmita continuamente pela porta serial os nmeros de 0 at 9,
seguidos pelas letras de A at Z e depois pelas letras de a at z, voltando a transmitir de "0"
at "9", e assim continuamente. Deve-se usar 9.600 bauds, 8 bits de dados, sem paridade e um bit de
parada (cristal = 11,0592 MHz).

9-4) Repita o programa anterior, mas garantido que se transmitam rigorosamente 100 caracteres por
segundo. Sugesto: faa uso do contador temporizador 0.

9-5) Repita o programa anterior, mas fazendo uso exclusivamente de interrupes. Deixe o programa
principal num lao infinito.

9-6) O exerccio resolvido 9.4 apresentou um esquema para verificar erros num cabo serial longo.
Repita esse exerccio, mas considerando que a quantidade de erros deva ser exibida
instantaneamente num mostrador semelhante ao que foi apresentado no exerccio resolvido 9.3.

9-7) Considerando o esquema apresentado no exerccio resolvido 9.4, escreva um programa que
determine a mxima taxa de transmisso que pode ser empregada com um determinado cabo. O
programa deve iniciar com a taxa de 600 bps e fazer diversos ensaios de transmisso, sendo cada
ensaio realizado com uma taxa mais alta. O limite surge quando um ensaio acusar erros. A mxima
taxa de transmisso indicada pelo valor do divisor, que apresentado num mostrador semelhante
ao do exerccio resolvido 9.3.

9-8) Uma forma de verificar-se a confiabilidade de um canal de comunicao serial extremamente


longo com o emprego de um repetidor, como mostrado na figura 9.24. O 8031 central transmite
um byte, que ecoado pelo 8031 repetidor, recebido de volta e comparado com o valor que foi
transmitido. O ensaio dever ser feito com 200 transmisses da seqncia: 0, 1, ..., 199. Escreva os
programas a serem carregados nos dois C. A quantidade de erros deve apresentada num mostrador
semelhante ao do exerccio resolvido 9.3, disponvel no 8031 Central.

9-9) Considerando o esquema apresentado no exerccio 9-8, escreva um programa que determine a
mxima taxa de transmisso a ser empregada. O programa deve iniciar com a taxa de 600 bps e fazer
ensaios de transmisso, sendo cada ensaio realizado com uma taxa mais alta. O limite surge quando
um ensaio acusar erros. A mxima taxa de transmisso indicada pelo valor do divisor, que
apresentado num mostrador semelhante ao do exerccio resolvido 9.4, disponvel no 8031 Central.
Cuidado! Crie um mecanismo para que os dois C mudem sua velocidade de transmisso de forma
sincronizada.

9-10) Escreva um programa para o 8031 que leia um teclado de 12 teclas, semelhante ao do
exerccio 6.27, e transmita pela porta serial o cdigo da tecla acionada.

9-11) Escreva um programa que gere uma onda quadrada pelo pino P1.7, cujo perodo seja um
parmetro recebido pela porta serial.

9-12) Supondo a existncia de quatro escravos, com endereos de 0 at 3, escreva uma rotina que
permita que os escravos recebam dados enviados pelo mestre.

9-13) Para as suposies do problema anterior, escreva uma rotina para o 8051 mestre que oferea
duas funes: funo endereo e funo dado. A funo endereo recebe como parmetro o endereo
do escravo a ser selecionado. A funo dado transmite um byte para o escravo selecionado.
9-14) Este um exerccio que faz uso simultneo de diversos recursos do 8051, por isso mesmo, ele
um pouco longo, mas seu estudo compensador. O objetivo escrever rotinas para o controle de
velocidade de um motor de corrente contnua.

Um motor de corrente contnua (motor CC) oferece muito mais torque e velocidade que um motor de
passo. Por outro lado, pede um controle um pouco mais sofisticado. A figura 9.25 foi desenhada a
partir do CI L298, que apresenta uma ponte H para controle de motores CC. Se os transistores Q1
e Q4 estiverem ligados, diz-se que o motor est girando no sentido normal (positivo). J com os
transistores Q3 e Q2 ligados, o giro ser no sentido reverso (negativo). Os diodos D1, D2, D3 e D4
devem ser adicionados externamente e tm a funo de proteger os transistores das altas tenses
geradas quando se corta a energia das bobinas do motor.

O controle dos transistores feito com uma habilitao, identificada por EN e duas entradas,
denominadas IN1 e IN2. Se EN = 0, todos os transistores esto desligados e, com isso, o motor est
livre. Mas, com EN = 1, controla-se o sentido da rotao do motor atravs das entradas IN1 e IN2. A
tabela a seguir resume as possibilidades de operao.

A maneira mais fcil de se controlar a velocidade de rotao de um motor CC atravs da


modulao por largura de pulso, designada pela sigla PWM (Pulse Width Modulation). Pode-se
trabalhar com perodo de 100 ms e com resoluo de 100 divises. Em outras palavras, a resoluo
fica sendo de 1 ms. A figura 9.26 ilustra quatro situaes da modulao PWM. Com modulao de
0%, o motor est parado (livre). Com modulao de 100%, o motor est na velocidade mxima.
Entre 0% e 100%, convencionamos 100 passos, disponibilizando assim diversos valores
intermedirios de rotao.

Para monitorar a velocidade de rotao do motor, foram montados um disco com 20 raias, em seu
eixo, e um acoplador ptico. Quando o motor gira, esse disco tambm gira, interrompendo o feixe
luminoso do acoplador ptico, gerando assim pulsos. O espaamento entre os pulsos traz a
informao da velocidade do motor. Vide a figura 9.27.

O esquema de todo o sistema est apresentado na figura 9.28, que ser detalhada a seguir.

Pela entrada SERIAL IN (operando a 9.600 bits por segundo, 8 bits de dados e 2 bits de parada), o
sistema recebe o valor da percentagem de modulao (PWM), em complemento 2. Por exemplo, +20
significa 20% de modulao e rotao no sentido positivo e 30 significa 30% de modulao e
rotao no sentido negativo. Os limites so: -100% PWM +100%.
Os pulsos gerados pelo disco raiado e pelo acoplador ptico so apresentados na entrada da
interrupo externa 0. Assim, essas interrupes so usadas para medir o intervalo de tempo T,
com preciso de microssegundos.

Pela sada SERIAL OUT, o sistema constantemente informa, em microssegundos, o espaamento


T entre os pulsos do acoplador ptico. preciso usar uma formatao com 3 bytes: #, MSB(T) e
LSB(T).

Os leds D1 e D2 indicam ao operador o sentido de rotao. Quando os dois estiverem apagados, h a


indicao de que o motor no est alimentado ou ento que foi freado.

As chaves SW1 e SW2, consideradas ideais, servem para que manualmente o operador aumente ou
diminua o ndice de modulao do PWM. A chave CH1 incrementa o valor do PWM em direo ao
+100, enquanto que a chave CH2 decrementa o valor do PWM. Por exemplo, se PWM = -3% e a
chave CH1 for acionada 7 vezes, teremos PWM = +4%. Lembre-se de que os limites so:100
PWM +100.

Os sensores SA, SB e SC monitoram diversas variveis do motor, que deve ser freado sempre que
ocorrer a condio:

Sugesto de algumas diretivas de assembly e estrutura de programa a serem empregadas na soluo


deste exerccio:
10. Pinagem e Temporizao

Aps termos estudado todos os recursos internos do microcontrolador, chegou o momento


de dedicarmo-nos sua conexo com o mundo exterior. Neste captulo, descrevemos os
pinos do 8051 e suas funes. Depois, ao abordarmos os ciclos de barramento, vemos a
seqncia e a temporizao dos sinais gerados atravs desses pinos. Para terminar,
fazemos um estudo do sinal de reset e da eletrnica necessria para ger-lo.

Todo microcontrolador ou microprocessador se comunica empregando sinais eltricos que


so enviados ou recebidos atravs seus pinos. atravs desses pinos que o processador
transaciona com o mundo exterior como, por exemplo, na leitura de uma posio da RAM
externa ou na escrita em um conversor digital-analgico. Pelo termo pinagem, entendemos
como sendo a descrio da funo de cada um desses pinos. Pelo termo temporizao,
entendemos como sendo a descrio temporal dos sinais presentes nos diversos pinos do
processador. O encapsulamento define a geometria desses pinos. Diversos tipos de
encapsulamento so empregados para os membros da famlia 8051, incluindo para
montagem em superfcie. Para nossos objetivos, dois encapsulamentos so interessantes:
o DIP 40 e o PLCC 44.

O termo DIP (Dual In Line Package) o encapsulamento mais comum. Este


encapsulamento composto por duas linhas de 20 pinos. O espaamento entre os pinos
de 0,1 polegada e as duas linhas de pinos esto separadas por 0,6 polegada. A pinagem
para esse encapsulamento est indicada na figura 10.1-(a). Outro encapsulamento
empregado o PLCC (Plastic Leadless Chip Carrier), que no faz uso de pinos
pontiagudos. O PLCC 44 est apresentado na figura 10.1-(b). O uso de um ou outro
encapsulamento uma deciso do projeto e pode depender da disponibilidade no
mercado, sendo que tambm se deve levar em conta o espao disponvel na placa.

Como pode ser visto pela figura 10.1, existe uma grande quantidade de pinos e alguns deles com
duplas funes. Nessa figura, omitimos a indicao dos pinos que se destinam gravao da EPROM
ou memria flash interna. atravs desses pinos que o C faz suas transaes com o mundo exterior,
ou seja, para ler a memria de programa externa, para ler ou escrever na RAM externa, ou ainda para
acionar dispositivos perifricos.

Para conectar ao C memrias externas e diversos dispositivos perifricos, faz-se uso de


barramentos. Existem dois barramentos muito importantes: o barramento de endereos e o
barramento de dados. O barramento de endereos um barramento unidirecional, por onde o C
indica o endereo a ser acessado. No caso do 8051, ele composto por 16 sinais nomeados A0, A1,
..., A15. J o barramento de dados bidirecional, pois serve para o C enviar ou receber dados.
Como o 8051 trabalha com bytes, esse barramento composto por 8 sinais, nomeados D0, D1, ...,
D7. A cadncia dos sinais que o C usa por esses barramentos recebe o nome de ciclo de
barramento. Veremos trs ciclos de barramento: leitura de memria de programa externa, leitura da
memria de dados externa e escrita na memria de dados externa.

O estudo desses ciclos de barramento feito com o emprego de diagramas de tempo que, tomando
como referncia o oscilador do C, indicam o instante exato em que cada sinal acionado. Antes de
iniciar o estudo dos barramentos e dos ciclos de barramentos, vamos fazer uma descrio completa
dos pinos do 8051.
10.1. Descrio dos Pinos 8051.

Para efetuarmos essa descrio, tomaremos como base o encapsulamento DIP 40, como
mostrado na tabela 10.1. Note que diversos pinos tm mltiplas funes e, no caso de
dvidas, convm reestudar o captulo 6. A porta P3 (pinos 10 a 17) apresentada duas
vezes: uma vez como uma porta paralela de 8 bits e noutra vez detalhando as funes
alternativas de cada um de seus pinos. A capacidade de acionamento das portas
indicada atravs de cargas TTL LS, tomando com base o manual do C 8051 da Intel.
Para verificar a capacidade de carga de outros microcontroladores, convm consultar o
manual do fabricante.
Vamos agora abordar, de maneira muito simples, os passos executados pelo C para realizar
transaes com as memrias externas. A primeira transao que vamos abordar a busca, na
memria de programa, da prxima instruo para ser executada. Essa operao recebe o nome de
fetch. Para inici-la, o C envia o endereo. Em seguida, gera o sinal #PSEN para indicar que uma
leitura na memria de programa externa. Depois de algum tempo, l pela porta P0 o dado que foi
entregue pela memria. Algo semelhante acontece na leitura da memria de dados externa, mas com o
emprego do sinal #RD. J para a escrita na memria de dados externa, aps enviar o endereo, C
envia o dado e um pulso #WR para indicar memria que se trata de uma operao de escrita.
Detalhamos a seguir cada uma dessas operaes, os diagramas de tempo e os ciclos de barramento.
10.2. Ciclos de Barramento.

Aproveitamos agora para definir os conceitos de Ciclo de Instruo (Instruction Cycle) e


de Ciclo de Mquina (Machine Cycle). No captulo 3, quando abordamos o conjunto de
instrues, vimos que algumas instrues consumiam diversos ciclos de mquina em sua
execuo.

Como j estudamos, no caso do 8051, um MC corresponde a 12 perodos de relgio. Algumas


instrues, como por exemplo INC A, consomem um MC na sua execuo, enquanto que outras, como
a INC DPTR, consomem dois MC. Na maioria das vezes, o Ciclo de Mquina se confunde com Ciclo
de Barramento.

O ciclo de barramento apresentado atravs de diagramas de tempo que mostram o instante exato em
que cada passo executado e as restries de tempo a serem atendidas pelos diversos dispositivos
conectados ao barramento. Existem dois tipos de barramentos: os sncronos e os assncronos. Todos
os ciclos de barramento do 8051 so sncronos e tomam o relgio do processador como referncia.
Os barramentos assncronos no possuem um relgio para marcar o instante de cada passo. Um
exemplo de barramento assncrono o usado para comunicar nosso computador pessoal com a
impressora.

No caso do 8051, vamos estudar trs ciclos de barramento:

leitura de uma instruo (fetch) na memria de programa externa (#PSEN);


leitura de um dado na memria de dados externa (#RD) e (#PSEN);
escrita de um dado na memria de dados externa (#WR).

Os ciclos listados acima so caracterizados pelos sinais de controle mostrados entre parnteses.
muito importante sabermos que esses sinais, #PSEN, #RD e #WR, so mutuamente exclusivos, ou
seja, em cada ciclo, somente um deles pode estar ativo. O projeto do C garante isso. So esses
sinais que indicam o tipo de ciclo de barramento em execuo e, claro, s possvel realizar um
tipo ciclo por vez. Assim, nas prximas figuras, desenhamos, desses trs sinais, apenas aquele que
estiver ativo. Fica subentendido que os outros dois esto desativados (nvel alto).

Para compreendermos os conceitos que sero abordados, conveniente lembrar que o contador de
programa, representado pela sigla PC (Program Counter), tem a funo de indicar o endereo da
prxima instruo a ser executada. Enquanto o C estiver executando uma instruo, o PC j contm
o endereo da prxima instruo. Note que, cada vez que C busca por uma instruo (fetch) o PC
automaticamente incrementado. Vale lembrar que existe instruo cujo opcode possui vrios bytes,
por isso, o mais correto afirmar que o PC sempre aponta para o primeiro byte da prxima instruo
a ser executada. J os acessos memria de dados externa usam como ponteiro de endereos o
registrador DPTR. Esses dois registradores (PC e DPTR) so registradores de 16 bits. Para fazer
referncias s suas pores de 8 bits, a poro menos significativa ser indicada pela letra L e a
mais significativa pela letra H. A figura 10.2 apresenta essa idia.

Para buscar as instrues a serem executadas, o C realiza o ciclo de barramento de leitura da


memria de programa externa, apresentado na figura 10.3. claro que, quando se acessam programas
na ROM interna, tais ciclos no so executados, pois o pino #EA deve estar ligado ao Vcc. O fato de
se usar uma memria de programa externa implica em consumir as portas P0 e P2.

preciso alertar que a figura 10.3, assim como as prximas figuras, tm uma finalidade didtica e
por isso foram omitidos os tempos de subida e de descida dos sinais. Alm disso, no houve a
preocupao de indicar eventuais restries de tempo entre esses sinais. Entretanto, ela suficiente
para a maioria dos projetos. Caso o sistema a ser desenvolvido possua severas restries de tempo,
o manual do fabricante deve ser consultado.

Passemos a abordar alguns detalhes da figura 10.3, que foi desenhada para o 8051 tpico. Deve ser
notado que um Ciclo de Mquina corresponde a 12 perodos do relgio (XTAL). Cada ciclo de
mquina dividido em 6 estados que, na figura, esto denominados E1, E2, ..., E6. Cada estado
formado por duas fases: F1 e F2. Essa diviso em ciclo de mquina, estados e fases usada na
especificao de todas as transaes de barramento efetuadas pelo 8051.
Vamos estudar com cuidado o diagrama de tempo da figura 10.3 e apontar detalhes que no
acontecem nos demais ciclos. Comecemos com a compreenso do que buscar uma instruo na
memria de programa externa. O endereo da prxima instruo est no PC e necessrio enviar
esse endereo para indicar a posio que se deseja acessar, junto com o comando de leitura, que no
caso o #PSEN. Pode parecer um pouco estranho, mas apesar do ciclo comear com E1/F1, nesse
intervalo ainda temos a leitura dos dados relativa ao ciclo anterior (note #PSEN em nvel baixo). Em
E1/F2, o C coloca o sinal ALE em nvel alto para avisar que vai comear a enviar o endereo da
posio a ser acessada, ao mesmo tempo em que coloca #PSEN em nvel alto para terminar o resto
da operao de leitura realizada pelo ciclo anterior. No perodo E2/F1, so enviados pela porta P0
os bits menos significativos do endereo (PCL) e, por P2, os bits mais significativos (PCH). Em
E2/F2, o C coloca o sinal ALE em nvel baixo para indicar que em breve ir usar a porta P0 para
ler o dado da memria de programa. Esse flanco de descida do sinal ALE muito importante, como
veremos mais adiante. Aqui termina a chamada fase de endereos.

Note que, enquanto o contedo de PCL permanece presente em P0 por apenas dois perodos de
relgio (E2/F1 e E2/F2), o contedo de PCH permanece estvel por seis perodos (de E2/F1 at
E4/F2). Em E3/F1 e E3/F2, o sinal #PSEN colocado em nvel baixo para indicar memria de
programa que ser realizada uma operao de leitura, enquanto que a porta P0 liberada, ficando no
estado de alta impedncia, pois ser por essa porta que a memria entregar o dado. Em E4/F1, ALE
e #PSEN so mantidos em nvel baixo. durante esse intervalo de tempo que o C l o dado atravs
da porta P0, recebendo assim o dado entregue pela memria. Na figura 10.3, essa leitura est
marcada pela sigla LD. Note que, em E4/F1, termina a leitura, ao mesmo tempo em que inicia a fase
de endereos da prxima leitura. Vemos assim que, em um ciclo de mquina, o 8051 realiza duas
leituras na memria de programa.

Um ponto que precisa de ficar muito claro que esse ciclo de barramento, por ser sncrono, tem
todas suas etapas muito bem definidas. Para a leitura que se iniciou em E1/F1, o C espera que a
memria entregue o dado solicitado, no mximo, at o incio de E4/F1. Durante o perodo E4/F1, o
C faz a leitura de P0, quer a memria tenha respondido ou no. Se a memria era rpida e conseguiu
entregar o dado, timo! Se a memria era lenta e no conseguiu entregar o dado, o C l a porta P0 e
interpreta como instruo o dado que obteve. Note que a velocidade da memria (o termo correto
tempo de acesso) muito importante. A memria pode responder antes, mas nunca depois. Esse ciclo
apresentado na figura 10.3 se repete indefinidamente, sendo interrompido somente pelos ciclos de
acesso memria de dados externa.

Esse perigo de perder dados devido a um dispositivo lento no existe no barramento assncrono,
onde preciso que os participantes avisem o momento do envio e do recebimento dos dados. Essa
confirmao recebe o nome de handshake. primeira vista, o barramento assncrono pode parecer
superior, entretanto, ele exige uma quantidade maior de conexes, sendo que os participantes devem
ter inteligncia suficiente para responder ao handshake. A deciso de se usar barramento sncrono ou
assncrono est ligada a restries do projeto, pois ambos oferecem vantagens e desvantagens.

A memria de dados externa somente lida por exigncia de uma instruo. Vamos supor que a
leitura (fetch) do opcode, realizada no perodo de E1/F2 at E4/F1, recebeu o byte E0H,
correspondente instruo MOVX A,@DPTR. Essa uma instruo que l, na memria de dados
externa, o endereo apontado pelo DPTR, entregando o resultado no acumulador. Assim, o prximo
ciclo, que continua em E4/F2 ser o de leitura da memria de dados externa, como mostrado na
figura 10.4. Lembremos que o endereo a ser lido fornecido pelo DPTR, vide figura 10.2.

Como, nos estados E1, E2, E3 e E4, foi capturada uma instruo de leitura da memria de dados, o
ciclo relativo a essa leitura comea em E4. Lembremos que existe uma pequena superposio nesses
dois ciclos, pois a instruo que solicita a leitura verdadeiramente capturada em E4/F1. Em E4/F2,
o C coloca os sinais #PSEN e ALE em nvel alto, pois vai iniciar a fase de envio de endereo,
porm agora o endereo fornecido pelo DPTR. O byte mais significativo do endereo, o contedo
de DPH, enviado pela porta P2 e permanece estvel durante todo o ciclo. J o byte menos
significativo, o contedo de DPL, est disponvel durante E5/F1, E5/F2 e E6/F1. Note que, no incio
de E5/F2, o sinal ALE colocado em nvel baixo. Esse flanco importante e ser estudado mais
adiante. No incio de E1/F1, o sinal #RD colocado em nvel baixo para indicar memria de
dados que se trata de uma operao de leitura. At o incio do perodo E3/F1, a memria dever
disponibilizar o dado, pois, durante esse perodo, o C ir ler o contedo de P0. Note que o ciclo de
acesso memria de dados muito maior que o de acesso memria de programa, ou seja, a
memria de dados possui mais tempo para responder. Isso acontece porque, na famlia 8051, os
dispositivos de perifricos trabalham como se fossem posies de memria de dados e esses
dispositivos nem sempre so rpidos.

Existe uma instruo de leitura da memria de dados externa que emite um endereo de apenas 8 bits
(os 8 bits menos significativos), originados do registrador R0 ou R1. a instruo MOVX A,@Ri.
Tudo se passa de forma semelhante ao que est na figura 10.4. Entretanto, o contedo de Ri ser
emitido por P0, sendo que a porta P2 permanece com seu contedo anterior. Note ento que o
endereo de 16 bits formado pelo contedo de Ri e pelo que o usurio programou na porta P2, vide
exerccio 10-2. Mantendo P2 fixa, possvel varrer 256 endereos distintos.

A memria de dados externa somente escrita por exigncia de uma instruo. Vamos supor que a
leitura realizada no perodo de E1/F2 at E4/F1 recebeu o byte F0H, que corresponde instruo
MOVX @DPTR,A, que uma instruo que escreve o contedo do acumulador na memria de dados
externa, no endereo apontado pelo DPTR. Assim, a prxima etapa, que inicia a partir de E4/F2, ser
a de escrita na memria de dados, como mostrado na figura 10.5. Lembremos que o endereo a ser
escrito fornecido pelo DPTR, vide figura 10.2.

As etapas do ciclo de escrita na memria de dados externa so muito semelhantes s da leitura, sendo
que se usa o sinal #WR. A diferena est na porta P0. Veja que o LSB do endereo fornecido
durante os perodos E5/F1, E5/F2 e E6/F1, porm, at o trmino do ciclo, o C usa essa porta para
entregar o dado a ser escrito. Normalmente, a memria usa o flanco de subida do sinal #WR para
efetivar a escrita. Note que, como o barramento sncrono, existe o compromisso de que a memria
escreva o dado at o trmino do perodo E4/F2. Um ponto interessante que, neste ciclo recm
estudado, todos os sinais so gerados pelo C.

Assim como no ciclo de leitura, existe tambm uma instruo de escrita na memria de dados externa
que emite um endereo de apenas 8 bits (os 8 bits menos significativos). a instruo MOVX @Ri,A.
Tudo semelhante ao que est na figura 10.5. Como vimos na seo anterior, o endereo de 16 bits
formado pelo contedo de Ri e pelo que o usurio programou na porta P2, vide exerccio 10.2.
10.3. Instrues e Ciclos de Barramentos.

Alguns leitores devem ter feito a seguinte conta: se a instruo mais rpida consome um
MC em sua execuo e o C l duas instrues por cada MC, no fica sobrando uma
instruo? Outros devem estar se perguntando sobre o que acontece com o barramento
quando a instruo consumir em sua execuo quatro MC, como o caso da multiplicao
(MUL A,B). Vamos agora estudar esses aspectos.

Iniciamos lembrando que o C, assim como qualquer processador, uma mquina de


estados que est sempre executando as fases: busca da instruo, decodificao da
instruo e execuo da instruo. A todo momento ele est buscando pela prxima
instruo a ser executada e s no faz isso quando estiver lendo ou escrevendo na
memria de dados externa. Com isso, queremos dizer que continuamente h um ciclo de
barramento sendo executado. Aps a busca de cada instruo, o contador de programa
incrementado, passando a apontar para a prxima instruo a ser executada. Estudaremos
as seguir os diversos casos de fetch de instruo.

Para podermos tornar bem claras as idias que sero apresentadas, vamos trabalhar com
a subrotina apresentada a seguir. A explicao desta subrotina simples: supondo que N
seja o contedo de R7, a subrotina calcula N(N+1) e armazena o resultado na posio
1234H da memria de dados externa. Para nosso estudo, vamos supor que executamos
essa rotina com R7 = 32 (20H) e, em conseqncia, o resultado ser 32 x 33 = 1056
(420H). Ao final da execuo, teremos A = 20H, que ser escrito no endereo 1234H, e B
= 04H, que copiado para A e depois escrito no endereo 1235H, pois o DPTR foi
incrementado.
O resultado da montagem da subrotina SROT apresentado logo a seguir. Para aqueles que
encontraram dificuldade em compreender como se faz a montagem de uma subrotina, recomenda-se
um novo estudo da seo 4.2. Com base nessa pequena subrotina, vamos verificar, para algumas
instrues, como so executados os ciclos de barramento. Note que, ao lado das instrues,
enumeramos os ciclos de mquina (MC1, MC2, ..., MC18) para facilitar a referncia ao instante de
execuo de cada instruo.

Comecemos com o caso mais simples, que quando o opcode da instruo possui apenas um byte.
Vamos tomar como exemplo a instruo INC A, cujo opcode 04, que est no endereo 1001H. Isto
significa que, enquanto se executa essa instruo, tem-se PC = 1002H, que o endereo da prxima
instruo. A figura 10.6 apresenta o ciclo de barramento para este caso, que muito semelhante ao
apresentado na figura 10.3.
Note que, em E1/F1, o C recebe o opcode resultante da leitura no endereo 1001H da memria de
programa externa. A figura somente mostra o instante de leitura do opcode 04. Aps essa leitura, o
PC incrementado e passa a apontar para o endereo 1002H. Verifique no programa que, no
endereo 1002H, est o byte 8FH, que o primeiro byte do opcode da instruo MOV B,R7. Assim,
enquanto executa a instruo INC A, que demora um ciclo de mquina (12 perodos de relgio), o C
busca a prxima instruo durante os estados E1, E2 e E3. Como esse intervalo de tempo no
suficiente para terminar a execuo da instruo INC A, a busca realizada no intervalo E1, E2 e E3
descartada e repetida novamente, durante E4, E5 e E6. Como em E6 termina a execuo da instruo
INC A, o C inicia a execuo da prxima. A figura 10.7 apresenta o encadeamento de ciclos de
barramento por ocasio da execuo de duas instrues com opcodes que ocupam apenas um byte.

Observe que a figura 10.7 apresenta dois ciclos de mquina, denominados MC1 e MC2. Durante
MC1, executada a instruo MOV A,R7 (opcode = EFH), que est no endereo 1000H. Como a
execuo dessa instruo gasta um ciclo de mquina, a primeira busca pela prxima instruo
realizada em E2, E3 e E4 descartada. Note que essa busca acontece no endereo 1001H, que
dividido em PCL = 01H e PCH = 10H. O mesmo acontece no segundo ciclo de mquina, sendo
descartada a primeira busca pela prxima instruo (j havamos observado isso na figura 10.6).

Vejamos agora o que acontece quando a instruo a ser executada possui um opcode com dois bytes.
No caso do programa apresentado, o caso da instruo MOV B,R7. Agora, o C busca pelo opcode
da prxima instruo e, de posse desse opcode, descobre que essa instruo usa dois bytes. Assim,
faz um novo acesso memria para buscar o segundo byte do opcode. A figura 10.8 apresenta esse
caso.
A figura 10.8 apresentou MC2, que corresponde execuo da instruo INC A. Note que, durante
essa execuo, a primeira busca pela prxima instruo descartada. No incio de MC3, o C
recebe o byte 8FH e, atravs dele, descobre que essa uma instruo com opcode de dois bytes. Por
isso, faz mais uma leitura na memria de programa, recebendo o byte F0H. De posse desses dois
bytes, ele executa a instruo. Note que, no final de MC3, j se iniciou a busca pela prxima
instruo, no caso MUL AB (opcode = A4), que est no endereo 1004H.

A multiplicao, junto com a diviso, so as duas instrues mais lentas. Cada uma consome quatro
ciclos de mquinas. A figura 10.9 apresenta os ciclos de mquina realizados durante a execuo da
instruo MUL AB, que est no endereo 1004H. Note que, enquanto o C est executando essa
instruo, as buscas pela prxima instruo so descartadas. Essas buscas acontecem no endereo
1005H, que contm o byte 90H, que o primeiro byte do opcode da instruo MOV DPTR,#1234H. A
figura 10.10 apresenta a execuo dessa instruo, que interessante por buscar trs bytes na
memria e, com isso, consume dois ciclos de mquina.

A instruo MOV DPTR,#1234H possui um opcode de trs bytes e por isso ocupa as posies 1006H,
1007H e 1008H. Pela figura 10.10, possvel ver que o C consegue buscar esses trs bytes em 1,5
ciclo de mquina e consome metade de MC9, sendo que a busca que ocorre na outra metade
descartada. Note que essa ltima busca descartada pela instruo MOVX @DPTR,A (opcode F0H),
que faz uma escrita na memria de dados externa, consumindo dois ciclos de mquina.
A instruo MOVX @DPTR,A, na sua execuo, consome dois ciclos de mquina e faz uma escrita na
memria de dados externa. Note que, durante MC10, foi buscado o opcode da prxima instruo
(byte A3H), mas que foi descartado. Assim, a escrita pode ser iniciada em MC10/E5 e terminar em
MC11/E4, consumindo um total de doze perodos de relgio. interessante notar que, durante esse
intervalo, pela porta P0, foi enviado o LSB do endereo (34H) da memria de dados a ser escrita e
depois o dado (20H) que se desejava escrever, enquanto que, pela porta P2, foi enviado o MSB do
endereo (12H). Logo aps o trmino do acesso memria de dados externa, o C retorna busca
pela prxima instruo, que corresponde ao opcode A3H no endereo 1009H.

Vamos agora deter-nos um pouco nos sinais ALE e #PSEN. Note que, se no houver acesso
memria de dados externa, h a gerao de dois pulsos de ALE e #PSEN por cada ciclo de mquina.
Isso eqivale a dizer que esses dois sinais tm uma freqncia igual 1/6 da freqncia do relgio do
processador. O sinal #PSEN uma onda quadrada, enquanto que o ALE possui um ciclo de carga de
1/3, ou seja, fica em nvel alto durante 1/3 do perodo e em nvel baixo o restante. Entretanto,
preciso apontar um pequeno detalhe que ocorre quando se acessa a memria de dados externa. Como
mostrado na figura 10.11, houve a perda de um pulso de ALE e dois pulsos de #PSEN. Em muitos
projetos, possvel usar ALE e #PSEN como relgio para outros circuitos, mas precisamos estar
conscientes de que h perda de pulsos por ocasio de acessos memria de dados externa.

Para finalizar, importante que se diga que toda essa temporizao estudada permanece inalterada
quer a memria de programa seja interna, quer seja externa. Caso se execute a partir de uma ROM
embutida no microcontrolador, tem-se #EA = Vcc e, por isso, o sinal #PSEN no gerado, mas o
pulso de ALE continua a ser emitido. Nesse caso, s haver ciclos no barramento se for executada
uma instruo de acesso memria de dados externa.
10.4. Portas e Ciclos de Barramentos.

O instante em que o microcontrolador acessa os pinos de suas portas paralelas tambm


muito bem determinado em relao ao ciclo de barramento. Vamos agora nos dedicar a
esse estudo, que tem como base a figura 10.12.

Todas vez que se escreve numa das portas paralelas, que na figura est representada pela instruo
MOV Pi,XX, o novo valor somente atualizado ao final do ciclo de mquina daquela instruo. A
figura tambm mostra que as portas so lidas durante E5. As portas P0 e P1 durante E5/F1 e as
portas P2 e P3 durante E5/F2. Isso corresponde a uma leitura para cada ciclo de mquina. Assim,
para termos a certeza de que um determinado sinal seja recebido pelo C, ele deve permanecer ativo
por um perodo de tempo superior a um ciclo de mquina. claro que, se o sinal for sincronizado
com o microcontrolador, seu perodo de ativao pode ser bem menor. Por exemplo, se
conseguirmos garantir que a ativao do sinal desejado somente ocorra durante E4 e que sua
desativao seja posterior a E5, haver a certeza na recepo deste sinal. Entretanto, interessante
tomar cuidado com os atrasos dos circuitos eletrnicos. Esse intervalo de amostragem das portas
explica as limitaes dos contadores CT0 e CT1 quando acionados por suas entradas T0 e T1.
Explica tambm porque a ativao do pedido de interrupo deve ser superior a 12 perodos de
relgio. Quando se usa a porta serial no Modo 0, que o modo registrador de deslocamento, o
relgio para essa comunicao serial sncrona gerado da forma mostrada na figura 10.12.
Terminamos pedindo que o leitor localize o instante que o microcontrolador amostra a entrada de
reset (RST). Este ser assunto da prxima seo.
10.5. Reset.

Quando se energiza um processador, todos seus registradores partem de um estado


aleatrio. Para colocar o processador num estado conhecido, usa-se o recurso do reset. A
ativao da entrada RST leva os registradores do 8051 para os estados listados na tabela
10.2. Note que PC = 0, o que significa que a primeira instruo a ser executada a que
ocupa o endereo 0 da memria de programa. O ponteiro da pilha inicializado com 7, o
que significa que a primeira escrita na pilha acontecer no endereo 8. As portas paralelas
so colocadas em nvel alto e o contedo do buffer serial fica indefinido. Os demais
registradores que cuidam das funes especiais (os SFR) so zerados. Para terminar,
note que a RAM interna no afetada pelo reset, ou seja, ela permanece com os mesmos
valores que possua antes.

Para o C, o reset um sinal assncrono, ou seja, ativado sem tomar conhecimento do seu relgio.
Normalmente, ele ativado pelo usurio. Como j vimos na figura 10.12, o C amostra a entrada
RST uma nica vez a cada ciclo de mquina (fase E5/F2). Isso deixa claro que no importa o
momento da ativao do reset, pois ele s ser percebido durante E5/F2. A figura 10.13 apresenta
detalhes da temporizao do reset. Note que existe uma rea sombreada representando a incerteza do
momento da ativao da entrada RST. Os retngulos marcados com a letra R indicam o instante em
que a entrada lida. Assim, C pode levar at 12 perodos de relgio para detectar a ativao do
sinal de reset.

O 8051 trabalha com um sinal de reset interno, que responsvel por efetivar a inicializao do
microcontrolador. Note que, mesmo depois de ativado o reset, o microcontrolador continua em
atividade por 19 perodos de relgio. Por isso, depois da ativao da entrada RST, a atividade nos
pinos cessa dentro de um perodo que pode variar entre 19 a 31 perodos de relgio. Para a grande
maioria dos projetos, essa incerteza no traz qualquer influncia. Aps a desativao do reset, o
processador leva de 1 a 2 perodos de relgio para iniciar atividade pelos seus pinos.

Para o usurio, muito conveniente que o reset seja automaticamente ativado cada vez que C for
energizado. o que se denomina power on reset. De acordo com o que vimos na tabela 10.1, a
entrada RST deve mantida em nvel alto durante um intervalo de tempo superior a 24 perodos de
relgio. Como todo usurio de computador deve concordar, interessante ter boto para fazer o
acionamento manual do reset. O circuito de reset simples e normalmente o manual do
microcontrolador traz recomendaes. Para o 8051 (HMOS), a sugesto do fabricante est
apresentada na figura 10.14.

A anlise do circuito muito simples. Partimos com o capacitor descarregado. Quando o circuito for
energizado, o capacitor, como est descarregado, se comportar como um curto-circuito,
apresentando nvel Vcc na entrada RST, ou seja, ativando o reset. Depois de algum tempo, o
capacitor se carrega com a tenso Vcc, o que coloca a entrada RST em terra (0 V), garantindo a
desativao do reset. Caso seja necessrio ativar manualmente o reset, usa-se a chave que fecha um
curto atravs do capacitor, descarregando-o. No caso do 8051 construdo com tecnologia CHMOS, o
resistor 8,2 k pode ser omitido, pois nessa porta existe um pull-down interno, sendo que o
capacitor pode ser reduzido para 1 F. Para ter certeza de ativar corretamente o reset de seu
microcontrolador, sempre consulte o manual do fabricante. Para evitar mltiplos disparos do reset,
essa entrada faz uso de um circuito Schimitt-Trigger.
Vamos agora estender um pouco mais a discusso sobre quanto tempo devemos manter ativa a
entrada RST. Deve ser apontado que a tabela 10.1 diz que o reset deve ser mantido ativo durante
pelo menos 24 perodos de relgio, mas j com o oscilador funcionando. Quando energizamos o
8051, o oscilador demora algum tempo para estabilizar, tipicamente 1 ms para um oscilador de 10
MHz e 10 ms para um oscilador de 1 MHz. Alm disso, a prpria fonte que alimenta o circuito
tambm precisa de algum tempo para se estabilizar, tipicamente 10 ms. Vamos considerar um 8051
trabalhando a 1 MHz. Nesse caso, para calcular o intervalo de tempo durante o qual devemos manter
o reset ativado, fazemos a seguinte soma:

Podemos arredondar o valor calculado para 20 ms. Note que esse valor calculado a mnima
durao do sinal de reset. Para termos segurana de sua ativao, podemos colocar uma margem de
100% e trabalharmos com 40 ms. Assim, devemos calcular a constante de tempo RC que garanta
RST ativado durante um intervalo de 40 ms. Para calcular essa constante de tempo, preciso saber o
valor de tenso para transio de 1 para 0 do Schimitt-Trigger que existe na entrada do pino
RST. O fabricante no nos d esse valor, mas podemos confiar que os valores de R e C sugeridos
levam a um reset confivel.

Aproveitamos para sugerir um circuito, consagrado na literatura, que permite calcular com preciso a
durao do reset e oferece sinais para ativar o reset de outros circuitos, tanto em nvel alto quanto
em nvel baixo, mas pede a introduo de um inversor 74LS14, que possui entrada Schimitt-Trigger.
A figura 10.16 apresenta tal circuito, cujo funcionamento descrito a seguir. Note que o capacitor
est conectado ao terra. Assim, por ocasio da energizao, ele trabalha como se fosse um curto para
o terra, gerando nvel baixo na entrada do inversor, que por sua vez entrega nvel alto na entrada RST
do 8051. Enquanto o capacitor se carrega atravs de R1, ele mantm o nvel baixo na entrada do
inversor. Quando atingir Vcc, o capacitor garante nvel alto na entrada do inversor, eliminando o
reset do C.

Quando for necessrio um reset manual, basta acionar a chave CH, que faz a descarga do capacitor
atravs do resistor R2. Esse resistor tem um valor baixo (cerca de 10 ) e sua finalidade evitar a
descarga brusca do capacitor. O diodo D1 foi colocado para agilizar a descarga do capacitor quando
o circuito for desligado. Se no houvesse D1, quando fosse desligada a alimentao, o capacitor se
descarregaria atravs de R1, o que levaria tempo. O diodo D1 fica diretamente polarizado quando
for desligada a alimentao, fornecendo assim um caminho de baixa impedncia para a descarga do
capacitor.

Note que o circuito apresentado oferece sinal de reset ativado em nvel alto (RST) e o mesmo sinal
ativado em nvel baixo (#RST). Vamos agora calcular os valores de R1 e C1 para que tenhamos uma
durao de reset superior a 40 ms. Nesse clculo, usaremos a sigla Vc para designar a tenso sobre o
capacitor. Para facilitar as contas, vamos desprezar a corrente drenada pelo inversor. A equao da
tenso sobre o capacitor, supondo que ele esteja descarregado, dada pela equao 10.1. Note que,
no instante inicial (t = 0), VC = 0 V. Depois de algum tempo (t muito grande), Vc = Vcc. Ao
melhorarmos a equao 10.1 e explicitarmos o produto RC, chegamos equao 10.2.
Do manual do 74LS14, obtemos a informao de que o limiar de tenso na entrada, para a sada
chavear de 1 para 0, de 1,66 V (vide figura 10.18). Temos agora que calcular um par RC que
garanta tenso abaixo de 1,66 V por um perodo de tempo superior a 40 ms. Na equao 10.2, ao
substituirmos t = 40 ms, VC = 1,66 V e VCC = 5 V, temos:

Se escolhermos um capacitor de 10 F, precisaremos de um resistor de 9.914,07 . Podemos


aproxim-lo para 10 k. Usando esses valores de RC, obtemos a curva de tenso sobre o capacitor,
mostrada na figura 10.17. Em 10.17-(a), temos um grfico para o primeiro segundo da tenso sobre o
capacitor. Como era esperado, ela estabiliza em 5 V. J na parte (b) desta figura, temos em detalhe o
intervalo de tempo de 0 s a 0,1 s, onde possvel observar que a tenso atinge um valor em torno de
1,66 V para t = 0,04 s.

Para finalizar esse captulo, vamos fazer um pequeno estudo sobre o inversor Schimitt-Trigger
74LS14. Ele possui uma histerese na entrada, mostrada na figura 10.18. Iniciemos a anlise deste
inversor considerando que a tenso aplicada sua entrada seja 0 V. Neste caso, o nvel lgico na sua
sada igual a 1. Em seguida, vamos aumentando o valor da tenso na entrada. O nvel lgico na
sada permanece em 1 (parte superior do grfico) at que a tenso na entrada atinja o valor de 1,66
V. Nesse ponto, ocorre a transio e a sada vai para nvel 0. Com a tenso na entrada aumentando
acima de 1,66 V, a sada permanece em nvel 0.
Vamos agora considerar que essa tenso de entrada comece a diminuir de valor. A sada permanece
em nvel 0, mesmo quando ela estiver abaixo de 1,66 V. A transio na sada s vai acontecer
quando o tenso na entrada atingir 0,85 V. Nesse ponto, o nvel lgico na entrada muda para 1. Veja
que acontece um fato interessante. Para a sada mudar de 1 para 0 preciso que a tenso na entrada
ultrapasse o valor de 1,66 V e, para a sada mudar de 0 para 1, necessrio que a tenso na entrada
fique abaixo de 0,85 V. Esse comportamento recebe o nome de histerese e o circuito digital que
exibe essa propriedade denominado Schimitt-Trigger. Note que, diferente do que acontece com a
famlia TTL, este inversor no possui uma faixa de tenso proibida.
10.6. Exerccios.

10-1) Desenhe o diagrama de tempo do ciclo de barramento para a leitura da memria de


dados resultante da instruo MOVX A,@R0.

10-2) Desenhe o diagrama de tempo do ciclo de barramento para a escrita na memria de


dados resultante da instruo MOVX @R1,A.

10-3) Desenhe o diagrama de tempo do ciclo de barramento que faz a leitura da memria
de programa com a instruo MOVC A,@A+DPTR e estenda at o prximo ciclo.

10-4) Para a pequena seqncia de instrues apresentada, esboce o diagrama de tempo


relativo instruo MOVX @R1,A. Indique de forma clara o momento e o valor de cada
porta. Qual o resultado final desse conjunto de instrues?

10-5) Esboce a curva de tenso aplicada entrada RST do circuito apresentado na figura 10.14.

10-6) Considerando C1 = 1 F, calcule o valor do resistor R1 para que o circuito da figura 10.16
gere um sinal de reset de 21 ms.

10-7) Considerando C1 = 10 F e supondo que a entrada do inversor 74LS14 consuma 0,5 mA (valor
exagerado), calcule o valor de R1 para gerar um sinal de reset de 40 ms.

10-8) O que acontece com o circuito da figura 10.16 se o valor de R2 for aumentado para 1 k.
Sugesto: calcule a tenso sobre o capacitor enquanto a chave CH estiver acionada. Nesse caso, qual
seria a durao do sinal de reset.
11. Projetos com o 8051

At o presente momento, estudamos diversos tpicos do 8051. Iniciamos com sua


arquitetura interna e seus espaos de endereamento. Depois tornamos claros os
conceitos de RAM interna, registradores para funes especiais (SFR), RAM externa ou
memria de dados externa e ROM externa ou memria de programa externa. Em seguida,
partimos para o estudo das instrues, a programao em assembly e o uso de um
programa montador. Com todos esses conhecimentos, iniciamos o estudo dos recursos
internos, abordando as portas paralelas, as interrupes, os contadores/temporizadores e
a porta serial. Aps todo esse estudo, estamos em condies de iniciar projetos de
sistemas com 8051.

Este captulo pretende abordar diversos tpicos que so fundamentais para os projetos
com este microcontrolador. Estudaremos a construo de barramentos de dados e de
endereos, decodificadores e pequenos dispositivos perifricos de entrada e sada. No
captulo seguinte, estudaremos de forma exaustiva um projeto ilustrativo: a Placa
Pentacontroladora (P5C). Neste projeto, procuramos incorporar diversas solues, com a
inteno de servir como ponto de partida para muitos outros projetos.

Esperamos que este captulo e o prximo componham o diferencial deste livro. A maioria
da bibliografia em portugus sobre 8051 se restringe ao estudo dos recursos internos do
microcontrolador. Tal estudo suficiente quando o sistema a ser construdo simples ou
quando se pretende apenas atender a finalidades didticas. Entretanto, projetos com um
pouco mais de complexidade exigem uma preparao mais abrangente. Pretendemos,
portanto, com estes dois captulos, que o leitor adquira conhecimentos que lhe dem
autonomia nos mais variados projetos.
11.1. Barramentos para o 8051.

Como j vimos, barramentos so conjuntos de linhas condutoras por onde trafegam sinais
de uma determinada espcie. Os barramentos propiciam uma grande arrumao no
projeto, mas como interconectam diversos dispositivos, normalmente demandam uma
carga de corrente considervel. Via de regra, os processadores e microcontroladores no
possuem grande capacidade de corrente, ou seja, no conseguem acionar na velocidade
exigida uma grande quantidade de dispositivos. Para solucionar essa deficincia, usa-se
u m transmiter ou driver (amplificador lgico de corrente) para entregar sinais aos
barramentos. Para receber os sinais que chegam pelo barramento, usa-se um dispositivo
similar, denominado receiver. Para as linhas bidirecionais de um barramento, torna-se
necessrio um transmiter e um receiver que operem juntos, sendo que por isso
denominado transceiver. Quando for preciso armazenar momentaneamente alguns sinais
de um barramento, usa-se o latch. Ao longo deste livro, usaremos o termo buffer de
maneira genrica para designar qualquer dispositivo que repotencialize (amplifique) os
sinais digitais. A figura 11.1 apresenta trs membros da famlia TTL que se prestam para
repotencializar sinais digitais. Os manuais destes componentes so facilmente localizados
na Internet.
Conforme j vimos no captulo anterior, com o objetivo de diminuir a quantidade de pinos do CI, o
8051 faz a multiplexao da porta P0. Por essa porta, hora passam endereos, hora passam dados.
oferecido o sinaL ALE, que serve para indicar o estado dessa porta P0.

Se ALE = 1: P0 usada para entregar endereos (A0, ..., A7)


Se ALE = 0: P0 usada para o trfego de dados (D0, ..., D7)

Esta multiplexao gera um problema pois, quando se trabalham com memrias externas, quer sejam
de programa, quer sejam de dados, preciso entregar a elas linhas de endereos que permaneam
estveis durante todo ciclo de barramento.

Tomemos como exemplo o ciclo de barramento para leitura da memria de programa externa, que
por convenincia est repetido na Figura 11.2. O endereo a ser acessado corresponde aos trechos
marcados com PCH (A8, ..., A15) e PCL (A0, ..., A7). Note que PCH permanece presente durante
todo o ciclo de acesso (E2, E3, E4 ou E5, E6, E1), enquanto que PCL est disponvel durante apenas
dois perodos do relgio (E2/F1, E2/F2 ou E5/F1, E5/F2). Assim, para que a memria possa
trabalhar, preciso armazenar PCL, de tal forma que ele esteja disponvel durante o ciclo de acesso
memria. Para armazenar temporariamente o valor PCL, usa-se um latch (tipicamente o 74LS373).

Como pode ser visto na figura 11.1, o latch 74LS373 fica no modo transparente enquanto G = 1.
Entende-se por modo transparente o fato de na sada serem refletidas todas as alteraes das
entradas. Entretanto, quando se faz G = 0, a sada fica congelada com o ltimo valor. A idia
usar o 74LS373 para armazenar o PCL e deix-lo disponvel durante todo o ciclo de acesso
memria.

Trabalhamos agora um outro conceito importante. Os sinais de um barramento no transicionam de


forma instantnea, j que levam algum tempo para se estabilizarem. Assim, ao se armazenar o valor
de PCL, preciso tomar o cuidado de no capturar essa instabilidade inicial. Isso pode ser
conseguido se a captura de tais sinais ocorrer o mais tarde possvel. Mas, h o perigo de se
provocarem grandes atrasos. Camos ento num dilema: temo que projetar o circuito de forma a
capturar PCL o mais tarde possvel (para evitar a instabilidade inicial), mas, por outro lado,
preciso disponibiliz-lo o mais cedo possvel (para evitar a insero de atrasos). Colocado dessa
forma, parece no haver soluo. Entretanto ela existe e simples, como mostrado na figura 11.3.
Na figura 11.3, a entrada OC do 74LS373 foi aterrada para garantir a sada atravs do isolamento de
trs estados. O importante observar que o sinal ALE foi ligado entrada G do 74LS373. Assim,
quando o 8051 enviar endereo por P0, tem-se ALE = G = 1, ou seja, o latch est no modo
transparente, dando sada s linhas de endereos de A0 A7 o mais cedo possvel. A armazenagem
no latch s vai acontecer com G indo para nvel baixo. Note que o 8051 garante que P0 esteja com o
valor correto de PCL quando ALE desativado (). Nesse momento, o 74LS373 congela suas sadas
com o ltimo valor, que exatamente PCL.

Consegue-se assim garantir que o endereo seja entregue o mais cedo possvel (G = 1) e que a
armazenagem ocorra o mais tarde possvel (G = 0). Na figura 11.2, o flanco descendente de ALE est
assinalado com uma seta, pois este o momento em que o latch deve fazer a armazenagem. Como
regra geral, quando se trabalha com barramentos, deve-se ter em conta que seus sinais demoram para
se estabilizarem e, por isso, eles devem ser capturados o mais tarde possvel.

Ainda na figura 11.3, possvel observar que se construiu o Barramento de Endereos (A0, ...,
A15) a partir das sadas do 74LS373, s quais foram adicionadas as sadas da porta P2. O
barramento de endereos fica estvel durante todo ciclo de acesso, garantindo o correto
funcionamento das memrias. Essa soluo muito usada para sistemas pequenos. Entretanto, quando
a quantidade de dispositivos conectada ao C for muito grande, pode ser que o barramento fique
carregado e que a porta P2 no tenha capacidade de corrente suficiente. Nesse caso, necessrio
adicionar um buffer porta P2. Como buffer, possvel empregar um 74LS244, mas, para ficar
elegante e evitar a adio de um CI de tipo diferente, usa-se um segundo 74LS373. Essa soluo est
apresentada na figura 11.4. preciso notar que esse CI tambm est conectado ao ALE, mas ser que
essa conexo realmente necessria? Veja o exerccio 11-1.

A figura 11.4 apresenta a construo de um barramento de endereos (BA0, ..., BA15)


completamente repotencializado. Note que, para marcar que existe um buffer nas linhas de
endereos, aos seus nomes adicionamos letras B. Essa uma boa prtica de projeto, pois evita
duplicidade nos nomes das linhas. Novamente, enfatizamos que essa repotencializao completa s
deve ser empregada quando existir uma grande quantidade de dispositivos conectados ao barramento
de endereos. Em boa parte dos casos, a soluo apresentada na figura 11.3 j suficiente.

Abordamos agora o Barramento de Dados, pois preciso criar um barramento por onde trafegaro
os dados. Novamente, existem duas solues. Quando o sistema projetado for pequeno, pode-se usar
a prpria porta P0 como barramento de dados, porm, nos demais casos, ser necessrio adicionar
um buffer. O uso direto da porta P0 como barramento de dados costuma causar estranheza entre os
leitores, pois, por essa porta, hora trafega endereo e hora trafega dado. Entretanto, preciso notar
que o instante dedicado ao trfego dos dados muito bem caracterizado pelos sinais #PSEN, #RD e
#WR. Assim, se o dispositivo com o qual o C vai se comunicar for bem comportado, ou seja, se o
dispositivo no enviar dado na hora errada, no haver a necessidade de demultiplexar P0. Essa
soluo est apresentada na figura 11.5, que muito semelhante figura 11.3. Na figura 11.5,
apresentamos ento a construo do barramento de endereos (A0, ..., A15) e do barramento de
dados (AD0, ..., AD7), que deve ser suficiente para atender aos pequenos projetos.
O projeto do barramento de dados muito importante, pois podemos afirmar que todos os
dispositivos presentes num sistema microcontrolado esto conectados a esse barramento. Vejamos
agora como construir um barramento de dados para sistemas com uma maior quantidade de
componentes e, portanto, que demanda o emprego de buffers. preciso lembrar que, enquanto o
barramento de endereos unidirecional, o barramento de dados bidirecional. Assim, o buffer a
ser empregado neste barramento tambm precisa de ser bidirecional. Na figura 11.1, constatamos que
o transceiver 74LS245 adequado a essa tarefa. A figura 11.6 apresenta a soluo para completa
repotencializao dos barramentos de dados e de endereos. Foi necessrio usar uma porta E para
garantir que o 74LS245 trabalhe na direo correta tanto para as operaes de leitura na memria de
programa externa (#PSEN) como para as operaes de leitura na memria de dados externa (#RD).
Agora, o barramento de dados est marcado com as letras BD0, ..., BD7 para indicar que so sinais
aps o buffer.
Vimos que o barramento de dados serve para viabilizar a comunicao entre o C e os perifricos.
Quando usamos um buffer nesse barramento, devemos garantir que o buffer esteja habilitado no
sentido C perifricos, durante a maior parte do tempo. A habilitao no sentido C
perifricos s deve acontecer quando for necessrio, ou seja, apenas no momento das operaes de
leitura. As operaes de leitura so indicadas pelos sinais #PSEN e #RD e as operaes de escrita
so assinaladas pelo sinal #WR.

Em cada ciclo de acesso, apenas um desses trs sinais estar em nvel baixo, sendo que os demais
estaro em nvel alto. Isso foi aproveitado no esquema da figura 11.6, onde o controle DIR do
74LS245 colocado em nvel baixo (C perifricos) nas operaes de leitura: #PSEN = 0 ou
#RD = 0. Nas operaes de escrita, #WR = 0 e, em conseqncia, #PSEN = 1 e #RD = 1, o que
garante DIR = 1, levando o 74LS245 a operar no sentido C perifrico. O pino G, que controla o
isolamento em trs estados da sada do 74LS245, foi aterrado para habilitar permanentemente suas as
sadas.
11.2. Conexo com Memrias.

Agora que sabemos construir os barramentos de endereos e de dados, podemos partir


para a adio de memrias. Nesse tpico, para simplificar as figuras, usaremos o circuito
apresentado na figura 11.3, mas importante que fique claro que, para sistemas grandes,
devemos empregar os buffers apresentados na figura 11.6. Ainda visando a sermos
didticos, iremos restringir-nos memria EPROM e memria esttica (SRAM)
facilmente encontradas no mercado nacional. Em nossos exemplos, usaremos ambas as
memrias, mas importante lembrar que o emprego de memria de programa externa e
de memria de dados externa uma deciso de projeto.

Como EPROM, ser empregada a 2764, apresentada na figura 11.7, que uma memria
de 8 KB, ou seja, possui 213 posies, o que significa que so 13 linhas de endereos,
numeradas de A0, ..., A12 e 8 linhas de dados, numeradas de O0, ..., O7. A EPROM
possui um sinal de seleo do chip, denominado #CE (chip enable). Ela permanece
inoperante e com suas sadas em alta impedncia enquanto esta entrada estiver em nvel
alto. Sua conexo com o barramento de dados controlada pelo sinal #OE (output
enable). Enquanto este controle estiver em nvel alto, a sada da memria permanece em
alta impedncia, ou seja, a memria est desconectada do barramento de dados. Para
que se possa ler esta memria, necessrio fornecer um endereo, habilit-la (#CE = 0) e
selecionar a leitura (#OE = 0) para, depois de algum tempo, ela disponibilizar o dado no
barramento.

Como memria SRAM, ser empregada a 6264, que possui duas entradas de seleo
denominadas: #CS1 e CS2. A habilitao desta memria feita com #CS1 = 0 e CS2 = 1.
Ela trabalha de forma semelhante EPROM, sendo que a diferena est na escrita, que
conseguida com o uso do controle #WE (Write Enable). Para que se possa escrever nesta
memria, necessrio fornecer o endereo, fornecer um dado, habilit-la e selecionar
escrita (#WE = 0), para que, depois de algum tempo, o dado fornecido seja escrito no
endereo especificado.

A conexo dessas duas memrias ao circuito com 8051 muito simples e est mostrada
na figura 11.8. Lembramos que, conforme seu projeto, o leitor pode omitir uma das
memrias. Analisemos primeiro a EPROM 2764. Note que seus pinos #PGM e VPP, que
s so usados durante a gravao, foram conectados ao Vcc e ao terra, respectivamente.
O pino de habilitao #CE foi aterrado. Com isso, a EPROM est sempre habilitada.
Entretanto, como a entrada #OE controlada pelo sinal #PSEN, ela s envia dados para o
barramento durante os ciclos de leitura da memria de programa externa. Algo semelhante
foi feito com a SRAM. Seus pinos de habilitao foram colocados na situao de ativados,
ou seja, #CS1 = 0 e CS2 = Vcc. Assim, a SRAM est sempre ativada. Controlada pelos
sinais #RD e #WR, ela responde aos ciclos de leitura e escrita na memria de dados
externa.

A soluo de habilitar de forma permanente as memrias interessante para sistemas


pequenos, entretanto, devemos salientar que tal procedimento aumenta o consumo. Por
exemplo, quando a EPROM est desabilitada (#CE = 1), ela entra no modo de baixo
consumo. No circuito, como aterramos #CE, a EPROM nunca entra nesse modo. O mesmo
vlido para a SRAM. Uma soluo seria conectar o sinal #PSEN tambm ao #CE da
EPROM, assim ela s seria habilitada durante os ciclos de leitura da memria de
programa. Algo semelhante poderia ser feito para a memria SRAM, mas lembrando que
ela precisa de ser habilitada tanto nos ciclos de escrita, quanto nos ciclos de leitura (vide
exerccio 11.2). Outras solues sero apresentadas mais adiante.
Se as duas memrias esto permanentemente habilitadas, ser que no h perigo de ambas
responderem ao mesmo ciclo de leitura? No, pois elas so controladas por sinais distintos. A
EPROM s envia um byte para o barramento de dados quando o sinal #PSEN estiver em nvel baixo.
Por sua vez, a SRAM s envia um byte para o barramento de dados quando #RD estiver em nvel
baixo. A SRAM s faz escrita quando receber o pulso de #WR. So esses sinais que fazem a
separao entre memria de programa (#PSEN) e memria de dados (#RD e #WR).

Abordemos agora as linhas de endereos. Note que o microcontrolador entrega as 16 linhas de


endereos (A0, ..., A15) e que usamos apenas 13 delas (A0, ..., A12). Surge uma inquietao:
podemos deixar sobrando as linhas de endereos A13, A14 e A15? Sim, no h problema em ignorar
essas linhas, mas preciso compreender muito bem suas implicaes sobre os endereos das
memrias. As memrias que estamos usando possuem 13 linhas de endereos, trabalhando, portanto,
na faixa de endereos de 0 at 8.191 (213 1). O endereo mais baixo surge quando essas 13 linhas
forem iguais a 0, ou seja, o endereo 0000H. O endereo mais alto surge quando todas essas linhas
estiverem em 1, que corresponde ao endereo 1FFFH (8.191 decimal). Veja a figura 11.9. Dizemos
assim que a memria possui a faixa de endereos de 0 a 1FFFH. Note que, na figura 11.9, deixamos
um pequeno espao entre cada grupo de 4 endereos para facilitar a leitura e a converso de binrio
para hexadecimal.
Vamos agora montar o quadro completo e ver o que acontece com o fato de no usarmos as linhas de
endereos A13, A14 e A15. Essas linhas so sempre geradas pelo C, mas, como as estamos
ignorando, poderemos represent-las por dont care. Veja na figura 11.10, onde apresentamos os 16
bits de endereos. A presena desses trs dont care provoca a existncia de oito (23 = 8)
combinaes possveis para cada endereo. Por exemplo, o recm calculado endereo mais baixo,
pode se apresentar de oito formas distintas. A figura 11.11 apresenta as oito combinaes possveis
de endereo mais baixo da memria. bvio que o mesmo acontece com o endereo mais alto.
Alis, o mesmo acontece com todos os endereos.

Conclumos assim que o fato de termos ignorado as trs linhas mais significativas de endereo (A13,
A14 e A15) fez que a memria se repetisse oito vezes dentro do espao de endereamento do 8051.
Esse espao de endereamento de 64 KB (65.536 bytes) e, se dividirmos, 64 KB por 8 KB, que o
tamanho da memria, obtemos 8 como resultado. Isto significa que repetimos oito vezes a mesma
memria dentro desse espao de endereamento. A figura 11.12 apresenta o espao de 64 KB, dentro
do qual mapeamos as 8 posies possveis para a EPROM, sendo que direita (em letras menores)
esto os endereos inicial e final de cada bloco. Por exemplo, o byte da posio 1234H tambm
pode ser acessado com o uso de qualquer um desses outros sete endereos: 3234H, 5234H, 7234H,
9234H, B234H, D234H e F234H. Tudo o que foi afirmado sobre os endereos da memria de
programa externa tambm vlido para a memria de dados externa.
11.3. Decodificao.

Agora que j temos uma pequena noo da conexo de memrias com o 8051, vamos
verificar o caso em que so necessrios diversos chips de memria. Por simplicidade,
vamos sempre usar a EPROM 2764 como memria de programa e a SRAM 6264 como
memria de dados. Faremos o projeto abordando apenas a memria de programa, pois os
mesmos conceitos se aplicam s memrias de dados. Nas figuras, por simplicidade,
consideraremos que os barramentos de dados e de endereos j foram construdos.

O primeiro conceito que precisarmos o do circuito combinacional denominado


decodificador. Entende-se por decodificador um circuito que indique em suas sadas qual
das possveis combinaes da entrada est no momento sendo apresentada. Por isso,
todo decodificador possui N entradas e 2N sadas. A figura 11.13 apresenta um
decodificador de duas entradas (N = 2). Nesse caso, tal decodificador ter quatro sadas,
rotuladas de #Y0, #Y1, #Y2 e #Y3. Portanto, em cada instante, apenas uma das sadas
do decodificador est em nvel baixo. A ativao da sada depende da combinao das
entradas A e B. As sadas sempre acusam qual das quatro combinaes de A e B foi
apresentada.

Existem diversos decodificadores disponveis no mercado. Por hora, estaremos interessados no


74LS138, que um decodificador consagrado e fcil de ser encontrado no comrcio. Ele possui 3
entradas, denominadas C, B e A, e 8 sadas, denominadas #Y0, #Y1, ..., #Y7. Essas sadas so
ativadas em nvel baixo. A figura 11.14 apresenta a pinagem desse decodificador e sua tabela
verdade. Ele possui 3 entradas habilitadoras, G1, #G2A e #G2B, que devem estar em 1, 0 e 0,
respectivamente, para que o decodificador opere. Note na tabela verdade que, se tal condio no
ocorrer, todas suas sadas permanecem em 1. Com o CI habilitado, a combinao das entradas C, B e
A indicada pela ativao de uma das 8 sadas. Todo esse estudo foi feito porque esses
decodificadores so usados para identificar combinaes de linhas de endereos. Em outras
palavras, os decodificadores so usados para reconhecer as faixas de endereos e habilitar
determinados chips de memria.

Vamos agora projetar nosso primeiro decodificador de memria. O projeto est apresentado na
figura 11.15, onde ligamos as trs linhas de endereos mais significativas (A13, A14 e A15) s trs
entradas do decodificador. Agora, vamos apresentar uma notao que ser usada at o final deste
livro: as sadas de um decodificador sero denominadas de #CSi, como foi feito na referida figura.
Como o decodificador oferece 8 sadas, elas so denominadas: #CS0, #CS1, ..., #CS7. Para evitar
uma figura muito grande, empregaremos apenas trs memrias, que agora no mais esto
permanentemente habilitadas. A habilitao individual, segundo a faixa de endereos indicada por
#CS0, #CS2 e #CS6. Entretanto, o decodificador est permanentemente habilitado.
Pela anlise do circuito e considerando a tabela verdade do decodificador, podemos constatar que a
memria SRAM1 ocupa a faixa de endereos de 0 at 1FFFH (#CS0), a SRAM2 a faixa de 4000H a
5FFFH (#CS2) e a SRAM3 a faixa de C000H a DFFFH (#CS6). Agora cada memria possui uma
nica faixa contgua de 8 K endereos, pois o decodificador trabalhou com as linhas de endereos
A13, A14 e A15, que haviam sido ignoradas no projeto anterior. A figura 11.16 muito semelhante
figura 11.12, mas traz ao lado de cada bloco o #CSi que ativado para cada faixa de endereos. Fica
fcil entender a posio de cada SRAM. Note que estamos apresentando uma soluo em particular.
A decodificao pode usar diversos tamanhos de blocos, como veremos logo a seguir.

Para garantir o pleno entendimento, sejam ainda mais dois casos. Vejamos o que acontece com o uso
de um decodificador de duas entradas apenas. Vamos empregar o 74LS139, que muito semelhante
ao 74LS138. Como pode ser visto na figura 11.17, usamos as linhas de endereos A13 e A14, sendo
que a linha A15 est sendo ignorada. Como temos uma linha ignorada, cada uma das memrias
aparecer em dois blocos distintos (semelhante ao que vimos na figura 11.12).

A memria SRAM1, por estar sendo selecionada pelo sinal #CS0, deve ocupar a faixa de endereos
de 0 at 1FFFH. Note que, quando afirmamos isso, estamos supondo A15 = 0. Mas, como A15 est
sendo ignorado, a mesma memria tambm selecionada com A15 = 1. Assim, a SRAM1 tambm
ocupa a faixa de 8000H at 9FFFH. O mesmo vlido para SRAM2, ocupando as faixas [4000H -
5FFFH] e [C000H DFFFH] e SRAM3 ocupando as faixas [6000H - 7FFFH] e [E000H FFFFH].
A figura 11.18, semelhante figura 11.16, mostra os blocos de endereos ocupados por cada chip de
memria.
interessante comentar que, como usamos o decodificador conectado a duas linhas de endereos,
A13 e A14, dividimos o espao de 64 K endereos em 4 (2 = 4) blocos de 16 K endereos, mas
esses blocos no ficaram contguos, pois estamos ignorando A15. Cada espao de endereo surgiu
como 2 blocos de 8 K, um bloco para A15 = 0 e outro bloco para A15 = 1. Como nossas memrias
eram exatamente de 8 KB, cada uma ocupou um par de blocos. Para mais um exemplo, vamos usar o
mesmo circuito da figura 11.17, mas agora ignorando a linha de endereo A13, como mostrado na
figura 11.19.
Como o decodificador trabalha com apenas duas linhas de endereos, A14 e A15, o espao de 64 K
ser dividido em quatro (2 = 4) partes, cada uma, claro, ocupando 16 K endereos. Como nossas
memrias possuem apenas 8 KB, elas surgiro duas vezes, uma vez para A13 = 0 e uma vez para
A13 = 1. Note que agora os blocos ficaro contguos, como mostrado na figura 11.20. importante
lembrar que tudo que estudamos se aplica tanto para as memrias de programa externas como para as
memrias de dados externas e, como veremos logo a seguir, tambm se aplica na adio de
perifricos.

Quando o sistema pequeno, existem alguns truques que permitem dispensar o decodificador. Vamos
deixar bem claro que a soluo proposta aqui (figura 11.21) no a mais adequada e pode ser
perigosa para projetistas inexperientes. Ela tem apenas a vantagem de economizar algumas portas
lgicas no projeto do hardware.
Que tal usarmos diretamente as linhas de endereos para habilitar as memrias? Entretanto, devemos
tomar cuidado, pois podem surgir memrias superpostas. Veja o projeto da figura 11.21, que
apresenta um emprego muito simples desta tcnica. importante notar que no existe mais o
decodificador e que as linhas de endereos A13, A14 e A15 foram conectadas ao #CS1 de cada
memria. O exerccio 11-8 interessante e explora um pouco mais esse conceito.

O que acontece quando acessamos essas memrias? claro que, de acordo com o endereo,
habilitaremos uma ou outra memria. A figura 11.22 apresenta o mapeamento dessas memrias no
espao de 64 K endereos do 8051. Como existem oito combinaes das linhas A13, A14 e A15,
teremos vrias situaes ocorrendo. As que nos interessam so aquelas onde apenas uma dessas
linhas est em zero, como mostrado na figura. Existe uma faixa de endereos, de E000 a FFFFH que
no habilita qualquer das memrias. Entretanto, temos tambm 4 faixas de endereos que so
proibidas pois ativam mais de uma memria. Desde que o programador conhea as faixas de
endereos que possam ser usadas, no h problemas. Note que o esquema, da forma como foi
apresentado na figura 11.21, no poderia ser usado para memria de programa, pois o endereo
0000H, que o primeiro endereo a ser executado logo aps o reset, est num bloco proibido. Ento,
como fazer para usar essa forma de habilitao com trs memrias de programa? Veja o exerccio
11-9.

Para terminar esse assunto de memrias, devemos ainda abordar um ponto muito importante, que o
do tempo de acesso. Como j vimos no captulo anterior, o barramento do 8051 sncrono, pois
possui um relgio marcando o instante em que os eventos acontecem. O momento em que o C envia
ou recebe o dado muito bem marcado e a memria que estiver envolvida nesta transao deve
responder neste ritmo. Vamos agora verificar, de maneira pragmtica, como calcular o tempo que a
memria possui para responder aos ciclos do C.
Vamos referir-nos figura 10.3. Sendo prticos, podemos considerar que o endereo est pronto no
incio de E2/F2 e o dado precisa ser entregue at o incio de E4/F1. Assim, contamos trs perodos
de relgio. Se considerarmos o uso de um cristal de 12 MHz, isso nos d um intervalo de 250 s.
Portanto, a memria que usarmos como memria de programa externa deve ter um tempo de acesso
inferior a 250 s. Note que, quanto maior for a freqncia do relgio, menor ser o tempo de acesso.
J para a memria de dados externa, usamos a figura 10.4. Observe que o endereo est disponvel a
partir de E5/F2 e a leitura ocorre a partir do incio de E3/F1, o que nos deixa com sete perodos de
relgio, ou 583 s, considerando um cristal de 12 MHz. O tempo disponvel para acesso memria
de dados externa muito maior porque os dispositivos perifricos de E/S, que nem sempre so
rpidos, mas so conectados como se fossem memrias, como veremos logo a seguir.
11.4. Dispositivos de Entrada/Sada (E/S).

Um dos pontos interessantes da famlia 8051 a grande quantidade de dispositivos e


solues integrados dentro do chip. A diversidade grande porque cada fabricante
oferece suas prprias solues. Entretanto, o que fazer quando nosso projeto pede para
acrescentar dispositivos que no foram integrados dentro do chip, ou quando no
encontramos um C com todos os dispositivos de que necessitamos? Em tais casos,
torna-se necessrio o projeto de Dispositivos de Entrada e Sada, ou simplesmente E/S. O
termo interface tambm usado para designar E/S. Em ingls, o termo consagrado
input/output device, ou simplesmente I/O. Alertamos que, nos projetos, sempre que
possvel, deve-se usar os recursos que o fabricante integrou junto com C. Entretanto,
como nosso objetivo imediato ensinar o projeto de E/S, evitaremos o uso de recursos
integrados. Ao longo deste tpico, demonstraremos os principais conceitos sobre o projeto
de tais dispositivos.

Alguns processadores e microcontroladores oferecem espaos distintos para E/S e memria.


Normalmente, o espao de memria acessado com sinais do tipo #RD e #WR e o espao de E/S
com sinais do tipo #IORD e #IOWR. As linhas de endereos e de dados permanecem as mesmas. Em
suma, so oferecidos quatro sinais de controle e, em conseqncia, faz-se uso de pelo menos quatro
ciclos distintos de barramento. Existem outros processadores e microcontroladores que no oferecem
um espao separado para endereamento de E/S. Nesse caso, tais dispositivos ocupam endereos no
prprio espao de memria (de dados no caso do 8051). Quando isso acontece, usa-se o termo E/S
mapeada em memria.

Como no 8051 faz-se uso de E/S mapeada em memria, torna-se necessrio definir uma rea do
espao de endereos da memria de dados externa que ser usada para mapear os dispositivos de
E/S. Essa rea no precisa de ser muito grande, pois raro termos um projeto com uma grande
quantidade de dispositivos de E/S. Aproveitando tudo que estudamos sobre decodificao de
endereos, sugerimos que se reserve para E/S o ltimo bloco de 4 K endereos, ou seja, o bloco
[F000H FFFFH]. Como deveremos fazer uso de diversos dispositivos E/S, ser interessante
projetarmos um decodificador que permita fracionar esse bloco de endereos.

Usualmente, os dispositivos de E/S pedem poucos endereos contguos. Por exemplo, existe E/S que
faz uso de apenas um endereo, enquanto que outros pedem quatro ou oito endereos contguos. O
projeto de um decodificador que selecione uma quantidade reduzida de endereos usualmente caro.
Por exemplo, no se costuma projetar um decodificador que, de uma rea de 64 K endereos,
selecione apenas oito blocos, cada um com quatro endereos. De forma mais prtica, seguindo a
sugesto de aproveitar o ltimo bloco de 4 K [F000 FFFFH], vamos projetar um decodificador que
selecione apenas oito blocos de endereos dentro dessa faixa. Estaremos assim decodificando oito
blocos de 512 endereos. Ao mapearmos num desses endereos um dispositivo bem simples, esse
dispositivo provavelmente ter 512 endereos possveis para seu acionamento. Esse conceito ficar
bem claro em nosso exemplo. A figura 11.23 apresenta uma possvel soluo para o decodificador
de E/S.

A anlise do que apresentamos na figura 11.23 mostra que o 74LS138 s selecionado quando as
linhas A12, A13, A14 e A15 estiverem em 1. Note que agora estabelecemos uma faixa de endereos
para a ativao do decodificador. Essa faixa engloba qualquer endereo do tipo: 1111 XXXX
XXXX XXXX B ou, em hexadecimal, FXXX H. Repare que 12 bits ficaram marcados como dont
care, logo a faixa de endereos possui o tamanho de 2 = 4.096 ou 4 K endereos. As trs linhas de
endereos seguintes (A9, A10 e A11) foram entregues para a decodificao, razo pela qual esto
assinaladas com a letra d na figura. A decodificao dessas trs linhas nos permite dividir o
espao [F000H FFFFH] em oito blocos, como est marcado na figura. Cada bloco, como pode ser
facilmente calculado, possui o tamanho de 512 endereos.

Agora que temos um decodificador, vamos projetar o primeiro dispositivo de E/S. Como devemos
iniciar com algo bem simples, escolhemos um conjunto de leds. Para podermos trabalhar
corretamente com leds, devemos esclarecer alguns pontos sobre seu uso. A figura 11.24 apresenta
duas solues para se acender um led. Qual delas devemos usar?
A soluo da esquerda mais atrativa, pois o led vai acender quando a porta estiver em 1, enquanto
que, na direita, o led acende com a porta em 0. Entretanto, note que, na soluo da esquerda, a porta
TTL est sendo usada para fornecer corrente para o led. O problema que as portas TTL no so
boas fornecedoras de corrente, sendo que o nvel de tenso na sada degrada com o aumento do dreno
de corrente. Se, alm de acender um led, a sada da porta for usada para acionar outros circuitos
digitais, possvel que o nvel de tenso na sada v para a faixa proibida para operao do TTL. J
a soluo da direita muito melhor, pois, quando em 0, a sada TTL est conectada ao terra atravs
de um transistor saturado, ou seja, a sada oferece um caminho de baixa impedncia para o terra e
com a capacidade de drenar muito mais corrente. A soluo da esquerda pode ser usada, mas desde
que o leitor esteja consciente de suas implicaes. Em nossos exemplos, usaremos a soluo da
direita. Veja o exerccio 11-10.

Falta ainda calcularmos o resistor que devemos colocar em srie com o led. A finalidade desse
resistor muito simples: sabemos que o led se comporta como um diodo e, quando polarizado
diretamente, ele se torna quase um curto. Por isso, colocamos um resistor em srie para limitar a
corrente atravs do componente. Os leds mais comuns possuem uma queda de tenso de 2,2 V quando
polarizados diretamente e apresentam uma luminosidade razovel com uma corrente de 10 a 15 mA,
sendo que a corrente mxima est por volta de 30 mA. Vamos ento calcular o valor de R,
considerando a figura 11.24-(b), para uma corrente de 12 mA. Podemos supor que a sada TTL,
quando em nvel baixo, apresenta uma queda de tenso de 0,2 V. A equao 10.1 muito simples e
arredondamos o resultado para R = 220 .

Vamos finalmente ao nosso primeiro dispositivo de E/S, que nada mais que um excitador para oito
leds. Gostaramos de ter recursos para acender e apagar esses leds individualmente. A figura 11.25
apresenta uma soluo muito simples para este circuito. Note que fizemos uso de um latch 74LS373
para amostrar e reter o barramento de dados no exato momento em que os sinais #CS0 e #WR
estiverem ativos. Enquanto #CS0 e #WR estiverem ativos, o latch estar no modo transparente,
porm, assim que um desses sinais for desativado, o latch congela, retendo o ltimo estado do
barramento de dados. conveniente que os leitores relembrem os ciclos de escrita na memria de
dados externa, que estudamos no captulo anterior e, em especial, na figura 10.5.
Especificamos o endereo do latch com o sinal #CS0 e o definimos como um dispositivo de sada ao
usarmos #WR. Note que o latch est armazenando exatamente no flanco de subida () do sinal de
#WR. Deve ficar bem claro que o latch foi colocado para reter o valor do barramento de dados,
pois, durante o ciclo de escrita, os dados esto presentes neste barramento apenas por um breve
perodo de tempo. O leitor convidado a constatar que, na verdade, projetamos uma porta paralela
de sada com 8 bits e que a ela conectamos oito leds.

Observe que ligamos o barramento de dados seguindo a mesma ordem do 74LS373, ou seja, AD0
est ligado entrada D0 e assim por diante. Isso facilita a construo dos programas. Na figura,
numeramos os leds com D1, D2, ..., D8. Vamos escrever um pequeno trecho de programa para
acender apenas o led D1. O acionamento deste led atravs da linha AD0 do barramento de dados.

As instrues so bastante bvias. Atualizamos o acumulador com um byte que possui apenas o
ltimo bit igual a zero. Em seguida, escrevemos no DPTR um endereo dentro da faixa de endereos
que ativa #CS0 (veja figura 11.23) e depois executamos uma instruo de escrita na memria de
dados externa. Vamos tecer alguns comentrios com relao aos endereos. Carregamos no DPTR o
endereo F000H, mas na verdade sabemos que existem 512 endereos que ativam #CS0, ou seja, os
da faixa [F000H F1FFH]. Estamos, portanto, dedicando 512 endereos para o mesmo dispositivo
E/S. Pode parecer um desperdcio, mas o projeto do decodificador ficou bastante simples. o que
queramos dizer com trocar espao de endereamento por simplicidade do decodificador.
Poderamos usar a instruo MOV DPTR,#0F1FFH que o resultado seria o mesmo. Como o LSB do
endereo ignorado pelo nosso decodificador, podemos usar apenas a parte alta do DPTR, lanando
mo da instruo MOV DPH,#0F0H. Veja que temos a vantagem de manter intacta a parte baixa do
DPTR.

Considerando o circuito da figura 11.25, escreva uma subrotina para acender apenas os leds pares
(D2, D4, D6 e D8).

Soluo:

Considerando o circuito da figura 11.25, escreva uma rotina para fazer um contador binrio com os
oito leds.

Soluo:

Note que precisamos complementar o valor do contador para que os leds se comportassem da forma
esperada, pois eles acendem quando a sada do latch estiver em zero. Ser que possvel construir
um contador que use apenas o acumulador? Veja o exerccio 11-11. Como o microcontrolador
muito rpido, no conseguiramos ver a contagem caso no fizssemos uso da subrotina TEMPO,
cuja nica finalidade introduzir um pequeno atraso. O leitor convidado a construir uma rotina que
faa a contagem na freqncia de 1 Hz, como pedido no exerccio 11-12.

Aps projetarmos um dispositivo de sada, vamos construir um de entrada. Ser um dispositivo de


entrada de oito bits, que tambm podemos denominar de porta paralela de entrada com 8 bits. Por
essa porta paralela, vamos receber diversos sinais. Por exemplo, nessa entrada podemos conectar
algumas chaves (CH1 e CH2), um receptor infravermelho (Q1) e um circuito digital (74LS161). A
figura 11.26 apresenta um circuito de entrada, mapeado ainda na faixa de endereos que ativa #CS0.
Note que, no projeto anterior, tambm usamos #CS0, mas combinado com o sinal de escrita #WR.
Agora estamos usando #CS0, mas combinado com o sinal de leitura #RD. Para garantirmos que os
oito bits sejam apresentados ao barramento de dados no instante correto, usamos o 74LS244. Esse CI
transfere as entradas rotuladas por Yi para o barramento de dados no instante em que as entradas 1G
e 2G so colocadas em nvel baixo. Isso s ocorre durante um ciclo de leitura na memria de dados,
quando for emitido um endereo na faixa [F000H F1FFH] e o sinal #RD for ativado. A porta OU
garante essa condio.

O dispositivo digital a ser lido est exemplificado pelo contador binrio 74LS161, cujas demais
conexes foram omitidas. O circuito permite que a qualquer instante se leia o valor deste contador,
que entregue nos bits AD0, AD1, AD2, AD3 e AD4. Conectamos tambm duas chaves,
denominadas CH1 e CH2, cujos estados so acessados, respectivamente, pelos bits AD5 e AD6.
Para que a entrada estivesse num nvel definido quando as chaves estiverem abertas, colocamos dois
resistores de pull-up, R1 e R2. Se na leitura obtivermos AD5 = 1, significa que a chave CH1 est
aberta. Com AD5 = 0, temos a indicao de que a chave CH1 est fechada. Finalmente conectamos
tambm um fototransistor infravermelho, que o TIL 78 (Q1), cuja tenso de coletor discretizada
pelo 74LS14 (inversor Schmitt Trigger ). O estado de Q1 recebido por AD7. Quando no h
radiao infravermelha, o transistor est cortado e na leitura obtm-se AD7 = 0, pois h um resistor
de 10 k ligado ao coletor. Se for obtido AD7 = 1, h irradiao infravermelha e, portanto, o
transistor estava saturado. Esse nico fototransistor suficiente para receber os pulsos de controle
remoto e tambm receber informaes de equipamentos com porta infravermelha, como o caso das
calculadoras HP 48. O trecho de programa apresentado a seguir faz a leitura da porta paralela
proposta, entregando o resultado no acumulador.
Considerando o circuito da figura 11.26, escreva uma subrotina que espere o acionamento da chave
CH1, retornando quando ela for acionada. O exerccio 11-14 est relacionado com este problema.

Soluo:

Note que, como o decodificador ignora o LSB do endereo, atualizamos apenas DPH.

Considerando o circuito da figura 11.26, escreva uma subrotina que leia todas as entradas da porta
paralela e as transfira para os leds do circuito proposto na figura 11.25. O estado de chave fechada
deve ser indicado com led aceso.

Soluo:

Note que os leds acendem quando se escreve 0, por isso foi necessrio complementar os cinco bits
do contador.

Quando as entradas a serem lidas forem assncronas, ruidosas ou muito rpidas, elas podem fazer
transies no exato momento em que o C estiver amostrando o barramento de dados. Por exemplo,
por azar, podemos estar lendo as sadas do contador 74LS161 no exato momento em que elas esto
transitando, o que evidentemente resulta num valor equivocado. Para evitar que isso ocorra, podemos
empregar um 74LS373 que esteja sempre no modo transparente (G = 1), mas que congele (G = 0)
quando inicia seu ciclo de leitura. A figura 11.27 apresenta tal circuito. A entrada #OC do 74LS373
s ativada durante um ciclo de leitura no endereo #CS0. Enquanto isso no acontece, o latch est
no modo transparente. Assim que for ativada #OC, ele congela no seu ltimo estado.
A ttulo de ilustrar ainda mais os conceitos, vamos agora propor uma porta de 8 bits bidirecional.
Usamos um 74LS373 para gerar a sada e um 74LS244 para viabilizar a entrada, como na figura
11.28. Entretanto, temos um problema, que o controle do pino #OC do 74LS373. Se aterrarmos
esse pino, o circuito passa a ser unicamente de sada, pois as leituras atravs do 74LS244 retornaro
sempre o valor que foi escrito no 74LS373. Assim, propomos um circuito adicional s para controlar
esse pino. Note o flip-flop 74LS74, cuja entrada CLK est ligada a uma porta OU. Esse pino CLK
vai para 0 quando for feita uma escrita (#WR) na faixa de endereos de #CS1. Ao final desse ciclo
de escrita, o valor da linha AD0 ser copiado para o flip-flop. Assim, podemos colocar o pino #OC
do 74LS373 em nvel baixo para a porta trabalhar como sada e em nvel alto para que ela possa
trabalhar como entrada.
Considerando o circuito da figura 11.28, escreva duas subrotinas, uma para programar a porta como
sada e outra para program-la como entrada.

Soluo:

Como o nico bit que importa o bit 0 do acumulador, apenas se definiu o valor deste bit. Os demais
bits do acumulador so deixados como estavam.

Para finalizar os conceitos de dispositivos de entrada e sada que usam portas paralelas, vamos
projetar uma porta quasi-bidirecional, a exemplo das que o 8051 oferece. Para tanto, precisaremos
de sadas a coletor aberto que so fornecidas pelos inversores 74LS05. Devemos ter cuidado, pois
as sadas so invertidas. A finalidade do latch 74LS373 apenas a de reter os dados. Como estamos
usando coletor aberto, preciso a presena de resistores de pull-up para definir a tenso quando as
sadas forem colocadas em 1. Mesmo com as sadas em 1, possvel que um outro circuito as puxe
para 0. Em outras palavras, quando em 1, o circuito pode funcionar como entrada cujo estado lido
atravs do 74LS244. Note que agora o pino #OC do 74LS373 pode ser aterrado. Com relao ao
endereamento, interessante observar que a sada e a entrada usam o mesmo endereo (#CS0).
Assim, o que d distino s portas o uso dos sinais #RD ou #WR.

Como ltimo exemplo de dispositivo de entrada e sada, vamos estudar as conexes necessrias para
empregarmos um conversor A/D. Para tanto, vamos usar um conversor antigo, mas consagrado, que
o ADC0808 da National. Nosso interesse maior a maneira de se conectar o conversor e no a
teoria de converso A/D. interessante que se consulte o manual deste conversor ou o livro
Eletrnica Digital: Curso Prtico e Exerccios, da MZ Editora, onde, alm dos dados tcnicos,
existem sugestes para sua conexo. Aqui, vamos fazer um estudo muito breve. A figura 11.30
apresenta a pinagem deste conversor e a parte de seu diagrama de tempo que nos interessa. Esse
diagrama foi um pouco simplificado para ressaltar apenas os detalhes importantes.

O ADC0808 apresenta 8 pinos para serem conectados ao barramento de dados e trs pinos de
endereos que servem para definir qual das 8 oito entradas analgicas (IN0, ..., IN7) ser convertida.
A seleo da entrada analgica feita por intermdio de um multiplexador analgico, cujo endereo
o usurio fornece via pinos A0, A1 e A2. A definio do endereo acontece no flanco de subida da
entrada ALE, ou seja, o usurio especifica o endereo e depois envia um pulso de ALE. Cuidado!
No confunda com o ALE do 8051. Uma vez definido o endereo, o usurio pode ordenar o incio da
converso atravs de um pulso em nvel alto no pino START. Para uma mesma entrada selecionada,
permitido o envio de tantos pulsos de partida quantos o usurio deseje, ou mudar de entrada (enviar
um novo endereo) ao fim de cada converso.

Ao receber o pulso de partida, o conversor baixa o nvel da sada EOC (End Of Convertion) e o
mantm assim at o final da converso, quando ento retorna para nvel alto. Enquanto a converso
estiver sendo realizada, no se enviam sinais de controle e, alm disso, preciso garantir que a
entrada analgica que est sendo convertida permanea estvel. Com um nvel alto na sada EOC, o
conversor A/D indica que terminou a converso. Neste momento, comandado pelo pino OE, o
ADC0808 envia para o barramento de dados o cdigo de converso referente entrada selecionada.
Existem diversas restries de tempo que no foram mostradas. Recomenda-se que o leitor consulte
o manual para obter informaes detalhadas.

O circuito para permitir que o 8051 comande o ADC0808 bem simples, como pode ser apreciado
na figura 11.31. Escolhemos como endereo deste perifrico a faixa [F200H F3FFH], ou seja, ele
ser ativado pelo sinal #CS1 do decodificador apresentado na figura 11.23. Os pinos ALE e START
esto sendo comandados ao mesmo tempo, atravs de uma escrita. Ao fazermos a escrita, as trs
linhas menos significativas de endereo indicam qual das entradas ser convertida, alm de ser dado
o comando para iniciar a converso. Note que, da maneira como foi projetado o circuito, o comando
de partida (START) obrigatoriamente deve ser feito com a informao de endereo atravs das
entradas A0, A1 e A2. Para convertermos a entrada Ent_An_0, devemos fazer uma escrita no
endereo F200H. J para a entrada Ent_An_1, a escrita no endereo F201H e assim por diante, at
a Ent_An_7, cujo endereo F207H. Depois, tudo volta a repetir at atingir o endereo F3FFH, pois
o dispositivo tem sua disposio um total de 512 endereos.

A indicao de fim de converso (EOC) foi conectada de forma a provocar a interrupo #INT0, que
dever ser preparada para operar por flanco. Note que foi necessrio o emprego de um inversor para
permitir operao no flanco de descida. Na entrada CLK, deve ser fornecido um relgio de at 1,28
MHz. Para no ser necessrio a introduo de um oscilador, usamos o sinal de ALE gerado pelo
8051. Supondo que o cristal usado no 8051 seja de 12 MHz, esse pulso ter a freqncia de
aproximadamente 1 MHz, que atende especificao. O fato de se perder um pulso de ALE a cada
ciclo de acesso memria de dados externa no traz problemas. Finalmente, as entradas de
referncia de tenso positiva (REF+) e negativa (REF-) esto conectadas a +5,000 V e a 0,000 V,
respectivamente, que so sinais de preciso.

Considerando o circuito da figura 11.31, escreva uma subrotina que, sem usar a interrupo, receba
no acumulador o nmero da entrada analgica a ser convertida e devolva o resultado da converso
no prprio acumulador.

Soluo:

Na soluo apresentada, note que, na terceira instruo, no importa o valor do acumulador, j que o
dado desta operao de escrita ignorado.
11.5. Exerccios.

11-1) Na figura 11.6, o que aconteceria se a entrada G do 74LS373 que est conectado
porta P2 fosse ligado a Vcc? Comente.

11-2) Sugira um circuito que no empregue as memrias EPROM e SRAM sempre


habilitadas, como est feito na figura 11.8. Nesse caso, considerando um cristal de 12
MHz, qual seria o valor mximo do tempo de acesso das memrias?

11-3) Como fica o espao de endereos do 8051 se, no projeto da figura 11.8,
substituirmos a ROM 2764 pela 2732 (4 KB) e a SRAM 6264 pela 6216 (2 KB)? Desenhe
os espaos de endereamento de programa e de dados esboando os blocos ocupados
por cada memria.

11-4) Como fica o espao de endereos do 8051 se, no projeto da figura 11.8,
substituirmos a ROM 2764 pela 27256 (32 KB) e a SRAM 6264 pela 62256 (32 KB)?
Desenhe os espaos de endereamento de programa e de dados esboando os blocos
ocupados por cada memria.

11-5) Explique com fica o espao de endereamento se, na conexo da memria da figura
11.8, trocarmos a linha A12 pela A14, ou seja, se ignorarmos as linhas A12, A13 e A15.
Desenhe os espaos de endereamento de programa e de dados esboando os blocos
ocupados por cada memria.

11-6) Indique a faixa de endereos de ativao de cada #CSi, para cada condio de
decodificao mostrado na figura 11.32.
11-7) Indique a faixa de endereos de ativao de cada #CSi, usando as decodificaes mostradas na
figura 11.33.

11-8) Considerando o esquema da figura 11.34, desenhe o espao de endereos do 8051 e mapeie o
bloco ocupado por cada uma das memrias. Note que no se fez uso de decodificadores.
11-9) Baseado na soluo apresentada na figura 11.21, sugira uma forma de habilitao para trs
EPROMs 2764 usadas como memrias de programa. Depois, modifique sua soluo para adicionar
uma quarta memria 2764.

11-10) Em laboratrio, usando uma porta 74LS00, verifique quanta corrente ela pode fornecer
quando estiver em nvel alto e quanta corrente ela consegue drenar quando estiver em nvel baixo.
Use um resistor varivel conectado sada, um ampermetro e um voltmetro. Lembre-se de que, para
gerar sada 1, a tenso deve estar acima de 2,7 V e que, no caso da sada 0, ela deve estar abaixo de
0,5 V. Repita o experimento com diversas outras famlias TTL.

11-11) Refaa o exerccio resolvido 11.2 usando apenas o acumulador, o DPH e, claro, a subrotina
TEMPO.

11-12) Resolva o exerccio 11-11, garantindo que a contagem acontea na cadncia de 1 Hz. Use os
contadores/temporizadores e considere que o cristal seja de 12 MHz.

11-13) Tomando com exemplo a figura 11.25, projete um circuito para acionar um display de 7
segmentos. Tal display composto por 7 leds, como mostrado na figura 11.35. Vamos usar o
denominado anodo comum, ou seja, todos os leds esto com seus anodos em curto. Escreva uma
subrotina que receba no acumulador um nmero de 0 a 9 e que o apresente no display.
11-14) Este problema parecido com o exerccio resolvido 11.3. Escreva uma subrotina que
regresse apenas quando a chave CH1 passar de aberta para fechada. Leve em conta os rebotes da
chave.

11-15) Para o circuito da figura 11.31, escreva uma subrotina que, usando o contador/temporizador
0, digitalize a entrada analgica 7 usando a taxa de 8.000 amostras por segundo, apresentando o
resultado de cada converso na porta P1. Use a interrupo do CT0 e a #INT0. Considere que o
cristal seja de 12 MHz. interessante comentar que a grande maioria dos sistemas telefnicos,
inclusive seu celular, amostra a voz na taxa de 8 kHz e com palavras de 8 bits.

11-16) Refaa o exerccio 11-15, mas enviando serialmente o resultado de cada converso.
Considere que o 8051 faa uso de um relgio de 11,0592 MHz. Haver problemas no envio desses
dados? Considerando os limites da porta serial, qual seria a mxima taxa de converso possvel?

11-17) Proponha uma modificao no circuito da figura 11.31, de tal forma que se possa enviar o
endereo da entrada a ser convertida uma nica vez. Em outras palavras separe os comandos de ALE
e START.

11-18) Indique a seqncia de instrues para ativao (Q = 1) e desativao (Q = 0) de cada flip-


flop apresentado na figura 11.36. Figuras 11.36-(a) e 11.36-(b) diferem pelo sinal conectado
entrada D do flip-flop.
12. O Pentacontrolador - P5C

Este captulo dedicado a uma placa didtica que, dentre outras finalidades, servir como
laboratrio no ensino de microcontroladores 8051. Ela apresenta solues que permitem a
prtica com os mais diversos recursos de programao e interfaces. Esperamos que tais
solues sirvam como ponto de partida para os projetos que nossos leitores venham a
realizar. Como o nosso objetivo era exercitar o desenvolvimento de projetos, procuramos
empregar no s solues calcadas em recursos do 8051, como o caso das portas
paralelas, mas tambm apresentar solues totalmente externas ao microcontrolador. A
concepo deste projeto aconteceu no final do ano de 2002, quando o Brasil se sagrou
Pentacampeo mundial de futebol, razo pela qual resolvemos denomin-lo
PENTACONTROLADOR, que abreviamos por P5C.

As placas didticas com o 8051 que esto disponveis no mercado trazem pouco projeto
incorporado. Na maioria das vezes, elas so pequenas e se resumem ao microcontrolador,
sua alimentao, conversor RS 232 e conectores de expanso. Costumam empregar um
microcontrolador sofisticado e assim, na maioria das vezes, o emprego de tais placas
limita-se ao emprego dos recursos embutidos no microcontrolador. Tal enfoque no
permite a abordagem de projetos e, por isso, muitas vezes os cursos que empregam tais
placas se resumem no estudo do manual do fabricante do microcontrolador empregado.
Alm disso, via de regra, tais placas didticas ocupam boa rea da memria de programa
com um programa monitor em ROM e bibliotecas. Se, por um lado, isto traz simplificaes,
por outro lado, obriga o programador a conviver com esse programa monitor, ou seja, o
programador no tem plena liberdade de usar a memria de programa.

Neste captulo, com o intuito de que o leitor tenha pleno conhecimento do Pentacontrolador
P5C, estudaremos com detalhes todo o seu projeto. Cada planta de circuito
apresentada individualmente. Como j dissemos, esperamos que o P5C seja o ponto de
partida para os projetos de nossos leitores.
12.1. Introduo ao Pentacontrolador - P5C.

O objetivo do P5C foi premiar a concepo de projetos de sistemas microcontrolados, por


isso ele incorpora muitas solues externas. primeira vista, a grande quantidade de
recursos pode parecer exagerada ou assustar, entretanto, tais recursos so simples e
permitem uma enorme variedade de experimentos, desde os mais elementares, como
monitorar o acionamento de uma chave e acender um led, at a comunicao via
barramento USB. A figura 12.1 apresenta o diagrama em blocos do P5C.

importante agora comentarmos sobre a operao do P5C. Antes de mais nada, admitimos que o
usurio trabalhe com um computador PC, onde ele escreve e monta seus programas para depois os
enviar para a execuo na placa P5C. A maioria das placas didticas consome parte do espao da
memria de programa para adicionar uma ROM onde armazena uma pequena biblioteca, a rotina de
comunicao com o PC e s vezes um programa monitor. Essa soluo tem a sria desvantagem de
no permitir ao usurio plena liberdade no uso do espao destinado memria de programa. Alm
disso, essa ROM precisa de ocupar os primeiros endereos, pois ela recebe o processador logo aps
o reset. Isso cria problemas com as interrupes, pois os vetores de interrupo fatalmente estaro
ocupados pela ROM.

Para o P5C, foi idealizada uma soluo que disponibiliza ao usurio toda a memria de programa,
especialmente os endereos iniciais. Para tanto, a placa possui dois modos de operao,
denominados modo boot e modo execuo. disponibilizado um led para que o usurio saiba em
qual dos modos a placa est operando. A transio entre esses dois modos feita automaticamente,
com o acionamento do reset. Ao ser ligada, a placa entra no modo boot e fica aguardando que o
usurio envie serialmente seu programa. Aps o envio do seu programa, o usurio aciona o boto de
reset e a placa entra no modo execuo, executando o programa recm recebido. Caso o usurio
detecte algum erro na sua rotina ou queria executar um outro programa, ele aciona o reset e a placa
comuta para o modo boot, ficando pronta para receber o novo programa. Assim, a operao muito
simples e, apenas com o boto de reset, tem-se o pleno controle dos modos de operao.

A memria de programa destinada ao usurio de 32 KB, ocupando a faixa de [0 7FFFH], ou seja,


ocupa a primeira metade do espao destinado memria de programa. A outra metade desse espao
de memria, se o programador assim o desejar, pode ser ocupada por uma ROM com biblioteca de
funes e rotinas. O usurio, ao escrever seus programas, deve levar em conta que eles sero os
nicos presentes na memria, sendo inclusive responsveis por receber o C logo aps o reset. Caso
deseje, para facilitar seu trabalho, o usurio pode fazer uso de uma biblioteca que fique disponvel
na segunda metade da memria de programa.

A seguir apresentada uma lista um pouco mais detalhada dos recursos previstos para a placa P5C.

Microcontrolador da famlia 8051 ou 8052, com 40 pinos e cristal de 11,0592 MHz


Uma memria EPROM de 32 KB ou 16 KB
Duas memrias SRAM de 32 KB ou 8 KB
Controle para os modos boot e execuo
Soquete para duas memrias Flash seriais
Decodificador para 8 perifricos de E/S
Sete leds coloridos e um led bicolor
Mostrador de sete segmentos
Mostrador LCD alfanumrico ou grfico
Conector tipo PS 2 para teclado ou mouse
Chave tipo push-buttom
Conector 40 pinos com barramentos de dados, de endereos e sinais de controle
Conector 40 pinos com portas digitais e diversos sinais
Conversor A/D (ADC0808) de 8 bits e oito canais
Conector para microfone com pr-amplificador
Conversor D/A de 8 bits (DAC0808)
Sada para fone de ouvido com filtro
Porta IrDA com o MAX3100
Receptor infravermelho (SFH505) para sinais de controle remoto de TV
Fototransistor infravermelho (TIL 78) para a recepo em infravermelho (inclusive HP-48)
Emissor infravermelho (TIL 32)
Relgio permanente com DS1305 (Dallas) ou PCF8583 (Phililps) e bateria
Dois foto-TRIACS (MOC 3020)
Conector USB tipo B e Controlador (USBN 9603, National)
Conector DB9 macho para porta serial RS 232
#INT1 compartilhada com 8 entradas de interrupo
Recurso para executar programas no modo Passo-a-Passo
Alimentao por eliminador de pilhas (7 a 9 V, 1A) com proteo de polaridade
Recursos para receber programas diretamente do PC via porta serial, USB ou paralela

Como pode ser visto, uma lista bastante extensa que tentou premiar os mais diversos tipos de
projetos. claro que nem todos precisam de estar presentes para que o P5C funcione. Na verdade,
ele foi projetado de forma que o usurio pudesse adicionar recursos de acordo com suas
necessidades ou de acordo com os recursos que estivesse disposto a gastar. Para evitar que as
plantas esquemticas ficassem saturadas e complexas, elas foram divididas em diversas plantas
menores e mais simples, que so apresentadas a seguir. O leitor no se deve preocupar, pois todos os
projetos sero abordados com detalhes. Temos um total de 15 plantas:

Planta 1: CPU com microcontrolador, latches, transceivers, lgica para controle do modo boot e
modo execuo, lgica para Passo-a-Passo e Reset
Planta 2: MEMO EPROM de 32 KB (27256) ou 16 KB (27128), RAM1 e RAM2 de 32 K
(62256) ou 8 KB (6264) e conector de expanso com 40 pinos
Planta 3: DECOD lgica de decodificao e blocos com todos os dispositivos E/S
Planta 4: LEDS leds coloridos, led infravermelho (TIL 32) e mostrador de 7 segmentos
Planta 5: LCD conector e lgica para acionamento de um mostrador LCD alfanumrico ou
grfico
Planta 6: TEC conector e lgica para teclado PS2, um push-button conectado ao pino P1.0 e
conector de 40 pinos com portas de 8 bits, sendo uma de entrada, uma de sada, uma bidirecional
(compartilhada com LCD) e mais alguns sinais
Planta 7: AD conversor A/D de 8 bits (ADC 0808), conector para microfone de eletreto e pr-
amplificador com ganho regulvel
Planta 8: DA conversor D/A de 8 bits (DAC 0808) ou D/A de 8, filtro passa-baixas e conector
para fone de ouvido
Planta 9: IV um receptor (SFH 505) sintonizado para sinais de controle remoto de TV e dois
fototransistores (TIL 78) de infravermelho para os demais casos, podendo receber sinais da HP-48
Planta 10: IRDA controlador MAX3100 para a construo de um canal IrDA
Planta 11: RP+EEPROM dois CIs para relgio permanente, DS1305 (Dallas) ou PCF 8583
(Philips) com lgica para usar bateria de Ltio ou NiCd recarregvel e duas memrias EEPROM
seriais
Planta 12: USB+FT Conector USB tipo B, controlador USB da National USBN9603 e dois fotos-
TRIACS MOC3020, para acionar outros TRIACS
Planta 13: INT Lgica para monitorar e compartilhar a interrupo #INT1 com oito entradas de
interrupo
Planta 14: F+S Regulador para gerar tenso a partir de um eliminador de baterias operando na
faixa de 7 V a 9 V, com corrente de 1 A, fusvel, proteo contra polaridade invertida e ainda
conversor TTL / RS 232 do tipo MAX232C
Planta 15: DES Capacitores de desacoplamento empregados no projeto

Um pouco mais adiante, ser apresentada cada uma das 15 plantas. Como j dissemos, esperamos
que, no futuro, tudo que aqui estudamos sirva como ponto de partida quando o leitor precisar de fazer
um projeto. Logo aps a apresentao das plantas, iniciamos o estudo detalhado de todo o circuito.
Por simplicidade, esse detalhamento ser feito com base em cada planta. Redesenharemos os
circuitos para ressaltar as partes importantes e facilitar suas compreenses. O leitor deve verificar
que o projeto foi feito de forma hierrquica onde, em cada planta, existe um bloco que representa
uma outra planta de nvel inferior, com todas as suas entradas e sadas. Podemos represent-lo sob a
forma de uma rvore, como mostrado a seguir:

Neste projeto, fizemos uso de diversos pontos de teste, rotulados de TP e, nos diversos CIs, os pinos
que ficaram sem utilizao foram ligados a ilhas redondas (ilhas de solda), rotuladas de IR. Os leds
esto seguindo a nomenclatura:

RD = redondo
AM = amarelo
QD = quadrado ou retangular
VD = verde
VM = vermelho
AZ = azul
IV = infravermelho
Assim, o led QD-VD representa um led quadrado (na verdade, retangular) verde. Para facilitar as
explicaes, quando precisarmos de fazer referncia ao pino de um CI, usaremos um ponto para
separar a referncia do nmero do pino. Por exemplo, U18.6 faz referncia ao pino 6 de U18. Para
evitar uma grande quantidade de ligaes, fizemos uso de barramento de endereos, denotado por
BA[0..15], e de barramento de dados, denotado por BD[0..7]. Alm disso, as conexes entre
diversos pontos so indicadas por quaisquer dos smbolos abaixo:

Nos apndice esto mais detalhes sobre a placa Pentacontroladora e um pequeno roteiro para
montagem pode ser conseguido na pgina da editora. Sugerimos que todos os componentes
empreguem soquetes de boa qualidade (com pinos torneados). claro que este um projeto
meramente didtico e no deve ser empregado em aplicaes comerciais.

A verso que aqui apresentamos denominada de Verso 1.20. Todo o projeto do P5C est
disponvel aos leitores, que so incentivados a partirem para a prtica. Os esquemas eltricos
(Orcad), a placa j roteada (Power PCB) e os arquivos para gravao na EPROM podem ser
conseguidos junto pgina da editora (www.mzeditora.com.br) ou na pgina www.ene.unb.br/~zele.
A placa de circuito impresso pode ser conseguida junto com a editora. Todos os componentes do
P5C podem ser conseguidos no mercado nacional. Sugerimos a Farnell (www.farnell.com.br), que
tem um excelente estoque e pode vender por intermdio da Internet. Atravs das pginas de Internet
citadas, disponibilizaremos, se for o caso, correes e melhorias desta atual verso do P5C, pois
todo projeto est sujeito a aperfeioamentos. De acordo com a dinmica de relacionamento com
nossos leitores, poderemos gerar novas verses do P5C, que tambm estaro disponveis na Internet.
12.2. Plantas do Pentacontrolador.

A seguir, apresentamos as quinze plantas que compem o Pentacontrolador (P5C).


12.3. Planta 01: CPU.

Na Planta 1, denominada CPU, est o chip do microcontrolador (U45) acompanhado dos


circuitos bsicos: latches, buffers e transceivers. Ainda nesta planta, esto o circuito de
reset, a lgica de boot, o circuito para habilitar a execuo passo-a-passo e alguns leds
indicadores. interessante notar tambm a presena de quatro subplantas: memrias,
entrada/sada, fonte + serial e capacitores de desacoplamento.

Como pode ser visto na figura 12.18, usamos dois latches 74HCT373 (U37 e U38) e um
transceiver 74HCT245 (U36) para construir o barramento de endereos, denominado
BA[0,..15] e o barramento de dados, denominado BD[0,..,7]. Aos sinais que passaram
atravs de um buffer, adicionamos a letra B aos seus nomes. Doravante, toda referncia a
esses barramentos ser feita por intermdio desses nomes. Deve ser notado o uso de
uma porta E (U35A) para o controle de direo do 74HCT245. O controle dos trs estados
da sada desses CIs est aterrado, de forma a mant-los sempre ativos.

Ainda nessa figura, temos o controle do pino #EA (U45.31) do microcontrolador, feito
atravs do jumper JP20. Quando se usa um C sem ROM interna (ou para desabilitar a
ROM interna), o JP20 deve ser fechado, entretanto, para habilitar-se a ROM interna, abre-
se o JP20 e, assim, o resistor R67 garante o nvel alto no pino 31 do microcontrolador. O
oscilador faz uso de um cristal de 11,0592 MHz (Y5) para que a porta serial possa
trabalhar nas taxas usuais (28.800, 14.400, 9.600, etc.). Os dois pequenos capacitores
(C77 e C79) servem para garantir rapidez na partida do oscilador e sua estabilidade.
Quanto menor for o valor desses capacitores, mais rpida ser a partida, por outro lado,
quanto maior forem seus valores, melhor ser a estabilidade de freqncia. Os valores
apresentados foram sugeridos pelo fabricante e atendem a um compromisso entre esses
dois parmetros.

O circuito para habilitar o modo Passo-a-Passo, mostrado na figura 12.19, muito


simples, pois consiste apenas de uma chave (SW3) que, quando fechada, conecta ao terra
o pino de interrupo #INT0, ou seja, solicita constantemente a interrupo externa 0.
com essa interrupo e aproveitando as idias apresentadas na seo 8.6 que fazemos a
execuo Passo-a-Passo. Quando a chave SW3 estiver aberta, o pino #INT0 colocado
em nvel alto pelo pull-up interno que existe em todos os pinos da porta P3. Para que o
usurio saiba se est no modo Passo-a-Passo, foi adicionado o led D3 (QD-VM), que
acende quando SW1 estiver fechada. Usamos uma porta OU (U48A) para impedir que o
circuito do led se conectasse diretamente ao pino #INT0 do microcontrolador. Esse
cuidado foi tomado para que o usurio, caso no necessite do modo Passo-a-Passo,
possa, com SW1 aberta, usar a interrupo externa 0 para qualquer outra finalidade. Ainda
na figura 12.19, vemos que todos os pinos da porta P1 foram reunidos em um barramento,
denominado P1[0..7]. Isso foi feito exclusivamente para facilitar os desenhos do projeto.

Passemos agora ao estudo de uma parte muito importante da planta CPU, que o circuito de reset,
que trabalha junto com a lgica de boot e est apresentado na figura 12.20. O reset semelhante ao
que foi estudado na seo 10.5 e na figura 10.16. Esse circuito gera um pulso de reset de
aproximadamente 90 ms (t = ln(1 1,66/5).104.22.10-6) toda vez que a placa for energizada.
Manualmente, atravs do boto SW4, tambm possvel gerar o sinal de reset. O motivo da chave
SW2, no mostrada na figura, ser explicado um pouco mais adiante. O led D2 (QD-AM) indica a
ativao do sinal de reset. Disponibilizamos dois sinais de reset, um habilitado em nvel alto (RST)
e outro habilitado em nvel baixo (#RST), que so usados em diversos pontos da placa.

Empregamos um flip-flop tipo D (U49A) para controlar o estado de boot. Este flip-flop est ligado
no modo toggle. Note que sua sada #Q est em curto com a entrada D. Desta forma, toda vez que
surgir um flanco positivo () em sua entrada CLK, ele muda de estado. O sinal de reset habilitado em
nvel alto (RST) est ligado a essa entrada CLK. Assim, a cada ciclo de reset, este flip-flop muda de
estado. A sada #Q foi denominada #BOOT e a sada Q denominada BOOT.

A entrada de preset (PR) deste flip-flop est ligada a um circuito RC (R68 e C75) para forar um
nvel baixo nesse pino toda vez que o circuito for energizado e assim garantir que, ao ligar, a placa
entre automaticamente no modo boot. importante indicar que a constante de tempo (R68 e C75) do
circuito que comanda a ativao do preset de U49A de 4,7 ms, muito menor (46 vezes) que os 220
ms que a constante de tempo (R70 e C68) do circuito que comanda o reset da placa. Isso
proposital, pois o flip-flop U49A, que comanda a lgica de boot, deve estar num estado definido por
ocasio da finalizao do reset da placa. O led D1 (QD-VD) acende sempre que a placa estiver no
modo boot.

Agora fcil entender a operao. Ao ligar a placa, ela automaticamente entra no modo boot. Ao
apertar o reset, ela sai do modo boot, entrando no que denominamos modo execuo. Ao acionar
novamente o reset, ela volta para o modo boot e assim sucessivamente. Enquanto estiver no modo
boot, o Pentacontrolador fica esperando receber o programa a ser executado e, enquanto estiver no
modo execuo, ela executa o programa recm recebido. Atravs do jumper JP18, o usurio pode
escolher se deseja ou no o recurso de boot. Quando se fecha 2-3, aterra-se o pino de clear (CL) de
U49A e, em conseqncia, o flip-flop fica zerado e nunca entra no modo boot, ou seja, o
Pentacontrolador est preso no modo execuo. Ao fechar 1-2 no jumper JP18, o flip-flop passa a
funcionar, podendo alternar entre o modo boot e o modo execuo. Quando no modo boot,
comandado pelo programa presente na EPROM (BOOT1P00.HEX), o P5C recebe o programa do
usurio via porta serial, paralela ou USB. O contedo da EPROM, o arquivo fonte e o arquivo j
montado podem ser conseguidos na pgina da editora.
Existe a disponibilidade de diversos membros da famlia 8051 com memria interna tipo EEPROM
ou flash. Tais microcontroladores so interessantes, pois dispensam o emprego da memria de
programa externa. claro que se torna necessrio gravar essa memria interna, mas um problema
enfrentado que cada fabricante especifica uma rotina diferente para gravao. No P5C, para
viabilizar a programao de tais memrias sem que o microcontrolador precisasse ser removido da
placa, adicionamos um circuito extra para o controle do reset, #PSEN e #EA. Com tal circuito,
conseguimos habilitar as condies necessrias para a programao (gravao) de diversos
microcontroladores, especialmente os da Dallas e os da Atmel. claro que no foi possvel atender
a todos. Os detalhes da gravao dessas memrias EEPROM e flash esto apresentados no Anexo G.
Por hora, adiantamos apenas que, com a chave SW4, podemos ativar permanentemente o reset e,
atravs de U43A, U43B e U43C, controlamos o nvel lgico dos pinos #EA e #PSEN (figura 12.3).
12.4. Planta 02: Memrias.

Em sua operao, o Pentacontrolador faz uso de trs memrias: uma EPROM (U28) (ou
simplesmente ROM) e duas memrias SRAM (U31 e U32), denominadas RAM1 e RAM2,
como pode ser constatado na figura 12.4. Vamos agora estudar com detalhes como as
memrias se comportam segundo o modo de operao. No modo boot, a ROM a
memria de programa e nela est a rotina responsvel por inicializar o P5C e receber do
PC, via porta serial, paralela ou USB, o programa do usurio, enquanto que a RAM1 a
memria de dados, onde escrito, como se fosse dado, o programa do usurio recebido
do PC. Aps a recepo, ao acionarmos o boto de reset, o P5C entra no modo
execuo, desabilitando a ROM. A RAM1 passa a ser memria de programa,
possibilitando a execuo do programa do usurio, enquanto que a RAM2 passa a ser
memria de dados. A tabela 12.1 apresenta os modos de operao e as memrias
empregadas.

Agora que temos uma pequena noo dos dois modos de operao, vamos aumentar o detalhamento e
estudar a forma como foi projetado o endereamento do Pentacontrolador. Como j vimos, a famlia
8051 trabalha com dispositivos de E/S mapeados em memria, ou seja, ocupando endereos no
espao da memria de dados externa. Como o P5C faz uso de apenas uma memria RAM com 32 KB
para dados, resolvemos reservar a primeira metade do espao de endereamento para essa memria
e, com isso, a segunda metade foi destinada para E/S. Ficamos assim com 32 K endereos para E/S,
o que uma rea muito grande. Seu emprego ser visto na prxima seo.

A seleo dos dois blocos de 32 K endereos feita com a linha de endereo BA15. Se BA15 = 0, a
primeira metade selecionada e, se BA15 = 1, a segunda metade selecionada. A tabela 12.2
apresenta em detalhes os espaos de endereos ocupados pelas memrias e dispositivos de E/S para
os dois modos de operao.

Se analisarmos o que foi descrito para a ROM, conclumos que ela s tem finalidade no modo boot,
pois ela desabilitada no modo execuo. Obviamente, isto um desperdcio. Assim, foi permitido
que a ROM permanecesse ativa durante o modo execuo, mas ocupando a segunda metade do
espao de endereos de programa. Desta forma, possvel gravar nessa ROM uma biblioteca de
funes que fiquem disponveis para o usurio durante o modo de execuo. Veja esse detalhe na
tabela 12.2. Atravs do jumper JP19, o usurio pode optar por desabilitar a ROM quando no modo
execuo.

Note que a tabela 12.2 tambm apresenta os sinais de controle para acesso s memrias (#PSEN,
#RD e #WR). A tabela 12.3 apresenta a mesma informao, mas agora organizada segundo esses
sinais de controle, e ainda apresenta a faixa de endereos de cada rea.

Agora que j estudamos essas tabelas e ficamos com uma ideia razovel do que cada memria deve
fazer, chegou a hora de dedicarmos ateno ao circuito. No modo boot, a memria ROM deve ocupar
a faixa [0000 7FFFH] e responder ao sinal #PSEN. J no modo execuo, ela deve ocupar a faixa
[8000H FFFFH] e novamente responder ao sinal #PSEN. Assim, empregamos um multiplexador
para selecionar o sinal de habilitao para a ROM, como est mostrado na figura 12.21. O
funcionamento muito simples e faremos uso dos sinais X e Y, marcados na figura. Quando no modo
boot (BOOT = 1), temos X = 1 e Y = BA15, logo a sada #CE = BA15. A ROM s habilitada
quando se estiver na primeira metade do espao de endereos (BA15 = 0). Por outro lado, quando no
modo execuo (BOOT = 0), temos Y = 1 e X = #BA15, logo a sada #CE = #BA15. A ROM s
habilitada quando se estiver na segunda metade da faixa de endereos (BA15 = 1).
Passemos agora ao estudo de todo o circuito que controla a ROM, mostrado na figura 12.22. J
vimos que, no modo boot (BOOT = 1), a ROM s habilitada se BA15 = 0, que corresponde faixa
[0000 7FFFH]. Quando no modo execuo (BOOT = 0), a ROM s habilitada se BA15 = 1, que
corresponde faixa [8000H FFFFH]. Vamos agora estudar o jumper JP19, que s tem influncia
quando a placa estiver no modo execuo. Se colocado na posio 1-2, ele d passagem ao sinal
BA15 e a ROM pode ser habilitada quando BA15 = 1. Entretanto, se colocado na posio 2-3, ele
aterra a entrada do inversor e a ROM nunca habilitada com BA15 = 1. Por isso, o jumper JP19
empregado para selecionar a disponibilidade da ROM quando no modo execuo. O controle de
sada da ROM (#OE) ativado com #PSEN, como era esperado. Na EPROM, a entrada VPP (pino
1), que tem utilidade apenas por ocasio da gravao, deve ser aterrado.

Agora que estudamos o controle da ROM, fica mais fcil entendermos como funciona o circuito de
controle da RAM1, que est mostrado na figura 12.23. Iniciamos constatando que a RAM1 sempre
ocupa a primeira metade do espao de endereos, quer seja como memria de programa (execuo),
quer seja como memria de dados (boot). Confira na tabela 12.2. Assim, a habilitao feita com o
sinal BA15 conectado ao pino #CE, ou seja, a RAM1 s trabalha quando BA15 = 0. J o controle de
leitura mais complexo. Quando no modo boot, a RAM1 trabalha como memria de dados e,
portanto, deve responder ao sinal #BRD. Mas quando no modo execuo, a RAM1 trabalha como
memria de programa e, portanto, precisa de responder ao sinal #PSEN. Para que isso acontea,
bastou colocar um multiplexador (U39C, U39D e U35C) para selecionar o sinal a ser entregue ao
pino #OE dessa memria. A escrita (#BWR) nesta memria s pode acontecer quando no modo boot,
o que garantido pela porta U19A.

O controle da RAM2, apresentado na figura 12.24, muito mais simples. Essa memria sempre
ocupa a primeira metade do espao de endereos (BA15 = 0) e s pode operar quando o circuito
estiver no modo execuo (BOOT = 0), o que garantido com uma porta OU (U19B). Os sinais de
leitura (#BRD) e de escrita (#BWR) so ligados da forma esperada.

A figura 12.24 ainda apresenta o conector de expanso (JF2) com todos os sinais de que o usurio
pode necessitar. Esto disponveis os barramentos de endereos e de dados, alm dos sinais de
controle (#PSEN, #BRD, #BWR, ALE, BOOT e RST). H ainda a disponibilidade de trs endereos
decodificados, atravs de #CS4, #CS5 e #CS6, de trs pinos da porta P1 (P1.0, P1.1 e P1.2) e uma
interrupo (INT1-PD1). O pino que sobrou (23) foi conectados a ilha de solda (IR32) e pode ser
usado para dar sada a algum outro sinal de que o usurio necessite. Finalmente, tambm esto
disponveis Vcc e terra.
12.5. Planta 03: Decodificador.

Como pode ser observado na figura 12.5, a planta do decodificador traz, alm do circuito
decodificador de endereos de E/S, dez sub-plantas que englobam os diversos dispositivos
de E/S empregados. Vamos apenas estudar o decodificador aqui empregado, j que os
diversos dispositivos sero depois abordados. A figura 12.25 apresenta o circuito do
decodificador.

Como vimos na seo anterior, reservamos 32 K endereos para E/S. Com o emprego de um
decodificador (U16), vamos fazer uso de apenas 2 K endereos. O restante da rea fica livre para ser
usado por outros dispositivos de E/S ou para ser ocupado por mais memria RAM. Iniciamos
verificando a habilitao do U16, que um decodificador 3x8. Graas porta E (U35D), o
decodificador s habilitado quando ou #BRD ou #BWR estiver ativo. Isso garante que, nos ciclos
de leitura de memria de programa, os perifricos permaneam desabilitados. A habilitao s
ocorre com BA15 = 1 (U18D), BA14 = 0, BA13 = 0 (U19C), BA12 = 0 e BA11 = 0 (U19D). Isso
fixa a faixa de endereos ocupada pelo decodificador. A figura 12.26 apresenta em detalhes como
est fixado o endereo do decodificador: os bits BA15, ..., BA11 amarram o endereo base do
decodificador, que est na faixa [8000H 87FFH]. Os bits BA10, BA9 e BA8 so decodificados,
gerando oito sinais de seleo (#CSi) e, finalmente, os bits BA7, ..., BA0 so ignorados.
Pelo que foi explicado, cinco bits de endereo esto fixos e 11 bits so decodificados ou ignorados.
O espao total ocupado por tal decodificao de 2 K endereos (211). Esse espao de 2 K est
dividido em oito partes iguais. Assim, cada sada do decodificador habilitada para uma faixa de
256 endereos. Alis, isso pode ser facilmente observado, pois note na figura 12.26 que, para cada
combinao de BA10, BA9 e BA8, existem 8 linhas de endereos ignoradas. A tabela 12.4 apresenta
os endereos decodificados e seus empregos.

O esquema de decodificao foi planejado para facilitar seu emprego. A parte menos significativa do
endereo pode ser ignorada, ou seja, quando formos inicializar o DPTR, escrevemos apenas no DPH
e podemos ignorar o DPL. Existem algumas excees que sero abordadas oportunamente. Alm
disso, fcil a memorizao do endereo de cada sinal de seleo. Por exemplo, #CS5 ativado
com endereo 85XXH. Deve ser notado que desperdiamos espao, pois cada #CSi ocupa uma faixa
de 256 endereos. Por outro lado, o decodificador ficou bem simples.
12.6. Planta 04: LEDs.

A planta de acionamento dos leds bastante simples. A figura 12.27 traz a parte do
circuito que relevante. Empregamos um total de nove leds, de diversas cores. O latch
(U21) o que define o estado dos leds. Sua entrada G s habilitada quando no
barramento de endereos estiver presente um endereo na faixa [8000H 80FFH] e surgir
um pulso de escrita (#BWR). Em outras palavras, especificamos o latch como um
dispositivo de sada, ocupando os 256 endereos (80XXH) selecionados por #CS0. Foi
preciso empregar uma porta OU negada (U18B), isso porque, enquanto #CS0 = 0 e #BWR
= 0, precisvamos ter G = 1. O ltimo estado do barramento de dados fica armazenado
neste latch (U21) quando um desses dois sinais for desabilitado (G = 0). No devemos
esquecer-nos de que os leds so acesos quando o respectivo bit for colocado em 0 pois
s assim a porta U21 passa a drenar corrente.

A figura 12.27 apresenta os leds ordenados de acordo com a significncia de seus bits, ou seja, o led
mais direita (D24) controlado pelo bit zero (B0) do barramento de dados; j o led mais
esquerda (D18) controlado pelo bit seis (B6) do barramento de dados. Assim, fica fcil o controle
e o uso dos leds para apresentar valores em binrio.

Devemos ressaltar que, no projeto do Pentacontrolador, reservamos os leds retangulares para indicar
estados internos: reset (D2, QD-AM), boot (D1, QD-VD), passo-a-passo (D3, QD-VM) e sinal pelos
receptores infravermelho (D25, QD-AM). Os leds redondos foram reservados para o usurio realizar
sua sinalizao. Assim, sugerimos que D18, D19, D20, D21, D22, D23 e D24 sejam leds redondos
(3 ou 5 mm).

Os leds D9 e D11 esto ligados ao mesmo bit de dado, ou seja, acendem juntos. Eles so leds que
trabalham na faixa infravermelha e podem ser usados para gerar uma sada do tipo de controle
remoto ou para a HP 48. Empregamos dois leds para conseguirmos uma maior disperso na gerao
do sinal infravermelho. A tabela 12.5 traz um resumo da posio ocupada por cada led e do nvel
necessrio para seu acendimento.

O CI de trs estados (U20) usado para ler o estado dos leds. Ele envia o estado dos leds para o
barramento de dados toda vez que no barramento de endereos estiver presente um endereo na faixa
de #CS0 [8000H 80FFH] e surgir um pulso de leitura (#BRD). Isso foi garantido com a porta OU
(U30A). A leitura do estado dos leds seria dispensvel porque o programador pode manter na RAM
interna uma cpia desses estados. Na eventualidade de no se usarem leds, o latch (U21) pode
trabalhar como uma porta paralela de sada. Como o controle #OC deste CI (U16) est aterrado, no
h como construir uma porta de entrada, pois, toda vez que for lido o endereo de #CS0, retornado
por U20 o byte programado no latch (U21). Para tornar essa porta bidirecional, necessrio um
controle especial para o pino #OC (U21), que no era objetivo deste trabalho.

A figura 12.28 traz o circuito para acionamento do mostrador (display) de 7 segmentos (U23). Aqui
estamos apresentando o esquema em separado, entretanto o leitor deve estudar a planta da figura 12.6
e constatar que o mostrador de 7 segmentos compartilha os mesmos sinais usados para acender os
leds. uma deciso do usurio se pretende usar os leds ou o mostrador de 7 segmentos, ou ambos.
Usando o jumper JP11 o usurio seleciona se a alimentao VCC ser encaminhada para os leds
(fechando 1-2) ou para o mostrador de 7 segmentos (fechando 2-3). importante que o mostrador
seja do tipo anodo comum. Observao: na figura 12.28, para beneficiar a clareza, mudou-se a ordem
dos pinos do mostrador de 7 segmentos. Alm dos leds, a tabela 12.5 tambm indica como esto
conectados os diversos segmentos do mostrador (U23).
12.7. Planta 05: LCD.

O emprego do mostrador LCD comum em diversos projetos. O motivo simples: eles


so relativamente baratos, de fcil conexo e possibilitam o envio de mensagens
alfanumricas, sendo muito agradvel ao projetista. Assim, no projeto do P5C, decidiu-se
pela adio de tal mostrador. Para no ficarmos restritos aos mostradores alfanumricos,
dotamos a interface com capacidade para aceitar tambm mostradores grficos. O
Apndice C faz um estudo detalhado de tais mostradores. O circuito para desempenhar tal
funo est apresentado na figura 12.29. Note que, para beneficiar a clareza, alteramos a
ordem dos pinos do conector JF1.

Os mostradores LCD precisam de um barramento de dados bidirecional, que o usurio


pode optar por 4 ou 8 bits. Decidimos por 8 bits e usamos um latch (U22) para gerar a
sada de dados e um buffer de trs estados (U17) para permitir a entrada de dados. Para
que os dois CIs juntos constitussem uma porta bidirecional, era necessrio controlar
parte o pino OC do latch (U22), o que foi conseguido com o sinal R/W (U13.6). A porta
NOU (U18C) garante que o latch trabalhe nos ciclos de escrita usando o endereo 82XXH,
enquanto que a porta OU (U30C) garante que o buffer de trs estados ocupe o endereo
82XXH nas operaes de leitura. Foi assim construdo um barramento bidirecional de 8
bits, que denominamos barramento XD ou simplesmente XD[0..7].

O conector JF1 est dedicado ao mostrador LCD e, empregando um cabo plano (flat
cable), o usurio dever fazer a conexo. O controle do LCD feito pelos sinais gerados
no latch (U13). A tabela 12.6 apresenta a seleo dos registradores do mostrador LCD em
funo dos sinais de controles E, RS e R/W, gerados a partir de U13. Em especial, note
que a escrita no LCD feita com R/W = 0, o que garante OC = 0 no latch (U22.1). Note
tambm que a leitura no LCD faz uso de R/W = 1, tendo, portanto, OC = 1 e permitindo
ento a operao do barramento como entrada.
Em geral, os LCD alfanumricos fazem uso dos pinos de 1 a 14 (JF1), mas quando oferecem luz de
fundo, usam at o pino 16. J os LCD grficos fazem uso de mais sinais, perfazendo um total de 20
pinos. Os sinais de controle SEL1, SEL2, #LCD-RST (U13.15) so empregados apenas nos LCD
grficos. Dois sinais gerados pelo latch U13 no so empregados no controle do LCD. Eles so o
sinal CE-RP, que se destina a habilitar o relgio permanente DS1305 (U5), e o sinal EOC (end-of-
convertion) que serve como sincronismo para o conversor A/D (U25). Ambos sero estudados mais
adiante. A qualquer momento o programador pode ler os sinais de controle programados em U13,
atravs do buffer de trs estados U8. Esse CI U8 seria dispensvel se o programador mantivesse em
memria um registro dos sinais de controle enviados. Entretanto, sua colocao teve a inteno de
facilitar a programao.

Todo LCD possui uma lgica de contraste (JF1.3) que controlada pelo resistor R20 e pelo
potencimetro R45. Por intermdio de R45, ajustamos o contraste desejado. Quando se usa um LCD
alfanumrico, basta fechar 1-2 no jumper JP7. Para o caso de LCD grfico, necessrio usar uma
tenso negativa para o contraste. Alguns mostradores LCDs geram essa tenso internamente. Nesse
caso, fechamos 2-3 no JP7 e 2-3 no JP10. Caso a placa LCD no gere sua tenso negativa para o
contraste, temos ainda a opo de uma a fonte de 10V (gerada pelo MAX232, U9) ao fecharmos 1-2
no JP10. A luz de fundo nos mostradores LCD conseguida com um led, cujo anodo e catodo esto
disponveis nos pinos denominados A (JF1.15) e K (JF1.16), respectivamente. O controle de tal
iluminao feito por R21, R47 e D14. Na maioria dos casos, pode-se substituir D14 por um curto-
circuito. Atravs de R47, temos a possibilidade de ajustar o nvel de iluminao desejado.
12.8. Planta 13: Interrupes.

Precisamos agora fugir da ordem das plantas para abordarmos as interrupes, pois elas
sero empregadas pelos prximos circuitos. J vimos que o 8051 oferece duas entradas
para interrupes externas, denominadas #INT0 e #INT1. Dessas duas interrupes, a
#INT0 foi usada para o modo Passo-a-Passo, de forma que sobra para o restante da
placa apenas a interrupo externa #INT1. Uma nica interrupo certamente pouco para
a complexidade do P5C. Assim, foi necessrio adicionar um circuito para permitir que essa
interrupo fosse compartilhada entre diversos perifricos. Decidimos por um
compartilhamento com oito entradas, conseguido com o circuito apresentado na figura
12.30.

O conjunto de portas U47 e U34C forma uma porta E com oito entradas, que ligada ao pino de
interrupo #INT1. Qualquer uma das entradas, quando colocada em zero, leva a sada desta porta
para nvel baixo, provocando assim a interrupo. A tabela 12.7 apresenta uma lista das interrupes
disponveis e sua posio relativa dentro da palavra de 8 bits. interessante que a interrupo
#INT1 do 8051 seja programada para trabalhar por nvel. A chave Dip-Switch SW5 permite que se
selecione individualmente a interrupo a ser usada. O mesmo pode ser conseguido fechando os
jumpers JP21 a JP28, que esto em paralelo com a chave SW5. Para definir o nvel de tenso das
entradas de interrupo que no esto sendo usadas, foram empregados os resistores pull-up
numerados de R59 a R66.
Para completar o projeto, preciso adicionar recursos para que a rotina de servio da interrupo
#INT1 possa identificar qual das 8 entradas de U47 foi colocada em nvel baixo. Para tanto,
adicionamos um buffer de trs estados (U46) para permitir que se leiam essas oito entradas.
importante notar que o buffer (U46) emprega apenas o endereo da faixa #CS7 [8700H 87FFH],
sem fazer distino entre leitura e escrita. claro que a leitura na faixa de endereos de #CS7
retorna o valor correto. O que ser que acontece se for feita uma escrita na faixa de endereos de
#CS7? Veja o exerccio 12-3.

Vamos continuar a tratar do projeto do compartilhamento da interrupo externa 1. H um outro ponto


que inspira cuidados. Consome-se um tempo razovel para vetorizar a interrupo #INT1 e ler o
buffer (U46). Seria um grande problema se, ao lermos U46, descobrssemos que o pedido j foi
removido, ou seja, que demoramos demais para fazer a leitura. Nesse caso, ficaramos sem saber
qual das oito entradas pediu interrupo. Para evitar esse problema, colocamos um flip-flop em cada
uma das 8 interrupes compartilhadas. Desta forma, o pedido fica registrado at ser atendido.
Entretanto, temos agora de ter o cuidado de apagar o pedido to pronto ele seja atendido e assim
permitir que o prximo possa ser recebido. Existem algumas excees que sero comentadas
oportunamente. A figura 12.31 apresenta uma entrada de interrupo que foi reservada para
expanso, onde pode ser apreciado o flip-flop que registra o pedido de interrupo.
A entrada de interrupo destinada expanso denominada de pedido 1 (INT1-PD1). Assim, um
flanco positivo () nessa entrada ativa o flip-flop (U7B), pois sua entrada D est ligada a Vcc. A
ativao resulta na sada Q = 1 e #Q = 0, que ir requerer a interrupo atravs da porta E (U47 e
U34C) mostrada na figura anterior. O pedido fica registrado nesse flip-flop at ser apagado via
programa, atravs da ativao do pino #CL (U7B.13). Para o caso do flip-flop U7B, qualquer
acesso, de leitura (#BRD) ou de escrita (#BWR), que ative #CS7 e que tenha a linha de endereo
BA5 = 0 (U4D) apaga essa requisio da interrupo. Como j dissemos, essa tcnica de registrar o
pedido de interrupo num flip-flop foi empregada na maioria das interrupes compartilhadas,
como veremos ao longo do restante deste captulo. O resistor R11 faz o pull-up do pino CLK quando
no existir dispositivo acionando essa entrada.

Agora, empregando o que j foi comentado na seo 11.3, vamos apresentar um truque que ajuda a
gerar sinais extras para a seleo de CIs, sem a necessidade de um novo decodificador. Usamos
#CS7 junto com uma das oito linhas de endereos (BA0, ..., BA7) que at ento eram ignoradas. Note
que, atravs de U4D, geramos o sinal para apagar o flip-flop U7B quando #CS7 = 0 e BA5 = 0.
Usamos essa tcnica para gerar o sinal de cancelamento dos demais pedidos de interrupo. A tabela
12.8 apresenta um resumo das interrupes e de como apagar suas requisies. Essa tabela no
apresenta todas as combinaes possveis, mas serve para deixar clara a idia de se empregar uma
linha de endereo junto com o sinal de seleo #CS7.
12.9. Planta 6: Teclado.

Em projetos complexos como no caso do P5C, grande o conforto que se obtm com a
adio de um teclado. Antigamente, fazia-se uso simplesmente de chaves tipo push-buttom
ou de teclados matriciais, como os de telefones. Hoje em dia, com a disponibilidade dos
computadores, ficou muito barato o uso do teclado tipo PC. Assim, foi projetada uma
interface PS/2 que permite a adio de um teclado ou at de um mouse. Entretanto, como
temos finalidade didtica, para no ficarmos limitados a um teclado, previmos tambm uma
chave push-buttom que, ligada ao pino P1.0, permite uma srie de experimentos simples.
A figura 12.32 traz tais circuitos.

Tratemos primeiro da chave SW7. Por intermdio dessa chave, o usurio pode controlar o nvel
lgico no pino P1.0, que deve ser programado como entrada. Como os pinos da porta P1 j tm pull-
up interno, no foi necessria a adio de um resistor para definir o nvel de tenso no pino P1.0
quando a chave estiver aberta. Esta chave permite experimentos com a porta P1, trabalhos para
tratamento de rebotes e ainda uma entrada muito simples que pode ser empregada por diversos
programas.

O teclado do PC um circuito inteligente que se comunica atravs de um protocolo serial sncrono.


Na grande maioria das vezes, estamos recebendo do teclado a informao da tecla acionada, mas
tambm podemos enviar comandos para o teclado, por exemplo, para acender seus leds, para definir
taxa de repetio, etc.. O Apndice D traz todos os detalhes para se trabalhar com o teclado do PC.
As duas linhas do teclado KBD-CLK e KBD-DT precisam de ser bidirecionais, razo pela qual
usamos dois pinos da porta P1, a saber: P1.2 e P1.1. Quando o teclado vai enviar dado, ele
disponibiliza os bits serialmente e indica a validade de cada bit com um flanco descendente () na
linha KBD-CLK. Esse flanco descendente pode ser monitorado por P1.2 e o bit de dado lido por
P1.1.

Para no obrigar o C a ficar constantemente monitorando os pinos da interface com o teclado,


criamos a possibilidade do relgio do teclado (KBD-CLK) provocar interrupo. Como a porta
NOR (U34A) estava ociosa, ela foi empregada como uma inversora. Aps essa porta, a validao do
relgio do teclado sentida como um flanco de subida () que aplicado ao pino CLK do flip-flop
tipo D (U49B). Note que a entrada D deste flip-flop est conectada a Vcc assim, cada flanco na sua
entrada CLK resulta em Q = 1 e #Q = 0. Essa sada #Q = 0 faz o pedido da interrupo externa 1, que
est sendo compartilhada com diversos outros recursos, como j vimos. Na rotina de servio de
interrupo, deve estar o programa responsvel por receber os bits do teclado, montar o byte e
identificar a tecla acionada.

Note que, aps cada interrupo, o flip-flop U49B deve ser zerado, para poder provocar uma nova
interrupo. Isso conseguido com uma porta OU (U4A) cuja sada vai para zero quando se acessa a
faixa de endereos de #CS7 com o bit BA2 = 0. J comentamos esse ponto, entretanto, vamos agora
apresentar uma nova ptica. Para apagar o pedido de interrupo, precisvamos gerar um pulso em
nvel baixo. Dizemos pulso, pois sua durao muito pequena. Poderamos ter gerado esse pulso
atravs de um bit de uma das portas paralelas do C ou atravs de um latch. Entretanto, tal soluo
seria um desperdcio. Por isso, optamos por usar a sada #CS7 do decodificador. Como temos vrias
interrupes, precisvamos gerar diversos sinais desse tipo. Assim, identificamos cada sinal com a
ajuda de uma linha de endereo (BA0, ..., BA7) (aquelas que estavam sendo ignoradas pelo
decodificador). Para a porta PS/2, foi dedicada a linha BA2. importante ficar claro que qualquer
acesso que ative a linha #CS7 do decodificador e que tenha o bit BA2 em nvel baixo apaga o flip-
flop de interrupo do teclado.

Na planta do teclado, alm do que j foi estudado, encontramos tambm um conector de expanso
(JF3) com diversas sadas e entradas, como mostrado na figura 12.33. Para aproveitarmos o espao
que sobrava, o esquema desse conector foi colocado nessa planta. Neste conector, esto disponveis
diversas portas paralelas. Com o emprego de um latch (U29), criamos um barramento de sada de 8
bits. Esse barramento unidirecional, pois aterramos o pino #OC (U29.1) deste CI. Qualquer escrita
na memria de dados na faixa de #CS3 [8300H 83FFH] transfere o dado para este latch. J a porta
de entrada de 8 bits foi conseguida com o uso de um buffer de trs estados (U33). Graas porta OU
(U4B), qualquer leitura na memria de dados na faixa de #CS3 [8300H 83FFH] retorna o dado
presente na entrada deste CI.
Devemos verificar que neste conector tambm est disponvel o barramento bidirecional que foi
usado para comunicao com o LCD (barramento XD). Somente quando estiver habilitado (E = 1), o
LCD faz uso desse barramento. Assim, seria um grande desperdcio deix-lo exclusivo para essa
finalidade. Enquanto o LCD estiver desabilitado (E = 0), podemos usar esse barramento para outras
finalidades. claro que precisamos tomar cuidado nesse compartilhamento, de sorte que, quando for
necessrio realizar operaes com o LCD, elas no interfiram com o que estiver conectado neste
barramento.

Esse conector JF3 ainda apresenta outros sinais, que tm a finalidade de facilitar a criao de
expanses. A interrupo externa 0 (#INT0) tambm est disponvel (JF3.21). Devemos lembrar que
essa interrupo usada para o modo Passo-a-Passo. Quando esse modo no estiver sendo usado,
pode-se lanar mo dessa interrupo. Duas das entradas do compartilhamento da interrupo
externa 1 (INT1-PD0 e INT-PD1) tambm esto disponveis. A entrada INT-PD0 est compartilhada
com o controlador IrDA MAX3100 (U12) e ser oportunamente explicada. Temos ainda os quatro
primeiros bits da porta P1, quatro entradas analgicas (CH0, CH1, CH2 e CH3) para o conversor
A/D e a sada analgica do conversor D/A, que direta (AOUT) e com filtro passa-baixas
(AOUTF). Finalmente, Vcc e terra tambm so acessados atravs de JF3. O pino 18 est sobrando
para que o usurio disponibilizasse algum outro sinal da placa P5C.
12.10. Planta 07: Conversor A/D.

Em qualquer projeto, sempre interessante um sistema para a digitalizao de sinais


analgicos, quer seja para o processamento de sinais, quer seja para o controle ou ainda
com a finalidade didtica. Assim, projetamos um conversor A/D para o Pentacontrolador.
Esperamos que, alm da finalidade didtica, ele tambm seja empregado em sistemas de
aquisio e de processamento de sinais. A verso anterior trazia um conversor de 12 bits
(ADC12048), mas ele se revelou difcil de ser usado, assim decidimos por uma
simplificao e optamos pelo clssico ADC0808, que possui apenas 8 bits, mas de fcil
emprego e programao. A figura 12.34 apresenta o esquema usado para o conversor
A/D.

O barramento de dados desse conversor foi conectado ao barramento de dados do C. Seus oito
canais analgicos foram denominados de CH0, ..., CH7. Os quatro primeiros canais foram colocados
disposio do usurio atravs do conector de expanso JF3. Os trs canais seguintes (CH4, CH5 e
CH6) esto conectados a ilhas de solda (IR21, IR23 e IR25) para que, se for o caso, possam tambm
ser empregados. Note que prximo a essas ilhas de solda existem pontos de terra (IR22, IR24 e
IR26) para facilitar a conexo. O canal CH7 foi destinado a receber o sinal de um microfone, como
veremos mais adiante. O endereo desse conversor foi definido dentro da faixa de #CS4 [8400H
84FFH].
Faremos a seguir uma rpida explicao do uso deste conversor AD, entretanto recomendamos a
leitura do manual do fabricante (National). Como j afirmamos, ele oferece 8 canais analgicos
(CH0, ..., CH7). A seleo do canal a ser usado feita com uma escrita no endereo 84DFH (notar
BA5=0), com Acc contendo o nmero do canal escolhido. Por exemplo, para escolhermos o canal 5,
preciso fazer Acc=5, DPTR=84DFh e executar a instruo de escrita: MOVX @DPTR,A. Uma vez
selecionado o canal ele assim permanece at que se selecione um outro canal.

A converso iniciada com um pulso positivo na entrada START (U25.6). Esse pulso gerado com
o emprego do latch U13, veja o pino U13.19. Durante o uso do conversor AD, interessante manter
este pino em zero. Para iniciar uma converso, ele deve levado para um e trazido novamente para
zero. O tempo gasto nesta operao gera um pulso com durao suficiente para o AD.

Uma vez gerado o pulso de START, o sinal de fim de converso (EOC) vai para zero e assim
permanece enquanto o AD realiza a converso. Um flanco positivo () em EOC, ou seja, o retorno de
EOC para o nvel um, indica o fim de converso. Este flanco positivo usado para acionar o flip-
flop U40A que gera um pedido de interrupo (#INT1-AD). O nvel lgico do sinal EOC tambm
pode ser monitorado atravs do bit 7 do buffer U8, veja pino U8.17. Uma leitura deste buffer traz o
valor atual do sinal EOC. Uma vez terminada a converso (EOC = 1), o dado correspondente
obtido com uma leitura no endereo 84BFH. Caso se esteja usando a interrupo, necessrio
apagar o pedido de interrupo com uma leitura no endereo 87F7H, vide U26B. Durante uma
converso, no se deve fazer leitura do AD.

De acordo com o manual do ADC0808, a faixa de frequncia para sua entrada CLK de 10,00 kHz
at 1.280,00 kHz. Para gerar um sinal de relgio dentro desta faixa, usamos os sinais #PSEN ou
ALE. O usurio faz a seleo usando o jumper JP30. Sempre que possvel, recomendamos o uso do
ALE para gerar o sinal de CLK do AD. A porta OU (U48B) faz o papel de buffer, para evitar que
R53 e C55 interfiram com esses sinais. Em seguida, o flip-flop U40B, no modo toggle, faz a diviso
por 2 e entrega o sinal para o AD. Considerando o uso de um cristal de 11,0592 MHz, o sinal AD-
CLK de 460,8 kHz (11,0592 MHz / (2 x 12) = 460,8 kHz). Isto tudo foi feito para permitir que o
usurio possa empreguar um controlador com relgio mais alto. A mxima frequncia do relgio
(cristal) do C, para ainda acionar corretamente o AD, de 30,72 MHz.

A entrada de alimentao (U25.11) precisa ser filtrada com um par de capacitores, sendo um
cermico (C39, 100 F) e um eletroltico (C42, 10 F). As entradas de referncia de tenso, REF+
(U25.12) e REF- (U26.16), so usadas para indicar a faixa de excurso do A/D. Para evitar fixar
essas duas entradas, preferimos usar jumpers. O jumper JP9 permite referenciar REF+ a Vcc, quando
fechado 1-2, ou ento referenci-lo entrada VREF+ (IR29), a ser fornecida pelo usurio, quando se
fecha 2-3. Algo semelhante foi feito com a entrada REF-, mas agora a conectando ao terra atravs de
1-2 do jumper JP8 ou ento a uma referncia negativa (IR27) a ser fornecida pelo usurio.

Para permitir alguns experimentos na faixa de udio, preparamos o P5C para receber o sinal de um
microfone de eletreto. O circuito responsvel por esta tarefa est apresentado na figura 12.35. O
microfone deve ser conectado J4, que um conector estreo, mas preparado para trabalhar como
monofnico, pois os dois pinos de sinal esto em curto. O motivo de se usar o conector estreo
porque ele mais fcil de ser encontrado que o monofnico. O resistor R44 faz a polarizao do
microfone e o capacitor C43 faz o desacoplamento CC. O estgio pr-amplificador formado por
U14A, R25 e R27, que fornece um ganho aproximado de 275 (330 k / 1,2 k). O amplificador com
ganho regulvel formado por U14B, R24, R36 e R38. Atravs de R38 (potencimetro de preciso),
possvel programar o ganho desse estgio desde o mnimo de 0,325 (39 k / 120 k) at o mximo
de 2,82 (339 k / 120 k). A finalidade deste estgio amplificador ajustar a excurso do sinal de
forma a aproveitar de toda faixa disponvel no A/D. Com o uso de JP5, podemos usar (fechar 1-2) ou
no (fechar 2-3) esse amplificador ajustvel. O capacitor C31 foi colocado para a eventualidade de
se desejar bloquear o nvel CC do sinal. Entretanto, de acordo com o emprego aqui exposto, o
usurio deve substitu-lo por um curto. Note que a sada do estgio amplificador est conectada
entrada CH7 do conversor A/D.

Da maneira como foi projetado o circuito, muito fcil o emprego desse A/D na faixa de 0 a +5 V,
ou seja, conectando REF- ao terra e REF+ ao Vcc. Para tanto, o sinal analgico a ser digitalizado
deve ter valor mdio de 2,5 V e excursionar desde 0 V at +5 V. Por isso, os pinos 3 e 5 dos
amplificadores operacionais, que normalmente so aterrados nessa configurao, foram ligados a
uma referncia de 2,4 V obtida com um diodo zenner (D17). Note que R35, D17, C28 e C30 geram a
referncia de tenso de 2,4 V. Nesse caso, o capacitor de sada (C31) deve ser substitudo por um
curto. O circuito oferece muitas alternativas. O usurio pode, por exemplo, no construir a referncia
de 2,4 V e substituir C30 por um curto. Fazendo isso, o sinal de sada estar excursionando em torno
de 0 V. Alm disso, os resistores de realimentao dos amplificadores podem ser aumentados ou
diminudos de forma a oferecer outros ganhos.

Para ficar claro, repetimos a explicao sobre o estgio de amplificao. O microfone de eletreto
polarizado atravs de R44. O capacitor C43 serve para separar essa polarizao do restante do
circuito. O pr-amplificador foi construdo com o amplificador operacional U14A. Seu ganho da
ordem de 275 vezes (330k / 1k2). Para permitir que o usurio faa o ajuste fino do ganho global, de
forma a aproveitar ao mximo a faixa de excurso do conversor A/D, foi adicionado um segundo
estgio de amplificao, construdo com U14B. O ganho deste estgio pode excursionar deste 0,32
(39k / 120k) at 2,83 (339k / 120k), controlado por um potencimetro de preciso (R38,
multivoltas). claro que este esquema de amplificao pode ser empregado para condicionar
diversos outros sinais, bastando apenas alterar os resistores de forma a se conseguir novos ganhos na
amplificao. Note que o jumper JP5 permite isolar um dos amplificadores.
12.11. Planta 08: Conversor D/A.

A presena do conversor D/A interessante para gerarmos sinais de controle e tambm


para darmos sada a sinais que forem adquiridos atravs do conversor A/D aps
processamento. Na seleo do conversor D/A, julgamos que 8 bits seriam suficientes, pois
acreditamos no necessitar de sada analgica com preciso acima desta. Na faixa de voz,
por exemplo, o padro de telefonia mais simples faz uso de palavras de 8 bits,
digitalizadas numa taxa de 8 kHz.

A figura 12.36 apresenta o circuito empregado na converso A/D. Escolhemos o clssico


DAC0808, que razoavelmente fcil de ser encontrado e tem um baixo custo.
Recomendamos a leitura do manual do fabricante (National).

Como pode ser observado, o circuito para o conversor D/A muito simples. O dado a ser convertido
escrito no CI U27, que um banco com 8 flip-flops tipo D. Com o emprego da porta OU (U30D),
garantimos que esses flip-flops sejam acionados quando se fizer uma escrita no endereo 847FH. O
capacitor C46 foi usado para evitar rudos na linha de CLK desses flip-flops. A tabela 12.9
apresenta com detalhes o endereamento dos conversores A/D e D/A. Os capacitores C37 e C38
fazem a filtragem da entrada de referncia. O amplificador U14C responsvel por converter em
tenso o sinal de corrente fornecido pelo conversor. O resistor de realimentao (R26) pode ser
alterado para se obter a excurso desejada. A sada do conversor D/A foi denominada AOUT.
A figura 12.37 traz o filtro passa-baixas que pode ser usado na reconstruo de sinais na faixa de
voz. Ele um filtro de 1a ordem, com corte na freqncia de 5 kHz. Note que, na entrada deste filtro,
temos o sinal AOUT e, para designar sua sada, usamos a sigla AOUTF. Alm do filtro, temos o
capacitor C52, que serve para bloquear nvel CC, j que no conector J5 pretendemos conectar um
fone de ouvido. No muito correto conectar a sada do amplificador operacional diretamente ao
fone de ouvido. Deveramos usar um pequeno estgio separador (buffer), mas isso implicaria na
adio de mais componentes. Preferimos, portanto, abusar um pouco e disponibilizar diretamente a
sada do amplificador. O jumper JP14 permite ao usurio escolher se deseja usar (fechar 1-2) ou no
usar (fechar 2-3) o filtro. Caso no se deseje bloquear CC, deve-se substituir o capacitor C52 por um
curto.
12.12. Planta 09: Infravermelho.

Nos experimentos, interessante a presena de uma interface infravermelha devido a sua


simplicidade e versatilidade. Com tal interface, podemos criar sensores que detectem a
presena de pessoas atravs da interrupo de um feixe infravermelho. Aqui, daremos
mais importncia aos sistemas que transmitem informaes por canal infravermelho (IV),
tais como sinais de aparelhos de controle remoto (TV, videocassete, etc.) e calculadora
HP 48. Como elemento bsico de recepo, empregamos um fototransistor infravermelho,
sendo tpico o TIL 78 (Q1 e Q2). Quando recebemos sinais IV com esse componente,
ficamos limitados a uma distncia mxima de 0,5 a 1,5 metros. Isso porque, se
aumentamos muito a sensibilidade do receptor infravermelho, passamos a receber muitos
sinais esprios, tais como os provocados por sombras ou variaes de luminosidade. At o
tipo da lmpada empregada para iluminar o ambiente (incandescente ou fluorescente)
passa a influenciar.

O leitor deve estar se perguntando, como ser que conseguimos comandar nossas TVs a
partir grandes distncias. A explicao simples. O receptor infravermelho da TV est
preparado para receber sinais numa faixa estreita de freqncia, o que permite aumentar
bastante o ganho do receptor sem que se recebam sinais interferentes. costume
empregar esses sensores sintonizados nas freqncias de 30, 33, 36, 38 e 40 kHz. No
mercado, tais componentes so conhecidos como receptor infravermelho ou receptor de
controle remoto. Raramente trazem informaes sobre a freqncia de operao e
pinagem. Para tal, devemos recorrer ao manual do fabricante. No projeto do P5C, usamos
o SFH5110 da Osram, mas tambm se pode empregar o SFH505A (cuidado com a
pinagem!).

A figura 12.38 apresenta o circuito usado para receber sinais infravermelhos. Como
receptor IV genrico, empregamos dois fototransistores TIL78 (Q1 e Q2). Decidimos por
duas unidades para que pudssemos ter um bom ngulo de recepo. Seu funcionamento
muito simples: quando h incidncia de raios infravermelhos, o transistor satura. Os
resistores R8 e R9 fazem a polarizao e controlam a sensibilidade. Quanto maior o valor
de R8, menos corrente necessria para a saturao do fototransistor, ou seja, maior a
sensibilidade do receptor. De acordo com a aplicao, o usurio pode alterar os valores
desses resistores de forma a ter a sensibilidade adequada sua aplicao. Este o
receptor infravermelho genrico e com ele trabalhamos com sinais de controle remoto
comercial (apenas com baixo alcance) e com os sinais da calculadora HP 48.

Para tratar de maneira eficiente os sinais gerados pelos controles remotos comerciais e
ainda oferecer um bom alcance, adicionamos o receptor SFH5110 (U1). interessante
usar um filtro RC (R6 e C1) para garantir uma alimentao livre de rudos. O valor de C1
no deve ficar abaixo de 4,7 F quando se usa o SFH5110. Entretanto, como esperamos
poder usar outros receptores, decidimos por um capacitor de 100 F. Um problema srio
quando se compra no comrcio um receptor infravermelho de TV descobrir sua pinagem.
Ao fazer isso, devemos ter muito cuidado para no danificarmos o componente. Para
facilitar o emprego dos mais variados receptores comerciais, decidimos adicionar o jumper
JP1 (na verdade o padro de furos para um soquete de 6 pinos). Atravs desse jumper, o
usurio seleciona corretamente os pinos de alimentao, terra e sinal. interessante que
as conexes desse jumper sejam feitas com fio e solda. Na eventualidade de se empregar
o SFH5110, fecha-se 1-6, 2-5 e 3-4.

Passemos agora ao estudo do restante do receptor. Atravs do jumper JP2, o usurio


decide se deseja trabalhar com o TIL78 (2-3) ou com o receptor infravermelho de TV (1-2).
Os sinais gerados pelos receptores so enquadrados na faixa digital TTL com o emprego
de um inversor (U42E) Schmitt-Trigger (vide figura 10.18). Usualmente, na recepo de
sinais infravermelhos, precisamos detectar tanto a borda de subida () quanto a borda de
descida (), razo pela qual adicionamos um segundo inversor (U42F). O intervalo de
tempo entre uma borda e outra permite saber durante quanto tempo o feixe IV esteve
ligado ou desligado.

Para permitir que a recepo pudesse ocorrer atravs de interrupes, foi preparado um
circuito adicional para provocar um pedido em cada flanco. O flip-flop U44A ativado toda
vez que surgir um flanco de subida, ou seja, toda vez que o feixe IV for aceso, pedindo
assim a interrupo #INT1-IV1. Por sua vez, o flip-flop U44b faz o pedido #INT1-IV0 toda
vez que surgir um flanco de descida, ou seja, quando o feixe IV for apagado. O
cancelamento dos pedidos de interrupo feito pela faixa de endereos de #CS7, mas
condicionada a BA0 e BA1 (U26C e U26D), de acordo com o pedido. Vide tabela 12.8.
12.13. Planta 10: Interface IrDA.

Para dotar o projeto P5C de uma porta IrDA, empregou-se a UART MAX3100 (U12). Para
obter detalhes sobre sua operao, recomenda-se a consulta do manual tcnico do
fabricante (Maxim). Com um cristal de 1,8432 MHz, ele capaz de operar na faixa de 300
a 115.200 bauds. A figura 12.39 apresenta o circuito deste controlador. Sua operao
realizada atravs de um canal SPI (abordado na seo seguinte) e a seleo feita com o
sinal SEL2 (U13.12), que o mesmo empregado para controlar mostradores LCD grficos.
No haver conflito porque o mostrador LCD s responde se seu pino de habilitao (E =
1) estiver em nvel alto. Para a transmisso, necessrio conectar um led infravermelho
(D13) no seu pino TX (U12.13). Para a recepo, emprega-se um diodo infravermelho
(D16) no seu pino RX (U12.12). O potencimetro R22 deve permitir uma ampla variedade
de receptores, inclusive fototransistores. Por exigncia do MAX3100, o ajuste do
potencimetro R22 e receptor D16 deve ser tal que a presena de sinal infravermelho gere
um nvel de tenso abaixo de 1,5 V e a ausncia deste sinal deve possibilitar uma tenso
acima de 3,5 V.

O sinal de interrupo do receptor IrDA (U12.5), atravs do inversor U42C, aplicado ao flip-flop
U7A, gerando o pedido #INT1-IRDA. Para que isso acontea, necessrio fechar o jumper JP4.
Graas porta OU (U4C), este pedido de interrupo apagado com uma leitura ou uma escrita num
endereo que ative #CS7 e que tenha BA4 = 0, como o caso do endereo 87EFH. O JP4, quando
aberto, permite que esta interrupo seja empregada como a interrupo INT1-PD0, disponvel no
pino 21 do conector JF3.
12.14. Planta 11: Relgio Permanente (RP).

Com a inteno de permitir a medio de grandes intervalos de tempo ou acompanhar a


data e a hora real, projetamos para essa placa um Relgio Permanente. Entendemos por
relgio permanente um relgio que continue a funcionar mesmo com a placa desligada.
muito comum o uso do termo relgio de tempo real, que traduo da expresso inglesa
Real Time Clock, abreviada pela sigla RTC. Entretanto, consideramos mais adequada a
expresso Relgio Permanente e a indicamos pela a sigla RP.

Neste projeto, inicialmente optamos pelo CI da Dallas, o DS1305 (U5), que oferece baixo
consumo e pode trabalhar com bateria Ltio ou bateria recarregvel. Entretanto, este
componente deve ser comprado no exterior. Por outro lado, encontramos com relativa
facilidade o CI PCF8583 da Philips (U11), que usado como relgio em seus
videocassetes. A desvantagem que esse componente consome um pouco mais de
corrente e precisa de um circuito de carga parte. Na dvida, optamos pelos dois
componentes. Outra vantagem de usarmos os dois CIs a oportunidade de trabalharmos
com interface SPI, usada pelo DS1305, e com a interface I2C, usada pelo PCF8583. Para
detalhes de operao desses componentes, recomendamos a consulta dos manuais dos
fabricantes. Os barramentos SPI e I2C tambm so empregados para acessar duas
memrias do tipo flash.

A figura 12.40 apresenta o circuito para o emprego do DS1305, que bastante simples.
Note que sua habilitao feita pelo sinal CE-RP, que gerado pelo pino 16 do latch U13,
vide figura 12.31. A referncia de tempo conseguida a partir de um cristal de 32,768
MHz. Note que seu valor uma potncia de 2 (215 = 32768). Ele foi preparado para operar
sempre no modo serial SPI a trs fios, por isso o pino SERMODE (U5.9) est ligado a
Vcc. Desta forma, o barramento SPI formado por P1.5, P1.6 e P1.7 empregado para
control-lo. possvel programar o RP como despertador. Nesse caso, ele tem condies
de gerar uma interrupo (#INT-1305) na data e na hora programadas, desde que se
feche a posio 1-2 no jumper JP3. Como esse pedido de interrupo deve ser apagado
mediante o envio de um comando, foi dispensada a adio de um flip-flop para reter o
pedido. A seleo do tipo de bateria feita pelos jumpers JP12 e JP13, de acordo com a
tabela 12.10.
A figura 12.41 apresenta o circuito para o emprego do PCF8583 (U11). Deve-se notar o acesso
atravs do barramento I2C, formado por P1.3 (I2C-SCL) e P1.4 (I2C-SDA). Os componentes I2C
trabalham com endereos que so enviados atravs deste barramento. Caso se deseje operar o
PCF8583 com bateria, necessrio fechar o jumper JP15. Esse relgio tambm trabalha como
despertador, podendo gerar uma interrupo para uma determinada data e hora. Como o PFC8583
mantm esse pedido aguardando uma interveno do usurio, dispensvel o emprego de flip-flop
para reter o pedido. importante notar que os dois CIs usam a mesma interrupo (#INT1-RP). Por
isso, o usurio precisa indicar que CI pretende usar, atravs do jumper JP3. No endereamento do
PFC8583, possvel especificar por hardware o nvel lgico de um de seus bits (A0), que no
presente projeto foi aterrado.

Ainda na figura 12.41, possvel identificar duas memrias do tipo flash. O U10 uma memria
flash com barramento I2C e, por isso, compartilha os pinos P1.3 e P1.4. possvel empregar as
memrias XF24F064 (8 KB), XF24F032 (4 KB) e XF24F016 (2 KB), todas fabricadas pela XICOR.
Apesar da XICOR considerar esse produto obsoleto, ele ainda pode ser encontrado no mercado.
Deve-se tambm verificar a existncia de outras memrias com a mesma pinagem. A outra memria
flash o U15 que emprega uma interface SPI e, por isso, faz uso dos pinos P1.5, P1.6 e P1.7.
possvel empregar as memrias AT25HP512 (64 KB) e AT25HP256 (32 KB), todas fabricadas pela
Atmel. Na escolha das memrias, foi preponderante a disponibilidade do encapsulamento DIP, pois a
grande maioria das memrias flash atuais faz uso de SMD.

Para deixar disponveis os barramentos SPI e I2C, adicionamos dois conectores, denominados J3 e
J7, mostrados na figura 12.42. Atravs de J3, disponibilizamos o barramento SPI e, atravs de J7, o
barramento I2C. Assim, fica fcil a adio de outro dispositivo extra que possua uma dessas duas
interfaces. Os dois barramentos, como j vimos, foram construdos a partir dos pinos do
microcontrolador. interessante comentar que, por sua especificao, o barramento I2C faz uso de
dois resistores de pull-up: R73 e R74. Caso seja necessrio alterar a pinagem do barramento SPI,
deve-se usar o jumper JP6 e romper as trilhas a sua volta.
12.15. Planta 12: USB.

completamente dispensvel comentar as vantagens de se ter implementada uma porta


USB. O projeto de uma interface USB facilitado pela disponibilidade de alguns
controladores, que tratam de toda a complexidade do protocolo. Para esse projeto,
selecionamos o controlador da National USBN9603 (U41), que atende s especificaes
1.0 e 1.1, com velocidades de 1,5 Mbps (low-speed) e 12 Mbps (full-speed). A grande
dificuldade para emprego deste CI seu encapsulamento SO-28, que traz os pinos com
0,05 polegada de espaamento. preciso tomar muito cuidado para no fechar curtos
quando se for soldar esse componente. Recomenda-se um ferro de solda com ponta fina e
o uso de uma lupa.

O circuito da interface USB est apresentado na figura 12.43. Nota-se uma grande
simplicidade, pois ela praticamente se resume no controlador USBN9603 (U41). Os pinos
MODE0 e MODE1 esto aterrados, selecionando assim a operao por intermdio da
interface paralela. Seu endereo foi fixado como o uso de #CS5, na faixa [8500H
85FFH]. O controlador ainda faz uso da linha BA0 para selecionar recursos internos.
Portanto, dentro da faixa de endereos, h diferena entre os endereos pares (BA0 = 0)
e os endereos mpares (BA1 = 1). Esse controlador precisa de gerar pedidos de
interrupo e lhe foi destinada a linha #INT1-USB. Como o pedido de interrupo s
removido mediante interveno do programa, no foi necessrio usar flip-flop para manter
o pedido. O capacitor C66 faz o papel de filtragem da tenso de 3,3 V.
Atravs de JP17, o usurio decide se quer conectar a alimentao da placa P5C com a linha de Vcc
da porta USB. Na grande maioria das vezes, JP17 deve estar aberto, pois no deve ser considerada a
possibilidade da placa P5C ser alimentada atravs da porta USB. O jumper JP16 permite selecionar
duas velocidades de operao do barramento USB. Se fechado na posio 1-2, indica operao a 12
Mbps. Se fechado na posio 2-3, indica operao a 1,5 Mbps. Para o conector USB (J6), foi usado
um tipo B. Finalmente, Y4, R50, C56 e C57 fazem o oscilador, dentro das especificaes
recomendadas pelo fabricante. Para detalhes tcnicos de operao do barramento USB e do USBN
9603, consulte o captulo 17 do livro PC: um Guia Prtico de Hardware e Interfaceamento, MZ
Editora, a partir da 3a edio.

Aproveitando o espao que sobrou na planta 12, colocamos a os foto-TRIACs, como mostrado na
figura 12.44. A disponibilidade de tais componentes interessante porque permite diversos tipos de
acionamento, ao mesmo tempo em que mantm o desacoplamento eltrico, graas interface ptica.
Foram usados os MOC3020, que so encontrados com relativa facilidade no mercado nacional. O
funcionamento extremamente simples. Tomemos como referncia o U2. Enquanto pino T0 do
microcontrolador (U45.14) estiver em nvel alto, o led estar apagado e, em conseqncia, o foto-
TRIAC estar cortado. Quando se fizer T0 = 0, o led acende e o foto-TRIAC tem condies de
conduzir, ficando na dependncia do circuito externo. Graas ao acoplamento ptico, h um completo
isolamento entre a placa e o circuito externo que se est controlando. Pode-se disparar TRIACs de
potncia, controlar diversos tipos de cargas, etc.. Recomenda-se muito cuidado quando se acionam
cargas indutivas, tais como motores, pois h defasagem entre tenso e corrente.
12.16. Planta 14: Fonte + Serial.

A planta 14 apresenta dois circuitos: a fonte de alimentao e a interface serial.


Estudemos primeiro a fonte, cujo circuito est apresentado na figura 12.45. A placa P5C
foi projetada para ser alimentada por um adaptador CA, vulgarmente chamado de
eliminador de pilhas. Ele deve fornecer uma tenso retificada acima de 7,5 V e corrente
superior a 750 mA. Essa especificao considera que o P5C foi construdo usando a
famlia 74HCTxxx. Caso se empregue a famlia 74LSxxx, deve-se considerar a hiptese de
adaptar um bom dissipador no regulador (U6). claro que esse consumo depende da
quantidade de componentes montados na placa. O regulador LM7805 responsvel por
fornecer Vcc = +5 V. Ele suporta at 1 A de corrente e a queda de tenso sobre esse
componente por volta de 2,2 V. Deve-se tomar cuidado quando se empregar um
adaptador CA que fornea 9 V ou 12 V, pois nesse caso haver uma grande queda de
tenso sobre o regulador e, em conseqncia, uma grande dissipao de potncia sobre
esse componente.

Esses adaptadores CA raramente fazem uma boa regulagem, ou seja, a tenso na sada cai com o
consumo de corrente. Por isso, dependendo da qualidade do dispositivo, o usurio pode comprar um
adaptador de 9 V, mas, ao medir a tenso na sada, encontra algo perto de 8 V. O mais recomendado
usar os adaptadores CA com uma chave que se usa para selecionar a tenso na sada. Parte-se de
uma tenso baixa e aumenta-se a seleo at o circuito comear a funcionar. fortemente
recomendado o uso de um multmetro quando se for ligar pela primeira vez o adaptado CA na placa.

O adaptador CA ligado ao jack J4, que facilmente encontrado no mercado. O fusvel F1, de 2 A,
fornece proteo contra curto-circuitos. Os diodos D4, D5, D6 e D7 formam um retificador de onda
completa, mas aqui trabalham apenas para impedir a inverso de polaridade na alimentao, ou seja,
dando liberdade para o adaptador CA usar qualquer polaridade. Entretanto, tal retificao impe
uma queda de 1,4 V na tenso de entrada. O capacitor C6 trabalha como um filtro na entrada do
regulador U6. Da mesma forma, os capacitores C4 e C7 tambm trabalham como filtros, garantido a
eliminao de flutuaes na tenso de alimentao. Na hiptese do usurio fornecer externamente a
alimentao da placa, disponibilizamos Vcc (TP8, TP9 e TP10) e terra (TP5, TP6 e TP7).

Passemos agora ao estudo do conversor RS 232. Como j vimos no Captulo 9, a porta serial do
8051 opera atravs dos pinos TXD e RXD. Entretanto, o nvel de tenso nesses pinos TTL. Para
fazermos a comunicao serial com o PC, preciso convert-los para RS 232. No passado, tal
converso implicava na adio de duas fontes: +12 V e 12 V. Hoje em dia, h circuitos que, com
apenas com a alimentao de +5 V, geram internamente as tenses necessrias para a operao RS
232.

O conversor mais comum o MAX232 (U9), que facilmente encontrado no mercado nacional. Esse
CI, fazendo o uso de +5 V e de quatro capacitores (C10, C19, C20 e C21), gera tenses de +10 V e
10 V, perfeitamente adequadas para o protocolo RS 232. Para a conexo serial, foi previsto um
conector DB9 macho. Os pinos que estavam sobrando neste conector foram ligados a ilhas de solda
(IR12, IR15, IR16, IR18, IR19 e IR20). O mesmo foi feito para os pinos de U9 que no estavam
sendo usados. Apesar de no ser muito recomendado, mas procurando favorecer economia de
componentes, a tenso de 10 V geradas pelo MAX232 foi usado para alimentar a entrada VEE
(U24.3) do convesor D/A. possvel o surgimento de um pequeno rudo quando a porta serial
estiver sendo empregada.

Alguns cuidados so necessrios quando se trabalha com a porta serial do PC. O primeiro cuidado
com relao pinagem do conector serial. O conector serial do PC pode ser um DB9 ou DB25
machos. A tabela 9.3 do captulo 9 indica a pinagem usada por esses dois conectores. Para nossa
finalidade, precisamos apenas dos sinais TD (PC-TX), RD (PC-RX) e GND. Note que os sinais TD
e RD trocam de posio, de acordo com o conector (9 pinos ou 25 pinos). Para efetivarmos a
comunicao serial, precisamos de um cabo de comunicao. Podemos comprar o cabo serial pronto
(cabo modem nulo ou null-modem cable) ou pedir o cabo que se usa para conectar dois
computadores. Entretanto, podemos construir o cabo, que bastante simples. Bastam dois conectores
DB9 fmeas e trs condutores flexveis, pois no precisamos de todas conexes oferecidas pelo cabo
modem nulo. interessante que o conector DB9 ou DB25 tenha a capa de proteo (shell) para
proteger as conexes. A figura 12.47 apresenta o diagrama desse cabo para o caso do uso de
conectores DB9.
12.17. Planta 15: Desacoplamento.

Chegamos finalmente ltima planta, que a que traz os capacitores de desacoplamento


e est apresentada na figura 12.17. Essa planta muito simples e no consideramos
interessante reapresent-la. Vamos comentar brevemente o porqu de tais capacitores.
Os circuitos digitais, quando mudam de estado, geram pequenos picos de consumo de
corrente, que resultam em rudo na linha de alimentao. Quando se tm linhas de
alimentao longas e uma grande quantidade de chips, essas linhas ficam ruidosas. Para
minimizar esse problema, coloca-se junto de cada CI, um capacitor cermico de 100 F,
que trabalha como um filtro, diminuindo o rudo pela linha de alimentao e suprindo a
corrente de pico para o CI. O capacitor da fonte no tem condies de suprir essa
corrente com a rapidez necessria devido indutncia que surge numa linha de
alimentao razoavelmente longa. Assim, a soluo distribuir capacitores ao longo de
todo o circuito. Para no introduzir mais componentes no desenho das plantas, costuma-se
representar parte esses capacitores.
12.18. O Programa de Boot.

Quando no modo boot ( led QD-VD aceso), o Pentracontrolador controlado pelo


programa (BOOT1P00.ASM), que est gravado na EPROM (U28). Esse programa
responsvel por iniciar todos os circuitos do P5C, apresentar uma mensagem no mostrador
LCD e piscar o led amarelo D23 (RD-AM) para indicar que est pronto para receber o
programa do usurio. At o presente momento, este programa pode ser enviado via porta
serial, via porta paralela ou via porta USB. No necessria qualquer combinao prvia.
O P5C monitora essas trs portas simultaneamente. A porta que se manifestar primeiro
passa a ser definida como porta para a recepo do programa do usurio.

Enquanto estiver recebendo o programa, o led verde D24 (RD-VD) passa tambm a piscar
e no LCD mostrado a quantidade de bytes recebidos. Se tudo terminar bem, o led
amarelo apaga e s o verde fica piscando, para indicar que houve sucesso na recepo.
Caso surja algum erro, a recepo interrompida e o led vermelho D22 (RD-VM) passa a
piscar. Neste caso, o LCD deve apresentar uma pequena mensagem indicativa do erro.

Empregamos o boto SW7 para oferecermos algumas opes enquanto o P5C estiver no
modo boot. Por definio, a velocidade (baud rate) da porta serial 28.800 bauds. O
acionamento de SW7 permite alterar essa velocidade para 14.400, 9.600 ou 4.800 bauds.
Tudo isso indicado no mostrador LCD.

Se SW7 for mantida acionada enquanto se liberar o boto de reset, o P5C entra no modo
teste, indicando no LCD com a palavra TESTE e apresentado o nmero 00, que indica
teste 00. Novos acionamentos de SW7 incrementam o nmero apresentado no mostrador
LCD, permitindo assim que o usurio avance para os prximos testes. Usamos a chave
SW3 (passo-a-passo) para permitir que o usurio ative o teste cujo nmero seja
apresentado. Esses testes so na verdade pequenas rotinas que, de acordo com seus
nmeros, fazem o teste de memria, enviam ou recebem dados pela porta serial, acessam
o LCD, fazem a comunicao com o teclado, etc.. Enfim, so pequenas rotinas destinadas
a facilitar para o usurio a tarefa de testar o P5C.

Ainda nesta ROM, junto com o programa de boot, estar presente uma pequena biblioteca
para facilitar as tarefas mais comuns, tais como inicializar o LCD, converter cdigos de
varredura do teclado, realizar transaes pelos barramentos I2C e SPI, etc.. O arquivo a
ser gravado na ROM, junto com os programas fontes e as explicaes necessrias, esto
disponveis na pgina da editora (www.mzeditora.com.br).
12.19. O Programa P5C.exe.

Para permitir que o usurio interaja com facilidade com o Pentacontrolador, existe a
disponibilidade de um programa tambm denominado P5C. Esse programa apenas uma
coleo de pequenas rotinas para a transmisso e a recepo por diversos canais,
basicamente o serial, o paralelo e o USB. Ele auto explicativo, sendo que a opo mais
importante a de fazer o boot do P5C. A seqncia de passos est apresentada a seguir.

O programa P5C permite que se escolha a porta serial a ser empregada e o baud rate adequado.
Existe uma opo para o PC transmitir serialmente toda tecla acionada e outra opo mostra na tela
tudo o que for recebido pela porta serial. Est disponvel tambm o recurso para transmitir e receber
simultaneamente, tal qual um terminal. Finalmente, outro ponto interessante o recurso para executar
programas passo a passo.

Como se espera que este programa seja aperfeioado e que disponibilizemos novas verses, aqui
neste livro no nos estenderemos mais nos comentrios. Ele estar disponvel na pgina da editora,
no s o executvel, como tambm o fonte e ainda um pequeno manual do usurio.
12.20. Exerccios.

Observao: Os exerccios propostos a seguir devem ser executados de acordo com os


recursos do P5C que cada leitor preparou em sua placa.

12-1) Reprojete o decodificador da figura 12.27, de forma que cada sinal de seleo
(#CSi) ocupe apenas oito endereos, ou seja, que #CS0 ocupe a faixa [8000H 80007H],
#CS1 a faixa [8008H 800FH] e assim por diante. Julgando com base na quantidade de
portas empregadas, compare a complexidade dos dois decodificadores.

12-2) Refaa o projeto do exerccio anterior, mas agora cada sinal de seleo (#CSi) deve
ocupar apenas um nico endereo, ou seja, que #CS0 ocupe o endereo 8000H, #CS1 o
endereo 8001H e assim por diante. Com base na quantidade de portas empregadas,
compare a complexidade dos decodificadores.

12-3) O que acontece se for feita uma escrita na faixa de endereos que habilita #CS7?
No se esquea dos flip-flops de interrupo.

12-4)Considerando os circuitos da figuras 12.36 e 12.38, responda:


(a) O que acontece se for feita uma escrita na faixa #CS4 com BA0 = BA1 = 0?
(b) O que acontece se for feita uma leitura na faixa #CS4 com BA0 = BA1 = 0?

12-5) Escreva e experimente uma rotina que faa todos os leds piscarem na freqncia de
10 Hz.

12-6) Escreva e experimente uma rotina que conte os acionamentos da chave SW7,
mostrando o resultado sob a forma binria nos leds D18 a D24.

12-7) Refaa o exerccio anterior, agora mostrando o valor da contagem no display de 7


segmentos.

12-8) Refaa os exerccios 12-6 e 12-7, mas agora empregando a chave SW3. Sugesto:
use interrupes.

12-9) Escreva e experimente uma rotina que escreva no mostrador LCD alfa-numrico a
mensagem TESTE.

12-10) Refaa o exerccio anterior, mas agora a mensagem deve ficar fazendo
deslocamentos para esquerda.

12-11) Escreva e experimente uma rotina que escreva no mostrador LCD grfico a
mensagem TESTE.

12-12) Escreva e experimente uma rotina que desenhe um quadrado de 32 x 32 pontos no


mostrador LCD grfico.

12-13) Escreva e experimente uma rotina que transmita serialmente os caracteres de A


at Z. Use o programa P5C para monitorar a entrada da porta serial do PC.

12-14) Escreva e experimente uma rotina que receba serialmente e mostre no mostrador
LCD os caracteres que o usurio teclar no PC. Use o programa P5C para fazer o PC
enviar pela sua porta serial os caracteres teclados no computador.

12-15) Conecte um teclado PS2 na placa P5C, escreva e experimente uma rotina que
apresente de forma binria no mostrador LCD o primeiro cdigo enviado pelo teclado.

12-16) Conecte um teclado PS2 na placa P5C, escreva e experimente uma rotina que
apresente em hexadecimal no mostrador LCD os cdigos enviados pelo teclado. Com base
no intervalo de tempo entre os acionamentos das teclas, possvel separar os cdigos.

12-17) Conecte um teclado PS2 na placa P5C, escreva e experimente uma rotina que
apresente em hexadecimal no mostrador LCD as letras correspondentes s teclas
acionadas.

12-18) Empregando os sinais disponveis no conector JF3, sugira uma forma de se


conectar ao P5C uma impressora paralela.

12-19) Construindo o cabo sugerido no exerccio anterior, conecte o P5C a uma


impressora, escreva e experimente uma rotina que imprima, constantemente, as letras de
A at Z.

12-20) Refaa o exerccio anterior, mas agora imprima as letras correspondentes s teclas
de um teclado PS2 conectado ao Pentacontrolador.

12-21) Escreva e experimente uma rotina que apresente em hexadecimal no LCD os


valores que o ADC0808 apresente como resultado da converso do seu canal analgico
nmero 4. Conecte uma fonte de alimentao varivel ilhas IR21e IR22, e verifique a
exatido da converso.

12-22) Escreva e experimente uma rotina que, empregando o conversor DAC0808, gere no
pino TP31 uma onda quadrada de freqncia de 1 kHz. Se houver a disponibilidade, mea
com um frequencmetro ou use um osciloscpio.

12-23) Conecte um microfone e um fone de ouvido aos conectores J4 e J5


respectivamente. Agora, escreva e experimente uma rotina que digitalize o sinal do
microfone na taxa de 8 kHz, armazenando os dados na RAM2. Note que s ser possvel
digitalizar 4 segundos, pois a RAM2 tem 32 KB.

12-24) Escreva e experimente uma rotina que mea os intervalos de tempo entre os
flancos de subida e de descida do sinal infravermelho gerado por um controle remoto de
televiso. Para isso, ser interessante empregar um receptor do tipo SFH505. O mais
prtico enviar os resultados pela porta serial e apresent-los no PC com o emprego do
programa P5C. Acione repetitivamente vrias teclas e anote os resultados. Verifique at
que distncia possvel receber os sinais.

12-25) Empregando os resultados obtidos no exerccio anterior, escreva e experimente


uma rotina que identifique e apresente no mostrador LCD a tecla do controle remoto que
foi acionada.

12-26) Repita o exerccio 12-24, mas agora empregando com receptor os foto-transistores
TIL32 (Q1 e Q2). Verifique as diferenas. Caso o leitor possua alguma calculadora com
porta infravermelha, possvel verificar que tipo de sinal gerado.

12-27) Empregando o controlador IrDA (MAX3100), escreva e experimente uma rotina que
apresente no mostrador LCD os dados recebidos a partir de um transmissor IrDA. Como
transmissor, use um telefone celular, um palm top ou um computador com porta IrDA.

12-28) Empregando o controlador IrDA (MAX3100), escreva e experimente uma rotina que
transmita as letras de A at Z para um receptor IrDA. Como receptor, use um telefone
celular, um palm top ou um computador com porta IrDA. Esse exerccio dependente da
interpretao que cada receptor d aos dados recebidos.

12-29) Empregando o DS1305 (U5), transforme o P5C num relgio que apresente as horas
no mostrador LCD. Use SW3 e SW7 para permitir os ajustes de hora, minuto e segundo.

12-30) Repita o exerccio anterior, mas adicione o recurso de despertador atravs de


mensagem apresentada no LCD. Se possvel, empregue as interrupes.

12-31) Repita o exerccio 12-29, mas empregando o PCF8583.

12-32) Repita o exerccio 12-30, mas empregando o PCF8583.

12-33) Ligando o pino 1 do conector J1 a Vcc atravs de um resistor de 1 k e o pino 2 ao


terra, escreva e experimente uma rotina que comande o MOC3020 (U2) de forma a gerar
uma onda quadrada de 1 kHz por esse pino 1. Use um frequencmetro ou um osciloscpio
para conferir o resultado.

12-34) Escreva e experimente uma rotina que teste o perfeito funcionamento da RAM2.
Sugesto: preencha a RAM com valores conhecidos como, por exemplo, os nmeros de 1
a 99 e depois confira todas as posies.

12-35) Repita o exerccio anterior para as memrias flash.


13. Programao em C para 8051

As linguagens de alto nvel, como o C e o Pascal, vieram para liberar o programador da


entediante tarefa que programar em assembly . Essa afirmao traz uma grande
verdade quando se trabalha com um sistema envolvendo o computador PC, onde existem
teclado com mais de 100 teclas, monitor colorido, disco rgido, leitor de CD-ROM,
disquete, etc.. Entretanto, quando se trabalha com um sistema microcontrolado que conta
apenas com alguns leds e algumas chaves, sendo necessrio administrar as diversas
reas de memria, preciso ponderar um pouco.

As linguagens de alto nvel realmente facilitam a tarefa do programador, diminuem a


quantidade de erros, propiciam uma documentao mais inteligvel e facilitam os futuros
trabalhos de manuteno. Por outro lado, h um preo a ser pago: programas maiores e
mais lentos. Porm, quando programamos em assembly, apesar das dificuldades,
conseguimos programas menores e mais rpidos. Qual alternativa melhor? Cabe ao
programador decidir como pretende executar seu trabalho. Aconselhamos que sistemas
pequenos sejam programados em assembly e que os sistemas grandes empreguem
uma linguagem de alto nvel, mas com os trechos crticos escritos em assembly. O
programador decide se o seu sistema pequeno ou grande.

Neste captulo, apresentaremos uma introduo sobre o emprego da linguagem C para


programar microcontroladores da famlia 8051. No pretendemos ensinar a programar em
C e nem abordar todos os detalhes de seu emprego em microcontroladores. Faremos
apenas uma rpida apresentao das principais estruturas da linguagem e citaremos os
pontos mais importantes. Acreditamos que mesmo os leitores que no tm experincia em
programao com C no tero dificuldades em ler este captulo. Entretanto, a eficincia na
programao s ser conseguida com a prtica. Boa parte do que apresentado aqui foi
inspirado no livro The C Programming Language, segunda edio, de Brian W. Kernighan e
Dennis Ritchie. Recomendamos a leitura deste livro para aqueles que quiserem se
aprofundar neste assunto.

No era nosso desejo escrever este captulo de uma forma genrica, mas sim voltado para
um compilador em particular. Nossa busca teve uma soluo baseada no compilador
SDCC (Small Device C Compiler), preparado por Sandeep Dutta, que pode ser
conseguido gratuitamente no endereo http://sdcc.sourceforget.net. Este compilador
cdigo aberto e de uso livre (freeware). Diversas foram as contribuies para que o
compilador chegasse ao nvel atual. claro que cada um o emprega por sua prpria conta
e risco. fortemente recomendado a leitura do manual SDCC Compiler User Guide,
conseguido sob a forma de arquivo PDF no endereo j citado. Neste captulo, abordamos
apenas os itens mais importantes deste manual.

Iniciamos o estudo com uma sugesto sobre a instalao deste compilador. Em seguida,
veremos as principais estruturas da linguagem C, apontaremos uma srie de detalhes que
podem resultar em erros e terminaremos com alguns exemplos de programao. Como j
afirmamos, o SDCC um compilador com cdigo aberto. Assim, espera-se que ele evolua
ao longo do tempo, o que pode resultar em diferenas em relao ao que aqui
apresentamos. Tambm preciso ter conscincia de que no h garantia de seu
funcionamento perfeito, entretanto so muitos os elogios que ele tem recebido.
13.1. Instalao do SDCC.

O compilador vem sob a forma de um arquivo compactado. O leitor pode selecionar


diversas verses de snapshot, ou seja, diversas verses deste compilador j preparadas
para rodar. Cada snapshot conserta alguns erros ou incorpora mais recursos e, em alguns
casos, pode adicionar inadvertidamente novos erros (bugs). O SDCC foi escrito
originalmente para Linux e a verso que empregamos foi compilada para Windows com o
Mingw32. A maneira mais fcil de instalar o compilador descarregando uma verso com
instalador. Na preparao deste captulo, empregamos a verso (2.4.8 #971 13/03/2005),
de 13 de maro de 2005:

Ao executar esse programa, ele se instala automaticamente no computador. interessante orientar


essa instalao para a raiz (C:\SDCC) e responder que sim quando perguntado se deseja que atualize
o path. Aps a instalao, considerando que se empregou o diretrio C:\SDCC, surgiro os seguintes
diretrios:

Uma boa sugesto criar um diretrio denominado C:\SDCC\PROG_C, onde ficaro os programas em
C. Para escrever os programas, preciso empregar um editor ASCII, como o Bloco de Notas (Note
Pad) ou o Edit do DOS. Uma boa sugesto o editor JFE, conseguido gratuitamente no endereo:
http://home.arcor.de/jensaltmann/. Este um editor ASCII simples e muito verstil escrito por Jens
Altmann (ele tambm disponibiliza um simulador: JSIM). Um ponto muito interessante que, de
dentro do editor, possvel compilar o programa com o SDCC e obter a lista de erros. Para tanto,
usamos a opo Settings e Add Tool com a configurao:
Orientamos agora o teste da instalao do compilador. O primeiro teste verificar se ele
funciona. Para tanto, no diretrio C:\SDCC\PROG_C, digitamos sdcc --version. Assim, o
programa deve responder com a sua verso. Caso obtenha uma mensagem de erro,
verifique a instalao e a existncia de SDCC no diretrio C:\SDCC\BIN. Verifique tambm
se este diretrio est definido na varivel de ambiente PATH.

Como segundo teste, vamos verificar o funcionamento do SDCC com o seguinte programa,
denominado teste.c. Esse programa deve ser digitado empregando um editor ASCII.

Compilamos esse programa usando o comando sdcc c teste.c. Se tudo estiver correto, nenhuma
mensagem de erro ou aviso ser apresentada. A opo -c orienta o compilador para apenas compilar
o programa teste.c.

Como terceira etapa, vamos compilar o programa teste.c e empregar o linker para gerar o
programa executvel. Para tanto, usamos o comando sdcc teste.c. Agora, o resultado que nos
interessa, dentre uma srie de outros arquivos, o teste.ihx. Este o arquivo executvel, no
formato Intel.hex. Se tudo ocorreu direito, sem mensagem de erro ou avisos, porque o compilador
e o linker esto funcionando corretamente.

A ltima etapa de teste verificar se o compilador consegue usar os arquivos header padro e as
bibliotecas. Para tanto, vamos reescrever o programa teste.c.
Compilamos este programa usando sdcc teste.c, devendo ser gerado o arquivo
teste.ihx, sem qualquer mensagem de erro ou aviso. Se ocorrerem erros, provvel que
a causa seja a impossibilidade do compilador acessar os diretrios necessrios. Uma
ajuda conseguida com o comando sdcc --print-search-dirs, que imprime os diretrios
onde o SDCC busca pelos diversos arquivos. Se passar por todos esses testes, sem
qualquer mensagem de erro ou aviso, provvel que a instalao esteja correta. Caso
ocorram erros, refaa a instalao ou tente usar um outro snapshot.
13.2. O Bsico da Programao em C

Todo programa em C uma coleo de funes. Uma funo pode ser entendida como
uma subrotina. As funes fornecem uma maneira conveniente de se encapsularem trechos
de programa. No preciso conhecer como est escrita uma funo, pois basta saber o
que ela faz. Normalmente, as funes recebem argumentos e retornam valores, mas
existem funes que no recebem argumentos ou que no retornam valores.

Os programas em C so construdos com declaraes (statements). Toda declarao


deve terminar com um ponto e vrgula. Usualmente, as declaraes realizam operaes
sobre variveis, que tambm precisam de ser declaradas. Em C, faz-se distino entre
letras maisculas e minsculas. Assim, os identificadores valor e Valor so interpretados
de forma distinta. Na distino dos identificadores, so considerados at 31 caracteres. O
programador pode empregar um identificador grande, entretanto, somente os primeiros 31
caracteres sero considerados.

As chaves { e } so empregadas para indicar agrupamentos dentro do programa. A no


ser que se diga em contrrio, as variveis so dinmicas, ou seja, elas s existem
enquanto a funo estiver em execuo. Sendo mais preciso, as variveis declaradas
dentro de um agrupamento{ .... } s possuem o escopo dentro deste agrupamento.
Apresentamos um pequeno programa ilustrativo:

O programa inicia com uma funo denominada main, que o ponto de entrada do programa e que
obrigatoriamente deve estar presente em todo programa escrito em C. O corpo desta funo
indicado pelo abre chave { e fecha chave }. Logo no incio, so declaradas duas variveis
inteiras (i e qdr), que s podem ser manipuladas dentro do trecho marcado pelas chaves. Na
prxima seo, veremos os tipos de varivel com que podemos trabalhar. Em seguida, varivel i
atribuda a constante 5 e, na linha seguinte, chamada a funo que calcula o quadrado de um nmero
(calc_quadrado).

A funo calc_quadrado est declarada logo abaixo do procedimento principal do programa. de


se notar que esta funo recebe um argumento inteiro, indicado pelo campo (int x) e que tambm
retorna um valor inteiro, indicado pela tipo int antes do nome da funo. A funo calc_quadrado,
cujo corpo est indicado pelas chaves, declara a varivel inteira y para receber o produto de x*x. A
funo retorna com um return y, devolvendo para o programa chamador o quadrado do argumento
recebido.

O incio de um campo de comentrio indicado por /* e seu final por */, como na primeira linha
do programa. O comentrio tambm pode ser indicado por //, como foi feito na funo
calc_quadrado. O programador escolhe como prefere indicar seus comentrios.

Note que a funo main no recebe parmetros e tampouco retorna parmetros, fato indicado pelo
termo void precedendo a declarao da funo main e pelo (void) logo aps o nome da funo. A
maioria dos programas escritos para microcontroladores, como ficam eternamente presentes na
memria, presos num lao infinito, raramente recebem argumentos ou retornam valores. Nos
computadores PC, possvel que os sistemas operacionais chamem a funo main passando alguns
argumentos. possvel tambm que esta funo, ao final de sua execuo, retorne algum valor para o
sistema operacional.

Agora que temos uma pequena idia de como estruturar um programa em C, passemos para uma
rpida descrio da linguagem, lembrando que estamos focados no compilador SDCC. Outros
compiladores podem oferecer diferentes recursos.
13.3. Variveis e Constantes

Em C esto disponveis quatro tipos dados: char, int, float e double. Junto com esses
tipos, empregam-se os modificadores short e long. Na construo do compilador SDCC,
visando a simplific-lo, foram premiados apenas os seguintes tipos:

de se notar que, para este compilador, os tipos int e short so os mesmos. possvel aplicar os
modificadores signed ou unsigned aos tipos char, int e short. Note que o tipo float sempre
trabalha com sinal. Assim, so declaraes vlidas:

Na lista acima, a terceira declarao j inicializa a varivel limite com a constante inteira
3000. A penltima declarao cria um vetor de 20 bytes, enquanto a ltima cria um vetor
com 10 posies de 16 bits. A enumerao dos elementos de um vetor inicia com 0.
Considerando o vetor cadeia, seu primeiro elemento indicado por cadeia[0] e seu ltimo
elemento por cadeia[19].

As constantes numricas so expressas em decimal, se nada for dito. A representao em


hexadecimal deve ser precedida por 0x. Por exemplo, o nmero 100 pode ser expresso
c o m o 0x64 (hexadecimal). As constantes numricas so empregadas intuitivamente,
entretanto, preciso tomar cuidado com a quantidade de bytes necessrios para sua
representao. Por exemplo, a atribuio char c = 1000; tenta atribuir uma constante de
16 bits a uma varivel de 8 bits. No SDCC, o resultado o truncamento, sendo atribudo o
valor 0xE8 (1000d = 0x3E8), que corresponde ao decimal 232.

boa prtica de programao dar nome a alguns valores que so importantes. Por
exemplo, no P5C, o endereo do latch que acende os leds 0x8000. Ento, ao invs de
usarmos o nmero 0x8000, melhor empregarmos um nome que tenha significado como,
por exemplo, END_LEDS. Isso feito com o que se chama de constante simblica. Ela
criada com a declarao #define, como mostrado a seguir. Note que #define tem o
mesmo papel do EQU que usamos em assembly. Note que costume empregar letras
maisculas para tais declaraes.

Precisamos ainda comentar sobre cadeias de caracteres, ou strings. Em C, toda string


indicada pelo seu endereo de incio, sendo que seu final marcado pelo byte 0 (zero).
Isto simplifica bastante, porque com um simples endereo faz-se referncia string. Note
que, devido presena deste zero final, o tamanho de uma string aumentado de um
byte. possvel declarar um vetor e inicializ-lo com uma string.

Apesar do vetor ter 20 posies, empregamos apenas 6, sendo que a stima posio
igual a zero. Teremos vetor[0] = 0x41 (ASCII de A), vetor[1] = 0x42 (ASCII de B) e assim
por diante, at vetor[6] = 0. Verifique a Tabela ASCII do Apndice B.
13.4. Operadores

A linguagem C faz uso de diversos operadores. Iniciamos com os operadores aritmticos,


que so os j consagrados: +, -, * e /, listados na tabela 13.2. Existe ainda o operador
mdulo %, ou resto da diviso, sendo que ele no aplicvel ao tipo float. Esses
operadores podem ser empregados com qualquer tipo de varivel. Entretanto, preciso
lembrar que o tipo impe algumas restries. Por exemplo, se forem empregadas variveis
inteiras, tem-se que 7 / 3 = 2. Deve-se tomar cuidado para no extrapolar a faixa de cada
tipo, como mostrado a seguir.

Quando o programador emprega esses operadores, o compilador se encarrega de ligar (com o uso do
linker) ao programa as bibliotecas convenientes, ou seja, as bibliotecas de operaes com inteiro ou
com ponto flutuante.

Os operadores relacionais e lgicos servem para comparar expresses. Eles esto listados na tabela
13.3. Empregaremos esses operadores para comparar condies de controle do fluxo de execuo de
programas.
O trabalho com microcontroladores envolve a manipulao de bits e, por isso, a prxima classe de
operadores muito importante. Veremos agora os operadores de bits, apresentados na tabela 13.4.
Eles no devem ser confundidos com os operadores relacionais ou lgicos.

Existem tambm os operadores de incremento (++) e decremento (--). Ao invs de empregarmos x =


x + 1; ou y = y - 1;, mais eficiente escrevermos x++; e y--;, respectivamente. Os exemplos a
seguir do uma idia do que pode ser feito como os operadores.
13.5. Controle do Fluxo do Programa

Veremos agora os recursos para construirmos os laos de programas e tomarmos a


deciso de quando usar cada um deles. A deciso feita com o teste de condies que
podem ser verdadeiras ou falsas. Em C, representa-se o falso por 0 (zero) e em
conseqncia o verdadeiro por qualquer valor diferente de zero. Os recursos aqui
tratados so clssicos e sero abordados de forma resumida. Deve ser notado que, na
maioria das vezes, empregamos as chaves { .... } para indicar agrupamentos. Nos
exemplos, para simplificar, faremos uso de variveis, supondo que elas j foram
convenientemente declaradas.

Esse recurso empregado para expressar decises. Sua sintaxe mostrada a seguir, sendo que
permitido no fazer uso do else.

No exemplo a seguir, se o contedo de x for maior que 5, faremos z igual a 10, seno faremos z igual
a 20. Note que os escopos do if e do else foram marcados com chaves.

Quando o escopo possui apenas uma nica declarao, as chaves podem ser omitidas, como feito a
seguir. Isso facilita a leitura do programa.
O prximo exemplo no faz uso do else.

Esta uma forma de se tomar uma deciso com diversas hipteses. As expresses so avaliadas em
seqncia e, se uma delas for verdadeira, a declarao a ela associada executada e a cadeia
finalizada. O ltimo else serve como nenhum dos casos acima.

Esse controle serve para uma deciso mltipla que testa se uma expresso casa com um certo nmero
de constantes inteiras. Em caso positivo, desvia para o trecho correspondente.

Como exemplo, apresentamos um funo que retorna o cdigo ASCII correspondente nibble
recebida. Esta funo no est escrita da maneira mais eficiente, pois a inteno foi apenas
exemplificar o emprego do controle switch. Note o uso do break ao final de cada declarao, pois,
caso contrrio, o processamento seguiria deste ponto em diante. Ou seja, o switch faz na verdade um
desvio para um determinado trecho. importante que cada trecho finalize com um break.
No programa recm apresentado, o leitor deve ter notado que o cdigo ASCII de uma letra obtido
com aspas simples. Apresentamos a seguir uma maneira mais eficiente de fazer tal converso. Note
que criamos uma tabela com os 16 smbolos (ASCII) hexadecimais. Na declarao desta tabela no
foi necessrio indicar seu tamanho, pois ela j inicializada com uma string. Tal declarao foi feita
externamente funo nib_asc, o que a torna uma varivel global.

Este controle serve para executar trechos de programa enquanto uma determinada condio for
vlida. Sua sintaxe extremamente simples.

Para exemplificar seu emprego, vamos supor que seja preciso fazer a leitura de um sensor de
temperatura que sofra a interferncia de rudo. Para tanto, empregamos um conversor A/D conectado
porta P1. De maneira bem simples (diferente do que seria a realidade), vamos supor que, para
receber o dado do conversor A/D, baste ler a porta P1. Como h rudo, no podemos confiar numa
nica leitura. Faremos ento diversas leituras e calcularemos a mdia. Apresentamos a funo
denominada mediaP1, que no recebe argumentos, mas retorna a mdia de 16 leituras na porta P1.
Note que a diviso por 16 foi feita com um deslocamento (>>) de 4 bits para a direita.

Algumas vezes preciso colocar o programa num lao infinito. Isso pode ser conseguido com a
sintaxe while, se a expresso de controle de repetio for sempre verdadeira. importante comentar
que, com o emprego do break, possvel sair do lao infinito. O programa a seguir apresenta uma
pequena idia de como isso pode ser feito.

Este outro controle para repetio de determinados trechos de programa. Sua sintaxe simples,
como apresentado a seguir. O termo expr1 faz a inicializao necessria, expr2 a condio de
permanncia no lao e expr3 a alterao sobre a varivel de controle da repetio do lao.

O for e o while so perfeitamente equivalentes, como mostrado a seguir.


Reescrevemos a funo mediaP1, mas agora empregando o for. Como o lao do for tinha apenas
uma linha, pudemos omitir as chaves. Essa funo deve ser comparada com sua equivalente que
emprega o while. possvel construir um lao infinito com o uso de for(;;).

O controle de repetio while, testa a condio de repetio logo no topo do lao, ou seja, a
primeira ao a ser feita para entrar no lao. Se essa condio for falsa, o lao no executado. Com
o do while, o teste da condio de repetio do lao feito no final do lao, ou seja, o lao
repetido pelo menos uma vez. Sua sintaxe apresentada a seguir.

Algumas vezes, interessante sair de um lao de repetio sem a necessidade de executar o teste que
feito no incio ou no final. A declarao break fornece uma maneira de se sair antecipadamente de
laos tipo for, while, do e switch. O break sempre faz a quebra do lao mais interno. Veja que,
num exemplo na pgina anterior, quebramos um lao infinito com o emprego do break.

A declarao continue antecipa a repetio do lao de programa. No caso de while e do, faz com
que o teste da repetio seja executado imediatamente. No caso do for, o controle do lao
antecipado, passando para o a fase de incremento da varivel de controle da repetio.

Formalmente, o goto nunca seria necessrio. Na quase totalidade das vezes, o programa fica melhor
e mais inteligvel quando ele no empregado. Entretanto, existem algumas situaes particulares
onde o goto pode ajudar. Por exemplo, em caso de emergncia, ele pode ser empregado para
abandonar os laos do, while ou for para saltar imediatamente para um trecho especfico do
programa. O prximo exemplo inspirado no livro de Kernighan e Ritchie e faz uso do label
deu_erro.
13.6. Conceito sobre Funes

Como j afirmamos, as funes permitem quebrar a tarefa a ser realizada em pequenos


trechos de programa, de forma a facilitar o trabalho de programao e, claro, o
entendimento. Alm disso, com a diviso em funes, possvel que diversas pessoas
trabalhem no mesmo programa, ou ainda, que se aproveite o que outros programadores
fizeram no passado. At o momento, empregamos funes de forma intuitiva,
apresentamos agora sua sintaxe.

Um programa uma coleo de declaraes e de funes, sendo que a comunicao feita atravs
dos argumentos passados para as funes, dos valores retornados e das variveis externas.
Usualmente, toda funo termina com return. Ao programa chamador permitido ignorar o valor
retornado. Empregamos void para indicar quando a funo no recebe argumentos ou quando no
retorna valores.

Quando o compilador encontra uma funo, ele precisa de saber quais o argumentos a serem
passados e o valor a ser retornado. O exemplo de programa que apresentamos na seo 13.2 traz um
perigo, pois, ao encontrar pela primeira vez qdr = calc_quadrado (i), como nada foi dito, o
compilador no sabe o tipo do valor retornado. Para evitar isso, uma boa prtica declarar as
funes logo no incio do programa, como mostrado a seguir.
Ao terminar a execuo da funo, as variveis declaradas internamente so descartadas. Existem,
entretanto, variveis que so declaradas externamente e que, por isso, so enxergadas de qualquer
ponto do programa. Tais variveis externas ou globais podem ser empregadas para passar
argumentos e receber valores. Veja o programa abaixo.

O leitor pode se sentir tentado a empregar somente variveis globais, mas deve resistir. As variveis
locais foram criadas para facilitar a tarefa do programador, que no precisa de lembrar-se de todas
as variveis que criou e o que fazia com cada uma delas. Por isso, deve-se usar apenas as variveis
globais de que necessitar.

O momento propcio para abordarmos as variveis estticas, cuja declarao feita com a palavra
static. Por exemplo, static int w; cria a varivel esttica w. Toda varivel esttica tem
existncia permanente, mesmo que declarada dentro de uma funo. Em outra palavras, ela no
descartada quando termina a execuo da funo. Seu valor mantido e a varivel pode ser
empregada na prxima vez em que a funo for chamada. Elas se parecem bastante com as variveis
globais, pois nunca so descartadas. Entretanto, s so enxergadas dentro do escopo em que forem
declaradas, ou seja, dentro do campo delimitado por { ... }.

Para garantir uma boa organizao dos programas e evitar duplicidade de declaraes de variveis e
funes, comum o emprego de arquivos cabealho (header files). No diretrio include, deve
existir uma srie de arquivos terminados com .h. Por exemplo, o leitor deve encontrar arquivos do
tipo string.h, math.h, float.h, etc.. O programador inclui esses arquivos no seu programa, de
acordo com os recursos de que vai necessitar. Se for trabalhar com cadeias de caracteres, inclui o
string.h; se for trabalhar com funes em ponto flutuante, inclui o float.h e assim por diante. As
declaraes dos recursos internos do 8051 esto todas reunidas no arquivo 8051.h. interessante
que o leitor examine alguns desses arquivos. A incluso de arquivos cabealho que acompanham o
compilador feita com os smbolos <>. Os cabealhos criados pelo programador so includos
com o emprego de aspas, como mostrado a seguir.
13.7. Ponteiros e Vetores

O emprego de ponteiros gera programas compactos e eficientes. Entretanto, quando


usados de forma descuidada, podem provocar erros estranhos e gerar cdigos de difcil
entendimento. Assim, importante ter bem claros os conceitos sobre ponteiros. Ponteiros
e vetores esto fortemente relacionados, como veremos a seguir.

Ponteiro um tipo de dados usado para fazer referncia a um endereo de memria. Sua
declarao apresentada a seguir, junto com um pequeno trecho de programa, onde
surgem dois operadores unrios: o *, que usado para declarar e operar com os
contedos apontados pelos ponteiros, e o &, que faz referncia ao ponteiro associado a
uma varivel. Apresentamos um pequeno trecho de programa para ilustrar o uso de
ponteiros.

Na primeira linha, foram declaradas duas variveis inteiras e um vetor de 10 posies de inteiros.
Logo em seguida, foi declarado um ponteiro para inteiros (int *pt). Veja que o * empregado
para indicar que a varivel um ponteiro. Em seguida, o ponteiro foi inicializado com o ponteiro
para a varivel x (pt = &x). A partir deste ponto, passam a existir duas formas de acessar esta
varivel x: atravs de seu nome x e atravs do ponteiro pt. Ao fazermos *pt = 30, alteramos o
valor de x para 30 e, com y = *pt, transferimos seu valor para a varivel y. Com a linha pt =
&vet[0] posicionamos o ponteiro para apontar para o primeiro elemento de vetor vet. Com o
emprego do ponteiro, inicializamos a primeira e a segunda posio do vetor com 50 e 100,
respectivamente.

importante deixar claro que ponteiro est relacionado com o tipo de varivel para a qual ele
aponta, ou seja, se aponta para char, int, float, etc.. No exemplo recm apresentado, vimos que
a posio de memria apontada pelo ponteiro (*pt) pode ser empregada como se fosse a prpria
varivel. Como o ponteiro uma varivel, o contedo de um ponteiro pode ser operado e copiado
para outro ponteiro. Supondo que pt aponte para a varivel x, apresentamos o exemplo:

Os conceitos de ponteiro e de vetor esto to ligados que tudo que pode ser feito com vetor, tambm
pode ser feito com ponteiro e vice-versa. Quando declaramos o vetor int vet[10], o compilador
cria o ponteiro vet e o inicializa de forma a apontar para uma regio onde caibam 10 valores
inteiros. Assim, o nome de um vetor na verdade um ponteiro para seu incio. A nica restrio
que o valor deste ponteiro no pode ser alterado. Quando fazemos pt = &vet[0], ou pt = vet,
copiamos para pt o ponteiro que faz referncia ao endereo de incio do vetor. Vamos apresentar
alguns exemplos:

Com o exemplo mostrado, empregamos diversos tipos de operaes com ponteiros. Note que o
ponteiro pde ser incrementado. Esse ponto importante. Ao incrementarmos um ponteiro, ele
avana um ndice, segundo seu tipo. Como no exemplo o ponteiro apontava para char (bytes), ele
simplesmente avanou uma posio de memria. Se fosse um ponteiro que apontava para int (2
bytes), ele avanaria duas posies de memria. O mesmo vlido para o decremento de ponteiros.
Um erro muito comum levar o ponteiro para alm do final do vetor com o qual se est trabalhando.
Este erro no detectado pelo compilador e muito difcil de ser descoberto. Caso ocorra esse erro,
a posio de memria logo aps o final do programa alterada. A operao vet++ gera erro no
momento da compilao, pois o ponteiro vet precisa de marcar o incio do vetor e no pode ser
alterado. Finalizamos lembramos que uma string na verdade um vetor de caracteres ASCII, cujo
final marcado com o byte zero.

De acordo com o que vimos, as funes no tm como alterar o valor das variveis do programa
chamador. Entretanto, isto pode ser conseguido com o uso de ponteiros. Reescrevemos o programa
que calcula o quadrado, mas agora a funo quadrado altera o valor da varivel qdr, pois nos seus
argumentos recebeu o endereo desta varivel (&qdr).

Para finalizar, importante indicar que vetor passado para a funo atravs de seu endereo. Este
ponto merece cuidado, pois, se a funo recebeu o endereo do vetor, ela pode alterar o contedo
deste vetor. Para ilustrar a passagem de endereo de um vetor, apresentamos uma funo que calcula
a soma dos elementos do vetor. Note que tambm preciso passar o tamanho do vetor, pois a funo
no tem como sab-lo. Deve ter causado surpresa a linha soma += *pt++, que primeiro incrementa o
ponteiro e depois o emprega para somar o elemento do vetor. Esta linha tambm poderia ser escrita
assim: soma = soma + *(pt++).
13.8. Estruturas

Estrutura uma coleo de uma ou mais variveis, provavelmente de tipos diferentes,


agrupadas sob um nico nome para facilitar sua manipulao. As estruturas servem para
organizar e auxiliar as operaes com dados complexos. Um bom exemplo conseguido
se imaginarmos um microcontrolador embarcado num pequeno aeromodelo. Neste caso,
suponha que trs informaes sejam importantes: altitude, velocidade e direo. Vamos
empregar uma varivel do tipo float para a altitude e velocidade, sendo que a direo
ser dada pelo azimute expresso em graus do tipo int. Vamos criar uma forma de agrupar
essas trs variveis com o nome estado.

O nome tres_valores serve apenas para indicar a composio da estrutura, ou seja, qual o tipo de
cada um de seus membros. A penltima linha cria realmente a varivel estado. A ltima linha cria
um ponteiro para estruturas do tipo tres_valores. A referncia aos membros da estrutura feita da
seguinte forma:

Qualquer tipo de operao permitida com os membros de um estrutura. A seguir, apresentamos


alguns exemplos.

Vamos agora aprender a trabalhar com o ponteiro pte que criamos na ltima linha do exemplo
apresentado. A primeira coisa a fazer inicializar o ponteiro com, por exemplo, pte = &estado.
Depois desta atribuio, o ponteiro pte passa a apontar para a estrutura estado. Nesse caso, *pte
a estrutura e seus membros so: (*pte).alt, (*pte).vel, (*pte).az. to comum o emprego
de ponteiro para estruturas que se criou uma alternativa mais fcil de se escrever: ponteiro ->
membro.
13.9. Particularidades do SDCC para 8051

Nesta seo, abordaremos as alteraes feitas para permitir que a linguagem C fosse
adaptada ao universo dos microcontroladores. Como j afirmamos, vamos restringir-nos ao
SDCC. As informaes apresentadas nesta seo foram coletadas no manual do
compilador SDCC: SDCC Compiler User Guide, cuja leitura aconselhamos fortemente.
tambm interessante procurar na Internet diversas observaes que existem sobre esse
compilador.

Para permitir que o usurio adeqe s suas necessidades o cdigo gerado pelo SDCC, esto
disponveis dois modelos de memria: o small e o large. Mdulos com diferentes modelos de
memria nunca devem ser misturados, tanto que existem dois conjuntos de bibliotecas, um para
cada modelo. A escolha do modelo deve depender do nmero de variveis envolvidas no software e
da disponibilidade da RAM externa.

No modelo small, se nada for dito em contrrio, as variveis so alocadas na RAM interna. Este o
modelo default do compilador e deve ser empregado sempre que possvel. Em geral, ele leva a
cdigos mais eficientes.

No modelo large, se nada for dito em contrrio, as variveis so alocadas na RAM externa,
incluindo todos parmetros e variveis locais. Quando se emprega este modelo, diversas otimizaes
so desabilitadas.

Disponibilizar o sofisticado ambiente de programao do 8051 aos programadores C um bom


desafio. No caso do SDCC, o compilador permite que o usurio defina a classe de armazenamento
para suas variveis. Isto vlido para todos os tipos de variveis: char, int, short, long e
float. Para melhor compreender esta seo, interessante que o leitor reveja as figuras 2.5 e 2.13,
de forma a relembrar os diversos espaos de endereamento do 8051.
Se nada for dito, esta a classe de armazenamento empregada pelo compilador. Os termos data e
near podem ser vistos como sinnimos. Variveis declaradas com esta classe de armazenamento so
alocadas na RAM interna, no espao diretamente enderevel, ou seja, endereos de 0 a 127 (128
Lower), vide figura 2.13. Exemplo:

A atribuio do valor 1 a esta varivel resulta na instruo assembly:

Note que a varivel referenciada atravs do rtulo _teste. Isto vlido para todas as variveis
declaradas em C.

Variveis declaradas com esta classe de armazenamento so alocadas na memria de dados externa.
Se nada for dito, esta a classe default do modelo large (quando empregado pelo compilador). Os
termos xdata e far podem ser vistos como sinnimos. Exemplo:

A atribuio do valor 2 a esta varivel resulta nas instrues assembly:

Convm lembrar que a rea de memria destinada a tais variveis deve ser prevista no projeto do
sistema microcontrolado. Alguns membros da famlia 8051 trazem um pequeno trecho desta memria
j embutida dentro do chip, sob a forma de EEPROM ou SRAM, vide Apndice G.

Variveis declaradas com esta a classe de armazenamento so alocadas na RAM interna, dentro da
rea enderevel indiretamente (128 Lower + 128 Upper). Confira na figura 2.13. A primeira metade
desta rea (endereos 0 a 127) tambm trabalha com endereamento direto. Exemplo:
A atribuio do valor 3 a esta varivel resulta nas instrues assembly:

Alguns membros da famlia 8051 no oferecem a segunda metade (128 Upper) desta rea, ou seja,
no possuem os endereos de 128 a 255. Apesar de trabalhar com endereamento direto, a pilha
sempre alocada num segmento de memria idata.

Esta uma classe de armazenamento que permite uma paginao muito simples na memria de dados
externa. Faz uso das instrues MOVX A,@R0 e MOVX @R0,A, sendo que o MSB do endereo
previamente armazenado na porta P2. Assim, os endereos esto limitados faixa de 0 a 255. Como
o endereamento indireto, a classe pdata deve ser empregada com ponteiros. Exemplo:

O trecho de programa apresentado resulta nas instrues assembly:

Se a opo --xstack for empregada (orientao para construir a pilha na rea pdata), a rea de
dados alocada logo aps o final da pilha e o tamanho da rea de dados mais a pilha deve ser
inferior a 256 bytes.

Variveis declaradas com esta classe so alocadas na memria de programa. Exemplo:

A leitura desta varivel resulta nas instrues assembly:


A memria de programa til para armazenar tabelas e cadeias de caracteres. Como exemplo vamos
armazenar uma mensagem na memria de programa e fazer o acesso com uma varivel sem sinal de 8
bits, como mostrado a seguir:

O compilador faz a seguinte otimizao se, no acesso a esse vetor, for empregado a varivel que
resolvemos chamar de indice. Note que agora o acumulador no foi zerado.

Quando uma varivel declarada como bit, ela alocada dentro da rea enderevel bit-a-bit.
Exemplo:

A escrita do valor 1 nesta varivel resulta na instruo assembly:

importante indicar que apenas se usam os endereos de bit de 0 a 127, correspondendo aos bytes
de 20H a 2FH da RAM interna, vide figura 2.13. Os demais bits so considerados como bits de
registradores de funes especiais.

Aqui, sfr e sbit no so sinnimos. Eles declaram um tipo de dado e tambm um indicador de
classe de armazenamento. So empregados para descrever registradores de funes especiais (SFR)
e os bits desses registradores. Como mostrado na figura 2.11, os SFR ocupam os endereos de 80H a
FFH da RAM interna. Desses, so acessveis bit a bit os registradores de endereos: 80H, 88H, 90H,
98H, ..., F8H, sendo que tais bits ocupam os endereos de 128 a 255. Exemplo:

O compilador permite que o programador crie ponteiros para qualquer rea de memria do 8051. Se
nada for dito, o compilador cria um ponteiro genrico que pode ser empregado com qualquer rea de
memria. O ponteiro genrico implica numa maior carga de programa e, por isso, sempre que
possvel, o programador deve explicitar o ponteiro que est criando. A seguir so apresentados
alguns exemplos.

Aqui vamos ter uma pequena idia de como o SDCC emprega as reas de memria do 8051.
Normalmente, o SDCC usa o primeiro banco de registradores (banco 0), sendo que possvel
especificar outros bancos de registradores para serem usados pelas rotinas de interrupo. Se nada
for especificado, o compilador posiciona a pilha logo depois do ltimo byte da memria alocada
para as variveis.

Por exemplo, se somente os dois primeiros bancos de registradores forem usados e as variveis de
dados demandarem 4 bytes, ento a pilha comear no endereo 20 (0x16), ou seja, o programa
inicia com SP = 15h. Isto significa que a pilha avanar sobre os outros dois bancos de registradores,
depois sobre os 16 bytes endereveis bit-a-bit e posteriormente sobre o restante da RAM interna.
Caso se faa uso de variveis de bit, as variveis de dados sero criadas sobre os registradores no
empregados, continuando depois do ltimo byte cujos bits foram usados. Por exemplo, se forem
usados dois registradores e 9 variveis de bit (que demandam 2 bytes), os dados sero criados nos
endereos de 10h at 1Fh e continuam em 22h. A pilha, claro, s ser criada depois da rea de bits.

Algumas opes de compilao permitem controlar o layout de memria. A opo --data-loc


permite especificar o endereo de incio da rea data. Com a opo --iram-size, possvel
indicar o tamanho total da RAM interna (data + idata). Com a opo --stack-loc, possvel
indicar ao linker o endereo de incio da pilha. Caso o microcontrolador empregado possua os 128
bytes extras para endereamento indireto (128 upper), aqui referenciado como idata, ser
interessante posicionar a pilha sobre esta regio. As opes --xdata-loc e --xdata-size
permitem indicar o endereo de incio da RAM externa e seu tamanho, respectivamente. O incio e o
tamanho da rea de cdigos so indicados com --code-loc e --code-size.

O linker gera dois arquivos. Um arquivo com a extenso .map, que mostra todas as variveis e os
segmentos. O outro arquivo, com extenso .mem, mostra o layout da memria. sempre
interessante usar esses arquivos para conferir o emprego das memrias. O linker gera mensagem de
erro caso haja superposio de memrias, caso a memria no seja suficiente ou ainda caso no haja
espao para a pilha.

possvel indicar o endereo absoluto para uma varivel com a opo at <endereo>, em adio
classe de armazenamento. Por exemplo:

Neste caso, ser criada a varivel cheque, localizada nos endereos 7FFEh e 7FFFh da RAM
externa. O compilador no reserva qualquer espao para variveis declaradas desta forma. Elas so
simplesmente criadas com equates (EQU) do montador. obrigao do programador verificar se
no h superposio com as variveis criadas da maneira tradicional. Um bom local para verificar
essa superposio so os arquivos .lst, .rst e .map.

No caso de dispositivos de entrada e sada mapeados em memria, deve-se empregar a expresso


volatile para informar ao compilador que estes acessos no devem ser removidos. No caso do
P5C, o latch que comanda o acendimento dos leds est no endereo 8000h da memria de dados
externa, portanto deveria ser declarado como:

Todas as classes de variveis podem ter seu endereo absoluto indicado. Por exemplo, no caso de
bits, se desejamos criar a varivel erro (de 1 bit) no endereo 7h, fazemos uso de:
O compilador SDCC permite que as rotinas que sirvam a interrupes sejam escritas em C. Por
exemplo, se quisermos indicar a rotina ct0_rot para servir interrupo do contador/temporizador
0 e ela dedicamos o banco de registradores nmero 2, ento devemos usar:

A expresso interrupt 1 indica que esta rotina deve ser alocada para o vetor de interrupo de
nmero 1 e a expresso using 2 indica que para ela est reservado o banco de registradores nmero
2. No endereo 000Bh da memria de cdigos, ser colocada uma chamada para esta rotina. Caso o
programa esteja dividido em diversos arquivos, necessrio que uma declarao da rotina de
interrupo seja colocada no arquivo que contenha a funo main. A tabela a seguir resume as
principais interrupes do 8051 e o nmero empregado pelo SDCC.

necessrio escrever as rotinas de interrupo com muito cuidado, do contrrio podem surgir erros
difceis de serem identificados. Se a rotina de interrupo altera variveis que tambm so acessadas
por outras rotinas, tais variveis devem ser declaradas como volatile.

O leitor precisa de ter em mente que a interrupo pode acontecer a qualquer momento. Num
processador de 8 bits, o acesso a variveis de 16 e 32 bits no atmico, ou seja, feito com o
emprego de diversas instrues. Se o programa principal e uma rotina de interrupo manipulam
variveis desse tipo, h perigo de gerar inconsistncia de dado. Imagine a situao: enquanto o
programa principal estiver escrevendo numa varivel de 32 bits, ele interrompido e entra uma
rotina que tambm altere o valor dessa varivel. O perigo tambm existe em algumas situaes
quando se empregam variveis de 8 bits, como em cont = cont + 5. Para fazer essa operao de 8
bits, so empregadas, pelo menos, trs instrues assembly. Assim, muito cuidado quando trabalhar
com variveis que tambm sejam compartilhadas com rotinas de interrupo.

O endereo de retorno e o valor original dos registradores empregados pela rotina de interrupo so
guardados na pilha. Por isso, importante prever espao na pilha. Leve em conta que vrias
subrotinas podem estar aninhadas quando ocorrer a interrupo. importante calcular o tamanho da
pilha que ser necessrio, considerando a pior situao de aninhamento.

Quando a rotina de interrupo fizer uso de operao de diviso, multiplicao, mdulo em variveis
de 16 ou 32 bits ou quando ela usar operaes de ponto flutuante, necessrio recompilar as rotinas
envolvidas com a opo --stack-auto. O programa dever ser recompilado com a opo --int-
long-reent. Para finalizar, evite chamar uma funo a partir de uma rotina de interrupo.

Se a rotina de servio de interrupo for definida sem especificar o banco de registradores (omisso
do using) ou se ela empregar o banco 0 (using 0), ento o compilador ir armazenar na pilha todos
os registradores por ela empregados, durante a chamada, e ir restaur-los por ocasio do regresso.
Este esquema til para rotinas pequenas, que fazem pouco uso dos registradores. Entretanto, se a
rotina de interrupo chamar outra funo, ento todos os registradores sero armazenados na pilha.

Se a rotina de servio de interrupo for definida especificando um banco de registradores, ento


somente os registradores A, B, DPTR e PSW sero guardados na pilha, por ocasio da chamada, e
posteriormente restaurados, por ocasio do regresso. Este esquema til para grandes rotinas de
interrupo, que fazem uso de vrios registradores. Se essa rotina chamar uma funo, ento todo o
banco de registradores empregado pela funo chamada ser armazenado na pilha.

Quando uma rotina de interrupo trouxer a expresso using, considera-se que ela pode alterar
como quiser este banco, sem se preocupar com seu contedo. Em geral, o cdigo gerado ser mais
eficiente se cada interrupo trabalhar com seu prprio banco de registradores. Mas no h bancos
suficientes para todas as interrupes. Se duas rotinas de interrupo possuem a mesma prioridade,
elas podem compartilhar o mesmo banco de registradores. Uma sugesto reservar um banco para as
interrupes de alta prioridade e outro para as de baixa prioridade.

A expresso critical permite criar funes que no possam ser interrompidas. Todas as
interrupes so desabilitadas antes de se iniciar uma funo com esta declarao e, ao seu final, as
interrupes so restauradas. Exemplo:

A expresso critical pode ser empregada para desabilitar as interrupes localmente:


Controlando a flag EA, possvel desabilitar diretamente as interrupes:

O usurio pode inserir instrues do assembly em suas rotinas, desde que marque o incio e o final
com _asm e _endasm. H liberdade para alterar registradores e variveis. Um detalhe j visto que
o nome das variveis tem um pequeno trao no seu incio. Por exemplo, se o programador declarou a
varivel char contador, ento deve usar o nome _contador para acess-la. preciso ter cuidado
com as variveis de 16 ou 32 bits, pois o 8051 trabalha apenas com 8 bits.

O emprego de rtulos (labels) sofre algumas restries. Eles devem ser declarados com o formato
nnnn$, onde nnnn um nmero menor que 100. H, portanto, o limite de 100 rtulos. Os rtulos
declarados em C s podem ser referenciados por instrues em C e o mesmo acontece com os rtulos
declarados em assembly , que so limitados funo onde so usados. Veja o exemplo a seguir, onde
os rtulos LBC e $0003, apesar de serem distintos, efetivamente desviam para o mesmo ponto do
programa.

Se a expresso _naked for adicionada a uma funo, ela ser compilada sem os trechos de
programa que sempre iniciam e terminam as funes. Isto significa que o usurio responsvel por
salvar registradores que precisam de ser preservados, selecionar o banco correto e at colocar a
instruo de retorno no final. Em outras palavras, a expresso _naked informa ao compilador que
esta funo ser escrita em assembly. Isto muito til para rotinas que servem interrupes. Vejamos
esta simples rotina:
Aps a compilao, gerado o seguinte cdigo:

uma grande quantidade de cdigos s para incrementar uma varivel. A melhor soluo declarar
a funo da seguinte forma:

Agora a compilao gera o cdigo listado a seguir:


A chamada de rotinas assembly a partir de um programa em C permitida, mas o programador deve
preocupar-se com os argumentos. Em linguagem C, os parmetros das funes so passados com o
uso da pilha. Entretanto, a pilha no 8051 muito pequena e existem poucas instrues para manipul-
la. A soluo adotada no SDCC foi a de usar registradores e memria. O primeiro argumento (de
uma funo) a partir da esquerda e o valor a ser retornado so passados usando DPTR, A e B,
segundo a quantidade de bytes, como mostrado na tabela. Os demais argumentos so passados via
memria.

Vejamos um pequeno exemplo, onde a rotina func chama a rotina rot_asm, passando dois
argumentos de um byte. A rotina rot_asm, por sua vez, soma esses dois argumentos e retorna um
valor inteiro (dois bytes). Vamos considerar que rot_asm est em um arquivo separado. Neste caso,
para que a rotina C saiba disso, adicionada a declarao extern int rot_asm.

O arquivo com a rotina rot_asm deve ter o aspecto mostrado logo a seguir. So empregados
diversos recursos do montador asx8051 que no estudamos por no estarem dentro de nossos
objetivos. Entretanto, o que apresentado deve resolver os problemas mais simples. Caso se
necessite de mais detalhes, o programador deve ler o manual deste montador que acompanha o
SDCC.
Considerando que o programa em C esteja no arquivo func.c e a rotina assembly no arquivo de
nome rot_asm.asm, o montador e o compilador devem ser invocados com os comandos:

Logo no incio do cdigo gerado, o compilador SDCC insere uma chamada para a rotina
_sdcc_external_startup( ). Esta uma rotina que zera todas as posies da RAM interna. Se ela
retornar 0, antes de chamar a funo main, o compilador insere os cdigos necessrios para a
inicializao das variveis estticas e globais. Caso contrrio, salta diretamente para a funo main.

O programador, se assim desejar, pode acrescentar no seu programa sua prpria rotina
_sdcc_external_startup( ), que substituir a original. Este o local onde se realizam
importantes configuraes ou operaes crticas, antes da criao das variveis estticas e globais.
Por exemplo, em algumas arquiteturas 8051, necessrio fazer a configurao da memria de dados
externa antes de empreg-la.

Vrias opes do compilador e do linker podem ser selecionadas atravs da linha de comando.
Note que algumas so precedidas por dois sinais de menos (--). Apresentamos aqui apenas as opes
que consideramos interessantes. Uma lista completa das quase 100 opes est disponvel no manual
do compilador.
-mmcs51
Gera cdigo para a famlia de processadores MCS51. Esse o modo default.
-mds390
Gera cdigo para o processador DS80C390 da Dallas.
-mds400
Gera cdigo para o processador DS80C400 da Dallas.
--model-small
Gera cdigo empregando o modelo de memria small. Esse o modelo default.
--model-large
Gera cdigo empregando o modelo de memria large.
--xstack
Cria uma falsa pilha nos primeiros 256 bytes da RAM externa, para alocar variveis e passar
parmetros.
--iram-size <valor>
O linker verifica se o uso da RAM interna est dentro do limite especificado em valor.
--xram-size <valor>
O linker verifica se o uso da RAM externa est dentro do limite especificado em valor.
--code-size <valor>
O linker verifica se o uso da memria de cdigos est dentro do limite especificado em valor.
--stack-size <valor>
O linker verifica se a quantidade de bytes disponvel para a pilha igual ou maior que valor.
--pack-iram
O linker usa os bancos ociosos para variveis de dados e empacota conjuntamente data, idata e
stack. Nas verses mais atuais, essa opo passou a ser default.

--no-pack-iram
O linker no empacota conjuntamente data, idata e stack. Alocao das reas de memria feita
da maneira empregada nas verses mais antigas.
-L --lib-path <caminho completo para bibliotecas adicionais>
Com essa opo orienta-se o linker para buscar mais bibliotecas.
--xram-loc <valor>
Por default, o incio da RAM externa zero, mas, com essa opo, o programador pode indicar um
novo incio. O valor pode ser especificado em hexadecimal ou decimal.
--code-loc <valor>
Por default, o incio da memria de cdigos zero, mas, com essa opo, o programador pode
indicar um novo incio. Note que a tabela de vetores de interrupo tambm relocada. O valor pode
ser especificado em hexadecimal ou decimal.
--stack-loc <valor>
Por default, a pilha colocada logo depois do segmento de dados. Com essa opo, a pilha pode ser
construda em qualquer lugar da RAM interna. O valor pode ser especificado em hexadecimal ou
decimal. Como o ponteiro da pilha (SP) incrementado antes de escrever, o valor inicial do SP
igual a valor-1. necessrio que o programador verifique se h espao para a chamada de todas suas
rotinas.
--data-loc <valor>
Por default, o segmento de dados (RAM interna) inicia logo aps o ltimo banco de registradores
empregado ou logo aps o ltimo byte cujos bits foram empregados (rea enderevel bit a bit). Com
essa opo, o segmento de dados pode ser posicionado a partir de qualquer endereo da RAM
interna. O valor pode ser especificado em hexadecimal ou decimal.
--idata-loc <valor>
Por default, o incio da rea enderevel indiretamente (128 upper) 80h. Com essa opo, o
programador pode especificar o endereo de incio desta rea. O valor pode ser especificado em
hexadecimal ou decimal.
--bit-loc <valor>
Por default, o incio da rea enderevel bit a bit 0 o bit 0 do byte de endereo 20h. Essa opo
ainda no est implementada.
--out-fmt-ihx
O linker gera a sada no formato Intel.hex. Essa a opo default.
--out-fmt-s19x
O linker gera a sada no formato Motorola S19.
--opt-code-speed
O compilador otimiza buscando velocidade, em detrimento do tamanho.
--opt-code-size
O compilador otimiza buscando diminuir o tamanho, em detrimento da velocidade.
-c --compile only
Apenas compila o programa, sem chamar o linker.
-o <path\file>
Caminho para o diretrio onde o compilador deve gerar as sadas.
--stack-auto
Todas as funes so compiladas como reentrant, isto , os parmetros e variveis locais sero
criados na pilha.
--debug
O compilador gera informao para um programa de depurao ou debuger num arquivo com a
extenso .cdb, que pode ser usado pelo programa SDCDB.
--main-return
No final da rotina main, o compilador introduz um lao infinito (SJMP $ ou SJMP .) para travar o
processador. Com essa opo, o compilador no coloca o lao infinito no final da rotina main, mas
sim uma instruo de retorno, possibilitando que a rotina main seja chamada por outro programa. Um
outro emprego quando o programador constri a rotina main com um lao infinito. Nesse caso, ele
pode dispensar o lao infinito introduzido pelo compilador.
--print-search-dirs
O compilador imprime o caminho de busca dos diversos mdulo do SDCC.

Aqui daremos algumas dicas visando a buscar uma melhor produtividade com o SDCC.

No devemos usar funes reentrantes, que so funes que chamam a si mesmas. Tais funes
demandam uma grande quantidade de pilha e por isso devem ser evitadas. Se for necessrio

empreg-las, preciso escolher a opo --stack-auto. Sugerimos que o programador consulte o


manual de forma a verificar os detalhes de funes reentrantes com o SDCC.
Use o menor tipo de dado para armazenar seus valores. Por exemplo, se sabido que o valor de

uma varivel nunca ultrapassa 255, ento ela deve ser declarada como unsigned char.
Sempre que possvel, empregue variveis locais, especialmente as que trabalhem como contadores

de laos de repetio.
Evite chamar funes dentro de rotinas servio de interrupo. A sobrecarga de programa

aprecivel e pode fazer a rotina ficar muito lenta.


Nunca salte para dentro de um lao de repetio.
Reduzir o tamanho das operaes de multiplicao, diviso e mdulo pode reduzir

significativamente o tamanho do programa.


sempre interessante examinar o cdigo assembly gerado pelo compilador. Isto permite que o
programador tenha um melhor sentimento de como empregar o SDCC. Lembre-se de que, devido
s otimizaes, linhas que no tenham qualquer efeito so eliminadas.
13.10. Exerccios Resolvidos

Resolveremos alguns exerccios que j foram feitos usando assembly, porm empregando
agora a linguagem C.

Refaa o exerccio resolvido 6.1, que aciona um mostrador de 7 segmentos, tambm chamado de
decodificador de 7 segmentos. Empregue a porta P1. Como o problema pede uma subrotina,
programe apenas uma funo em C, o que significa que no haver rotina main. Essa funo ser
inteligente, apagando o mostrador e retornando zero, caso o argumento recebido seja maior que 9.
Caso contrrio, o nmero correto apresentado no mostrador e a rotina retorna um valor diferente de
zero.

Soluo:

Refazer o exerccio resolvido 8.1, que gera pelo pino P1.7 uma onda quadrada de 2,5 kHz.
interessante lembrar que, se nada for dito, o compilador adiciona automaticamente um lao infinito
no final da rotina main.
Soluo:

Refaa o exerccio resolvido 8.6, que pede um cronmetro de 00,0 at 59,9 segundos e faz uso de
trs mostradores de 7 segmentos. Existe a disponibilidade de duas chaves: CH1 e CH2.

Soluo:
13.11. Exerccios

13-1) Empregando linguagem C, resolva os exerccios:

(a) 6-23
(b) 6-24
(c) 6-25
(d) 6-27
(e) 6-28
(f) 6-29
(g) 6-30
(h) 6-31
(i) 6-32
(j) 6-34
(k) 6-36
(l) 6-38

13-2) Empregando linguagem C, resolva os exerccios:

(a) 7-1
(b) 7-3

13-3) Empregando linguagem C, resolva os exerccios:

(a) 8-1
(b) 8-3
(c) 8-4
(d) 8-5
(e) 8-7
(f) 8-10
(g) 8-11
(h) 8-12
(i) 8-13
(j) 8-23

13-4) Empregando linguagem C, resolva os exerccios:

(a) 9-3
(b) 9-4
(c) 9-5
(d) 9-8
(e) 9-9
(f) 9-14

13-5) Empregando linguagem C, refaa os exerccios resolvidos:

(a) 8.4
(b) 8.5
(c) 8.7

13-6) Empregando linguagem C, refaa os exerccios resolvidos:

(a) 9.1
(b) 9.2
(c) 9.3
(d) 9.4
Apndice A: Representao Numrica

Na vida cotidiana, usamos de forma rotineira o sistema numrico decimal e muitas vezes
nos esquecemos das regras de sua constituio. O sistema de numerao calcado na
base dez natural ao ser humano pela associao com seus dez dedos. Entretanto, levou
muito tempo para que o homem o desenvolvesse e um legado das civilizaes arbica e
indiana. interessante comentarmos um pouco mais sobre sistemas de numerao para
vermos que outros sistemas de numerao j foram empregados pelo homem.

Diz a histria que, por volta de 3.300 A.C., os sumerianos formaram na regio da
Mesopotmia a primeira civilizao humana. Eles empregavam dois sistemas de
numerao: base 5 e base 12. Para a base 5, usavam os dedos de uma mo para contar
e os da outra para acumular a quantidade de 5. A contagem na base 12 era um pouco
mais complexa. Supem os historiadores que a contagem se fazia com base nas falanges
dos quatro dedos (3 x 4 = 12), sendo que o polegar, correndo sobre as falanges, era
usado como marcador da contagem. Os dedos da outra mo eram usados como
auxiliares, para marcar, na base 5, a quantidade de 12 j contada.

Quando se trabalha com programao, especialmente com assembly, precisa-se de uma


forma simples para representar bits. Naturalmente, surge a idia de empregar a base 2,
com os smbolos 0 e 1. Porm, a escrita com tais smbolos longa e montona. Por
isso, busca-se por outras bases que forneam uma escrita compacta, mas mantendo uma
forte associao com a base 2. Os melhores candidatos so a base 8 (octal) e a base
hexadecimal (16) que ser estudada a seguir. O importante que fique claro que se usam
essas bases como uma forma prtica para representar nmeros binrios.
A.1. Representao Binria e Hexadecimal

No cotidiano, usamos 10 smbolos arrumados em uma notao posicional. Cada um deles


indica o coeficiente a ser multiplicado pela potncia de 10 que marcada pela posio. A
figura A.1 apresenta os 10 smbolos usados (so bvios) e a notao posicional para o
nmero 1998.

Para esclarecer ainda mais este conceito, o nmero 1998 obtido pela expresso a seguir:

Os nmeros so expressos usando potncias de dez multiplicadas pelos coeficientes apropriados e,


por isso, nosso sistema denominado de raiz dez ou base dez. possvel, sendo muitas vezes til,
usar outras bases, como a base dois. Isto vantajoso, pois, com o sistema binrio, pode-se arranjar
uma correspondncia direta entre os nmeros binrios e as variveis binrias (booleanas). Para
evitar confuses, convenciona-se que todo nmero seja decimal, a no ser que se diga o contrrio. Os
nmeros binrios so marcados pela letra b ou B colocada no seu final. claro que, quando a base
for extremamente bvia, pode-se omitir a letra b para beneficiar a clareza do texto. A expresso a
seguir apresenta o nmero 37 representado em binrio.

Agora, a pergunta bvia : como converter nmeros decimais para a representao binria? A
resposta bem simples e est apresentada na figura A.2, onde se divide sucessivamente o nmero a
converter pela base, enquanto os quocientes intermedirios forem maiores que ela, e depois tomam-
se os restos intermedirios e o ltimo quociente. Julgando pela explicao, parece um procedimento
complicado, mas a anlise da figura demonstra o contrrio.

A tabela A.1 apresenta os primeiros 32 nmeros binrios, junto com seus valores na base 10. De
posse desta tabela, o leitor deve praticar alguns exerccios de converso de nmeros da base 10 para
a base 2.
Uma particularidade da base 2, que j deve ter sido notada, a quantidade de dgitos, que muitas
vezes dificulta a leitura e facilita a ocorrncia de erros. Por exemplo: para o nmero 19, foram
necessrios 5 dgitos binrios. E para um nmero maior? Como a representao do nmero 1998 na
base 2? A resposta : 1998 = 11111001110b.

Realmente, fica uma enorme seqncia de uns e zeros, dificultando a escrita e a leitura. Um convite
ao erro ! Existe uma outra base que permite notao compacta e que ainda possui uma forte relao
para com a base binria. Esta base a hexadecimal. Como o nmero da base (16) potncia de dois,
ela tem uma forte ligao (como ser verificado) com o sistema binrio. Com a base hexadecimal,
usam-se 16 smbolos diferentes. Pode-se usar os 10 smbolos do sistema de numerao decimal (0,
1, 2, ..., 9), adicionando 6 smbolos extras, que, por simplicidade, so as 6 primeiras letras do
alfabeto, conforme ilustrado na tabela A.2. Os nmeros hexadecimais sero caracterizados pela letra
h ou H no seu final. Assim, o nmero 1998 na base 16 : 1998 = 111 1100 1110 b = 7CEh.

fcil imaginar como feita a converso da base 10 para a base 16. Basta realizar sucessivas
divises pelo nmero 16. Isto est demonstrado na figura A.3. J a converso de binrio para
hexadecimal extremamente simples, bastando agrupar, a partir da direita, os nmeros binrios em
grupos de 4 dgitos, cada grupo gerando um dgito hexadecimal. Isto tambm pode ser observado na
figura A.3. A volta tambm verdadeira, ou seja, para converter um nmero base 16 para a base 2,
basta substituir cada dgito hexadecimal pelos seus 4 dgitos binrios correspondentes.

O dgito binrio, que a menor unidade capaz de ser representada por um circuito digital, recebe o
nome de bit, que a contrao de duas palavras inglesas BInary digiT. Est-se acostumado a agrupar
os nmeros decimais em grupos de 3 dgitos. Por exemplo, ao invs do nmero 673286097830,
prefervel ler-se 673.286.097.830. A mesma coisa feita com os nmeros em representao binria,
s que o agrupamento de 4 em 4 para facilitar a converso para hexadecimal. Ao agrupamento de 4
dgitos binrios d-se o nome de nibble. J o processamento feito pelos computadores est baseado
em agrupamentos de 8 bits, cada um destes recebendo o nome de byte. Note que cada byte possui
dois dgitos hexadecimais. Tambm til trabalhar com grupos de 16, 32 ou 64 bits. A tabela A.3
apresenta os agrupamentos usuais e algumas de suas denominaes.
A.2. Soma Aritmtica com Nmeros Binrios

A mesma operao de soma aritmtica que se faz com os nmeros decimais aplicada
aos nmeros binrios, s que agora existem apenas dois dgitos e que no se pode
esquecer do vai um que, em ingls, tem o nome de carry, j comumente consagrado
na literatura tcnica nacional. A tabela A.4 apresenta os quatro casos possveis quando se
somam dois dgitos binrios.

Devemos ter cuidado para no confundirmos a soma aritmtica com a soma lgica (booleana).
Quando se usam funes OR e AND, esto sendo realizadas operaes lgicas. Porm, aqui neste
tpico, estamos tratando de operaes aritmticas, razo pela qual 1 + 1 igual a 0 (zero) e aparece
o vai um. A figura A.4 apresenta duas somas com nmeros em representao binria. O leitor
convidado a repetir esta operao.

A mesma soma pode ser feita com dgitos hexadecimais, tomando cuidado com as somas
intermedirias. A figura A.5 apresenta duas somas com dgitos hexadecimais.
A.3. Nmeros Negativos e Subtrao

O ttulo deste tpico associa os nmeros negativos subtrao, pois ser mostrada uma
representao negativa para auxiliar na operao de subtrao. Da mesma forma, como
existem as regras para a soma de dois nmeros binrios, tambm existem as regras para
a subtrao (isso extremamente bvio). Por exemplo, podemos subtrair 3 do nmero 5;
para tanto, usamos as regras da subtrao. Porm, o que se deseja neste ponto algo
um pouco diferente: encontrar uma representao para o trs negativo (-3), tal que
somada ao nmero 5 resulte na operao 5 + (-3) = 5 - 3.

Por que essa preocupao? Por que no realizar logo a subtrao? Nos projetos digitais, um ponto
muito importante a complexidade do circuito. Quanto maior o circuito, mais caro ele e tambm
maior a probabilidade de falhas. Por isso, ao invs de se projetarem dois circuitos distintos, um
somador e um subtrator, projeta-se nico hardware que, entre outras coisas, faz operaes de soma e
subtrao. Com a representao de nmeros negativos, o somador tambm poder ser usado para
realizar as subtraes.

O primeiro conceito til para o entendimento da representao de nmeros negativos o de


Complemento Um. muito simples calcular este complemento, bastando inverter todos os bits:

No dia a dia, quando se diz que uma pessoa totalmente inoperante, diz-se que ela um zero
esquerda. bvio que esta expresso vem do fato de que, esquerda de um nmero positivo, pode-
se colocar tantos zeros quanto se queira, pois eles no tm a menor importncia. De forma
semelhante, ser mostrado que, esquerda de um nmero negativo, pode-se por tantos uns quantos se
queira.

Os circuitos digitais sempre operam com uma quantidade limitada de bits, tais como os valores
tpicos 4, 8, 16, 32, e 64. Para evitar a monotonia dos clculos longos, adotaremos, neste momento, o
trabalho apenas com 4 bits.

Na verdade, os nmeros negativos so designados usando-se uma representao em Complemento


Dois. A definio de complemento 2 de um nmero N com B bits na parte inteira :

Assim, o complemento 2 dos nmeros inteiros de 0 a 15, usando 4 bits na parte inteira, so
respectivamente 16 a 1. Ao adotar-se a representao de nmeros negativos usando complemento 2,
reserva-se o bit mais a esquerda (chamado de bit mais significativo) como o bit de sinal. Se o bit de
sinal for 0, o nmero positivo; se for 1, negativo. Desta forma, como achar a representao de -3?
Basta calcular o complemento 2 dele, que 13. Portanto, (-3) representado como 1101.

Como mostrado na figura A.6, existe uma pequena confuso na adoo da representao dos
nmeros. Caso se use uma representao sem sinal, os nmeros de 4 bits variam de 0 a 15. Caso se
use uma representao com sinal, os nmeros variam de -8 a +7. Repare que o 0 positivo na tica
da eletrnica digital. Para nmeros inteiros de 8 bits sem sinal, a variao vai de 0 a 255, enquanto
que, para inteiros com sinal, vai de -128 a +127.

Um truque interessante para calcular o complemento dois de um nmero efetuar o seu complemento
um e depois somar o bit 1 ao bit mais direita (chamado de bit menos significativo). A figura A.7
exemplifica o complemento dois para dois nmeros.

Existe outro algoritmo muito til para o clculo do complemento dois: comear a reescrever o
nmero binrio da direita para a esquerda, quando encontrar o primeiro dgito 1, repetir o mesmo e
complementar todos os demais dgitos. Mesmo se o dgito mais direita for 1, repeti-lo e inverter
todos os demais. A figura A.8 ilustra este algoritmo.

Um fato interessante que as operaes de soma e subtrao independem da representao que se


adote: com ou sem sinal. Assim:

Por este fato, as operaes aritmticas envolvendo nmeros negativos em representao com
complemento dois so muito simples, pois se houver vai um no ltimo bit, ele simplesmente
ignorado. A figura A.9 apresenta outros exemplos de operaes.

Para terminar, explicado conceito de overflow. Ao se trabalhar com um nmero fixo de bits, pode
haver uma operao de soma que leve a um resultado que est alm das possibilidades de
representao daquele conjunto de bits.

Por exemplo, quando se trabalha com 4 bits em complemento dois, os nmeros devem estar entre -8 e
+7. Qualquer nmero aqum ou alm desses limites acarretar num overflow. Para cada operao,
necessrio um teste para verificar o overflow. Isto pode parecer complicado, mas ele
operacionalmente muito fcil de ser implementado. completamente lgico que a soma de dois
nmeros positivos deva dar como resultado um nmero positivo e que o resultado da soma de dois
nmeros negativos deva ser um nmero negativo. Se isto no acontecer, aps desprezar-se o carry,
porque houve um overflow.

A figura A.10 apresenta dois casos de overflow, em representao com 4 bits. Nesta figura, na
operao da esquerda, a soma de dois nmeros positivos 4 + 5 teve como resultado um nmero
negativo (-7) e, na operao da direita, a soma de dois nmeros negativos (-5) + (-6) teve como
resultado um nmero positivo 5. importante lembrar que o overflow surgiu porque se est usando
uma representao limitada a 4 bits. Se a representao tivesse 8 bits, esses nmeros no
provocariam overflow. Porm, este erro seria ocasionado por um outro par de nmeros. Para no
confundir o carry com o overflow numa representao sem sinal, na soma, ambos so iguais e, na
subtrao, ambos so complementares
Apndice B: Tabela ASCII
Apndice C: Mostrador LCD

Um dispositivo muito til para os microcontroladores o mostrador, usualmente designado


com o termo display. Encontramos no mercado uma enorme variedade de mostradores e
precisvamos selecionar uma classe para o uso na placa pentacontroladora. Devido a sua
grande aceitao, optamos pelos mostradores de cristal lquido, tambm chamados de
mostradores LCD (Liquid Crystal Display).

Os mostradores LCD so versteis, de fcil leitura, apresentam custo razovel e oferecem


um baixo consumo. No passado, o uso de tais mostradores no era to grande devido
complexidade dos sinais de controle que deveriam ser gerados. Mais recentemente, com o
advento da famlia de controladores LCD da Hitachi (HD44780), houve uma grande difuso
desses dispositivos, gerando um padro largamente aceito. Hoje, temos nossa
disposio os mostradores LCD alfanumricos, onde o usurio trabalha com nmeros e
letras, e os mostradores LCD grficos, que disponibilizam uma matriz de pontos que
podem ser acesos ou apagados. Com o crescimento do mercado de celulares, os
mostradores LCD grficos esto ficando baratos e, em breve, poderemos cogitar a
possibilidade de adicionarmos mostradores coloridos.

Neste apndice, inicialmente trataremos dos mostradores LCD alfanumricos, que so os


mais comuns. Iniciamos com a descrio da pinagem mais empregada em tais
mostradores. Em seguida, estudamos o formato dos caracteres do LCD. Cada caracter
apresentado a partir de uma memria, denominada de memria do mostrador. A relao
entre cada posio do mostrador e cada byte dessa memria bastante sofisticada. Uma
vez entendido este ponto, temos condies de abordar a operao e o controle do
mostrador LCD. Assim, passamos para o estudo dos mostradores grficos, que
operacionalmente so semelhantes aos alfanumricos. Terminamos apresentando os
diagramas de tempo de tais mostradores e explicando o porqu da soluo empregada no
Pentacontrolador.
C.1. Pinagem dos Mostradores LCD

Usualmente, esses mostradores trabalham com 14 pinos. Entretanto, os que possuem luz
de fundo trazem 16 pinos, pois acrescentam mais dois pinos para alimentar o LED que
produz a luz de fundo. A tabela C.1 apresenta essa pinagem.

normal encontrarmos na placa de circuito impresso do LCD indicaes que permitam identificar os
pinos. Tais indicaes esto dispostas na horizontal, em uma linha, ou ento na vertical, em duas
colunas. Como o pino 1 o de conexo ao terra e as linhas de terra so sempre mais grossas, fica
fcil identificar a numerao dos pinos. A figura C.1 apresenta as disposies mais comuns dessas
pinagens. A seguir, descrevemos a funo de cada um desses pinos.

Pino 1 VSS: Terra. Referncia das tenses.

Pino 2 VDD: Alimentao. Tenso positiva, normalmente na faixa de 3 a 6 V, mas deve ser
confirmada no manual do fabricante.

Pino 3 VEE: Contraste. Este pino deve ser conectado a uma tenso varivel de forma a permitir
ajustar o contraste do mostrador, o que conseguido facilmente com o uso de um potencimetro
conectado entre VDD e VSS. Em situaes extremamente simples, possvel conect-lo ao terra.
Alguns mostradores, especialmente os mais antigos, podero exigir uma tenso negativa por esse
pino.

Pino 4 RS: Seleciona Registrador. Quando este pino estiver em nvel baixo, os bytes transferidos
para o mostrador so tratados como instrues e os bytes lidos trazem informaes do seu estado.
Com este pino em nvel alto, possvel enviar ou receber caracteres para o mostrador.

Pino 5 R/W: Leitura/Escrita. Quando em nvel baixo, seleciona o mostrador para o modo escrita
e, quando em nvel alto, para o modo leitura.

Pino 6 E: Habilitao. Esta habilitao usada para realizar as transaes com o mostrador. A
escrita efetivada com o flanco de descida deste pino. No caso de leitura, o dado est disponvel um
pouco depois deste pino ir para nvel alto.

Pinos 7 a 10: Dados 0 a 3. Quando programado para uma interface com 8 bits, esses pinos carregam
os bits de 0 a 3 dos bytes enviados ou recebidos. Caso se faa uso de interface com 4 bits, esses
pinos no so usados.

Pinos 11 a 14: Dados 4 a 7. Quando programado para uma interface com 8 bits esses pinos carregam
os bits de 4 a 7 dos bytes enviados ou recebidos. Caso se faa uso de interface com 4 bits, esses
pinos so usados para construir o barramento de 4 bits. Neste caso, a transferncia de cada byte
feita em dois acessos consecutivos.

Pino 15: Anodo. Este pino est conectado ao anodo do led responsvel por fornecer a iluminao de
fundo do mostrador. Ele ligado a um potencial positivo. bom lembrar que se deve usar um
resistor para limitar sua corrente atravs do led. Para calcular o valor do resistor, recomendado a
consulta do manual do fabricante para conferir as caractersticas de tenso e corrente deste led.
Alguns mostradores j trazem esse resistor incorporado.

Pino 16: Catodo. Este pino est conectado ao anodo do led responsvel por fornecer a iluminao de
fundo do mostrado. Ele dever ser ligado a um potencial inferior ao do anodo. Usualmente,
conectado ao terra.
C.2. Formato do LCD

O chip HD44780 um controlador inteligente que permite uma comunicao muito fcil
com dispositivos microprocessadores, como o caso do nosso pentacontrolador. As
instrues e os dados so enviados atravs do barramento de dados (D0, ..., D7) de 8
bits, sendo que este barramento pode ser diminudo para 4 bits (D4, ..., D7), o que permite
baratear algumas aplicaes. As instrues permitem configurar a operao do controlador
LCD. Os dados definem os caracteres que sero exibidos. De forma bem simples, pode-
se dizer que a misso do controlador LCD exibir continuamente os dados que esto
escritos na sua memria RAM.

O controlador LCD possui uma memria RAM, denominada de memria de dados do


display e referenciada com a sigla DDRAM (Display Data RAM), que recebe os dados que
queremos exibir. Por exemplo, para fazer aparecer a letra A na primeira posio do
mostrador, basta escrever o byte 41H (ASCII da letra A) na posio 0 da DDRAM.

Um ponto que costuma confundir um pouco os usurios a relao entre as posies da


memria DDRAM e os diversos formatos e tamanhos de mostradores. O formato costuma
ser designado pelo nmero de linhas e pelo nmero de colunas. Por exemplo, 2x16 indica
uma mostrador de 2 linhas por 16 colunas. Os formatos mais comuns so: 1x16, 1x20,
2x16, 2x20, 2x40 e 4x16.

Independentemente do formato do mostrador, a memria DDRAM dividida em duas


pores, cada uma com 40 posies, perfazendo um total de 80 posies. A primeira
poro ocupa os endereos de 0 a 27H (de 0 a 39, em decimal) e a segunda poro os
endereos de 40H a 67H (de 64 a 103, em decimal). Um ponto interessante que no
existe memria na faixa de endereos de 28H at 3FH (de 40 a 63, em decimal). A figura a
seguir apresenta o mapeamento da DDRAM para alguns formatos.

A figura C.2 apresenta os formatos mais comuns desses mostradores e a relao entre cada posio e
a memria DDRAM. Por exemplo, para um mostrador 2x16, o quinto caracter da primeira linha est
mapeado na posio 4 da DDRAM. J o stimo caracter da segunda linha ocupa a posio 46H da
DDRAM. De forma anloga, esse mapeamento usada para todos os formatos dos mostradores,
exceo dos mostradores de uma linha. Esses mostradores de uma linha na verdade usam duas linhas
apresentadas em seqncia. Note que o mostrador 1x16 formado por uma linha ocupando as
posies de 0 at 7 e por outra ocupando as posies de 40H at 47H. Como essas duas linhas so
arrumadas lado a lado, fica-se com uma nica linha com o dobro do tamanho.

Independentemente do formato, o tamanho da DDRAM nico, oferecendo 40 posies (0 at 27H)


para a linha 1 e 40 posies (40H at 67H) para a linha 2. claro que, com exceo do mostrador
2x40, nunca vemos todas as posies da DDRAM. O mostrador pode ser encarado como uma janela
que passeia sobre a DDRAM. Existem instrues que permitem deslocar a DDRAM sob essa
janela. possvel deslocamentos para esquerda ou para a direita, cujos resultados esto
apresentados na figura C.3.

Aps o exame e o entendimento da figura C.3, fica claro que os deslocamentos feitos em mostradores
de uma linha devem ficar estranhos, pois nesse caso a linha no se desloca como um todo, mas sim
suas duas metades se deslocam individualmente.
C.3. Operao do LCD

A operao do controlador do mostrador LCD bem simples. Atravs das instrues,


especificamos as possveis configuraes, tais como cursor, deslocamentos ou zeragem.
Depois, enviamos os dados que so escritos na DDRAM. Cada clula desta memria
DDRAM corresponde a um caracter no mostrador. Para poder mostrar os caracteres, o
controlador faz uso de uma memria ROM onde existam, para cada caracter, quais pontos
devam estar em branco e quais devam estar em preto. Essa ROM recebe o nome de
ROM geradora de caracteres ou CGROM (Character Generator ROM). Por exemplo, no
caso do mostrador 5x8, para apresentar o caracter A (ASCII = 41H), o controlador
consulta as seguintes posies da ROM:

A CGROM tem o tamanho de 4 KB e os seus 12 bits de endereo (A0 at A11) so formados pela
justaposio de 4 bits direita do cdigo ASCII do caracter. Para a letra A, temos os endereos:
0100 0001 xxxx. interessante notar que, para cada caracter, so reservadas 16 posies da
CGROM mas, no entanto, usam-se apenas 8 posies, sendo que as 8 posies restantes devem estar
zeradas. Isso motivado pelo outro formato existente, que o de 5x10, que faz uso de 10 endereos
consecutivos que, para ter-se potncia de 2, os projetistas foram obrigados a reservar 16 posies
consecutivas.

Para oferecer flexibilidade, o padro dos 16 primeiros caracteres (0 at 15) definido pelo usurio.
Para tanto, existe uma RAM onde o usurio pode armazenar o padro a ser exibido para cada um
desses caracteres, mas com um endereamento diferente do adotado para a CGROM. Por exemplo,
para associar o padro ao caracter 5, basta escrever na CGRAM, a partir do endereo 28H (5 x
8 = 40), os seguintes cdigos: 04H, 0EH, 15H, 04H, 04H, 04H, 04H, 04H, como mostrado na figura
C.5. Observe que, nesta definio, acendemos um ponto sobre a linha do cursor e assim veremos este
piscando sobre o ponto mais inferior de nosso caracter. importante notar que, na formao do
endereo, so usados apenas os 3 bits menos significativos do cdigo, o que nos deixa com apenas
oito possibilidades. Em outras palavras, apesar da reserva ser de 16 cdigos, pode-se definir apenas
8 padres, sendo que o que for definido para o cdigo 1 (0001), automaticamente definido para o 9
(1001) e vice versa.
C.4. Controle de Acesso ao LCD

Agora que temos uma noo razovel do funcionamento deste controlador e conhecemos a
DDRAM, a CGROM e a CGRAM, vamos apresentar mais trs elementos: o registrador de
instrues (IR), o registrador de dados (DR) e o contador de endereos (AC). O
registrador de instrues somente pode ser escrito e armazena os cdigos das
instrues enviadas para o controlador ou, em alguns casos, endereos da CGRAM ou
DDRAM. O registrador de dados armazena, temporariamente, o dado a ser escrito ou o
dado lido da CGRAM ou DDRAM. O registrador de endereos no acessado
diretamente, mas sim atravs de instrues escritas no IR, como ser visto mais adiante.
A cada acesso na DDRAM ou CGRAM, o contador de endereos incrementado
automaticamente. Em resumo, para entendermos o funcionamento do controlador,
devemos ter claros os seguintes elementos:

A especificao do tipo de operao a ser realizada com o mostrador feita atravs dos pinos RS e
R/W, de acordo com a tabela a seguir. Os ciclos de leitura e de escrita esto mostrados na figura C.6,
onde apontamos que o nvel do pino E cadencia a operao.

Os ciclos de leitura e de escrita possuem diversas especificaes de tempo e, por isso, recomenda-se
que, para um maior detalhamento, seja consultada a especificao do fabricante. O que apresentamos
aqui uma verso simplificada, sem as restries de tempo. Em ambos os ciclos, devemos observar
que os nveis de RS e R/W devem estar especificados antes do sinal E ser colocado em nvel alto.
No caso da escrita, o dado precisa de estar disponvel antes do flanco de descida () do sinal E, mas
nada impede que o dado seja apresentado mesmo antes do pino E ir para nvel alto. No caso da
leitura, o dado est disponvel um pouco depois do pino E ser colocado em nvel alto e assim
permanece at este pino ser devolvido para nvel baixo.
A seguir, estudaremos as diversas instrues que esses mostradores podem receber. Todo modo de
operao e transao com o mostrador feito via essas instrues e, claro, preciso escrever as
instrues no IR. Por isso, usa-se RS = 0 e R/W = 0. A tabela C.3 apresenta as instrues passveis
de serem enviadas ao mostrador LCD. Ao observarmos esta tabela, entendemos a lgica usada para
codificar as instrues; o bit 1 mais esquerda define a instruo. Assim existe um total de 8
instrues. A tabela tambm apresenta o tempo mximo gasto pelo controlador do LCD para executar
cada instruo. Esse tempo refletido no bit de ocupado (B = busy). importante lembrar que, aps
ligar o mostrador, ele gasta de 10 a 15 ms para executar sua auto-inicializao, ou seja, no se deve
acessar o mostrador durante esse intervalo.

Faremos agora um estudo detalhado de cada uma dessas instrues, mas antes precisamos de definir,
na tabela C.4, os smbolos que empregaremos. Esses smbolos so consagrados pelos fabricantes de
LCD.

De posse dos smbolos listados na tabela C.4, faremos um estudo detalhado de cada instruo, ou
seja, dos acessos feitos com RS = 0 e R/W = 0.

Limpar Mostrador:

Preenche toda DDRAM com o cdigo ASCII do espao em branco (20H). Com isso, o mostrador
fica em branco. Zera o registrador AC, preparando-o para escrita na DDRAM, o que resulta no
cursor aparecendo na primeira linha e primeira coluna do mostrador. Faz ainda I/D = 1, que a
opo para incremento. Finalmente, anula os deslocamentos que possam ter ocorrido. Note que a flag
S no alterada.

Retornar:
Zera o registrador AC, prepara para escrita na DDRAM e retorna o mostrador para sua posio
original, anulando os deslocamentos que possam ter ocorrido. O contedo da DDRAM permanece
inalterado.

Definir Modo de Entrada:

Define o comportamento do mostrador por ocasio da entrada de dados. Se for definido o modo
incremento (I/D = 1), o AC incrementado a cada escrita na DDRAM ou CGRAM. Com isso, o
curso movimenta-se para a direita. No modo decremento (I/D = 0), o curso movimenta-se para a
esquerda a cada escrita. Se o movimento do mostrador for desabilitado (S = 0), o curso quem se
move a cada caracter escrito. Entretanto, se for habilitado o movimento do mostrador (S = 1), a
sensao que se tem que o cursor fica parado e mostrador se movimenta. O incremento ou
decremento no acontece por ocasio das leituras da DDRAM ou CGRAM.

Controles Ativar ou Desativar:

Essa instruo permite ativar ou desativar o mostrador, o cursor e ainda definir o modo piscante para
o cursor. Com mostrador desativado (D = 0), nada exibido. Entretanto, mantido todo o contedo
da DDRAM, que volta a ser exibido imediatamente com a ativao do mostrador (D = 1). Essa
instruo tambm permite habilitar o cursor (C = 1) ou desabilit-lo (C = 0). Mesmo com o cursor
desabilitado, o incremento ou decremento do AC, especificado em I/D, continua ocorrendo. O cursor
pode ser colocado no modo esttico (B = 0) ou no modo piscante (B = 1).

Deslocar Cursor ou Mostrador:

Esta instruo permite deslocar o cursor (S/C = 0) ou o mostrador (S/C = 1) sem que seja feita a
escrita ou a leitura de dados. Permite reposicionar o cursor ou o mostrador. Quando se movimenta o
mostrador, o valor de AC permanece inalterado. Deve-se observar que, nos mostradores de duas
linhas, ambas se movimentam ao mesmo tempo. O deslocamento pode ser feito para a esquerda (R/L
= 0) ou para a direita (R/L = 1).

Definir Condies:
Esta instruo permite definir o tamanho do barramento de dados para 8 bits (DL = 1) ou para 4 bits
(DL = 0). claro que, quando trabalhando em 4 bits, necessita-se do dobro de acessos. O mostrador
pode ser especificado como tendo 1 linha (N = 0) ou 2 linhas (N = 1). Mesmo o mostrador que
fisicamente tenha 2 linhas pode ser definido como de 1 linha e, com isso, a segunda linha desligada.
O tamanho dos caracteres pode ser definido para 5x8 (F = 0) ou para 5x10 (F = 1). conveniente
que esta instruo seja a primeira a ser enviada para o mostrador.

Especificar Endereo para a CGRAM:

Atualiza o valor do contador de endereos (AC) com os bits (A0 A5) e configura para que as
prximas leituras ou escritas ocorram na CGRAM. usado para definir o padro de um dos 8
caracteres configurveis ou ento para ler um padro especificado anteriormente.

Especificar Endereo para a DDRAM:

Atualiza o valor do contador de endereos (AC) com os bits (A0 A6) e configura para que as
prximas leituras ou escritas ocorram na DDRAM. usado para especificar uma nova posio para
a entrada dos caracteres. Com a mudana do valor de AC, o cursor movimenta-se para a respectiva
posio. A leitura seguinte a esta instruo retorna o cdigo do caracter presente nesta posio da
DDRAM.

O valor do contador de endereos e o estado de ocupado podem ser lidos com RS = 0 e R/W = 1.
Essa leitura retorna:

Ler Bit Ocupado e Contedo do AC:

Uma leitura (R/W = 1) com RS = 0 permite que se obtenha o estado do bit de ocupado e o valor
instantneo do contador de endereos (AC). importante consultar o bit de ocupado, pois o
mostrador gasta tempo para executar as instrues recebidas e s aceita uma nova instruo aps a
execuo da anterior. Enquanto estiver ocupado, as leituras retornaro B = 1. importante consultar
este bit antes de enviar uma instruo para o mostrador. O contedo do AC retornado em 7 bits
(A0-A7), independentemente de ele ter sido configurado para enderear a DDRAM ou a CGRAM.

Este modo de acesso usado para se fazer a escrita de um caracter na DDRAM ou de um padro
para caracter na CGRAM. A diferenciao do local da escrita deve ser feita pela instruo anterior,
que deve ter definido um endereo da CGRAM ou um endereo da DDRAM. A cada escrita, o
contedo de AC incrementado ou decrementado, segundo a definio feita com o I/D. A escrita
acontece com ajuda do registrador DR. A ao de escrita transfere o dado para o DR, que em seguida
automaticamente copiado para a DDRAM ou CGRAM.

Com esta configurao, faz-se a leitura de um caracter na DDRAM ou de um padro de caracter na


CGRAM. A diferenciao do local da leitura feita pela instruo anterior que deve ter definido um
endereo da CGRAM ou um endereo da DDRAM. A cada leitura, o contedo de AC incrementado
ou decrementado, segundo a definio feita com o I/D.
C.5. Reset do Mostrador LCD

O mostrador LCD foi projetado para ser automaticamente inicializado por ocasio de sua
energizao (alimentao). Entretanto, esta inicializao s ser efetiva se a alimentao
ficar enquadrada dentro do esquema de tempo mostrado na figura C.7.

Caso as especificaes de energizao no sejam obedecidas, a inicializao no ser correta, mas


ainda assim ser possvel inicializar o mostrador por software. A figura C.8 apresenta o fluxograma
desta inicializao para mostradores configurados com barramento de dados de 8 bits.
C.6. Mostrador LCD Grfico

No h como garantir a existncia de um padro para os mostradores LCD grficos,


entretanto, muito do que se estuda para um modelo pode ser facilmente aplicado ou
adaptado para os demais. Por isso, para facilitar a compreenso, o estudo aqui
apresentado est baseado nos mostradores grficos da Hantronix e da Powertip
Technology. Tomaremos como exemplo o mostrador de 128x64 pontos. Usualmente esses
mostradores grficos trabalham com 20 pinos, como mostrado na tabela C.5.

A comparao com a tabela C.1 mostra que, apesar de ter alguns nomes ligeiramente diferentes, os
pinos de 1 a 14 tm a mesma finalidade. A conexo para ajustar o contraste apresenta algumas
variaes, mostradas na figura C.9. Isso ocorre porque a tenso negativa necessria para ajustar o
contraste em alguns modelos fornecida pelo controlador LCD, enquanto que em outros modelos ela
deve ser fornecida externamente. No caso de P5C, atravs dos jumpers JP11 e JP12, possvel
adaptar para qualquer modelo.

Passemos agora para o estudo da matriz de pontos do mostrador LCD grfico. O modelo que estamos
exemplificando, de 128x64 pontos, na verdade formado por dois mostradores justapostos, cada um
com uma matriz de 64x64 pontos, como mostrado na figura C.10. Note que as entradas CS1 e CS2
servem para indicar que matriz o usurio deseja acessar.

As matrizes de 64x64 pontos so idnticas. Cada uma delas formada por 8 pginas de 64x8 pontos
(64 colunas por 8 linhas), como mostrado na figura C.11. Na verdade, cada pgina formada por 64
bytes, sendo que, desses bytes, cada bit corresponde a um ponto da matriz que pode estar apagado
(bit = 0) ou aceso (bit = 1). Para alterar um ponto do LCD grfico, necessrio verificar a matriz, a
pgina, o byte e o bit dentro deste byte. Por exemplo, o ponto (100,50), da coluna 100 e linha 50, est
na seguinte posio: matriz 2, pgina 6, byte 36 (100 64 = 36), bit 2.
O acesso pode parecer complicado, entretanto, a construo de pequenas rotinas que calculem esses
parmetros facilita bastante o emprego de tais mostradores. O usurio aconselhado a preparar duas
pequenas subrotinas. A primeira deve receber a linha e a coluna para acender o ponto
correspondente. A segunda deve receber esses mesmos parmetros e apagar o ponto. bom lembrar
que, para escrever caracteres alfanumricos, necessrio desenhar uma matriz de pontos para cada
caracter.

Passemos agora ao estudo das instrues para o mostrador LCD grfico. So apenas quatro
instrues, listadas na tabela C.6. de ressaltar-se a pequena quantidade de instrues, quando
comparada com as oito instrues mostrador LCD alfanumrico.

interessante notar que os bits D7 e D6 permitem distinguir essas 4 instrues. Faremos agora um
estudo detalhado de cada uma delas.

Ligar ou desligar o mostrador:

Com L = 0, o mostrador desligado e, com L = 1, ele ligado. Essa operao no altera os dados do
mostrador. Alternando o valor de L, possvel fazer o mostrador piscar.

Linha de incio (topo do mostrador):

Por aqui, o usurio especifica o endereo da linha que deve aparecer no topo do mostrador. O mais
usual especificar este endereo como zero. Alterando os valores desse endereo, de 0 at 63,
possvel girar no sentido vertical o contedo do mostrador. Se forem empregados endereos
crescentes, a sensao de que o mostrador est deslocando para cima.

Definir pgina (especificar endereo X):


Com esta instruo, define-se uma das 8 pginas. Aps esta instruo, toda leitura ou escrita
acontecer na pgina especificada, at o usurio indicar uma outra pgina.

Definir coluna (especificar endereo Y):

Com esta instruo, define-se uma das 64 colunas. A cada leitura ou escrita, este endereo
incrementado. preciso fazer uma leitura de dado (que deve ser ignorado) aps a especificao de
um endereo Y (veja a seo C.6.4).

A leitura do byte de estado permite verificar o bit de ocupado, o bit de ligado/desligado e o bit de
reset, com a seguinte ordenao.

Leitura do Byte de Estado:

O bit B = 1 indica que o controlador do LCD est ocupado, realizando operaes internas. Os
acessos do usurio somente podem ocorrer com B = 0. Por isso, esse bit deve ser consultado antes de
qualquer acesso. O bit L indica se o mostrador est ligado (L = 1) ou desligado (L = 0). Finalmente,
o bit R indica se o mostrador est sendo inicializado (R = 1) ou se j terminou a inicializao (R =
0).

O dado escrito no controlador ocupa a posio anteriormente especificada pelos endereos X e Y. A


figura C.11 indica como os bits so arrumados. Aps uma escrita, o endereo Y incrementado.
Retorna o byte que ocupa a posio anteriormente especificada pelos endereos X e Y. A figura C.11
indica como os bits so arrumados. Aps uma leitura, o endereo Y incrementado. Deve-se fazer
uma leitura de dado (que deve ser ignorado) aps a especificao de um endereo Y.
C.7. Interface com Mostradores LCD

Uma boa soluo para usar o mostrador LCD num sistema com microcontrolador
conect-lo diretamente ao barramento de dados, habilitado atravs de um endereo e
usando os sinais de leitura e de escrita. Entretanto, preciso verificar o diagrama de
tempo do mostrador para ver se os tempos so compatveis. A figura a seguir apresenta
os tpicos diagramas de leitura e de escrita de um mostrador LCD alfanumrico.

A maneira mais simples de se fazer a conexo de um mostrador LCD ao 8051 controlar os sinais
RS e R/W atravs de duas linhas de endereo como, por exemplo, A0 e A1 e usar os sinais #RD e
#WR para gerar o sinal E. A figura C.13 apresenta essa idia onde, por simplicidade, foram omitidos
os decodificadores de endereos e outros dispositivos.

A sugesto boa, mas enfrenta um problema de temporizao. Pelo manual do 8051 (vide figuras
10.4 e 10.5) e tambm pelas figura C.12, possvel observar que, com um cristal de 12 MHz, a
largura dos pulsos #RD e #WR de 400 s. Em outras palavras, no se consegue obedecer
temporizao exigida pelo LCD. A alternativa diminuir a freqncia do cristal de tal forma a gerar
os pulsos com pelo menos 450 s. Para isso, a mxima freqncia do cristal seria aproximadamente
de 10,7 MHz. Para se gerarem as taxas de transmisso serial padres, deve-se optar por um cristal
de 7,3728 MHz. Um outro problema com relao ao tempo mximo que o mostrador consome para
apresentar os dados no barramento, que de 360 s. Este intervalo muito grande para o ciclo de
leitura do 8051.

Para evitar essa limitao para com a freqncia do cristal, foi adotada a soluo apresentada na
figura C.14, que na verdade um acesso indireto com a ajuda de uma porta bidirecional e de um
latch para gerar os sinais de controle. Com esta soluo, geram-se intervalos de tempo bem
superiores aos necessrios, pois as instrues mais rpidas do 8051, com cristal de 12 MHz,
consomem 1 s.
C.8. Soluo adotada para o P5C

No era nossa inteno fixar o cristal oscilador do pentacontrolador, alis, dada a


variedade de verses disponveis, caberia ao usurio a deciso de qual velocidade de
relgio adotar. Para tanto, foi adotado um acesso indireto com o emprego de uma porta de
entrada e sada, alm de uma terceira porta para gerar os sinais de controle (RS, R/W e
E). A figura abaixo apresenta um diagrama de blocos simplificado dos circuitos usados
para essa interface.

O leitor pode notar que usamos dois latches e dois buffers de 3 estados. O latch 1 (latch de
controle) acessado atravs de escrita no endereo #CS1 e tem sua sada sempre habilitada, j que
seu controle #OE est aterrado. Atravs desse latch 1, geramos os sinais de controle E (bit 0), RS
(bit 1), R/W (bit 2). No est indicado na figura, mas o bit 6 desse latch usado para comandar o
conversor A/D (SYNC-AD) e o bit 7 usado para habilitar o relgio permanente (RP). Com o
emprego do buffer, o estado desse latch pode ser consultado com uma leitura no endereo #CS1.
Este recurso foi colocado para facilitar a programao.

O envio de dados para o mostrador conseguido com uma escrita no endereo #CS2, que atualiza o
latch 2 e disponibiliza esses dados no barramento XD. Uma leitura no endereo #CS2, permite que,
atravs de um buffer de 3 estados, leiam-se os dados gerados pelo mostrador. importante deixar
bem claro que, para que se possa ler o mostrador, a sada do latch 2 deve ser colocada em alta-
impedncia, o que automaticamente conseguido quando se programa a leitura (R/W = 1). Ao
escrever os programas para acesso ao LCD, interesse que se adote o procedimento de, ao final de
cada acesso, colocar o sinal de controle E em nvel baixo. O exemplo a seguir ilustra o envio da
instruo Limpar Mostrador. O cdigo em seguida ilustra este procedimento em assembly do 8051.

O prximo exemplo ilustra a leitura do estado do mostrador. O cdigo em seguida ilustra este
procedimento em assembly do 8051.
Apndice D: Teclado do PC

A possibilidade termos um teclado completo, como o de um computador PC, para


comunicar-se com sistemas microcontrolados muito interessante e traz bastante
flexibilidade aos projetos. Como vantagens, citamos o fato do teclado j estar pronto, ser
barato e conhecido, alm de oferecer recursos extremamente sofisticados. Vamos ento,
ao longo deste apndice, apresentar as principais caractersticas do protocolo de
comunicao empregado por esses dispositivos.

O teclado um sistema completo e totalmente independente do computador. O nico


elemento externo sua alimentao, que deve ser fornecida pelo dispositivo que o est
utilizando. Normalmente, o teclado envia dados, mas tambm existe a possibilidade de se
fazer o caminho inverso e enviar dados para o teclado. Esses dados recebidos pelo
teclado sero interpretados como comandos. Por exemplo, o acendimento dos leds
indicadores Num Lock, Caps Lock e Scroll Lock feito via comando externo.

O funcionamento do teclado do PC bastante simples. Iniciamos com os conceitos mais


fundamentais. Ao acionar uma tecla, o teclado envia serialmente o cdigo de varredura
correspondente. Ao soltar a tecla enviado outro cdigo que, dependendo do teclado,
pode at ser de mais de um byte. Se a tecla for mantida apertada, aps o retardo
programado, o teclado entra no modo repetio enviando seqencialmente o mesmo
cdigo de varredura. Tudo se passa como se o usurio acionasse vrias vezes a mesma
tecla.

As teclas Shift e Ctrl so tambm avisadas quando acionadas ou liberadas, mas no


provocam qualquer alterao no cdigo de varredura das demais teclas. Isto significa que
dever do programa que recebe os dados do teclado lembrar que a tecla Shift est
sendo acionada ou no. A distino entre letras maisculas e minsculas, que faz o uso da
tecla Shift, deve ser feita pelo programa que recebe os dados do teclado.
D.1. Cdigos de Varredura

A figura B.1 apresenta o cdigo de varredura (em hexadecimal) para cada tecla da poro
principal do teclado. J na figura B.2 est a poro teclado auxiliar, tambm com seus
cdigos de varredura.

Observao: As imagens apresentadas nas figuras D.1 e D.2 foram obtidas junto
pgina: http://www.beyondlogic.org/keyboard/keybrd.htm, com direitos de Craig Peacock.

Note na figura D.1 que a maioria das teclas possui cdigo de varredura de apenas um
byte. Por exemplo, ao acionar a tecla Q, o teclado envia o cdigo 15H. Ao liber-la,
enviado o cdigo F0H 15H. O byte F0H indica que a tecla est sendo solta. Estes cdigos
variam de teclado para teclado. Em alguns teclados mais antigos, o cdigo ao soltar era
de 1 byte, que valia 80H mais o cdigo da tecla ao pressionar. O cdigo de varredura
independente, quer esteja ou no sendo pressionada a tecla Shift. Por isso dever do
programa que interpreta os cdigos de varredura se lembrar se, no passado, as teclas
Shift ou Ctrl ou Alt foram pressionadas. Note que as teclas Shift, Ctrl e Alt do lado
esquerdo do teclado tm cdigos diferentes das que esto do lado direito.

Ainda tratando da figura D.1, deve ser notado que duas teclas possuem cdigo de varredura de dois
bytes. So as teclas Alt e Ctrl da direita. As teclas com cdigo de dois ou mais bytes so
denominadas de teclas estendidas. Assim, ao ser acionada a tecla Alt do lado direito, o teclado envia
o cdigo E0H, 11H. Entretanto, ao ser liberada a tecla, ao contrrio da ordem que seria esperada, o
cdigo gerado E0H, F0H, 11H. Na figura D.2, esto as demais teclas e o leitor pode constatar que
algumas fazem uso de cdigos de varredura extensos. Por exemplo, a tecla Pause/Brk, ao ser
acionada gera o cdigo E1H, 14H, 77H, E1H, F0H, 14H, F0H, 77H. Algo bem complexo, que dever
ser tratado pelo programa de recepo.
D.2. Conector do Teclado

Existem duas possibilidades de conexo do teclado: o conector denominado DIN 5 (antigo)


e, para o PS/2, o conector mini-DIN. As duas opes esto apresentadas na figura D.3,
sendo que, no P5C, fizemos uso apenas do conector para teclado PS/2. Na ponta do cabo
do teclado, existe um conector macho. Por isso, as placas que fizerem uso do teclado
devem empregar o conector fmea. As linhas de dados (KBD-DATA) e relgio (KBD-CLK)
so bidirecionais, trabalhando com coletor aberto. Note que preciso prever o
fornecimento de alimentao para o teclado, mas no h uma padronizao na quantidade
de corrente consumida. O valor de 300 mA tido como tpico.
D.3. Protocolo de Comunicao

O protocolo de comunicao do teclado bastante simples. O primeiro ponto deste


protocolo sabermos que o teclado tanto pode transmitir como pode receber dados. Os
dados recebidos pelo teclado sero interpretados como comandos. claro que, para o
teclado, a transmisso tem prioridade sobre a recepo. Vimos, na figura D.3, que o
conector do teclado disponibiliza dois fios: KBD-CLK e KBD-DATA. Quando esses dois fios
esto em nvel alto, o canal de comunicao est no modo ocioso ou idle.

Para o teclado enviar um byte, como pode ser visto na figura D.4, transmitido um quadro
de 11 bits. O primeiro bit o de partida (Pt), sempre em nvel baixo. Seguem-se os 8 bits
de dados, depois o bit de paridade mpar (P) e, para terminar, o bit de parada (Pr), que
em nvel alto. Note que os bits de dados menos significativos so transmitidos primeiro. O
flanco de descida () do sinal Clock marca o instante de validade de cada bit. importante
observar que o teclado responsvel por gerar todos esses sinais. A freqncia do relgio
(Clock), tipicamente, est entre 20 a 30 kHz, o que corresponde a um perodo de 30 a 50
s.

Para o teclado receber um byte, como pode ser visto na figura D.5, tambm se emprega um quadro de
11 bits. Tudo comea com o P5C colocando a linha de Clock em nvel baixo por um perodo de
aproximadamente 60 s (intervalo superior janela temporal de um bit). Isto para evitar que o
teclado tente enviar um byte ao mesmo tempo. Em seguida, o P5C deve abaixar a linha Data e em
seguida liberar (colocar em nvel alto) a linha de Clock.

Agora o teclado assume o controle da linha Clock e passa a marcar com flancos de descida () o
instante de leitura de cada bit entregue pelo P5C. No primeiro flanco de descida, o teclado l o bit de
partida (Pt). O P5C, ao perceber cada flanco, coloca na linha Data o prximo bit. Esse procedimento
seguido at o bit de paridade (P). Aps esse bit, o P5C libera a linha Data, colocando-a em nvel
alto. No prximo flanco de descida, o teclado l o bit de parada (Pr). Aps isso, o teclado envia uma
confirmao (Ack) colocando a linha Data em nvel baixo e gerando mais um flanco de descida pela
linha Clock.
D.4. Comandos Enviados para o Teclado

possvel enviar diversos comandos para o teclado. A tabela a seguir resume os


principais comandos.
D.5. Comandos Enviados pelo Teclado

O teclado pode enviar comandos para o P5C. A tabela D.2 lista os principais comandos.
Aps estudarmos essa tabela, vemos que o termo comando no bem empregado.
Melhor seria usar o termo estado, mas o problema que todos os manuais fazem uso da
palavra comando e por isso o mantemos.
Apndice E: Conversor ADC 12048

Apndice removido pelos autores.


Apndice F: Informaes Sobre a Placa P5C

Neste apndice, apresentaremos diversas informaes para facilitar o uso da placa de


circuito impresso do P5C. Elas dizem respeito verso 1.20, cujo esquema estudamos no
captulo 12.
F.1. Detalhes de Conectores e Pinagem
F.2. Jumpers, Pontos de Teste (TP) e Ilhas de Solda (IR)

As prximas tabelas apresentam a funo de cada jumper, os sinais disponibilizados nos


diferentes pontos de teste (TP) e nas ilhas de solda (IR) que podem ser empregadas para
o acesso a diversos itens do Pentacontrolador. Alguns pontos de teste tambm podem ser
usados como pontos de entrada ou sada da placa.
F.3. Referencia Cruzada e Lista de Componentes

A tabela de referncia cruzada til, pois ela indica em que planta est cada componente
do Pentacontrolador. A tabela seguinte a lista de componentes.

Abreviaturas empregadas na tabela acima:

R. = redondo
Q. = quadrado
VM. = vermelho
AM. = amarelo
VD. = verde
AZ. = azul
IV = infravermelho
JP3P = jumper 3 pinos
JP2P = jumper 2 pinos
Observaes:

1) Leds redondos, usar de 5 mm.


2) D1, D2, D3, D22, D23 e D24, manter as cores especificadas; para os demais leds o leitor pode
escolher a cor e forma que mais lhe agradar.
3) JF1 Barra terminais (2X10) 180o.
4) JF3, JF2 Barra terminais (2X20) 180o.
5) U10 foi usada a memria 24LC256 da Microchip.
6) U23 - display de 7 segmentos, anodo comum (AC).
7) U40 pode-se usar o 74HCT74 em lugar de 74HC74.
Apndice G: C com Flash Interna

A evoluo da tecnologia de integrao possibilitou o surgimento de diversos


microcontroladores com memria flash interna, o que veio a facilitar em muito o
desenvolvimento de sistemas microcontrolados. Atravs de uma interface serial simples, o
usurio pode enviar programas para essa memria. Ela interessante por no ser voltil e,
principalmente, por estar encapsulada dentro do C, o que diminui o tamanho do projeto,
dispensando o uso de memria externa. No projeto do P5C, como objetivvamos um
sistema que fizesse uso de memrias e dispositivos externos, com todos os problemas que
da advm, preferimos no usar um C deste tipo. Foi nossa inteno ensinar o projeto de
sistemas de memria e de sistemas de entrada e sada, razo pela qual preferimos um
8031 dos mais simples.

Por outro lado, seria uma falha no comentar algumas dessas solues com memria flash
interna. So muitos os C que dispem de tal memria. Cada fabricante adota sua soluo
para programao. No projeto do P5C, procuramos atender a algumas delas, entretanto
existem solues que vo exigir do usurio uma pequena adaptao. Abordaremos a
seguir alguns microcontroladores e, alm de sua memria flash, listaremos suas
caractersticas mais interessantes. Para maiores detalhes, os leitores devem consultar os
manuais do fabricantes.
G.1. DS89C420 (Dallas - Maxim)

Esse microcontrolador um dos mais rpidos do mercado. O fabricante (www.maxim-


ic.com) afirma que, quando o programa estiver sendo executado a partir de sua memria
flash interna, cada instruo consome apenas um perodo de relgio. Na verdade, apenas
a maioria de suas instrues trabalha assim. A grosso modo, com um mesmo relgio, este
processador 12 vezes mais rpido que um 8051 padro, onde cada ciclo de mquina
gasta 12 perodos de relgio. Quando trabalha com relgio de 33 MHz, ele capaz de
oferecer 33 MIPS (mega-instrues por segundo), um desempenho aprecivel, quando
comparado com o 1 MIPS oferecido pelo 8051. A seguir existe uma lista de suas principais
caractersticas.
pino a pino compatvel com o 8051 ou o 8052;
duas portas seriais;
trs contadores/temporizadores;
RAM interna de 384 bytes: 256 bytes + 128 bytes (128 Upper);
16 KB de memria flash interna, com programao serial;
tamanho da memria ajustvel dinamicamente;
1 KB de memria SRAM, para acesso com instrues MOVX;
1 perodo de relgio para cada ciclo de mquina;
aceitao de relgio at 33 MHz;
dois DPTR, com opes para incremento e decremento automtico;
quatro modos de paginao;
economia de energia;
13 interrupes, sendo 6 externas;
5 nveis de prioridade para interrupes;
temporizador tipo watchdog.

grande a quantidade de opes e recursos que este C oferece. Por isso, fortemente
recomendado que seu manual seja consultado antes de seu emprego. O mapa
apresentado na figura G.1 apresenta os endereos ocupados por cada uma das
memrias. A RAM interna, como em todo 8051, est dividida em 128 bytes para o usurio
e 128 para os registradores de funes especiais (SFR). Superposta com o topo desta
memria, existe uma outra rea de 128 bytes (128 Upper), acessada exclusivamente por
endereamento indireto e por operaes da pilha. O mais comum dedicar esta rea para
a construo da pilha.

Existem dois blocos de memria flash de 8 KB internos ao microcontrolador, perfazendo


um total de 16 KB. Quando o programa estiver rodando a partir destas memrias, as
instrues so executadas de forma rpida, consumindo apenas um perodo de relgio.
Quando o programa for executado a partir da memria de programa externa, passa-se a
empregar a temporizao do 8051 padro. possvel configurar algumas instrues para
uma execuo mais acelerada. Ainda dentro do CI, existe uma rea de 1 KB de memria
SRAM, que se destina a acessos com a instruo MOVX e DPTR. Para facilitar seu
emprego, existem dois DPTR com opes de auto-incremento ou auto-decremento. Note
que esta uma memria SRAM e, por isso, seu contedo perdido quando o C for
desenergizado.

O primeiro bloco de 16 KB da memria de programa externa sombreado pela memria


flash interna. Entretanto, o usurio pode selecionar trechos para serem executados a partir
d a flash interna e trechos a partir da ROM externa. Com o emprego do pino #EA,
possvel habilitar ou desabilitar toda a memria flash interna. J a memria de dados
externa tem seu primeiro 1 KB sombreado pela SRAM interna, sendo que o usurio pode
escolher se quer us-la ou no.

Tanto a memria flash quanto a SRAM internas podem ser programadas externamente
atravs do um programa carregador (ROM loader) que est armazenado numa ROM
interna deste C. Esta ROM no est acessvel ao usurio, entretanto, seu programa pode
ser executado a qualquer momento com a condio: RST = 1, #EA = #PSEN = 0. A
execuo deste programa carregador terminada com a remoo da condio acima
apresentado ou com a desenergizao. Para que atendesse a esse requisito, o P5C traz
os recursos apresentados na figura G.2.

O circuito muito simples, comeamos por indicar a chave SW3, que permite ativar o reset (RST)
de forma contnua. O jumper JP17, quando fechado, permite que o sinal #RST habilite U37A e
U37B, que fazem #EA = #PSEN = 0. Assim, para invocar o programa carregador, basta acionar
SW3. Aps isso, via porta serial de nosso computador pessoal, programamos as memrias internas
deste C. claro que JP19 deve estar aberto para habilitar as memrias internas do
microcontrolador. interessante desabilitarmos a lgica de BOOT, o que conseguido ao se fechar
a posio 2-3 do jumper JP18.
O programa carregador controlado atravs de uma srie de comandos enviados via porta serial. Um
programa que configura esse carregador pode ser conseguido no site do fabricante. Detalhes
completos do carregador esto disponveis no manual Ultra-High Speed Flash Microcontroller
Users Guide.
G.2. AT89S8252 e AT89S8253 (ATMEL)

O microcontrolador AT89S8252, da Atmel, teve uma grande aceitao. enorme a


quantidade de projetos que o empregam. Entretanto, ele est ficando obsoleto e a prpria
Atmel recomenda que os novos projetos o substituam pelo AT89S8253. Os recursos
destes dois microcontroladores so semelhantes. A lista a seguir apresenta as principais
caractersticas do AT89S8252:

pino a pino compatvel com o 8051;


porta SPI;
RAM interna de 384 bytes: 256 bytes + 128 bytes (128 Upper);
8 KB de memria flash interna, com programao via SPI;
2 KB de memria EEPROM, com programao via SPI (acesso com MOVX);
trs contadores/temporizadores;
relgio pode operar desde CC at 24 MHz;
opo para ciclo de mquina com 6 perodos de relgio (opo X2);
dois registradores DPTR;
economia de energia;
9 interrupes;
temporizador tipo watchdog.

O AT89S8253, alm das caractersticas acima e de melhorias nas portas serial e SPI,
oferece:

12 KB de memria flash interna, com programao via SPI;


2 KB de memria EEPROM, com programao via SPI (acesso com MOVX);
faixa de operao de 2,7 a 5,5 V.
controlador de interrupo com quatro nveis;
opo para dobrar a freqncia do relgio.

Os mapas de memria destes C so semelhantes ao apresentado na figura G.1,


mudando apenas o tamanho de cada rea de memria. Vale lembrar que a memria de
dados interna, no caso destes microcontroladores, uma EEPROM e, por isso, o C no
perde os dados, mesmo quando desenergizado. A opo X2 encurta o ciclo de mquina
para apenas 6 perodos de relgio, o que significa que se pode ter o desempenho de 24
MHz, mas com um cristal de 12 MHz, o que reduz a irradiao eletromagntica.

Para a programao destas memrias, empregada a porta SPI. Sempre que o reset for
ativado, a porta SPI aceita a programao das memrias internas sob o controle de um
conjunto particular de instrues. Maiores detalhes e programas devem ser buscados nos
manuais e pgina do fabricante (www.atmel.com). Durante a programao do AT89S8252,
sua porta SPI aceita as instrues listadas a seguir:

habilitar programao;
apagar memrias (de 8 K e 2 K simultaneamente);
ler/escrever a/na memria de cdigos;
ler/escrever a/na memria de dados;
programar bits de segurana (lock bits).

O projeto P5C permite a programao destes microcontroladores. Para tanto, basta


fechar a chave SW3 que o reset permanece ativo. Assim, habilita-se a interface de
programao que trabalha com o barramento SPI, disponvel no conector J6.
G.3. AT89C51 (ATMEL)

Esta famlia da Atmel oferece desempenho elevado e seu objetivo so os sistemas mais
sofisticados. Existem opes para diversos tamanhos de memria flash para programa,
indo desde 16 KB at 64 KB. A lista a seguir apresenta as principais caractersticas desta
famlia:

pino a pino compatvel com o 8051;


porta SPI;
RAM interna de 384 bytes: 256 bytes + 128 bytes (128 Upper);
de 16 KB a 64 KB de memria flash interna, com programao via SPI;
1 KB a 2 KB de memria EEPROM, com programao via SPI (acesso com MOVX);
trs contadores/temporizadores;
arranjo contador programvel, capaz de gerar PWM
relgio de 40 ou 60 MHz;
opo para ciclo de mquina com 6 perodos de relgio (opo X2, 20 a 60 MHz);
instrues MOVX com diferentes duraes;
dois registradores DPTR;
interface para teclado matricial;
gerador de baud rate para a porta serial;
economia de energia;
9 interrupes, com 4 nveis de prioridade;
alimentao de 2,7 a 3,6 V ou de 2,7 a 5,5 V.
temporizador tipo watchdog.

Esse microcontrolador, apesar de pertencer ao mesmo fabricante, tem a porta SPI


implementada de maneira diferente. A tabela G.1 mostra os pinos da porta P1 e a funo
de cada um deles quando empregados para construir barramento SPI.

O barramento SPI do P5C foi construdo para o AT89S8252, mas foi pensada uma
soluo simples caso o usurio precise de empregar uma AT89C51. Como todo o
barramento SPI do P5C derivado dos pontos de teste TP28, TP29 e TP30, a idia foi
permitir inverter essas trs ligaes. A figura G.3 ilustra as ligaes a serem interrompidas
na placa de circuito impresso e as trs novas ligaes que devem ser feitas com fios
isolados.

O projeto P5C permite que gravemos as memrias do microcontrolador AT89C51 sem que
seja necessrio remov-lo do circuito. o que se denomina ISP (In System Programming).
A programao feita atravs da porta serial, sob controle de um programa bootloader
em ROM, que ativado quando o flanco descendente () do sinal de reset encontra
#PSEN = 0 e #EA = 1. Note que, durante a programao, o pino #PSEN deve ser liberado.
Para permitir que isso acontea, o P5C dispe do circuito mostrado na figura G.4.

Seguindo a figura G.4, vemos o boto SW2 que, quando acionado atravs de U37C, faz
#PSEN = 0. Foi necessrio fazer desta forma porque o manual recomenda que no se
prenda #PSEN em nvel baixo. necessrio abrir os jumpers JP17 (no mostrado na
figura), JP19 e fechar o jumper JP18 na posio 2-3. Tendo feito isto, a ativao do
bootloader feita segundo a seguinte seqncia de aes: acionar simultaneamente SW5
e SW2, soltar SW5 e depois soltar SW2. O bootloader deste microcontrolador muito
interessante, pois trabalha com a porta serial, tem deteco automtica de baud-rate e
aceita arquivos no formato Intel.hex. Maiores detalhes devero ser consultados no manual
do fabricante.
Table of Contents
Capa 2
Do Livro e Dos Autores 2
Prefcio 6
Prefcio da Verso Eletrnica 14
1. Microcontroladores 15
1.1. O Que Um Microcontrolador? 16
1.2. O Mercado de Microcontroladores. 19
1.3. Histrico dos Microcontroladores 8051 21
1.4. A Famlia 8051 ou MCS-51 22
1.5. Exerccios. 24
2. Microcontroladores 25
2.1. Arquitetura von Neumann Versus Arquitetura de Harvard. 26
2.2. Espao de Endereamento do 8051. 30
2.3. RAM Interna. 33
2.4. Palavra de Estado do Programa. 40
2.5. Exerccios. 42
3. Conjunto de Instrues 44
3.1. Sobre o Conjunto de Instrues. 45
3.2. Convenes. 48
3.3. Instrues Aritimticas. 50
3.4. Instrues Lgicas. 55
3.5. Instrues de Transferncia (Cpia). 58
3.6. Instrues Booleanas. 63
3.7. Instrues de Desvio. 66
3.8. Instrues e Flags. 70
3.9. Tabelas com Cdigos de Operao. 71
3.10. Instrues por Ordem Alfabtica. 73
3.11. Exerccios. 77
4. Programao Assembly 79
4.1. Exerccios Resolvidos. 81
4.2. Montagem das Intrues. 108
4.3. Tempo de Execuo. 116
4.4. Usa da Pilha. 120
4.5. Modos de Endereamento. 128
4.6. Exerccios. 131
5. Programa Montador 138
5.1. Escrevendo Programas para ASM51. 140
5.2. Convenes para o ASM51. 143
5.3. Uso do Montador ASM51. 148
5.4. O Processador de Macros. 149
5.5. Formato INTEL.HEX. 151
5.6. Exerccos. 153
6. Portas Paralelas 154
6.1. As Portas Paralelas da Famlia 8051. 155
6.2. A Porta P1. 157
6.3. A Porta P3. 160
6.4. A Porta P2. 162
6.5. A Porta P0. 164
6.6. Escrita nas Portas. 166
6.7. Leitura nas Portas. 168
6.8. Detalhes Sobre o Emprego de Portas. 170
6.9. Exerccios. 173
7. Contadores e Temporizadores 191
7.1. Conceitos Sobre Os Contadores e Temporizadores. 192
7.2. Registradores Envolvidos. 194
7.3. Modo 0. 197
7.4. Modo 1. 198
7.5. Modo 2. 199
7.6. Modo 3. 200
7.7. Exerccios Resolvidos. 201
7.8. Exerccios. 206
8. Interrupes 208
8.1. Conceitos Bsicos de Uma Interrupo. 210
8.2. Interrupes Bsicas da Famlia 8051. 213
8.3. Registradores Envolvidos nas Interrupes. 215
8.4. Latncia das Interrupes. 221
8.5. Modo Passo a Passo. 223
8.6. Exerccios Resolvidos. 224
8.7. Exerccios. 238
9. Porta Serial 241
9.1. Alguns tpicos Sobre Comunicao Serial. 243
9.2.
9.3. A
OsPorta Serial da SCON
Registradores Famliae 8051.
PCON. 246
248
9.4. Modo 0. 251
9.5. Modo 1. 252
9.6. Modo 2. 254
9.7. Modo 3. 255
9.8. Cuidados com a Taxa de Comunicao (Baud Rate). 256
9.9. Comunicao Entre 8051. 259
9.10. A Porta Serial do PC. 260
9.11. Exerccios Resolvidos. 266
9.12. Exerccios. 276
10. Pinagem e Temporizao 282
10.1. Descrio dos Pinos 8051. 285
10.2. Ciclos de Barramento. 288
10.3. Instrues e Ciclos de Barramentos. 294
10.4. Portas e Ciclos de Barramentos. 300
10.5. Reset. 301
10.6. Exerccios. 308
11. Projetos com o 8051 309
11.1. Barramentos para o 8051. 311
11.2. Conexo com Memrias. 318
11.3. Decodificao. 323
11.4. Dispositivos de Entrada/Sada (E/S). 330
11.5. Exerccios. 342
12. O Pentacontrolador - P5C 347
12.1. Introduo ao Pentacontrolador - P5C. 349
12.2. Plantas do Pentacontrolador. 354
12.3. Planta 01: CPU. 363
12.4. Planta 02: Memrias. 367
12.5. Planta 03: Decodificador. 372
12.6. Planta 04: LEDs. 374
12.7. Planta 05: LCD. 377
12.8. Planta 13: Interrupes. 380
12.9. Planta 6: Teclado. 384
12.10. Planta 07: Conversor A/D. 387
12.11. Planta 08: Conversor D/A. 390
12.12. Planta 09: Infravermelho. 392
12.13. Planta 10: Interface IrDA. 395
12.14.
12.15. Planta
Planta 11:
12: Relgio
USB. Permanente (RP). 397
400
12.16. Planta 14: Fonte + Serial. 403
12.17. Planta 15: Desacoplamento. 406
12.18. O Programa de Boot. 407
12.19. O Programa P5C.exe. 409
12.20. Exerccios. 410
13. Programao em C para 8051 414
13.1. Instalao do SDCC. 416
13.2. O Bsico da Programao em C 419
13.3. Variveis e Constantes 421
13.4. Operadores 423
13.5. Controle do Fluxo do Programa 425
13.6. Conceito sobre Funes 431
13.7. Ponteiros e Vetores 433
13.8. Estruturas 436
13.9. Particularidades do SDCC para 8051 438
13.10. Exerccios Resolvidos 453
13.11. Exerccios 457
Apndice A: Representao Numrica 459
A.1. Representao Binria e Hexadecimal 460
A.2. Soma Aritmtica com Nmeros Binrios 463
A.3. Nmeros Negativos e Subtrao 464
Apndice B: Tabela ASCII 467
Apndice C: Mostrador LCD 468
C.1. Pinagem dos Mostradores LCD 469
C.2. Formato do LCD 471
C.3. Operao do LCD 473
C.4. Controle de Acesso ao LCD 475
C.5. Reset do Mostrador LCD 480
C.6. Mostrador LCD Grfico 481
C.7. Interface com Mostradores LCD 485
C.8. Soluo adotada para o P5C 486
Apndice D: Teclado do PC 488
D.1. Cdigos de Varredura 489
D.2. Conector do Teclado 490
D.3. Protocolo de Comunicao 491
D.4. Comandos Enviados para o Teclado 493
D.5. Comandos Enviados pelo Teclado 494
Apndice E: Conversor ADC 12048 495
Apndice F: Informaes Sobre a Placa P5C 496
F.1. Detalhes de Conectores e Pinagem 497
F.2. Jumpers, Pontos de Teste (TP) e Ilhas de Solda (IR) 499
F.3. Referencia Cruzada e Lista de Componentes 500
Apndice G: C com Flash Interna 502
G.1. DS89C420 (Dallas - Maxim) 503
G.2. AT89S8252 e AT89S8253 (ATMEL) 506
G.3. AT89C51 (ATMEL) 508