Você está na página 1de 67

Microcontroladores

1
Microcontroladores

2
Microcontroladores

(AULA 01)
1 - INTRODUÇÃO

História da programação e dos microcontroladores


Atualmente, cada um de nós tem acesso em média a nove microcontroladores
por dia.
As aplicações destes dispositivos são as mais remotas, sendo utilizadas por
exemplo em máquinas de lavar, televisores, DVD, rádios, controle remoto,
entretenimento, segurança, controle de acesso e etc.
Neste tópico, mostrarei as principais diferenças entre os microcontroladores e os
microprocessadores.
Cada um destes tem a sua área de atuação, sendo o microprocessador mais
utilizado em aplicações que exigem um maior poder de processamento, diferentemente
do microcontrolador, onde o funcionamento se dá em função de alterações externas.
Em 1969, uma empresa japonesa chamada BUSICOM iniciou um projeto para
uma calculadora eletrônica.
A história do microprocessador data a partir deste projeto. Esta empresa, enviou
para os Estados Unidos uma equipe de engenheiros responsáveis pelo projeto à procura
de Marcian Hoff, da Intel Corporation. Marcian Hoff que já tinha experiência com
computadores e vislumbrou de forma diferente aquele projeto.
Ele pensou de que ao invés de desenvolver um chip que somente seria uma
calculadora, desenvolver algo que funcionasse de acordo com um programa.

A calculadora Busicom de
1970, empregando o
microprocessador Intel 4004.

Após a compra da licença da empresa japonesa, em 1971, a Intel lança o seu


primeiro processador de 4 bits, denominado 4004. Esse foi o primeiro processador de 4
bits e conseguia processar 6000 operações por segundo (6kHz).
Já no próximo ano, mais precisamente em Abril de 1972, a Intel anuncia o seu
primeiro processador de 8 bits, o 8008. Este processador, além de ter um barramento de
dados maior, conseguia processar até 300000 operações por segundo. Nesta mesma
época, já começam a aparecer os primeiros concorrentes da Intel, sendo a primeira a
Motorola Corporation. Ela lança o 6800. Um engenheiro da Motorola sai da empresa e
entra para a MOS Technology que em 1975, lança o 6501 e o 6502 por um preço muito
mais abaixo do que os processadores da Intel e Motorola. A Motorola, lança um
processo contra a MOS Technology e contra o engenheiro que saiu da Motorola para a
concorrente.

3
Microcontroladores

A MOS fica impossibilitada de comercializar o 6501, porém o 6502 continua a


sua venda normalmente. Devido ao baixo custo do 6502, este toma-se rapidamente
utilizado pelo mercado nos computadores Apple, Comodore e até no Atari! A MOS
chegou a vender até 15 milhões de processadores por ano, porém foi comprada por um
grupo de empresas como a Rockwell, Ricoh e Comodore. Outro engenheiro, porém da
Intel, sai da corporação e funda sua própria empresa, a Zilog.
Em 1976, a Zilog lança o Z80, que era compatível com 8080 da Intel e
apresentava inúmeras vantagens frente a este.
Uma das grandes vantagens do Z80, é que este além de ser totalmente
compatível com o 8080, conseguia rodar os programas já desenvolvidos para este
processador com muito mais vantagens.
Neste mesmo ano, a Intel lança uma versão melhorada do 8080, chamada 8085,
porém o Z80 ainda era tão superior a este e tomou-se praticamente padrão de mercado
em processadores.
O que toma o microprocessador interessante é justamente sua capacidade de ser
programável. Por exemplo, o 4004 da Intel chamou a atenção dos cientistas da NASA,
que o utilizaram na espaçonave Jupiter 10. A Intel, no entanto, viu que havia demanda
por um microprocessador mais potente. Como resultado, em 1972 a Intel lançou seu
novo microprocessador de 8 bits, projetado por Faggin, que para mostrar sua evolução
em relação ao 4004 foi batizado de 8008. O 8008 tinha alguns problemas de
interfaceamento com as memórias e em 1974 a Intel lançou o 8080, ligeiramente melhor
que o 8008.
Les Solomon, editor da revista norte-americana Popular Electronics, considerou
que havia suficiente interesse do público pelo 8080 para lançar alguns artigos
descrevendo o produto.
Salomon achou então que poderia colocar-se a frente de revistas concorrentes
publicando a descrição de um kit de microcomputador que pudesse ser montado pelos
seus leitores. Buscou o auxílio do seu amigo Edward (Ed) Roberts, que havia sido seu
colega na Força Aérea e possuía uma empresa chamada MITS (Micro Instrumentation
Telemetry Systems), que fabricava calculadoras eletrônicas.
Junto com Salomon, Roberts construiu então um microcomputador usando o
microprocessador Intel 8080 chamado "ALTAIR".
Após a publicação do artigo na revista "Popular Electronics" a MITS foi
inundada com uma avalanche de pedidos.
O Altair era um microcomputador bastante primitivo pelos padrões atuais. Não
tinha monitor ou teclado e a programação era efetuada simplesmente ligando e
desligando os interruptores do painel. Os resultados também eram mostrados somente
com um conjunto de LEDs
no painel.
Diversos entusiastas fizeram adaptações de teclados e de leitoras de fitas de
papel perfurado nos Altair, para facilitar sua programação.
Entre eles, dois estudantes da Califórnia chamados Paul Allen e Bill Gates
conseguiram adaptar a linguagem de programação BASIC para uso nos Altair. Roberts
ficou bastante impressionado com o trabalho dos dois e contratou Paul Allen como
Diretor de Software da pequena MITS em 1975 e Bill Gates, então com 19 anos, como
programador, em tempo parcial.
Ao final de 1976 a MITS estava em sérias dificuldades. Além dos pedidos dos
Altair continuarem se acumulando, o microcomputador começava a ser procurado por
um público que não estava acostumado a montagens eletrônicas.
Assim, quando os Altair apresentavam seus problemas crônicos de

Sistemas Microcontrolados 2 l 129Prof. Fabiano Saldanha


4
Microcontroladores

funcionamento a MITS recebia milhares de reclamações. Allen e Gates acabaram saindo


da MITS no final de 1976 para fundarem sua própria empresa, a Microsoft.
Também outras empresas, tendo em vista o sucesso do Altair, lançaram
microcomputadores mais "amigáveis", como os fabricados pela Commodore e Tandy.
Apesar de serem mais caros que o Altair, esses microcomputadores vinham com teclado
e dispositivos de memória, podendo ser conectados a um televisor doméstico para servir
de monitor. Roberts acabou vendendo a MITS no final de 1977 e, decepcionado com a
eletrônica, resolveu estudar medicina e tomou-se anos mais tarde um médico pediatra.
Cerca de 50 mil Altair foram vendidos em pouco mais de 2 anos.
Em 1978 surge o 8086, com barramento de 16 bits o que permitia desde logo
endereçar (controlar) uma maior quantidade de memória (1MB), e com registos de 16
bits, o que permitia fazer cálculos complexos, como por exemplo operações com reais
de vírgula flutuante, muito mais facilmente.
Este seria o processador base de toda uma linha que se manteria extremamente
compatível com os seus predecessores, o que aliado aos seus bons desempenhos e
inovação, se tomou a mais popular e usada de todas as famílias de uP para micro­
computadores, a família Intel x86.
Mas apesar do sucesso da linha x86, todo o sucesso começou com um não x86, o
8088 que era simplesmente uma versão menor do 8086. Surgiu em 1979, e a diferença
principal e fundamental para o seu predecessor era o barramento a 8 bits. Deve o seu
sucesso ao facto de a IBM o ter escolhido como base do seu futuro computador pessoal.
Só que a Intel, não continuou a linha 8080, mas apostou sim nas características e
princípios do 8086, aliás como seria de esperar.
Assim, em 1982 surgiu o 80286. As suas principais características era o modo
protegido, que permitia ultrapassar o problema de endereçamento de memória, e as
velocidades de 8 e 12 MHz. Mas esta característica só al guns anos mais tarde viria a ser
usada em larga escala, pelo que a sua compatibilidade com o 8086/88 e as suas
velocidades de processamento foram as principais factores que fizeram dele um best
seller.
O 80386 surge em 1985, inicialmente a velocidade de 16MHz, e mais tarde de
20, 25, 33, 40, ... , e executava 5-6 MIPS e era 15 vez mais potente que 8086.
Funcionava a 32 bits quer no endereçamento de memória quer no barramento e nos
registos de dados.
Em 1989 surge o 80486, a velocidades iniciais de 20, 33, 50 Mhz, e executava
20 MIPS, o que triplicava a capacidade do seu predecessor. Pelo facto de executar
simultaneamente mais do que uma instrução (pipeline), permitia-lhe às mesmas
velocidades de relógio suplantar as prestações do 80386. A especificação do 486
pressupunha também a existência de um co-processador matemático (FPU) integrado, o
que em versões menores veio a ser desligado. Continha também 8KB de memória cache
quer para dados quer para instruções.
Em 1993 surgiu o Pentium (x586). Tem capacidade de endereçamento de 32 bits
e barramento de 64 bits, tem dupla cache interna, unidades de cálculo para inteiros e
reais (vírgula flutuante), tecnologia super-escalar (possibilidade de executar mais do que
uma instrução por ciclo de relógio), teste de paridade interno (detecção de erros), etc..
Foram sendo incorporados novos conjuntos de instruções, como a tecnologia
MMX, desenvolveram-se especializações para servidores, o Pentium Pro com vários
níveis de cache interna. O Pentium II, é um Pentium Pro ao qual foi adicionada a
tecnologia MMX e duplicada a cache interna.
Esta é sem dúvida a mais popular das famílias de m P, mas estão desde sempre
muito ligadas a computadores pessoais e com baixo poder de cálculo, embora nos dois

Sistemas Microcontrolados 3 l 129Prof. Fabiano Saldanha


5
Microcontroladores

últimos modelos, com a incorporação de co-processador, de cache interna, de unidades


de aceleração de cálculo de reais com vírgula flutuante, etc., esta família (Pentium)
comece a competir pelo mercado de estações de trabalho e servidores de médio porte.
Paralelamente aos processadores a INTEL desenvolveu também os
microcontroladores.
Esse conceito de microcontrolador se espalhou rapidamente e hoje em dia existe
uma grande diversidade de produtos para solucionar os mais diferentes problemas de
controle. O primeiro microcontrolador foi lançado pela Intel em 1978 e recebeu a sigla
8048; que depois evoluiu, dando origem à família 8051, em 1983. A Intel ainda oferece
a família 8096, que trabalha em 16 bits, possibilitando maior capacidade de
processamento. Hoje em dia, uma grande quantidade de fábricas de semicondutores
oferece microcontroladores. Dentre elas, citamos a Zilog com sua família Z8, a National
com o COP8, a Motorola com o 6811 e a Microchip com seus PICs.
Todas elas são baseadas no núcleo do 8051 que estudaremos mais a frente.

1
'1

.
�--

1
Paul Allen e Bill Gates Microcontrolador 8051

A origem da idéia de programar uma máquina vem da necessidade de que as


máquinas de tecer produzissem padrões de cores diferentes.
Assim, no século XVIII foi criada uma forma de representar os padrões em
cartões de papel perfurado, que eram tratados manualmente. Em 1801, Joseph Marie
Jacquard (1752-1834) inventa um tear mecânico, com uma leitora automática de
cartões.
A idéia de Jacquard atravessou o Canal da Mancha, onde inspirou Charles
Babbage (1792-1871), um professor de matemática de Cambridge, a desenvolver uma
máquina de "tecer números", uma máquina de calcular onde a forma de calcular
pudesse ser controlada por cartões.
Tudo começou com a tentativa de desenvolver uma máquina capaz de calcular
polinômios por meio de diferenças, o calculador diferencial. Enquanto projetava seu
calculador diferencial, a idéia de Jacquard fez com que Babbage imaginasse uma nova e
mais complexa máquina, o calculador analítico, extremamente semelhante ao
computador atual.
Sua parte principal seria um conjunto de rodas dentadas, o moinho, formando
uma máquina de somar com precisão de cinquenta dígitos.

Sistemas Microcontrolados 4 l 129Prof. Fabiano Saldanha


6
Microcontroladores

As instruções seriam lidas de cartões perfurados. Os cartões seriam lidos em um


dispositivo de entrada e armazenados, para futuras referências, em um banco de mil
registradores.
Cada um dos registradores seria capaz de armazenar um número de cinquenta
dígitos, que poderiam ser colocados lá por meio de cartões a partir do resultado de um
dos cálculos do moinho.
Além de tudo disso, Babbage imaginou a primeira máquina de impressão, que
imprimiria os resultados dos cálculos, contidos nos registradores. Babbage conseguiu,
durante algum tempo, fundos para sua pesquisa, porém não conseguiu completar sua
máquina no tempo prometido e não recebeu mais dinheiro.
Hoje, partes de sua máquina podem ser vistas no Museu Britânico, que também
construiu uma versão completa, utilizando as técnicas disponíveis na época.
Junto com Babbage, trabalhou a jovem Ada Augusta, filha do poeta Lord Byron,
conhecida como Lady Lovelace e Ada Lovelace.
Ada foi a primeira programadora da história, projetando e explicando, a pedido
de Babbage, programas para a máquina inexistente. Ada inventou os conceitos de sub­
rotina, uma seqüência de instruções que pode ser usada várias vezes, loop, uma
seqüência de cartões, e do salto condicional, que permite saltar algum cartão caso uma
condição seja satisfeita. Ada Lovelace e Charles Babbage estavam avançados demais
para o seu tempo, tanto que até a década de 1940, nada se inventou parecido com seu
computador analítico.
Até essa época foram construídas muitas máquinas mecânicas de somar
destinadas a controlar negócios (principalmente caixas registradoras) e algumas
máquinas inspiradas na calculadora diferencial de Babbage, para realizar cálculos de
engenharia (que não alcançaram grande sucesso).

Ada Augusta Byron King


Em nosso curso iremos estudar a linguagem C.
C é uma linguagem de programação compilada de propósito geral, estruturada,
imperativa, procedural, de alto nível, padronizada pela ISO, criada em 1972, por Dennis
Ritchie, no AT&T Bell Labs, para desenvolver o sistema operacional Unix (que foi
originalmente escrito em Assembly).
C é uma das linguagens de programação mais populares e existem poucas
arquiteturas para as quais não existem compiladores para C. C tem influenciado muitas
outras linguagens de programação, mais notavelmente C++, que originalmente começou
como uma extensão para C.
O desenvolvimento inicial de C ocorreu no AT&T Bell Labs entre 1969 e 1973.
Não se sabe se o nome "C" foi dado à linguagem porque muitas de suas características
derivaram da linguagem B e C é a letra conseguinte no alfabeto, ou porque "C" é a

Sistemas Microcontrolados 5 l 129Prof. Fabiano Saldanha


7
Microcontroladores

segunda letra do nome da linguagem BCPL, da qual derivou-se a linguagem B.


C foi originalmente desenvolvido para a implementação do sistema Unix
(originalmente escrito em PDP-7 Assembly, por Dennis Ritchie e Ken Thompson). Em
1973, com a adição do tipo struct, C tomou-se poderoso o bastante para a maioria das
partes do núcleo do Unix, serem reescritas em C. Este foi um dos primeiros sistemas
que foram implementados em uma linguagem que não o Assembly, sendo exemplos
anteriores os sistemas: Multics (escrito em PL/1) e TRIPOS (escrito em BCPL).
Segundo Ritchie, o período mais criativo ocorreu em 1972.

Ken Thompson e Dennis Ritchie

Diferenças entre Microprocessadores e Microcontroladores

Um microcontrolador difere de um microprocessador em vários aspectos.


Primeiro e o mais importante, é a sua funcionalidade. Para que um
microprocessador possa ser usado, outros componentes devem ser adicionados, tais
como memória, chipsets e componentes para receber e enviar dados. Em resumo, isso
significa que o microprocessador é o verdadeiro coração do computador.
Não há como imaginar um PC sem um microprocessador. Por outro lado, o
microcontrolador foi projetado para ter todas estas funcionalidades em uma única
pastilha. Comumente, um microcontrolador é chamado de um computador em um único
chip principalmente por causa deste motivo.
Nenhum dos outros componentes externos são necessários nas aplicações, uma
vez que todos os periféricos necessários já estão contidos nele. Assim, poupamos tempo
e espaço na construção de novos projetos.

Revisando a Eletrônica Digital

Iremos fazer uma revisão sobre eletrônica digital, uma vez que, no mundo dos
microcontroladores e qualquer sistema computadorizado, esta matéria é de suma
importância para a compreensão das técnicas de programação e arquitetura de
funcionamento destes dispositivos inteligentes.
OBS: é importante que o aluno já tenha conhecimentos prévios sobre o assunto,
uma vez que estaremos fazendo somente uma recapitulação sobre eletrônica digital.

Sistemas Microcontrolados 6 l 129Prof. Fabiano Saldanha


8
Microcontroladores

Introdução ao sistema Binário

O sistema binário utiliza dois dígitos (base 2) para representar qualquer quantidade. De
acordo com a definição de um sistema de numeração qualquer, o número binário 11O1
pode ser representado da seguinte forma:

1101 = 1 . 23 + 1 . 22 +O. 21 + 1 . 2o
1101 = 8 +4 +O+ 1 = 13

Note que os índices foram especificados em notação decimal, o que possibilita a


conversão binária decimal como descrito acima.
Através do exemplo anterior, podemos notar que a quantidade de dígitos
necessários para representar um número qualquer, no sistema binário, é muito maior
quando comparada ao sistema decimal. A grande vantagem do sistema binário reside no
fato de que, possuindo apenas dois dígitos, estes são facilmente representados por uma
chave aberta e uma chave fechada ou, um relé ativado e um relé desativado, ou, um
transistor saturado e um transistor cortado; o que toma simples a implementação de
sistemas digitais mecânicos, eletromecânicos ou eletrônicos.
Em sistemas eletrônicos, o dígito binário (O ou 1) é chamado de BIT, enquanto
que um conjunto de 8 bits é denominado BYTE.
Existem varias formas de conversão de números binários, mas iremos ver
somente a conversão de decimal para binário para podermos ter uma ideia da
importância do entendimento deste tipo de matemática.

A Conversão decimal binário


Para se converter um número decimal em binário, divide-se sucessivamente o número
decimal por 2 (base do sistema binário), até que o último quociente seja 1. Os restos
obtidos das divisões e o último quociente compõem um número binário equivalente,
como mostra o exemplo a seguir.

Exemplo:
Converter os seguintes números decimais em binário.

a) 23 (D) b) 52 (D)

A letra (D) quer dizer decimal

A letra (B) quer dizer binário

Solução:

1112
a) 23 12 logo:
1
1 5 12
12
23 (D)� 10111 (B)
1 2
O 1 - bit 1nais significativo

a) 52 l z
2612
logo:

13 12
o
o 52 (D)� 110100 (B)

12._
1 �
o 3
1 1

Sistemas Microcontrolados 7 l 129Prof. Fabiano Saldanha


9
Microcontroladores

Introdução ao sistema Hexadecimal

O sistema hexadecimal, ou sistema de base 16, é largamente utilizado nos


computadores de grande porte e vários microcomputadores. Neste sistema são utilizados
16 símbolos para representar cada um dos dígitos hexadecimais, conforme a tabela a
seguir:
Note que as letras A, B, C, D, E, F representam dígitos associados às
quantidades, 10, 11, 12, 13, 14, 15, respectivamente.
Podemos utilizar a calculadora do Windows ou Linux para a conversão de
números hexadecimais.
Por ser apenas uma rápida revisão sobre o assunto não iremos fugir ao escopo
principal do curso, acreditando que o aluno já tenha conhecimentos prévios de
eletrônica digital.
N º DECIMAL DÍGITO HEXADECIMAL N º BIN.4.RIO
o o 0000
1 1 0001
2 2 0010
3 3 0011
4 4 0100
5 5 0101
6 6 0110
7 7 0111
8 8 1000
9 9 1001
10 A 1010
11 B 1011
12 e 1100
13 D 1101
14 E 1110
15 F 1111

Portas Lógicas
Portas Inversoras (NOT):
Uma inversora é uma porta com apenas um sinal de entrada e um sinal de saída,
o estado da saída é sempre o oposto da entrada.
Simbologia:

A A

Tabela Verdade:

1 o
o 1

Representação em Álgebra Booleana: S = A

Sistemas Microcontrolados 8 l 129Prof. Fabiano Saldanha


10
Microcontroladores

Portas OU (OR):
A porta OR tem dois ou mais sinais de entrada (padrão 02 ou 03) mas somente
um sinal de saída. Se qualquer sinal de entrada for alto (nível 1 - fechado), o sinal de
saída será alto.


ível 1 Saída

Simbologia:

Tabela Verdade:

A B e s
o o o o
o o 1 1

o 1 o 1

o 1 1 1

1 o o 1

1 o 1 1

1 1 o 1

1 1 1 1

Representação em Álgebra Booleana: S =A+ B + C

Portas E (AND):
A porta AND tem dois ou mais sinais de entrada (padrão 02 ou 03) mas somente
um sinal de saída. Se qualquer sinal de entrada for baixo (nível O - aberto), o sinal de
saída será baixo.

--------------------
Nível I A B e Saída

Simbologia:

:=O- Saída

Tabela Verdade:

A B s
o o o
o 1 o
1 o o
1 1 1

Representação em Álgebra Booleana: S = A . B

Sistemas Microcontrolados 9 l 129Prof. Fabiano Saldanha


11
Microcontroladores

Flip Flops

Os flip-flops são os circuitos sequenciais mais elementares e possuem a


capacidade de armazenar a informação neles contida. Representam a unidade elementar
de memória de 1 bit (binary digit), ou seja, funcionam como um elemento de memória
por armazenar níveis lógicos temporariamente. São chamados de biestáveis porque
possuem dois estados lógicos estáveis, geralmente representados por "O" e "1".
Vamos ver o funcionamento do flip flop RS que constitui a base de todos os
outros modelos de flip flop.
Um flip-flop S-R Sincrono depende da habilitação de suas entradas por um sinal
de clock para que essas possam alterar o estado do mesmo. Este sinal pode operar de
duas formas: mantendo as entradas ativas durante todo o período do pulso ou apenas no
instante da mudança de estado do sinal de clock. Essas duas formas de operação podem
ser denominadas como modo clocked e modo triggered, respectivamente.
O flip-flop "set/reset" ativa (set, muda sua saída para o nível lógico 1, ou retém
se este já estiver em 1) se a entrada S ("set") estiver em 1 e a entrada R ("reset") estiver
em O quando o clock for mudado. O flip-flop desativa (reset, muda sua saída para o
nível lógico O, ou a mantém se esta já estiver em O) se a entrada R ("reset") estiver em 1
e a entrada S ("set") estiver em O quando o clock estiver habilitado. Se ambas as
entradas estiverem em O quando o clock for mudado, a saída não se modifica. Se,
entretanto, ambas as entradas estiverem em 1 quando o clock estiver habilitado, nenhum
comportamento particular é garantido. Isto é comumente escrito na forma de uma
"tabela verdade"
a o· S R

o o O X

o 1 1 o
1 o O 1

1 1 X O

Q' --, Estado seguinte do Q


Exemplo com a tabela verdade mostrando o estado anterior·

s R Oanl Qfim Qfim� DESCRICAO

o o o o 1 Fixa Qfim = Qant

o o 1 1 o Fixa Qfim = Qant

o 1 o o 1 Fixa Qfim = O

o 1 1 o 1 Fixa Qfim = O

1 o o 1 o Fixa Qfim = 1

1 o 1 1 o Fixa Qfim = 1

1 1 o 1 1 Não Permitido

1 1 1 1 1 Não Permitido

Legenda: S (Set), R (Reset), Oanl (Estado anterior da saída O), Ofim (Estado em que a saída deve assumir "estado futuro" após a aplicação das entradas), Qfim' (Qfim Linha)

Esquema do flip flop RS

Sistemas Microcontrolados 10 � 129Prof. Fabiano Saldanha


12
Microcontroladores

A tecnologia CISC e RISC


•A CISC (em inglês: Complex Instruction Set Computing, Computador com um
Conjunto Complexo de Instruções), usada em processadores Intel e AMD; suporta mais
instruções no entanto, com isso, mais lenta fica a execução delas.
•A RISC (em inglês: Reduced Instruction Set Computing, Computador com um
Conjunto Reduzido de Instruções) usada em processadores PowerPC (da Apple,
Motorola e IBM) e SPARC (SUN); suporta menos instruções, e com isso executa com
mais rapidez o conjunto de instruções que são combinadas.
Um processador CISC (Complex Instruction Set Computer), é capaz de executar
várias centenas de instruções complexas, sendo extremamente versátil. Exemplos de
processadores CISC são os 386 e os 486. No começo da década de 80, a tendência era
construir chips com conjuntos de instruções cada vez mais complexos, mas alguns
fabricantes resolveram seguir o caminho oposto, criando o padrão RISC (Reduced
Instruction Set Computer).
Ao contrário dos complexos CISC, os processadores RISC são capazes de
executar apenas algumas poucas instruções simples. Justamente por isso, os chips
baseados nesta arquitetura são mais simples e muito mais baratos. Outra vantagem dos
processadores RISC, é que por terem um menor número de circuitos internos, podem
trabalhar com clocks mais altos. Um processador RISC é capaz de executar instruções
muito mais rapidamente.
Assim, em conjunto com um software adequado, estes processadores são
capazes de desempenhar todas as funções de um processador CISC, compensando as
suas limitações com uma velocidade maior de operação. Atualmente, vemos
processadores híbridos, que são essencialmente.
Processadores CISC, porém que possuem internamente núcleos RISC. Assim, a
parte CISC do processador pode cuidar das instruções mais complexas, enquanto que o
núcleo RISC pode cuidar das mais simples, nas quais é mais rápido. Parece que o futuro
nos reserva uma fusão destas duas tecnologias. Um bom exemplo de processador
híbrido é o Pentium Pro.
From Computer Desktop Encyclopedia
@ 1998 lhe Computer L.anguage Co. lno.

RISC CISC

Machine instructions Machine instructions

lnstruction Microcode conversion


execution

Microinstructions

Microinstrudion
execution

Sistemas Microcontrolados 11 � 129Prof. Fabiano Saldanha


13
Microcontroladores

Arquitetura Harvard e Von-Neumann

Memória Barramentos Processador


Barramento de Endere o Unidade de
Instruções Controle
Barramento de
E lnstru ões e dados
Registradores
Dados
li Barramento de Controle
ULA

A Arquitetura de von Neumann (de John von Neumann), é uma arquitetura de


computador que se caracteriza pela possibilidade de uma máquina digital armazenar
seus programas no mesmo espaço de memória que os dados, podendo assim manipular
tais programas.
A máquina proposta por Von Neumann reúne os seguintes componentes: (i) uma
memória, (ii) uma unidade aritmética e lógica (ALU), (iii) uma unidade central de
processamento (CPU), composta por diversos registradores, e (iv) uma Unidade de
CISC RISC
(complex (simple
i nstructions) instrucüons)
0,001a1 noo,
100,1
D<IIUll"0011l!I

[J.1�1100100 oou,
0111'M1 "0011110;1

0-lu,11101Q;l 01111 I
!1C,:,11I00100,1111

1B 00100
1110U)l 11 D11Cl1'1 tl1
I 11 moo,, IM
(ll'

Controle (CU), cuja função é a mesma da tabela de controle da Máquina de Turing


universal: buscar um programa na memória, instrução por instrução, e executá-lo sobre
os dados de entrada.
Cada um dos elementos apresentados é realizado à custa de componentes físicos
independentes, cuja implementação tem variado ao longo do tempo, consoante a
evolução das tecnologias de fabricação, desde os relés electromagnéticos, os tubos de
vácuo (ou válvulas), até aos semicondutores, abrangendo os transistores e os circuitos
electrónicos integrados, com média, alta ou muito alta densidade de integração (MSI -
medium scale, LSI - large scale, ou V LSI - very large scale integration), medida em
termos de milhões transistores por pastilha de silício.
As interacções entre os elementos exibem tempos típicos que também têm
variado ao longo do tempo, consoante as tecnologias de fabricação. Atualmente, as
CPUs processam instruções sob controlo de relógios cujos períodos típicos são da
ordem de 1 nanosegundo, ou seja, 1 O - 9 segundos. As memórias centrais têm tempos
típicos de acesso da ordem da dezena de nanosegundos. As unidades de entrada e saída
exibem tempos típicos extremamente variáveis, mas que são tipicamente muito
superiores à escala do nanosegundo. Por exemplo, os discos duros exibem tempos da

Sistemas Microcontrolados 12 � 129Prof. Fabiano Saldanha


14
Microcontroladores

Memória Barramentos Processador Barramentos Memória


Barramento de Endereco Unidade de
Controle
Instruções Barramento de lnstru ões Barramento de Dados Dados
Registradores
Bar a�o.to de Controle
ULA

Arquitetura Havard

ordem do milisegundos (milésimo de segundo, 10 - 3). Outros dispositivos periféricos


são inertes, a não ser que sejam activados por utilizadores humanos. Por exemplo, ao se
fazer "copy and paste" nao se percebe nada do que foi descrito acima, pois um teclado
só envia informação para o computador após serem pressionada as devidas teclas.
Assim, este dispositivo se comunica com a CPU eventualmente e, portanto, exibe
tempos indeterminados.
A Arquitetura de Harvard baseia-se em um conceito mais recente que a de Von­
Neumann, tendo vindo da necessidade de por o microcontrolador para trabalhar mais
rápido. É uma arquitetura de computador que se distingue das outras por possuir duas
memórias diferentes e independentes em termos de barramento e ligação ao
processador.
Baseia-se na separação de barramentos de dados das memórias onde estão as
instruções de programa e das memórias de dados, permitindo que um processador possa
acessar as duas simultaneamente, obtendo um desempenho melhor do que a da
Arquitetura de von Neumann, pois pode buscar uma nova instrução enquanto executa
outra.
A principal vantagem desta arquitetura é dada pela dupla ligação às memórias de
dados e programa (código), permitindo assim que o processador leia uma instrução ao
mesmo tempo que faz um acesso à memória de dados.
A arquitetura Havard também possui um repertório com menos instruções que a
de Von-Neumann, e essas são executadas apenas num único ciclo de relógio.
Os microcontroladores com arquitetura Havard são também conhecidos como
"microcontroladores RISC" (Computador com Conjunto Reduzido de Instruções), e os
microcontroladores com uma arquitetura Von-Neumann, de "microcontroladores CISC"
(Computador com um Conjunto Complexo de Instruções).
A diferença entre a arquitetura Von Neunmann e a Harvard é que a última separa
o armazenamento e o comportamento das instruções do CPU e os dados, enquanto a
anterior utiliza o mesmo espaço de memória para ambos. Nos CPUs atuais, é mais
comum encontrar a arquitetura Von Neunmann, mas algumas coisas da arquitetura
Harvard também são vistas.
Nessas distintas arquiteturas, temos vantagens e desvantagens, como pode-se
observar a seguir: Arquitetura tipo Harvard: Caminhos de dados e de instrução distintos,
dessa forma, seus componentes internos têm a seguinte disposição.
Já na arquitetura Von-Neumann, é processada uma única informação por vez,
visto que nessa tecnologia, execução e dados percorrem o mesmo barramento, o que
toma o processo lento em relação à arquitetura Harvard.
Essa é a tecnologia mais utilizada nos PC's e microcontroladores, pois

Sistemas Microcontrolados 13 � 129Prof. Fabiano Saldanha


15
Microcontroladores

proporcionam maior velocidade de processamento, pois enquanto a CPU processa uma


informação, outra nova informação está sendo buscada, de forma sucessiva.
Equipamentos que utilizam a arquitetura Harvard:
Os PIC (PICmicro) são uma família de microcontroladores fabricados pela
Microchip Technology, que processam dados de 8 bits e de 16 bits, mais recentemente
32 , com extensa variedade de modelos e periféricos internos, com arquitetura Harvard e
conjunto de instruções RISC (conjuntos de 35 instruções e de 76 instruções), com
recursos de programação por Memória flash, EEPROM e OTP. Os microcontroladores
PIC têm famílias com núcleos de processamento de 12 bits, 14 bits e 16 bits e trabalham
em velocidades de 0kHz (ou DC) a 48MHz, usando ciclo de instrução mínimo de 4
períodos de clock, o que permite uma velocidade de no máximo 10 MIPS. Há o
reconhecimento de interrupções tanto externas como de periféricos internos. Funcionam
com tensões de alimentação de 2 a 6V e os modelos possuem encapsulamento de 6 a
100 pinos em diversos formatos (SOT 2 3, DIP, SOIC, TQFP, etc)

A arquitetura de um computador

O projeto de qualquer computador pode ser conseguido através da implementação


de 3 blocos funcionais, interligados entre si, como se representa na figura abaixo.

Memória

P:roe1ama

EIS DMA
..
---•----------------- ___ 1- . ... Dados

Periféricos µPro cessado r


de
EIS
CPU
B arr amento de B anamente de
EIS Memória

µ.Controlador

Arquitetura base de um computador

O CPU (Unidade de Processamento Central) é o responsável pela correta


execução das instruções de um programa, efetuando as transferências de dados e as
operações lógicas e aritméticas implícitas nessas instruções. Este CPU é constituído por:
• Unidade de Controlo, que gera todos os sinais necessários à execução de cada
uma das instruções incluídas no programa.
• Processador
D ALU - Unidade Lógica e Aritmética, onde se encontram implementadas
as unidades que permitem efetuar as operações lógicas e aritméticas;
D Registos, utilizados para o armazenamento temporário de operando e
resultados de operações;

• Controle de Barramentos, permitindo gerir o tráfego de informação para o


acesso aos dispositivos exteriores.
Num computador, as funções do CPU são desempenhadas normalmente por um
microprocessador (p. ex. Z80).
A memoria é um bloco constituído por dispositivos de memória (ROM,
2
EPROM, E PROM, FLASH EPROM, RAM, NVRAM, etc.) permite o armazenamento

Sistemas Microcontrolados 14 � 129Prof. Fabiano Saldanha


16
Microcontroladores

de instruções de programa e dados e pode ser logicamente dividida em:


• Memória de Programa, onde são guardadas as instruções a executar pelo
CPU;
• Memória de Dados, onde são guardados todos os dados necessários ao
processamento ou provenientes do processamento.

EIS (Entradas/Saídas)
Este bloco do computador permite a sua interligação com dispositivos periféricos
para entrada ou saída de dados (teclado, monitor, impressora, sensores, conversores A/D ou
DIA, etc.). Fisicamente é constituído por hardware que permite a transmissão/recepção de
dados e, em alguns casos, a sua formatação.

Barramento de Memória e Barramento de E/S


Embora logicamente diferentes, normalmente estes 2 barramentos não são
distintos fisicamente. São constituídos por condutores que permitem a transferência da
informação entre o CPU e a memória ou os dispositivos de E/S. A constituição destes
barramentos é a seguinte:

• Barramento de Endereços, unidirecional, onde o CPU coloca o endereço de


memória ou do dispositivo de onde quer ler ou onde quer escrever (p. ex. no
Z80 é constituído pelas linhas AO ..Al5);

• Barramento de Dados, bidirecional, onde circulam os dados resultantes da


comunicação de ou para o CPU (p. ex. linhas DO ..D7 no Z80);

• Barramento de Controle, bidirecional, que contém os sinais necessários para


uma correta implementação do protocolo de comunicação (p. ex. no Z80 as
linhas WR, RD, MREQ, IOREQ, etc.)

Barramento de DMA (Direct Memory Access)


Na maior parte dos computadores, a transferência de dados entre os dispositivos de
E/S e a memória pode ser feita sem a intervenção direta do CPU, libertando-o assim para
outras tarefas que podem ser feitas em paralelo. Esta transferência de informação, que
utiliza controladores específicos, é feita através do barramento de acesso direto à memória.

Arquitetura básica de um microcontrolador

Os microcontroladores apresentam uma série de recursos incorporados dentro de


um único integrado. Estes recursos aumentam com a evolução da eletrônica. Isto
permite o desenvolvimento de projetos cada vez mais simples.

ROM

ENDEREÇOS E DADOS
CPU

PORTA PORTA CONVERSORES


TIMERS
PARALELA SERIAL A/DE D/A

Exemplo típico de um microprocessador aplicado em controle.

Sistemas Microcontrolados 15 � 129Prof. Fabiano Saldanha


17
Microcontroladores

Estas aplicações tinham o custo dependente do preço da CPU e dos periféricos


(ROM, RAM, Portas, A/D, D/A, etc) e também da quantidade de conexões e do
tamanho da placa. Para reduzir o custo, começou a surgir a idéia de colocar todos estes
periféricos dentro do chip da CPU.
Isso baratearia e diminuiria o tamanho do circuito impresso além de aumentar a
confiabilidade.
Por outro lado, uma CPU dedicada a um determinado controle não precisa ser
muito rápida nem tampouco ter um conjunto de instruções extenso e poderoso. Não são
necessárias instruções para trabalhar com ponto flutuante, com strings ou vetores e
também os mecanismos de endereçamento devem ser simples. Ou seja, pode-se
simplificar a CPU. Assim surgem os microcontroladores, que são simples, baratos e
eficientes. Os microcontroladores apresentam uma série de recursos incorporados dentro
de um único integrado. Estes recursos aumentam com a evolução da eletrônica. Isto
permite o desenvolvimento de projetos cada vez mais simples.
Os microcontroladores são específicos para controle, não tem grande capacidade
de processamento e por isso nunca haverá um computador pessoal cuja CPU seja um
microcontrolador.
MICROCONTROLADOR TÍPICO

1
1 CPU
1 1
PORTA

1 1
DIA
ROM PARALELA

1 1
1
RAIM
PORTA
A/D 1 SERIAL
1 TIMERS
1
Arquitetura básica de um microcontrolador.

Eles podem estar presentes em um PC, mas apenas para controlar periféricos.
Usa-se o nome de Microcontrolador para designar dispositivos de uso genérico,
mas existem vários microcontroladores que têm aplicações específicas, como por
exemplo o controlador de teclado 80C51SL-BG e o controlador de comunicações
universal 82C152.
Há diversos fabricantes de microcontroladores.
Os mais conhecidos são:
• INTEL-8048, 8049, 8051, 8052, 8096.
•ZILOG-Z8.
• MO TOROLA-6801, 6804, 6805, 68HC11.
• NATIONAL-COP400, COP800, NS8050

,.,�����.-.. O microcontrolador
integra CPU, RAM,
ROM e periféricos
 em um único CHIP.

Sistemas Microcontrolados 16 � 129Prof. Fabiano Saldanha


18
Microcontroladores

(AULA 02)

1 - INTRODUÇÃO

Núcleo do microcontrolador 8051


A arquitetura 8051 especifica os recursos que deverão estar presentes nos
microcontroladores compatíveis com esta família.
Um ponto interessante nesta arquitetura é que, ao contrário de nossos
computadores, ela separa a memória de programa da memória de dados. Essa
arrumação da memória em blocos distintos oferece maior versatilidade às aplicações. A
figura abaixo apresenta um diagrama em blocos com a arquitetura 8051. Vemos que está
especificada uma CPU de 8 bits, para a qual já foi definido um conjunto mínimo de
instruções.
O contador de programa (PC) é de 16 bits, o que permite até 64 KB de memória
de programa.
Um outro registrador de 16 bits é usado para acessar a memória de dados, o que
permite 64 KB de dados.
Nota-se que existe a possibilidade da memória de programa (ROM 4KB) ser
integrada junto com o chip do processador. A memória RAM interna tem 256 bytes e
está dividida em dois blocos de 128 bits.
O bloco inferior destina-se a trabalhar como uma outra memória de dados,
enquanto que o bloco superior está dedicado aos registradores especiais que controlam
os diversos recursos do microcontrolador.
A arquitetura 8051 oferece quatro portas paralelas de 8 bits, denominadas de P0,
Pl, P2 e P3.
Essas portas são bidirecionais e podem ser usadas para receber ou para gerar
sinais digitais. Elas também podem ser acessadas bit a bit, ou seja, cada bit da porta
pode ser programado como entrada ou como saída.
Quando se usa memória externa ao CI, as portas P0 e P2 são consumidas na
construção dos barramentos de endereços e dados. Para a geração de pulsos com
duração precisa ou para a medição de intervalos de tempo em sinais digitais, existem
dois contadores e temporizadores de 16 bits, denominados de "Timers".
O bloco denominado "Controlador de Interrupções" trabalha com cinco interrupções.
Duas dessas interrupções podem ser pedidas externamente através dos pinos INT0 e
INTl, sendo que outras duas interrupções podem ser provocadas pelos contadores e
temporizadores. A quinta interrupção é gerada pela porta serial.
Esta arquitetura especifica uma porta serial capaz de atender aos requisitos mais
usuais de comunicação, por isso a quantidade de bits e a velocidade é programável, e a
porta serial gera uma interrrupção tanto na transmissão quanto na recepção de um byte.

Sistemas Microcontrolados 17 � 129Prof. Fabiano Saldanha


19
Microcontroladores

Arquitetura interna do PIC 8 bits

A MICROCHIP TECHNOLOGY INC. é uma empresa de grande porte, com


sede em Arizona, nos Estados Unidos da América. É uma empresa de expressiva
participação no mercado de microcontroladores e semicondutores analógicos. Entre seus
principais produtos, destaca-se o microcontrolador PIC® (Periferal Interface Controler),
que possui uma boa diversidade de recursos, capacidades de processamento, custo e
flexibilidade de aplicações.
Mas, sem dúvida, o ponto mais forte desta tecnologia está na simplicidade de
aplicação, o que permite a aplicação deste microcontrolador em projetos de pequeno
porte, facilitando a implementação e diminuindo o custo de desenvolvimento.
Os microcontroladores PIC estão classificados em famílias, cada qual com uma
característica relativa à sua performance e funcionalidade. A família PIC1O, de menos
recursos, é aplicada a funções de controle on-off mais simples e de menor porte,
possuindo custo relativamente baixo (abaixo de US$ 1,00 por unidade) e a família

dsPIC30 e dsPIC33 são adequadas para processamento e controle envolvendo aquisição,


tratamento e processamento veloz de sinais analógicos, permitindo desenvolvimento de
aplicações mais complexas, ligadas à área de telecomunicações, comunicações sem fio
de alta performance, controles em tempo real de alta velocidade, entre outras.
No entanto, a área de maior sucesso da Microchip é a dos microcontroladores de
8 bits, de baixo custo e boa funcionalidade.
Dentre os modelos mais conhecidos dos microcontroladores Microchip PIC®,
cita-se o microcontrolador PIC10F200 (de menor custo), PIC16F84 (mais popular),
PIC16F628 (excelente custo-beneficio), o PIC16F877A (variedade de recursos e bom
custo), e o PIC18F4431 (bastante versátil e poderoso).
Iremos estudar o PIC16F628, por ser o substituto direto do 16F84.

PIC16F84

Sem dúvida um dos mais importantes microcontroladores da Microchip, uma


vez que pode ser considerado um marco de divulgação.
Os microcontroladores Microchip que possuem um "F" em seus nomes se
caracterizam por possuir memória ROM do tipo FLASH, o que facilita a gravação e
modificação dos programas, dispensando os antigos sistemas de gravação eletrônica
após desgravação por UV, que demoravam minutos.

Sistemas Microcontrolados 18 � 129Prof. Fabiano Saldanha


20
Microcontroladores

O microcontrolador PIC16F84 foi um dos primeiros a usar este recurso, e


juntamente com o recurso de gravação serial (ICSP), permitiu a divulgação de projetos
simples de gravadores para PIC, ajudando a disseminar a utilização dos
microcontroladores Microchip.
O PIC16F84 foi por muito tempo o microcontrolador preferido dos livros e
revistas. Sua flexibilidade, bom custo e recursos renderam fama à fabricante.
Hoje, não é recomendado o uso deste microcontrolador, uma vez que sua
fabricação tende a ser descontinuada, (atualmente é fabricado como PIC16F84A).
Outro fator que indica a necessidade de upgrade para outro modelo é o
considerável aumento no custo dos modelos descontinuados, opondo-se a resistência
gerada pela cultura dos estudantes, hobistas e leitores das diversas obras que orientam o
uso deste microcontrolador. Muitos outros modelos mais eficientes e com mais recursos
são oferecidos com valor mais baixo.
Entre as características do PIC16F84, podemos citar: processador RISC de 35
instruções, com velocidade de até 20 MHz (5 Milhões de Instruções por Segundo). 1
KWord de memória ROM, 68 bytes de memória RAM e 64 bytes de memória
EEPROM. Recurso de interrupção por hardware em 2 pinos, e interrupção por timer.
Faixa de tensão de 2V a 5.5V, com baixo consumo elétrico.

PIC16F628

Excelente custo beneficio, pois se trata de um microcontrolador relativamente


barato (menos de US$ 3,00), reunindo os seguintes recursos: CPU RISC de 35
instruções, até 20 MHz, ou 4MHz com oscilador interno, 16 pinos de entrada e/ou saída,
dois comparadores analógicos, gerador PWM, 3 Timers, comunicação serial. Sua
memória ROM é de 2KWords (permite até 2048 instruções em um programa), e
memória RAM de 224 bytes, com EEPROM de 128 bytes.
É visto por muitos como o sucessor do PIC16F84, estendendo alguns recursos
em um encapsulamento pino compatível, necessitando de pouca ou nenhuma alteração
de hardware....
PIC16F877
Versátil e cheio de recursos. É o mais "poderoso" microcontrolador da família
16, oferecendo bons recursos para aplicações de controle. Seu custo atualmente é
superior a US$ 4,00, porém oferece alguns recursos que podem minimizar ou eliminar a
necessidade de implementações periféricas, com ganho de tempo e espaço. Dentre seus
recursos, podemos citar como os mais importantes: CPU RISC de 35 instruções, com
clock de até 20MHZ (5 milhões de instruções por segundo). Até 8 KWords de memória
de programa, 368 bytes de RAM, 256 bytes de EEPROM, dois comparadores e
geradores PWM, 8 canais de conversão ND de 1O bits, comunicação serial, 33 pinos de
Entrada/Saída. É um microcontrolador ideal para quem busca controle de diversos
dispositivos, ou dispositivos que demandem uma maior quantidade de controles digitais.
Suas duas saídas PWM e seus 8 canais de conversão analógico/digital elevam este
microcontrolador a aplicações de controle mais sofisticadas. Não podemos deixar de
destacar também seus recursos de conectividade, com suas portas seriais e paralela,
facilitando a implementação de aplicações de comunicação ou de colaboração com
outros componentes.

Sistemas Microcontrolados 19 t 129Prof. Fabiano Saldanha


21
Microcontroladores

PDIP, SOIC
RA.2- .,
2
18 -RA1
RA3- 17 -RAO
RA4/TOCKI- 3 :ll 16 �oscl/CLKIN
MCLR� 4 � 15 � OSC2/CLKOUT
vss..-.. õ
.,,'"
a, 14 �vo

t
RB□ílNT- ô 13 -RB7
RB1- 7 12 -RB8
RB2- 11 -RB5
RB3- 10 -RM

PINAGEM PIC16F84

o
RA2/AN2NREF 18

RA3/AN3/CMP 1 2 17 RA0/AN0
RA4fT0CKI/CMP2 3
:li 16 RA71OSC1/CLKIN

15 RA6/OSC2/CLKOUT

14 Voo
RB0/INT 6 <D 13 RB7/T1OS1/PGD

RB1/RX/DT 7 o 12 RB6/T1 OSOfT1 CKIIPGC

RB2fTXICK 11 RBS

RB3ICCP1 9 10 RB4/PGM

PINAGEM PIC16F84
40-Pin PDIP
MCLRNPP� - RB7/PGD
RA0/AN0 - - RB6/PGC
RA1/AN1- - RBS
RA2/AN2NREF-/CVREF � - RB4
RA3/AN3NREF+ - �- RB3/PGM
RA4fT0CKUC1OUT- - RB2
RA5/AN4/SS/C2OUT- -RB1
RE0/RD/ANS- -RB0/INT
RE1/WRJAN6 - �voo
RE2ICS/AN7 - �-Vss
Voo- 11 - RD7/PSP7
Vss­ - RD6/PSP6
OSC1/CLKI� - RD5/PSP5
OSC2/CLKO � ­ - RD4/PSP4
RCOfT1OSOfT1CKI - - RC7/RXIDT
RC'lfT1OS1/CCP2 - - RC6fTX/CK
RC2/CCP1 - �- RCS/SDO
RC3/SCK/SCL - �- RC4/SDI/SDA
RD0/PSP0 - - RD3/PSP3
RD1/PSP1 - - RD2/PSP2

PINAGEM PIC16F877

Os PICs são arquitetura Harvard e tecnologia RISC, eja mais uma vez abaixo
para que fique clara a diferença entre as duas arquiteturas.

Arquitetura Von Newman CISC {Complex Instruction Set CPU ou CPU com
Conjunto de Instruções Complexo)

1 Memória de Programa 1 ..oll>---�---11 I Memórfa,,de Dados

.. 8 bits·

I
.ULA

Sistemas Microcontrolados 20 � 129Prof. Fabiano Saldanha


22
Microcontroladores

Arquitetura Harward RISC( Reduced Instruction Set Computer ou CPU com


conjunto de Instruções Reduzidos)
tvlemória de Programa 1 tvl emória de Dados

í
1
14 bits
---�--� __ íts_
5 b_ � 8 bits
.
lnstructíon Re·g· �
_
,_
��_ _ -----

,__--·

8 bits
�.

� ....

Obs: W = work ou acumulador.

Memória de Programa (ROM do PIC)


O modelo estudado aqui é o PIC 16F628, muito semelhante ao PIC 16F84, a
pinagem é a mesma, porém alguns pinos possuem mais funções e possui 2K de
memória, o dobro do PIC 16F84 que é somente de lK. Veja figura abaixo a memória
de Programa do PIC 16F84
OOOh Vetor de reset

004h Vetor de interrupção


Tipo: 14 bits
Tamanho: 1024 palavra�
Vetor de reset: OOOh
Vetor de inter.: 004h
UsQ geral

3FFh

E a seguir a memória de Programa do PIC 16F628


OOOh Vetor de reset

004h Vetor de interrupção


'.1-------��---; Tipo: 14 bits
Tamanho: 1 024 (627)
2048 ·(628)
Vetor de reset: O00h
Uso gera) Vetor de inter.: 004h

07FFh .__________�

A VETOR DE RESET - Trata-se do primeiro endereço de memória de


programa (ROM) que será executado quando o PIC começar a rodar (
após a alimentação ou um reset). Na maioria dos modelos, o reset aponta
para o endereço 0x00, mas em alguns modelos antigos ele pode apontar
para o ultimo endereço disponível
A VETOR DE INTERRUPÇÃO - As rotinas de interrupção serão
armazenadas na área de programação, juntamente com todo o resto do
programa. No entanto, existe um endereço que é reservado para o inicio
do tratamento de todas as interrupções, nos modelos de PIC que possuem
esse recurso. Esse endereço é denominado vetor de interrupção e
encontra-se sempre na posição 0x04.

Sistemas Microcontrolados 21 � 129Prof. Fabiano Saldanha


23
Microcontroladores

PIC16F627A/628A/648A
FIGURE 4-2: DATA MEMORY MAP OF THE PIC16F627A AND PIC16F628A
File
Address

lndirect addr.!1l 00h lndirect addr.!1) 80h lndirect addr.I1) 100h lndirect addr. (1) 180h
TMR0 01h OPTION 81h TMR0 101h OPTION 181h
PCL 02h PCL 82h PCL 102h PCL 182h
STATUS 03h STATUS 83h STATUS 103h STATUS 183h
FSR 04h FSR 84h FSR 104h FSR 184h
PORTA 05h TRISA 85h 105h 185h
PORTB 06h TRISB 86h PORTB 106h TRISB 186h
07h 87h 107h 187h
08h 88h 108h 188h
09h 89h 109h 189h
PCLATH 0Ah PCLATH 8Ah PCLATH 10Ah PCLATH 18Ah
INTCON 0Bh INTCON 8Bh INTCON 10Bh INTCON 18Bh
PIR1 0Ch PIE1 8Ch 10Ch 18Ch
ODl1 8Díl 10Dh 18Dh
TMR1L 0Eh PCON 8Eh 10Eh 18Eh
TMR1H 0Fh 8Fh 10Fh 18Fh
T1CON 10h 90h
TMR2 11h 91h
T2CON 12h PR2 92h
13h 93h
14h 94h
CCPR1L 15h 95h
CCPR1H 16h 96h
CCP1CON 17h 97h
RCSTA 18h TXSTA 98h
TXREG 19h SPBRG 99h
RCREG 1Ah EEDATA 9Ah
1Bh EEADR 9Bh
1Ch EECON1 9Cn
1Dh EECON211l 9Dh
1Eh 9Eh
CMCON 1Fh VRCON 9Fh 11Fh
20h General 120h
A0h Purpose
General General Registar
Purpose Purpose 48 Bytes 14Fh
Registe, Registe,
80 Bytcc 150h
80 Bytes

-- - - 6Fh EFh 16Fh 1EFh


?Oh F0h 170h 1F0h
accesses accesses accesses
16 Bytes
70h-7Fh 70h-7Fh 70h-7Fh
?Fh FFh 17Fh 1FFh
Bank O Bank 1 Bank 2 Bank 3

D Unimplemented data memory location5, read a5 'o'.


Note 1: Not a physical registe,.

DS40044D-page 16 © 2005 Microchip Technology lnc.

Sistemas Microcontrolados 22 � 129Prof. Fabiano Saldanha


24
Microcontroladores

Memória de Dados (RAM do PIC)

Ela é utilizada para guardar todas as variáveis e registradores utilizados pelo


programa.
Essa memória armazena dados de 8 bits e é volátil, ou seja, quando o PIC é
desligado ela é automaticamente perdida.
Podemos dividi-la em dois grupos que serão estudados em seguida:
Registradores especiais e Registradores de uso geral.
A memória de dados muitas vezes também é dividida em mais de um banco,
para possibilitar o acesso aos endereços, com o auxilio de chaves que controlam o
banco que esta sendo utilizado naquele momento.
Lembre-se, dados são informações e endereços são os locais onde serão
armazenados os dados ! ! !

Resumo:
A memória de programa pode ter 12, 14 ou 16 bits, dependendo do PIC. Nesta
memória é que escrevemos nossos programas. No PIC 16F84 ela tem 14 bits e a esses
14 bits damos o nome de "Word" (palavra). Com 14 bits e lK de espaço o número
máximo de bits que conseguiremos armazenar, será de 214 que é igual a 16.384 bits.
A memória de programa é Flash e não volátil, ou seja, não se apaga quando
desligamos o aparelho.
A memória de dados é formada por 8 bits, que recebem o nome de "byte". Todo
os dados (aquele cubo com pontinhos?) armazenados nela se perdem quando a
alimentação é desligada. E é ela quem define de quantos bits é o microcontrolador,
como ele tem 8 bits o PIC l6F84 é de 8 bits.

Ciclo de Máquina

Nos microcontroladores da linha PIC, o sinal de clock externo, é dividido


internamente por 4. Assim se tivermos um cristal de 4MHz, o clock internamente será
de 1MHz e conseqüentemente o ciclo de máquina será de luS. A divisão por 4 do clock
forma 4 fases: Ql, Q2, Q3 e Q4, assim o contador de programa é incrementado
automaticamente na fase Q1 e a próxima instrução é buscada na memória de programa e
armazenada no registrador de instruções. Este procedimento de funcionamento é
conhecido como PIPELINE. Simplificando Q1 faz a busca e verifica a próxima tarefa e
de Q2 a Q4 executa-se a tarefa atual. Exemplo: (Pipeline - Ql Q2 Q3 Q4 = 1 ciclo de
máquina) Cristal de 4MHz / 4 = 1MHz assim t =1/lMHz = luS.

Pipeline
Se para efeito de análise dividirmos o processamento interno do PIC em ciclos
de busca e execução, podemos afirmar que para cada instrução executada foi necessária
a execução prévia de um ciclo de busca. Imagine um sistema que implemente um ciclo
de busca e ao mesmo tempo processe um ciclo de execução [Na arquitetura Harvard a
leitura de instruções e de alguns tipos de operandos podem ser feitas ao mesmo tempo
em que as instruções são executadas]. Isso significa que o sistema fica o tempo todo
executando instruções, o que acarreta um significativo ganho de velocidade. Enquanto
uma instrução é executada, a seguinte esta sendo lida [Desta forma, no início de cada
Ciclo de Máquina haverá uma instrução pronta para ser executada]. Esse processo é

Sistemas Microcontrolados 23 t 129Prof. Fabiano Saldanha


25
Microcontroladores

conhecido como pipeline [canalização]. No entanto algumas instruções fazem com que
este sistema seja desarticulado: são as chamadas instruções de desvio. As instruções de
desvio são aquelas que alteram o valor do Program Counter [ contador/ponteiro de
programa]. Quando ocorre um desvio a instrução que já foi previamente buscada pelo
sistema de Pipeline não é válida, pois estava na posição de memória de programa
apontada pelo PC antes dele ter seu valor alterado para o destino especificado.
Conseqüentemente toma-se necessário a execução de um novo ciclo de busca, que
obviamente demandará mais um ciclo de máquina, resultando em um tempo total de
processamento igual a dois ciclos de máquinas.

Como pode ser o clock do PIC?


Em aplicações onde a precisão do clock [sinal de sincronismo para coordenar as
ações do MCU] é necessária, costuma-se usar um cristal de quartzo e dois capacitores
[ver figura abaixo] ou um ressonador cerâmico [menos preciso] ligado a dois pinos do
PIC. Em aplicações onde precisão não é necessária, podemos usar um circuito RC
[resistor - capacitor] para gerar as oscilações. Muitos modelos de PIC possuem o
recurso de oscilador interno, onde não precisamos ligar componentes externos, porém, a
precisão fica entre 1 % a 7%. Também podemos simplesmente injetar um sinal de clock
de um oscilador independente do PIC.
Exemplo de Circuito Oscilador:

-_ r
OSC1

C,
c:J XTAL

� OSC2
PIC

C2

Abaixo segue uma lista identificando os vários modos de clock dos PICs [as
nomenclaturas podem variar dependendo da fonte de consulta ou dos programas
utilizados], só que nem todos os modelos possuem todos estes.

· LP [Low Power Crystal] - uso de um cristal de alguns kHz e capacitores para que o
consumo seja baixo.
XT [Crystal/Resonator] - cristal de até 4MHz. Pode ser usado um ressonador
cerâmico.
· HS [High Speed Crystal/Resonator] - para cristais com até 20MHz ou ressonadores
com frequências próximas a isto.
· HSPLL [High Speed Phase Locked Loop] - multiplica a frequência do cristal por
quatro.
ER [Externai Resistor] - este modo usa apenas um resistor externo ao PIC,
utilizando a capacitância intrínseca do PIC como capacitor.
· RC [Externai Resistor/Capacitor] - esse modo precisa de apenas um resistor e um
capacitor externo ao PIC [Circuito RC], entretanto a precisão e a estabilidade não são
muito grandes.
INTOSC [Internai Oscillator] - oscilador RC interno que permite que
economizemos em componentes e libera os pinos para usar como portas [frequência
próxima de 4MHz].
EC [Externai Clock ln] - apenas injetamos um sinal de clock externo no PIC.
Quando estudarmos a Linguagem assembly falaremos como devemos proceder

Sistemas Microcontrolados 24 � 129Prof. Fabiano Saldanha


26
Microcontroladores

para alterarmos os registradores, armazenar dados na RAM e etc, por hora nos
lirnitarernos somente a conhecer a estrutura interna do PIC e seu principio de
funcionamento eletrônico.

Lógica de programação
Toda programação deve ser bern estruturada, deve ter urna lógica e devemos
seguir al guns passos pré-determinados, para que possamos fazer urn rnicrocontrolador
funcionar.
Abaixo segue os passos para estruturarmos urna programação no PIC ou ern
qual quer outro sistema rnicrocontrolado.

Diagrama de programação:

Passo 1 : Extração de requisitos - Levantar as necessidades da automação junto ao


cliente, aos usuários do equipamento e as demais pessoas envolvidas no processo de
automação.
Passo 2 : Modelo de software - É a "planta baixa" do programa. Define quais serão as
estratégias de programação que serão utilizadas. Para programas rnais simples,
recomenda-se a construção de urn fluxograma ou de urn modelo gráfico do programa.
Para situações rnais complexas, o modelo deve prever a "quebra" do problema ern
situações ou camadas rnais simples, que podem ser irnplernentadas separadamente.
Passo 3 : Implementação - É a escrita do programa na linguagem de programação
desejada (no caso, linguagem C). Deve ser observado o compilador a ser utilizado, bern
corno as variações na sintaxe da linguagem de programação para a ferramenta
escolhida.
Passo 4 : Compilação - Ocorre a tradução da linguagem de programação para a
linguagem nativa do rnicrocontrolador. Nesta etapa, parte dos erros (principalmente os
erros de sintaxe) são detectados. Os erros de sintaxe são os erros causados por erros de
digitação ou uso incorreto de comandos.
Passo 5 : Transferência - Através de urn programa específico, os dados contidos no
arquivo HEX gerado pelo compilador são transferidos para a rnernória ROM do
rnicrocontrolador.
Passo 6 : Testes - Aqui são descobertos os erros de lógica que podem ser gerados por
urn erro de digitação (pontuação incorreta, comando inadequado, esquecimento de
linhas, etc...). Esta etapa realimenta o processo, até que os testes efetuados garantam a
qualidade do programa criado.

* >
J�l mm

8
ESCREVER PROGRAMA C
pcogcamadoc ,J, '

igi
COMPI LAÇÃO Software de gravação
/

>
I
J/, ""'
TRANSFERÊNCIA
GS�CÃOOOASOOOVO"SA
1/.

Sistemas Microcontrolados 25 � 129Prof. Fabiano Saldanha


27
Microcontroladores

Mas para entendermos o conceito de programação precisamos estudar


primeiramente sobre LÓGICA DE PROGRAMAÇÃO, pois com os conceitos anteriores
de Eletrônica Digital e Princípios de microcontroladores e microprocessadores, você
tem a partir de agora uma base sólida para entrar no mundo do embedded system
design, ou seja, projetista de sistemas embarcados!
A lógica de programação é necessária para pessoas que desejam trabalhar com
desenvolvimento de sistemas e programas, ela permite definir a seqüência lógica para o
desenvolvimento.
Então o que é lógica?
Lógica de programação é a técnica de encadear pensamentos para atingir
determinado objetivo.
Seqüência Lógica
Seqüência Lógica são passos executados até atingir um objetivo ou solução
de um problema.
Instruções
Instruções são um conjunto de regras ou normas definidas para a realização
ou emprego de algo. Em informática, é o que indica a um computador uma ação
elementar a executar.
Convém ressaltar que uma ordem isolada não permite realizar o processo
completo, para isso é necessário um conjunto de instruções colocadas em ordem
seqüencial lógica.
Por exemplo, se quisermos fazer uma omelete de batatas, precisaremos colocar
em prática uma série de instruções: descascar as batatas, bater os ovos, fritar as batatas,
etc...
É evidente que essas instruções tem que ser executadas em uma ordem adequada
- não se pode descascar as batatas depois de fritá-las.
Dessa maneira, uma instrução tomada em separado não tem muito sentido; para
obtermos o resultado, precisamos colocar em prática o conjunto de todas as instruções,
na ordem correta.

Algoritmo
Um algoritmo é formalmente uma seqüência finita de passos que levam a
execução de uma tarefa.
Podemos pensar em algoritmo como uma receita, uma seqüência de instruções
que dão cabo de uma meta específica. Estas tarefas não podem ser redundantes nem
subjetivas na sua definição, devem ser claras e precisas.
Como exemplos de algoritmos podemos citar os algoritmos das operações
básicas (adição, multiplicação, divisão e subtração) de números reais decimais. Outros
exemplos seriam os manuais de aparelhos eletrônicos, como um videocassete, que
explicam passo-a-passo como, por exemplo, gravar um evento.
Até mesmo as coisas mais simples, podem ser descritas por seqüências lógicas.
Por exemplo:
"Chupar uma bala".
· Pegar a bala
· Retirar o papel
· Chupar a bala
· Jogar o papel no lixo
"Somar dois números quaisquer".
· Escreva o primeiro número no retângulo A
· Escreva o segundo número no retângulo B

Sistemas Microcontrolados 26 t 129Prof. Fabiano Saldanha


28
Microcontroladores

· Some o número do retângulo A com número do retângulo B e coloque o resultado no


retângulo C.

Retângulo A Retângulo B Resultado

D+D D
=

Programas
Os programas de computadores nada mais são do que algoritmos escritos numa
linguagem de computador (Pascal, C, Cobol, Fortran, Visual Basic entre outras) e que
são interpretados e executados por uma máquina, no caso um computador. Notem que
dada esta interpretação rigorosa, um programa é por natureza muito específico e rígido
em relação aos algoritmos da vida real.

Desenvolvendo algoritmos

Pseudocódigo
Os algoritmos são descritos em uma linguagem chamada pseudocódigo. Este
nome é uma alusão à posterior implementação em uma linguagem de programação, ou
seja, quando formos programar em uma linguagem, por exemplo C, estaremos gerando
código em C. Por isso os algoritmos são independentes das linguagens de programação.
Ao contrário de uma linguagem de programação não existe um formalismo rígido de
como deve ser escrito o algoritmo.
O algoritmo deve ser fácil de interpretar e fácil de codificar. Ou seja, ele deve ser
o intermediário entre a linguagem falada e a linguagem de programação.

Regras para construção do Algoritmo

Para escrever um algoritmo precisamos descrever a seqüência de instruções, de


maneira simples e objetiva. Para isso utilizaremos algumas técnicas:
· Usar somente um verbo por frase
· Imaginar que você está desenvolvendo um algoritmo para pessoas que não trabalham
com informática
· Usar frases curtas e simples
· Ser objetivo
· Procurar usar palavras que não tenham diferentes interpretações

Fases

Vimos que ALGORITMO é uma seqüência lógica de instruções que podem ser
executadas.
É importante ressaltar que qualquer tarefa que siga determinado padrão pode ser
descrita por um algoritmo, como por exemplo:

COMO FAZER ARROZ DOCE


ou então
CALCULAR O SALDO FINANCEIRO DE UM ESTOQUE

Sistemas Microcontrolados 27 � 129Prof. Fabiano Saldanha


29
Microcontroladores

Entretanto ao montar um algoritmo, precisamos primeiro dividir o problema

E E
apresentado em três fases fundamentais.

➔ moc,sSAMENTD ➔

Onde temos:
ENTRADA: São os dados de entrada do algoritmo
PROCESSAMENTO: São os procedimentos utilizados para chegar ao resultado final
SAÍDA: São os dados já processados

Analogia com o homem

ENTRADA r PROCESSAMENTO H SAÍDA

• .. :1
,,1

Percepção gas
:1
1 •� • •
1mpressoes
sensoriais

1
' "'
Saída do resultado
Processo de 1 dos processos
Pensamento • de pensamento
:1
Com o au:xílio da nos:sa:
1 memória exerutam os ,1:
1 diversos procems, '1
1 como controlar , :l
1 comparar.combinar, :1
, deduzir, etc. :1

Iremos utilizar um programa que interpreta e executa algoritmos como um


"programa" normal de computador. Baseado em uma linguagem parecida com o
"Portugol" ensinado em cursos em todo o Brasil, possui recursos como simulação da
"tela" do computador, visualização de variáveis, "breakpoints",impressão dos fontes e
outras características que auxiliam o aprendizado das técnicas de programação, seu
nome é VISUALG.
A linguagem que o VisuAlg interpreta é bem simples: é uma versão portuguesa
dos pseudocódigos largamente utilizados nos livros de introdução à programação,
conhecida como "Portugol".

A Linguagem de Programação do VisuAlg


Introdução

A linguagem que o VisuAlg interpreta é bem simples: é uma versão portuguesa


dos pseudocódigos largamente utilizados nos livros de introdução à programação,
conhecida como "Portugol". Tomei a liberdade de acrescentar-lhe alguns comandos
novos, com o intuito de criar facilidades específicas para o ensino de técnicas de
elaboração de algoritmos. Inicialmente, pensava em criar uma sintaxe muito simples e
"liberal", para que o usuário se preocupasse apenas com a lógica da resolução dos

Sistemas Microcontrolados 28 � 129Prof. Fabiano Saldanha


30
Microcontroladores

problemas e não com as palavras-chave, pontos e vírgulas, etc. No entanto, cheguei


depois à conclusão de que alguma formalidade seria não só necessária como útil, para
criar um sentido de disciplina na elaboração do "código-fonte".
A linguagem do VisuAlg permite apenas um comando por linha: desse modo,
não há necessidade de tokens separadores de estruturas, como o ponto e vírgula em
Pascal. Também não existe o conceito de blocos de comandos (que correspondem ao
begin e end do Pascal e ao { e } do C), nem comandos de desvio incondicional como o
goto. Na versão atual do VisuAlg, com exceção das rotinas de entrada e saída, não há
nenhum subprograma embutido, tal como Inc0, Sqr0, Ord0, Chr0, Poso, CopyQ ou
outro.

Importante: para facilitar a digitação e evitar confusões, todas as palavras-chave do VisuAlg


foram implementadas sem acentos, cedilha, etc. Portanto, o tipo de dados lógico é definido
como logico, o comando se.. então.. senão é definido como se..entao..senao, e assim por
diante. O VisuAlg também não distingue maiúsculas e minúsculas no reconhecimento de
palavras-chave e nomes de variáveis.

Formato Básico do Pseudocódigo e Inclusão de Comentários

O formato básico do nosso pseudocódigo é o seguinte:

algoritmo "semnome"
li Função :
li Autor :
li Data :
li Seção de Declarações
inicio
li Seção de Comandos
fimalgoritmo

A primeira linha é composta pela palavra-chave algoritmo seguida do seu nome


delimitado por aspas duplas. Este nome será usado como título nas janelas de leitura de
dados (nas futuras versões do VisuAlg, talvez utilizemos este dado de outras formas). A
seção que se segue é a de declaração de variáveis, que termina com a linha que contém a
palavra-chave inicio. Deste ponto em diante está a seção de comandos, que continua até
a linha em que se encontre a palavra-chave fimalgoritmo. Esta última linha marca o
final do pseudocódigo: todo texto existente a partir dela é ignorado pelo interpretador.
O VisuAlg permite a inclusão de comentários: qualquer texto precedido de "//" é
ignorado, até se atingir o final da sua linha. Por este motivo, os comentários não se
estendem por mais de uma linha: quando se deseja escrever comentários mais longos,
que ocupem várias linhas, cada uma delas deverá começar por "//".

Tipos de Dados

O VisuAlg prevê quatro tipos de dados: inteiro, real, cadeia de caracteres e lógico (ou
booleano). As palavras-chave que os definem são as seguintes (observe que elas não têm
acentuação):

• inteiro: define variáveis numéricas do tipo inteiro, ou seja, sem casas decimais.
• real: define variáveis numéricas do tipo real, ou seja, com casas decimais.
• caractere: define variáveis do tipo string, ou seja, cadeia de caracteres.
• logico: define variáveis do tipo booleano, ou seja, com valor VERDADEIRO ou
FALSO.

Sistemas Microcontrolados 29 t 129Prof. Fabiano Saldanha


31
Microcontroladores

O VisuAlg permite também a declaração de variáveis estruturadas através da palavra-chave


vetor, como será explicado a seguir.

Nomes de Variáveis e sua Declaração

Os nomes das variáveis devem começar por uma letra e depois conter letras,
números ou underline, até um limite de 30 caracteres. As variáveis podem ser simples
ou estruturadas (na versão atual, os vetores podem ser de uma ou duas dimensões). Não
pode haver duas variáveis com o mesmo nome, com a natural exceção dos elementos de
um mesmo vetor.

A seção de declaração de variáveis começa com a palavra-chave var, e continua com as


seguintes sintaxes:

<lista-de-variáveis> <tipo-de-dado>
<lista-de-variáveis> vetor " ["<lista-de-intervalos>"]" de <tipo-de-
dado>

Na <lista-de-variáveis>, os nomes das variáveis estão separados por vírgulas. Na


<lista-de-intervalos>, os <intervalo> são separados por vírgulas, e têm a seguinte
sintaxe:

<intervalo>: <valor-inicial> .. <valor-final>

Na versão atual do VisuAlg, tanto <valor-inicial> como <valor-final> devem ser


inteiros. Além disso, exige-se evidentemente que <valor-final> seja maior do que
<Valor-inicial>.

Exemplos:

var a: inteiro
Valorl, Valor2: real
vet: vetor [l.. 10] de real
matriz: vetor [O .. 4,8 .. 10] de inteiro
nome do aluno: caractere
sinalizador: logico

Note que não há a necessidade de ponto e vírgula após cada declaração: basta
pular linha. A declaração de vetores é análoga à linguagem Pascal: a variável vet acima
tem 10 elementos, com os índices de [1] a [10], enquanto matriz corresponde a 15
elementos com índices [0,8], [0,9], [0,10], [1,8], [1,9], [1,10], ... até [4,10]. O número
total de variáveis suportado pelo VisuAlg é 500 (cada elemento de um vetor é contado
individualmente).

Constantes e Comando de Atribuição

O VisuAlg tem três tipos de constantes:

• Numéricos: são valores numéricos escritos na forma usual das linguagens de


programação. Podem ser inteiros ou reais. Neste último caso, o separador de decimais
é o ponto e não a vírgula, independente da configuração regional do computador onde
o VisuAlg está sendo executado. O VisuAlg também não suporta separadores de
milhares.
• Caracteres: qualquer cadeia de caracteres delimitada por aspas duplas (").
• Lógicos: admite os valores VERDADEIRO ou FALSO.

Sistemas Microcontrolados 30 t 129Prof. Fabiano Saldanha


32
Microcontroladores

A atribuição de valores a variáveis é feita com o operador<-. Do seu lado esquerdo


fica a variável à qual está sendo atribuído o valor, e à sua direita pode-se colocar
qualquer expressão ( constantes, variáveis, expressões numéricas), desde que seu
resultado tenha tipo igual ao da variável.

Alguns exemplos de atribuições, usando as variáveis declaradas acima:

a<- 3
Valorl <- 1.5
Valor2<- Valorl + a
vet[l] <- vet[l] + (a* 3)
matriz[3,9] <- a/4 - 5
nome do aluno<- "José da Silva"
sinalizador <- FALSO

Operadores Aritméticos

D
Operadores unários, isto é, são aplicados a um único operando. São os operadores

D
aritméticos de maior precedência. Exemplos: - 3, +x. Enquanto o operador unário -
inverte o sinal do seu operando, o operador + não altera o valor em nada o seu valor.


Operador de divisão inteira. Por exemplo, 5 \ 2 = 2. Tem a mesma precedência do
operador de divisão tradicional.
Operadores aritméticos tradicionais de adição, subtração, multiplicação e divisão. Por
convenção,* e / têm precedência sobre + e - . Para modificar a ordem de avaliação
/ das operações, é necessário usar parênteses como em qualquer expressão aritmética.

� Operador de módulo (isto é, resto da divisão inteira). Por exemplo, s MOD 3 = 2. Tem
a mesma precedência do operador de divisão tradicional.

D Operador de potenciação. Por exemplo, 5 A 2 = 25. Tem a maior precedência entre os


operadores aritméticos binários (aqueles que têm dois operandos).

Operadores de Caracteres

D
Operador de concatenação de strings (isto é, cadeias de caracteres), quando usado
com dois valores (variáveis ou constantes) do tipo "caractere". Por exemplo: "Rio " +
" de Janeiro" = "Rio de Janeiro".

Operadores Relacionais

=, <, Respectivamente: igual, menor que, maior que, menor ou igual a, maior ou igual a,
>, diferente de. São utilizados em expressões lógicas para se testar a relação entre dois
<=,
valores do mesmo tipo. Exemplos: 3 = 3 ( 3 é igual a 3?) resulta em VERDADEIRO ;
>=,
<> "A" > "B" ("A" está depois de "B" na ordem alfabética?) resulta em FALSO.

Importante: No VisuAlg, as comparações entre strings não diferenciam as letras maiúsculas


das minúsculas. Assim, ABC é igual a abc Valores lógicos obedecem à seguinte ordem:
11 II II 11•

FALSO< VERDADEIRO.

Operadores Lógicos

Sistemas Microcontrolados 31 � 129Prof. Fabiano Saldanha


33
Microcontroladores

E]
Operador unário de negação. nao VERDADEIRO = FALSO, e nao FALSO =
VERDADEIRO. Tem a maior precedência entre os operadores lógicos. Equivale ao NOT

B
do Pascal.

8
Operador que resulta VERDADEIRO quando um dos seus operandos lógicos for
verdadeiro. Equivale ao OR do Pascal.
Operador que resulta VERDADEIRO somente se seus dois operandos lógicos forem

B
verdadeiros. Equivale ao AND do Pascal.
Operador que resulta VERDADEIRO se seus dois operandos lógicos forem diferentes, e
FALSO se forem iguais. Equivale ao XOR do Pascal.

Comandos de Saída de Dados

escreva (<lista-de-expressões>)

Escreve no dispositivo de saída padrão (isto é, na área à direita da metade


inferior da tela do VisuAlg) o conteúdo de cada uma das expressões que compõem
<lista-de-expressões>. As expressões dentro desta lista devem estar separadas por
vírgulas; depois de serem avaliadas, seus resultados são impressos na ordem indicada. É
equivalente ao comando write do Pascal.
De modo semelhante a Pascal, é possível especificar o número de espaços no
qual se deseja escrever um determinado valor. Por exemplo, o comando escreva(x:5)
escreve o valor da variável x em 5 espaços, alinhado-o à direita. Para variáveis reais,
pode-se também especificar o número de casas fracionárias que serão exibidas. Por
exemplo, considerando y como uma variável real, o comando escreva(y:6:2)escreve seu
valor em 6 espaços colocando 2 casas decimais.

escreval (<lista-de-expressões>).

Idem ao anterior, com a única diferença que pula uma linha em seguida. É equivalente ao
writeln do Pascal.

Exemplos:

algoritmo "exemplo"
var x: real
y: inteiro
a: caractere
1: logico
inicio
X <- 2.5
y <- 6
a <- "teste"
1 <- VERDADEIRO
escreval ("x", x:4:1, y+3:4) // Escreve: x 2.5 9
escreval (a, "ok") // Escreve: testeok (e depois pula linha)
escreval (a, " ok") // Escreve: teste ok (e depois pula
linha)
escreval (a + " ok") // Escreve: teste ok (e depois pula
linha)
escreva (1) // Escreve: VERDADEIRO
fimalgoritmo

Note que o VisuAlg separa expressões do tipo numérico e lógico com um espaço à esquerda,
mas não as expressões do tipo caractere, para que assim possa haver a concatenação.

Sistemas Microcontrolados 32 � 129Prof. Fabiano Saldanha


34
Microcontroladores

(AULA 03)
1 - INTRODUÇÃO
Quando se deseja separar expressões do tipo caractere, é necessário acrescentar espaços
nos locais adequados.

Comando de Entrada de Dados

leia (<lista-de-variáveis>)

Recebe valores digitados pelos usuário, atribuindo-os às variáveis cujos nomes estão em
<lista-de-variáveis> (é respeitada a ordem especificada nesta lista). É análogo ao
comando read do Pascal.

Veja no exemplo abaixo o resultado:

algoritmo "exemplo 1" Leitura de Dados - ,


var x: inteiro;
inicio
leia (x)
escreva (x)

_I
fimalgoritmo
L
O comando de leitura acima irá exibir
uma janela como a que se vê ao Cancelar
lado, com a mensagem padrão:
"Entre com o valor de
<nome-de-variável> 11

Se você clicar em Cancelar ou teclar Esc durante a leitura de dados, o programa


será imediatamente interrompido.

Comando de Desvio Condicional

se <expressão-lógica> entao
<seqüência-de-comandos>
fimse

Ao encontrar este comando, o VisuAlg analisa a <expressão-lógica>. Se o seu


resultado for VERDADEIRO, todos os comandos da <seqüência-de-comandos> (entre
esta linha e a linha com fimse) são executados. Se o resultado for FALSO, estes
comandos são desprezados e a execução do algoritmo continua a partir da primeira linha
depois do fimse.

se <expressão-lógica> entao
<seqüência-de-comandos-1>
senao
<seqüência-de-comandos-2>
fimse

Nesta outra forma do comando, se o resultado da avaliação de <expressão­


lógica> for VERDADEIRO, todos os comandos da <seqüência-de-comandos-]> (entre
esta linha e a linha com senao) são executados, e a execução continua depois a partir da
primeira linha depois do fimse. Se o resultado for FALSO, estes comandos são
desprezados e o algoritmo continua a ser executado a partir da primeira linha depois do
senao, executando todos os comandos da <seqüência-de-comandos-2> (até a linha com
fimse).
Estes comandos equivalem ao if.. then e if.. then... e/se do Pascal. Note que não

35
Microcontroladores

há necessidade de delimitadores de bloco (como begin e end), pois as seqüências de


comandos já estão delimitadas pelas palavras-chave senao e fimse. O VisuAlg permite o
aninhamento desses comandos de desvio condicional.

Comando de Seleção Múltipla

O VisuAlg implementa (com certas variações) o comando case do Pascal. A sintaxe é a


seguinte:

escolha <expressão-de-seleção>
caso <expll >, <expl2>, ... , <expln>
<seqüência-de-comandos-1>
caso <exp21>, <exp22>, ... , <exp2n>
<seqüência-de-comandos-2>

outrocaso
<seqüência-de-comandos-extra>
fimescolha

Veja o exemplo a seguir, que ilustra bem o que faz este comando:

algoritmo "Times"
var time: caractere
inicio
escreva ("Entre com o nome de um time de futebol: ")
leia (time)
escolha time
caso "Flamengo", "Fluminense", "Vasco", "Botafogo"
escreval ("É um time carioca.")
caso "São Paulo", "Palmeiras", "Santos", "Corínthians"
escreval ("É um time paulista.")
outrocaso
escreval ("É de outro estado.")
fimescolha
fimalgoritmo

Comandos de Repetição

O VisuAlg implementa as três estruturas de repetição usuais nas linguagens de


programação: o laço contado para...ate...faca (similar ao for. .. to... do do Pascal), e os
laços condicionados enquanto...faca (similar ao while... do) e repita...ate (similar ao
repeat... until). A sintaxe destes comandos é explicada a seguir.

Para ... faça

Esta estrutura repete uma seqüência de comandos um determinado número de vezes.

para <variável> de <valor-inicial> ate <valor-limite> [passo


<incremento>] faca
<seqüência-de-comandos>
fimpara

1 É a variável contadora que controla o número de repetições do laço. Na


<Variável > versão atual. deve ser necessariamente uma variável do tipo inteiro,
1 como todas as expressões deste comando.
1 <valor-inicial> IIÉ uma expressão que especifica o valor de inicialização da variável 1

Sistemas Microcontrolados 34 � 129Prof. Fabiano Saldanha


36
Microcontroladores

1 <valor-limite >
1 !contadora antes da primeira repetição do laço.
É uma expressão que especifica o valor máximo que a variável
contadora pode alcançar.
1
É opcional. Quando presente, precedida pela palavra passo, é uma
expressão que especifica o incremento que será acrescentado à variável
contadora em cada repetição do laço. Quando esta opção não é
utilizada, o valor padrão de <incremento> é 1. Vale a pena ter em
<incremento >
conta que também é possível especificar valores negativos para
<incremento>. Por outro lado, se a avaliação da expressão
<incremento > resultar em valor nulo, a execução do algoritmo será
interrompida, com a impressão de uma mensagem de erro.
Indica o fim da seqüência de comandos a serem repetidos. Cada vez
que o programa chega neste ponto, é acrescentado à variável contadora
o valor de <incremento >, e comparado a <valor-limite >. Se for
fimpara menor ou igual (ou maior ou igual, quando <incremento > for
negativo), a seqüência de comandos será executada mais uma vez;
caso contrário, a execução prosseguirá a partir do primeiro comando que
esteja após o fimpara.

<valor-inicial >, <valor-limite > e <incremento > são avaliados uma única vez
antes da execução da primeira repetição, e não se alteram durante a execução do laço,
mesmo que variáveis eventualmente presentes nessas expressões tenham seus valores
alterados.

No exemplo a seguir, os números de 1 a 1O são exibidos em ordem crescente.

algoritmo "Números de 1 a 10"


var j: inteiro
inicio
para j de 1 ate 10 faca
escreva (j:3)
fimpara
fimalgoritmo

Importante: Se, logo no início da primeira repetição, <valor-inicial > for maior que
<valor-limite > (ou menor, quando <incremento> for negativo), o laço não será
executado nenhuma vez. O exemplo a seguir não imprime nada.

algoritmo "Numeras de 10 a 1 (não funciona)"


var j: inteiro
inicio
para j de 10 ate 1 faca
escreva (j:3)
fimpara
fimalgoritmo

Este outro exempo, no entanto, funcionará por causa do passo -1:

algoritmo "Numeras de 10 a 1 (este funciona)"


var j: inteiro
inicio
para j de 10 ate 1 passo -1 faca
escreva (j:3)
fimpara
fimalgoritmo

Sistemas Microcontrolados 35 � 129Prof. Fabiano Saldanha


37
Microcontroladores

Enquanto ... faça

Esta estrutura repete uma seqüência de comandos enquanto uma determinada condição
(especificada através de uma expressão lógica) for satisfeita.

enquanto <expressão-lógica> faca


<seqüência-de-comandos>
fimenquanto

Esta expressão que é avaliada antes de cada repetição do laço.


<expressão-lógica> Quando seu resultado for VERDADEIRO, <seqüência-de-
comandos> é executada.

Indica o fim da <seqüência-de-comandos> que será repetida.


Cada vez que a execução atinge este ponto, volta-se ao início do
laço para que <expressão-lógica> seja avaliada novamente.
fimenquanto Se o resultado desta avaliação for VERDADEIRO, a <seqüência-
de-comandos> será executada mais uma vez; caso contrário, a
execução prosseguirá a partir do primeiro comando após
fimenquanto.

O mesmo exemplo anterior pode ser resolvido com esta estrutura de repetição:

algoritmo "Números de 1 a 10 (com enquanto... faca)"


var j: inteiro
inicio
j <- 1
enquanto j <= 10 faca
escreva (j:3)
j <- j + 1
fimenquanto
fimalgoritmo

Importante: Como o laço enquanto... faca testa sua condição de parada antes de executar
sua seqüência de comandos, esta seqüência poderá ser executada zero ou mais vezes.

Repita ... até

Esta estrutrura repete uma seqüência de comandos até que uma determinada condição
(especificada através de uma expressão lógica) seja satisfeita.

repita
<seqüência-de-comandos>
ate <expressão-lógica>

1 repita lllndica o início do laço. 1


Indica o fim da <seqüência-de-comandos> a serem repetidos.
Cada vez que o programa chega neste ponto, <expressão-lógica>
ate <expressão-
lógica>
é avaliada: se seu resultado for FALSO, os comandos presentes entre
esta linha e a linha repita são executados; caso contrário, a
execução prosseguirá a partir do primeiro comando após esta linha.

Considerando ainda o mesmo exemplo:

algoritmo "Números de 1 a 10 (com repita)"


var j: inteiro

Sistemas Microcontrolados 36 � 129Prof. Fabiano Saldanha


38
Microcontroladores

inicio
j <- 1
repita
escreva (j:3)
j <- j + 1
ate j > 10
fimalgoritmo

Importante: Como o laço repita...ate testa sua condição de parada depois de executar
sua seqüência de comandos, esta seqüência poderá ser executada uma ou mais vezes.

Comando Interrompa

As três estruturas de repetição acima permitem o uso do comando interrompa,


que causa urna saída imediata do laço. Embora esta técnica esteja de certa forma ern
desacordo corn os princípios da programação estruturada, o comando interrompa foi
incluído no VisuAlg por ser encontrado na literatura de introdução à programação e
rnesrno ern linguagens corno o Object Pascal (Delphi/Kylix), Clipper, VB, etc. Seu uso é
exemplificado a seguir:

algoritmo "Números de 1 a 10 (com interrompa)"


var x: inteiro
inicio
X <- 0
repita
X <- X + 1
escreva (x:3)
se x = 10 entao
interrompa
fimse
ate falso
fimalgoritmo

O VisuAlg permite ainda uma forma alternativa do comando repita...ate, com a seguinte
sintaxe:

algoritmo "Números de 1 a 10 (com interrompa) II"


var x: inteiro
inicio
X <- 0
repita
X <- X + 1
escreva (x:3)
se x = 10 entao
interrompa
fimse
fimrepita
fimalgoritmo

Corn esta sintaxe alternativa, o uso do interrompa é obrigatório, pois é a única


maneira de se sair do laço repita...firnrepita; caso contrário, este laço seria executado
indeterminadamente.
Subprograma é urn programa que auxilia o programa principal através da
realização de urna determinada subtarefa. Tarnbérn costuma receber os nomes de sub­
rotina, procedimento, método ou módulo. Os subprogramas são chamados dentro do
corpo do programa principal corno se fossem comandos. Após seu término, a execução

Sistemas Microcontrolados 37 t 129Prof. Fabiano Saldanha


39
Microcontroladores

continua a partir do ponto onde foi chamado. É importante compreender que a chamada
de um subprograma simplesmente gera um desvio provisório no fluxo de execução.
Há um caso particular de subprograma que recebe o nome de função. Uma
função, além de executar uma determinada tarefa, retoma um valor para quem a
chamou, que é o resultado da sua execução. Por este motivo, a chamada de uma função
aparece no corpo do programa principal como uma expressão, e não como um comando.
Cada subprograma, além de ter acesso às variáveis do programa que o chamou
(são as variáveis globais), pode ter suas próprias variáveis (são as variáveis locais), que
existem apenas durante sua chamada.
Ao se chamar um subprograma, também é possível passar-lhe determinadas
informações que recebem o nome de parâmetros (são valores que, na linha de chamada,
ficam entre os parênteses e que estão separados por vírgulas). A quantidade dos
parâmetros, sua seqüência e respectivos tipos não podem mudar: devem estar de acordo
com o que foi especificado na sua correspondente declaração.
Para se criar subprogramas, é preciso descrevê-los após a declaração das variáveis e
antes do corpo do programa principal. O VisuAlg possibilita declaração e chamada de
subprogramas nos moldes da linguagem Pascal, ou seja, procedimentos e funções com
passagem de parâmetros por valor ou referência. Isso será explicado a seguir.

Procedimentos

Em VisuAlg, procedimento é um subprograma que não retoma nenhum valor


(corresponde ao procedure do Pascal). Sua declaração, que deve estar entre o final da
declaração de variáveis e a linha inicio do programa principal, segue a sintaxe abaixo:

procedimento <nome-de-procedimento> [(<seqüência-de-declarações-de­


parâmetros>)]
li Seção de Declarações Internas
inicio
li Seção de Comandos
fimprocedimento

O <nome-de-procedimento> obedece as mesmas regras de nomenclatura das variáveis.


Por outro lado, a <seqüência-de-declarações-de-parâmetros> é uma seqüência de

[var] <seqüência-de-parâmetros>: <tipo-de-dado>

separadas por ponto e vírgula. A presença (opcional) da palavra-chave var indica passagem
de parâmetros por referência; caso contrário, a passagem será por valor.

Por sua vez, <seqüência-de-parâmetros> é uma seqüência de nomes de parâmetros


(também obedecem a mesma regra de nomenclatura de variáveis) separados por vírgulas.

De modo análogo ao programa principal, a seção de declaração internas começa com a


palavra-chave var, e continua com a seguinte sintaxe:

<lista-de-variáveis> : <tipo-de-dado>

Nos próximos exemplos, através de um subprograma soma, será calculada a


soma entre os valores 4 e -9 (ou seja, será obtido o resultado 13) que o programa
principal imprimirá em seguida. No primeiro caso, um procedimento sem parâmetros
utiliza uma variável local aux para armazenar provisoriamente o resultado deste cálculo

Sistemas Microcontrolados 38 t 129Prof. Fabiano Saldanha


40
Microcontroladores

(evidentemente, esta variável é desnecessária, mas está aí apenas para ilustrar o


exemplo), antes de atribuí-lo à variável global res:

procedimento soma
var aux: inteiro
inicio
// n, m e res são variáveis globais
aux <- n + m
res <- aux
fimprocedimento

No programa principal deve haver os seguintes comandos:


n <- 4
m <- -9
soma
escreva(res)

A mesma tarefa poderia ser executada através de um procedimento com parâmetros, como
descrito abaixo:

procedimento soma (x,y: inteiro)


inicio
// res é variável global
res <- x + y
fimprocedimento

No programa principal deve haver os seguintes comandos:


n <- 4
m <- -9
soma(n,m)
escreva(res)

A passagem de parâmetros do exemplo acima chama-se passagem por valor.


Neste caso, o subprograma simplesmente recebe um valor que utiliza durante sua
execução. Durante essa execução, os parâmetros passados por valor são análogos às
suas variáveis locais, mas com uma única diferença: receberam um valor inicial no
momento em que o subprograma foi chamado.

Funções

Em VisuAlg, função é um subprograma que retoma um valor (corresponde ao


function do Pascal). De modo análogo aos procedimentos, sua declaração deve estar
entre o final da declaração de variáveis e a linha inicio do programa principal, e segue a
sintaxe abaixo:

funcao <nome-de-função> [(<seqüência-de-declarações-de-parâmetros>)]:


<tipo-de-dado>
li Seção de Declarações Internas
inicio
li Seção de Comandos
fimfuncao

O <nome-de-função> obedece as mesmas regras de nomenclatura das variáveis. Por outro


lado, a <seqüência-de-declarações-de-parâmetros> é uma seqüência de

[var] <seqüência-de-parâmetros>: <tipo-de-dado>

Sistemas Microcontrolados 39 t 129Prof. Fabiano Saldanha


41
Microcontroladores

separadas por ponto e vírgula. A presença (opcional) da palavra-chave var indica


passagem de parâmetros por referência; caso contrário, a passagem será por valor.
Por sua vez, <seqüência-de-parâmetros> é urna seqüência de nomes de parâmetros
(tarnbérn obedecem a rnesrna regra de nomenclatura de variáveis) separados por
vírgulas.
O valor retomado pela função será do tipo especificado na sua declaração (logo
após os dois pontos). Ern alguma parte da função (de rnodo geral, no seu final), este
valor deve ser retomado através do comando retome.
De rnodo análogo ao programa principal, a seção de declaração internas começa
corn a palavra-chave var, e continua corn a seguinte sintaxe:

<lista-de-variáveis> : <tipo-de-dado>

Voltando ao exemplo anterior, no qual calculamos e irnprirnirnos a sorna entre os


valores 4 e -9, vamos mostrar corno isso poderia ser feito através de urna função sem
parâmetros. Ela tarnbérn utiliza urna variável local aux para armazenar
provisoriamente o resultado deste cálculo, antes de atribuí-lo à variável global res:

funcao soma: inteiro


var aux: inteiro
inicio
// n, m e res são variáveis globais
aux <- n + m
retorne aux
fimfuncao

No programa principal deve haver os seguintes comandos:


n <- 4
m <- -9
res <- soma
escreva(res)

Se realizássemos essa mesma tarefa com uma função com parâmetros passados por valor,
poderia ser do seguinte modo:

funcao soma (x,y: inteiro): inteiro


inicio
retorne x + y
fimfuncao

No programa principal deve haver os seguintes comandos:


n <- 4
m <- -9
res <- soma(n,m)
escreva(res)

Passagem de Parâmetros por Referência

Há ainda urna outra forma de passagem de parâmetros para subprogramas: é a passagem


por referência. Neste caso, o subprograma não recebe apenas urn valor, rnas sirn o
endereço de urna variável global. Portanto, qualquer modificação que for realizada no
conteúdo deste parâmetro afetará tarnbérn a variável global que está associada a ele.
Durante a execução do subprograma, os parâmetros passados por referência são
análogos às variáveis globais. No VisuAlg, de forma análoga a Pascal, essa passagem é

Sistemas Microcontrolados 40 t 129Prof. Fabiano Saldanha


42
Microcontroladores

feita através da palavra var na declaração do parâmetro.


Voltando ao exemplo da soma, o procedimento abaixo realiza a mesma tarefa
utilizando passagem de parâmetros por referência:

procedimento soma (x,y: inteiro; var result: inteiro)


inicio
result <- x + y
fimprocedimento

No programa principal deve haver os seguintes comandos:


n <- 4
m <- -9
soma(n,m,res)
escreva(res)

Recursão e Aninhamento

A atual versão do VisuAlg permite recursão, isto é, a possibilidade de que um


subprograma possa chamar a si mesmo. A função do exemplo abaixo calcula
recursivamente o fatorial do número inteiro que recebe como parâmetro:

funcao fatorial (v: inteiro): inteiro


inicio
se v <= 2 entao
retorne v
senao
retorne v * fatorial(v-1)
fimse
fimfuncao

Em Pascal, é permitido o aninhamento de subprogramas, isto é, cada


subprograma também pode ter seus próprios subprogramas. No entanto, esta
característica dificulta a elaboração dos compiladores e, na prática, não é muito
importante. Por este motivo, ela não é permitida na maioria das linguagens de
programação (como C, por exemplo), e o VisuAlg não a implementa.
O VisuAlg implementa algumas extensões às linguagens "tradicionais" de
programação, com o intuito principal de ajudar o seu uso como ferramenta de ensino.
Elas são mostradas a seguir.

Comando Aleatório

Muitas vezes a digitação de dados para o teste de um programa toma-se uma


tarefa entediante. Com o uso do comando aleatorio do VisuAlg, sempre que um
comando leia for encontrado, a digitação de valores numéricos e/ou caracteres é
substituída por uma geração aleatória. Este comando não afeta a leitura de variáveis
lógicas: com certeza, uma coisa pouco usual em programação...

Este comando tem as seguintes sintaxes:

Sistemas Microcontrolados 41 t 129Prof. Fabiano Saldanha


43
Microcontroladores

Ativa a geração de valores aleatórios que substituem a


digitação de dados. A palavra-chave on é opcional. A faixa
aleatorio [on] padrão de valores gerados é de O a 100 inclusive. Para a
geração de dados do tipo caractere, não há uma faixa pré-
estabelecida: os dados gerados serão sempre strings de 5
letras maiúsculas.
Ativa a geração de dados numéricos aleatórios
estabelecendo uma faixa de valores mínimos e máximos. Se
apenas < valorl > for fornecido, a faixa será de O a
<valorl > inclusive; caso contrário, a faixa será de
aleatorio <valorl > [
<valorl > a <valor2 > inclusive. Se <valor2 > for menor
/

<Valor2 > l
que <valorl >, o VisuAlg os trocará para que a faixa fique
correta.

1
Importante: <valorl > e <valor2 > devem ser constantes
numéricas, e não expressões.

1 aleatorio off
Desativa a geração de valores aleatórios. A palavra-chave
off é obrigatória.

Comando Arquivo

Muitas vezes é necessário repetir os testes de um programa com uma série igual
de dados. Para casos como este, o VisuAlg permite o armazenamento de dados em um
arquivo-texto, obtendo deles os dados ao executar os comandos leia.
Esta característica funciona da seguinte maneira:
1) Se não existir o arquivo com nome especificado, o VisuAlg fará uma leitura de
dados através da digitação, armazenando os dados lidos neste arquivo, na ordem em que
forem fornecidos.
2) Se o arquivo existir, o VisuAlg obterá os dados deste arquivo até chegar ao seu
fim. Daí em diante, fará as leituras de dados através da digitação.
3) Somente um comando arquivo pode ser empregado em cada pseudocódigo, e ele
deverá estar na seção de declarações (dependendo do "sucesso" desta característica, em
futuras versões ela poderá ser melhorada...).
4) Caso não seja fornecido um caminho, o VisuAlg irá procurar este arquivo na pasta
de trabalho corrente (geralmente, é a pasta onde o programa VISUALG.EXE está). Este
comando não prevê uma extensão padrão; portanto, a especificação do nome do arquivo
deve ser completa, inclusive com sua extensão (por exemplo, .txt, .dat, etc.).

A sintaxe do comando é:

arquivo <nome-de-arquivo>

<nome-de-arquivo> é uma constante caractere (entre aspas duplas). Veja o exemplo a seguir:

algoritmo "lendo do arquivo"


arquivo "teste.txt"
var x,y: inteiro
inicio
para x de 1 ate 5 faca
leia (y)
fimpara
fimalgoritmo

Comando Timer

Sistemas Microcontrolados 42 � 129Prof. Fabiano Saldanha


44
var x,y: inteiro
inicio Microcontroladores
para x de 1 ate 5 faca
leia (y)
fimpara
fimalgoritmo

Comando Timer

Embora o VisuAlg seja um interpretador de pseudocódigo, seu desempenho é


muito bom: o tempo gasto para interpretar cada linha digitada é apenas uma fração de
Sistemas
segundo. Entretanto, por Microcontrolados
motivos 42 � 129Prof.
educacionais, podeFabiano Saldanha
ser conveniente exibir o fluxo de
execução do pseudocódigo comando por comando, em "câmera lenta". O comando
timer serve para este propósito: insere um atraso (que pode ser especificado) antes da
execução de cada linha. Além disso, realça em fundo azul o comando que está sendo
executado, da mesma forma que na execução passo a passo.

Sua sintaxe é a seguinte:

1 timer on IIAtiva o timer. 1


Ativa o timer estabelecendo seu tempo de atraso em milissegundos.
O valor padrão é 500, que equivale a meio segundo. O argumento
timer <tempo-de-
<tempo-de-atraso> deve ser uma constante inteira com valor
atraso>
entre O e 10000. Valores menores que O são corrigidos para O, e
maiores que 10000 para 10000.
1 timer off ll□esativa o timer. 1
Ao longo do pseudocódigo, pode haver vários comandos timer. Todos eles
devem estar na seção de comandos. Uma vez ativado, o atraso na execução dos
comandos será mantido até se chegar ao final do pseudocódigo ou até ser encontrado
um comando timer off.

Comandos de Depuração

Nenhum ambiente de desenvolvimento está completo se não houver a


possibilidade de se inserir pontos de interrupção (breakpoints) no pseudocódigo para
fins de depuração. VisuAlg implementa dois comandos que auxiliam a depuração ou
análise de um pseudocódigo: o comando pausa e o comando debug.

Comando Pausa

Sua sintaxe é simplesmente:

pausa

Este comando insere uma interrupção incondicional no pseudocódigo. Quando


ele é encontrado, o VisuAlg pára a execução do pseudocódigo e espera alguma ação do
programador. Neste momento, é possível: analisar os valores das variáveis ou das saídas
produzidas até o momento; executar o pseudocódigo passo a passo (com F8); prosseguir
sua execução normalmente (com F9); ou simplesmente terminá-lo (com Ctrl-F2). Com
exceção da alteração do texto do pseudocódigo, todas as funções do VisuAlg estão
disponíveis.

Comando Debug

Sua sintaxe é:

debug <expressão-lógica>

Se a avaliação de <expressão-lógica> resultar em valor VERDADEIRO, a

45
Microcontroladores

execução do pseudocódigo será interrompida como no comando pausa. Dessa forma, é


possível a inserção de um breakpoint condicional no pseudocódigo.

Comando Eco

Sua sintaxe é:

eco on I off

Este comando ativa (eco on) ou desativa (eco ofl) a impressão dos dados de
entrada na saída-padrão do VisuAlg, ou seja, na área à direita da parte inferior da tela.
Esta característica pode ser útil quando houver uma grande quantidade de dados de
entrada, e se deseja apenas analisar a saída produzida. Convém utilizá-la também
quando os dados de entrada provêm de um arquivo já conhecido.

Comando Cronômetro

Sua sintaxe é:

cronometro on I off

Este comando ativa (cronometro on) ou desativa (cronometro ofl) o cronômetro


interno do VisuAlg. Quando o comando cronometro on é encontrado, o VisuAlg
imprime na saída-padrão a informação "Cronômetro iniciado.", e começa a contar o
tempo em milissegundos. Quando o comando cronometro off é encontrado, o VisuAlg
imprime na saída-padrão a informação "Cronômetro terminado. Tempo decorrido: xx
segundo(s) e xx ms". Este comando é útil na análise de desempenho de algoritmos
(ordenação, busca, etc.).

Comando Limpatela

Sua sintaxe é

limpa tela

Este comando simplesmente limpa a tela DOS do Visualg (a simulação da tela do computador).
Ele não afeta a "tela" que existe na parte inferior direita da janela principal do Visualg.

Programação assembly para PIC 8 bits

Mais fácil do que a linguagem binária do microcontrolador, e mais difícil do que as


demais linguagens, ASSEMBLY significa "montagem", e é o termo que melhor define
o processo de criação do arquivo em linguagem binária. Para que a montagem ocorra,
faz-se necessário o uso de um programa montador, então chamado de "ASSEMBLER".



INICc mm,iw DxD>
moV'Nl,RISJ\
btmPOA.lA.1
1:1010 D[ SV'1
gnrn l)fS.V7'
NDf<TloDOR
f'S,SEMDLEAI > 01010010101001
01001010100101
11101001001010
00110101011111
01001010110111

FIG. 14: Elementos da programação ASSEMBLY


Fonte: Centro Tecnológico de Mecatrónica SENAI

Sistemas Microcontrolados 44 � 129Prof. Fabiano Saldanha


46
Microcontroladores

O montador (assembler) permite que uma linha de instrução que está expressa em
linguagem de símbolos de fácil assimilação escritas em caracteres alfanuméricos, seja
traduzida diretamente para instruções binárias. Ou seja, ao invés de se inserir no arquivo
o comando em linguagem de máquina (exemplo em hexadecimal 0x342f), o
programador digita o comando em forma de uma palavra seguido de um parâmetro
expresso em alfanumérico (exemplo GOTO ROTULO1).
Para a maioria dos programas montadores, também é possível se criar "MACROS",
que são trechos de programas reutilizáveis, como subrotinas, mas com uma maior
flexibilidade.
Outra característica do montador é que no momento de gerar o arquivo binário
(arquivo HEX), o montador recalcula todos os endereços de memória, gerando
instruções adequadas nos desvios e acessos aos recursos fisicos. Isso facilita a
programação em relação à linguagem binária de máquina, mas não elimina algumas
dificuldades.
Por se tratar de uma tradução simplificada, o montador não admite que utilizemos
comandos correspondentes a instruções inexistentes no microcontrolador de destino. Ou
seja, se estamos programando um microcontrolador PIC l 8F4431, que possui a instrução
de multiplicação, não poderemos usar este mesmo programa em um PIC16F877 que não
possui esta instrução, havendo a necessidade de reescrever este trecho do programa para
adequá-lo ao novo hardware.
Portanto, quanto à linguagem ASSEMBLY e a qualidade do software desenvolvido
através deste recurso, podemos afirmar o seguinte
• A linguagem Assembly é pouco portável, pois exige uma grande adaptação no
programa fonte ao se migrar para outro hardware. Ou seja, caso tenhamos que substituir
o microcontrolador por outro modelo, na maioria dos casos toma-se necessária à
reconstrução de grande parte do programa fonte para garantir a mesma funcionalidade.
• Assembly permite que o programa tenha um baixo custo de memória, uma vez que o
programador utiliza somente as instruções necessárias para cada operação. Desta forma,
quando precisamos optar por um hardware com pouca memória RAM e ROM, esta
linguagem indubitavelmente é a melhor escolha.
• Assembly permite gerar programas de excelente eficiência, pois o programador pode
utilizar recursos e técnicas que aperfeiçoem o desenvolvimento da aplicação para o
objetivo proposto.
Em situações de controle de tempo real, esta linguagem pode se mostrar bastante
adequada.
• A linguagem Assembly oferece baixa manutenibilidade, ou seja, o programador deve
tomar cuidado para comentar as linhas e organizar o programa fonte da melhor maneira
possível, pois quando haverá necessidade de manutenção neste programa, certamente
será necessário muito mais tempo do que em outras linguagens.
• A complexidade dos programas escritos em Assembly é bastante alta, agravado pelo
fato dos microcontroladores Microchip PIC aqui citados serem microcontroladores
RISC, que possuem um conjunto de instruções reduzido. Desta forma, quando o
programador necessitar gerar uma operação mais complexa, deverá desmembrá-la em
várias operações mais simples, trazendo uma maior extensão ao programa fonte, e uma
maior necessidade de conhecimento (por parte do programador) de técnicas de
programação que solucionem o problema.
• O reaproveitamento de código em Assembly não é muito comum. Geralmente o
programador Assembly é obrigado a reescrever ou alterar suas rotinas padronizadas,
adequando-as para cada necessidade. Isso leva a um menor reaproveitamento de rotinas
já escritas, e a um maior esforço de programação.

Sistemas Microcontrolados 45 t 129Prof. Fabiano Saldanha


47
Microcontroladores

Visto estas características, a linguagem Assembly é indicada nos casos onde não
há problema quanto ao tempo de desenvolvimento, e onde o fator crítico é o custo do
hardware e a eficiência. Portanto, é mais adequada em projetos que necessitem de
eficiência e funcionalidade, não havendo problema quanto à portabilidade e a
manutenibilidade.
É comum utilizar este tipo de linguagem em microcontroladores presentes nos
produtos que serão fabricadas em série e em grades quantidades, onde alguns centavos
geram um impacto significativo devido à escala produtiva, levando a escolha de
microcontroladores com pouca memória, e onde se admite um tempo de projeto
relativamente maior do que o tempo tolerado para o desenvolvimento de uma aplicação
dedicada. 3 .1.1 O Montador MP ASM e o ambiente MPLAB.
A Microchip disponibiliza gratuitamente em seu "site" uma importante
ferramenta de programação, conhecida como MPLAB IDE. É um completo ambiente de
programação para microcontroladores Microchip, que na sua versão gratuita também
integra um montador assembly chamado de MP ASM.
Segundo a Microchip ... "O que é o MPLAB IDE? MPLAB Integrated Development
Environment (IDE) é um pacote de ferramentas integradas e gratuitas para o
desenvolvimento de aplicações dedicadas aos microcontroladores Microchip
PICmicro® e dsPIC®. O MPLAB IDE é executado como uma aplicação 32 bits para o
MS Windows®. É fácil de se utilizar e agrega componentes de software gratuitos para
um rápido desenvolvimento de aplicações e um poderoso depurador. MPLAB IDE
também disponibiliza uma simples e unificada interface gráfica ao usuário para
desenvolvimento de aplicações de hardware e software utilizaremos o compilador
MP ASM para compilar nossos programas feitos em assembly e para escrever o
programa podemos utilizar qualquer editor de texto, porem utilizaremos o editor de
texto NOTEPAD++, pois o mesmo possui suporte a varias linguagens.
Uma simples aplicação (pisca-pisca com LED)

4
��-----J tu1C LR

1:5
Ot:,C:2/CLJ-·,.Oll T

Como primeira aplicação, iremos montar um circuito muito simples, como mostra
afigura acima e seu propósito é fazer piscar um diodo led.Veremos como se escreve um
programa em linguagem assembler, como se compila e como se transfere o mesmo para
o interior da Flash do PIC e assim fazê-lo funcionar.
Serão usados os pinos 14 e 5 para alimentar o microcontrolador, o pino 16 para a
entrada do sinal de clock e o pino 4 para habilitar o seu funcionamento. O pino
RB0(pino 6)é uma das linhas de I/O disponível no PIC. Na nossa aplicação,após a
gravação do programa no PIC, ela será conectada ao led por intermédio de um resistor
de limitação de corrente.Como já foi dito a primeira operação a ser efetuada é a escrita
do código assembler e a sua gravação em um arquivo de texto com a extensão.ASM. Na
nossa primeira experiência prática utilizaremos o arquivo de nomeLED.ASM,
apresentado a seguir

Sistemas Microcontrolados 46 t 129Prof. Fabiano Saldanha


48
Microcontroladores

;**************************************************
; LED.ASM
;**************************************************

PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
LED EQU O
ORG 0CH
Count RES 2

;Reset Vector
;Inicio do programa ao ser resetado a CPU

ORG 00H

bsf STATUS,RP0
movlw 00011111B
movwf TRISA
movlw 11111110B
movwf TRISB
bcf STATUS,RP0
bsf PORTB,LED

MainLoop
call Delay
btfsc PORTB,LED
goto SetToZero
bsf PORTB,LED
goto MainLoop

SetToZero
bcf PORTB,LED
goto MainLoop

; Subrotinas
Delay
clrf Count
clrf Count+l

DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+l,1
goto DelayLoop
return
END

Sistemas Microcontrolados 47 t 129Prof. Fabiano Saldanha


49
Microcontroladores

Após a escrita do programa, o próximo passo é a compilação do código, ou seja


a transformação em opcode do código mnemônico ou instruções assembler deste
conteúdo.
O compilador assembler que utilizaremos é o MPASMWIN.EXE que é o
produto da Microchip disponível.
Como vimos anteriormente, além do código com extensão .ASM é necessário
fornecer ao compilador um segundo arquivo, produto da Microchip, com extensão .INC
que corresponde a biblioteca do tipo do PIC que estamos utilizando. No nosso caso o
arquivo é o P16F84.INC.
Este código contém algumas definições das quais depende o tipo de chip
utilizado.

Analisando o código assembler do programa

Analisaremos agora linha por linha o conteúdo do nosso código LED.ASM.


Partiremos da primeira linha de código.

PROCESSOR 16F84

PROCESSOR é uma diretiva do compilador assembler que indica a definição


do microcontrolador para o qual está escrito o nosso código. A diretiva não é uma
instrução mnemônica que o compilador traduz no respectivo opcode, mas sim uma
simples indicação enviada ao compilador para determinar o funcionamento durante a
compilação. E neste caso informamos ao compilador que as instruções que colocaremos
no nosso código são relativas a de um PIC16F84.

RADIX DEC
A diretiva RADIX serve para informar ao compilador que o número sem a
notação, será entendido como numero decimal. Ou seja se quisermos especificar, por
exemplo o número hexadecimal 10 (16 em decimal) não podemos escrever somente 10
porque ele será interpretado como 1O decimal, neste caso escreveremos 1Oh ou 0x1O ou
ainda H'lO'.

INCLUDE "P16F84.INC"
Esta diretiva indica ao compilador a nossa intenção de incluir no código um
segundo arquivo denominado Pl6F84.INC. O compilador se limitará a substituir a linha
contendo a diretiva INCLUDE com o conteúdo do arquivo indicado e vai efetuar a
compilação como se ele fosse parte do nosso código.

LED EQU O
A diretiva EQU é muito importante para se definir uma constante simbólica
dentro do nosso código. Em particular a palavra LED daqui em diante no código será
equivalente ao valor O. O ponto principal da existência da diretiva EQU é o de se tomar
o código mais legível e permitir a definição de um valor constante em um único ponto
do código.

OBS: A diretiva só faz sentido durante a compilação do código depois o PIC não
poderá mais seguir uma diretiva.

Vejamos agora a linha seguinte:

ORG OCH

Sistemas Microcontrolados 48 t 129Prof. Fabiano Saldanha


50
Microcontroladores

(AULA 04)
1 - INTRODUÇÃO

ORG também é uma diretiva que permite definir o endereço na qual queremos
que o compilador inicie a alocação dos dados ou a instrução seguinte. E neste caso
estamos definindo uma área de dados dentro do PIC ou seja uma área em que iremos
armazenar variáveis e contador durante a execução do nosso programa. Esta área
coincide exatamente com a área de RAM do PIC definida pela Microchip como FILE
REGISTER (Registrador de Arquivo).
O registrador de arquivo nada mais é do que uma locação na memória RAM
disponível que começa a partir do endereço 0CH. Este endereço é fixo e não pode ser
modificado enquanto a locação anterior for usada para outro registro especial de uso
interno.

Count RES 2
Nesta linha encontramos um label (rótulo) onde Count é uma varável e, RES é
uma diretiva. A diretiva RES indica ao compilador que queremos reservar um certo
número de bytes (neste caso 2 bytes) no meio do registrador de arquivos (File Register)
dentro da área de dados.
O label Count, onde Count é um nome de uma variável para nós, é um marcador
que no resto do código assumirá o valor do endereço em que esta colocado. Dado este
que anteriormente havíamos definido no endereço de partida em 0CH com a diretiva
ORG, então Count irá para a posição de memória 0CH.
Se nós inserirmos um label após a linha sucessiva essa irá ocupar a posição 0CH
+ 2 (dois bytes reservados), ou seja, 0EH. O nome do label pode ser qualquer um com
exceção das palavras reservadas ao compilador as quais são as instruções mnemônicas e
diretivas.

ORG OOH
Esta segunda diretiva ORG 00H faz referência a um endereço na área da
EEPROM antes da área de dados. Deste ponto em diante colocaremos de fato a
instrução mnemônica que o compilador deverá converter no respectivo opcode do PIC.
Ela indica que o primeiro opcode visto pelo PIC após o reset é aquele memorizado na
localização O, e dai o fato do valor 00H ser inserido na diretiva ORG.

bsf STATUS,RPO
É a primeira instrução mnemônica de fato. O PIC tem uma CPU interna com
arquitetura do tipo RISC. Neste caso, a instrução ocupa uma só locação de memória
(opcode e parâmetro incluso). Aqui a instrução mnemônica bsf quer dizer BIT SET
FILE REGISTER, ou seja, coloque em nível alto (condição lógica alta) um dos bits
contido na locação de memória RAM especificada.
O registro STATUS é um registro especial de 8 bits, começando pelo bit O (bit
menos significativo) e indo até o 7 (bit mais significativo), que permitem, entre outras
coisas, verificar o estado da CPU em relação ao resultado da ultima operação executada
(carry ou transporte, zero e etc), bem como, permitir a mudança do banco de memória.
Este registro está definido como um parâmetro no arquivo P16C84.INC. O valor
colocado neste arquivo é 03H e corresponde a um registrador de arquivo (ou seja uma
locação na RAM na área de dados) reservado.
O próximo parâmetro, RP0, está definido também no arquivo P16C84.INC com
valor 05H e corresponde ao número do bit que se quer colocar em nível alto (um). Esta
instrução na prática coloca em nível 1 o quinto bit do registrador de arquivo STATUS.
Esta operação é necessária, como veremos mais adiante, para acessar o registrador de
arquivo TRISA e TRISB. movlw 0001111 IB.

51
Microcontroladores

Esta instrução significa: MOVE LITERAL TO W REGISTER (mover o valor


literal para W), ou seja, mover um valor constante para o acumulador W. Como
veremos mais adiante, o acumulador, é um registro particular utilizado pela CPU em
todas as situações em que efetuarmos uma operação entre dois valores, ou em operações
de deslocamento entre locações da memória.
Na pratica, ele é um registro de apoio utilizado pela CPU para memorizar
temporariamente um byte toda vez que houver necessidade. O valor constante para
memorizar no acumulador é 000111l1B, ou seja, um valor binário de 8 bits onde o bit
mais a direita representa o bit O de W ou o bit menos significativo.
Na próxima instrução temos: movwf TRISA.
O valor 00011111 está memorizado no registro TRISA (O registro TRISA
também é definido através de uma diretiva EQU) e a sua função é senão a de definir a
direção (entrada ou saída) da linha de 1/0 do PORT A. Este bit é em particular um bit
do registro TRISA ele, por ser igual a 1, determina como entrada sua respectiva linha no
port A (se fosse O determinaria como saida).
Em seguida, na tabela 1, descrevemos a configuração dos pinos do PIC quando
for executada esta instrução:
- - - - - -
-

N.bit registro lRISB Linha porta A N.Pino Valor Estado

o RAD 17 1 Entrada
1 RAl 18 1 Entrada
2 RA2 1 1 Entrada
3 RA3 2 1 Entrada
4 RA4 3 1 Entrada
5 - - o -

6 - - o -

7 - - o -
Tabela 1 - Configuração dos pinos do PIC com a instrução

Como é possível ver os bits 5, 6 e 7 não correspondem a nenhuma linha de 1/0 e


seus valores em nada influenciam.
As duas próximas instruções indicam o funcionamento do portB do PIC: movlw
B'll111110' movwf TRISB e neste caso a definição da linha será a representada na
tabela 2 seguinte:
N.bit registro lRISB 11 1 1 11

o RBD 6 o Saida
1 RBl 7 1 Entrada
2 RB2 8 1 Entrada
3 RB3 9 1 Entrada
4 RB4 10 1 Entrada
5 RB5 11 1 Entrada
6 RB6 12 1 Entrada
7 RB7 13 1 Entrada

Sistemas Microcontrolados 50 � 129Prof. Fabiano Saldanha


52
Microcontroladores

Tabela 2 - Configuração dos pinos após a instrução acima

Nota-se que o valor O no bit O do registro TRISB determina a confi guração em


escrita (saída) da respectiva linha do PIC. Na nossa aplicação esta linha será usada para
controlar o LED e fazê-lo piscar.
Vimos que instrução movwf TRISB transferia o valor contido no acumulador
(inicializado anteriormente com a instrução movlw 11111110B) para o registro TRISB.
O significado de movwf é MOVE W TO FILE REGISTER ( passe o valor de W para o
registrador de arquivo).

bcf STATUS,RP0
Esta instrução é similar a bsf vista anteriormente, com a diferença de colocar
RP0 em zero. E bcf significa neste caso BIT CLEAR FILE REGISTER.
Do ponto de vista funcional esta instrução permite o acesso ao registro interno
do banco O ou seja do qual faz parte o portA e portB, e o banco 1 do qual faz parte
TRISA e TRISB. Uma descrição mais detalhada será vista mais adiante neste curso.

bsf PORTB,LED
Com esta instrução será efetuada a primeira operação na qual veremos o
resultado do lado de fora do PIC. Particularmente, ela irá acender o led conectado a
linha RB0. PORTB é uma constante definida no arquivo P16C84.INC e faz referência
ao registrador de arquivo correspondente a linha de 1/0 do portB onde LED é o numero
da linha que irá a 1.

Mainloop
Esta linha contém um label, ou seja uma referência simbólica a um endereço de
memória. O valor do label, como dito anteriormente, vem calculado na fase de
compilação com base no número de instrução, a diretiva ORG e a outra instrução
alocam espaço na memória do PIC. E neste caso, se tínhamos a instrução colocada a
partir da última diretiva ORG podemos colocar o valor que virá seguido a MainLoop,
ou seja: 07H. Na realidade o valor que o label assumirá não tem muita importância e o
seu propósito é justamente o de indicar a posição precisa do opcode na memória do PIC,
ou seja, um modo de referenciar uma determinada locação de memória. Neste caso o
label MainLoop será utilizado como ponto de entrada num ciclo (do inglês Loop) de
acender e apagar o led, ou seja uma parte do código que colocará o mesmo num ciclo
infinito.
Encontraremos mais a frente uma referência a este label.

call Delay
Esta instrução determina uma chamada (do inglês cal[) a uma subrotina que
inicia vinculada ao label Delay. A subrotina é parte especial de um programa que efetua
uma função especifica onde a qualquer momento esta função pode ser chamada com
uma só instrução, vejamos todas as instruções necessárias para efetua-la. Neste caso a
subrotina insere um retardo de tempo entre o acender e o apagar do led.

A instrução que compõe a subrotina Delay foi inserida como se segue no código.

btfsc PORTB,LED
O significado desta instrução é BIT TEST FLAG, SKIP IF CLEAR, ou seja,
controla o estado de um bit dentro de um registro e pula a próxima instrução se o valor
de tal bit é zero. O bit que será controlado corresponde a linha de saída na qual esta

Sistemas Microcontrolados 51 t 129Prof. Fabiano Saldanha


53
Microcontroladores

conectado o led. Fazendo este teste podemos determinar se o led está aceso ou apagado,
e então agir sobre ele, ou seja se o led estiver aceso nós o apagaremos e se estiver
apagado nós o acenderemos.

goto SetToZero
Esta instrução determina um salto incondicionado (do inglês GO TO, vá para)
para o label SetToZero onde teremos a instrução para apagar o led. Esta instrução faz o
programa pular para a instrução seguinte se o led está apagado.
bsf PORTB,LED
goto MainLoop
Esta duas instruções simplesmente acendem o led e retornam o programa ao início
do ciclo de acender/apagar o led.
SetToZero
bcf PORTB,LED
goto MainLoop
Estas duas instruções simplesmente apagam o led e retomam o programa ao
início do ciclo de acender/apagar o led.

A subrotina Delay

Como descrito anteriormente esta subrotina coloca um retardo de tempo de


cerca de um segundo (usado como o tempo que o led fica aceso ou apagado) e pode
ser chamada através do programa com instrução call Delay. Vejamos como funciona:

Delay
clrf Count
clrf Count+l
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+l,1
goto DelayLoop
retlw O
END

Delay é um label que identifica o endereço de início da subrotina e será utilizado


pela chamada através do corpo do programa principal. DelayLoop é outro label que será
chamado internamente pela subroutina e serve como ponto de entrada para o ciclo (do
inglês loop) de retardo.
Na prática o retardo de tempo é conseguido executando-se milhares de
instruções que não fazem nada!. Este tipo de retardo se chama retardo por software ou
retardo de programa.
Este é o tipo de retardo mais simples de implementar.
clrfCount
clrfCount+l
CLEAR FILE REGISTER zera duas locações da memória RAM reservada
anteriormente com a instrução Count RES 2.
Estas duas locações são adjacentes a partir do endereço referenciado pelo label
Count. decfsz Count, 1
A instrução DECREMENT FILE REGISTER, SKIP IF ZERO, ou seja,
decremente o conteúdo do registro e pule a próxima instrução se for zero (e neste caso
Count pula a próxima instrução se o valor devolvido for zero). Se o valor devolvido for

Sistemas Microcontrolados 52 t 129Prof. Fabiano Saldanha


54
Microcontroladores

diferente de zero será executada a próxima instrução: goto DelayLoop que executa o
ciclo de retardo. Uma vez igual a zero, o contador Count irá para a próxima instrução:
decfsz Count+1,1
goto DelayLoop que decrementará o registro seguinte até que este chegue a zero. O
registro Count+1 em particular será decrementado de 1 (um) até 256 decrementos de
Count. Quando então Count+1 chegar ao valor zero a instrução:

Return
Que significa RETURN FROM SUBROUTINE determinará a saída da rotina
de retardo e retomará à execução da instrução imediatamente após o call Delay.
E por fim a diretiva END que indica ao compilador o final do programa em
código assembler.
Salve este arquivo como LED.ASM ( nâo se esqueça que a extensão do arquivo
deve ser ASM) e compile o mesmo no MPASM, conforme a imagem abaixo.
Case sensitive deve estar marcado e não esqueça de selecionar o PIC
MPASM vS.34 -

Source File Name


JBLINK._asm .6.rowse ...

Opt,ons· MICRCJCHll=I

Redix: Warning Levei:


� Default � Default r.;;. Errar File
r Hexadecimal r AII Messages r;;7 List File
r Decimal r Wernings and Errors r INHX8S r Cross Reference File
t Octel C- Errors Only ("' INHX32 r Object File

Macro Expension·
Ca
� �iti�

f!: Default

6�F6�28��;;;:::=--�
"::����1
r On
Tab Size: Is Off
i} r
Extra Options:

)C, Exit 11 ✓ 8,ssemble I W Save Settings on Exit ? !:!elp 1

Se tudo estiver correto a compilação deve apresentar esta tela

MPASM v02.13

Ass,énibly Successf.ul.
LED_ASM

Enors: Õ
Warninqs:
Reported: ·1
Supprr,:,sed: O.
Messages:
Reported: 1
Suppressed: O

Lines As;sembled: 27

IL. . . '✓ _QK__________i! 1 ?' tielp


Este é o set completo de instruções reconhecido pelo PIC16F628:

Sintaxi Descrição Microchip Operação equivalente


ADDLW k Add Literal and W W= W + k
ADDWF f,d Add W and f d= W + f (onde d pode ser W ou f)
ANDLW k AND Literal with W W= W AND k
ANDWF f,d AND W with f d= W AND f (onded pode ser W ou f)
BCF f,b Bit Clear f f(b) = O
BSF f,b Bit Set f f(b) = 1

Sistemas Microcontrolados 53 � 129Prof. Fabiano Saldanha


55
Microcontroladores

BTFSC f,b Bit Test f, Skip ifClear f(b) = O ? Se é, pule uma instrução
BTFSS f,b Bit Test f, skip ifSet f(b) = 1 ? Se é, pule uma instrução
CALL k Subroutine Call Chamada a uma subrotina no endereço k
CLRF fClear f f= o
CLRW Clear W Register W=O
CLRWDT Clear Watchdog Timer Watchdog timer = O
COMF f,d Complement f d = not f (onde d pode ser W ou f)
DECF f,d Decrement f d = f-1 (onde d pode ser W ou f)
DECFSZ f,d Decrement f, Skip ifO d = f -1 (onde d pode ser W ou f) se d = O
pula
GOTO k Go to address Pule para o endereço k
INCF f,d Increment f d = f+1 (onde d pode ser W ou f)
INCFSZ f,d Increment f, Skip ifO d = f +1 (onde d pode ser W ou f) se d = O
pule
IORLW k Inclusive OR Literal with W W = W OR k
IORWF f,d Inclusive OR W with f d = fOR W (onde d pode ser W ou f)
MOVLW k Move literal to W W=k
MOVF f,d Move f d = f (onde d pode ser W ou f)
MOVWF fMove W to f f= W
NOP No Operation Nenhuma operação
OPTION Load Option Register OPTION = W
RETFIE Return from Interrupt Retoma de uma interrupt handler
RETLW k Retum Literal to W Retoma de uma subrotina com W = k
RETURN Return from Subroutine Retoma de uma subrotina
RLF f,d Rotale Left fthrough Carry d = f<< 1 (onde d pode ser W ou f)
RRF f,d Rotale Right fthrough Carry d = f>> 1 (onde d pode ser W o f)
SLEEP Go into Standby Mode Coloca em standby o PIC
SUBLW k Subtract W from Literal W = k-W
SUBWF f,d Subtract W from f d = f-W (onde d pode ser W ou f)
SWAPF fSwap f f= Swap do bit 0123 com 4567 de f
TRIS fLoad TRIS Register TRIS di f= W
XORLW k Exclusive OR Literal with W W = W XOR k
XORWF f,d Exclusive OR W with f d = fXOR W (onde d pode ser W ou f)

E lembre-se assembler é o montador, é o programa que transforma o código escrito


na linguagem Assembly em linguagem de máquina, substituindo as instruções,
variáveis pelos códigos binários e endereços de memória correspondentes. Os
compiladores de várias linguagens de alto nível fazem a compilação dos programas em
duas etapas, na primeira transformando o código fonte em código Assembly e em
seguida gerando o binário com a ajuda de um Assembler.

Programação C para PIC 8 bits

Considerada uma linguagem intermediária, de nível mais alto que linguagem


assembly, e mais baixo que as demais linguagens, a linguagem C é bastante poderosa e
versátil. Foi criada por Dennis Ritchie da Bells Labs em 1972, e é conhecida pelo seu
equilíbrio entre estruturação e eficiência, suprimindo as deficiências da linguagem
Assembly ainda com baixo consumo de memória.
Diferentemente de assembly, a linguagem C (assim como as demais linguagens)
é compilada.

Sistemas Microcontrolados 54 � 129Prof. Fabiano Saldanha


56
Microcontroladores

Desta forma, o programa fonte gerado pelo programador é processado por um outro
programa, conhecido por COMPILADOR, que irá gerar o programa em linguagem
binária.
n,..,,n

, n11e,, 1

output_h 111h,p 1n_e:1C


c1 .. 1.,,y_n,sj 1 □C

-------------

-➔•M■r·FH••
ESCREVER PROGRAMA C

B
SOFTVVARE/HARD"\/YARE
DE PRO,GRAMAÇAO.
GERAÇÃO DO ARQUIVO HEX ➔ F"

Diagrama de programação em linguagem C

Um dos objetivos originais da linguagem C é ser uma linguagem ao mesmo tempo


poderosa e simples, para ser uma alternativa ao Assembly no desenvolvimento de
software básico. Este objetivo foi muito bem atingido e hoje encontramos compiladores
C para processadores de todos os portes, de mainframes a microcontroladores.
Neste artigo vamos abordar alguns aspectos da implementação da linguagem C em
sistemas embarcados (embedded systems). Por sistemas embarcados estamos aqui
considerando sistemas voltados a aplicações específicas, com sistema operacional
limitado (ou mesmo inexistente) e fortes limitações de memória. Um sistema desses
normalmente não possui um HD, o programa é armazenado em uma memória não
volátil, tipicamente memória Flash. Os processadores são normalmente limitados e às
vezes possuem internamente interfaces digitais e analógicas (os chamados
microcontroladores).
Os compiladores C para estes ambientes normalmente possuem sintaxes não padrão
para acesso direto a alguns recursos de hardware.
Na maioria dos compiladores, o processo é realizado em duas etapas, sendo isso
transparente ao usuário. Na primeira etapa, existe a leitura do programa fonte, a
verificação dos símbolos (nomes usados no programa), e da sintaxe dos comandos,
verificando se há al gum erro sintático. Em paralelo a isso, através da análise do
significado de cada estrutura da linguagem, é produzido um programa em linguagem
intermediária (em alguns casos o código intermediário é em assembly). Na segunda
etapa, o compilador executa a tradução do código intermediário para a linguagem de
destino, neste caso, em um arquivo HEX com as instruções de máquina do
microcontrolador.
A vantagem das linguagens de programação sobre o Assembly está no fato da
geração de código envolver situações mais complexas do que as suportadas por uma
única instrução da linguagem de máquina do hardware alvo. Por exemplo, se um
microcontrolador não possuir a instrução de multiplicação, o programador assembly
deve criar um trecho de programa que realize somas sucessivas. Já em linguagem C, o
programador pode utilizar a operação de multiplicação, pois fica "transparente" a
tradução que o compilador fará, resolvendo esta operação da maneira mais adequada
possível.
Isso também garante às linguagens de programação uma maior portabilidade em
relação ao assembly, permitindo que um programa fonte possa ser "recompilado" para
outro modelo de microcontrolador com poucas ou nenhuma modificação.
A desvantagem da linguagem C sobre a linguagem assembly está no consumo de
memória. Como o compilador nem sempre consegue cobrir todas as otimizações de
código possíveis, em muitos casos temos um acréscimo de instruções no código binário

Sistemas Microcontrolados 55 � 129Prof. Fabiano Saldanha


57
Microcontroladores

(arquivo HEX) gerado, consumindo um pouco mais de memona de programa. No


entanto, um programador experiente pode gerar os programas em linguagem C,
refinando posteriormente com otimizações que tragam um menor custo de memória,
muito próximo ao que seria gerado se o programa fosse escrito em assembly e gastando
menos tempo do que se houvesse implementado em tal linguagem.
A linguagem C permite também que os programas possam ser escritos de forma
estruturada, facilitando a manutenibilidade e aumentando o reaproveitamento de trechos
já escritos do programa. Desta forma, um programador pode escrever parte do
problema, reutilizando também trechos de programas ou subrotinas já criadas,
facilitando a implementação.
Atualmente existem vários compiladores C para microcontroladores Microchip
PIC. Entre estes, podemos citar: CCS, Hi-Tech PIC C Compiler, BoostC Compiler,
MikroC Compiler, CC5X e CC8E, Microchip MPLAB C18 etc.
Usaremos o compilador da CCS, pelo fato do mesmo possuir varias funções que
facilitam o desenvolvedor, ter a função printf já integrada e possuir muitos manuais e
exemplos na internet.
Também conhecido como PIC C COMPILER ou PCW (versão "for Windows"),
trata-se de um compilador bastante divulgado, de custo acessível e excelente
desempenho. É produzido pela empresa Custom Computer Services Inc.
(www.ccsinfo.com), e possui versões para DOS, Windows e Linux.
Este compilador conta com suporte aos modelos de microcontrolador PIC 8 bits
(famílias 12, 16 e 18), e na versão "for Windows" conta com uma ferramenta IDE
integrada a sistemas de gravação e depuração com interface bastante amigável.
Outra vantagem deste compilador está nas funções embutidas ("built-in functions") que
permitem a geração de código mais otimizado e menos esforço de programação aos
iniciantes da área. Por exemplo, a função embutida output_high (PINO) permite acionar
um pino do microcontrolador sem nenhum comando adicional. Sem o uso desta função,
o programador deveria configurar o pino como 1/0 digital e posteriormente definir o
registrador de direção do pino como saída.
No compilador CCS o programador pode deixar que estes passos sejam feitos
automaticamente e de forma transparente, através do uso da função integrada
output_high.
Podem-se encarar estas funções integradas ao compilador como um recurso que
estende a linguagem C, criando um padrão que podemos chamar de Linguagem C CCS.

l�c l�h
··-·� ( 1+f�jt' �•>·

....., •li
U.FI54-'S- � .ttll\YI ... -..IEC-1 8 ....
li
;i;c�ll�i1i'li1i1r1üu)
�(��ODr. -· Pltt � 11"-<.,•IIWltt )
Rab(H
�••• 1 e�- ..., ili"!JI �• ....., __ ..,_�);
pt:,c()

trt•t:.F � U.-:Z: sl..,ail. -K t:IINbNI- '\r'li..-):;

Mn.1• <�,e
... �... , _llr:l41fii!CPHt_•nJ 4
...'1.,-..,as ,15 Dft) ;z
.. t-,.t"_IMl(Pl�l )�
M-La.�ll_as;(Slhn

Ili 1-..
Interface do ambiente CCS

Sistemas Microcontrolados 56 � 129Prof. Fabiano Saldanha


58
Microcontroladores

FUNÇÕES MAIS UTILIZADAS DA LINGUAGEM C PADRÃO CCS


Função Descrição Exemplo
Ativa um determinado pino do output_high(PIN_D0);
output_high()
microcontrolador output high(PIN C2);
Desativa um determinado pino do output_low(PIN_DO);
output_low()
microcontrolador output low(PIN C2);
if (input(PIN_A1))
{
input() Busca o estado de um pino output_high(PIN_D0);
x = input(PIN_A4);
}
output a() Envia um byte para o PORT A output a(VAR1); // enviaVAR1 para PORTA
output b() Envia um byte para o PORT B output b( 0xff); // liga todos bits de PORTB
output c() Envia um byte para o PORT C output c(VAR1); // enviaVAR1 para PORTC
output d() Envia um byte para o PORT D output d( 0xO0); // desliga todos os bits de PORTO
output e() Envia um byte para o PORT E output e(VAR1); // enviaVAR1 para PORTE
intVAR1;
input_a() Busca um byte do PORT A
VAR1 = input a();
intVAR1;
input_b() Busca um byte do PORT B
VAR1 = input b();
intVAR1;
input_c() Busca um byte do PORT C
VAR1 = input c( );
intVAR1;
input_d() Busca um byte do PORT D
VAR1 = input d( );
intVAR1;
input_e() Busca um byte do PORT E
VAR1 = inout eO;
#use delay (clock=4000000)
#define use_portb_lcd true
#include <lcd.c>
...
void main()
lcd_init() Inicializa o LCD. {
...
lcd_init();
...
)
Envia uma string (seqüência de caracteres)
lcd_putc() lcd_putc(" \f TESTE");
para o LCD
delay_ms(VAR1);
delay_ms() Causa um atraso em milésimos de segundo
delav ms( 100);
Causa um atraso em milionésimos de delay_us(1O);
delay_us()
segundo delay us(VAR1);
floatVAR1;
Cria uma saída formatada, geralmente intVAR2;
printf() utilizada para exibir dados das variáveis no longVAR3;
LCD printf(lcd_putc, "\f TESTE %f',VAR1);
orintf( lcd outc,"\fTESTE\n %Iu %f',VAR3,VAR1);

DECLARAÇÃO DE VARIÁVEIS
Tamanho em Descrição exemplo
Tipos de dados
bits
int 8 variáveis inteiras sem sinal, capacidade de O a 255 intX, Y=1,VAR1=0;
signed int 8 variáveis inteiras com sinal, capacidade de -128 a 127 signed intVAR3 = -10;
long 16 variáveis inteiras sem sinal, capacidade de O a 65535 long A, B = O,VAR2;
signed long 16 variáveis inteiras com sinal, capac. de -32768 a 32767 signed long GRAU=0;
float 32 variáveis reais com sinal. Representação aproximada. floatVAR4,VAR5;
short variáveis lógicas, de um bit, podendo valer O ou 1 boolean FLAG1=O, SENSOR;
ou 1 short CHAVE;
boolean
variáveis inteiras sem sinal, podendo valer de o a int32 CONTADOR;
int32 32
4294967295
variáveis inteiras com sinal, podendo armazenar valores signed int32VAR10;
signed int32 32
de -2147483648 a 2147483647
char 8 variáveis que armazenam caracteres em forma de bytes. char C = 'a', LETRA = ' ', H;
OBS: Os tipos de dados int e long podem assumir outras configurações em outros tipos de processadores. Ex: em um
processador de 16 bits, o tipo de dado INT assume 65536 possibilidades diferentes.

OPERADORES
+ (adição) == (igual) <= (menor igual) 1 (ou binário) = (atribuição)
- (subtração) != (diferente) && (e) » (rotação binária para direita) ++ (incremento)
* (multiplicação) > (maior que) li (ou) « (rotação binária para esquerda) -- (decremento)
/ (divisão) < (menor que) ! (negação) ~ (negação binária)
% (resto divisão) >= (maior igual) & (e binário) A (ou exclusivo)

59
Sistemas Microcontrolados 57 t 129Prof. Fabiano Saldanha
Microcontroladores

ESPECIFICADORES DE FORMATO PARA O PRINTF


Especificador de formato é o símbolo que indica, em uma string utilizada no comando PRINTF, a posição
e o formato onde será impresso o valor da variável.

long ou int32
o/olu
signed long
%li ou o/old
%X int em hexadec.
o/of Float
·::"º'-'º'°;·
de saída ""°""=""º
stnng (del1m1tada
caractere aspas duplas)
~> por
'\especm
�-.. cador ,
Caractere
de formato %e
espe□al o/os String
%e float (not.cientf.)
o/olx long hex
efeito desta linha %% símbolo%
%3u int (3 casas)
%03u int (3 digitos c/ zeros à esq.)
float (2 casas dec.)
Caracter Função
%1.2f

especial
\f Limpar display
Exemplos de uso :

\n Pular linha
int vir;

\\ Barra invertida printf(lcd_putc,"\fValor: %u", vir);


\O Null
float a, b; int e;
Especificador Tipo
o/ou int ou short printf(lcd_putc,"\fCont: %u \nX:%1.2fY:
%1.2f", e, a, b);
o/oi ou %d signed int

PRINCIPAIS ESTRUTURAS DA
LINGUAGEM C
Estruturas de decisão

••

.J, X++ ;
if (condição) X<--X+ll
if (x > 30)
{ .J,
instruções; N {
} beep();

li beep ( ) li ..._I
_b�<-_-
,1.
□
}
X= O;

li aciona ( l!I
.J,
X <-0 el.se
•• _____.I
ó�(
• {
-!,
X<--X+ li X++
li rotaciona ( lll b = O;
aciona();
-!,
if (x > 30) ••
.J,


{ rotaciona();
11 beep () li beep ();
if (condição)
,1, {
X<-- □ X= O; intruções;
}
else
li rotaciona( lll rotaciona();
{
instruções;
-!,
•• }

Sistemas Microcontrolados 58 � 129Prof. Fabiano Saldanha 60


Microcontroladores

Estruturas de repetição

••

t
li while(con i o
d çã );
li While vazio. Muito útil quando se
deseja "reter" o programa até que uma
IX <--A% 31 condição ocorra.
t A condição entre os parênteses indica a
X = a % 3;
condição na qual o sistema ficará retido.
while(input(PIN_Al)==0); Lembre que WHILE significa
ENQUANTO. O PONTO e VÍRGULA
PORTD = 0xlF; identifica o laço vazio.

1 POATD <-- 1 Fh 1
t
••

..
while (condição)
{ X =10;

.... ' while (X > O) {

.... ' output_high(PIN_B3);


delay_ms (100);
}
li tempo(lO0) li output_low(PIN_B3);
li enquanto a condição for ,l,
li verdadeira, serão executadas delay_ms (100);
1 AB3 <- O 1
li as instruções entre as chaves ,l, X
li ou a instrução seguinte no caso 11 tempo(lO0) li
,l,
li de não existirem as chaves. X <-X-1
output_high(PIN_D2);

••
• X = 0;
-J,
X<-- O do{
-J, while (condição)
�--o if (input(PIN_Al)) break;
{
-J,
if (input(PIN_A2)) continue; .
■ ■ ■ ■'
X ++;
if (condição)
} while(x < 5000 ); �
COnti n U9; )�'
// volta p/ inicio do while
processoB( J;
.... '
ou ainda if (condição)
X = 0;
{
whi le(!input(PIN_Al))
{ ... ,
if (input(PIN_A2)) continue; // ;,terrompe o wh;le
X ++;

11 processoB() 11 if ( x >= 500) break; }
}
••
-J,
processoB();

Sistemas Microcontrolados 59 � 129Prof. Fabiano Saldanha 61


Microcontroladores

X<= 10
do {
... '
,1.
�-➔O
,1.
do {
} while (condição); 1AB3<-1 li output_high(PIN_B3);
!I
,1.
tempo(l100) U
J.
do / while singifica faça / enquanto. ! AB� <··O! output_J.ow(PIN_B:3);
Ili
,1.
Ao contrário do while, o do/while permite Utempo(l 00) del.ay_ms(liOO}:
que o bloco seja executado ao menos ,!.
uma vez. ! X<-X-1!J,
X --;

} whil.e (x > O},;

,1.
l AD2 <··O 1
l
J.
••

••

-1,
1 RD2 <-- 1 1 for (inicializ ; condição ; incrm)
... ,
-1,

�-➔O
X <--1
-1, output_high(PIN_D2); 1 }
-1, for (x = 1; x <= 10; x ++)
X<=lO
{
J, s
1 RB3 <-- 1 1 output_high(PIN_B3); O for geralmente é utilizado para se
repetir um determinado bloco baseado
-1,
li tempo(l 00) li delay_ms (100); na contagem (incremetal
decrementai) de uma variável de tipo
ou
J,
1 RB3 <-- O 1 output low(PIN_B3); inteiro (int, long, int32, etc...)
J,
li tempo(l 00) li delay_ms (100); lnicializ : comando a ser executado
J, antes da primeira interação do laço.
X <-- X +-1 Condição : situação para continuar o
laço.
output low(PIN_D2);
lncrm: incremento ou decremento da
1 RD2 <-- O 1 variável de controle.
J,
••

•••
switch(x)
� {
�X<-0 case 1 : x = O;
switch (variável)
J, N break;
{
case VALOR1 : instruções; beep () case 2 : beep();
break; break;
case VALOR2 : instruções;
break;
li rotaciona oll default : rotaciona();
J,
default : instruções; o----r }
} ••
-1,

Sistemas Microcontrolados 60 � 129Prof. Fabiano Saldanha 62


Microcontroladores

DESCRIÇÃO DAS PRINCIPAIS label address() 1 Endereço ROM representado por um rótulo
aoto addressO 1 Desvia a execucão oara um endereco ROM
FUNÇÕES EMBUTIDAS NO aetenvO 1 Retorna o valor de uma variável de ambiente
COMPILADOR PCW (3.4 ou sup.) BIT/BYTE
shift right(} Rola dados para direita.
FUNÇOES DE 1/0 VIA RS232 shift left() Rola dados para esquerda.
rotate right() Rotaciona dados para direita.
gele(} ou getchar(}; Busca caractere via porta serial
rotate leftO Rotaciona dados Para esauerda.
pule(} ou putchar(}; Envia caractere via porta serial
bit clearO Limpa um bit de uma variável
faetcO; Busca caractere em um disPositivo
bit setO Ativa um bit de uma variável
aetsO; Envia uma strina pela porta serial
bit testo Testa um bit de uma variável
putsO; Envia seaüência de caracteres via porta serial
swap(} Troca os nibbles de uma variável de 8 bits
fgets(); Busca uma seqüência de caracteres via porta
serial makeB(} Extrai um byte de uma variável
fputcO; Envia um caractere a um dispositivo make16(} Extrai uma Word de uma variável
fputs(); Envia uma seqüência de caracteres a um make32(} Extrai um valor de 32 bits de uma variável
dispositivo ANALOG
printf(); Imprime uma seqüência formatada de texto setup comparator(} Confiaura o comparador
em um dispositivo setup ade ports(} Confiaura portas usadas pelo conversor AD
kbhit(); Verifica se há caractere disponível na entrada setup ade(} Configura o AD
serial sei ade channel() Determina o canal a ser utilizado
fprintfO; Saída formatada para um dispositivo read ade(} Lê valor do canal AD ativado
sei uart speed(}; Determina velocidade da porta serial
perror(); Imprime uma mensagem de erro no
MATEMATICAS
dispositivo padrão de saída abs() Retorna valor absoluto
asserto; Usado para depuracão acos() Arco cosseno
asin(} Arco seno
SPI (1/0 2 fios atan(} Arco tangente
setup spi(}; Inicializa SPI ceil(} Arredonda acima um float para número inteiro.
soi reado; Lê da interface serial coso Cosseno
soi writeO; Grava na interface serial exPO Calcula funcão E de um número.
spi_data_is_in(); Retorna "verdadeiro" se existem dados floorO Arredodna abaixo um float Para número inteiro.
recebidos pela SPI labsO Calcula o valor absoluto de um lona
sinhO Seno hiperbólico
lo□/\ Loaaritmo natural
ENTRADA E SAÍDA DIGITAL
loq100 Loaaritmo base 1 O
output low(}; Desativa uma saída pow(} Potência
output high(}; Ativa uma saída sin(} Seno
output_float(); Habilita o terceiro estado do pino (coletor cosh() Cosseno hiperbólico
aberto) tanh() Tangente hiperbólica
output bit(}; Envia o valor de um bit para um pino fabsO Valor absoluto oara um float
input(}; Lê o valor de um pino fmodO Resto da divisão de ponto flutuante
output a(}; Envia um byte para o PORTA atan2() Arco tangente
outout bO; Envia um bvte oara o PORTB frexp() Quebra um float
output cO; Envia um bvte para o PORTC ldexp(}
output d(); Envia um byte para o PORTD modf() Quebra um float em inteiro e decimal
outout eO; Envia um bvte para o PORTE sqrt(} Raiz quadrada
input a(}; Lê um bvte do PORTA tan(} Tangente
input b(}; Lê um byte do PORTB div(} Divisão retornando quociente e resto
input e(}; Lê um byte do PORTC ldivO Divisão de um lona retornando auociente e resto
input d(}; Lê um byte do PORTD
input e(}; Lê um byte do PORTE
VOLTAGE REF
Ativa os PULL-Uos de entrada do oortb setup vref() Estabelece tensão de reler. dos comparadores
oort b oulluosO;
sei !ris aO; Define a dírecão para os Pinos do PORTA STANDARD
sei !ris bO; Define a dírecão para os Pinos do PORTB atai() Transforma ASCII em int
sei !ris cíl; Define a direcão para os Pinos do PORTC atoi320 Transforma ASCII em int32
sei !ris d(}; Define a dírecão para os pinos do PORTD atol() Transforma ASCII em lonq
sei !ris e(); Define a direcão para os pinos do PORTE atof() Transforma ASCII em float
PWM tolower() Transforma letras maiúsculas em minúsculas
toupper() Transforma letras minúsculas em maiúsculas
setup_ccpX(); Define o modo de operação dos pinos de
PWM isalnum(} Verifica se uma string é numérica
sei pwmX duty(}; Determina o valor do PWM, de O a 1023 isalpha() Verifica se uma string é alfabética
isamoung() Verifica se um caractere pertence a uma string
INTERFACE DE PORTA PARALELA ESCRAVA (PORTO)
isdiaitO Verifica se é número
setuo osp(} Ativa a porta paralela escrava
islowerO Verifica se é letra minúscula
psp_input_full() Verifica o funcionamento do recurso de porta
isspace() Verifica se é espaco
paralela escrava
isupperO Verifica se é letra maiúscula
psp _output_full() Verifica o funcionamento do recurso de porta
Paralela escrava isxdiait(} Verifica se é díaito hexadecimal
psp_overflow() Verifica o funcionamento do recurso de porta strlen(} Retorna comprimento de uma strinq
paralela escrava strcov/\ Copia uma strinQ
strncov/\ Copia com limite de caracteres
12C strcmp(} Compara strinçis
i2c start(} Inicia interface I2C stricmp() Compara strings ignorando maiúscula/minúscula
i2c stop(} Para interface I2C strncmoO Comoara com limite de caracteres
i2c read(} Lê byte da interface I2C strcatO Concatena strinas
i2c write(} Grava byte na interface I2C strstrO Procura por uma strina dentro de outra
i2c _poli(} Verifica buffer da interface strchrO Procura caracteres em uma strina
PROCESSOR strrchr() Procura caracteres em uma string, de traz para
sleep(} Entra em modo SLEEP frente.
reset cpu(} Reinicia (reseta) o microcontrolador strtok() Aponta para próximo caractere após separador em
restar! cause(} Retorna a causa do último reset uma strinQ
disable interrupts(} Desativa interrupções strspn(} Conta caracteres iniciais em strinçis
ext_int_edge() Configura comportamento da interrupção por strcspn() Conta caracteres iniciais em strings
borda strpbrk() Procura primeiro caracter comum em strings
read_bank() Lê o valor de um registrador em um strlwrO Converte uma strina em minúsculas
determinado banco sprintfO Imprime (printfl em uma strina
write _bank() Grava uma informação em uma posição de isçiraphO Testa se é caractere çiráfico
memória iscntrl(} Testa se é caractere de controle

Sistemas Microcontrolados 61 t 129Prof. Fabiano Saldanha 63


Microcontroladores

isprint() Testa se é imprimível malloc() Aloca dinamicamente uma área de memória


strtodíl Extrai um float de uma strina callocíl Aloca dinamicamente uma área de memória
strtolO Extrai um inteiro de uma strina freeO Libera memória alocada por malloc ou calloc
strtoul() Idem realloc() Realoca memória
strncat() Concatena com limite de caracteres memmove(} Copiar um conjunto de dados na memória
strcoll() Compara caracteres em uma strinc:i memcmo(}
strxfrm(} Compara caracteres em uma strinq memchr(}
EEPROM
TIMERS read eeoromO Ler um bvte da EEPROM
write eeoromO Gravar um bvte na EEPROM
setup timer x(} Confic:iura funcionamento dos TIMERS read proc:iram eeoromO Ler área da ROM de oroarama
sei timer x(} Inicializa o TIMER write_program_eeprom() Gravar algo na área de ROM de
gel timer x(} Busca valor de um TIMER proarama (flashl
setup counters(} Configura contador read_calibration() Função exclusiva para PIC14000 - lê
setuo wdtn Confiaura o Watch Doa Timer dado da memória de calibração
restar! wdt() Reinicia o Watch Doa Timer write_program_memory() Grava uma seqüência de bytes na
DELAYS memória de proarama
delay_us() Causa um atraso (tempo) em milhonésimos de read_program_memory() Lê uma seqüência de bytes da
seaundos memória de proarama
delay_ms() Causa um atraso (tempo) em milésimos de write_externai_memory() Grava em uma memória externa. Pode
segundos depender de implementação.
delav cvclesO Causa um atraso em número de ciclos (clock / 4 l erase_program_memory() Apaga uma área da memória
flashROM
STANDARD C setup_external_memory() Configura forma de utilização de
memset() Copiar um conjunto de dados na memória memória externa.
memcovíl Copiar um conjunto de dados na memória
STANDARD C SPECIAL
offsetof() Retorna valor de deslocamento de dados na
memória rand() 1 Geração de número aleatório
offsetofbit() Retorna valor de deslocamento de dados na srand() 1 Define o valor máximo para geração de número aleatório
memóira

#include <16f877.h>
#device ADC=l0 li para conversor analógico-digital de 10 bits
#use delay (clock=4000000) li mudar conforme velocidade do cristal usado
#define use_portb lcd true li força biblioteca de lcd a usar o PORTB
#include <lcd.c> li inclui biblioteca do lcd
int VGl; li declara variável global. Vale em todo o programa

void rotina() LL declara uma subrotina (funcão) chamada "rotina"


{
long X; li variável local. Só vale dentro da funcão "rotina"
while(!input(PIN E2)) li enquanto não houver sinal em E2 ...
{
if (input(PIN Al) 11
X == 50) li se Al = 1 ou X = 50 ...
{
output high(PIN B3); li liga B3
X = O; -;; X <- o
}
else li senão
{
output low(PIN B3); li desliga B3
}
X ++; li incrementa X
delay ms(lOO); li tempo de 100 milisegundos
} -11 fim do wliile
} li fim da rotina()
void main() li programa principal
{
int var; li variável local. só pode ser usado dentro da função MAIN
lcd init(); li inicializa o display
wnile(1) // laço infinito, ou "forever loop"
{
if (input(PIN Al)) -1 / se Al = l ...
{
rotina()· // executa "rotina" anteriormente declarada
}
if (input(PIN A2)) li se A2 = 1 ...
{
for (var=0; var<l0; var ++) li repete 10 vezes (usando var p/ contar)
{
output high(PIN DO); li liga DO
delay ms(lOO); li tempo 100 me
output low(PIN DO); li desliga DO
delay ms(900); li tempo 900 me
}
}
}
- }

64
Sistemas Microcontrolados 62 � 129Prof. Fabiano Saldanha
Microcontroladores

Princip.ais erros do co11.p.ílador CCS


A #DEVICE required before this line Falta a definição do microcontrolador utilizado através da diretiva DEVICE. Esta
diretiva já está declarada nos arquivos de include relativos ao microcontrolador
utilizado.
A numeric expression must appear O ponto do programa pede um código executável. Verifique se não está sendo feita a
here declaração de uma variável após uma linha de código executável. Se isso ocorrer,
inverta a ordem, fixando a declaração de todas as variáveis no início da função.
Bad expression syntax Mensagem de erro genérica para alerta de erro de sintaxe.
Cannot change device type this far Após uma linha de geração de código não é mais permitida a definição do dispositivo
into the code (diretiva DEVICE). Veja se não há linhas de programa ates do primeiro include. Este
erro também é comum caso um arquivo tipo HEADER (como o 16f877.h) tenha seu
conteúdo alterado inadequadamente. Tente mudar o arquivo de include ou declarar a
linha de DEVICE em um ponto mais próximo do início do arquivo de proQrama.
Constant out of the valid range O valor da constante está além da capacidade de seu destino. Por exemplo, está se
atribuindo o valor 500 a uma variável do tipo INT de 8 bits, que só suporta dados até
255.
Duplicate case value Há uma dupla ocorrência de um mesmo CASE em uma estrutura SWITCH.
Duplicate DEFAULT statements Foi encontrada uma segunda ocorrência da cláusula DEFAULT dentro de um mesmo
SWITCH.
Duplicate #define #define duplicado ou iá declarado
Duplicate function Dupla implementação de uma função. Cada função deve ter um nome único.
ELSE with no corresponding IF Encontrado um ELSE sem um IF correspondente. Veja se não foi adicionado
acidentalmente um ponto e vírgula na linha do IF deste ELSE. Lembre que um IF não
pode ter ponto e víraula.
Expect; Verifique a falta de um ponto e vírgula. Geralmente o erro é apontado após a linha que
está com o erro de pontuação.
Expect} Verifique a falta de um fechar chaves. Lembre que cada abrir chaves deve possuir um
fechar chaves correspondente. Recomenda-se o correto alinhamento para facilitar
visualizacão.
Expect comma Verifique a falta de uma vírgula
Expect WHILE Verifique a falta de um WHILE após o uso de um DO {}
Expecting: Verifique a falta de dois pontos
Expecting = Verifique a falta de um sinal de atribuição
Expecting a ( Verifique a falta de um abrir parênteses
Expecting a, or) Verifique a falta de uma vírgula ou fechar parênteses
Expecting a, or} Verifique a falta de uma vírQula ou de um fechar chaves
Expecting a. Verifique a falta de um ponto
Expecting a; or, Verifique a falta de um ponto e vírgula ou de uma vírgula
Expecting a; or { Verifique a falta de um ponto e víraula ou de um fechar chaves
Expectina a close paren Verifique a falta de um fechar parênteses
Expecting a declaration Esperando uma declaração. Geralmente pode ocorrer por algum erro de pontuação
anterior.
Expecting a variable Esperando uma variável.
Expecting a] Esperando um fechar colchetes
Expecting a { Esperando um abrir chaves
Expecting an = Esperando um sinal de atribuição
File cannot be opened Verifique o nome e o caminho do arquivo. (se o include estiver certo)
Filename must start with" or < Verifique a sintaxe do INCLUDE.
ldentifier is already used in this E um aviso que você está tentando usar um nome para a função ou variável que já
scope existe ou iá foi utilizado neste proarama.
No M AIN() function found Verifique se você criou a função principal: void main()
Not enough RAM for all variables Significa que existem muitas variáveis para pouca memória RAM. Use tipos de dados
mais econômicos, menos variáveis Qlobais e mais variáveis locais.
Out of ROM, A segment or the O programa ficou muito grande para a memória ROM. Isso pode ser gerado também
program is too large por uma string muito longa, ou pelo esquecimento de um fechar aspas. Caso
realmente esteja com problemas de falta de ROM, use a diretiva #separate antes de
alQumas subrotinas para usar páQinas de ROM diferentes em cada etapa do proQrama.
Printf format type is invalid Veja se você está usando o especificador de formato correto. Para uma variável do
tipo SHORT ou INT, use o/ou ou o/oi (o/oi para valores com sinal). Para variáveis do tipo
LONG ou INT32, use o/olu ou %li. Para float, use o/of... para outros tipos ou
especificadores, consulte a tabela.
Printf formai(%) invalid Você usou um especificador de formato inválido. (leia o item anterior desta tabela)
Printf variable count (%) does not No printf devem existir menos especificadores de formado do que as variáveis que
match actual count devem ser exibidas.
Recursion not permitted Devido a escassez de recursos de pilha, o compilador impede o uso de recursão para
Recursively defined structures not o PIC
permitted Verifique se você não está chamando a função de dentro dela mesma, ou gerando
ciclos de chamadas recorrentes.
String too long Uma seqüência de caracteres é muito longa, ou você esqueceu de fechar aspas
duplas em alouma linha.
Undefined identifier Identificador não declarado. Veja se você declarou a variável que está usando.
Undefined label that was used in a GOTO para um rótulo não declarado ou inválido.
GOTO
Unknown device type Não conhece o dispositivo usado pela diretiva DEVICE

Sistemas Microcontrolados 63 t 129Prof. Fabiano Saldanha 65


Microcontroladores

Principais problemas quanto à execução do programa:

1) Não estou achando o arquivo HEX:


a. Ao abrir vários arquivos no compilador, verifique no canto inferior esquerdo o nome do
arquivo a ser compilado. Lembre que o compilador irá compilar somente um dos programas
abertos, e isto está identificado na linha inferior esquerda da janela do compilador. Caso
estejas compilado o arquivo errado, feche todos os arquivos abertos (CLOSE ALL FILES) e
abra novamente só o seu arquivo a ser compilado, repetindo o processo de compilação. Se a
compilação ocorrer sem erros e o problema persistir, veja se a pasta onde você está
trabalhando é a mesma onde você está procurando o arquivo HEX.
2) Arquivo HEX transfere mas não roda:
a. Veja se não há erro no seu programa. Tente transferir outro programa que funcione para
testar a estação.
b. Veja se os parâmetros (FUSES) estão configurados adequadamente. Lembre da
configuração no caso de usar o EPIC (View->Configuration, selecione HS, e o restante tudo
desligado (ofl). Clique também em View->Options e desligue a opção update configuration
(caso estiver ligado).
c. Veja se seu programa principal não possui erros (como um ponto e vírgula na linha do
While(l) ...

3) Arquivo HEX dá erro ao transferir


a. Veja se o microcontrolador selecionado é correto
b. Veja se o cabo está devidamente instalado
c. Reinicie o PIC
d. Veja se a fonte é adequada e está com tensão suficiente para gravação
e. Veja se você está transferindo o arquivo correto (ARQUIVO HEX)

Situações mais comuns na automação industrial:


1) O programa aciona uma determinada saída por um período de tempo:

output high(PIN-xx); // ativa saída


delay_ms(xxxx); // tempo em milisegundos
output_low(PIN_xx); // desativa saída

2) O programa aciona uma determinada saída, aguardando um sinal externo para prosseguir:

output high(PIN xx); // liga saída


while(!input(PIN_xx)); /// enquanto não houver sinal, aguarda...
output_low(PIN_xx); // desliga saída

3) Aguardar por uma determinada saída, considerando um tempo máximo para resposta:

long tempomaximo; // declara variável de 16 bits

tempomaximo = 10000; // atribui valor 10000 para variável


while(tempomaximo > O) // enquanto variável for maior que zero
{
delay_ms(l); // causa atraso de 1 milisegundo
tempomaximo --; // decrementa variável
if (input(PIN-xx)) break; // se houver sinal, interrompe.
}

4) Aguardar por uma saída pulsar (ligar e desligar)

while(!input(PIN_XX)); // aguarda entrada ativar ...


while(input(PIN_XX)); // aguarda entrada desligar ...

5) Repetir um evento uma quantidade determinada de vezes.

int CONTA;
for (CONTA = O; CONTA < 100; CONTA ++)
{
output high(PIN xx);
delay ms(xxxxx);
output low(PIN xx);
delay-ms(xxxxx);
}

Sistemas Microcontrolados 64 � 129Prof. Fabiano Saldanha


66
Microcontroladores

6) Aguardar por dois sinais digitais para seguir o programa....


while(!input(PIN_xx) 11 !input(PIN_xx));
// equanto não houver sinal em uma ou outra entrada,
// fica aguradando ...

7) Aguardar por um sinal digital (dentre várias opções) para seguir o programa...
while(l)
if (input(PIN xx)) break
if (input(PIN-xx)) break
if (input(PIN=xx)) break

8) Enquanto determinada entrada digital não for acionada, repetir um determinado


processo.
passo2
while(!input(PIN-xx))
{ passoO
output high(PIN xx);
delay ms(xxxx);­
output low(PIN xx); liga motor
delay_ms(xxxx); (EO)

9) Máquina de estados

int PASSO = 2;
while(l)
switch (PASSO)
{
case O : output high(PIN EO);
if (input(PIN D7)) PASSO 1;
if (input(PIN-Dl))
- PASSO 2;
break;
case 1 : output high(PIN E2);
output low(PIN EÕÍ;
if ( Clnput(PIN-D7)) PASSO 2;
break;
case 2 output-low(PIN EO);
output high(PIN E2);
if (input(PIN DO)) PASSO O;
if (input(PIN-D7)) PASSO 1;
break; -

10) Criando uma função para delay de segundos

void delay_s(long tempo_s)


{
while (tempo_s > O)
{
tempo_s --; // diminui variável
delay_ms(lOOO); // tempo de um segundo
}
}

main()
{

delay_s(lO); // causa atraso de 10 segundos....

Sistemas Microcontrolados 65 � 129Prof. Fabiano Saldanha

67

Você também pode gostar