Escolar Documentos
Profissional Documentos
Cultura Documentos
1
Microcontroladores
2
Microcontroladores
(AULA 01)
1 - INTRODUÇÃO
A calculadora Busicom de
1970, empregando o
microprocessador Intel 4004.
3
Microcontroladores
1
'1
�
.
�--
1
Paul Allen e Bill Gates Microcontrolador 8051
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.
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
Exemplo:
Converter os seguintes números decimais em binário.
a) 23 (D) b) 52 (D)
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
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
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
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
Flip Flops
o o O X
o 1 1 o
1 o O 1
1 1 X O
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)
RISC CISC
Microinstructions
Microinstrudion
execution
[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'
Arquitetura Havard
A arquitetura de um computador
Memória
P:roe1ama
EIS DMA
..
---•----------------- ___ 1- . ... Dados
µ.Controlador
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.
ROM
ENDEREÇOS E DADOS
CPU
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.
(AULA 02)
1 - INTRODUÇÃO
PIC16F84
PIC16F628
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
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)
.. 8 bits·
I
.ULA
í
1
14 bits
---�--� __ íts_
5 b_ � 8 bits
.
lnstructíon Re·g· �
_
,_
��_ _ -----
,__--·
�
8 bits
�.
� ....
3FFh
07FFh .__________�
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
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
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 é
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.
-_ 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
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:
* >
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/.
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
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.
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:
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
• .. :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
algoritmo "semnome"
li Função :
li Autor :
li Data :
li Seção de Declarações
inicio
li Seção de Comandos
fimalgoritmo
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.
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.
<lista-de-variáveis> <tipo-de-dado>
<lista-de-variáveis> vetor " ["<lista-de-intervalos>"]" de <tipo-de-
dado>
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).
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.
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.
FALSO< VERDADEIRO.
Operadores Lógicos
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.
escreva (<lista-de-expressões>)
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.
(AULA 03)
1 - INTRODUÇÃO
Quando se deseja separar expressões do tipo caractere, é necessário acrescentar espaços
nos locais adequados.
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.
_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 <expressão-lógica> entao
<seqüência-de-comandos>
fimse
se <expressão-lógica> entao
<seqüência-de-comandos-1>
senao
<seqüência-de-comandos-2>
fimse
35
Microcontroladores
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
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.
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.
Esta estrutura repete uma seqüência de comandos enquanto uma determinada condição
(especificada através de uma expressão lógica) for satisfeita.
O mesmo exemplo anterior pode ser resolvido com esta estrutura de repetição:
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.
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>
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
O VisuAlg permite ainda uma forma alternativa do comando repita...ate, com a seguinte
sintaxe:
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
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.
<lista-de-variáveis> : <tipo-de-dado>
procedimento soma
var aux: inteiro
inicio
// n, m e res são variáveis globais
aux <- n + m
res <- aux
fimprocedimento
A mesma tarefa poderia ser executada através de um procedimento com parâmetros, como
descrito abaixo:
Funções
<lista-de-variáveis> : <tipo-de-dado>
Se realizássemos essa mesma tarefa com uma função com parâmetros passados por valor,
poderia ser do seguinte modo:
Recursão e Aninhamento
Comando Aleatório
<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:
Comando Timer
Comando Timer
Comandos de Depuração
Comando Pausa
pausa
Comando Debug
Sua sintaxe é:
debug <expressão-lógica>
45
Microcontroladores
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
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.
�
�
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
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.
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
;**************************************************
; 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
PROCESSOR 16F84
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.
ORG OCH
(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
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
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
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
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
Delay
clrf Count
clrf Count+l
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+l,1
goto DelayLoop
retlw O
END
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 -
Opt,ons· MICRCJCHll=I
Macro Expension·
Ca
� �iti�
�
f!: Default
�
6�F6�28��;;;:::=--�
"::����1
r On
Tab Size: Is Off
i} r
Extra Options:
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
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)
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
-------------
-➔•M■r·FH••
ESCREVER PROGRAMA C
B
SOFTVVARE/HARD"\/YARE
DE PRO,GRAMAÇAO.
GERAÇÃO DO ARQUIVO HEX ➔ F"
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()
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
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
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;
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;
-!,
•• }
•
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;
••
• 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();
•
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 --;
,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,
•
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
#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
64
Sistemas Microcontrolados 62 � 129Prof. Fabiano Saldanha
Microcontroladores
2) O programa aciona uma determinada saída, aguardando um sinal externo para prosseguir:
3) Aguardar por uma determinada saída, considerando um tempo máximo para resposta:
int CONTA;
for (CONTA = O; CONTA < 100; CONTA ++)
{
output high(PIN xx);
delay ms(xxxxx);
output low(PIN xx);
delay-ms(xxxxx);
}
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
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; -
main()
{
67