326/03
li
i
"
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.
a c6pia
llegal,
Seu Cadastro
e Muito
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
\.
~i_iWil_jlllll._ .
Desenhos:
!I
;1
q
Revisao e Co] jr
'"
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
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
___ -----
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
• • • •
a In~
::1
Software: • • •
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
Microcontroladores IC • Programa~ao C P em
I.
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
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
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),
a minha
avo.
Tu me ensinaras 0 caminho da vida; em tua presence he plenitude de alegria, tua direita delicias etemas.
SI16,11
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
e material
Ao pessoal
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.
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
indice
Analitl
1
1.5. Requisites]
Arquivos.EXE
48 KB
capj~~~
~,~:
I
I
Procedimento
Acesse 0 site da Editora Erica Ltda.: www.editoraerica.com.br. rencla do arqulvo disponlvel pode ser feita de duas formas:
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.
.
--~~~--------~------~,
L
:: "'co,
1
(
---~-~--~~.~.--.
~ ..~-
-- ---
-----~" -
-~- ~~-~
..
r"""-
SENAilOR/AM
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
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
) 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
8.6. 8.7.
Streams Exerckid
Capitulo 9 - FunC;:1
9.7. 9.8.
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
--~~~---------------------....
......................... 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
.
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
Assim, em 1 00l100001000j do MOVLW Ox8Ci Sem duvida: mais simples doj zacao do Assem~
]
[ndlee Remissivo
Referencias Bibliogrilficas
~
'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
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) .
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.
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.
Ate 0 desenv
Pr6s:
•
•
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:
C.
• •
ALGOL; BCPL (Basic Combined Programming Language: llnguagern de programacae basica combinada) - derivada da linguagem CPL (que, por sua
Microcontroladores PIC - Proqrarnacao em C
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
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
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:
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,
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~
!
1.4. Conve
Antes de ini ao leitor as cony cos.
Os termos ~
~-----I
t
I
i' ~
T
filosofia de proem moculos ou mtes entre si e
que
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
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.
e necessarlo
esclarecer
..1
Os operandos, termos ou parametres opclonals de uma declaracao estarao sempre grafados em italico.
C1_
v+ v-
2 6
~t
GND'
c;+
C TX RX
2 _
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
~
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:
..
~
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>') .....
~+
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.
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
el
1.2)
Exposh;2 mente
0/
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
acao entao
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.
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
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.
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
/
<">
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
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
I
i
I·
'I
e
IU
Infcio
.crever a realizaContagem
=0
) para descrever
Soma 1
a contagem
Nao
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.
operador relacional E utilizado para conectar duas ou mais proposlcoes, resultando na chamada CONJUNCAO.A conjuncao de duas au mais pro-
Princfpiose Programagao d
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.
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.
t
1
'1
i
.1
;.:.;.;.,_.___
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.
~ 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
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.
•
• •
"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.
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
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)
III. R
a) b)
((1
)
,I
:1 ··1
'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.
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)
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»
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
b) "Linguagem C"
PCM: ~ d
p.
f) g)
-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
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
,
I I I
:
,
I
I
:
1 ~ ----~ ..
1._-
------
---
~-------
-- __ 1
..1
j
: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
~~~~: .. ~~ I
::::::::: J .........
"."
"
"j
,
;l, ,1
......... ~ ......... ,
Microconlroladores PIC - Programalfao em C
1,4,bit
iJ!~i\~~'iimmm~;:r~".:;~jft.~limmm'ljlimlli"ji
I I
::
I I
::
I
,----------
:
I
.---------------
-------------------
1tO
(IDE)
"--------------------------------------------------------------------------------------------------------------
- -- - -- -- - --- --- - - --- - - - --- -- --- -- --- -- -- - --- -- - --- - 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
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
pcw
C Compiler,
Version
3.104,
14768
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'
device
Compiladores CCS S
void
(
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
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:
Vejamos ~
I
002B 0004
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
a pelo program a
1 100 0 2 Total
% 27 66
RAM 4 2
16 39
Segment
---------
Used 4
55
0 0 0
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
" .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:
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.
EDITOH zado ni
SYNTA!, as carr
J
AUTO
• • • • • •
seleciona
I
i
I
selecao de tex-
EDITOI lingua~
(CTRL+SHIFT+nOmero): desloca .
GOTO BOOKMARK (SHIFT +numero): cais previamente marcados; NEXT WINDOW compiJador; (CTRL+N): apresenta
10-
a proxima ajanela
janela
de edi<;ao do anterior.
de edlcao
.il
Ir- Copy
~Pa't. ~ Select All fU.
r;: Past.
HNo>t
.,,
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
::~ 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 .. ,
• •
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'
•
•
•
-----
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:
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).
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.
A seguir, "Ii
j
As quatro
1
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.
A segulr, temos
•.
® Data Sheet
"(" Valid Fuses
kb Statistics --_._
__ ...._ .......
~P Va~d Interrupts
ii1 Binary
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
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
Device Editor
~%~umerIc N
II!
Fie Compare
Converter
M Di:;;assembler
"#' Extract
.t
Internet
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;
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: ,
• •
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
I' ,
:1
.,
i.li
;1
1
'.~.:I ~, ·
\~
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;
Finalmente, a ultima opcao do menu principal do programa, HELP, contern ode praxe: auxflio (em Ingles) ao programador.
utilizar os compiladores
necessarlos
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
(
qi
3.17 e SE
nd
com a arvore ( .
entao
Caso nad
Figura 3.17
:::
i'l
Figura 3.18
,:'
•·..1'
.( ',11
Em seguida, clique na opcao LANGUAGE SUITE e selecione CCS (figura 3.16). Surgem mensagens de alerta (normalmente apenas OK.
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~
Exemplo 4.1 :,
II
Pr Lme i r
. .I
while
(I
Vejamos A primeiraj
I! primeirj
.?
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
{
II II II II
atribui 0 valor 100 seta 0 pino RBO aguarda lOOms resseta 0 pino RBO /1 aguarda lOOms
variavel
tempo
Vejamos
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
,;:
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
*/
main()
e urna
diretiva do compilador. Neste caso esta deque anexe ao programs 0 arqulvo especificado:
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.
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
,:
..... -
1
.
T
sntarlo:
,!
II
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.
.
: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
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
Inlrodu~ao a Linguagem C
~I;• . if
.I.:.',!·.
rl
Operadores: Operadores sao elementos utilizados para comandar lnteracoes entre vartavels e dados em C.
Muitos dizem que urn dos elementos que mais se destacam na lin-
o
E
claro que nao podemos escrever um program a realmente util sem utilizar varlavels para 0 armazenamento de dados.
_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
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-
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).
o bloco
e aquele
~
ii
II·
-----.-
_._-
.~
....
. ...I
r
'I
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-
ate que
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
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.
euma
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
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);
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.
-------------
-.... ~.~~-----
---
----~~----
;-,
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.
sizeof union
4.2. Identificadores
Identificadores sao nomes dados pelo programador a varlavels, tuncoes e outros elementos da linguagem
c.
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
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 "\".
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.
Com~
while
(concl
•
• • • •
ou
caractere sublinhado
-,
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
o tormatol
printf ( a,
4.3.1.
tipo:
Comando If
comando if (em portugues "se")
o
if
(condt.cao)
comando;
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
comando
Esta condlcao 13novamente qualquer expressao que possa ser avaHada como verdadeira ou falsa, ou seja, uma proposlcao booleana.
o comando
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.
o formato
printf
( 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
..
,-~
.
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 runcao printf e os seus c6digos de formatacao serao melhor estudados no capftulo 11. .
Vejamos o~
0
e felto
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
,
te
riavel
var_teste
5
Varlavels e Tipos de Dados
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
Tamanho em Bits 8 8 32
Intervalo
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
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
5.2.0utr'
I'
•
• • bool~ int1);~
1,1
int8:fil
li]
i,l".
~
~
---.-.--
..-.--.-- ..--~~-------
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.
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
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.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
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
!
I
.:
Microcontroladores PIC - Programac;ao em C
'f<
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
variaveis}; 0
u1
255
~127
255 255
valor da variavel{,
Vejamos entao como declarar uma varlavel chamada "tempo" do tipo inteiro de 8 bits sem sinal:
unsigned int tempo;
1127
~55
ou:
int tempo;
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-
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;
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:
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
variavel
A diretiva ' formar ao corn cutado 0 progrl' A diretiva! ara comunics P j rs232. 1
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++)
{
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
rambem'
muitas vezes
void
t 'Ol
:i'
_--_._._-_._----_ ..-_.-._-_._._----_._--._.
__ _
..
...
__ --._._---
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:
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)
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
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.
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
,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:
;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
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,
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
tes:
= = = =
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.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.
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
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
cd
Avanco de forrnularlo
Retorno de carro (Return) Aspas Ap6strofo Barra invertida "\" Tabela 5.3
5.6. Expr:
Express6;1 e operadores]
regras gerais ]
Vejamos
Microcontroladores PIC - Programagao em C
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-
5.7. Cony.
a (1)
x = 10;
10 = 10.
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
!
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 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:
99700
00000000
00000001
10000101
01110100
condicionais,
con-
No proximo toplco veremos as regras que regem a conversao de tipos nas expressoes em C.
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-
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
short int char, int, long int au int32 char ou int long int ou int32
e utilizado;
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
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
:1
Exemplo 5.7;1
:1
·i
float
short int
float
char ou int
float
long int
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
(novo_ell
Em que; C) no qual a!
do
casting u:
De fatoi
'r
I
I
!
'I
1,--------,1
':!
x z y
5 do resultado da a variavel: os
= = =
5; 1000; x + z; II
resultado
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
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
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
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
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
,
)
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
;1
o segundj
Ii
Ii
II
resultado
em x sera 1000
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=
11; 2/
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
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
x
z
1/ 0 resultado
2;
10 + ((float) y I x ); da expressao acima sera igual a 12,5
.10:
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,
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
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
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
II
prot6tipo
da fun9ao
Em que:
conta++) printf("%d ", calcula());
G'I
5.11. Rede~
A unguagem] finir novas nome1
I
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
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,
~i
::1
8)
Qual
resulted,
int x,y:
x = 5; y = (x==5)
* 2;J
,!
9) Indique
resul
.1 .1
do tipo fracao
(float)
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
I'
I'
6) 7)
escopo (global/local)
8)
Qual
int
X,Yi
x :: 5;
y :: (x==5)
2;
9)
Indique
(float)
ees?
e atribulda
c?
Anota(:oes
'I
!i
:1
'I
I.~
6.1. Atribui~
,I
x = 10; y = X;
e '.
4
!I
;1
A: .f
.J ·-1 ~
-----1
SMA
IORiAM
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
+
A9ao Adig80 subtracao ou menos unario Multlplicacao Divisao Resto de dlvisao lnteira Incremento Decremento
++
Xi
*
/
% ++
a
<
-_
Tabela 6.1 Os operadores de adlcao, subtracao, multlpllcacao comentarlos, operador % utilizado para retornar inteira. Vejamos um exemplo: e diVisao dispensam
,i
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
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;
:1
:I
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
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
"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
<
<=
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
............. __ ._._,
~~===
Repare que os operadores relaclonals podem ser uttllzados expressoes condicionais como ja visto no capitulo anterior.
para construlr
"
6.5. Logic'
Os ope cas entre el loglcos simpl mesma magn
,I
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:
: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).
,j
;j
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
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.
Acrio AND (E) OR (OU) XOR (OU exclusivo) NOT (complemento de urn) Deslocamento Deslocamento
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
0 11 0 0 1 0 0 0 0 0 0 1 1 11 00000 100
AND (&)
= =
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:
6.5.4. Operad~,
v2 '"vl
Ox04;
Esta operacao OR sera reallzada da seguinte forma: 20 hexadecimal = 04 hexadecimal Resultado 0 0 10 0 0 0 0 00000100 00100100
OR (I)
;.j
;1
,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)
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
"
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:
a dlrelta, valor » nt
n
•
Microconfroladores PIC - Programayao em C
valor «
XOR (A)
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
= = =
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
»
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
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
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".
a=
&~,
OJ
A proxima linha atribui varlavel "z" reita. Vejamos 0 seu funcionamento: 10 declmal »
a di-
:j
00001010 »
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
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:
Operador
&
Tabela6.5
endereco de memoria
di-
contera
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".
x = 5;
. Operadores
1
endereco = &x; Y '" *endereco; printf("valor x= %d - endereco
int x,y; x = 5; Y = x==7
10::1
t
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.
:1
,1
~I
II
porta int
po~ i
(\!
{
desliga_l~; porta
= pori
main I )
Ci :)
while
'j
jl
I
,I
:-1
iii
tj 111
:1
tamanho da varlavel
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
Expressaol?
Expressao2:
Expressao3
6.7.2.
operadl:.. _
o que slgnlttca:
avalie a expressao 1 e se ela for verdadeira, atribua va2; casa contrarto, atribua a expressao 3. Vejamas um
e:
.................
d", x ,endereco,y) ;
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).
Note que tambem e possfvel utilizar convencional, como neste outre exernplo:
Exemplo 6.2
#byte porta = 5 #byte portb = 6 int liga_led(void)
{
porta
= =
porta
1; II ativa
pino 0 da porta A
int desliga_led(void)
{
porta main()
(
pino
da porta
while
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
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.
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=
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
(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.
I
,
6.7.4.
Operador .>
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
sel
Onde "tipo" especifrca 0 novo tlpo de dado para da variavel especificada sera convertido.
qual
conteudo atual
'I
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.
almente, terminan-
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
Forma expandida
x +=y X-= y
o conteudo atual
x *=y
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
6.10. ExerCf
1) 2) 3) 4) 5)
->
.i
.,
I
i;
:1
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
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
]
x=z*Y+
ZI x; ,
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 :::::=?
Como Qual
a expressao (x
= (10+5)
< 20)?
e 0 valor
6)
Qual
e 0 resultado
0
7)
Qual e
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
= = =
Ox1234i
Xi X»8i
~ 'I As declaracoe
de uma linguagerrl ,I conjunto de coman
unguagern
mando if
Declara<;:g execucao]
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
"
: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.
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]
/1
bloeD de eomandos
"
"
// bloeo de eomandos
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
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
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',
int X; main ()
II
variavel
global
iltas vezes provoea " testada nao preclgicos. De fato, soomo verdadeira ou
(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]
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~ • •
~j ,