Você está na página 1de 366

681.5 P436m R.

326/03

li
i

"

Microcontroladores PIC - Programa9ao em C

Seja Nosso Parceiro no Combate

a C6pia

lIegal

A copla ilegal crime. Ao efetua-la, 0 infrator estara cometendo um grave erro, que inibir a producao de obras llterarlas, prejudicando profissionais que serao atingidos pelo crime praticado.

Junte-se a n6s nesta corrente contra a plratarla, Dlga nao

a c6pia

llegal,

Seu Cadastro

e Muito

Importante para Nos

Ao preencher e remeter a flcha de cadastro con stante no final desta publlcacao, voce passara a receber, automaticamente, lntormacoes sobre nossos lancamentos em sua area de preterencta, Conhecendo melhor nossos leitores e suas preferenclas, vamos produzlr tltulos que atendam suas necessidades. Obrlgado pela sua escoltia.

Fale Conosco!
Eventuais problemas referentes ao conteudo deste livro serao encaminhados ao(s) respectivo(s) autor(es) para esclarecimento, excetuando-se as dOvidas que dizem respeito a pacotes de softwares, as quais sugerimos que sejam encaminhadas aos distribuidores e revendedores desses produtos, que estao habilitados a prestar todos os esclarecimentos. Os problemas s6 podem ser enviados por: • • • E-mail: producao@erica.com.br Fax: (11) 6197.4060 Carta: Rua Sao Gil, 159 - Tatuape - CEP 03401-030 - Sao Paulo - SP

;i
"~I
,I
:.1

tj
,,1'

:l

';~ d

.!!
A
;j

i!

i1

Canselho Edi, Diretor Editor]i Diretor Come' Diretor de Pu : Capa: Edltoracao: 1 Revlsao Inter! Revlsao Gra
\.

• 111~~i ill Visle uma livraria.


Microcontroladores PIC - Programagao em C

~i_iWil_jlllll._ .

Invi§la eJil VOCe.

Desenhos:

!I
;1
q

Revisao e Co] jr

l_____ __..._._._ __ .._ .

'"

apia lIegal
ometendo um grave fo profissionais que

Fabio Pereira

laO a c6pia

ilegal.

lara Nos
e no final desta purnacoes sobre nos.las, vamos produzir

livro serao encami), excetuando-se as urals sugerimos que ssses produtos, que

Ano:2005

2004 2003

Edh?80: 9 8 7 6 5 4 3 2 1

Editora Erica Ltda.

o - Sao Paulo - SP

Conselho Editorial: Diretor Editorial: Diretor Comercial: Diretor de Publicidade: Capa: Edltoracao: Revisao Interna: Revisao Gramatical: Desenhos: Revlsao e coorcenacao: Antonio Marco Vicari Cipelli Paulo Roberto Alves Waldir loao Sandrini MaurTcio S. de Fram;a Rosana Ap. Alves dos Santos Erica Regina A. Pagano Marlene Teresa Santin Alves Pedro Paulo V. Herruzo Flavia Eugenio de Lima Rosana Arruda da Silva

Microcontroladores PIC - Programayao em C

___ -----

r
1

__ ------.c.---c---~-----

Copyright © 2003 da Editora Erica Ltda. Dados Internacionais de catatogacao na Publlcacao (CIP) (Camara Brasileira do Livro, SP, Brasil)
Pereira, Fabio Microcontroladores PIC: Programacao em C / Fabio Pereira. - Sao Paulo: Erica, 2003. Bibliografta, ISBN 85·7194·935·2 1. C (Linguagem de prograrnacao para computadores) 2. Microcontroladores I. Titulo. 02-6151 indices para Catillogo Sistematico: 1. C: Linguagern de programacao: Apllcacces com microcontroladores Computadores: Processamento de dados 005.133 PIC: COD-005.133

Requisitos de:i
Hardware:
·1

• • • •

Microcompuj 16 MB de rril 50 Mbytes III Acesso

a In~
::1

Software: • • •

Sistema op~ Compilador ~ Ambiente MJ


j
:1
:;1

Todos os direitos reservados. Proibida a reproducao total ou parcial, por qualquer rnelo ou processo, especialmente por sistemas graflcos, rnlcrofllrnicos, fotograflcos, reprograficos, tonograflcos, vldeograflcos, internet, e-books. Vedada a memorizacao e/ou recuperacao total ou parcial em qualquer sistema de processamento de dados e a inclusao de quatquer parte da obra em qualquer programa juscibernatlco. Essas proibicoes aplicam-se tarnbem as caracterlsticas gratlcas da obra e a sua editoracao, A vlolacao dos direitos autorais punTvel como crime (art. 184 e paragratos, do C6digo Penal, cf. Lei n" 6.895, de 17.12.80) com pena de prlsao e multa, conjuntamente com busca e apreensao e lndenlzacoes diversas (artlgos 102, 103 paragrafo unico, 104, 105, 106 e 107 itens 1,2 e 3 da Lei n° 9.610, de 19/06/98, Lei dos Direitos Autorais).

IC-PROGau '1
q

e a Editora acreditam que todas as lnformacoes aqui apresentadas estao corretas e podem ser utilizadas para qualquer tim legal. Entretanto, nao existe qualquer garantia, expllclta ou lrnpllclta, de que 0 usa de tais tntorrnacoes conduzira sernpre ao resultado desejado. Os nomes de sites e empre-sas, porventura mencionados, foram utilizados apenas para iJustrar os exemplos, nao tendo vinculo nenhum com 0 livro, nao garantindo a sua existencia nem divulgaQao. Eventuais erratas estarao disponTveis no site da Editora Erica para download. "Algumas imagens utilizadas neste livro foram obtidas a partir doCorelORAW 7, 8 e 9 e da Colecao do MasterClips/ MasterPhotos© da IMSI, 1985 Francisco Blvd. East, San Rafael, CA 94901·5506, USA."

o Autor

Editora Erica Ltda.


Rua Sao Gil, 159 - Tatuape CEP: 03401·030 - Sao Paulo - SP Fone: (11) 295-3066 - Fax: (11) 6197-4060 Site: www.editoraerica.com.br

Microcontroladores IC • Programa~ao C P em

I.

Requisitos de Hardware e de Software


Hardware:

IQao (CIP)

~o Paulo:

• • •

Microcomputador Pentium 200 MHz ou superior; 16 MB de memoria RAM; 50 Mbytes livres de HD; Acesso a Internet.

:ontrol adores

800-005.133

Software: • Sistema operacional Windows 95 ou superior; Compilador CCS, PCWH, PCM, PCH ou Ambiente MPLAB; IC-PROGou um software de programacao, •
+

iladores PIC: 3

pew;

qualquer meio ou procesprogrsflcos, fonograficos, ICao total ou parcial em arte da obra em qualquer ~rrsticas graficas da obra e (art. 184 e paragrafos, iulta, conjuntamente com

unlco, 104, 105, 106 e


IS).

itadas estao corretas e alquer garantia, expllcita resultado desejado. Os apenas para ilustrar os exlstencia nem divulgafownlcad. -eIORAW 7, 8 e 9 e da d. East, San Rafael, CA

Microcontroladores IC - Programa~ao C P em

Sobre

Autor

Dedlcatorla

Nascido em Sao Francisco do Sui, Fabio Pereira em eletronlca, e reside em Joinvile - SC.

e formado

em direito e

minha espo

Atua desde 0 lnlclo da decade de 90 na area de software e hardware. Desenvolveu diversos sistemas em plataformas, como: PCs, microprocessadores Z-80, 8086, 80386, etc. e microcontroladores 8051 ePICs. E autor do Iivro Microcontroladores PIC: Tecnlcas Avancadas. Alern de atuar na area de projetos industriais e automotivos (na qual ja desenvolveu diversos projetos comerciais, incluindo tacometros dlgltals de alta precisao e equipamentos de controle e medlcao industrial), leciona as disciplinas de linguagem C e microcontroladores no SENAI-SC, no qual tamoern auxilia -no desenvolvimento de projetos dtdatlcos envolvendo microcontroladores.

E tambem soclo da SCtec, empresa que atua na area de desenvolvimento de projetos e sistemas de autornacao industrial (www.sctec.com.bn.

SENAlfDR/AM RegistrO\ •••••••l<.. .b. & 5i"'i~l';i . Data: .... Jlrl.l..tY.!~l.Q:.I.p..-:\i . "6t\'·C7C), Or! g&m ~._'h Q.--:b;,1./t;$.;.. :::..... ... ..... ,."..... NOClEO OE INFORMACAO TECNOLOOICA

:1

\1

it
'I II

Microcontroladores PIC· Programagao em C

l
'I
I

:i
Iol....._.~~."'.~ ._. _ __ _ .... ~._._. ...__._._.__ .... .._ __ __ ... ..__
_ ~L~.

.....:.i

Dedicatoria
nado em dlrelto e tware e hardware . . microprocessadoi PIGs. E autor do jotivos (na qual ja ros digltais de alta leciona as dlsclpllual tarnbem auxilia ontroladores. e desenvolvimento corn.br),

minha esposa Josi, aos meus pais e

a minha

avo.

Tu me ensinaras 0 caminho da vida; em tua presence he plenitude de alegria, tua direita delicias etemas.

SI16,11

Microcontroladores PIC - Programagao em C

Agradecimentos
Agradeco a todos que este livro pudesse • • • • aqueles que colaboraram direta ser escrito, e em especial: pelas amostras ou indiretamente de consulta; fornecido; para

Prefaclo
Existem dive~ mas quando proc microcontroladorei

A Andre Rabner, da Artimar, ACeS

e material

pela copla do cornpllador

PCWH e pelo suporte

Ao pessoal

da Editora Erica por acreditar

no meu trabalho; de uma forma ou de outra

Foi para ate nil trabalho de pesqu:


i

Aos meus leitores e crfticos que contribuem para a melhoria dos meus livros.

Partindo dos fundos e complex, res PIC, utilizando. Sao tarnbern res CCS, os mapa 16F876, 16F877, de 14 e 16 bits ..

Alem disso, 1 programacao, abrs (teclados e displa alem de uma visa, temperatura com outros. Trata-se de u conhecer a lingua) microcontroladorei

j.

Microcontroladores PIC - Programa98o em C

Prefilcio
idiretamente para Existem diversas literaturas sobre a linguagem C disponfveis no mercado, mas quando procuramos um livro que seja voltado para as apllcacoes com microcontroladores, este universo reduz-se drasticamente. Foi para atender a esta lacuna que surglu este livro, fruto de urn extenso trabalho de pesquisa e com uma abordagem simples e dldatlca. Partindo dos princfpios gerais de programacao, ate os detalhes mais profundos e complexos da ltnguagem C, sempre enfatizando os microcontroladores PIC, utilizando diversos exemplos e exerc1cios. Sao .tambern apresentadas as diretivas e funcoes internas dos compiladores CCS, os mapas de memoria dos PICs utilizados no livro (12F675, 16F628,· 16F876, 16F877, 18F252 e 18F452) e os conjuntos de instrucoes assembly de 14 e 16 bits. Alem disso, foi dedicado um capitulo do livre ao estudo de tecnlcas de prograrnacao, abrangendo ottrnlzacao de codigo, lnterrupcces, interfaceamento (teclados e displays LCD), cornunlcacao serial (assfncrona, SPI, rc, i-Wire, alern de uma vlsao geral sobre CAN, LIN, etc.), geracao de PWM, medlcao de temperatura com 0 chip Dallas 18S20, conversao anal6gicojdigital, dentre outros. Trata-se de uma obra lndlspensavel a todos aqueles que desejam tanto conhecer a llnguagern C em maior profundidade, quanto a sua apllcacao aos microcontroladores e pequenos sistemas em geral,

al de consulta;

s fornecido;
ialho: forma ou de outra

Microcontroladores PIC· Programagao em C

Sobre 0 Material Disponivel na Internet


material dlsponfvel na Internet corrtern os arquivos de exernplo e bibliotecas apresentados no capitulo 12 e arquivos de cabecalho com as deflnlcoes de registradores utilizadas nos program as. Para utiliza-los, e necessarlo possulr instalados em sua maqulna 0 compllador PCWH (para utilizar os PICs das series 12,16 e 18), 0 PCW (para utilizar os PICs das series 12 e 16), ou ainda os compllacores PCM ou PCH, alem do ambiente MPLAB (para reanzacao de slmulacoes) e urn software de programs9aO (no caso do autor, 0 IC-PROG).

indice

Analitl
1

~ Capitulo 1-Introdu~ 1.1. Um Pouco j 1.2. Programa<;~


1.3. Mensageml 1.4. Conven<;6el

1.5. Requisites]

Arquivos.EXE

48 KB

capj~~~

~,~:
I
I

Procedimento

para Download A transfe-

2.3. Variaveis • 2.4. Operadore 2.5. ExercTcios·.

2.2. Algebra BO~

Acesse 0 site da Editora Erica Ltda.: www.editoraerica.com.br. rencla do arqulvo disponlvel pode ser feita de duas formas:

Capitulo 3 - Com Pill


3.1. Ambiente 3.2. Integragao: i

1. Por meio do modulo pesqulsa, Localize 0 livro desejado, dlgltando palavras-chaves (nome do livro ou do autor). Aparecerao os dados do livro e 0 arquivo para download, entao de urn clique sobre 0 arqulvo exec utave I que sera transferido. 2. Por meio do botao "Download". Na pagina principal do site, clique no item "Download". Sera exibido urn campo, no qual devem ser dlgltadas palavras-chaves (nome do livro ou do autor). Serao exibidos 0 nome do livro e 0 arquivo para download. De urn clique sobre 0 arquivo executavel que sera transferido. Procedimento para Descompactacao

Capitulo 4 - Introdul
4.1. Palavras ~ 4. 2. ldentifica~ 4.3. Comandoj 4.3.1. Coma! 4.3.2. Coma 4.3.3. Funca 4.3.4. Funca

Primeiro passo: ap6s ter transferido 0 arquivo, verifique 0 dlretorlo em que se encontra e de urn cuplo-cllque sobre 0 arquivo. Sera exibida uma tela do program a WINZIP SELF-EXTRACTORque conduzlra voce ao processo de descompactacao, Abaixo do Unzip To Folder, existe urn campo que indica 0 destlno do arqulvo que sera copiado para 0 disco rlgtdo do seu computador. C: \ Microcontroladores PIC Segundo passo: prosslga com a instalacao, cticando no botao Unzip, 0 qual se encarrega de descornpactar os arquivos. Logo abaixo dessa tela, aparece a barra de status a qual monitora 0 processo para que voce acornpanhe. Ap6s 0 termtno, outra tela de lntorrnacao surglra, indicando que 0 arquivo foi descompactado com sucesso e esta no dlretorio criado. Para sair dessa tela, clique no batao OK. Para finalizar a prograrna WINZIP SELF-EXTRACTOR, lique c no batao Close.
.

Capitulo 5 - Variitv 5.1. Modificad


5.2. Outros Til 5.3. Declaraca 5.3.1. Varia' 5.4. Constants 5.4.1. C6digl 5.4.2. Cons 5.5. Operador 5.6. Express6 5.7. Converse 5.8. Modificac 5.9. Modificac 5.10. Alocaga" 5.11. Redefin~' 5.12. Exerc1cif

Microcontroladores PIC - Programagao em C

--~~~--------~------~,
L
:: "'co,

1
(

---~-~--~~.~.--.

~ ..~-

-- ---

-----~" -

-~- ~~-~

"-"-""'" -······'···.. ·'··'·-·--··'--~-----_IIIIii@.-

..

r"""-

SENAilOR/AM

r-'NUCLEO bE INFORMACJ.O I TECNOL6GICA

indice Analitico
~exempJo e blblio-

corn as detmlcoes
maqulna 0 cornpi(para utilizer ou PCH, alern do vare de prograrna-

Capitulo 1- Introdu-rao 1.1. 1.2. 1.3. 1.4. 1.5. Um Pouco de Historia Programacao de PICs em C Mensagem aos Prograrnadores Pascal convencoes Oeste Livro Requisitos de Hardware e Software

15 16 18 19 19 20 23 25

pew

Capitulo 2 - Principios de Programa-rao 2.1. Fluxograrnas 2.2. Algebra Booleana 2.3. Variavels e Oados 2.4. Operadores 2.5. ExercTcios

27
29 30 31 33 34 43 47 53 53 54 54 55 55 56 57 : 58 59 61 64 65 66 67 67 67 69 73 73 74 75 76

iom.br, A transfeCapitulo 3 - Compilador CCS C

sejado, dlgltando srao os dados do ~ sobre 0 arquivo jo site, clique no devem ser dlgltaSerao exlbldos 0 e sobre 0 arqulvo

3.1. Ambiente lntegrado de Oesenvolvimento (IDE) 3.2. lntegracao com 0 MPLAB Capitulo 4 - Introdu-rao

a Llnguagem

4.1. Palavras Reservadas da unguagern 4.2. Identificadores 4.3. Comandos e Funcoes Importantes 4.3.1. Comando If 4.3.2. Comando While 4.3.3. Funcao Printf 4.3.4. Funcao GETC Capitulo 5 - Varhlveis e Tipos de Dados

dlretorio em que ilda uma tela do irocesso de desre indica 0 destiiputador.

) botao Unzip, 0 dessa tela, apaoce acompanhe. we 0 arquivo foi sair dessa tela, TRACTOR, clique .

5.1. Modificadores de Tipo 5.2. Outros Tipos Espec1ficos do Compilador CCS C 5.3. Declaracao de Variavels 5.3.1. Variaveis Locais 5.4. Constantes 5.4.1. Codlgos de Barra Invertida 5.4.2. Constantes Blnarias, Hexadecimais e Octais 5.5. Operadores 5.6. Expressoes 5.7. Conversao de Tipos 5.8. Modificadores de Acesso 5.9. Modificadores de Armazenamento 5.10. Alocacao de Memoria 5.11. Redefinindo Tipos de Dados 5.12. ExercTcios Microcontroladores PIC - Proqrarnacao em C

Capitulo 6 - Operadores

6.1. Atrlbulcao 6.2. Aritmeticos 6.3. Relacionais 6.4. t.oglcos Booleanos 6.5. L6gicos Bit a Bit 6.5.1. Operador & (And) 6.5.2. Operador I (OR) 6.5.3. Operador A (XOR) 6.5.4. Operador ~ (NOT) 6.5.5. Operadores de Deslocamento 6.6. Memoria 6.6.1. Operador & 6.6.2. operador * 6.7. outros Operadores 6.7.1. Operador? 6.7.2. Operador Vfrgula 6.7.3. Operador Ponto 6.7.4. Operador -c6.7.5. Operador de Modelagem de 6.7.6. Operador Sizeof 6.8. Associacao de Operadores 6.9. Precedencla dos Operadores 6.10. Exerclcios
Capitulo 7 - Declaracoes de Controle

Tipo

79 79 80 81 82 83 83 84 84 85 85 :.87 ; 87 87 88 88 89 90 90 90 91 91 92 93 95 95 98 100 101 101 106 108 109 110

8.3.2. pon{ 8.3.3. Can{ 8.4. Unioes J


8.5. Enumer~

8.6. 8.7.

Streams Exerckid

Capitulo 9 - FunC;:1

9.1. Forma Gj 9.2. Regras 9 9.3. Passagsl . 9.4. Matrizesl


9 .5. Estruturj 9.6. Funcces]

9.7. 9.8.

Retorno Retorno Recursil Exercici

I
1

9.9. Prototipd

9.10. 9.11.

Capitulo 10 - Direj
\
.1

Capitulo 11 - Fun~

11.1. 11.2.

Matem@ ManiPu\

7.1. Comando If 7.2. Comando Switch 7.2.1. Clausula Break 7.3. Estruturas de Repeticao 7.3.1. taco For 7.3.2. taco While 7.3.3. taco Do-While 7.4. Comando Goto 7.5. Exerclcios
Capitulo 8 - Tipos e Dados Avangados :

11.3. Mernort]

8.1. Ponteiros 8.1.1. operacces com Ponteiros 8.1.2. Topicos Importantes Sobre 8.2. Matrizes de Dados 8.2.1. Matrizes Multidimensionais 8.2.2. Strings de Caracteres 8.2.3. Matrizes e Ponteiros 8.3. Estruturas de Dados 8.3.1. Operacces com Estruturas

Ponteiros

113 113 115 117 117 121 122 123 124 125

11.4. Atraso.1 11.5. ManiPu~l.l 11.6. Entrada 11.7. Anal6gi· 11.8. Manipu] 11.9. Cornpar] 11.10. ManipJ 11.11. control 11.12. Porta R 11.13. cornuri 11.14. comu1 11.15. Comun
[

Capitulo 12 - T6pid

12.1. Escreverl 12.1.1. Utili1 12.1.2. Test! 12.1.3. Roti~ 12.1.4. Utilj~
i r

Microcontroladores PIC - Proqrarnacao em C

--~~~---------------------....
......................... 79 ......................... 79 ......................... 80 ......................... 81 ......................... 82 ......................... 83 ......................... 83 ......................... 84 ......................... 84 ......................... 85 ......................... 85 ....................... :.87 ......................... 87 ......................... 87 ........................ 88 ,. 88 ........................ 89 ........................ 90 ........................ 90 ........................ 90 ........................ 91 ........................ 91 ........................ 92 ........................ 93 ........................ 95 ........................ 95 ......~ 98 ...................... 100 ...................... 101 ...................... 101 ...................... 106 ...................... 108 ...................... 109 , 110 , ..................... ..................... ..................... ..................... ............ , ............. , ..................... ..................... ..................... 113 113 115 117 117 121 122 123 124 125 8.3.2. Ponteiros para Estruturas 8.3.3. Campos de Bit 8.4. Unioes 8.5. Enurneracoes , 8.6. Streams , 8.7. Exerclclos ,
Capitulo 9 - Func;oes , , , , , ' , ' , , , " :.. , , , , " " , , , ,.. ; ,

,
, , ,

127 128 130 132 133 134 137 137 139 140 142 144 144 145 147 148 149 149 151 175 175 183 193 195 196 202 206 211 218 219 222 228 230 240 243 247 247 247" 249 250 251

9.1. Forma Geral 9.2. Regras de Escopo ,, , , 9.3. Passagem de Parametres , , 9.4. Matrizes com Argumentos de uma FunQao 9.5. Estruturas como Argumentos de uma Funcao 9.6. Funcoes com Nurnero de Pararnetros Varlavel 9.7. Retorno de Valores 9.8. Retorno de VaJores em Funcoes Assembly 9.9. Prot6tipos de Funcao 9.10. Recursividade 9.11. ExercTcios
Capitulo 10 - Diretivas do Compilador Capitulo 11- Func;oesdo Compilador

11.1. Maternatlcas 11.2. Manlpulacao de Caracteres 11.3. Mem6ria 11.4. Atraso 11.5. Manlpulacaode Bit / Byte 11.6. Entrada / Salda 11.7. AnaI6gicas 11.8. Manipulacaode Timers 11.9. Comparacao/ Captura / PWM 11.10. Manlpulacaoda EEPROM Interna 11.11. Contrale do Processador 11.12. Porta Paralela Escrava 11.13. CornunlcacaoSerial AssTncrona 11.14. Comunlcacao12C 11.15. ComunicacaoSPI
Capitulo 12 - Topicos Avam;ados

12.1. Escrevendo C6digo Eficiente em C 12.1.1. Utllizacaode VarlaveisBooleanas 12.1.2. Testes Condicionais 12.1.3. Rotinas Maternatlcas 12.1.4. Utilizando Assembly no CodigoC
Microcontro/adores PIC - Programagiio em C

12.2. Entrada e satda em C 12.2.1. Modo Padrao 12.2.2. Modo Fixo 12.2.3. Modo Rapido 12.2.4. Outra Modalidade de Acesso 12.3. lnterrupcoes em C 12.3.1. Tratamento "Automatlco" 12.3.2. Tratamento "Manual" 12.3.3. Priorizacaode lnterrupcoes 12.4. Utilizando os Timers Internos 12.4.1. Timer 0 12.4.2. Timer 1 12.4.3. Obtendo Mais Preclsao dos Timers 12.5. Comunicando-se com 0 PIC 12.5.1. CornunlcacaoSerial Assincrona 12.5.2. Protocolo SPI 12.5.3. Protocolo 12C 12.5.4. Protocolo i-WIRE 12.5.5. LIN 12.5.6. Protocolo CAN 12.5.7. Interfaces Eletrlcas 12.6. Leitura de Teclas e de Teclados 12.7. Apresentacao em Display 12.7.1. Displays LED de Sete Segmentos 12.7.2. M6dulo LCD 12.8. Leitura de Tensoes Anal6gicas com 0 PIC 12.8.1. Conversor AjD Interno 12.8.2. Conversor AjD Delta - Sigma 12.9. M6dulo PWM
Apendice A - Tabela ASCII Apendice B - Fun.;:oesC - Referencia Rapida Apendice C - lnstrucces PIC

251 252 253 254 254 254 255 256 257 258 258 259 260 262 263 268 274 282 291 296 297 300 307 308 310 318 319 322 326 329 331 335 339 351 353 357

r
.

A criacao di pode ser uma t~ aplicacao sendol

Os primeiroj com c6digos ch9 digltos binarios ~ dados (teclado, 'I entao serem ex~.. Desnecess tremamente co ' tempo para 0 del Diante da nE o surgirnento del gem da linguage~ Assembly gos de maqulna] que descrevem a conversao dos feita por um tiPo
. i I

c1j l

Apendice 0 - Mapas de Memoria Apendice E - Respostas dos Exercicios

Assim, em 1 00l100001000j do MOVLW Ox8Ci Sem duvida: mais simples doj zacao do Assem~
]

[ndlee Remissivo
Referencias Bibliogrilficas

A linguagenij manda, instru9a1


j 'J

MicrocontroJadores PIC· Programagao em C

~
'I
:1

r"'-"SENAiioRiAM
NUCLEO DE INfORMAyAO TECNOL6GICA

.1

................... 251 ................... 252 ................... 253 ................... 254 .................... 254 .................... 254
.................... 255 .................... 256

1
tntroducao

.................... 257
.................... 258

.................... 258
.................... 259 .................... 260 .................... 262

.................... 263
.................... 268

.................... 274
.................... 282

A crlacao de program as para microcontroladores e microprocessadores pode ser uma tarefa desgastante medida que aumenta a cornplexidade da apllcacao sendo desenvolvida .

291

..................... 296

..................... 297 .....................300 ..................... 307


..................... 308

Os prlmelros dispositivos programavels tin ham seus program as escritos com codigos cham ados codlgos de maquina, que consistiam normalmente em digltos binaries que eram inseridos por rnelo de um dlspositlvo de entrada de dados (teclado, leitora de cartoes, fitas perfuradas ou discos magnetlcos) para entao serem executados pela maqulna . Desnecessarlo dizer que a prograrnacao em codlgo de rnaqulna era extremamente complexa, 0 que implicava em um elevado custo, alem de muito tempo para 0 desenvolvimento de uma apilcacao . Diante da necessidade crescente de programacao de sistemas, foi natural o surglmento de uma nova forma de programacao de sistemas. Esta foi a origem da linguagem Assembly, Assembly consiste em uma forma alternativa de representacao dos codigos de maqulna usando rnnemorucos, ou seja, abrevlacoes de termos usuais que descrevem a operacao etetuada pelo comando em coclgo de rnaquina, A conversao dos mnemonlcos em codlgos blnarlos executaveis pela maquma feita por um tipo de program a chamado Assembler (montador) .

.....................310 ..................... 318 .....................319 ..................... 322


..................... 326

..................... 329 .....................331 ..................... 335 ......................339 ......................351 ......................353


...................... 357

Assim, em vez de escrevermos 0 comando em codigo de maqulna 0011000010001100, 0 prograrnador poderia simplesmente utilizar 0 comando MOVLW Ox8C para realizar a mesma tarefa . Sem duvlda nenhuma, a representacao em Assembly da lnstrucao muito mais simples do que aquela utilizando codlgo de maqulna, no entanto a utilizacao do Assembly nao resolveu todos os problemas dos program adores. A linguagem Assembly de baixo nlvel, ou seja, nao possui nenhum comando, tnstrucao ou tuncao alern daqueles definldos no conjunto de lnstruIn!rodu~ao

coes do processador utilizado. Isto implica em um trabalho extra do programsdor para desenvolver rotinas e operacao que nao fazem parte do conjunto de lnstrucoes do processador, produzindo, por conseguinte, programas muito extensos e complexos com um fluxo muitas vezes dificil de ser seguido.

vez, foi d~ tura da AI guagem ~ qual nao 1 •

E at que entram as chamadas linguagens de alto nlvel, Elas sao criadas para permitir a prograrnacao utilizando comandos de alto nlvel e que sao posteriormente traduzidos para a linguagem de baixo nlvel (assembly ou diretamente para codlgo de maqulna) do processador utilizado.

B: lingua~ em 1970: car e rae] exito devil

Ate 0 desenv

1.1. UrnPouco de Historia


Como ja vimos, as linguagens de baixo nlvel, surgldas praticamente junto com a era dos computadores dlgltals, possuem diversos aspectos negatives, como a cornplexidade, falta de compatibilidade entre diferentes sistemas, pouca legibilidade. A necessidade de uma abordagem mais concisa e simplificada para comandar computadores surglu naturalmente com a evolucao e utllizacao dos computadores dlgltals. Essa abordagem simplificada, mais pr6xima da forma humana de pensamento, e chamada de linguagem de alto nlvel, A primeira llnguagem de alto nivel com real aceltacao pela comunidade de prograrnadores foi FORTRAN (abrevlacao de FORmula TRANslator, ou tradutor de f6rmulas), uma linguagem voltada para a analise e resolucao de problemas maternatlcos criada na metade da decada de 50, por pesquisadores da IBM. Em seguida vieram llnguagens como COBOL (abrevlacao de COmmon Business Oriented Language, ou linguagem comum para apllcacoes comercia is) em 1959, voltada para 0 desenvolvimento de apllcacoes comerciais, ALGOL (ALGOrithmic Language, ou linguagem algoritmica) em 1960, linguagem de programacao generica e poderosa que orlglnou diversas outras llnguagens de alto nivel como PASCAL e C. A linguagem C, por sua vez, foi criada em 1972, por Dennis Ritchie, da Bell Laboratories, e consiste, na realidade, em uma linguagem de nlvel intermedlarlo entre 0 Assembly e as linguagens de alto nfvel,

alto nTvel adequad especlais utltlzadi sottwares de _bai~ para a execucao d


.

No entanto, I jamos alguns del~


I I

Pr6s:


Eficienciei AssemblY: de que 0 I


Velocldad
!

Assemb~ linguagenlI
i

Contras:
i

Cornplexk

profundo
operacao]

estao di~
mandos

portabilidj
portavels]

E uma linguagem de prograrnacao generlca desenvolvida para ser tao eficiente e raplda quanto a linguagem Assembly e tao estruturada e logtca quanto as linguagens de alto nivel (PASCAL, JAVA, etc.).
Suas orlgens sao atribufdas a tres linguagens de programacao:

sistema ~ completa Foi principal racionai UNIX (qu .

C.

• •

ALGOL; BCPL (Basic Combined Programming Language: llnguagern de programacae basica combinada) - derivada da linguagem CPL (que, por sua
Microcontroladores PIC - Proqrarnacao em C

De fato, a lrn thida para 0 des~.· como 0 WINDOW


l

1
1
!

do prograrna-

io conjunto de
,gramas muito .eguldo. as sao criadas :3 que sao posnbly ou direta•

vez, foi derivada da ALGOL), foi desenvolvida em 1969, e alia a estrutura da ALGOL eflclencla do Assembly, noentanto BCPL era uma linguagem demasiado complexa e relativamente limitada, razao pela qual nao teve exlto:

B: linguagem desenvolvida por Ken Thompson da Bell Laboratories, em 1970. Baseada na linguagem CPL, B foi uma tentativa de simplificar e facilitar a linguagem CPL, no entanto tambern a B nao obteve exito devido as sertas umttecoes que impunha ao programador.

ticamente junto ctos negatives, ntes sistemas, ificada para co~ ututzacao dos »dma da forma comunidade de nor, ou tradutor 10 de problemas fores da IBM. io de .cOmmon ucacoes comeres comerciais, 960, linguagem tras linguagens nnis Ritchie, da de nlvel interpara ser tao efie loglca quanto

Ate 0 desenvolvimento do C, nao existiam linguagens de programacao de alto nTvel adequadas a tarefa de crlacao de sistemas operacionais (programas especiais utilizados para 0 controle generico de um computador) e outros softwares de baixo nfvel, restando aos desenvolvedores utilizar 0 Assembly para a execucao destas tarefas. No entanto, 0 Assemblyapresenta jamos alguns deles: Pros: • Eficiencia: devido proximidade com 0 hardware da maqulna, 0 Assembly e sem duvida uma linguagem extremamente eficiente (desde que 0 programador saiba 0 que esta fazendo I); Velocidade: devido sua· grande eflclencla, os prograrnas em Assembly sao tambem muito mais rapldos que os criados em outras linguagens, pros e contras em sua utillzacao, Ve-

Contras:

Complexidade: 0 Assembly necessita que 0 programador possua urn profundo conhecimento do hardware utilizado. Alem disso, so mente estao disponfveis os comandos do processador utilizado. Qualquer operacao mais complexa deve ser traduzida em urn conjunto de comandos Assembly; Portabilidade: prograrnas Assembly, que pela sua natureza nao sao portavels, Isto signiflca que para utilizar um programs Assembly de um sistema em outro diferente, 0 programador deve executar a traducao complete do prograrna para 0 sistema de destino.

Foi principalmente a partir das necessidades de reescrita do sistema operacional UNIX (que ate entao era escrito em Assembly) que surglu a linguagern

cao: agern de prograL (que, por sua

C.
De fato, a lmplernentacao da llnguagem tao poderosa que C foi a escoIhida para 0 desenvolvimento de outros sistemas operacionais alern do UNIX, como 0 WINDOWS e 0 UNUX.

Introdugao

Assim como outras llnguagens de alto nlvel, C utiliza a filosofia de prograrnacao estruturada, ou seja, os prograrnas sao divididos em m6dulos ou estruturas (que em C sao chamadas de funcoes) com 0 objetlvo de realizar determinada tarefa. independentes entre si e

1.3. Mens~

!
i

Alguns dos riencla de progral


i

Desta forma, a prograrnacao estruturada permite uma construcao mais simples e clara do software de aptlcacao. 0 que permite a crtacao de programas de maior complexidade (quando comparada a outras linguagens nao estruturadas como Assembly ou BASIC).

Especificami aprendizado de d

De fato, C ~ dlferencas: • Bloca d~ pelas pa 0 operad Oopera( Em Pasd sendo qi que naol cebem id Pascal € checagel
berdade:

1.2. Programaeao de PICs em C


A utlllzacao de C para a programacao , parece uma escolha natural e real mente

e.

de microcontroladores

com os PICs

• • •

Atualmente, a maioria dos microcontroladores dlsponlveis no mercado contam com compiJadores de llnguagem C para 0 desenvolvimento de software. uso de C permite a construcao de programas e apllcacoes muito mais complexas do que seria vlavel utiJizando apenas 0 Assembly. Alern disso, 0 desenvolvimento em C permite uma grande velocidade na crlacao de novos projetos, devido as facilidades de programacao oferecidas pela linguagem e tambern sua portabilidade, 0 que permite adaptar programas de um sistema para outre com urn mTnimo esforco,

liberal, ~ quer cof • • A quanti, disponlvl


j

Outro aspecto favo raveI da utlllzacao da llnguagern C e a sua eflclencla, Eficiencia no jargao dos compiladores e a medida do grau de lntellgencla com que 0 compilador traduz um programs em C para 0 codlgo de maqulna, Quanto menor e mais rapldo 0 c6digo gerado, maior sera a eflclencla da linguagem e do compilador. Conforme ja dissemos, C, devido a sua proximidade com 0 hardware e 0 Assembly, e uma llnguagem extremamente eficiente. De fato, C e considerada como a linguagem de alto nfvel mais eficiente atualmente disponlvel. Repare que 0 aspecto eflciencla e real mente muito importante quando tratamos de microcontroladores cujos recursos sao tao limitados como nos PICs, afinal, quando dispomos de apenas 512 palavras de mem6ria de programs e 25 bytes de RAM (como no PIC12C508 e 16C54), e lmpresclndivel que se economize mem6ria! Alem disso, a utlllzacao de uma linguagem de alto nlvel como C permite que 0 prograrnador preocupe-se mais com a programacao da apllcacao em sl, ja que 0 compilador assume para si tarefas como a controle e locallzacao das varlavets, operacces maternatlcas e 16gicas, verlflcacao de bancos de mem6ria, etc.
Microcon!roladores PIC - Programa9ao em C

Pascal ~ pies e d~
!

Estas sao ~ De qualquer torn diferencas exlsts na atualidade.

1.4. Conve
Antes de ini ao leitor as cony cos.

Os termos ~

As referencij serao sempre grl

~-----I

t
I

i' ~

T
filosofia de proem moculos ou mtes entre si e

1.3. Mensagem aos Programadores Pascal


Alguns dos leitores deste livro, assim como 0 autor, podem Ter experlencla de programacao com outras llnguagens como BASIC, Pascal, etc. Especificamente em relacao Iinguagem Pascal, acreditamos aprendizado de C sera feito sem maiores problemas.

.onstrucao mais lacao de progra~uagens nao es-

que

De fato, C e Pascal sao linguagens muito parecidas, sendo as principals

dlterencas:
• 'es com os PICs no mercado conIe software, :oes multo mais e velocidade na acao oferecidas adaptar progra.ua eflclencla.
J

Bloco de comandos: em Pascal, um bloco de comandos e delimitado pelas palavras begin e end, em C pelos caracteres { e };

• •

o operador

0 operador de atrlbulcao em Pascal e 0:=, em C e apenas =; relacional de lgualdade em Pascal

e 0 =. em Ceo

==;

Em Pascal, temos as tuncoes (function) e procedimentos (procedure), sendo que um procedimento pode ser interpretado como uma funcao que nao retorna valores. Em C, temos apenas as tuncoes, que nao recebem identificador especial e podem ou nao retornar resultados; Pascal e uma llnguagem mals conservadora e rlglda com uma forte checagem de tipos e varlavels, 0 que restrtnge em muitos cas os a liberdade do programador. C, ao contrarlo, e uma linguagem altamente liberal, ou seja, permite ao prograrnador realizar praticamente qualquer colsa, inclusive erros classlcos de programacao: A quantidade de operadores dlsponivels em Pascal e menor que os disponfveis em C; Pascal e uma llnguagern menos eficiente que C, porern ples e de leitura mais agraoavel que C.

• •

de inteligencla da lin0

Igo de maqulna.
eflclencla

mais sim-

o hardware e mlvel,

C e considerada
ante quando tracomo nos PICs, I de programs e scindivel que se como C permite aptlcacao em si, tocanzacao das moos de memo-

Estas sao apenas algumas das dlferencas existentes entre C e Pascal. De qualquer forma, 0 leltor podera, por si mesmo, verificar as sernelhancas e dlferencas exlstentes entre a llnguagem C e as demais linguagens existentes na atualidade.

1.4. Conven~oes Deste Livro


Antes de lnlclar os estudos sobre 0 compilador C, ao leitor as convencoes adotadas neste livro .. cos. As referenclas a nomesde runcoes e palavras reservadas da linguagem C serao sempre grafadas em negrlto,
Inlrodugao

e necessarlo

esclarecer

Os termos em lingua lnglesa serao sempre escritos em caracteres ltalt-

..1

Os operandos, termos ou parametres opclonals de uma declaracao estarao sempre grafados em italico.

Alguns dos 1.3:

1.5. Requisitos de Hardware e Software


Os prograrnas demonstrados neste livro foram testados com a versao 3.127 do compilador CCS e a versao 5.7 do ambiente integrado MPLAB. Os exemplos dldatlcos dos capltulos 2 a 9, em sua maioria, foram escritos para utilizar 0 hardware mlnlrno proposto nas figuras 1.1 e 1.2.
C1

C1_

v+ v-

2 6

~t

GND'

c;+
C TX RX
2 _

TUN T2IN RlOUT R20UT MAX232

noUT T20UT R1IN R2IN

Figura 1.1
RX ICI RBOIlNT RAOIANO RAI/ANI RA2/AN2NREF RA3/AN3/CMPI RA4{fOCKl/CMP2 RBI/RXIDT RB2fTX/CK RB3/CCP1 RB4!PGM TX

Alguns dos < mente na placa l~ Os softwares respectivamente q

R85 RA5/MCLR\ R86ff1 OSO/T1CKI RA6/0SC2/CLKOUT R87/TIOSI RA7/0SCI/CLKIN

~
14

vss

VDD

Figura 1.2 posslvel utilizar 0 oscilador interno disponlvel nos PICs 16F62x, mas devido ao fato de os mesmos nao possuTrem uma catlbracao conflavel, optamos por utilizar um crlstal externo, ja que as rotinas de cornunicacao serial sao multo afetadas pela lmpreclsao do clock.
Microcontroladores PIC - Proqramacao em C

i , '~"

I
J

ieclaracao esta1.3:

Alguns dos exemplos foram projetados para utilizar a circuito da figura

..
~

tfi
+

* tfi +
ICI MCLR#rrHV RAO/ANO RAI/ANI RA2/AN2 HAS/AN3 RA4(fOCKl RA5/AN4 REO!RD#/ANS REI/WR#/AN6 RE2/CS#/AN7 OSCl/CLKlN OSC2/CLKOtJT RCO(f10S0 RCI(f10S1 RC2/CCPI RC3/SCK RDO/PSPO RDI/PSPI VSS
C>l ....
c>') .....

; com a versao a MPLAB. ria, foram escri1.2.

~+
J

GNO*

a
L

VDO PGD/RB7 PGC/RB6 RBS PGMlRB3 RB2 RBI INT/RBO PSP7/RD7 PSP6/RD6 PSPS/ROS PSP4!RD4 RX/RC7 RX/RC6 SDO/RCS SDI/RC4 RD3/PSP3 RD2/PSP2 PICI6F877P
RB4

DB9

GNO*

Figura 1.3 Alguns dos exemplos do capitulo 12 podem ser implementados mente na placa laborat6rio PIC Aplicacoes II da Symphony. direta-

Os softwares programadores foram 0 lC-PROG e 0 EPICW1N, utilizados respectivamente com as programadores JDM ePIC Aptlcacoes II.

s 16F62x, mas ) conflavel, optamunlcacao serial

Inlrodugao
(

Anota(:oes

Capitulo

Prln
i
I

Antes de inic] sarlo relembrar os pftulo vamos real] algoritrnos e outrq Podemos dizi loglco necessarlol quencla de comal rnaquina, ;
i

Esta arlrrnacs ordenamento 16gi9 De fato, a tar de ldentlflcacao um conjunto de p1


i

el

1.2)

Exposh;2 mente

0/

22) Analise! deve elal questaoj 32)

COdifica~! crever t tao a co solucao ritmo; \

42) TradUt;aJ procedir[ 1 em corm guagem!


Microcontroladores PIC - Programa9ao em C
i" ~

2
Principios de Programacao

Antes de iniciar 0 estudo da llnguagern C propriamente dita, faz-se necessarlo relembrar os conceitos baslcos de prograrnacao de sistemas. Neste capitulo vamos realizar um breve estudo sobre temas como algebra booleana, algoritmos e outros prlncipios importantes na programacao de sistemas. Podemos dizer que prograrnacao, consiste na traducao do pensamento 16gico necessario para 0 cumprimento de determinada tarefa, em uma sequencia de comandos que podem ser interpretados e executados por uma maqulna, Esta anrmacao denota, desde ja, a idela de que um programa ordenamento 16gico e traduzido do racloclnlo humano.

e fruto

do

De fato, a tarefa de prograrnacao constitui-se basicamente num processo de ldentlflcacao e solucao de problemas: Para isso 0 programador utiliza-se de um conjunto de procedimentos genericos: 12) ExposiCffao do problema: 0 prograrnador deve descrever detalhadamente 0 problema a ser resolvido pelo programs: 22) Amllise da sotucao: sendo conhecido 0 problema, 0 programador deve elaborar a ou as solucoes que melhor resolvem 0 problema em questao: 32) Codifica~ao da solucao: uma vez que 0 programador capaz de descrever tanto 0 problema quanto a sotucao para ele, necessarlo entao a codttlcacao, ou ·seja, a descrlcao sequencia! passe a passo da solucao que melhor resolve 0 problema. A isto da-se 0 nome de algoritmo;

e e

42) TraduCffao do codigo: partindo da sequencia de comandos obtidos do procedimento anterior, resta ao programador traduzir essa sequencia em comandos que possam ser corretamente interpretados pela linguagern de programacao utilizada;
Principlos de ProgramaQao

52)

Depuracac (em ingles DEBUG): infelizmente, por mais experiente que seja 0 programador, um programa nunca esta livre de erros, por isso, ap6s trnplementacao do program a, seja qual for a linguagem utilizada, sera necessario proceder sua depuracao, Depuracao entao 0 processo de verlflcacao e teste do programs de forma a localizar e solucionar todas as eventuais falhas e erros de codlflcacao que tenham acontecido em quaisquer das fases antertores,

Ja as lingu~ (compilacao) e fE rnaquina) pode s Fica clara al ja que nas interj feito em tempo n c6digo gerado, d uma enorme dif~

Utilizam-se diversas tecnlcas para facilitar estas tarefas listadas. Na analise e codlflcacao da solucao, por exemplo, utilizam-se dlagramas e fluxograrnas para a construcao graflca de algoritmos, 0 que permite uma melhor visualizacao dos passos envolvidos nele. Dependendo da complexidade do prograrna, pode ser necessario utilizar alguns artifTcios de prograrnacao:

Um conjunto de comandos utilizado repetidamente, em diferentes partes do program a, pode ser codificado separadamente, formando urn m6dulo ou funcao, Desta forma, em vez de repetir a sequencia de comandos a cada necessidade, 0 programador pode simplesmente executar a tuncao especificada; Um conjunto de comandos executado diversas vezes numa mesma sequencia constitui, no jargao dos programadores, um taco de repetigao ou em lngles LOOP. Mais adiante veremos as formas de codificagao de um loop; Normalmente em um programs necessarlo verificar ou testar determinada condlcao, seja comparar dois numeros, verificar uma senha, etc. A codltlcacao dos testes condicionais, baseados na algebra booleana, tambern obedece a algumas regras que veremos adiante.

Outro tema' da otimizacao de nlvel e traduzido pelo prograrna il vezes no prograr nivel quantas fen Por outro la( De maneira ger, utiJizam diversos gao do espaco a mesmo, 0 proce: um chip tao peq util izar plataform softwares (denon

Durante a fase de codlflcacao do algorltrno, 0 programador pode utilizar-se de ferramentas, ou programas de computador especiais, denominados geradores de prograrna, que realizam automaticamente a tarefa de conversao de um algorltrno em c6digos ou mesmo comandos de determinada llnguagern, Encontramos tarnbern alguns prograrnas especiais e que sao utilizados na fase de traducao de c6digo. Estes prograrnas sao classificados em duas categorlas: interpretadores e compiladores. As llnguagens interpretadas sao aquelas em que a traducao da linguagem feita em tempo real, durante a execucao do prograrna. Isto signiflca que as linguagens interpretadas sao mais lentas, pois 0 processo de traducao tem de ser feito para cada tnstrucao do programs. Como exemplos de llnguagens interpretadas, podemos citar algumas vers6es da linguagem BASIC, inclusive 0 BASIC STAMP, disponfvel para os PICs.

Finalmente, . programas e ha~ de erros e talhas peciais sao utild programador a c] 9aO de variavels, i
,

2.1. Fluxogj

Como ja foil I mente a tarefa d~ Na realidad~ lecer a sequenci nada tarefa e, co

A seguir, ved de fluxogramas, ~

Microcontroladores PIC - Proqrarnaeao em C

experiente que erros, por isso, guagem utiliza-

acao entao

la a localizar e ncacso que te-

e0

Ja as linguagens compiladas sao aquelas em que 0 processo de traducao (cornpilacao) feito previamente e 0 codlgo gerado pelo compilador (codlgo de maqutna) pede ser carregado na memoria e executado diretamente por ele.

s Jistadas. Na ~ramas e fluxote uma melhor


essarto utilizar diferentes par, formando um sequencia de simplesmente
I

Fica clara a vantagem das linguagens complladas sobre as interpretadas, ja que nas interpretadas, 0 trabalho de traducao do codigo-fonte, alern de ser feito em tempo real, deve ser feito pelo proprio processador que ira executar 0 codlgo gerado, 0 que em muitos casos (como no PIC em questao) resulta em uma enorme diferenc;a. Outro tema interessante sobre as llnguagens interpretadas 0 aspecto da otlrnlzacao de c6digo: nas Iinguagens interpretadas, cada comando de alto nlvel traduzido em uma respective sequencia de comandos de baixo nlvel pelo programs lnterpretador. Se um mesmo comando for utillzado diversas vezes no prograrna, serao geradas tantas sequenclas de comandos de baixo nlvel quantas forem as aparlcoes do comando de alto ntvel.

numa mesma

taco de repetilas de codifica-

Por outre lado, em um compilador, isto ja nso acontece da rnesrna forma. De maneira geral, os compiladores sao programas altamente complexes e utilizam diversos artiflcios para a otlmlzacao do c6digo gerado, tanto em funcao do espaco ocupado, como tambem na velocidade de execucao, Por isso mesmo, 0 processo de cornpllacao e complexo demais para ser embutido em um chip tao pequeno como os PICs, por exempJo, razao pela qual devemos utilizar plataformas computacionais mais potentes para a execucao de tais softwares (denomlnacao em ingles para program as de computador). Finalmente, na fase de depuracao, encontramos tambem diversos prograrnas e hardware (equipamentos) para auxiliar 0 programador na busca de erros e falhas no programs. Alguns desses prograrnas e equipamentos especlals sao utilizados para simular a execucao do prograrna, permitindo ao program ador a checagem a qualquer tempo do estado do programa, verificac;ao de varlavels, etc.

iu testar deterar uma senha,

ia algebra booadiante. pode utilizar-se unados geradonversao de um uagem. io utilizados na em duas cate-

2.1. Fluxogramas
Como ja foi dito, os fluxogramas sao ferramentas mente a tarefa de codltlcacao de um prograrna, que auxiliam grande-

o da llnguagern
dgnifica que as aducao tem de ~Iinguagens in31C,inclusive 0

Na realidade, fluxogramas sao elementos graftcos utilizados para estabelecer a sequencia de operacoes necessarlas para 0 cumprimento de determinada tarefa e, consequenternente, a resolucao de um problema. A seguir, veremos alguns exemplos de elementos utilizados na construcao de fluxogramas, bem como alguns exemplos deles.

(------------~~~----------1.
Principios de ProgramaQao •

lntcio ou termlnacao: este tlpo de slmbolo e utilizado para representar 0 inlclo ou termlno do programs ou algoritmo. Processo: este sfmbolo e utilizado para descrever a realiza~ao de uma determinada tarefa. Dados: normal mente este sirnbolo um processo de entrada de dados.

I
/

utilizado para descrever

<">
cionar

Tomada de decisao: este slrnbolo utilizado para representar um ponte de tomada de declsao, ou teste condicional. A tom ada de declsao pode conduzir sempre a um resultado: verdadeiro ou falso. Em um dos casos 0 fluxo do programs e desviado e no outro, normalmente, 0 program a seguira na sua sequencia normal.

Vejamos um exemplo de um fluxograma para a solucao de um problema simples: somar dois numeros (A e B) e armazenar 0 resultado em C.

o fluxograma
0

da flgura 2.1 representa os passos necessarlos para soluproblema descrito.

2.2. Aigebr~
Agora que j~ dos fluxogramas I verifiearmos alg~ 16gieos: a algeb~ Gao de problema George Boole (1 A algebra b~ proposlcoes e opj Uma propos! de ser classifiea ' domingo" pode da como verdade 9aO, pois nao po
I

'*

Figura 2.1

Um Dutro exemplo: um program a para contar de 0 ate 10.

Duas ou rna dores logtcos rel1 operador coes, resultando]

I
i

Microcontroladores PIC -Programaqao em C


'I

e
IU

utilizado para algorltrno,

Infcio

.crever a realizaContagem

=0

) para descrever
Soma 1

para represente condicional. A a um resultado: o do programa e 'ama seguira na


D

a contagem

Nao

, de um problema ) em C. ssarlos para soluFigura 2.2

2.2. Algebra Booleana


Agora que ja vimos alguns detalhes sobre 0 funcionamento e apllcacao dos fluxogramas no planejamento da solucao de um problema, necessarlo verificarmos alguns conceitos importantes sobre a resolucao de problemas logicos: a algebra booleana, um ramo da maternatlca encarregado da resolucao de problemas 16gicos. Este nome devido ao fato de ter sido 0 ingles George Boole (1815-1864) um dos seus prlnclpals articuladores.

A algebra booleana baseada em regras e conceitos loglcos simples: proposlcoes e operadores loglcos relacionais. Uma proposicao nada mais do que qualquer aflrmacao verbal passive I de ser classificada como sendo verdadeira ou falsa. Assim, a atlrrnacao "Hoje domingo" pode ser considerada uma proposlcao, ja que pode ser classificada como verdadeira ou falsa. Ja a frase "Que dia hoje?" nao uma proposlcao, pols.nao pode ser classificada como verdadeira ou falsa.

e
).

Duas ou mats propcsicdes podem ser relacionadas com dores loglcos relacionais E, OU e NAO.

usa dos opera-

operador relacional E utilizado para conectar duas ou mais proposlcoes, resultando na chamada CONJUNCAO.A conjuncao de duas au mais pro-

Princfpiose Programagao d

poslcces somente sera verdadeira seTODAS as proposicoes ras.

forem verdadei-

Em segulda temos a tabeJa-verdade, que demonstra 0 relacionamento entre as proposlcoes "A" e "B", 0 que resulta na coniuncao C. Imagine entao que tenhamos a segulnte afirmacao: "Se for no domingo E 0 tempo estiver born, iremos praia."

Finalmente, tl minada proposlca ao original. Assirri verdadeira, conchl proposrcao, ternos poslcao for verda domingo, ao contn
• !

Se considerarmos a atlrmacao "Se for no domingo" como sendo a proposlcao "A" e a anrmacao "0 tempo estiver born" como sendo a proposicao "B", a conluncao C que ira determinar a ida ou nao praia pode ser verificada da seguinte forma:

Em seguida t~

B
(0 tempo esta born?) F

c
(Vamos it praia?) F F F

(E domingo?)
F F

V
F V

V V

B.

Observe aindi Ap6s esta bn

Tabela2.1 operador OU e tarnbem utilizado para relacionar duas ou mais proporesultando em uma nova proposlcao chamada DISJUNCAO. A dlsjuncao de duas ou mais proposlcoes sera verdadeira se QUALQUER das proposlcoes for verdadeira. Ja
0

gramacao,

vejamol

slcoes,

2.3. Variave~
Variavel un] um determinado d. quina e podem ass
I

No exemplo seguinte, temosa utlllzacao da DISJUNCAO. Imagine urn sistema de alarme composto de dois sensores (A e B). A saida do alarme (C) sera verdadeira (alarme disparado) se qualquer dos sensores estiver ativado (verdadel ro). Vejamos a tabela-verdade para a dtsjuncao: A
F F V B F V F C F

Sempre que ~ veniente do rnundt mente, etc.) cornd exemplo} sera utilil
I

V V V

De fato, as v~ em qualquer tipo d ca que num cornpd veis, definidas pel Um outro asp de urn prograrna, nunca dois au mai

V Tabela 2.2

Podemos verificar que a proposlcao C (0 alarme esta disparado) sera verdadelra se urn dos sensores (A ou B) for verdadeiro.

As variavels s narn e podem ser: .,. I A s varravers 11 i menta de dados nu

t
1
'1

Microcontroladores PIC - Programa~ao em C

i
.1

;.:.;.;.,_.___

orem verdadei.lonamento engine entao que o estiver bom,


sendo a pro po-

Finalmente, temos 0 operador loglco NAO utilizado para negar uma determinada proposlcao, fazendo com que a proposlcao possua sentido contrarlo ao original. Assim, considerando a proposlcao original: "Hoje domingo", se verdadeira, concluirlamos que domingo e se falsa, que nao Negando a proposlcao, temos: "Hoje NAO domingo". Observe que agora, se a nova proposicao for verdadeira, concluiremos que nao domingo e se falsa, que domingo, ao contrarlo portanto, da proposlcao original.

e.

roposlcao "B", ~rverificada da

Em seguida temos a tabela-verdade para a funcao NAO:

~ Tabela 2.3

B.

Observe ainda que a negacao de B tarnbern pode ser expressa como nao

Apos esta breve explanacao sobre alguns dos prtnclplos gerais de prograrnacao, vejamos um pouco mais sobre as llnguagens de prograrnacao,

ou mais propoO. A dlsjuncao IS proposlcoes 'iaglne um sisdo alarme (C) sstlver ativado

2.3. Variilveis e Dados


vartavel uma representacao slmbollca para elementos pertencentes a um determinado conjunto. As variavels sao armazenadas na memoria da rnaquina e podem assumir qualquer valor dentre 0 conjunto de val ores possfvels.
Sempre que necessitarmos armazenar algum tipo de dado, seja ele proveniente do mundo exterior (uma tecta presslonada, uma tensao lida externamente, etc.) como do proprio programs (0 resultado de uma equacao, por exemplo) sera utilizada uma varlavel, De fato, as vartavels ficam localizadas na memoria do equipamento, nao em qualquer tipo de memoria, mas nas chamadas rnemorlas RAM. Isto signlflca que num computador, boa parte da sua memoria RAM ocupada por variaveis, definidas pelos program as em execucao no computador.

Um outro aspecto importante sobre as variavels que durante a execucao de um prograrna, uma varlavel pode assumir diversos valores diferentes, mas nunca dois ou mais val ores simultaneamente. 'ado) sera verAs vanavels sao classificadas segundo 0 tipo de conteudo que arrnazenam e podem ser: numertcas, caractere, alfanumerlcas e loglcas, As varlaveis nurnerlcas sao evidentemente utilizadas para mento de dados numerlcos e podem ser classificas em:
Principios de Programagao
(

armazena-

• •

Inteiras: quando utilizadas para armazenar valores inteiros. Exemplo: 0, 5, 156, etc. Reais ou ponto flutuante: quando utilizadas para armazenar valores nao inteiros, OU seja, nurneros reais. Normalmente, este tipo de variavel utiliza uma notacao blnarla especial para 0 seu armazenamento e utilizam mais poslcoes de memoria que as vartavels inteiras.

Operadorei lacionar ou mol

Podemos ] rias principais: !


• •
"i

Matell]
ternatk
-

A quantidade de memoria utilizada para armazenar uma vartavet depende do seu tipo: varlavels inteiras sao normalmente encontradas com tamanhos de 8, 16 ou 32 bits. Urna varlavel inteira de 8 bits pode armazenarum valor entre e 255, uma varlavel de 16 bits pode armazenar um valor entre 0 e 65535 e uma varlavel de 32 bits pode armazenar um valor entre 0 e 4.294.967.295.

gao, et

Relaci~ Exempl

Observe que os numeros representados acima sao somente positives, no caso de representacao de numeros com sinal, a magnitude de representacao reduz-se metade daquela sem sinal.

L6gic~" tre doii pode q trequej tiplas \)

Ja as variaveis do tipo real ou de ponto flutuante sao normalmente encontradas em tamanhos de 16, 32, 64 ou 80 bits! A titulo de exemplitlcacao, uma varlavel de ponto flutuante de 80 bits pode representar valores entre 3,4-4932 e 1,14932! Vale lembrar ainda que num sistema de 8 bits, uma varlavel de 16 bits vai ocupar duas poslcoes de memoria e, .consequenternente, uma variavel de 32 bits ocupara quatro poslcoes de memoria.

I
!
I
I

Logico: entre ~ goes 1< dos, re funcao

I
I

cao

Memo.

a~
I

Ja as varlaveis do tipo caractere sao utilizadas para representar um caractere, utifizando normal mente para lsso um codlgo especial (normalmente 0 codlgo ASCII).
As variavels do tipo caractere podem ser agrupadas em conjuntos de varlavels para formar frases ou textos. As varlavels do tipo alfanumerica sao utilizadas para armazenar tanto caracteres como val ores nurnerlcos, mas nunca os dois simultaneamente. Sendo assim, uma varlavel alfanumerica pode num dado momento conter um valor numerlco e em outro ponte do prograrna, ser utilizada para arrnazenar um caractere. Finalmente, temos as vartavelsdo estado loglco: verdadeiro ou falso. tipo 16gico, capazes de armazenar um

2.5. Exerq
1) Nas equa~ verdadeiral I. R = (A a) A=1 b) A=j I c) A=I i d) A=l II.

R = ((~ .. j a) A=,
c)

b) A= A=,

2.4. Operadores·
Muitas vezes necessitamos relacionar ou modificar um ou mais elementos como variavels ou dados em um programa.

d)

A=l = A=j A=I

III. R
a) b)

((1
)
,I
:1 ··1

Microcontroladores PIC - Programa9ao em C


'I

'I
'I

slros. Exemplo: iazenar valores :e tipo de variaazenamento e lras. riavel depende tamanhos de um valor entre e 0 e 65535 e

Qperadores sao elementos ou slrnbolos graflcos utilizados entao para relacionar ou modificar um ou mais dados ou variaveis. Podemos classificar rias principais: • os operadores de uma linguagem em cinco catego-

Matematicos: sao utilizados para efetuar determinada operacao rnatematlca em relacao a um ou mais dados. Exemplo: adlcao, subtraQao, etc.; Relacionais: sao utilizados para relacionar do is elementos ou dados. Exemplo: maior, menor, igual; L6gicos: sao utilizados para efetuar operacoes 16gicas boolean as entre dois ou mais elementos ou dados. Este tipo de operacao somente pode chegar a um dos resultados: verdadeiro (1) ou falso (0), e sao frequenternente utilizados na crlacao de testes condlclonals com multlplas varlavels. Exemplo: funcao E, funcao QU, fungao Nao; L6gicos bit a bit: utilizados para realizar operacoes logicas bit a bit entre um ou mais elementos ou dados, conforme 0 caso. As operacoes 16gicas bit a bit sao realizadas entre cada um dos bits dos dados, resultando em um valor qualquer. Exemplo: funcao E, tuncao QU, funcao Nao, rotacao de bit, etc.; Memoria: sao operadores utilizados para efetuar operacoes em relagao mem6riado equipamento. Exemplo: atrihuicao (=), & e *.

• •

)4.967.295.

:e posltlvos, no representacao almente enconplificac;:ao, uma valores entre ivel de 16 bits rna variavel de ntar um caracormalmente 0 •

2.5. Exercicios
1) Nas equacoes verdadeira?
I.

mluntos de vazenar tanto camente. Sendo nter um valor azenar um caarmazenar um

boolean as seguintes, quais valores de A, B e C tornam R

R = (A e B e C) a) A=V, B=F, C=V

b) A=F, B=F, C=F c) A=F, B=V, C=V d) A=V, B=V, C=V II. R

= «A e (nao B» ou C)

a) A=F, B=F, C=F

b) A=F, B=F, C=V c) A=F, B=V, C=F d) A=V, B=F, C=F mais elernenIII. R = «nao A) OU (nao B) outnao C» a} A=V, B=V, C=V b) A=F, B=F, C=F
Princfpios de Programa~ao

rr-...
A=V, B=F, C=F d) A=V, B=V, C=F
c)

f
,~

IV. R

= «A

ou B) e (nao C»

a) A=V, B=F, C=V b) A=F, B=F, C=V c)

A=F, B=V, C=F

d) A=V, B=V, C=F . 2) Supondo a aflrrnacao: se nao estiver chovendo e eu sair mais cedo do trabalho, iremos a praia. E considerando A= "Esta chovendo?", B = "Eu sai mais cedo do trabalho?" e C a resposta: "Iremos a praia", determine a equacao booleana que descreve corretamente a aftrrnacso inicial: a) A e B

=C

b) A ou B
d) 3)

=C

c) A e (nao B)
(nao A) e B

=C

=C

Qual 0 tlpo de variavel necessarto para armazenar cada um dos seguintes dados: a) c)

conforme:j mento 0 cornp] desenvolvi meril linha de micro] previsao para ~ serie 17, alem portados por eJ

150

IDE na ij dentes: ::\ • • • PCB:p PCH:


:1

b) "Linguagem C"

100,1 d) 250 e) "123"


V

PCM: ~ d

p.

f) g)

o usuario:j completo, depe


Existe taJ mando e tamb] mos adiante. :1
,!

-5

h) F

Vejamos a1


• •

~~:Pd~ ..
fato d • Grand Grand~
:1
:r

~a~~~
j
Microcontroladores PIC - Programag8o em C
'}
r
!

3
Compiladores CCS C
ir mats cedo do ndo?", B :::: "Eu raia", determine ao inicial:

Conforme ja dito, neste livro utilizaremos como plataforma de desenvolvimento 0 compilador PCWH da CCS. Ele consiste em um ambiente integrado de desenvolvimento (IDE:) para 0 sistema operacional Windows e suporta toda a linha de microcontroladores PIC (series piC12, PIC14, PIC16 e PIC18). Existe prevlsao para suporte aos DsPIC assim que estiverem disponlveis. Os PICs da serle 17, alern dos microcontroladores da UBICOM/SCENIX (SX), nao sao suportados por esta versao do compilador. dentes: • • • PCB: para dispositivos de 12 bits (series PIC12 e PIC16C5X); PCM: para dispositivos de 14 bits (series PIC 14000 e PIC16xXXX); PCH: para dispositivos de 16 bits (serle PIC18).
0

dos seguintes

IDE na realidade e constitufdo de tres m6dulos compiladores

indepen-

usuarlo pode optar por adquirir os modules separados ou completo, dependendo da aplicacao a que se destina 0 compilador.

pacote

Existe tambem a possibilidade de utilizar 0 compilador pela linha de comando e tambem a partir do ambiente MPLAB da Microchip, conforme veremos adiante. Vejamos agora as principais caracterlsticas do compilador em estudo: • Compatibilidade com a padrontzacao ANSI e ISO (algumas caracteristicas do compiJador nao fazem parte da norrnatlzacao ANSI devido ao fato de serem especfficas para a arquitetura PIC); Grande eflciencia no codlgo gerado; Grande diversidade de funcoes e bibliotecas da linguagem C (padrao ANSI), tais como: entrada/salda serial, manlpulacao de strings e caracteres, funcoes rnaternatlcas C, etc.;

• •

Compiladores CCS S

.......... ---.------------~~~~""""'"=~~----------------

,/

Grande portabilidade de codlgo entre os diversos microcontroladores PIC e inclusive com c6digo escrito para outros microcontroladores ou sistemas. Isto slgnlflca que muito facll adapter um programa escrito em C para outro dispositivo ou sistema (seja ele um outro PIC, outro tipo de microcontrolador, ou mesmo um programa para PC).

u~~~
: I I I I I I I I I I I I I '

I I

3.1. Ambiente Integrado de Desenvolvimento (IDE)


Como ja dissemos, 0 compilador PCWH constitufdo de um IDE graflco que pede ser executado em qualquer plataforma WindowsTM. Na flgura 3.1 temos uma imagem do IDE.

,
I I I
:

,
I

I
:

1 ~ ----~ ..
1._-

------

---

~-------

-- __ 1

..1
j

A selecao] ladores (PCB ~ compilar 0 prog conjunf lnformacoes:

:1 i[

~ - ViSU~ cess] do cd
.J

No exernp
ccs pew e

1
:1

Figura 3.1 Passemos entao a uma analise detalhada de cada opcao e Icone dlsponlvels neste ambiente.

*:!

:1

0000: MO~ 0001: MO~ 0002: GO]

~~~~: .. ~~ I

::::::::: J .........
"."
"

"j

,
;l, ,1

......... ~ ......... ,
Microconlroladores PIC - Programalfao em C

::rocontroladores .ontroladores ou irograrna escrito outro PIC, outro 1 PC).

~b,~:,::.; ll~icl?c.hip ·.m:i;,;,i:::'


, ,
I I J I

1,4,bit

iJ!~i\~~'iimmm~;:r~".:;~jft.~limmm'ljlimlli"ji
I I

::

I I

Fecharprograma Iniciar MPLAB Estatfsticas


Arvore de chamadas
,

::
I

,----------

:
I

.---------------

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

1tO

(IDE)

"--------------------------------------------------------------------------------------------------------------

Usta de simbolos C6digo assembly Compilar Sele¢o de Iamflla PIC

~um IDE gratlco

- -- - -- -- - --- --- - - --- - - - --- -- --- -- --- -- -- - --- -- - --- - Fecher arquivo

,
:

- -- --- --- -- - --- --- - - - -- - -- --- -- --- -- --- -- - - - --- -- - --- - Salvar arqulvo ---------------------------------------------------------Abrir arquivo Novo arquivo

!-----------------------------------------------------------Figura 3.2

A selecao de familia PIC utilizada para especificar qual dos tres cornplladores (PCB - 12 bits, PCM - 14 bits ou PCH - 16 bits) sera utiIizado para com pilar 0 programa. conjunto de botoes tnformacoes:

~.:.~.'·W e

utiIizado para visualizar as seguintes

Visualizar 0 c6digo Assembly gerado peIo compilador. A visuallzacao desse codigo pode auxiliar 0 prograrnador na verificacao e otlmlzacao do codlgo gerado pete compilador. No exemplo do programs da flgura 3.1,
CCS

codlgo assembly visualizado e:

pcw

C Compiler,

Version

3.104,

14768

Filename: ROM used:


RAM

c:\meus

documentos\picc\prog\teste.LST

used:

e icone dlsponl*
0000: 0001: 0002: 0003: MOVLW MOVWF GOTO NOP

Stack:

59 (1%) Largest free fragment is 2048 9 (5%) at main() level 10 (6%) worst case 1 locations

00 PCLATH main *include <16f877.h> II Standard Header file *device PIC16F877 *list'

for the PICl6F877

device

*use delay(c1ock=20000000) *fuses HS,NOWDT,PUT,BROWNOUT

Compiladores CCS S

void
(

main () int a,b,c;

002B: 002C: 002D: 002E: 002F: 0030: 0031: 0032: 0033: 0034: 0035: 0036: 0037: 0038: 0039: 003A:

CLRF MOVLW ANDWF MOVLW BSF MOVWF BCF MOVF MOVWF MOVLW MOVWF GOTO MOVF ADDWF MOVWF

FSR iF STATUS,F OF STATUS. 5 ADCON1 STATUS. 5 a=b*5+c;

Visual visual do prl moria

b,W
??65535 05 @MUL88.P1 @MUL88 c,W @78,W a

l±:,- Visua as es
ROM used:

~...................
SLEEP

~-

Visualizar slrnbolos gerados: esta opcao permite ao prograrnador visualizar a lista de sTmbolos utilizados e criados pelo compilador para a tarefa de comptlacao do programa.
0

e:

No exemplo da figura 3.1,


008 015-016 015 016 01B-01C 01B 01C 021 022 023 024 024 025 077 078 078 079 07A 07B PSP_DATA CCP_l CCP_l_LOW CCP_l_HIGH CCP_2 CCP_2_LOW CCP_2_HIGH main. a main.b main.c @MUL88.p1 main.@SCRATCH @MUL88.P1 @SCRATCH @SCRATCH _RETURN_ @SCRATCH @SCRATCH @SCRATCH delay_ms.P1 delay_us. P2' main @MUL88

conjunto de sTmbolos gerado pelo program a

Segment 0000-0003 0004-07FF 0800-0FFF 1000-l7FF IBOO-lFFF

Vejamos ~
I

002B 0004

project Files: c:\meus docurnentos\picc\prog\teste.c D: \picc\devices\16f877.h

No menu! ra, fechamentd

menu ~. mento e lrnpra


(
j
\" ,

Microcontroladores PIC·

ernC

"

s IF'Visualizar arvore de chamadas: esta opcao permite ao programador visualizar toda a estrutura de chamada de fungoes que ocorre dentro do program a, alern de apresentar detalhes sabre a utiuzacao de me, moria RAM e ROM para cada tuncao do programs.
'--t~st~

'--f'1ain

0/16

Raf'1=4 RaM=2

t-??0??
'--@MUL88 0/39

Figura 3.3

l£- Visualizar estatlstlcas: esta opcao permite ao programador visualizar


as estatistlcas de compllacao do prograrna,
ROM used: 59 (1%) 2048 (25%) including unused fragments o Average locations per line 59 Average locations per statement RAM used: 9 (5%) at main() level 10 (6%) worst case Lines Stmts % Files 13 249 524 Page ROM

programador vicompilador para

a pelo program a

1 100 0 2 Total

c:\meus documentos\picc\prog\teste.c D:\picc\devices\16f877.h

% 27 66

RAM 4 2

Functions: main @MUL88

16 39

Segment
---------

Used 4
55

Free 0 1989 2048 2048 2048

0000-0003 0004-07FF 0800-0FFF 1000-17FF 1800-1FFF

0 0 0

vejamos agora a estrutura de menus do compilador PCWH:

Figura 3.4 No menu FILE encontramos as tradicionais comandos de crlacao, abertura, fechamento e lmpressao de arquivo. menu PROJECT apresenta comandos para a crlacao, abertura, fechamento e lrnpressao de arqulvos de projeto. No menu PROJECT encontramos
Compiladores CCS S

r
.

Ii
II
Ii Ii

tambern a opcao INCLUDE DIRS, utilizada para especificar em quais dlretorlos o cornpllador ira buscar os arquivos de lnclusao (normalmente com a extensao

No menu C tor de arquivos i

" .h").
No meu EDIT encontramos os tradicionais comandos de edicao (UNDO desfazer (CTRL+Z), COpy - coplar (CTRL+C), CUT - recortar (SHIFT +DEL), pASTE - colar (SHIFT +INS), SEARCH - procurar (CTRL +F), REPLACE - substituir (CTRL+R), NEXT - procurar proxima (F3)), alern de outros, como: • • • COPY FROM FILE: em edlcao:

l\ f!

• • • • • • • • • •

~ ~

REAL em vet

1
I

TAB SI!

cao:

coplar de arquivo - insere um arqulvo no programs arqulvo - copia


0 texto

PASTE TO FILE: colar em determinado arquivo;

selecionado

para um

MATCH BRACE (CTRL+]): utilizado para encontrar a abertura/fechamento de chave correspondente chave atual e mover 0 cursor para aquela;

iI
I
I

~ ~

i.

AUTO Ii WORDl quencii


i

EDITOH zado ni

SYNTA!, as carr
J

AUTO

• • • • • •

MATCH BRACE EXTENDED (SHIFT+CTRL+]): respondente chave atual;

seleciona

todo 0 bloco cora

I
i
I

INDENT SELECTION (ALT+F8):utilizado to atual; TOGGLE BOOKMARK local do programa;

para indentar marca


0 cursor

selecao de tex-

EDITOI lingua~

RECALJ TOOLS FILE ~ quivos'

(CTRL+SHIFT+nOmero): desloca .

um determinado para um dos

GOTO BOOKMARK (SHIFT +numero): cais previamente marcados; NEXT WINDOW compiJador; (CTRL+N): apresenta

10-

a proxima ajanela

janela

de edi<;ao do anterior.

PREVIOUS WINDOW (CTRL+P): apresenta


ctri+z ~Cut ShiR+PeI Ctri+C ShiR+1ns

de edlcao

.il

Ir- Copy
~Pa't. ~ Select All fU.

Iit"l Copy from

r;: Past.
HNo>t

to fU. ctri+F Ctri+R. i

.,,

El! Replace

o Match Brace
(-~ Match Brace Extended •-~-111-tl"-·ll:5-';'!I:l-C;I:o-"

F3!
ctrI+]

i
:

~~~~·t:;;1

Shift+ctri+)

debug gerado

Nesta

Jal

.I

10 Toggle
Goto

Boclonark

~i

eoolon..-k

extensao do . formato do ar gem (LST).

1<> Next Willlow

¢ol Previous 'Modow

::~ I

o arqulvo]

Figura 3~5
Microcontroladores PIC· Programayao em C

j
I

.1.

quais dlretorlos com a extensao edlcao (UNDO IFT+DEL), PASTE ICE - substituir ivo no prograrna :ibnado para um aberturajfechaer 0 cursor para todo
I

No menu OPTIONS encontramos diversas opcoes de configuracao do editor de arquivos e do compilador PCW, tais como: • • REAL TABS: utiliza caracteres de tabulacao (TAB) em vez de espacos: TAB SIZE: especifica Gao;
0
01 01

Real Tabs Tab Size Auto Indent WordStar keys Editor Font .. ,

tamanho de cada tabula-

• •

AUTO INDENT: ativa a auto-lndentacao do editor; WORDSTAR KEYS: ativa compatibilidadecom sequencias de controle do editor do wordstar®; EDITOR FONT: seleciona zado no editor;
0

01 01

Syntax Highlighting Auto Highlight Brackets Editor Calms Recall Open Faes Toolbar .. , File formats ... Globa! Defines .. , DebuggerJProQramer ••• Include Dlrs .. ,

Y'



tipo de caractere utili-

-----

SYNTAX HIGHLIGHTING: realce de sintaxe: exibe os comandos C em cores diferentes; AUTO HIGHLIGHT BRACKETS: realca as chaves;

Figura 3.6

bloco cor-



• •

selecao de tex-

EDITOR COLORS: permite seleclonar as cores para cada elemento da linguagem C (identificadores, cornentarlos, etc.); RECALL OPEN FILES: atualiza os arqulvos abertos; TOOLBAR: permite configurar a barra de ferramentas do editor; FILE FORMATS: abre uma janela de conflguracao dos formatos de arquivos de salda do compilador:

rm determinado para um dos 10a de edicao do dlcao anterior.

Figura 3.7 Nesta janela podemos definir parametres, como: 0 tipo de arquivo de debug gerado (DEBUG FILE), 0 tipo de arquivo objeto gerado (OBJECT FILE), a extensao do arquivo objeto (normalmente HEX), 0 tipo de arquivo de erros, formato do arquivo de llstagem (LIST FORMAT), extensao do arquivo de listagem (LST).

o arqulvo de debug e normal mente utilizado pelos emuladores


Compiladores CCS S

de hardware.

.............

-... -----------------~----------~-----~.~

arquivo de objeto 0 prograrna em codigo de rnaquina pronto para ser gravado na memoria do PIC. cluindo •

arqulvo de listagem utilizado para verttlcacao do codlgo gerado, in0 fonte em Ceo assemblygerado pelo compilador. GLOBAL DEFINES: Esta janela permite a criacao de definic;;:oespadrao para utlllzacao no ambiente IDE. Repare que estas detlnlcoes nao sao utilizadas pelo compilador de llnha de comando ou pelo ambiente integrado no MPLAB. Nestes casos, 0 programador deve utilizar definicoes no pr6prio c6digo-fonte do programa ou em um arquivo separado.

No caso q nome do arqui\ No caso d o nome do pro]

INCLUI direton quisa E


;
I

Figura 3.8 quando a opcao ENABLED esta selecionada. •

convern observar tambern que estas deflnlcoes somente sao utilizadas


DEBUGGER/PROGRAMER: Esta janela permite selecionar as opcoes de programador de dispositivos edepurador/slmulador.

A prOXima apenas uma q processo de cq


;

A seguir, "Ii

j
As quatro
1

Neste me~ • Figura 3.9

DATA ~ necest o que] cada ~

Microcontroladores PIC - Programa~ao em C

pronto para ser digo gerado, inflnlcoes padrao inic;:oes nao sao elo ambiente inve utilizar defini'quivo separado.

No caso do programador, posslvel adicionar ainda parametres como nome do arquivo a ser program ado (%H) e 0 dispositivo (%0).

No caso do debugador/slrnulacor, possfvel adicionar parametres como o nome do projeto (%P) e nome do arquivo de debug (%C).

INCLUDE DJRS: Esta janela permite alterar e adicionar a ordem e os dlretorlos de pesquisa para os arquivos de lnclusao, A ordem de pesquisa e de cima para baixo.

Figura 3.10 A proxima opcao do menu principal 0 menu COMPILE, que conta com apenas uma opcao COMPILE. Ela obviamente utllizada para dar lnlclo ao processo de cornptlacao do programs.

e sao utilizadas nar as opcoes

A segulr, temos

menu VIEW com as seguintes opcoes:


§t

C/ASM List Call Tree ..

(i!l;' Symbol Map

•.

® Data Sheet
"(" Valid Fuses

kb Statistics --_._

__ ...._ .......

~P Va~d Interrupts

ii1 Binary

'l:i COD Debug

File

File

Figura 3.11 As quatro primeiras opcoes ja foram vistas anteriormente neste capitulo. Neste menu, encontramos ainda as opcoes: • DATA SHEET: para visualizar a folha de dados do dispositivo em uso (e

necessarto instalar separadamente os datasheets dos componentes,


o que pode ser feito a partir do CD-ROM do compilador ou baixando cada arqulvo do site do fabricante);

Compiladores CCS S

• • • •

VALID FUSES: esta opcao permite visuallzar as defini<;oes valtdas a palavra de conflguracao do dispositivo selecionado; VALID INTERRUPTS: permite visualizar as lnterrupcoes disponfveis

para no

dispositive selecionado;
BINARY FILE: abre um arquivo blnarlo para vlsualizacao: COD DEBUG FILE: abre um arquivo debug para vlsuallzacao. algumas
0 programador

No menu TOOLS encontramos muito interessantes e que auxiliam


~

ferramentas internas e externas na tarefa de programacao:

rri: Devlc:e Selector


~

Device Editor

~%~umerIc N
II!

Fie Compare
Converter

M Di:;;assembler
"#' Extract
.t
Internet

Serial Port Mcn~Ol Cal Data


,

IIMPLAB

Program Chip

Figura 3.12
• DEVICE EDITOR: 0 editor de dispositivos e uma ferramenta muito interessante que permite ao prograrnador adicionar ou alterar a forma como 0 compilador trata cada dispositivo da familia PIC. Com esse editor possfvel adicionar novos dispositivos medida que eles se tornarem disponTveis;

com d (12C5 vez s~ arqulv tino) ~ mente ,

PROGI partei MPLAI


i

DEVICE SELECTOR: esta opcao gramador selecionar e comparar das famflias PIC; FILE COMPARE: permite NUMERIC guagem CONVERTER: efetuar esse

abre uma janela que permite ao proas caracterTsticas de cada dispositivo a comparacao entre dois arquivos;

• •

INTER: ,

• •

Finalmen~ I o de praxe: au!

conversao entre os tres principais


C: inteiros •

pequeno programs permite efetuar a tipos de dados disponiveis na linsem sinal, inteiros com sinal e ponto flutuante;

3.2. lnteg
Alem do
PCH integradol A seguir,! programar em Ap6s inst]

SERIAL PORT MONITOR: invoca um pequeno e simples terminal de comunlcacao serial, que pode ser utilizado para efetuar a cornunlcac;:ao com um microcontrolador por meio da porta serial do mlcrocomputador; DISASSEMBLER: 0 disassembler um programs que faz 0 contrarlo do montador, ou seja, ele desmonta os c6digos blnarlos e traduz novamente em mnem6nicos assembly.

opcao PROJE9
Digite 0 ~ de opcoes do

Microcontroladores PIC· Programa~aoem C


I I

I' ,
:1

.,
i.li

;1
1

'.~.:I ~, ·

~:.l ·.'.'.1.··. ,.::;

\~

I:
'.··..1··1' ..

~I

i~

i~

l
oes validas para :; dlsponlvels no
I'

Para utilizar 0 disassembler, primeiramente informamos 0 nome do arqulvo a ser desmontado em INPUT FILE, emseguida 0 nome do arqulvo a ser gerado em OUTPUT FILE. Em seguida, selecionamos as opcoes de desmontagem: codigo de 12 ou 14 bits (nao e posslvel desmontar program as para PICs da familia 18), tipo de arquivo de entrada (hexadecimal ou blnarlo), tipo de rotulos (LABELS) utilizado (endereco simples, rotulo C ou Assembly) e final mente 0 formato nurnerico de salda.

acao,
rnas e externas

prograrnacao:

Figura 3.13

Ao clicar no botao DASM, 0 processo de desmontagem tera inTcio e sera gerado 0 arquivo de safda especificado em OUTPUT FILE. • EXTRACTCAL DATA: esta opcao deve ser utilizada quando se trabalha com dispositivos dotados de clock interne com palavra de callbracao (12C50x, 12C51x, 12C67x, 12F629 e 12F675, entre outros). Uma vez selecionada esta opcao, 0 programador deve informar onome do arquivo hexadecimal (que deve conter a leitura previa do chip de destino) do qual sera feita a extracao da palavra de calibracao (normalmente localizada no ultimo endereco valtdo da memoria de programs): PROGRAM CHIP: invoca 0 programador de dispositivos (0 qual nao faz parte do pacote do compilador e deve ser adquirido separadamente); MPLAB: invoca
0

ienta muito intealterar a forma PIC. Com esse ida que eles se permite ao procada dispositivo )is arquivos; rmite efetuar a na llnto flutuante;
sponlveis

• • •

ambiente MPLAB;

INTERNET: permite acesso ao site do fabricante do compilador.

Finalmente, a ultima opcao do menu principal do programa, HELP, contern ode praxe: auxflio (em Ingles) ao programador.

3.2. lntegraeao com 0 MPLAB


I.
Alern do ambiente IDE, possfvel PCH lntegrados ao ambiente MPLAB. programer

lies terminal de ar a comunicado microcompu-

utilizar os compiladores

PCB, PCM e para

z 0 contrarto do ; e traduz nova-

A seguir, veremos passo a passo os procedimentos em llnguagem C dentro do MPLAB.


0

necessarlos

Apos instalado 0 cornpllador no computador, inicie opcao PROJECT> NEW PROJECT.

MPLAB e selecione a .

Digite 0 nome do arquivo de projeto e clique em OK. Deve surglr a janela de opcoes do projeto, como na flgura 3.14.

Complladores CCS S
(

Em segui CCS (figura :3 apenas OK.


ADD NODE, ql como as outra Clique gura janela Repare

qi

3.17 e SE

nd

Deve sun a progi PCM ou PCH,

9aO GENERATI Figura 3.14

com a arvore ( .

Agora, bE DEVELOPMENj eo modo desl

entao

Se ja hou selecioi houver arquivd

utilizando a oR ao projeto, cor

Caso nad

Figura 3.17

:::
i'l

Figura 3.18

Microcontroladores PIC - Programa9ao em C

,:'

•·..1'

.( ',11

Em seguida, clique na opcao LANGUAGE SUITE e selecione CCS (figura 3.16). Surgem mensagens de alerta (normalmente apenas OK.

compilador tres); clique

Repare que apos a mocrtlcacao da llnguagern de programacao, a opcao ADD NODE, que anteriormente estava ativada, vai agora aparecer desativada como as outras. Clique no no principal do projeto (0 arquivo testec[.hex]) destacado na figura 3.17 e selecione a opcao NODE PROPERTIES. Deve surgir a [anela de propriedades do no do projeto (flgura 3.18). Nessa janela 0 programador seleclona qual dos compiladores sera utilizado (PCB, PCM ou PCH, conforme 0 pacote adquirido). E posslvel tambem acionar a opc;:aoGENERATECALL TREE para fazer com que 0 compilador gere um arquivo com a arvore de chamadas de funcoes. Agora, basta selecionar qual 0 modo de funcionamento do MPLAB (em DEVELOPMENTMODE) clicando no botao CHANGE e selecionando 0 dispositivo e 0 modo desejado. Se ja houver um programa-fonte em C salvo no HD, 0 prograrnador pode entao seleclonar a opcao ADD NODE e adicionar 0 arqulvo desejado. Se nao houver arquivo, clique em OK e salve 0 projeto (PROJECT> SAVE PROJECT). Caso nao tenha dlgltado 0 programs ainda, 0 programador pode faze-to utifizando a opcao FILE> NEW, salvando em seguida 0 arqulvo e adicionando-o ao projeto, como mencionado anteriormente. 6

Gompiladores GGS S

Anota~oes

Gapltul~

Agora qui compilador ei mentos da lin~ Para faCil] exernplo de Pq

Exemplo 4.1 :,
II
Pr Lme i r

. .I

#include ~ #use delaY; #fuses Im; main()


{

while

(I

Vejamos A primeiraj
I! primeirj

E chamad1. c6digo-fonte PEl


I

Microcontroladores PIC - Programagao em C

.?
I .1

---=~-~-----~-~---------------.---.--.--.----.----~---------_. -._---------------------------_ .. ------

4
tntrcducao

a Llnguagem C
e
sobre 0 funcionamento do hora de estudar os fundaum

Agora que 0 leitor Ja possui 0 conhecimento compilador e do ambiente de desenvolvimento, mentos da linguagem C.

Para facilitar a compreensao da linguagem C, vejamos primeiramente exemplo de programa: Exemplo 4.1
II Primeiro exemplo
#include <16F628.h> #use delay(clock=4000000) #fuses INTRC_IO,NOWDT,PUT,BROWNOUT,NOLVP,NOMCLR main()
{

while
{

(true) int tempo; tempo=lOO; output_high(PIN_BO); delay_ms(tempo); output_low(PIN_BO); delay_ms(tempo);

II II II II

atribui 0 valor 100 seta 0 pino RBO aguarda lOOms resseta 0 pino RBO /1 aguarda lOOms

variavel

tempo

Vejamos

significado de cada linha do prograrna,

A primeira linha do prograrna:


/1

Primeiro

exemplo

E chamada de cornentarlo, Os comentarlos sao descrlcoes inseridas no c6digo-fonte pelo programador com 0 intuito de documentar 0 prograrna,
Inlroduqao it Linguagem C

rr-I'.;;·.'~
,I

,;:

Esta versao de compilador C admite duas formas de cornentarlo:

Na proxlrnl
fuse delay:

Cornentarlos de linha simples: sao de apenas uma linha iniciados pelos caracteres "II", tais qual 0 cornentarlo do programa anterior. Este tipo de comentarlo nao faz parte da padronizacao ANSI original, mas atualmente encontrado em varlos compiladores.

Os comentarios de linha simples podem ser iniciados em qualquer ponto de uma linha e sao muito utilizados para descrever 0 funclonamento ao final de cada linha de codlgo, como podemos observar no decorrer do prograrna.

A secuenc a diretiva dete Hertz au 4MH2l geracao dos d (como, por exe:
I

Comentartos de multiplas linhas: sao compostos por uma ou mais linhas. Estes tipos de cornentarlo utilizam a sequencia de caracteres "1*" para iniciar 0 comentario e a sequencia "*1" para terminar 0 comentarlo,

Em seguid
#fuses
..

INTi"
I

i.

Exemplo:
/*

\i
!: Este e urn comentario de multiplas linhas

Esta e um conflguracao c ordem: oseilad para E/S, wate do, programac nivel como ent

*/

A lista cor sivel pode ser Na proxirn


I

Na proxima linha temos:


linclude "16F628.h"

main()

comando #include terminando ao compilador "16F628.h".

e urna

diretiva do compilador. Neste caso esta deque anexe ao programs 0 arqulvo especificado:

A declarae main() e padn' pal, ou 0 corpc

Arquivos com a extensao "h" sao chamados de arquivos de caoecalho e sao utllizados em C para definir varlavels, tipos, sTmbolos e funcoes utets ao programa, "16F628.h" urn arqulvo com as deftnlcoesrelativas ao processador-alvo, para 0 qual 0 prograrna sera compllado. Podemos verificar que 0 processador para 0 qual 0 prograrna foi escrito 0 PIC 16F628. Se desejassemos modificar 0 processador-alvo, basta ria alterar esta linha do programa.

Uma fun<;! a partir de qua i sinal d~ <;aoe 0 sinal

Na realid~ rna, ou bloeo q gram~a~o~~~uj assumem um bloeo de com Podemos] seguintes ele~
I

observaeao: Ao alterar 0 processador utilizado no prograrna, pode ser necessaria tambern, alterar a familia do processador na opcao disponlvel na barra de leones do compilador (figura 3.2).

"il
,'i
.:.. i)
'::1 ;:1

,:

Microcontroladores PIC - Programa~ao em C

..... -

1
.

T
sntarlo:

,!
II

Na proxima linha encontramos:


#use delay(clock=4000000)

iha iniciados pena anterior. Este JSI original, mas os em qualquer rever 0 funcionanos observar no

I'

.j

I
I

~:

A sequencia #use especifica uma diretiva interna do compilador. No caso, . a diretiva determina ao compilador que considere 0 valor de 4.000.000 de Hertz ou 4MHz para a trequencla de clock do MCU. Este valor e utilizado para geracao dos codlgos de atraso e outras rotinas que dependam de tempo (como, por exemplo, a rotina de cornunlcacao serial por software). Em seguida temos:
#fuses INTRC_IO,NOWDT,PUT,BROWNOUT,NOLVP,NOMCLR

Jr uma ou mais
a de caracteres para terminar 0

Esta uma diretiva que especifica 0 estado dos "fuslvels" da palavra de conflguracao do dlsposltlvo, No presente caso, estamos selecionando pela ordem: oscilador de clock interno de 4MHz com pinos RA6 e RA7 dlsponfvels para EjS, watchdog desligado, timer power-up Hgado, reset por brown-out ligado, programacao por baixa tensso desllgada e MCLR interno (pino RA5 dlsponivel como entrada). Estas opcoes variam conforme 0 modelo de PIC utilizado. A lista com os valores valtoos para a determlnacao ~ estado de cada fudo sfvel pode ser verificada a qualquer momento no menu VIEW > Valid Fuses.
.

Na proxima llnha do programs encontramos:


main ()

:e caso esta devo especificado: de cabecalho e uncoes utels ao ao processadorar que 0 proces~ desejassemos
grarna, code ser nelisponlvel na

mainO

A declaracao mainO especifica 0 nome de uma funcao. No caso, a funcao padronizada na linguagem C e utilizada para definir a funcao principal, ou 0 corpo principal do programa.

Uma tuncao, em C, um conjunto de lnstrucoes que pede ser executado a partir de qualquer ponto do programa, gao e

o sinal
0

de abertura de chave "{" utilizado para delimltar 0 lnlclo da funsinal de fechamento de chave "}" indica 0 final da funcao.
0

Na realldade, as chaves delimitani rna, ou bloco de c6digo.

que chamamos de bloco de progra-

I
!

Nas llnguagens de prograrnacao estruturada (como e), um bloco de prograrna consiste em um conjunto de comandos conectados loglcamente e que assumem uma identidade unlca, ou unidade. Assim, para todos os efeitos, um bloco de comandos e um Onico comando funcionam da mesma forma. Podemos dizerque seguintes elementos: um programs em C

e constitufdo

por urn ou mais dos

Inlrodu~ao a Linguagem C

~I;• . if
.I.:.',!·.

rl

Operadores: Operadores sao elementos utilizados para comandar lnteracoes entre vartavels e dados em C.

Por ora, i~ estudarmos a~, Como ja ~ rem repetidas j

guagem C e a forca e flexibilidade dos seus operadores.

Muitos dizem que urn dos elementos que mais se destacam na lin-

capitulo 6 faz um estudo sobre os operadores de dados encontrados na Ilnguagem C. • Varlaveis:

o
E

claro que nao podemos escrever um program a realmente util sem utilizar varlavels para 0 armazenamento de dados.

I int temj tempo=l! output 1 delay_m1 outPut~i delaY

_1 ii _i
rj

A llnguagem C dlspde de uma grande variedade de tipos de variaveis e dados, 0 que permite 0 desenvolvimento de praticamente qualquer tipo de apncacao. No proximo capitulo, faremos um estudo detalhado das varlavels pos de dados encontrados na llnguagem C. • Comandos de controle: Os comandos ou declaracoes de controls sao elementos essenciais escrita de prograrnas em C. e ti-

ou re::O:e::;'

E serao

tres chamada~ Em C 0 ponto-l


j

Observe ~ do uso do por] , ~naliseml; while: ; primei~ ~ Este cornandq chamada tem~ i, GPR disponrv~ tei ro int espel tre 0 e 255 dJ dlsponlvels n'

Como seu proprio nome diz,eles sao utilizados para controlar, testar e manipular dados e lnrormacoes dentro do prograrna, No capitulo 7 estudaremos os diversos comandos de controle dlsponfveis na llnguagern C. • Fungoes: As fungoes, como ja foi dito, sao estruturas de programa utilizadas para simplificar, otimizar ou apenas tornar maisclaro 0 funcionamento do programs. No capitulo 9 faremos urn estudo mais profundo sobre to e utilidade das fungoes na llnguagem C. A primeira linha do bloco de comandos da tuncao
while (true) 0

funcionamen-

o nome; numeros. M~ dos na linguai


i

mainO e:

Este um comando de controle utlllzado na repetlcao de um determinado bloco de lnstrucoes, Esse bloco sera repetido enquanto a avaliacao da condiyaO especificada entre parenteses for verdadeira. No caso, a avallacao explicitamente verdadeira (true).

Em segu de atnbuicao] "=". Desta fq quencla de i~ do na variave\

o proxi: gao interna d;,


11

de Instrucoes que sera repetido chaves que seguem 0 comando while.

o bloco

e aquele

especificado dentro das

~
ii

II·

-----.-

_._-

.~

....

. ...I

r
'I

r Interacoes entre destacam na lines. ) dados encontra-

Por ora, isto e tudo 0 que devemos saber sobre 0 comando while. Quando estudarmos as declaracoes de controle, retornaremos ao assunto. Como ja dissemos, os comandos que formam rem repetidas sao aqueles entre as chaves:
int tempo; tempo=100; output_high(PIN_BO)i delay_ms(tempO)i output_low(PIN_BO); delay_ms(tempo); 0

bloco de tnstrucoes

a se-

almente uti! sem de varlavels e amente qualquer


lOS

E serao repetidos indefinidamente ou ressetado.

ate que

processador seja desligado

las varlavets e ti-

Um detalhe interessante a ser observado e que ao final de cada uma das tres chamadas de funcao, 0 ultimo caractere da linha foi urn ponto-e-vlrgula (;). Em C 0 ponto-e-vlrgula e utilizado para delimitar 0 final de um comando. Observe que as diretivas do compilador nao necessitam (nem permitem) do uso do ponto e vlrgula como delimitador. Analisemos entao as cinco mstrucoes que compoem while:
0

rtos essenciais

bloco do comando

controlar, testar controle disponf-

grama utltlzadas o funcionamento


~0

primeiro comando, int tempo, chamado de declaracao de vartavet, Este comando determina que 0 compilador erie uma varlavel do tipo inteiro int chamada tempo. Esta operacao na realidade ira reservar um dos registradores GPR disponTveis para 0 armazenamento do valor relativo varlavel, 0 tipo inteiro int especifica um tipo de dado de 8 bits com valores compreendidos entre 0 e 255 decimal. Mais adiante neste livro, estudaremos os tipos de dad os dlsponlvels na llnguagem C e no compilador CCS.

funcionamen-

nome dado varlavel e identificador e pode ser composto de letras e numeros, Mais adiante veremos mais detalhes sobre os identificadores valldos na llnguagem C. Em segulda, temos a linha tempo=100 que constitui-se em uma operacao de atrlbulcao. As atribulcoes em C sao executadas pelo operador de Igualdade "=". Desta forma, a linha tempo=lOO rara com que 0 compilador gere uma sequencia de lnstrucoes para fazer com que 0 valor 100 decimal seja armazenado na varlavel "tempo". proximo comando, output_high(PIN_BO) gao interna do compllador.

urn determinado liagao da condlvallacao E§ expll-

euma

chamada a uma fun-

iado dentro das

Inlroduffao

a Linguagem

Esta funcao utilizada para setar (ou seja, eoloear em nlvel Ioglco '1') um pino do mieroeontrolador. Isto slgnltlca que 0 pine RBO (da porta B) sera setado. Note que "PIN_BO" um sfrnbolo predefinido para espeeifiear 0 pino RBO. Este slmbolo esta loealizado no arquivo de cabecalho do proeessador utilizado (no presente easo 0 arquivo "16F628.h"). Uma earaeteristiea interessante do CCS C que 0 proprio eompilador enearrega-se de eonfigurar 0 pino para funeionar como uma entrada ou salda, dependendo do modo de tratamento de I/O em que se esteja trabalhando. Outro aspeeto interessante desta ehamada de tuncao e que ela demons-~ tra uma chamada de tuncao com um pararnetro, que no caso espeeifiea 0 pine do mierocontrolador a ser setado. Este tipo de parametro de uma funcao chamado de pararnetro formal. Veremos mais detalhes sobre funcoes e parametres no capitulo 0 deste livro. A proxima funcao a ser executada
delaY_ffis(tempo) ;

4.1. Pala,
Toda lingl mancos para! podem ser uti! gem.
!

A linguag~
"

e: e
4.2. Ideni

interna do compilador e utilizada para gerar 0 atraso sera lgual a lOOms (ja que a varlavel tempo, utilizada como parametro, contem 0 valor 100).

Esta tarnbem

urn atraso de X mifissegundos. No caso,

e uma funcao

o proximo

eomando do bloeo

e:

~ ., Identifica~ outros eleme9 Conform~ de caracteres' outro caracten Alern diS~ sublinhado, n~ tificadores val!! ~
::1

output_low(PIN_BO);

Esta tambem e uma funcao interna do compHador e e utilizada para ressetar (ou seja, colocar em nlvel loglco '0') um pine quaJquer do microcontrolador. Novamente neste easo, 0 pine em questao 0 RBO.

Finalmente,

ultimo comando:

de l ay jns (tempo);

Fara com que novamente

cornpllador gere um atraso de 100 ms. das tuncoes internas do com pi-

Maiores detalhes sobre 0 funcionamento lador podem ser vlstos no capitulo 12.

Desta forma, ao programarmos 0 PIC com 0 programs anterior e se tivermos conectado um LED (com 0 devido resistor de tlrnltacao de corrente) ao pino RBO, nos 0 veremos aeender e apagar em uma frequencla de 5 Hz.

Microconlroladores PIC - Programagao em C

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

-.... ~.~~-----

..-..- .... -...-.---

---

----~~----

..._ ..... _--_._ .... _---_._-_ ... --_ .......

;-,

uvel logtco '1') urn oorta B) sera setacificar 0 plno RBO. fcessador utilizado frio compilador enentrada ou salda, trabalhando. que eJa demonsespecifica 0 pino parametro formal. ulo 0 deste livro.

4.1. Palavras Reservadas da Linguagem


Toda llnguagem de programacao possui um conjunto de palavras ou comandos para os quais ja existe interpretacao interna previa. Tais palavras nao podem ser utilizadas para outras finalidades que nao as definidas pela linguagem. A linguagem C ANSI estipula as seguintes palavras reservadas:
auto continue enum if return struct void break default extern int short switch volatile case do float long signed typedef while char double for
1\. register

const else goto return static unsigned

sizeof union

Tabela 4.1 iJizada para gerar 100ms Ua que a


).

4.2. Identificadores
Identificadores sao nomes dados pelo programador a varlavels, tuncoes e outros elementos da linguagem

c.

tilizada para resdo microcontrola-

Conforme ja vimos, um identificador na linguagem C pode ser composto de caracteres nurnerlcos e altanurnerlcos. Alern de numeros e letras, 0 unlco outro caractere que pode ser utilizado em identificadores sublinhado ";.",

Alern disso, um identificadorsomente pode ser iniciado por uma letra ou sublinhado, nunca por um nurnero. Veja em seguida alguns exemplos de identificadores validos e lnvalldos em C: variavel valida valida invalido invalido valida invalldo valldo invalido

100 ms. ternas do cornplnterior e se tlverde corrente) ao a de 5 Hz.

variavel1 labc

varlavel
teste 2 return 123 abc erra\2

Tabela4.2
Introdugao

a Linguagem C

.,r
j-i:

Nesta tabela 0 identificador "labc" lnvalldo porque se lnlclou por um numero, "varlavel" lnvalldo porque utlllza acento, "return" lnvalldo porque uma palavra reservada da llnguagem e "erro\2" lnvalido porque utlllza 0 caw ractere "\".

Esta condf verdadeira ou fa


i

No capitulo,

Repare que nao permitido utlllzar como identificador uma palavra reser" vada da llnguagern ou um nome de funcao ja definida em C. padrao ANSI determina ainda que apenas os primeiros 31 caracteres do nome do identificador serao utilizados para a dlferenclacao entre eles. Isto significa que posslvel utilizar identificadores de qualquer tamanho, desde que existam dlferencas nos prlrneiros 31 caracteres, de forma a dlstlnguir entre um e outro. Vejamos entao as principais regras de norneacao de identificadores:

4.3.2.

i cornandd mente, utilizal um ou mais cal nada condicao j

Com~

while

(concl


• • • •

S6 podem ser utilizadas letras, rnrmeros


If

ou

caractere sublinhado

que Slg~ especificado. Esta condl como verdadelf

-,
fl.

.I I

Devem sempre ser iniciados por uma letra ou sublinhado; Identificadores sao untcos: um mesmo identificador nao pode ser atributeo a coisas diferentes; Nao podem ser utilizadas como identificadores as palavras reservadas da Jinguagem e nomes de tuncoes ja definidas; Somente os primeiros 31 caracteres do identificador sao valldos, no entanto um identificador pode utlllzar mais do que este nurnero de caw racteres.

a comandJ
4.3.3.

Func;J

A tuncao C. A salda de ~ computadores 1 sitivo de saida

4.3. Comandos e Fun~oes Importantes


Antes de prosseguirmos no estudo detalhado da linguagem, interessante observarmos alguns comandos e funcoes muito utilizadas nos prograrnas na linguagem C. Estas funcoes e comandos serao utilizados no decorrer deste livre, dar a lmportancla de termos ao menos uma visao superficial de cada um.

Assim, a ~ mente do PIC 1 minal de video

o tormatol
printf ( a,

4.3.1.
tipo:

Comando If
comando if (em portugues "se")

o
if

Em que a~ um conjunto d· utltlzado em testes condicionais do Veja as ex


printf ("T;

(condt.cao)

comando;

a que significa: se a condiCao for verdadeira, entao execute especificado.


Microcontroladores PIC - Programa~ao em C

comando

au,

:;e iniciou por urn lnvanco porque 13 orque utlllza 0 carna palavra reser-

Esta condlcao deve ser qualquer expressao que possa ser avaHada como verdadeira ou falsa, ou seja, uma proposlcao booleana. No capitulo 7 veremos um estudo detalhado do comando if.

4.3.2.Comando While
31 caracteres do
rtre eles.

ualquer tamanho, te forma a distintificadores: ctere sublinhado ado: lao pode ser atrlavras reservadas

o comando while (em portugues "enquanto"), conforme ja visto anteriormente, 13utilizado para especificar uma estrutura ou taco de repetlcao, em que um ou mais comandos sao repetidamente executados enquanto uma determinada condlcao for avaliada como verdadeira. A sua forma geral 13:
while (condi9ao) comandol ~ 0

o que slgnlftca: enquanto a condtcao for verdadeira, execute especificado.

comando

Esta condlcao 13novamente qualquer expressao que possa ser avaHada como verdadeira ou falsa, ou seja, uma proposlcao booleana.

o comando

while sera melhor estudado no capitulo 7.

4.3.3. Func;aoPrintf
sao vaudos, no te numero de caA funcao printf 13utiHzada para possibilitar a salda de dados na llnguagern C. A safda de dados 13direcionada para 0 dispositivo padrao de saida, que nos cornputadores 13normalmente 0 monitor de Video. No caso dos PICs, 0 dispositivo de salda eventual mente disponTvel 13a safda serial. Assim, a funcao printf 13uma excelente forma de transmitir dados serialmente do PIC para urn outro dlsposltlvo extern 0 , como, por exemplo, um terminal de video ou urn microcomputador.

13interessante s programas na .orrer deste Hvro, cada urn.


1,

o formato
printf

geral da tuncso printf 13:

( argurnento(s) );

Em que argumento pode ser uma constante de caracteres direta ou atnda ' urn conjunto de caracteres de controle seguido de uma lista de varlavels, condicionais do Veja os exemplos:
printf ("Teste"); II irnprime a palavra II de saida padrao Teste atraves do dispositivo

iute

comando

Ou,

Introdultao

a Linguagem C

..

,-~

int var_teste; II declara var_teste = 5; II atribui printf ("'!sd", var_teste);

a variavel inteira var_teste 0 valor 5 a variavel var_teste 1/ irnprime 0 valor da variavel

.
var_teste

r··".'··'
if)

,
.,J(':

~apTtulo1
('<u>
j

.:

:(

Observe que no ultimo exernp!o, a funcao printf utiJizou um codlgo de forrnatacao para especificar que 0 conteudo da varlavel deveria ser lmpresso no formato inteiro. A tabela seguinte apresenta alguns dos c6digos de formatacao mais utilizados: C6digo
%u %s %c %e

Val
i
!.

Formato de saida
unsigned lnt char ou string caractere (char) float exponencial TabeJa4.3
I

A lingUagerl A irnplementa9~ dos dlsponlveis 1: De fato os I maiores pontosi complexidade c~


:j

A runcao printf e os seus c6digos de formatacao serao melhor estudados no capftulo 11. .

4.3.4. FUR{:ao GETC A funcao GETC e utilizada


PICs,

Vejamos o~
0

e felto

para entrada de dados, por comunicacao serial.

que, no caso dos

Esta funcao aguarda que seja recebido urn caractere pela linha serial previamente configurada, retornando 0 valor do caractere recebido. Veja 0 formato geral desta tuncao:
variavel

getc();

ou slmplesmente,
getcC) ;

!
Os tipos dJ gem: char, int, ~
0

no caso de nao ser desejado atribuir 0 valor retornado peJa funcao (que e caractererecebido serial mente) a qualquer varlavel,

Desde ja e interessante sabermos que uma tuncao, na llnguagern C, pode retornar valores, isto e, ap6s a execucao da funcao, ela pode retornar urn valor ou dado referente ao processo realizado. Por ora, isso tudo 0 que voce preclsa saber sobre a funcao getc, No capftulo 11 veremos detalhadamente 0 funcionamento desta e de outras fungoes dlsponlvels na linguagem C.

charj Cada variavel d~ caracteres ASCI apendlce 0 do Ii tlpo int 255). Estes tiPo

o tlpo

Note que 0.; manho mais efiC no caso dos co~ pecifica que ti~

l
,

Microcontroiadores PIC - Programa~ao em C

te

riavel

var_teste

5
Varlavels e Tipos de Dados

urn codlgo de forser lmpresso no ~os de formatacao


;'I

A linguagem C disponibiliza ao programador urna gam a de tipos de dados. A lrnplementacao C da CCS possibilita 0 uso de quase todos os tipos de dados disponivels em C padrao ANSI. nelhor estudados De fato os tipos de dados disponivels na lrnplementacao C da CCS sao os maiores pontos positives, perrnitindo a construcao de prograrnas de grande complexidade com uma relativa facilidade. Vejamos os tipos baslcos de dados dlsponlvels: ue, no caso dos
3

Tipo char int float void

Tamanho em Bits 8 8 32

Intervalo

linha serial preo. Veja 0 formato

o a 255 o a 255
3.4E-38 a 3.4E+38 nenhum valor Tabela 5.1

Os tipos de dados sao identificados pelas palavras reservadas da linguagem: char, int, float e void. funcao (que

Iguagern C, pode 'etornar um valor 'uncao getc, No e de outras fun-

tlpo char utilizado para representacao de caracteres ASCII de 8 bits. Cada variavel do tlpo char pode representar um caractere ASCII. 0 conjunto de caracteres ASCII normatizado universal mente e pode ser encontrado no apendlce 0 do livro.

tipo int utilizado para representar nurneros lntelros de 8 bits (0 a 255). Estes tipos de dados sao amplamente usados em programacao C. Note que 0 tlpo int na llnguagern C definido sernpre para possuir 0 tamanho mais erlclente para a arquitetura-alvo: 8 bits no caso dos PICs, 32 bits no caso dos computadores do tipo PC atuais. No entanto, 0 padrao ANSI especifica que 0 tipo int deve representar urn numero de 16 bits.
Vanaveis e Tipos de Oados

-~

Ii
i:

.I
"

".,,·

Repare ainda que tanto char como int representam numeros inteiros e nao podem ser utilizados para representar numeros fraclonarlos, Para lsso, deve ser utilizado 0 tipo float, tarnbem chamado de ponto flutuante. Este tipo de dado pode ser utilizado para representar grandezas compreendidas entre 3,4-38 e 3,4+38, tanto para numeros traclonarios como inteiros. Em maternatlca sao os chamados numeros reais. Note que este tipo de dado ocupa quatro posicoes de mem6ria RAM do PIC e alem disso, qualquer operacao envolvendo varlavels float traduzida pelo compilador em um conjunto complexo de operacoes,

Note que magnitude abS{ magnitude do tiJ Assim, uml +127, em vez

drao do comoj]
unsigned, ja

o mOdificJ

'I

Sendo assim, 0 usa de varlaveis float deve ser evitado ao maximo e restrite apenas as operacoes que realmente necessitarem de urn tipo de dados como este. Temos ainda 0 tipo void, utilizado normalmente em funcoes para declarar que ela nao deve retornar nenhum valor. Maiores detalhes sobre a sua funcao serao vistos mals adiante neste livro.
Observactao: A llnguagem C preve ainda 0 tipo double, que consiste em uma versao com capacidade de representacao dobrada (64 bits) em relag80 ao tipo float. 0 compilador CCS nao suporta este tipo de dado, no entanto, a palavra double continua entre as palavras reservadas da linguagem.

pecifica que

q~
11

OS,I

Ja 0 modi1 menor que 0 till do, _Assim, se ~ sera uma vers] uma vartavel d( ou smalizadorj] Note que

'I

1l

pal do comPil1: bem-vindas e :.

Finalment!1 de representa' Oesta for~ seja, ira ocup~ de representee Observe ~


<;80 simplifica~

5.1. Modificadores de Tipo


Alem dos tipos de dados vistos na tabela 5.1, podemos utilizar comandos especiais da llnguagern C para modificar os tipos baslcos, de forma a obtermos outros tipos de dados. Esses comandos especiais sao chamados de modificadores e sao os seguintes: signed, unsigned, short, e long, modificador signed pode ser utilizado para modificar urn tipo base de dados de forma que ele possa representar tanto numeros positivos como numeros negativos. A representacao de nurneros negativos e feita tomando 0 bit MSB (Most Significant Bit ou Bit mais slgnlflcatlvo) da varlavel para representar 0 sinal: bit MSB = 1, sinal negative, bit MSB = 0, sinal positivo. Nesta notacao, chamada complemento de dots, 0 valor a ser representado complementado (tern seus bits invertidos urn a urn) e entao somado 1ao resultado.

o cornpilador ~ o mesmo efeiI por diante. II

5.2.0utr'

I'

Alem dOs: lador CCS out compatibilida t


• • bool~ int1);~
1,1

int8:fil
li]
i,l".

Microcontroladores pic - Propramacao em G

~
~

---.-.--

..-.--.-- ..--~~-------

nrmeros intelros e nartos. Para isso, lutuante. Este tipo npreendidas entre nteiros. Em matememoria RAM do float traduzida

Note que devido ao fato de utilizar um bit para representacao do sinal, a magnitude absoluta de representacao do tipo modificado sera metade da magnitude do tipo nao modificado.

+127, em vez de 0 a 255.

Assim, um tipo de dados signed int pode representar valores entre -128 e

ao maximo e resum tipo de dados roes para declarar obre a sua funcao

unsigned define um tipo de dado sem sinal, 0 que 0 padrao do compiJador CCS. Desta forma, nao e necessarlo utilizar 0 modificador unsigned, ja que ele nao produz qualquer efeito. Note que 0 padrao ANSI especifica que os tipos de dados padrao da llnguagem C sao do tipo signed. Ja 0 modificador short e utilizado para definir uma varlavel com tamanho menor que 0 tipo modificado, ou seja, uma versao reduzida do tipo especificado. Assim, se especificarmos uma variavel como sendo do tipo short int, ela sera uma versao reduzida do tipo int, 0 que no caso do compilador CCS cria uma varlavel de apenas um bit de tamanho (0 que tambern chamado de flag ou sinalizador).

o modificador

~ consiste em bits) em relade dado, no das da lingua-

Note que esta aproxlmacao difere do C padrao ANSI, ja que 0 foco principal do compilador CCS a eficit3ncia e as varlaveis de 1 bit sao, sem duvida, bern-vindas em um ambiente tao restrtto como em um microcontrolador.

Finalmente, temos 0 modificador long, utilizado para arnpllar a magnitude de representacao do tipo especificado. Desta forma, um tipo de dados long int tera um tamanho de 16 bits, ou se]a, ira ocupar duas poslcoes de memoria RAM do PIC e tera uma magnitude de representacao de 65536 elementos.

os utilizar comans, de forma a obores e sao os seum tipo base de isltlvos como nCrobit MSB (Most sentar 0 sinal: bit otacao, charnada mtado (tem seus

Observe ainda que a linguagem C permite a adocao da forma de declaracao simplificada; basta que 0 programador informe 0 modificador. Neste caso, o compilador assume que 0 tipo 0 into Assim, a declaracao short int produz o mesmo efeito que short, long int produz 0 mesmo efeito que long e assim por diante.

5.2. Outros Tipos Especificos doCompiiador CCS C


Alem dos tipos de dados descritos anteriormente, encontramos no com pifador CCS outros tipos de dados, criados especificamente para a eficiencia e compatibilidade do compilador junto a dispositivos como os PICs. Sao eles: • • • int1: especifica valores de 1 bit (equivale ao tipo short int padrao): boolean: especifica valores booleanos de bit (equivale ao short int e inti); intS: especifica valores de 8 bits (equlvale ao tipo int padrao):

Variaveis e Tipos de Dados

........ __ __ _ _ .. .._

__ ._ -.----- -.- -.-.--.-- -------.-.----.-.----~==--='-==~"""""'~~-.I! .. _ .. --.. --..

byte: especifica valores de 8 bits (equlvale ao tipo int e int8);

5.3. Declar
Em C, ao d rar a varlavel an]

• •

inti6: especifica valores de 16 bits (equlvale ao tlpo long int padrao): int32: especifica valores de 32 bits.

Note ainda que 0 compilador possul uma diretiva interna "#type" que pode ser utilizada para alterar 0 tamanho dos tlpos padrao. Esta diretiva sera melhor estudada no capitulo 10. A seguir, temos uma tabela com todos os tipos de dados disponlveis por padrao no compilador CCS:
Tipo short int, inti, char signed char unsigned char int, int8, byte signed int, signed byte unsigned lnt, unsigned long int, int16 signed long int unsigned long int int32 signed int32 unsigned int32 float boolean Tamanho em Bits 1 8 8 8 8 8 8 16 16 16 32 32 32 32 Faixa de valores

uma varlavel ch como ja foi vistJ ";") e nao pod~ ce seguinte fa,

Declarar un

TIPO nome d:

o ou 1 o a 255
-128 a 127

Podemos

TIPO nome d
!

, I

o a 255 o a 255
-128 a 127

Vejamos e! teiro de 8 bits

o a 255 o a 65.535
-32.768 a 32.767 -32.768 a 32.767

unsigned

iri
i

au:
int tempo; 1
I

, ,

o a 4.294.967.295
-2.147.483.648 a

Outro asp~ sao declaradas mente acess Isto se denom~ Bastcarnel do programs: •

o a 4.294.967.295
3.4-38 a 3.4+38

A . rtJ impo a!

TabelaS.2
Observat;ao: • • Os tipos boolean e byte sao definidos nos arquivos de cabecalho de cada PIC e sao baseados nos tipos short int e int respectivamente. As varlaveis inteiras sao armazenadas pelo compilador, iniciando pelo LSB no endereco mais baixo de memoria e com 0 MSB no ultimo endereeo ocupado pela variavell

No col cipal ]
main(

qualq • Dentrt
(i nclul

da fu local mome desca,


j

!
I

.:
Microcontroladores PIC - Programac;ao em C
'f<

t e intB); long int padrao):

5.3. Declaraeao de Variilveis


Em C, ao contrarlo de outras linguagens como BASIC, e necessario declarar a varlavel antes de poder usata.

~rna "#type" que Esta diretiva sera


IS

disponfveis por

Declarar uma varlavel nada mais e do que informar ao compilador que uma varlavel chamada "x" e do tipo "y". 0 nome da varlavel identificador, como ja foi vlsto, pode ter ate 31 caracteres (letras, nurneros e 0 caractere ",.") e nao pode lnlclar por um nurnero, A declaracao de varlaveis em C obedece seguinte forma:

I valores

TIPO nome da variavel{,outras

variaveis}; 0

u1

255
~127
255 255

Podemos ainda declarar e inicializar


TIPO nome da variavel

conteudo de uma ou mais vartaveis:


outras variaveis};

valor da variavel{,

Vejamos entao como declarar uma varlavel chamada "tempo" do tipo inteiro de 8 bits sem sinal:
unsigned int tempo;

1127
~55

.535 32.767 32.767 967.295 3.648 a :167.295

ou:
int tempo;

Outro aspecto importante da declaracao de vanavets e sao declaradas.

local onde elas

A lrnportancla do local onde a varlavel foi declarada relaclona-se diretamente acessibilidade ou nao de outras partes do programs a essa varlavel. Isto se denomina regra de escopo da linguagem.

Basicamente, do programa:
becalho de mente. :iando peJo !timo ende-

uma variavel pode ser declarada em tres pontos distintos

No corpo principal do programs: as varlavels declaradas no corpo prlnclpal do prograrna (fora de qualquer funcao, inclusive da runcao mainO) sao chamadas de globais, porque podem ser acessadas de qualquer ponto do programa; Dentro de uma tuncao: as varlaveis declaradas dentro de uma funcao (incluindo a fungao mainO) somente podem ser acessadas de dentro da funcao em que foram declaradas. Isto significa que uma varlavel local somente existe enquanto a fungao esta sendo executada, No momento em que ocorre 0 retorno da funcao, as vanavels locais sao descartadas;

Variavels e Tipos de Dados

jj

Como um pararnetro formal de uma tuncao: as varlavels declaradas como parametres formais de uma funcao sao um tipo especial de varlavels locais. Este toplco sera melhor explicado no capitulo 8 quando estudarmos as fungoes da llnguagern C.

~ :~:: ~: 1 q
A soma de A soma de q

Em seguida temos um pequeno programa que demonstra a diferenga entre varlavels locals e varlavels globals:

Antes de I gumas das noJ No inicio

i
j

d
:1

Exemplo 5.1
*include <16f627.h> *use delay(clock=4000000) *fuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP *use rs232(baud=19200, xmit=PIN_B2,rcv=PIN_B1)

#use delay]

#use rs232'1 ;

Estas dec]

'I

1*

int somatorio;

*1

Teste de variaveis
II

locais e globais global

variavel

A diretiva ' formar ao corn cutado 0 progrl' A diretiva! ara comunics P j rs232. 1

void soma(int valor)


(

int conta; Ilvariavel local da funyao soma somatorio = somatorio + valor; printf("A soma de 0"); for (conta=l; (conta«valor+1)); conta++) printf[n+%d",conta); printf (" eh igual a %d\r\n", somatorio) ; void main()
{

int conta; II variavel local da funyao main somatorio = 0; for (conta ~ 1; conta<20; conta++)
{

podemos·1 rnunlcacao en! (xmit) e pine esta diretiva s' pOdemos'l


:i

soma (conta) ;

A execucao deste programs no hardware de laborat6rio proposto gera a seguinte salda na tela do emulador de terminal serial:
A A A A A A A A A A A A A A A soma soma soma soma soma soma soma soma soma soma soma soma soma soma soma de de de de de de de de de de .de de de de de 0+1 eh igual a 1 0+1+2 eh igual a 3 0+1+2+3 eh igual a 6 0+1+2+3+4 eh igual a 10 0+1+2+3+4+5 eh igual a 15 0+1+2+3+4+5+6 eh igual a 21 0+1+2+3+4+5+6+7 eh igual a 28 0+1+2+3+4+5+6+7+8 eh igual a 36 0+1+2+3+4+5+6+7+8+9 eh igual a 45 0+1+2+3+4+5+6+7+8+9+10 eh igual a 55 0+1+2+3+4+5+6+7+8+9+10+11 eh igual a 66 0+1+2+3+4+5+6+7+8+9+10+11+12 eh igual a 78 0+1+2+3+4+5+6+7+8+9+10+11+12+13 eh igual a 91 0+1+2+3+4+5+6+7+8+9+10+11+12+13+14 eh igual a 105 0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15 eh igual a 120

A tuncao ] J acumulado ati ponsavel pela] ~ Podemos no program a A variav~ soma dos ml:
prograrna, oui

ponto do pro~ Oentro d: de sua declar , te pede ser a

rambem'
muitas vezes
void

t 'Ol
:i'

Microcontroladores PIC - Programagao em C

..... _ .... _ ...

_--_._._-_._----_ ..-_.-._-_._._----_._--._.

__ _
..

...

__ --._._---

avels declaradas :> especial de vaapltulo 8 quando


:I

A soma A soma A soma A soma

de de de de

0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16 eh igua1 a 136 0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17 eh igual a 153 0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18 eh igual a 171 0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19 eh igual a 190

a dlferenca en-

Antes de analisarmos 0 funcionamento do programs, vamos expllcar algumas das novas declaracoes encontradas nele: No lnrclo do prograrna, encontramos duas declaracoes:
#use delay{clock=4000000) #use rs232{baud=19200, xmit=PIN_B2,rcv=PIN_B3)

cao:

Estas declaracoes sao diretivas do compilador e possuem a seguinte fun-

A diretiva delay, conforme ja dito no capitulo anterior, e utllizada para informar ao compilador a velocidade do clock do processador em que sera executado 0 prograrna. A diretiva rs232 e utilizada para ordenar ao compilador que gere c6digo para cornunlcacao serial utilizando uma interface serial asstncrona padrao rs232.
onta) ;

Podemos observar que os parametres da diretiva sao: velocidade de cornunlcacao em bps (baud=19200), pino de saida dos dados transmitidos (xmit) e pino de entrada dos dados reeebidos (rev). Maiores detalhes sobre esta dlretlva serao vistos mais adiante neste livro. Podemos verificar que
0

programs

e eomposto

de duas fungoes:

A tuncao soma, encarregada de reallzar a soma do numero atual ao valor acumulado ate ali, e main, que a funCao principal do programs, sendo responsavel pela contagem de 1 a 20 e a chamada da fungao soma.

roposto gera a

Podemos ainda constatar a exlstencla dos tres tipos basicos de varlavels no programs anterior: A varlavel global "sornatorlo", encarregada de acumular 0 valor total da soma dos nurneros, Esta varlavel, por estar declarada no corpo principal do prograrna, ou seja, fora de qualquer funcao, pode ser acessada de qualquer ponto do programa, incluindo as fungoes soma e main. Dentro da tuncao soma, encontramos a varlavel "conta" que, em virtu de de sua declaracao dentro da funcao soma, e considerada local, isto e, somente pode ser acessada centro da funcao na qual foi declarada. Tarnbern encontramos um outro tipo de varlavel na funcao soma e que muitas vezes passa despercebido. Observe a oeclaracao da funcao:

20

void

soma(int

valor)

Variavels e Tipos de Dados

soma: a primeira

duas constatacoes baslcas sobre a declaracao da tuncao que esta funcao nao retorna nemhum valor, ja que foi declarada como sendo do tipo void. A segunda e que esta funcao possui um pararnetro formal declarado. A funcao soma recebe 0 seu parametro pela vari€lVe I do tipo inteiro "valor". Veja que esta varlavel constitui um tlpo especial, pois apesar de ser declarada na funcao soma, efetivamente comporta-se como uma variavel global.

Podemosfazer

Exemplo 5.2

~:;(~:2)II
int
/*

y;i

o c6digd
y e em

Hnalmente, na funcao main encontramos tambem uma declaracao de varlavel:


int conta;

os pino~ rentes, ~

}j

if

11

lly

Este comando declara, dentro da funcao main, uma varlavel inteira cha-. mada conta. Observe que esta tarnbern uma vartavel de escopo local, ja que' esta declarada dentro do corpo da runcao principal main.

~
I

Uma observacao interessante a ser feita que ambas as funcoes, soma e main,possuem uma variavel local chamada "conta". Note, no entanto, que 0 conteudo destas varlavels diferente. Na pratlca, 0 compilador aloca poslcoes distintas de mem6ria RAM do PIC para acomodar as duas variaveis, mas lsto depende da hierarquia de chamadas de nmcao e alguns fatores de otirnizacao que serao discutidos oportunamente neste livro.

Este progl observe que "j declaracao if. ~ comandos da ~


:1

Observe

caracteristica :
relacional. No; atrlbuido var;!

Dutra observacao oportuna a ser feita: a variavel "somatorio", por ter sido declarada no corpo principal do program a (ou seja, fora de qualquer tuncao), pode ser acessada de qualquer ponto do prograrna, como pode ser constatado pela analise da funcao soma e da tuncao main.

5.4.

conJ

5.3.1. Variaveis Locais


Neste momento, e importante observarmos mais detalhadamente cionamento das varlavels locais na linguagem C.
0

_ Alern daS1 _ z! cacao, nao POl

,i

tj

fun-

terad~~n;

Ha pouco, definimos as variavels locais como sen do aquelas declaradas dentro do corpo de uma funcao, Bern, isso nao e inteiramente verdade. De fato, 0 corpo de uma funcao apenas uma especlflcacao de uma definicao mais ampla: varlaveis locais sao aquelas declaradas dentro de um bloco de c6digo. Isto e importante, pols podemos ter varlavels locals mesmo dentro de blocos de c6digo pertencentes a outros comandos. Veja 0 exemplo seguinte:

De man~1 uma constant; quadamente. t especiflcandoi tes:


const const const const const

val: val~ val:' ve.L] val

As cons~, um parametr: tes podem se;, il


j

Microcontroladores PIC· Programa9ao em C

;1'

laracao da funcao slor, ja que foi de;:ao possui um panetro pela varlavel ipo especial, pois .omporta-se como
dectaracao

Exemplo 5.2
int x; II declara a variavel local x x = 5; I I atribui 0 valor 5 a v'ariavel x if (x>2l II se x maior que 2 ent~o
(

int y;

de va-

o c6digo seguinte atribui 0 valor lido da porta A a variavel y e ern seguida compara esse valor corn 3. Se forem iguais, os pinos da porta B s~o zerados (output_b(O» se forern diferentes, e colocado na porta B 0 valor igual a x+1 if ((y = input_a(»==3)

1*

II declara

a variavel

local y

*1

output_b(O);

else output_b(x+1);

uiavel

inteira chacopo local, ja que

as funcces, soma no entanto, que 0 lor aloca poslcoes arlavels, mas isto res de otlmtzacao orio", por ter sido qualquer funcao), je ser constatado

Este programs demonstra alguns dos concertos abordados neste t6pico: observe que "y" e uma varlavei de escopo local declarada dentro do bloco da declaracao if. Esta variavel somente extstira durante a execucso do bloco de comandos da declaracao if (caso a condlcao seja avaliada como verdadeira). Observe tambern que a segunda declaracao if demonstra uma outra caracterfstica da llnguagem C que permitir a atrlbulcao em uma expressao relacional. No caso, 0 valor retornado da funcao input_an primeiramente atribufdo a variavel "y", em seguida 0 valor e comparado a 3.

5.4. Constantes
cacao, nao poderiam deixar de ser inclufdas na linguagem C.
Alern das varlavels,

tambem as constantes de dados, devido

sua apli-

raoarnente

fun-

Constantes sao valores (nurnerlcos ou nao) flxos e que nao podem ser alterados pelo programs durante a sua execucao, De maneira geral, qualquer tipo de dado pode ser utilizado para definir uma constante, cabendo apenas ao programador representar 0 valor dela adequadamente. Assim, qualquer con stante pode ser declarada simplesmente especificando 0 nome do identificador e 0 seu valor. Veja os exemplos seguin-

ruelas declaradas

~verdade. ~aGaode uma dedentro de um blonesmo dentro de unplo segulnte:

tes:

const const const const const

vall val2 va13 va14 va15

= = = =

10 -5 55.12 'a' "teste"

As constantes sao tambern utilizadas para impedir que uma funcao altere um pararnetro passado a ela. Maiores detalhes desta apltcacao das constantes podem ser vistos no capitulo 8,
. Varlaveis e Tipos de Dados

i.
-.------------~=====~----

',]

5.4.1. C6digos de Barra Invertida


Alguns dos caracteres ASCII nao podem ser inseridos diretamente em uma constante string. Um exemplo claro a caractere de retorno de carro (codlgo 13 decimal), a caractere de nova linha (codlgo 10 decimal), 0 caractere de aspas ("), apostroto ('), entre outros.

5.4.2. Cons
As constat portancia na p~
i A llnguagei

motivo pelo qual cada um nao poder ser inserido varia, mas vamos exernpllflcar a de retorno de carro (que e aquele inserido pela tecla ENTER) e 0 caractere de aspas ("): 0 prlmetro nao pode ser inserido diretamente pelo teclado, pols 0 retorno de carro inserido no codigo-fonte, provocando um efeito indesejado. 0 segundo, mesmo estando facilmente disponlvel no teclado, nao pode ser inserido diretamente na string, porque 0 compilador ira tnterpreta-lo como um sinal do termlno da string.

ses blnarla, oel nurnerlca difer~

Para inserir estes e outros caracteres em uma string, existem os chamados codlgos de barra invertida. Na tabela segulnte encontramos os codlgos mais comumente utlltzados:
C6digo
\yyy

Caractere Constante Octal yyy Constante hexadecimal

C6digo ASCII

\:t..yyy
\0 \a \b \t \n \v \f \r \" \' \\

yyy

0 07h 08h 09h OAh OBh OCh ODh 22h 27h 5Ch

Vejamos bases:
int valori! valorl = :'\! valorl = 0: valorl = d valorl = ali valorl :

Nulo (null) Campainha (BEL) Retrocesso (backspace) Tabulacao horizontal (TAB) Linha nova (line feed)
Tabulacao

5.5.0peri
c,

,
,j

vertical (Vertical TAB) (form feed)

Toda lingij ria, podemos Em

cd

Avanco de forrnularlo

Retorno de carro (Return) Aspas Ap6strofo Barra invertida "\" Tabela 5.3

mUltiPlica9aO~.l mento (-», 10· AND (&&), OR: Maiores • funcionament

5.6. Expr:
Express6;1 e operadores]
regras gerais ]

Vejamos
Microcontroladores PIC - Programagao em C

5.4.2. Constantes Binilrias, Hexadecimais e Octais


) diretamente em :orno de carro (c6imal), 0 caractere arla, mas vamos tecla ENTER) e 0 etamente pelo teocando um efelto I no teclado, nao r ira lnterpreta-lo xistem os chamaamos os c6digos As constantes de bases numerlcas diversas da decimal sao de suma importancla na prograrnacao orientada a microcontroladores. A lmguagern C preve a capacidade de manusear dados nurnerlcos nas bases blnarla, octal, decimal e hexadecimal. Para utilizar uma con stante de base nurnerlca diferente da decimal, podemos utilizar um dos seguintes c6digos:
Valor 99 099 Ox99 Obl00ll00l Base numerlca Decimal Octal Hexadecimal Binario

Tabela5.4 Vejamos um exemplo de utlllzacao de constantes bases:


int valor!; valor! = 50; II atribui 0 valor valorl = Ox50; II atribui 0 valor valor! = 050; II atribui 0 valor valor! = ObO!O!OOOO; II atribui 0 valor!

numertcas de outras

50 decimal a variavel valorl 50 hexadecimal a variavel valor! 50 octal a variavel valor! valor binario O!O!OOOO a variavel

5.5.0peradores
Toda linguagem de programacao necessita de operadores e nesta materia, podemos dizer que a llnguagem C e real mente muito rica. Em C, contamos com operadores arltmetlcos (adlcao (+), subtracao (-), rnultlpllcacao (*), dlvtsao (f), resto de divisao (%), incremento (++) e deeremento (-», 16gicos e relacionais (maior (», menor «), igual (==), diferente (!=), AND (&&), OR (II)) e muitos outros. Maiores detalhes sobre 0 conjunto de operadores da linguagem e funcionamento podem ser vistos no capitulo 6.
0

seu

5.6. Expressoes
Expressoes sao elementos form ados pela unlao de varlavels, constantes e operadores entre si. De maneira geral as expressoes seguem as mesmas regras gerais das expressoes algebrtcas em rnatematlca, Vejamos alguns exemplos de expressoes em C:
Variavels e Tipos de Dados

Exemplo 5.3
custo = valor; a b + 1; teste * 3;

99700

Convertidd
116

Em C, tambem posslvel a utllizacao de expressoes condicionais, forme 0 exernplo a seguir: Exemplo 5.4
int x,y; y = (x > 5) * 10; II Como a condiG~o e avaliada verdadeira, y sera igual II Se a expressao fosse faIsa: y = (0) * 10 = O.

con-

No pr6ximi i expressoes et1]


I

5.7. Cony.
a (1)

x = 10;

10 = 10.

Sempre ql rentes entre s! conversao de tl 1) Em um do no: 2) Todos:


dlatarn

Isto posstvel porque em C, as expressoes sao avaliadas e resultam sempre em 0 (falso) ou 1 (verdadeiro). Dutra caracterlstica importante da utlllzacao de expressoes em C senoia de verlflcacao de tipos. Suponha a seguinte expressao: Exemplo 5.5
unsigned intB a; unsigned int16 b; unsigned int32 c; b = 300; c = 100000; a = c - bi

a au-

3) Cada I do tipd

Nas atrib~ atrlbulcao ser ~ A tabela dado envolvid~


Tipo da expressao short int char, lnt, long int ou int32 char ou int long int ou int32

!
i

Nao diffeil perceber que a varlaveI "a", definida como sendo de 8 bits, nao dlspoe de eapacidade para armazenar "c - b" que resulta no valor 99.700, ou seja,um valor de 17 bits. Este tipo de procedimento geraria um erro em outras llnguagens, mas nao em C. C e uma linguagem muito maleavel quanto eonstitufdas de tipos diferentes de dados .

construcao de expressoes

• A ferramenta que torna esta operacao posslvel de tipos.

a chamada conversao

Assim, no program a anterior,o compilador reallza uma conversao de tipos, convertendo 0 resultado de 17 bits (99.700 decimal), que efetivamente armazenado sob a forma de 32 bits, em um valor de 8 bits (116 decimal), tal qual demonstrado em seguida:

Microconlroladores PIC - Programa9ao em C

99700

00000000

00000001

10000101

01110100

Convertido para 8 bits:


116
01110100

condicionais,

con-

No proximo toplco veremos as regras que regem a conversao de tipos nas expressoes em C.

5.7. eonversao de Tipos


(1)

10

10.

Sempre que tivermos uma expressao composta por dados de tipos diferentes entre si, sera aplicada a chamada conversao de tipos. As regras de conversao de tipos em C sao basicamente tres: 1) Em uma atrlbulcao, 0 tipo do dado resultante da expressao do no tlpo de dado da variavel que recebe a atrlbulcao:

e converti-

liadas e resultam Bes em C


:

a au-

2) Todos os tipos short int e char sao convertidos no seu tipo base imediatamente superior, ou seja, Int; 3) Cada par de operandos de tipos diferentes convertido no tipo base do tipo superior, 0 que tambem chamado de prornocao de tipos.

Nas atribuicoes, a conversao depende basicamente de a varlavel-atvo atrlbulcao ser de maior ordem ou nao que 0 tipo resultante da expressao,

da

A tabela segulnte representa a forma de conversso para cada tipo de dado envolvido em uma atrlbulcao,
Tipo da expressao Tipo da Variavel Alvo char, int, long int ou int32 short int long int au int 32 Somente zerados
0

Resultado bit 0

sendo de 8 bits, no valor 99.700, arla um erro em o de expressoes

short int char, int, long int au int32 char ou int long int ou int32

e utilizado;

os outros bits sao

Obit 0 do resultado da expressao e armazenado na varlavel: os outros bits sao descartados. 0 byte LSB da variavel: assume 0 resultado da expressao: a parte MSB e zerada, Os 8 bits menos significativos do resultado da expressao sao armazenados na variavel: os outros bits sao descartados.

mada conversao
conversao de tie efetivamente 116 decimal), tal

char ou int

Tabela 5.5 (Continua)

Variaveis e Tipos de Dados


(

Tipo da expressao int32

Tipo da Variavel Alvo long int

Resultado Os 16 bits menos significativos do resultado da expressao sao armazenados na varlavel: os demais bits sao descartados. da expressao e truncado para 0 arrnazenamento na variave) float; possivel perda de dados. Obit rnenos significativo da parte inteira do resultado da expressao e armazenado na variavel, Os B bits menos slgnlflcatlvos da parte inteira do resultado da expressao sao armazenados na variavel, Os 16 bits menos sjgnltlcativos da parte inteira do resultadoda expressao sao armazenados na varlavel. A parte inteira do resultado da expressao armazenada na varlavel,

= 5i = 1000;) Y=x+z'
Z

o valor

int32

float

No exerrij convertido nO' slgniflcatlvos]


:1 'I

:1

Exemplo 5.7;1
:1

·i

float

short int

float a, J;l int C; :'[ long d; iI

float

char ou int

float

long int

int32 e; 1. a = 5.5;' .•. c = 10; ; d = 330;11 e = 10000 b = l (e

l
oj

float signed

int32 unsigned

.1

jj

5e 0 resultado da expressao for negativo, 0 resultado sera maior que 0 modulo do resultado. 5e 0 resultado da expressao for maior que extremo de faixa do tipo, 0 resultado sera negativo.
0

unsigned

signed

Tabela 5.5 No caso de uma operacao envolvendo dais tipos diferentes, 0 tipo de menor ordem sera convertido no tipo de maior ordem, conforme esta sequencia:
Maior Ordem Float int32 long int ou int 16 char, int ou intB Menor Ordem short int ou inti

Neste ej da pelos part a variavel convertida nQ ~ultiPli?ad? nor sera pnr\j varlavel "a". [1 do mesmo tit

"d.l
~:.II

Alem d~ ./ pode forcar e operacao Ch€

(novo_ell
Em que; C) no qual a!
do

Tabela5.6 Vejamos alguns exemplos: Exemplo 5.6


int x,y; long z;

casting u:

De fatoi

Vejarno] se deseje d Dutro valor r o resultado j


xI2

'r
I
I

!
'I

Microcontroladores PIC - Programagao em C

1,--------,1
':!

x z y
5 do resultado da a variavel: os

= = =

5; 1000; x + z; II

resultado

y sera igual a 237 decimal

io para 0 armazeslvel perda de irte inteira do re:enado na variavel. da parte inteira do mazenados na
5
I

No exemplo anterior, a expressao "x + z" resulta em um tlpo long, que e convertido no mesmo tipo de y (int), provocando a truncagem dos 8 bits mals stgnlficatlvos, Exemplo 5.7
float a,b; int c; long d; int32 e;
a '" 5.5; c " 10; d = 330; e = 100000; b = ((e I d) + c) * a; II

da parte inteira armazenados na

resu1tado b sera igual a 1721.5

expressao

e
Neste exemplo 0 compilador avalia as expressoes pela ordem determinada pelos parenteses e traduzi primeiramente a expressao "e / d", eonvertendo a varlave: "d" no tlpo int32. 0 resultado e somado vari€lVe "e", sendo esta I eonvertida no tlpo int32, da mesma forma. Em seguida, 0 ultimo resultado e multiplicado pela variavel "a" do tipo float. Isto significa que 0 resultado anterior sera primeiramente convertido no tipo float e em segulda multiplicado pela varlavel "a". 0 resultado final atrlbuldo diretamente varlavel "b", pols ela do mesmo tipo (float) que 0 resultado da expressao.

ir

negativo, 0 rerlo do resultado. )r maior que ultado sera


0

rtes, 0 tlpo de meesta sequencia:

Alem da conversao de tipos realizada pelo eompilador, 0 programador pode forcar explicitamente uma expressao a ser de um determinado tipo. Esta operacao chama-se modelagem (ou em ingles CAS7) e segue esta forma:
(novo_tipo) expressao

Em que novo_ti po " , determina 0 tlpo de dado (dentre os disponlveis em C) no qual a expressao segulnte sera convertida.
II

do

casting um tlpo de operador unarlo Oa que envolve apenas 1 operando).

De fato, a modelagem do dado constitui-se em uma operacao,

que faz

Vejamos um exernplo de utllizacao da modelagem de dados: suponha que se deseje dividir uma determinada varlavel inteira (por exemplo "x") por um outro valor inteiro (2, por exemplo), mas por algurn motivo seja necessarlo que o resultado inclua tambern a parte fraclonarla, Se escrevermos simplesmente:
xI2

Variaveis e Tipos de Dados

Note, que pelas regras ja estudadas, 0 resultado da expressao sera tambern do tipo inteiro. Assim, 0 resultado sera tarnbern sempre do tipo lntelro, Para podermos obter um resultado do tipo float, do modo desejado, poderfamos esc rever:
(float) x / 2

T
i !l

l
,
, c

,
)

Para alcanl truir prlmeirams no formato de ~ Exemplo 5.11


long X,Y; float z;
Y
;1

Um erro muito comum em prograrnacao C como esta: Exemplo 5.8


long x; int y; y = 10; x = y * 100;

e a esc rita

~
i3J

de uma expressao

x z

=
=

11; 2; 10 +

,
[]

/ / 0 resull
"}

j
// 0 resultado em x sera 232 !l!!!

i,
I; I'
," ::: i

5.8. MOdil

Este program a nao produz 0 resultado esperado: a rnultlpllcacao de '''y'' (inteiro de 8 bits) por 100 (constante inteira de 8 bits) produz outro resultado de 8 bits, que sera entao convertido em um nurnero de 16 bits e armazenado em "x". Para efetuar a operacao desejada, devemos primeiramente converter a varlavel "y" em 16 bits, em seguida multlpllca-la por 100. Veja como seria: Exemplo 5.9

A linguag~ usados para ~ teudo das vari,

primeir~ a variavel sej~1

;1

o segundj

Ii

Ii

long x; int y; y = 10; x = (long) y * 100;

II

resultado

em x sera 1000

que a variavel tempo, evitan~ outra forma p~ ~ " De mane! volatile'j


J

1
Outro erro classtco em programacao Ceo do exemplo 5.10:

5.9. MOd,l
Os mOdiJ para control a.' varlavel, ; Existem e register.
i

Ii
ji

Exemplo 5.10
long x,y; float z r
y=

z = 10 + ( y I x ); II 0 resultado da expressao /1 poderia esperar

11; 2/

acima sera igual a 12 e nao 12,5 como se

modifi como local. ' as varlaveis I~to e muit? j


diversos

Uma vez que as variavels "y" e "x" sao de tipos inteiros, a operacao de divisao tambern sera inteira, provocando 0 descarte da parte fraclonarla do resto da divlsao,
Microcontroladores PIC ramacao em C

o mOdifi!'
mod'1
i!
:j'

1
i

r
i

fil'
·','\,,'1

~;

Nil

xpressao sera tampre do tlpo inteiro. desejado, poderla-

Para alcancarrnos 0 objetivo desejado no program a acima, temos de instruir primeiramente 0 compilador, de que a dlvisao ( y / x ) deve ser realizada no formato de ponto flutuante, veja 0 exemplo 5.11. Exemplo 5.11

de uma expressao

long x,y; float z; y = 11;

x
z

1/ 0 resultado

2;
10 + ((float) y I x ); da expressao acima sera igual a 12,5

5.8. Modificadores de Acesso


ultiplicacao de "y" luz outro resultado bits e armazenado A linguagem C disponibiliza dois modificadores au qualificadores de tipo usados para especificar a forma que 0 compllador utiliza para acessar 0 conteudo das varlavets. prirneiro modificador de tlpo const, que determina ao compilador que a variaveI seja tratada como uma con stante , conforme ja vlsto no item 5.4. segundo modificador volatile, utilizado para determinar ao cornpllador que a variavel por ele modificada pode ter seu conteudo alterado a qualquer tempo, evitando assim que 0 compilador efetue otirnizacoes de codlgo que de outra forma poderiam provocar um comportamento erroneo do programa. De maneira geral, volatile.
0

nente converter a [a como seria:

compilador CCS nao necessita do uso do modificador

.10:

5.9. Modificadores de Armazenamento


Os modificadores de armazenamento sao elementos especiais utilizados para controlar a forma como a compilador ira lldar com 0 armazenamento da varlavel. Existem quatro modificadores definidos em C padrao: auto, extern, static

e register.
2,5 como se

modificador auto utilizado para definir a ambito ou escopo da vanavel como local. Nao necessarlo utilizar esse modificador, porque, por deftnlcao, as varlavels em C possuem escopo local. .

IS,

a operacao de rte fracionana do

modificador extern utilizado para definir vanavels externas ao programa, Isto muito utilizado na crtacao de programas grandes e complexos, utilizando diversos modules separados e que sao depois tlgados por meio de um programs

Variaveis e Tipos de Dados

especial chamado linker. 0 cornpilador CCS nao permite varlavels do tipo extern, no entanto esta continua sendo uma palavra reservada da linguagem. modificador register utilizado para instruir ao compilador que tente armazenar a varlavel diretamente em um reglstrador da CPU. Esse modificador nao possui efeito no compilador CCS, ja que todas as variavels sao armazenadas em registradores. ultimo modificador, static, determina ao compilador que a varlavel ocupara uma postcao permanente na memoria. As variavels do tipo static funcionam como as variavels globals no sentido de que nao sao destruidas ao terrnmo da execucao da funcao na qual foram declaradas, e funcionam como varlavels locais no aspecto de que nao sao conhecidas fora da funcao em que foram original mente declaradas. Alem disso, as varlavets static sao sempre lnlctallzadas pelo compilador com 0 valor

Neste topico i! na memoria do mid

Como ja foi df ciando-se da parte (MSB). Isto signifj~ Ox12345678 esti .. seguinte distribuiC;:

O.
Variaveis static sao utilizadas quando necessitamos uma varlavel local da tuncao entre uma chamada e outra, balho de criacao de bibllotecas de funcoes.
0

manter 0 valor de que facilita 0 tra-

No easo das i adotado pela Mien, Neste forman guinte forma:


Formato
IEEE754 Microchip!
!, I

Um exemplo de utilizacao de varlaveis static encontra-se em seguida: Exemplo 5.12


#include <16F628.h> #use delay(clock=4000000) #fuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP #use rs232(baud=19200,parity=N,xndt=PIN_B2,rcv=PIN_Bl) int calcula(void); main(}
{

II

prot6tipo

da fun9ao

int conta; for (conta=O; conta<5; int calcula(void)


{

Em que:
conta++) printf("%d ", calcula());

eb e 0 e f2 arm! IEEE 754!

static int valor; valor = valor + 10; return (valor) ;

Observe que] erochip e adotadl ottrnlzacao, pais ~ mais veloz dos

G'I

5.10. Aloca(:ao de Memoria


Como ja foi dito, cada vez que declaramos uma variavel, 0 compilador ira reservar um ou mais enderecos da memoria RAM de forma a armazenar a vartavet,

5.11. Rede~
A unguagem] finir novas nome1
I

Microcontroladores PIC - Programa~ao em C

vels do tipo extern, ~uagem. npilador que tente I. Esse modificador vels sao armazenaque a varlavel ocu-

Neste toplco iremos estudar a forma como sao armazenadas as variavels na memoria do microcontrolador. Como ja foi dito, as varlavets do tipo inteiro sao armazenadas sempre lnlclando-se da parte menos signlflcatlva (lSS) para a parte mais slgnificatlva (MSS). Isto significa que se uma varlavel inteira de 32 bits contendo a valor Ox12345678 estiver armazenada no endereco Ox20 hexadecimal, teremos a seguinte dlstribulcao na memoria RAM:
Enderelto Ox20 Ox21 Ox22 Ox23 Conteudo Ox78 Ox56 Ox34 Oxi2

s globals no sentifa funcao na qual specto de que nao ~ declaradas. Ah~m pilador com a valor manter a valor de ) que facilita 0 trae em seguida:

Tabela5.7 No caso das vartavels do tlpo float, a formato utilizado e adotado pel a Microchip.
0

ponto flutuante

Neste formate, sao utilizados 4 bytes de memoria, sendo divididos da seguinte forma:
Formato
IEEE754

eb
sxxx xxxx

to
y.xxx s.xxx xxxx xxxx

f1
xxxx xxxx xxxx xxxx

f2
xxxx xxxx xxxx xxxx

Microchip

xxxx xxxx

Tabela 5.8 Em que:


.la () ) ;

eb a expoente do numero somado a 127, s e 0 bit de sinal e fO, f1 e f2 armazenam a parte fracionarla da nurnero, No caso do formato IEEE 754, yeo bit lSS do expoente eb.

Observe que 0 formato padronizado pelo IEEE difere do utilizado pela Microchip e adotado pelos compiJadores CCS. Isto ocorre por uma questao de otlmlzacao, pois 0 0 formato adotado pela Microchip permite uma execucao mais veloz dos catculos envolvendo dados do tipo ponto flutuante,

5.11. Redefinindo Tipos de Dados


I, 0 compilador ira a armazenar a vaA linguagem C prove ainda um comando que permite ao programador definir novos nomes para os tipos de dados existentes.

Variaveis e Tipos de Dados

~i

::1

Este comando eo typedef eo seu formato geral e:


typedef tipo novo_nome:

8)

Qual

resulted,

int x,y:
x = 5; y = (x==5)

Vejamos um exemplo de utllizacao do comando typedef: Exemplo 5.13


typedef float fracao: fracao variavel:
II

* 2;J
,!

9) Indique

resul

.1 .1

declara uma variavel

do tipo fracao

(float)

int x,y; long int z; z = Ox1234; y = z + 1;


x = y + 1;

10) No programa

5.12. Exercicios
1) 2) 3) 4) 5) Quais sao os tipos baslcos de dados na linguagem C padrao? Qual e a dlferenca entre os tipos short int e int1 no compilador CCS? Qual e a dlferenca entre uma variavel signed e outra unsigned? Qual e a magnitude de arrnazenamento do tipo long int? Suponha que 0 valor -1 e armazenado em uma vartavel do tlpo signed int e em um determinado ponto do program a essa vartavel e atrlbulda a outra do tipo unsigned into Qual e 0 valor efetivamente armazenado na ultima variavel? Qual e a dlferenca entre uma vartavel global e uma static? No program a seguinte, qual navels?
int teste; int funcao1 (int a, int b) 0

s
'1 'I

,j

'i

int Xi long y; float z r x = 110; y = 300: z = y / Xi


"

11) Qual a utilida~


']

I'

I'

6) 7)

escopo (global/local)

de cad a uma das va-

return a+b; main(]


{

int valor: valor =5: teste = funcaol(valor,10)i

Microconlroladores PIC - Programa9ao em C

8)

Qual
int

resultado armazenado na varlavel "y" no programs seguinte?

X,Yi

x :: 5;
y :: (x==5)

2;

9)

Indique

resultado armazenado na variavel "x" do program a seguinte:

(float)

int x,y; long int z; z = Ox1234; y = z + 1; x = Y + 1;

10) No program a seguinte, qual


int x; long y; float z; x = 110; Y = 300; z = y I x;

valor armazenado em "z"?

Idrao? ipllador iigned?

ees?

11) Qual a utilidade da modelagem de dados au typecasting?

e atribulda
c?

do ti po signed int a outra szenado na ultima

cada uma das va-

Variaveise Tipos de Dados

Anota(:oes

'I
!i

Como ja foi possivelmente urn vel atualmente. tJ


;)

:1

'I

Esta caractej agrega aos opera:~ as operadores et como a Assembly~


i

Podemos cia! principais: atribui,! mem6ria e outrosj


'-j

I.~

6.1. Atribui~
,I

A primeira c~ operado.r_de atri~ uma vanavel. Umj


'!

x = 10; y = X;

Podemos ver primeira, foi atrib]

lor de "x" (que "y" sera lgual a 1,

e '.
4
!I
;1

Repare que .~ nao posslvel reG

Microcontroladores PIC - Programac;ao em C

A: .f

.J ·-1 ~

-----1

SMA

IORiAM

NUCLEO DE INFORMACAo TECNOL6G1CA

6 Operadores

Como ja foi dlto, a llnguagem C possul uma gama de operadores, sendo possivelmente uma das llnguagens com maier nurnero de operadores disponfvel atualmente. Esta caracterfstica um dos pontos positives da llnguagem, ja que C egrega aos operadores comumente encontrados nas llnguagens de alto nfvel, as operadores encontrados frequenternente em linguagens de baixo nfvel como a Assembly. Podemos classificar as operadores da linguagem C em sete categorlas prlnclpals: atribulcao, arltrnetlcos. relacionais, logtcos, 16gicos bit a bit, de mem6ria e outros.

6.1. Atribui~ao
A primeira categoria de operadores tambern a mais utilizada. Em C, 0 operador de atrlbuicao "=" utilizado para atribuir um determinado valor a uma varlavel, Um exemplo de atrlbulcao:

x = 10; y = X;

Podemos verificar no programs anterior duas operacoes de atribuicao: na primeira, fol atribufdo a valor 10 vartavel "x", na segunda, foi atribuldo 0 valor de "x" (que e 10) a variavel "y". Conclui-se entao que ao final do programa, "y" sera lgual a 10.

nao

e possfvel

Repare que a atribulcao e sempre avaliada da direita para a esquerda e realizar uma atributcao no sentido inverso.

Operadores

6.2. Aritmeticos
Sao utilizados para determinar ao compilador que efetue determinada operacao rnatematlca em relacao a um ou mais dados:
Operador
+

Nestes cases da atribulcao propf Vejamos um


int X'YIZ; x = 0; y = x ++;
Z ~

A9ao Adig80 subtracao ou menos unario Multlplicacao Divisao Resto de dlvisao lnteira Incremento Decremento

++

Xi

*
/
% ++

Neste caso, sera lgual a 2, 0 sera lgual a 2.

a
<

-_

Tabela 6.1 Os operadores de adlcao, subtracao, multlpllcacao comentarlos, operador % utilizado para retornar inteira. Vejamos um exemplo: e diVisao dispensam

Observaeao i~ mento au deq como as tlpos]


I

Note que ha ~ Ambas prcdu caso, somente a I caso, tanto "y" d


~ 1
1

,i

resto de uma operacao de dlvlsao

5 / 2 = 2,5 em uma divlsao real, ou 5 / 2 ::::4, em uma dlvlsao inteira, sen do 0 resto igual a 1. Assim,
0

I I

valor de 5 / 2

e 4 e 0 valor de 5 % 2 e igual a 1.

6.3. RelaCi~
Sao utlllzadoi entre os dados:
j

Os operadores de incremento e decremento sao utilizados para somar 1 (incremento) ou subtrair 1 (decremento) de uma varlavel. A forma geral para utlllzacao destes dois Qltimos operadores e:
variavel
++; au variavel
--I

Ou ainda per meio de uma atrlbulcao:


variavel_l
= variavel_2 ++; au variavel_l = variavel_2

Observe que em ambos os casos, a atribulcao ocorre da seguinte forma: o valor da vartavel "variavel_2" armazenado em "variavel_l" e ap6s lsso, o conteudo de "variavel_2" incrementado ou decrementado.

No entanto, em C
variavel_l

e tarnbem

posslvel escrever:
ou variavel_l
= --

++ variavel_2;

variavel_2;

Nao ha muit menta identico i, utilizamos no nos,J

:1

:I

Microconlroladores PIC· Programaifao em C

l :?

Nestes casos, a operacao de incrementojdecremento da atrlbulcao propriamente dita. fetue determinada Vejamos um exemplo:
int x,y,z;
x = 0; y = x ++; Z = ++ Xi

realizada antes

Neste caso, ap6s a execucao dos tres comandos, sera lgual a 2, 0 valor da varlavel "y" sera igual a 0 e sera lgual a 2.

0 0

valor da varlavel "x" valor da varlavel "z"

Obse..va9ao importante: Nao e posslvei utilizar os operadores de lncrementa au decremento com variaveis au tipos de dados complexes, tais como as tipos ponto flutuante.

jiVisao dispensam peracao de dlvlsao ma divisao inteira, 1. dos para somar 1 lores

Note que ha uma dlterenca clara entre escrever

"s=

+ 1" e

"s=

-+x":

Ambas produztrao 0 mesmo resultado em "y", no entanto, no primeiro caso, somente a vartavel "y", alvo da atrlbulcao, e alterada. Ja no segundo caso, tanto "y", como "x" sao alteradas !

6.3. Relacionais
Sao utilizados em testes condicionais para determinar a relacao existente entre os dados:
Operador
> >=

e:

A9ao Maior que Maior au lgual a Menor que Menor au lgual a lgual a Diferente de

<
<=

-Ia seguinte forma: ~1_1"e ap6s lssc, do.


!=

Tabela 6.2 Nao ha muito 0 que falar sobre estes operadores, ja que 0 seu funcionamento identico ao que todos estudamos na disciplina de rnatematlca e que utilizamos no nosso dia-a-dia.

Operadores

............. __ ._._,

~~===

.. "". " ,,= ...

,.=.-.~-"--""".-.".""'~'< ....~~ .... ~_&.ci;~:;,"'"--~."",~.=:,-;,c-;:.;=:~L"", """,",,,-,--_ ~ ..

Repare que os operadores relaclonals podem ser uttllzados expressoes condicionais como ja visto no capitulo anterior.

para construlr

6.4. L6gicos Booleanos


as operadores loglcos ou booleanos sao utilizados para realizar conjuncoes, dlsjuncoes ou negacoes entre elementos em um teste condicional. as operadores 16gicos somente podern resultar em um dos val ores: verdadeiro ou falso. Operador
&&

"

6.5. Logic'
Os ope cas entre el loglcos simpl mesma magn

,I

A9ao AND (E) OR (OU) NOT (NAO)

II
!

Tabela 6.3
as operadores relacionais sao elementos de suma lmportancla na construcao de testes condicionais. Com esses operadores pod em os relacionar diversas condlcoes diferentes em um mesmo teste 16gico. Vejamos
x

um exemplo:

int x,y; = 10; if (x>5 && x<20) y = x;

:1 j

Como podemos verificar, a variavel "y" so mente sera lgual ao valor da varlavel "x" se 0 valor de "x" for maior que 5 e "x" for menor que 20. a que nos leva a concluir que ao final da execucao do programa "y" sera igual a 10. Observe que para determinar 0 resultado da coniuncao no comando if, 0 compilador procede da seguinte forma: primeiramente avalla a expressao "x > 5", 0 que no presente caso resuJta verdadeiro, ja que "x", que vale 10, maior que 5. Em seguida, precede avallacao da expressao "x < 20", a qual tarnbem resulta verdadeira. Finalmente, 0 compilador verifica 0 resultado da conjuncao (verdadeiro E verdadeiro) 0 qual verdadeiro, executando assim a atrlbulcao segulnte (y x).

6.5.1. Oper, - :~ A operacaq


no AND, mas cj para cada bit dq
int v1,v2;
,I

,j

;j

v I = 100 ;i.,l: v2 = v L & 11

A operaca

Um aspecto importante a ser observado que em C, uma varlavel com valor igual a zero, sera avaliada como falsa e se tiver urn valor diferente de zero, sera avaliada como verdadeira. Vejarnos urn outro exernplo:
int teste,teste_2; teste =0; teste_2 = 0: if (!teste) teste_2++:

+
,1

:j
Isto Signifi~ Microcontroladores PIC - Programa~ao em C

ados para construir

Como podemos perceber, a avaliacao de "!teste" sera verdadeira, ja que a varlavel possui valor zero e 0 teste verifica a negacao da varlavel, Asslrn, no presente caso, a vartavel "teste_2" termlnara com 0 valor 1.
Observaliao importante: Nao e passive I utilizar os operadores logicos com variaveis au tipos de dados complexos, tais como as tipos ponto flutuante.

sra reallzar conjunrte condicionaJ. Os ores: verdadeiro ou

6.5. L6gicos Bit a Bit


Os operadores 16gicos bit a bit sao utilizados para realizar operacoes 16gicas entre elementos ou varlavels, No entanto,ao contra rio dos operadores 16gicos simples, os operadores loglcos bit a bit podem resultar em urn valor da mesma magnitude dos elementos operados.
Operador
&

Acrio AND (E) OR (OU) XOR (OU exclusivo) NOT (complemento de urn) Deslocamento Deslocamento

oortancla na consxlemos relacionar

I
»

1\

a direita a esquerda

Tabela 6.4

ral ao valor da value 20. 0 que nos ~ igual a 10. no comando if, 0 a expressao "x > " que vale 10, I "x < 20", a qual :a 0 resultado da scutando assim a

6.5.1. Operador & (And)


A ooeracao 16gica AND funciona da mesma forma que 0 operador booleano AND, mas com a dlferenca de que a operacao realizada separadamente para cada bit dos operandos. Vejamos urn exemplo:

int v1,v2; v1 '" 100; v2 '"v1 & 15;

A operacao AND representada ocorrera da seguinte forma:

a varlavel com vadiferente de zero,

100 decimal = 015 decimal


Resultado Isto significa que
0

0 11 0 0 1 0 0 0 0 0 0 1 1 11 00000 100

AND (&)

= =

valor armazenado em "v2" sera lgual a 4 decimal.


Operadores

Podemos perceber que 0 operador 16gico AND e uma excelente forma de desllgar um ou rnals bits de uma determinada varlavel, ja que um bit 0 em um dos operand os tara com que 0 respectivo bit do resultado seja tarnbem igual a zero. Imagine que desejemos desllgar os bits 5, 6 e 7 de uma varlavel chamada "portb". A forma de fazer isso poderia ser:
Jlbyte portb = 6 portb = portb & Ob1l100000;

Vejamos a ex~
I~.

si

6.5.2.

Operador I (OR)

A operacao OR, tal qual 0 operador AND, tambem trabalha de maneira similar ao seu equivalente booleano, com a dlferenca de que tarnbem aqui a operacao realizada para cad a bit dos operandos. Vejamos um exemplo:

Podemas obs~ resultaram em unil 'I operandos fossem]

6.5.4. Operad~,

int vl,v2i vl = Ox20;

v2 '"vl

Ox04;

o NOT atua c plemento de urn. t bit do operando e~1


'I

Esta operacao OR sera reallzada da seguinte forma: 20 hexadecimal = 04 hexadecimal Resultado 0 0 10 0 0 0 0 00000100 00100100

c; int X,Y; long a,b; x = 1; a = 1; y = - Xi b = - a;


);
"

OR (I)

;.j

;1
,I

Vejamos a ap~ 1 decimal = Resultado = 1 decimal Resultado


'I

:,1

Como podemos perceber, 0 resultado armazenado em "v2" sera lgual a 24 hexadecimal, e se analisarmos a operacao, poderemos conclulr que a operaC80 OR constitui uma excelente forma de llgar bits de uma varlavel, ja que os bits em um dos operand os permanecerao sempre ativados no resultado.

= =

6.5.3.

Operador

(XOR)

Concluimos e' o complemento do'


Ja

A XOR (exclusivamente OU) consiste em uma operacao 16gica entre dois, na qual 0 resultado so mente sera verdadeiro (nlvel loglco 1) se um e somente um deles for verdadeiro (nlvel 1). Ou seja, caso os operandos sejam lguais (0, ou 1, 1), 0 resultado sera falsa (niveJ 0).

:1

variavel

"

que resulta no val

Operadores XOR sao multo utilizados em funcoes de cornparacao de valores: se os bits dos operandos sao iguais, 0 resultado 0; se forem diferentes, a resultado 1. Vejamos um exemplo do funcionamento do operador XOR em

C:

6.5.5. Operad' Finalmente, r


querda e

int x,y; x = 100; y=x 99;


A

a dlrelta, valor » nt
n


Microconfroladores PIC - Programayao em C

valor «

sxcelente forma de .Ie um bit 0 em um eja tarnbem igual a ma varlavel chama-

Vejamos a execucao da operacao XOR: 100 decimal = 99 decimal Resultado 0 11 0 0 1 0 0 0 11 0 0 0 11 0 0 0 0 0 111

XOR (A)

lha de maneira sle tamoern aqui a m exempJo:

Podemos observar que apenas os bits diferentes entre os dois operandos resultaram em urn valor 1. Os bits lguals resultaram em um valor O. Se os operandos fossem lguals, 0 resultado seria igual a zero.

6.5.4. Operador

'-I

(NOT)

NOT atua como operador de negacao, ou em aritrnetica bin aria 0 complemento de um. Isto slgnlnca que 0 operador NOT inverte 0 estado de cada bit do operando especificado. Vejamos urn exemplo:
int x,y; long a,b; x = 1; a = 1; y = - x; b = - a;

Vejamos a operacao do operador de complernento: "v2" sera igual a nclutr que a opearlavel, ja que os resultado. 1 decimal Resultado 1 decimal Resultado

= = =

00000001 1111111 0 0000000000000001 1111111111111110

( 8 bits, vartave: x) ( 8 bits, variavel y) ( 16 bits, variavel a) ( 16 bits, varlavel b)


0

J6gica entre dois, e um e so mente sejam iguais (0, paracao de valoforem diferentes, perador XOR em

Conclufmos entao que a varlavel "x", de 8 bits, termlnara ocomplemento do valor 1, ou seja, 254. Ja varlavel "b" sera atrlbuldo que resulta no valor 65534.

program a com
0

valor da negacao de "a", de 16 bits,

6.5.5. Operadores de Deslocamento «

»
a
es-

Finalmente, temos ainda os operadores de deslocamento de bits querda e a direita. 0 formato geral de uso destes operadores 13: • • valor » valor « numero de bits a deslocar nurnero de bits a deslocar
Operadores

a direita ou a esquerda

Vejamos um pequeno prograrna para demonstrar operadores de deslocamento:


int x, y, z; x = 10; y = x « 2; z = x » 1;

funcionamento

dos

6.6. Mem6ri~

atribufdo varlavel "y" 0 deslocamento de dois bits esquerda da varlavel "x", Vejamos 0 funcionamento desta operacao: 10 declmal= 00001010

o funcionamento Primeiramente e

cos operadores de deslocamento e

seguinte:

~ Os operadore$! ros, sao elementos; ros sao conslderao] direto a qualquer ~ complementares p~
Operador;j
&
q

:1
11

«
00010100 « Resultado » 00101000

I
'I
:1

6.6.1. Operadq
:i
~\

II

Observe que foram realizadas duas operacoes de deslocamento, sen do que 0 primeiro deslocamento resultou em 00010100 blnarlo (20 decimal). Em segulda realizado outro deslocamento, que resulta em 00101000 blnarlo (40 decimal), sendo este valor atribufdo varlavel "y".

0& e um Ope] do seu operando. I~


endereco
-

a=

&~,
OJ

A proxima linha atribui varlavel "z" reita. Vejamos 0 seu funcionamento: 10 declmal »

valor de "x" deslocado um bit

a di-

Teremos que! armazenada a vari~


::l

:j

00001010 »

6.6.2. Operadq Ja 0 * e um de memoria ender~


a
=

01
::j j ]

z::::: 00000101 Percebemos que 0 conteudo da varlavel "x" (00001010 btnarlo ou 10 decimal) e deslocado um bit a direita, resultando em 00000101 blnarlo ou 5 decimal, sendo este valor atribufdo variavel "z",

*endereco~l

que fara col "endereco_a" seja] Veja em segul Exemplo 6.1

Com base nestas operacoes podemos verificar que no operador de deslocamento esquerda, cad a bit deslocado equlvale a multiplicar 0 primeiro operando por 2. Ja no operador de deslocamento direita, equivale a dividir 0 operando por 2.

;1

Observe que cada operacao de rotacao traduzida pelo cornpllador em uma lnstrucao assembly de rotacao de bits (RLF ou RRF, conforme 0 caso).
Observa,,;:ao importante: Nao e posslvel utilizer os operadores 16gicos bit a bit com varlavels ou tipos de dados complexos, tals como os tipos ponto flutuante. Microcontroladores PIC - ProgramaQao em C

#include <16f6: #use delay(clq #fuses HS,NO , #use rs232 (baJ, int *endereco i~ main() :1

{j

5;

:1

,I"
-r:

funcionamento

dos

6.6. Memoria
Os operadores de memoria, tarnbem chamados de operadores de ponte iros, sao elementos de grande lrnportancla na llnguagern C. De fato, os ponte iros sao considerados um dos piJares da llnguagern C, pols permitem 0 acesso direto a quaJquer endereco de memoria do sistema. Existem do is operadores complementares para 0 aces so a memoria:

seguinte:

snto de dois bits


peracao:

Operador
&

Attao Endereco do operando conteudo do endereco apontado pelo operando

Tabela6.5

6.6.1. Operador &


slocarnento, sendo (20 decimal). Em 00101000 binarto locado um bit & um operador unarlo utilizado para retornar do seu operando. Isto significa que se escrevermos:
endereco_a = &a;

endereco de memoria

di-

Teremos que a variaveI "endereco_a" armazenada a varlavel "a".

contera

endereco em que esta

6.6.2. Operador *
Ja 0 * um operador unarto utiJizado para retornar 0 conteudo da poslcao de memoria enderecada pelo operando que 0 segue. Vejamos outro exemplo: ) blnarlo ou 10 de)101 blnarlo ou 5 iperedor de desJo:ar 0 primeiro ope~(jivale a dividir 0 10 compilador em 'orme 0 caso).
:; logicos bit a IS tipos ponto
a = *endereco_a;

que fara com que 0 valor armazenado no local apontado pela varlavel "endereco_a" seja atrlbuldo varlaveI "a".

Vejaem seguida um pequeno exemplo da utlllzaeao de ponteiros: Exemplo 6.1


#include <16f628.h> #use delay(clock=4000000) #fuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLvP #use rs232 (baud=19200,parity=N,xmit=PIN_B2,rCv=PIN_Bl) int *endereco,x,y; main()
{

x = 5;

. Operadores

1
endereco = &x; Y '" *endereco; printf("valor x= %d - endereco
int x,y; x = 5; Y = x==7

de X= %lx - valor y= %d",x,endereco,y);

10::1
t

Provavelmente a safda impressa deste programa sera:


valor X= 5 - endereco de X= 26 - valor y= 5

funclonarnei a valor 5 variavE "x" for igual a 7, ~ mais 3. Como sah (5+3).

11

que signlftca que 0 valor de "&x" (endereco de "x") igual a Ox26, 01,.1 seja, a varlavel "x" esta localizada no endereco Ox26 da memoria RAM do PIC. Maiores detalhes sobre 0 funcionamento dos operadores de mem6ria serao vtstos quando estudarmos a operacao dos pontelrcs no capitulo 8.

Note que ta~ convencional, COnil Exemplo 6.2

:1

,1
~I

II

6.7. Outros Operadores


Alem dos operadores anteriormente citados, podemos encontrar ainda outros operadores nao tao conhecidos em C:
Operador
?
r

#byte porta = :1 #byte portb =11 int liga_ledl'l.


{I

porta int

po~ i

(\!
{

desliga_l~; porta
= pori

A9ao Operador ternarlo condicional Separador de expressoes Separador de estruturas

main I )

Ci :)

while

'j
jl
I
,I

_> (tipo) sizeof

Ponteiro de elemento de estrutura Operador de Modelagem de dado Retorna


0

Neste pequef duas chamadas

:-1

iii
tj 111
:1

tamanho da varlavel

Na tuncao Pj (truer) avaliando CI


(portb
&

Tabela6.6

1)

6.7.1. Operador?
operador ternarlo "?" utilizado para substituir uma expressao condicional baseada no comando IF e tern esse nome devido ao fato de ser composta sempre por tres expressoes. Sua forma geral e:
Variavel

Se a avaliac] zero, au melhor executada a prim", da funcao desliga

Expressaol?

Expressao2:

Expressao3

6.7.2.

operadl:.. _

navel a expressao exernplo:

o que slgnlttca:

avalie a expressao 1 e se ela for verdadeira, atribua va2; casa contrarto, atribua a expressao 3. Vejamas um

e:

Outro operad. enfileirar duas OU}

Microconlroladores PIC - Programa9ao em C

.................

_ ..__ ..... ----_._---:

d", x ,endereco,y) ;

int x,y; x = 5; y = x==7 ? 10: x+3;

funcionamento deste program a e 0 seguinte: prlmelramente e atribuido o valor 5 varlavel "x'', Em seguida, a expressao condicional e avaliada: se "x" for lgual a 7, entao "y" sera igual a 10; caso contrarto, "y" sera lgual a "x" mats 3. Como sabemos que "x" e igual a 5, teremos que "y" sera lgual a 8 (5+3).

e igual a Ox26, ou moria RAM do PIC. es de memoria secapitulo 8.

Note que tambem e possfvel utilizar convencional, como neste outre exernplo:
Exemplo 6.2
#byte porta = 5 #byte portb = 6 int liga_led(void)
{

operador "?" de uma forma pouco

porta

= =

porta

1; II ativa

pino 0 da porta A

sncontrar ainda ou-

int desliga_led(void)
{

porta main()
(

porta & 254; II desliga

pino

da porta

while

(true) (portb & 1)

liga_led()

desliga_led();

Neste pequeno programa, temos tres funcoes: a principal mainO e outras duas chamadas Uga_led e desliga_led. Na funcao principal,
0

programa permanecera num loop infinito (while

(true») avaliando a expressao:


(portb & 1) ? liga_led() : desliga_led();

expressao condifato de ser com-

Se a avallacao de "portb & 1" resultar verdadeira, ou seja, diferente de zero, ou melhor dizendo: se 0 bit 0 da porta B estiver em nivel loglco 1, sera executada a primeira tuncao Iiga_led; caso contrarlo, sera executada a segunda funcao desliga_led.

6.7.2. Operador Virgula


leira, atribua vaI 3. Vejamos um

e:

Outro operador pouco conhecldo da linguagem Ceo vtrgula, utilizado para enfileirar duas ou mais expressoes. A forma geral de utilizacao deste operador

Operadores

variavel

(expressao

1, expressao

2[,expressao

xJ)

Note que as expressoes sao avaliadas da esquerda para a direita e a varlavel recebe 0 valor da ultima expressao avaliada. Veja
y=

Observe que Q ves disso, aloca-se' valor modificado. !

exemplo seguinte:
x+5);

6.7.6. operado
si~ zada por uma deter:
)

(x=O;

o operador

Como podemos perceber, primeiramente a varlavel "x" assume 0 valor zero e em seguida, "y" ira assumir 0 valor de "x" mais 5, ou seja, ao final da avatlacao da expressao, " y = 5 ". Observe ainda que posslvel colocar outras expressoes nao necessariamente reJacionadas com a atrlbutcao em si, como no exemplo segulnte:
z

A principal apl controlar a ocupaci lidade do prograrna A forma geral j


sizeof sizeof

(x

0,

5, x - 2);

compilador gera c6digo para cada expressao individual mente, terminando por gerar 0 ultimo c6digo: "z = x - 2" .
!

vari<§.ve1 (tipo ,

Ii

dl

6.8. Associai'
6.7.3. Operador Ponto
operador ponto e utilizado em estruturas de dados como separador dos elementos e sera estudado mais adiante, no capitulo 8.

Para facilitar ~. caracterfstica que i seguinte forma.

I
,

6.7.4.

Operador .>

NormalmenteJ i das nos prograrnas ,

1,
t'

Tambern chamado de operador seta, utilizado para a funcao de ponteiro para uma estrutura de dados e sera devidamente estudado no capitulo 8.

variavel

= vari

l
i
{
-I

Nestes c~_SOS escrita da varlavell


variavel (ope~
-i

6.7.5. Operador de Modelagem de Tipo


Conforme ja visto no capitulo anterior, a llnguagern C dlspoe de um operador unarlo destinado especificamente a forcare conversao do operando especificado em um tipo de dado determinado. A isto, da-se 0 nome de modelagem ou typecasting. A forma geral do operador de modelagem e:
(tipo) variavel

Na tabela dos admitidos em]

sel

Onde "tipo" especifrca 0 novo tlpo de dado para da variavel especificada sera convertido.

qual

conteudo atual

'I

Microcontroladores PIC - Programar;:ao em C

Ira a direita e a va-

Observe que 0 conteudo da variavel nao alterado pelo operador, ao inves disso, aloca-se uma regiao de RAM para 0 armazenamento ternporarto do valor modificado.

6.7.6. Operador Sizeof


'" assume 0 valor IU seja, ao final da ~s nao necessaria10 segulnte: operador sizeof utilizado para retornar a quantidade de mem6ria utilizada por uma determinada varlavel ou um determinado tipo de dado. A principal apllcacao deste tipo de operador permitir ao programador controlar a ocupacao de mem6ria pelo programa, auxiliando assim na portabilidade do programa. A forma geral do operador e:
sizeof variavel OU sizeof (tipo de dado)

almente, terminan-

6.8. Associa.;ao de Operadores


rno separador dos
Para facilitar a vida do programador, a linguagem C inclui ainda uma outra caracterfstica que a abrevlacao de operadores em atrlbulcoes e funciona da seguinte forma.

Normalmente, as operacoes de atribuicao mais frequenternente das nos prograrnas possuem a seguinte forma:

encontra-

uncao de ponteiro
10

variavel

~ variavel

(operando) valor

{ou variavel}

capltulo 8.

Nestes casos, a abreviacao de operadores permite economizar a Segunda escrita da varlavel, reduzindo 0 comando seguinte forma:

variavel

(operando)~ valor

{ou variavel}
OS

lispoe de um opesao do operando o nome de mode-

Na tabela seguinte, podemos encontrar dos adrnitldos em C.


Forma reduzida

tipos de operadores abrevia-

Forma expandida

x +=y X-= y
o conteudo atual

x=x+y x=x-y x=x*y

x *=y

Tabela 6.7 (Continua)

Operadores

r
Forma reduzida Forma expandida x=x/y x=x%y x=-x&y x = xl Y X=Xlly X =. x« X =- x > y y

x/=- y
x%=y x &= y x 1= Y X 11=Y X «= X »=y y

Tabela6.7

No caso de avaliacao e a nat

6.9. Precedencla dos Operadores


Na tabela apresentada em seguida, podemos verificar a ordem de precedencia de todos as operadores dlsponlvels na linguagem C. Par ordem de precedencla entende-se a prioridade na avallacao de multiples operadores numa determinada expressao, lsto significa que operadores de maior ordem de precedencla serao avaJiados primeiramente em reiacao aos operadores de menor ordem.

6.10. ExerCf
1) 2) 3) 4) 5)
->

.i

.,

I
i;
:1

Qual e a dife~ Qual Qual

e a res~ e a resu
I
I
.1

E claro que a usa de parentesis em uma expressao, como podemos coIher da tabela, permite aumentar a precedencla de avanacao do conteudo interno aos mesmos.
Ordem
Maior
I I

Como e avalil Qual


int

Operador
( ! ) [

e a valo\
1;

1
&

(tipo)
*

++

-sizeof %

x,y;

*
I
+ «

y :; 256;

~ :"/:,

» »=
I:;
&

«:;

:: ::::::~::
~ong int Lnt; y, z; z = 100; y = 10; Y = (int) x. ~.
,{

I
1
J.

--

;t
]

Tabela 6.8 (Continua)

x=z*Y+

ZI x; ,

Microconlroladores PIC - Programayao em C

Ordem

Operador

"

I
&&

II
? = Menor +=

-= ,

*=

/=

Tabela6.8 No caso de operadores de mesma prioridade ou precedencta, a ordem de avaliacao e a natural, ou seja, da esquerda para a direita.

6.10. Exercicios
a ordem de precePor ordem de pre, operadores numa ~ maior ordem de os operadores de 1) 2) 3) 4) 5) Qual Qual Qual

e a dlferenca

entre

operador ::::: e

operador :::::=?

e 0 resultado e 0 resultado e avaliada

da expressao (10 && 5)? da expressao (10 I 5)?

.omo podemos coio do conteOdo in-

Como Qual

a expressao (x

= (10+5)

< 20)?

e 0 valor

de "x" ao terrnlno do programs apresentado em seguida?

int x,Y; y 256; y += 1; x=y» 1;

6)

Qual

e 0 resultado
0

da expressao (10 % 3 + i)?

7)

Qual e

valor de "y" ao terrnlno do programs seguinte?

long int x; int Y,z;


Z

x = Z * Y + Z && 1; y = (int) x;

= =

100; 10:

Operadores

8)

Qual
long int
X y Z

e
int
y,Zi

valor armazenado
Xi

nas varlavels

"y" e "z" no programa seguinte?

= = =

Ox1234i
Xi X»8i

~ 'I As declaracoe
de uma linguagerrl ,I conjunto de coman

Podemos Clas) • Declaracd ~adas co~

unguagern
mando if

Declara<;:g execucao]

dicao for] cao: for, ~


J

Alern destas] ~ declaracao goto.]


'I

7.1.
analisar

comanj
em maio:

o comando i
De rnaneira ] executar um con condlcao ser av" executar outro c liada como talsa. A forma ger~'
:1

~1

if

(condi£;il.~
1

"

Microcontroladores PIC· Programagao em C

:r

l
"

'ograrna seguinte?

7 Declaracoes de Controle

As declaracoes ou comandos de controle sao uma parte muito importante de uma linguagem de prograrnacao, e a linguagem C dlspoe de um excelente conjunto de comandos. Podemos classificar as declaracoes de controle em duas categories baslcas: • Declaracoes de teste condicional: sao utilizadas para testar determinadas condlcoes / varlavels e executar um c6digo para cad a caso. A linguagem C dlspoe de do is tipos de declaracoes condicionais: 0 comando if e 0 comando switch; pectaracoes de estrutura de repeticao: sao utilizadas para provocar a execucao de um bloco de comandos enquanto uma determinada condicao for verdadeira. Em C dispomos de tres declaracoes de repeticao: for, while e do-while.

Alem destas declaracoes de controle, a linguagem C apresenta ainda a declaracao goto, utilizada para provocar 0 desvio incondicional do programa.

7.1. Comando If o comando if ja foi visto anteriormente neste livro, portanto agora vamos analisar em maior profundidade 0 seu funcionamento.
De maneira geral, 0 comando if (ou "se" em portugues) utilizado para exeeutar um comando ou bloeo de comandos no caso de uma determinada condlcao ser avaliada como verdadeira. Opcionalmente, tarnbern possivel executar outro comando ou bloco de comandos no caso da condlcao ser avaliada como falsa.

A forma geral do comando if e:


if (condi9~o) cornandoA; { else cornandoB;)

Declara~oesde Contrale

Nesta forma ele pode ser um eomando ou declaracao qualquer da linguagem C, ou um bloeo de eomandos na seguinte forma:
if (condi.cao)
{

Veja que a col Se a condicao fo~. atribuicao "y = x" caso "x" seja lgua]

eomandoAl: eomandoA2: else eomandoBl: eomandoB2:

/1

bloeD de eomandos

para a eondi<;:l!o erdadeira v

possivel ai~ do outro. Veja a fdi


II

"
"

// bloeo de eomandos

para a eondi<;:~o falso

if (eOndi<;:il.O else if (eoj els~

ij

Observe que, em ambos os easo, a clausula else obrigat6ria para 0 funeionamento do comando.

e opeional,

nao sendo

princlpio de funeionamento do comando muito simples: se a condicao for verdadeira, sera exeeutado apenas 0 eomandoA (ou 0 bloeo de eomandos A). Caso a condlcao seja avaliada como falsa, entao sera executado apenas 0 comandols (ou 0 bloeo de eomandos 8). Um detalhe muito lmportante a ser observado e que nunea, no mesmo teste, os do is comandos ou bloeos de eomando serao executados, apenas um ou outro. Exemplo 7.1
char letra; int x: letra '" 'A'; if (letra"'='A') x=O: /1 caso a variavel if (letra=='B') x=5: /1 caso a variavel letra seja igual letra seja igual 'A', entao x=O; 'B', entao x=5;

Neste caso'l verdadeira, sera e~ g1302", caso seja sera avaliada a "d mandoC".[
:1
)-1

!i

No exemplo ~ trolador e em seg sucessivamente 0)1 igual ao da variav~ fara setar um dete,J
J

Exemplo
II

7.3

:1

II

Este exemp~ #include <16f~ #use delay(c19


#fuses HS,NOWD II !

int x; main()

vaLi

Urn aspeeto muito importante da linguagem C e que muitas vezes provoea eonfus5es ao prograrnador iniciante que a condtcao a ser testada nao preclsa· necessariamente envolver operadores relaeionais ou toglcos, De fato, somente e necessarlo que a expressao possa ser avaliada como verdadeira ou falsa. Assim, posslveI eserever 0 seguinte programs em C:

: setup_ad· ~hile

(1

x =~

out'
if

Exemplo 7.2
int x,y;
x if

5;

(x)

y = XI

Microcontroladores PIC· Programaqao em C

qualquer da lingua-

Veja que a condlcao a ser testada e simplesmente 0 valor da varlavel "x". Se a condicao for verdadeira, ou seja, se "x" for diferente de zero, entso a atrtbulcao lOy = x" sera exeeutada. Caso "x" seja avaliada como falsa, ou seja, easo "x" seja lgual a zero, entao a atrlbuleao nao sera executada.

"erdadeira

E posstvel ainda eneadear, ou aninhar, diversos eomandos if um dentro do outro. Veja a forma geral em seguida:
if (condi~aol) comandoA; else if (condi~ao2) comandoB; else if (condi9ao3) comandoC;

also

peional, nao sendo pies: se a condlcao oloco de eomandos xecutaoo apenas 0 o importante a ser )S ou bloeos de eo-

Neste easo, sera primeiramente avaliada a expressao "condlcacf,", se verdadeira, sera exeeutado 0 "comandoA", easo falsa, sera avaliada a "eondiQa02", easo seja verdadeira, sera exeeutado 0 "eomandoB", easo seja falsa, sera avaJiada a "eondica03" e se esta for verdadeira, sera exeeutado 0 "eomandoC". No exemplo seguinte, 0 programs faz uma leitura da porta A do mieroeontrolador e em segulda, utilizando uma estrutura de declaracao if/else, testa sueessivamente 0 valor da varlavel "x" (Jida da porta A), ate eneontrar um valor lgual ao da varlavel, executando 0 eomando output_high correspondente que fara setar um determinado pine da porta B do mierocontrolador. Exemplo 7.3
II Este exemplo utiliza 0 circuito da figura 1.3 #include <16f877.h> #use delay(clock=4000000) #fuses HS,NOWDT,PUT,NOBROWWOUT, NOLVP

'A',
'B',

encao x=O] ent.ao x=5;

int X; main ()

II

variavel

global

iltas vezes provoea " testada nao preclgicos. De fato, soomo verdadeira ou

setup_adc_ports while (true)


{

(no_analogs);

x = input_a (); output_port_b(O); if (Ix) output_high(pin_bO); else if (x=l) output_high(pin_bl); else if (x=2) output_high(pin_b2); else if (x=3) output_high(pin_b3); else ouput_high(pin_b4);

Suponha que apenas 0 pine RAl esteja em nlvel logtco 1 e os outros pinos da porta A estejam em nfvel 16gieo O.
Declara~5es de Contrale

A execucao deste programa tara com que seja atribufdo 0 valor decimal 2 (lido da porta A) a vartavel "x", Em seguida, 0 prlrnelro comando if verifica se 0 valor da exoressao (!x) e verdadeiro. Como "x" e igual a 2, entao a expressao sera avaliada como falsa e a proxima declaracao if sera avaliada. Novamente, o resultado da avattacao sera falso, ja que "x" e diferente de 1, fazendo com que a proxima declaracao if seja analisada. Agora, como "x" lgual a 2, a avallacao da expressao sera verdadeira e 0 comando output_high(pin_b2) sera executado, fazendo com que () pine RB2 seja setado. Os outros pinos da porta B permanecerao em nlvel O. Observe que 0 proximo if nao avaliado.

A explicacao p mandos apos um~ sim, deve haver u~ feito pela ctausula]

Uma alternatlv Exemplo 7.4

7.2. Comando Switch


Em alguns casos, como na cornparacao de uma determinada varlavel a diversos valores diferentes, 0 comando if pode tornar-se um pouco confuso ou pouco eficiente. A declaracao switch permite a reallzacao de cornparacoes sucessivas como a anterior, de uma forma muito mais elegante, clara e eficiente. Vejamos entao 0 formato geral da declaracao switch:
switch
{

I // Este exemplJ #include <16fSj !tuse delay (cIa, # fuses HS, NOWD~ main()
{

I setup~adq, while(trD
{

outpj swid

(variavel)

case constantel: cornandoA; break; case constante2: cornandoB; break; default: comandoZ;

Observe que 0 valor da variavel e testado contra as constantes especificadas pela clausula case. Caso a variavel e a constante possuam 0 mesmo valor, entao os comandos seguintes aquela clausula case serao executados. Caso 0 valor da varlavel nao encontre correspondentes nas constantes especificadas pelas case, entao os comandos especificados pela clausula default sao executados. Repare que cada sequencia de comandos da clausula case encerrada por uma clausula break. Caso esta clausula seja omitida, entao todos os comandos subsequentes ao case especificado serao executados, ate que seja encontrada uma outra clausula break, ou seja, atlngldo 0 final do bloco switch. '
Microcontroladores PIC - Programa98o em C

~ No programa ~ ra da porta A do mj Caso 0 valor correl :i sera executada, Ca tada a clausula de~
1

Algumas cara~ • •

A declaraCl, tidos outrql SO,men:e q, seja, num~ caractere;!


:]

Nao per~ constantes

~j ,