Você está na página 1de 346
FABIO PEREIRA | | PROGRAMAGCAO EM | Baseado nos compiladores CCS er et ards ee es oJ Piet Msr i itetce ee rte] comunicagao assincrona, SPI, 12C, ee eee ety al (eiteeheaele Dee cetemeniecata! (apade 12 esrqunos be “| | ft t i ‘| Fabio Pereira ® ra] tc co] a | Q iS F (2) 0 ie] i a 2 Ano: 2005 PROGRAMAGAO EM 2004 2003 Editor: 9 87654322 Editora Erica Ltda. ‘Conselho Editorial: Diretor Editorial: Diretor Comercial: Diretor de Publicidade: Capa Editoragéo: Revisao Interna: Rewvisio Gramatical: Desenhos: Revisdo ¢ Coordenagao: Microconi adores PIG Antonio Marco Vicari Clpelll Paulo Roberto Alves Waldir Jogo Sandrini Mauricio 5. de Franga Rosana Ap. Alves dos Santos Erica Regina A. Pagano Marlene Teresa Santin Aives Pedra Paulo V. Herruzo Flavia Eugénio de Lima Rosana Arruda da Silva + Programagia om ~ s de Catalogagaio na Publicagaio (CIP) lgira do Livro, SP, Brasil) : (Linguagem de pragramagiia para camputadores} 2, Micracontro!aceros cpp-005,133 Indices para Gatiloga Sistemitica: nguagem da pragramacao: AplicagSes com mictocontrolscors PIC: ‘Computadoras: Processamento de dados 005.133 Totios 03 direitos reservados. Froibida @ reprodugao totel ou parcial, por qusiquer meio ou proce Se, especialmente por sistemes griificos, microfilmicos, fotogréficos, reprograficos, fonogré‘lcas, wicaogtatices, intemet, ebooks, Vedsds 8 memorizngo o/ou recuperaggo total ou parcial em qualquer sistema de processaménto de dados o a inclusiio do qualquer carte da obra am qualquer Programs juscibeméves, Eases preibipdes aplicam-se também as caractortaticas grificas da obra: S.A pus eforople. A Matec cs aes aeralk 8 buried coune cteen Lar 44 o berbaafor do Coaigo Penal, cf. Lei n" 6.895, de 17. 12.60) som pana ce crnda o mus, corduaments com busca € apreensio © Indenizapses vivers jas {artigos 102, 109 pardgrafo Gnico, 104, 105, 106 ¢ 107 ena 1, 2 € 3 da Lei n* 9,610, de 19/06/98, Lei dos Dirsitos Autoreis). © Autor © 2 Editors ecrecitam que toces as informapies agul sprasentadas estBio covretas e sadam sar utilizades para qualquer tin legal. Entretento, ne existe quulquer garontia, explicit cu implieita, do quo © uso de tais infarmarBes eancuses sempre 86 resultado dese) names. da sites ¢ empresas, porventura mencionados, forem utiizades spenes para ilustrar os axempios, nc tendo vincula nanhum com o livro, she garantinds 8 sua existéncie nem divulga- 980, Evortuais ematas estardo disponivals no site da Exitora Eriea pare download. “Agumas imagens utilizadas naste livro foram obtidas a pamir do CorelDRAW 7, 8 e 9 e da Goippao da MastorClips/ MastarPhowosi oa IMS!, 1585 Frenciseo Biw. East, San Rafoo,, CA 949015506, USA.” Editora Erica Ltda. Rua Sio Gil, 159 - Tatu CEP: 03401.030 - S80 Pauilo - SP Fane: (11) 295-3066 - Fax: (11) 6197-4060 Site: www.editoraetica.com.br @ Micsaporteniadores PIC = Programagia om C -Requisitos de Hardware e de Hardware: Software: Microcomputador Pentium 200 MHz ou superior; 16 MB de meméria RAM; 50 Mbytes livres de HD; Acesso a Internet. Sistema operacional Windows 95 ou superior; Compilador CCS, PCWH, PCM, PCH ou PCW; Ambiente MPLAB; IC-PROG ou um software de programagao. Prefacio Existem diversas literaturas sobre a linguagem C disponiveis no mercado, mas quando procuramos um llvro que seja voltado para as aplicagies com microcontroladores, este universo reduz-se drasticamente, Foi para atender 2 esta lacuna que surgiu este livro, fruto de um extenso trabalho de pesquisa ¢ com uma abordagem simples e didética. Partinda dos principios gerals de programagao, até os detalhes mais pro- fundos € comolexos da linguagem C, sempre enfatizando os micracontrolado- res PIC, utilizando diversos exemplos ¢ exercicios. Sao também apresentadas as diretivas e fungdes internas dos compilado- res CCS, 05 mapas de meméria dos PICs utilizados no livre (1L2F675, 16F628, 16F876, 167877, 18F252 ¢ 18F452) ¢ os conjuntos de instrugdes assembly de 14 e 16 bits. Além disso, foi dedicado um capitulo do livro ao estudo de técnicas de programag’o, abrangendo otimizago de cédigo, interrupgaes, interfaceamento. (teclados © displays LCD), comunicagao serial (assincrona, SPI, FC, 1-Wire, além de uma visdo geral sobre CAN, LIN, etc.), geracdo de PWM, medi¢do de temperatura com o chip Dallas 18520, converséo analdgico/digital, dente outros. Trata-se de uma obra indispensdvel a todos aqueles que desejam tanto conhecer a linguagem C em maior profundidade, quanto a sua aplicagaio aos microcontroladores e pequenos sistemas em geral __ Micrncontreladores PIC - Programagfic ers C Sobre o Material Disponivel na Internet O material disponivel na Intemet contém os arquivos de exemplo e biblio- tecas apresentados no capttulo 12 e arquives de cabecalho com as definigdes de registradores utilizadas nos programas. Para utilizé-los, 6 necessario possuir instalados em sua maquina o compl lador PCWH (para utilizar os PICs das séries 12,16 e 18), 0 PCW (para utilizar 0s PICs das séries 12 e 16), ou ainda os compiladores PCM ou PCH, além do @mbiente MPLAB (para realizagiio de simulagées) e um software de programa. Gao (no caso do autor, o IC-PROG). Arquivos.EXE | 48 KB Procedimento para Download Acesse 0 site da Editora Erica Ltda.: wiw.editoraerica.com.br. A transfe- réncia do arquivo disponivel pode ser feita de duas formas: 1. Por meio do médulo pesquisa. Localize o livo desejado, digitanda palavreas-chaves (nome do livra qu do autor). Apareceréo os dados da livro € © arquivo para download, entdo dé um clique sobre o arquive executavel que serd transferido, 2. Por meio do botdo "Download". Na pagina principal da site, clique no item “Download”, Sera exibido um campo, no qual devem ser digita- das palavras-chaves (nome. do livro ou do auter), Serao exibides o nome do livro € 0 arquiva para download. D4 um clique sobre o arquivo executével que sera transfendo, Procedimento para Descompactacao Primeiro passo: apés ter transferide o-erquivo, verifique o diretério em que Se eneontra & dé um duplo-clique sobre © arquive. Sera sxibida uma tela do programa WINZIP SELF-EXTRACTOR que conduzira voo$ eo processo de des- compactago. Abalxa do Unzip To Folder, exist Um Campo que indica o desti- no do arquivo que sera coplado para o disco rigio Go seu computador. C:\Microcontroladores PIC Segundo passo: prossiga com a instalagao, elicando no botdo Unzip, o qual se encarrega de descompactar os arquives. Lego abaixo dessa tela, apa- rece a barra de status a qual monitora o process9 pera que vocé acompanhe. Apés o término, outra tela de informagdo surgiré, indicando que o arquivo foi descompactado com sucesso € esta no diretGrio criado. Para sair dessa tela, ‘clique no batéo OK. Para finalizar o programa WINZIP SELF-EXTRACTOR, clique fe botao Close. eo Microcenirolacorts PIG - Progranmaréo am C indice Analitico ‘Capitulo 2 - Introdugao. 1.4, Um Pouco de Historia. 1L2, Programago de PICs em 1.3. Mensagem aos Programa 1.4. Convengdes Deste Livro ... 15. Requisitos de Hardware e Sofware Capitulo 2 - Principios de Programagao: 2.1, Fluxogramas ... 2.2, Algebra Boolean: 2.3, Varigveis ¢ Dados . 2.4, Operadores: 2.5, Exercicios... Capitulo 3 + Compliador CCS C..... 3.1. Ambiente Integrada de Desenvolvimento (IDE). 3.2, Integragao com 0 MPLAB Capitulo 4 - Introdugia 4 Linguagem C.... 41, Polavras Reservadas da Linguagem. 4.2, Identificadores... 4.3, Comantios e Funpaes importantes 4.3.1. Comande It. 43,2. Gomando While. 4.3.4. Fungao Printf 4,3,4, Fungao GETC .. Capitulo § - Varlavels © Tipos de Dados... 5.1. Modificadores de Tipo §.2. Outres Tipas Especificas do Compilador CCS C... 5.3. Declaragae ce Varidwels .. 5.3.1. variavels Locais 5.4. Constantes. 5.4.1. COcigos tea 66 5.4.2. Constantes Binarias, Hexe: i 6? 5.5. Operadores ; 67 5.6, Expressées. 67 5.7. Conversao de Tipos.. 5.8, Modificadores de Acesso 5.9. Modificadores de Armazenamento.... 5.10, Alocagao de Memérla. 5.11. Redefinindo Tipes de 5.12. Exercicios... rcrocoriraladores PIC - Pregrarnagiio em C oO Capitulo 6 - Operadores 8.4. AtribuigSo. 6.2. Aritméticos. 6.3, Relacionais 6.5.2. Operadar | (OR), 6.5.3. Operador * (XOR}, 6.5.4. Operador ~ (NOT 6.5.5, Operaderes de Deslocamenta << E >> 6.6. Meméria ... 6.6.1. Operador &..., 6.6.2. Operador * 6.7, Outros Operacoras. 6.7.4, Operacior? ... 6.7.2. Operador Virgula 6.7.3. Operador Ponto .. 6.7.4, Operadar > Bia et ative 6.7.5. Operador de Medelagem do Tipo. oO 6.7.6, Operador Sizaof.. 6.8. Associagdo de Operadores... 6.9. Precedéncia dos Operadore: 6.10. Exercicias., Capitulo 7 - Declaragies de Controle. 7.4, Comande If... 7,2, Comande Switch, 7.2.1, Clausula Break 7,3, Estruturas de Repetigao. 7.3.4, Lago For... 7.3.2, Lago While 7.3.3, Lago De-While 7.4. Camando Goto .. 7.5, Exereicios.... Capitulo 8 - Tipos ¢ Dados Avangades .. 8.1. Ponteiros 8.1.1. Operagdes com Ponteiros.. 8.1.2. Topices Importantes Sobre ‘8.2. Matrizes de Dados. 8.2.1. Matrizes Multidimension: 8.2.2. Strings de Caracteres. 8.2.3, Matrires ¢ Ponteiros 8.3. Estruturas de Dados..... 8.3.1, Operagdes com Estruturas: e Microoonioladores PIC ~ Pregramagiioen 6 5.3.2. Ponteiros para Estruturas 8.5, Enumeracdes. 8.6, Streams .. 8.7, Exercicios... Capitulo 9 - Fungies 9.1. Forma Geral.., 9.2. Regras da Escapa 9.3, Passagem de Paramevos. 9.4. Matrizes com Argumentos de uma Fungo 9.5, Estruturas come Argumentos ce uma Fungi 9.6, Fungdes com Nimero de Pardmetros Variavel 9.7. Retomo de Valores ... 9.8. Retorno ce Valores am FungSes Assemb! 9.9. Protétipos de Fungae. 9,10. Recursividade .. 8.11. Exercicios.... ‘Capitulo 10 - Diretivas do Compllador ‘Capitulo 14 - Fungées do Compliador... 11.1. Matematicas ... 11.2. Maniputagdo de Carecteres , 11.3. Meméria. LL.4, Atraso, 11.5. Manipulaggo. 11.6, Entrada / Saida, 11.7. Analogicas, 11.8. Manipulagao de Timers .. 11.9. Comperagio / Captura / PWM. 11.10. Manipulagéo da EEPROM Intema 11.11. Controle co Pracessador . 11.22, Porta Paralela Escrava.. 11.13. Comunicagao Serial Assincrona.. 11.14, Comunicagio FC 11.15. Comunicagao SPI... Capitulo 12 - Tépicas Avangaddos... 42.1. Escrevendo Codigo Eficiente em C. (12.1.1. Utilizagdo de Varidveis Booleanas E kg Testes Condicionals .. nde Assembly no Cadigo C. _ Microcenivoladores FIC - Propramagio em C 12.2, Entrada ¢ Saida em C 12.2.1. Modo Padrao 12.2.2. Modo Fixe 42.2.3. Modo Rapido. 12.2.4. Outra Modalidade de Acesso .. 12.3. interrupgdes em C 12.3.4. Tratamento “Automstico” 12.3.2. Tratamente "Manual " 12.2.3. Priorizagao de Interrupges...... 12.4. Utlizando os Timers Internos,, 12.4.1, TimerO 12.4.2. Timer 1 12.4.3, Obtence Mals Pracisie das Timers 12.5. Comunicanco-se com o FIC... 12.5.1. Comunicagao Serial Assincrona .. 12.5.2. Protocolo SFI. a 5.3, Protocolo (°C .. . Protocolo LAVIRE: Ee 5.5. LIN. 12.5.6, Protecole CAN ... 12.5.7. Interfaces Elétricas.., 12.6. Leitura de Teclas e de Teciados, 12.7. Apresentagao. em Display... 12.7.1. Displays LED de Sete Segmentos .. 22.7.2. MEGUIG LEDs sesrissersesnsenensen 12.8, Leitura de Tensdes Analégicas. com o PIC 42.8.1. Conversor A/D Intemo... 12.8.2. Conversor A/D Delta - Sigma 12.9. Médulo PWM. Apéndice A+ Tabela ASCII. Apandice B - Fungdes C - Referéncia Rapida... Apéndice C - Instrugées Pi Apéndice D- Mapas de Memiria........... Apéndice E- Respostas dos Exerciclos.. indice Remissivo Reteréncias Bibliograficas.......... oe Microcantiolacioras PIC - Programagiio om © Introducao A criagao de programas para microcontroladores e microprocessadores pode ser uma tarefa desgastante & medida que aumenta @ complexidade da aplicagao sendo desenvolvida. Os primeiros dispositivos programavels tinham seus programas escritos com cédigos chamados codigos de m&quina, que consistiam normalmente em digitas binérios que eram Inseridas por meio de um dispositive de entrada de dados (teclado, leitora de cartées, fitas perfuradas ou discos magnéticos) para entéo serem executados pela maquina, Desnecessdrio dizer que a programagao em eddigo de maquina era ex- tremamente complexa, o que Implicava em um elevado custo, além de muito tempo para o desenvolvimento de uma aplicagao. Diante da necessidade crescente de programagao de sistemas, fol natural 9 surgimento de uma nova forma de programagao de sistemas. Esta fol a orl gem da linguagem Assembly, Assembly consiste em uma forma altemativa de representagdo dos cédi- gos de maquina usando mneménicos, ou seja, abreviagdes de termos usunis que descrevem a opera¢do efetuada pelo comanda em cddiga de maquina. A conversio dos mnemdnicos em cédigos bindrios executaveis pela maquina é& feita por um tipo de programa chamado Assembler (montedor), Assim, em vez de escrevermos © comanda em codigo de maquina 0011000010001100, o programador poderia simplesmente utilizar 0 coman- do MOVLW Ox8C para realizar a mesma tarefa. Sem divida nenhuma, a representegso em Assembly da Instrugdo é muito mais simples do que aquela utllizando cédigo de maquina, no entanto a utill- Zagao do Assembly nao resolveu todos os problemas dos programadores. A linguagem Assembly é ce balxo nivel, ou seja, nao possui nenhum co- mando, instrugao ou fungae além daqueles definides no conjunto de instru lnredunio o ¢ gdes do processador utilizado. Isto implica em um trabalho extra do programa- dor para desenvolver rotinas e operacao que no fazem parte do conjunto de instrugGes do processador, produzindo, por conseguinte, programas. muito extensos e complexos com um fluxo muitas vezes dificil de ser seguide. E ai que entram as chamadas linguagens de alto nivel. Elas so criadas para permitir 2 programacao utilizanda comandos de alto nivel e que sdo pes- teriormente traduzidos para a linguagem de babi nivel (assembly ou direta- mente para codigo de maquina) do processacor utilizado. 1.1. Um Pouco de Histéria Como j6 vimos, as linguagens de baixo nivel, surgidas. praticamente junto com 4 éra dos compuledores digitais. possuem diversos aspectos negativos, como 4 complésidade, falta de compatibilidede entre diferentes sistemas, pouca legipilidade. A necessidade de uma abordagem mals concisa e simplificada para co- Mandar computadores surgiu naturalmente com a evoluco e utllizagéa dos computadores cigitais. Essa abordagem simplificada, mais préxima da forma humana de pensamento, 6 chamada de linguagem de alto nivel, A primeira linguagem de alto nivel com real aceitagZio pela comunidade de programadores fol FORTRAN (abreviacdo de FORmula TRANslator, ou tradutor de formulas), uma linguagem voltada para a andlise e resolugo de problemas: mateméaticos criada na metade da década de 50, por pesquisadares da IBM. Em seguida vieram linguagens como COBOL (abreviagao de COmman Business Orlented Language, ou linguagem comum para aplicagdes comer: siais) em 1959, voltada para o desenvolvimento de aplicagdes comerclais, ALGOL (ALGOrithmic Language, ou linguagem algoritmica) em 1960, linguagem: de programacao genérica ¢ poderosa que originou diversas. outras linguagens de alto nivel como PASCAL e C. A linguagem C, por sua vez, fol criada em 1972, por Dennis Ritchie, da Bell Laboratories, e consiste, na realidade, em uma linguagem de nivel inter mediatio entre o Assembly ¢ as linguagens de alto nivel, E ume linguagem de programagao genérica desenvolvida para ser tao efi clente € rapida quanto a linguagem Assembly ¢ to estruturada e légica quanto as linguagens de alto nivel (PASCAL, JAVA, ete.). Suas origens sao atribuidas a wés linguagens de programagdo: * ALGOL; * BCPL {Basic Combined Programming Language: linguagem de progra- macéo basica combinadal - derivada da linguagem CPL (que, por sua oe Mleroccrtoladores PIC Progréenaglin em C vez, foi derivada da ALGOL), fol desenvolvida em 1969, e alla a estny tura da ALGOL a eficiéncia do Assembly, no entanto BCPL era uma lin- guagem demasiado complexa e relativamente limitada, razdo pela qual nado teve éxito; * B: linguagem desenvolvida por Ken Thompson da Gell Laboratories, em 1970, Baseada na linguagem CPL, 8 foi uma tentativa de simplifi- car @ facilitar a linguagem CPL, no entanto também a B nao obteve éxito devide as sérias limitagdes que impunha ao programader, Até o desenvolvimento do C, no existiam linguagens de programagdo de alto nivel adequadas tarefa de criag&o de sistemas operacionais (programas: especiais utilizados para o controle genérico de um computador) ¢ outros softwares de baixo nivel, restando aos desenvolvedores utilizar o Assembly para a execucdo destas tarefas. No entanto, 0 Assembly apresenta pros @ contras em sua utilizagao. Ve- jamos alguns celes: Pros: + Eficiéncia: devido A proximidade com o hardware da maquina, o Assembly é sem divida uma linguagem extremamente eficiente (des- de que o programadior saiba o que esta fazendo !); * Velocidade: devido 4 sua grande eficiéncia, os programas em Assembly sao também muito mais répidas que os criados em outras linguagens. ‘Contras: + Complexidade; o Assembly necessita que o programador. possua um profundo conhecimento do hardware utilizado. Além disso, somente estGo disponiveis os comandos do processador utilizado. Qualquer Operagao mals complexa deve ser traduzida em um conjunto de co- mandos Assembly; + Partabilidade: programas Assembly, que pela sua natureza nfo sdo portavels. Isto significa que para utilizar um programa Assembly de um sistema em outro diferente, o programador deve execular a tradugao completa do programa para o sisterna de destino. Foi principalmente a partir das necessidades de reescrita do sistema ape- racional UNIX (que até entéo era escrito em Assembly) que surgiu a linguagem c. De fato, a implementagao da linguagem 4 tao poderosa que C fol a esco- thida para o desenvolvimente de outros sistemas operacionals além do UNIX, como o WINDOWS @ o LINUX. Ieteodui- © Assim como outras linguagens de alto nivel, C utiliza a filosofia de pro- framacao estruturada, ou seja, os programas sao divididos em médulos ou estruturas (que em C sao chamadas de fungdes) independentes entre si @ com © objetivo de realizar determinada tarefa. Desta forma, a programagiio estruturada permite uma canstrugdo mais simples e clara do software de aplicagao, o que permite a criagdo de progra: mas de maior complexidade (quando comparada a outras linguagens nao es- tnituradas como Assembly ou BASIC). 1.2. Programacado de PICs em C A utilizagdo de C para a programagao de microcontroladores com os PICS parece uma escolha natural @ realmente 4, Atualmente, a malorla dos microcontroladores disponiveis no mercado con- tam com compiladores de linguagem € para o desenvolvimento de software, O uso de C permite 4 construgao de programas e aplicagdes muito mais complexas do que seria viavel utilizando apenas o Assembly. Além disso, o desenvolvimento em C permite uma grande velocidade na criagdo dé novos projetos, devido as facilidades de programacdo oferacidas pela linguagem € também & Sua portabilidade, o que permite adaptar progra- Mas de um sistema para outro com um minime esfarco. ‘Outro aspecto favordvel da utillzagde da linguegem © é a sua éficiéncia. Eficléncla no jargo dos compiladores & a medida do grau de inteligénela com qué o compilador traduz um programa em C para a cédigo de maquina. Quanto menor e mais rapido o cédigo gerado, maior sera a eficléncia da lin- guagem e do compilador, Conforme ja dissemos, C, devido a sua proximidade com o hardware e o Assembiy, € uma linguagem extremamente eficiente, De fato, C é consicerada como a linguagem de alto nivel mals eficiente atualmente disponivel. Repare que 0 aspecto eficiéncla & realmente multe importante quando tra- tamos de microcontroladores cujos recursos $40 1&6 limitados como nos PICs, afinal, quando dispomos Ge apenas 512 palavras de memoria de programa ¢ 25 bytes de RAM (como no PIC12C508 € 16C54), & imprescindivel que se economize memérial Além disso, a utilizagdo de uma linguagem de alto nivel como C permite que 9 programador preocupe-se mais com a programagae da aplicagdo em si, j4 que o compilador assume pare si tarefas como © controle & locallzagao das varlavels, operagdes matematicas e légleas, verificagZo de bancos de memé- fla, etc. } icrocontroladores PIC » Programuciio om 1.3. Mensagem aos Programadores Pascal Alguns dos leltores deste Ivo, assim como © autor, podem Ter expe- Fiéncia de programagao com outras linguagens como BASIC, Pascal, ete. Especificamente em relagao A linguagem Pascal, acreditamos que o aprendizado de C seré feito sem maioras problemas. De fato, Ce Pascal sdo linguagens muito parecidas, sendo as principais diferengas: * Bloco de comandos: em Pascal, um bloco de comandos é delimitado pelas palavras begin ¢ end, em C pelos caracteres { ¢ ]; * 0 operador de atribuigiio em Pascal é o:=, em C é apenas =; * © operador relacional de igualdade em Pascal é 0 =, em C 60 = * Em Pascal, temas as fungdes (function) e procedimentos (procedure), sendo que um procedimento pode ser interpretade como uma fungao Que nao retoma valores. Em C, temos apenas as fungdes, que niio re- cebem identificador especial e podem ou nao retornar resultados; * Pascal é uma linguagem mals conservadora e rigida com uma forte checagem de tipos € variéveis, o que restringe em multos casos a li- berdade do programador. C, ao contrario, 6 uma linguagem altamente liberal, ou seja, permite ao programador realizar praticamente qual- quer coisa, inclusive erros classicos de programagaio; * A quantidade de operadores disponiveis em Pascal é menor que os disponiveis em C: * Pascal é uma linguagem menos eficiente que C, porém & mais sim- ples e de leitura mals agradavel que C. Estas sao apenas algunas das diferengas existentes entre C e Pascal, Oe qualquer forma, o leltor podera, por si mesmo, verificar as semelhangas & diferengas existentes entre a linguagem C e as demais linguagens existentes n@ atualidade. 1.4, Convengoes Deste Livro Antes de Iniciar os estudos sobre o compilador C, & necessdrio esclarecer ac leltor as convengoes adotadas neste livro. Os termos em lingua inglesa serao sempre escritos em caracteres ita 0s. As referéncias a nomes de fungdes e palavras reservadas da linguagem C Serdo sempre grafadas em negrito. Introdgka Os operandos, termos ou parametros opcionais de uma declaracado esta- ro sempre grafados em itélico. 1.5. Requisitos de Hardware e Software Os programas demonstrados neste livro foram testados com a versdo 3.127 do compilador CCS e a verso 5.7 do ambiente integrado MPLAB. Os exemplos didaticos dos capitulos 2 a 9, em sua maioria, foram escri- tos para utilizar o hardware minimo preposto nas figuras 1.4 @ 1.2, io] TN Tour THN Te00T Figura 1.2 E possivel utilizar 0 oscilador intemo Gisponivel nos PICs 16F62x, mes devido ao fate de os mesmos nao Possuirem uma callbracio confidvel, apta- MOS por utilizar um cristal extemo, ja que as rotinas de comunicagSo serial 340 muito afetadas pela imprecisao do clock, °} Micreconiroladeres PIC Programartio ee C Alguns dos exemplos foram projetados para utilizar o clreuito da figura 1.3 Figure 1.3 Alguns dos exemplos do capitulo 12 podem ser implementados direta- mente na placa laboratério PIC Aplicagdes ll da Symphony. Os softwares. programadores foram a IC-PROG ¢ o EPICWIN, utillzados. respectivamente com os programadores JDM & PIC Aplicagdes Il. Principios de Programacao Antes de iniciar o estudo da linguagem C propriamente dita, faz-se neces- sdrio relembrar os conceltos basicos de programagao de sistemas. Neste ca- pitulo vamos realizar um breve estudo sobre temas como algebra beoleana, algoritmos ¢ outros principios Importantes na programagao de sistemas. Podemos cizer que programagio, consiste na tredug&o do pensamento légico necessdrio para o cumprimento de determinada tarefa, em uma se- qgléncia de comandos que podem ser Interpretados @ executados por uma méquina. Esta afirmagao denota, desde ja, a idéia de que um programa é fruto do ordenamento ldgico e traduzido do raclocinia humana. De fato, @ tarefa de programagao constitui-se basi¢amente num processo de identificagao e solugao de problemas. Para isso o programador utiliza-se de um conjunte de procedimentos genéricas: 4) Exposic¢éo do problema: o programacor deve descrever detslhada- mente o problema a ser resolvido pelo programa; 2°) Andlise da solugado: sendo conhecido o problema, o programador deve elaborar a ou as solugdes que melhor resolvem o problema em questao; Godlficagado da solugdo: uma vez que 0 programador 6 capaz de des- crever tanto o problema quanto a solugao para ele, 6 necessario en- t&o a codificagao, ou seja, a descrigad Sequencial passo a passo da solugo que melhor resolve o problema. A isto da-se 0 nome de algo- ritmo; Tradugao do cédigo: partinco da seqd&ncia de camandos obtides do procedimento anterior, resta ao programador traduzir essa seqiéncia em comandos que possam ser corretamente interpretados pela lin- guagem de programagao utillzada; Princigies do Progeamagdo- © 34 5*) Depuragio (em inglés DEBUG): infelizmente, por mais experiente que $¢ja 0 programador, um programa nunea esta livre de erras, por isso, apés implementagdo do programa, séja qual for a linguagem ullliza- da, sera necess4rio proceder a sua depuragaio. Depuragao entdo é o processo de verificagdo e teste do programa de forma a localizar & solucionar todas as eventuais falhas ¢ erros de codificagao que te- nham acontecide em quaisquer cas fases anteriores. Utilizam-se diversas técni para facilitar estas tarefas listadas. Na analise e codifleagdo da solu¢&o, por exemplo, ulilizamrse diagramas e fluxo- Bremas para & constru¢do grafica de algoritmos, o que permite uma melhor visualizagdo dos passos envolvidos nele. Dependendo da complexidade do programa, pode ser necessario ulllizar alguns artificios de programaggo: * Um conjunte de comandos utilizado repetidamente, om diferentes par- tes do programa, pode ser codificado separadamente, formando um médulo ou fungdo. Desta forma, em vez de repetir a seqiiénela de comandes a cada neécessidade, o programador pode simplesmente executar a fungao especificada; + Umi conjunto de comandos executado diversas yezes numa mesma sequéncia constitui, no jargao dos programadores, um laco de repetl- ao ou em inglés LOOP. Mais adiante veremos as formas de codiflea- gao de um loop; + Normalmente em um programa 6 nécessério verificar ou testar deter- minada condi¢do, seja comparer dois nimeros, verificar uma senha, etc. A codificagao dos testes condicionals, baseados na algebra boo- leana, também obedece a algumas regras qué veremos adiante. Durante a fase de codificagao do algoritmo, o programador pode utilizar-se: de ferramentas, ou programas de computedor especiais, denominados gerado- res de programa, que fealizam automaticamente a tarefa de conversdo de um algoritmo em codigos ou mesmo comancos de determinada linguagen. Encontramos também alguns programas especiais € qué $80 ulilizados na fase de tradugdo de cédiga. Estes programas So Classificados em duas cate- gorlas: Interpretadores ¢ compiladores, As linguagens interpretadas séio aquelas 6m que @ tradugao da linguagem & feita em tempo real, durante a cxecugao de programa. Isto significa que as linguagens interpretadas sao mais lentas, pois 6 pracessa de tradugdo tem de ser felto para cada instrugéo do programa. Como sxemplos de linguagens in- lerpréetadas, podemos citar algumas versGes da linguagem BASIC, inclusive o BASIC STAMP, disponivel para os PIs. eo Microcontratadares PIC - Programacdo em C Ja as linguagens compiladas sdo aquelas em que o processo de tradugae. {compila¢ao) ¢ feito previamente e © codigo gerado pelo compilador (cédigo d= maquina) pode ser carregado na meméria e executado diretamente por ele. Fica clara a vantagem das linguagens complladas sobre as interpretadas, j@ que nas interpretadas, o trabalho de tradugao do cédigo-fonte, além de ser feito em tempo real, deve ser feito pelo proprio processador que ira executar o cddigo gerado, 0 que em muitos casos {come ne PIC em questdo) resulta em uma enorme diferenga, Outro tema interessante sobre as linguagens interpretadas 6 0 aspecto da otimizagao de cédigo: nas linguagens interpretadas, cada comando de alte nivel @ traduzide em uma respectiva seqiéncia de comandos de baixo nivel pelo programa interpretador. Se um mesmo comando for utilizado diversas. vezes mo programa, serao geradas tantas seqiéneias de comandos de baixe nivel Quantas forem as aparigdes do comanda de alto nivel. Por outro lado, em um compilador, isto j4 ndo acontece da mesma forma. De maneira geral, os compiladores so programas altamente complexos e utilizam diversas artificios para a otimizagéo do cédigo gerado, tanto em fun: g40 do espace ocupado, como também na velocidade de execugao. Por isso mesmo, © processo de compllagao é complex demais para ser embutide em um chie to pequeno coma os PICs, por exemplo, razGo pela qual devernos utilizar plataformas computacionais mais potentes para a execugSo de tais Softwares (denominacdo em inglés para programas de computador). Finalmente, na fase de depuragéo, encontramos também diversos. Programas & hardware (equipamentos) para auxlliar 0 programador na busca de erros ¢ falhas no programa. Alguns esses programas € equipamentos es- peciais so utilizados para simular a execugdo do programa, permitindo ao Programador a checagem a qualquer tempo do estado do programa, verifica- gio de varidvels, etc 2.1, Fluxogramas Como ja fai dito, os fluxogramas so ferramentas que auxiliam grande mente a tarefa de codificacao de um programa, Na realidade, fluxogramas so elementos graficos utilizados para estabe- lecer a sequéncia ce operagies necessérias para o cumprimente de determi- nada tarefa e, conseqientemente, a resolugéo de um problema. A seguir, veremos alguns exemplos de elementos utilizades na construgao de fluxogramas, bem como alguns exemplos deles. Prineinios a Progremasko So Inicio ou terminagada: este tipo de simbolo é utilizado para representar o Inicio ou térming do programa ou algoritmo, Processo: este simbolo é utilizado para cescrever a realize ‘ga de uma determinada tarofa. Dados: normalmente este simbolo utilizado para cescrever um processa de entrada de dados. Tomada de decisio: este simbalo € utilizade para represen- tar um ponto de tomada de decisio, ou teste condicional. A tomada de decisSo pode conduzir sempre a um resultado: verdadeiro ou falso, Em um dos casos o fluxo do programa & desviado @ no outro, normaimente, o programa seguira na sua seqléncia nonmal, | Vejamas um exempio de um fluxograma para a solugaio de um problema simples: somar dois nimeros (A e 8) e armazenar o resultado em C. O fluxograma da figura 2.1 representa os passos necessarios para solu. cionar 0 problema descrita, Figura 2.1. Um outro exemplo: um programa para contar de ‘Oaté 10. } erbeonirelaceves PIG - Prograsacdo em 0 2.2, Algebra Booleana Agora que | vimos alguns detalhes sobre o funcionamento © aplicagéo ~ dos fluxogramas no planejamento da solugdo de um problema, 6 necessario verlficarmos alguns conceltos importantes sobre a resolugéo de problemas légicos: a Algebra booleana, um ramo da matemética encarregado da resolu: gio de problemas légicos. Este nome & devido ao fato de ter sido o inglés George Boole (1815-1864) um cos seus principais articuladores. A algebra booleana é baseada em regras e concsites légicos simples: proposigaes € operadores ldgicos relacionais, Uma proposigae nada mals é do que qualquer afirmagao verbal passivel de ser classificada como sendo verdadeira ou falsa. Assim, a afirmagao "Hoje & domingo” pode ser considerada uma proposigao, j& que pode ser classifice- da como verdadelra ou falsa. Ja a frase "Que dia é hoje?" nao é ume proposi- $0, pois nao pode ser classificada como verdadeira ou false. Duas ou mais proposigdes podem ser relacionadas com o uso dos opera- dores légicos relacionais E, OU e NAO, © operador relacional E ¢ utilizado para conectar duas ou mals proposi- gdes, resultando na chamada CONJUNCAO. A conjungéo de duas ou mais pro Rosi¢ées somente sera verdadeira se TODAS as Proposigies forem verdadel- ras. Em segulda temos a tabelaverdade, que demonstra o relacionamento en- tre as proposigies "A" 6 "B", o que resulta na conjun¢de C, Imagine entao que lenhamos @ seguinte afirmagao: “Se for no. domingo E o tempo estiver bom, iremos @ praia." Se considerarnos a afimmagao “Se for no domingo" como sendo a propo- si¢éo "A" @ a afirmago “o tempo estiver bom" como sendo a Proposicao "B", @ conjungado C que iré determinar a ida ou nao a praia pode ser verificada da seguinte forma: a B c (E domingo?) | (0 tempo esta bom?) | (Vamos a praia?) Ja 0 operador OU & também utllizado para relacionar duas ou mais propo- sigdes, resultando em uma nova proposigdo chamada DISJU NCAO. A disjungaio de dues ou mais proposicdes ser verdadeira se QUALQUER das proposicies for verdadeira. No exemplo seguinte, temos a utilizagao da DISJUNCAO. Imagine um sis- tema de alarme composto de dois sensores (Ae B). A saida do alarme (c) Sera verdadeira (alarme disparado) se qualquer dos sensores estiver ativedo {verdadeira). Velames a tabela-verdade pata a disjungdo: Podemos verificar que a proposigao € (6 alarme esta disparado) sera ver- dadeira se um dos sensores (A ou B| for vardadeiro, eo. Microcortoledares PIG - Programssio.om C Finalmente, temos 0 operador légico NAO utillzado para negar uma « minada proposigao, fazendo com qué & proposi¢go possua sentido a a0 original. Assim, considerando a proposicao original: "Hoje @ domingo”, se verdadelra, conciuiriamos que & domingo e se falsa, que no &. Negando a proposigao, temos: “Hoje NAO é domingo". Observe que agora, se a nova pro- posic¢ao for verdadeira, concluiremos que nao é domingo ¢ se falsa, que & domingo, ao cantrario portanto, da proposigao original, Em seguida temos a tabela-verdade para a fungao NAO: ate] F Vv v = Tabela 2.3 Observe ainda que a negagdo de B também pode ser expressa como nao Apés esta breve explanagao sobre alguns dos principios gerais de pro- gramagaéo, vejamos um pouco mais sobre as linguagens de programagao. 2.3. Variaveis e Dados Variavel @ uma representacdo simb6lice pare elementos pertencentes a um determinado conjunto. As variaveis sdo armazenadas na memoria da ma quina e padem assumir qualquer valor dentre o conjunto de valores possiveis. Sempre que necessitarmos armazenar algum tipo dé dado, seja ele pro- venlente do mundo exterior (uma tecla pressionada, uma tensdo lida externa mente, etc.) como do préprio programa (0 resultado de uma equacdo, por exemplo) sera utilizada uma variavel. De fato, as varidvels ficam localizadas na meméria do equipamento, nfo ‘em qualquer tipo de memoria, mas nas chamadas memérias RAM. Isto signifi- a que num computador, boa parte da sua meméria RAM é ocupada por varid- veis, definidas pelos programas em execu¢do no computador. Um outro aspecto importante sobre as varidveis 6 que durante a execugdo de Um programa, uma vari@vel pode assumir diversos valores diferentes, mas nunca dois ou mais valores simultaneamente. As variaveis. sGo classificadas segundo 9 tipo de conteido que armaze- nam @ padem ser: numéricas, caractere, alfanuméricas e légicas. AS werlaveis numéricas $40 evidentemente utilizadas para o armazena- mento dé dedes numéricos e podem ser classificas em: Principios de Pragramago 8 asi ile * Inteiras: quando utilizadas para armazenar valores inteiros. Exempla: 0, 5, 156, etc. + Reals ou ponto flutuante: quando utilizadas para armazenar valores nao intelros, ou seja, ndmeros reais. Normalmente, este tipo de varié- vel utiliza uma notago bindria especial para o seu armazenamenta e utilizam mais posigdes de memdéria que as varldveis inteiras. A quantidade de meméria utilizada para armazenar uma varidvel depende do Seu tipo: variavels inteiras sdo normalmente encontradas com tamenhos de 8, 16 ou 32 bits. Uma varidvel intelra de 8 bits pode anmazenar um valor entre Q@ 255, uma variavel de 16 bits pode armazenar um valor entre 0 e 65535 e uma variével de 32 bits pode armazenar um valor entre 0 e 4.294,967.295. ‘Observe que os némeros representados acima sio somente positives, no caso de representacao de ndmeros com sinal, a magnitude de representagdo reduz-se & metade daquela sem sinal. Ja as variaveis do tipo real ou de ponte flutuante sao normalmente encan- tradas em tamanhos de 16, 32, 64 ou 80 bits! A titulo de exemplificagao, uma variavel de ponto flutuante de 80 bits pode representar valores entre 3,42 @ 1,182] Vale lembrar ainda que num sistema de 8 bits, uma variavel de 16 bits vai ocupar duas posigdes de meméria e, conseqientemente, uma variével de 32 bits ocupara quatro posigées de memGria. 4a as varlaveis do tipo caractere sao utilizadas para representar um carac- tere, utilizando normalmente para isso um cédigo especial (normalmente o cddigo ASCI|). As variavels do tipo caractere podem Ser agrupadas em conjuntos de va- riavels para formar frases. ou textos. As variavels do tipo alfanumérica sao utilizadas para armazenar tanto ce- racteres como valores numéricos, mas nunea 6s dols simullaneaments. Sendo assim, uma veriavel alfanumérica pode num dado momento canter un velor numérico © em outro ponte do programa, Ser willizeda para armazenar um ca- ractere. Finalmente, temos as variéveis do tipo Kigheo, capazes de amnazenar um estado ldgico: verdadeiro ou falso. 2.4, Operadores Muitas vezes necessitamos relacionar 6U modificar um ou mais elemen- tos como variaveis ou dados em um programa. ©} Mlcrocontaoladones PIC » Programagaaem © lacionar ou modificar um ou mais dados ou variéveis. rias principais: Operadores sao elementos ou simbolos graficos utilizados entao para re Podemos classificar os operadores de urna linguagem em cinco catego: * Matematices: sao utilizados para efetuar determinada operagdo ma- tematica em relagao @ um ou mais dados, Exemplo: adicdo, subtra- Gao, etc.; * Relacionais: sao utilizados para relacionar dois elementos ou dados. Exemplo: maior, menar, igual; + Légicos: séo utilizades para efetuar operagdes ldgicas booleanas en- tre dois ou mais elementos ou dados. Este tipo de operagdo somente pode chegar a um dos resultados: verdadeiro (1) ou false (0), e sao freqdentemente utilizados na criaggo de testes condicionais cam mil- tiplas variaveis. Exemplo: funeao E, fungdo OU, funcSo Nao: * Légicos bit a bit: utilizados para realizar operapdes idgicas bit a bit entre um ou mals elementos. ou dacos, conforme o caso. As opera- gbes ldgicas bit a bit so reallzadas entre cada um dos bits dos da dos, resultando em um valor qualquer. Exemplo: fungao E, fungaio OU, fungao Nao, rotagdo de bit, ete,; + Mamérla: sao operadores utilizados para efetuar operagdes em rela: gaa 4 meméria do equipamento. Example: atribuigdo (=), &e *. 2.5. Exerciclos 1) Nas equagies booleanas seguintes, quails valores de A, B e C tomam R verdadeira? R=(AeBeC) a) ASV, B=F, b) A=F, B=F, c) A=F, B=V, d) A&V, B=V, C=V I, R= ((Ae (nda B)) ou C) a) A=F, B=F, b) A=F, B=F, c) ASF, BeV, C=F d) ASV, B=F, C=F Ill, R= ({nde A) ou (née B) ou (nao C)) a) A=V, B=V, C=V =V¥ 2) 3) c) A=V, B=F, CaF d) A=V, B=V, CaF WW, R=(Aou B) e (ndo C)) a) A=V, BF, C=¥ b) A=F, B=F, Cav c) ATF. B=¥, C=F d) A=V, Bev, C=F Supondo a afirmagao: se ndo estiver chovendo e eu sair mais cedo do trabalho, iremos & praia, E considerande A= "Est chavendo?", B = “Eu sal mals cedo do trabalho?" e C a resposta: “Iremos & praia", determine 8 equacao booleana que descreve coretamente a afirmagao inicial: a) AeBec b) AouB=C c) Ae(naoB)=C d) (nado A)e B= C Qual o tipo de varidvel necessario para armazenar cada um dos seguintes dados: a) 150 b) “Linguagem c” ¢) 100,1 d) 250 e) "123" fl ¥ g 5 h) F 6 Micmcontrofacorts PIG » Programagio em C Capitulo) F|| 3 Compiladores CCS C Conforme ja dito, neste livro utilizaremos como platafarma de desenvalvi- mento o compilador PCWH da CCS. Ele consiste em um ambiente integrade de desenvolvimento (IDE) para o sistema operacional Windows e suporta toda a linha de microcontroladores PIC (sérles PIC12, PIC14, PIC16 e PIC18), Existe previsdo para suporte aos DsPIC assim que estiverem disponivels, Os PICs da série 17, além cos microcontroladores da UBICOM/SCENIX (SX), néo sao su- portados por esta versdo co compiladar. ‘0 IDE na realidade 6 constituida de trés médulos compiladores indepen- dentes: * PCB: para dispositives de 12 bits (séries PIC12 e PICLECSX); * PCM: para dispositivos de 14 bits (séries PIC 14000 @ PICLGxXXX): * PCH: para dispositivos de 16 bits {série PIC18). ‘0 usuario pode optar por adguirir os médulos separados ou o pacote completo, dependenda da aplicago a que sé destina o compilador. Existe também a possibilidade de utilizar o compiladar pela linha de co- mando @ também a partir do ambiente MPLAB da Microchip, conforme vere- mos adiante, Vejamos agora as principals caracteristicas do compilador em estudo: * Compatibilidade com a padronizagao ANSI ¢ ISO (algumas caracteris- ticas do compllador n&o fazem pane da nornatizagao ANSI devido ao fato de serem especificas para a arquitetura PIC); * Grande eficléncia no eddigo gerada; * Grande diversidade de fungdes ¢ bibliotecas da linguagem C (padrao ANSI), tais como: entrada/saida serial, manipulagdo de strings © ca- racteres, fungdes matemiaticas C, etc.; Cemeiledores COS'S © * Grande portabilidade de cédigo entre os diversos microcontroladores PIC e inclusive com cOdigo escrito para outros microcontroladores ou sistemas. Isto significa que € multo fécil adaptar um programa escrito em ¢ para outro dispositive ou sistema (seja ele um outro PIC, outro Upe de microcontrolador, ou mesmo um programa para PC), 3.1. Ambiente Integrado de Desenvolvimento (IDE) Como j& dissemos, o compilador PCWH & constituide de um IDE grafico que pode ser executade em qualquer plataforma Windows™, Na figura 3.1 temos uma imagem do IDE. Figura 3.1 Passemos entao a uma andlise detalhada de cada opeao e icone dispont veils neste ambiente. oS Micracentroladores PIC - Progremacde-om C Figura 3.2 A selegao de familia PIC 6 utillzada para especificar qual dos tés compl- ladores (PCB - 12 bits, PCM - 14 bits ou PCH - 16 bits) sera utilizado para compllar o programa. 0 conjunto de botées E = & ¢ utilizado para visualizar as seguintes 3 = - Visualizar o cédigo Assembly gerado pelo compilador. A visualizagiio desse cddigo pode auxiliar o programador na verificagao e otimizagaio do eédigo gerado pelo compilador. No exemplo do programa da figura 3.1, 0 cédigo assembly visualizado 6: OCS FCW C Compiler, Version 3.104, 14789 Filonano: c:\mous documantos\picelprog\tente. LES ROM used: 59 124) free fragront is 2048 RAM used: 1 Stack 1 lovatione bo00: HOWLW 90 DOO: NOWF RCLATI noa2: GoTo min 0903: OF a HinclwGe <16 £877. b> . Jf standard Hoadar tile fer the PICLEPO77 device + device PICLG?E77 + sider suse delay(eloek=20000000) fuses BS, NOWDT, PUT, LROWNOUT Compiledones OCS S wedd moan) C int aber ©. Visualizar simbolos gerados: esta op¢do permite ao programador vi- ‘sualizar a lista de simbolos utilizados ¢ criados pelo compilador para a tarefa de compilagao do programa. No exemplo da figura 3.1, 0 conjunto de simbolos gerado pela programa oo — FSP_DATA O15-016 CCPL O15 CCeL1_Low cs CCP BITCH Sln-01e cca oie Crate nic CCr_2_wroe 02k 0 mnin.a 022 oa oa o24 025 a7 ova = eBcaATCH 678 RETURN 07900 BECRATCH O7A 0 BECHATCH O78 = BSCRATCH delayine.P1 delay_um.P2 0028 aain OOM dune Project Files: Ci\mous documentes\piectproghteste.e Dt\piee\dovs ces \16£877.b } Micrsconteladoros FIC Progiemagio am C * Visualizer arvare de chamadas: esta opgdo permite aa programador visualizar toda a estrutura de chamada de fungSes que ocorre dentro do programa, além de apresentar detaihes Sobre a utilizagdo de me Moria RAM & ROM para cada fun¢ao do programa. Figura 3.3 l&- Visualizer estatisticas: esta ‘Oped permite ao programador visualizer 88 estatisticas de compilagdio do programa. Wott used: 59 (24) 2088 128%] including unused fragmenta © Averege locations per iine 59 Averoge locations pay statement RAM aud: 9 (8%) at main() Level 10 (ht) worae Limes Strts & Fil 320 2 -AED es \maue docunentos\pice\pregtteste.c 369-90 DiNpfee\dewicws\icr877 sh 1627 4 rain 39 66 2 wIMLEE Used Free +o 9004-378F $5 (1969 O8C0-OFFF =) 3008 iOCD-17FF sg) 20k. 1900-IFFP og 204s. Vejamos agora a estrutura de Menus do compllador PCWH: ‘Fis Project elt Option” Certs ia Tele (Hees Figura 3.4 No menu FILE encontramos os tradicionais toméndes de criagdo, abertu- a, fechamento e impressao de arquivo. O menu PROJECT apresenta comancos Pare a criagéo, abertura, fecha. mento e impressac de arquives de projeto, No menu PROJECT encontramos Compladores OG5 5 9 também a op¢ao INCLUDE DIRS, utilizada para especificar em quals diretérios ‘© compilader ird buscar os arquivos de inclusdo (normalmente com a extensao "h*). No meu EDIT encontramos os tradicionais comandos de edi¢aa (UNDO - Gesfazer (CTRL+Z), COPY - copiar (CTRL+C), CUT - recortar (SHIFT+DEL), PASTE. - colar (SHIFT+INS), SEARCH - procurar (CTRL+F), REPLACE - substituir (CTRL+R), NEXT - procurar prixlma (F3)), além de outros, como: COPY FROM FILE: copiar de arquivo - insere um arquive no programa em edigaio; PASTE TO FILE: colar em arquivo - copia o texto selecionado para um determinado arquivo; MATCH BRACE (CTRL+)): utilizado para encontrar a abertura/fecha- mento dé chave éorrespondente a chave atual e mover o cursor para aquela; MATCH BRACE EXTENDED (SHIFT+CTRL+)): seleciona todo o bloco cor- respondente & chave atual; INDENT SELECTION (ALT+F8): utilizado para indentar a seleg4o de tex- to atual; TOGGLE BOOKMARK (CTRL+SHIFT+nGmero): marca um determinado local do programa; GOTO BOOKMARK (SHIFT+nGmero): desloca o cursor para um dos Io- eais previamente marcados; NEXT WINDOW (CTRL+N); apresenta a proxima janela de edigao do compilador; PREVIOUS WINDOW (CTRL+P): apresenta &janela dé edigao anterior. No menu OPTIONS encontramos diversas opgdes de configuragao do edr tor de arquivos e do compilador PCW, tais como: + REAL TABS: utiliza caracteres de tabulacdo (TAB) em vez de espaqos; + TAB SIZE: especifica 6 tamanho de cada tabule- 980; * AUTO INDENT: ativa a auto-indentago do editor; + WORDSTAR KEYS; ativa compatibilidade com se- quénclas de controle do editor do wordstar®; * EDITOR FONT: seleciona o tipo de caractere utll- zado no editor; * SYNTAX HIGHLIGHTING: realce de sintaxe: exiba os comandos C em cores diferentes; * AUTO HIGHLIGHT BRACKETS: realga as chaves; Figura 3.6 + EDITOR COLORS: permite selecionar as cores para cada elemento da linguagem C (identificadores, comentarios, etc.); * RECALL OPEN FILES: atualiza os arquivos abertos; * TOOLBAR: permite configurar a barra de ferramentas do editor; * FILE FORMATS: abre uma janela de configuragso dos formatos de ar quives de saida do compilador. Figura 3.7 Nesta janela podemos definir parametros, camo: o tipo de arauiva de gerado (DEBUG FILE), o tipo de arquivo objeto gerado (OBJECT FILE), a so do arquivo objeto (normalmente HEX), 0 tipo de arquivo de erros, to do arquiva de listagem {LIST FORMAT), extenséo do arquivo de lista (LST). (0 arquivo de debug é normalmente utilizado pelos emuladores de hardware. O arquivo de objeto é o programa em cédigo de maquina pronto para ser Bravado na memédria do PIC. O arquivo de listagem 6 utilizado para verificacdo do cédigo gerado, in- cluindo o fonte em C e o assembly gerade pelo compilador. * GLOBAL DEFINES: Esta janela permite a criagao de cefinigdes padrao para utilizagao no ambiente IDE. Repare que estas definigaes nao sao utilizedas pelo compilador de linha de comando ou pelo ambiente in- tegrado no MPLAB, Nestes casos, 0 programador deve utilizar defini- goes no proprio cédigofonte do programa cu em um arquivo separado. Frans bled ny a re SN meoroe ees ase 3 er Convém ebservar também que estas definigdes somente sdo utilizadas quando a op¢3o ENABLED esta selecionada. + DESUGGER/PROGRAMER: Esta janela permite selecionar as opgdes de programador de dispositivos.e depurador/simulador, ©} Microcorereladores PIC - Propramards art No caso do programador, é possivel adiclonar ainda parimetros como o nome do arquivo a ser programado (4H) € o dispositive (%D). Ne caso do debugador/simulador, é sossivel adicionar parametros como o nome do projeto (MP) e nome do arquivo de debug (%C). * INCLUDE DIRS: Esta janela permite alterar e adicionar 4 ordem e os diretérios de pesquisa para os arquivos de inclusdo. A ordem de pes- quisa é de cima para baixo, A préxima opedo do menu principal € 0 menu COMPILE, que conta com apenas uma opgao COMPILE. Ela & obviamente utillzada para dar inicio ao processo de compilagao do programa. A seguir, temos o menu VIEW com as seguintes opedes: As quatro primeiras opgdes jd foram vistas anteriormente neste capitulo, Neste menu, encontramos ainda as op¢Ges: * (DATA SHEET: para visualizar a folha de dados do dispositive em uso (é hnecessério instalar separadamente os datasheets dos componentes, ‘9 que pode ser feito a partir da CD-ROM do compilador ou baitando cada arquivo do site do fabricante); Compliedores CCS S + VALID FUSES: esta opgio permite visualizar as. definigées validas para 4 palavra de configurapao do dispositive seleclonada; * VALID INTERRUPTS: permite visualizar as Interrupgées disponiveis no dispositive selecionado; « BINARY FILE: abre um arquivo bindrio pare visualizagio; * GOD DEBUG FILE: abre um arquivo debug para visualizagao. No menu TOOLS encontramos algumas ferramentas internas & externas muito Interessantes ¢ que auxiliam o programador na tarefa de Programagéo: Figura 3.12 * DEVICE EDITOR: o editor de dispositives ¢ uma ferramenta muito inte- fessante que permite ao programador adicionar ou alterar a forma coma o compllador trata cada dispositive da familia PIC, Com esse editor é possivel adicionar novos dispositivos 4 medida que eles se tomarem disponiveis; * DEVICE SELECTOR: esta opgdo abre uma janela que penmite ao pro- gramacior selecionar € comparar as caracteristicas de cada dispositive das familias PIC; * FILE COMPARE: permite efetuar @ comparacSo entre dois arquivos; * NUMERIC CONVERTER: esse pegueno programa permite efetuar a conversdo entre os trés principals tipes dé dados disponiveis na lin- guagem C: Inteiros sem sinal, inteiras com sinal e ponto flutuante; * SERIAL PORT MONITOR: invoca Um pequeno e simples terminal do comunicagao serial, que pode ser utilizado para efetuar a comunica 80 com um microcontrolador por meio da porta serial do microcompu- tador; * DISASSEMBLER: o cisassembler € um programa que faz 0 contrario do Mmontader, ou seja, ele desmonta os c6digos bindrios € traduz nova mente em mnemonicos assembly. ° Mirocorerltsones PIG Progtamaga em C Para utilizar o disassembler, primeiramente informamos o nome do arquivo a ser desmon- tado em INPUT FILE, em seguida o nome do ar quivo a ser gerado em OUTPUT FILE. apeen a Em seguida, selecionamos as opgdes de E 5 Paee | desmontagem: cédige de 12 ou 14 bits (nao ¢ possivel desmontar programas para PICs da familia 18), tipo de arquivo de entrada (hexade- cimal ou bindrio), tipo de rétulos (LABELS) utili- zado (endereco simples, rétulo G ou Assembly) & finalmente 0 formato numérico de salda, Ao clicar no botéo DASM, o processo de desmontagem tera inicio ¢ serd geradio 0 arquivo de saica especificada em OUTPUT FILE. * EXTRACT CAL DATA: esta opcdo deve ser utilizada quando se trabalha com dispositivos dotados de clock intemo com palavra de callbragdo (12C50x, 12C51x, 12C67x, 127629 6 12F675, entre outros). Uma vez selecionada esta oppao, o programador deve informar o nome do arquivo hexadecimal (que deve conter a leitura prévia do chip de des- tino) do qual sera feita a extracdo da palavwa de calibragdo (normal- mente localizada no ditimo endere¢o valida da meméria de programa): * PROGRAM CHIP: invoca o programador de dispositivos (o qual n&o faz parte do pacote do compilador e deve ser adquirido separadamente); * MPLAB: invoca o ambiente MPLAB; * INTERNET: permite acesso ao site da fabricante do compilador. Finalmente, a ditima opgdo do menu principal do programa, HELP, contém ode praxe: auxilio (em Inglés) ao programador. 3.2. Integragao com o MPLAB Além do ambiente IDE, é possivel utilizar 0s compiladores PCB, PCM e PCH integrados ao ambiente MPLAB. A seguir, veremos passo @ passo 05 procedimentos necessaries para programar em linguagem C dentro do MPLAB. Apés instalado o compilador no computador, inicle o MPLAB e selecione a ongdo PROJECT > NEW PROJECT. Digite o nome do arquivo de projeta e clique em OK, Deve surgir a janela de oppGes do projeto, como na figura 3.14. Compiladores OCS S Em seguida, clique na opgao LANGUAGE SUITE @ selecione o compllador CCS (figura 3.16). Surgem mensagens de alerta (normalmente trés); clique apenas OK. Repare que apds a modificagdo da linguagem de programagao, a op¢ao ADD NODE, que anteriormente estava ativada, vai agora aparecer desativada como as outras. Clique no nd principal do projeto (o arquivo testec[.hex]) destacado na fi- gura 3.17 e selecione a oppo NODE PROPERTIES. Deve surgir a janela de propriedades do nd do projeto (figura 3.18). Nessa jenela o programador seleciona qual dos compiladores ser utilizado (PCB, PCM ou PCH, conforme o pacote adquirido). E possivel também acionar a op- @8o GENERATE CALL TREE para fazer com que o compilador gere um arquivo com a arvore de chamadas de fun¢des. Agora, basta selecionar qual o modo de funcionamento do MPLAB (em DEVELOPMENT MODE) clicande no botéo CHANGE e selecionando o dispositive @ 0 mado desejado. Se j4 houver um programe-fonte em C salve no HD, o programador pode entao selecionar a op¢do ADD NODE @ adicionar o arquivo desejado. Se nao houver arquivo, clique em OK e salve o projeto (PROJECT > SAVE PROJECT). Caso nao tenha digitado o programa ainda, o programador pode fazélo utilizando a opgao FILE > NEW, salvando em seguida o arquivo e adicionando-o @0 projeto, como mencionado anteriomente. Compiladsres O65 § oe yitulo 4 Introducgao a Linguagem C Capitu! Tat Sart Agora que o leitor j& possui © conhecimento sobre o funcionamento do compilador € do ambiente de desenvolvimento, é hora de estudar os funda- mentos da linguagem C. Para facilitar a compreensfo da linguagem C, velamos primeiramente um exemple de programa: Exemplo 4.1 J} Prineire exexple Hinelude Valid Fuses. Na proxima linha do programa encontramos: maint A declaragio main() especifica o nome de uma fungao. No caso, a fungio main() é padronizada na linguagem C e é utilizada para Gefinir a fungao princi pal, Ou 0 corpo principal do programa. Uma fungao, em C, € um conjunto de instrugSes que pode ser executado a partir de qualquer ponto do programa. O sinal de abertura de chave “(" é utilizado pare delimiter o Iniclo da fun- go e 0 sinal de fechamento de chave "}" indica 0 final da fun¢ao. Na realidade, as chaves celimitam o que chamames de bloco de progra- ma, ou bloco de codigo. Nas linguagens de programagdo estruturada (como C), um bloco de pro- grama consiste em um conjunto de comandos conectados logicamente © que assumem uma identidade Gnica, ou unidade. Assim, para todos os efeitos, um loco de comandos € um nico comando funcionam da mesma forma. Podemos dizer que um programa em C é constituide por um ou mais dos Seguintes elementos: Introdugao & Linguagem C © * Operadores: Operadores séo elementos utilizados para comandar interagdes entre varlaveis ¢ dados em C, Muitos dizem que um dos elementos que mals se destacam na lin- Quagem C é a forca e flexibilidade dos seus operadores. 0 capitulo 6 faz um estudo sobre os operadores de dados encontra- dos na linguagem C. + Variaveis: E claro que ndo podemes escrever um programa realmente dtl sem utilizar variaveis para o armazenamento de dados. A linguagem C dispde de uma grande variedade de tipos de varidveis e dades, © que pennite o desenvolvimento de praticamente qualquer tipa de aplicagao, No préximo capitulo, faremos um estudo detalhado das varidveis e tl pos de dados encontrados. na linguagem C. + Comandos de controle: Os comandos ou declaragdes de controle sao elementos essenciais & escrita de programas em C. Coma seu proprio nome diz, eles sao utllizades para controlar, testar @ manipular dados e informagdes dentro do programa. No capitulo 7 estudaremos os diverses comandios de controle disponl- vels na linguagem C. + Fungiies: As fungdes, como ja fol dito, so estruturas de programa utilizadas para simplificar, olimizar ou apenas tornar mais claro o funcionamento: do programa, No capitulo 9 faremos um estudo mals profundo sobre o funcionamen- to @ utilidade das fungdes na linguagem C. A primeira linha do bloco de comandos da funcao main) é: while (truer Este & um comando de controle utilizado na repeti¢ao de um determinado bloco de instrugdes, Esse bloco sera repetido enquanto a avaliagdo da condi- 980 especificada entre parénteses for verdadeira. No caso. a avaliacao é expl- citamente verdadeira (true). 0 bloco de instrugdes que sera repetido € aquele especificado dentro das chaves que seguem a comando while. 6 Micravontroladores PIG ~ Programa em ¢ Por ora, Isto 6 tudo 0 que devemos saber sobre 0 comando while. Quando estudarmos as declaragdes de controle, retomaremos ao assunto. ‘Coma ja dissemos, os comandos que formam o bloco de instrugdes a se- rem repetidas so aqueles entre as chaves: { été | PIMLBIG) » delay_ms (tempol: E serao repetides indefinidamente até que o processador seja desligado ou ressetado. " Um detalhe interessante a ser observado @ que ao final de cada uma das trés chamadas de funcdo, o ditimo caractere da linha foi um ponto-e-virgula (;). Em Co ponto-e-virgula é utillzado para delimitar o final de um comando. Observe que as diretivas do compilador ndo necessitam (nem permitem) do uso do ponto e virgula como delimitador. Analisemos ent&o as cinco instrugdes que compGem o bloco do comandao ‘while: © primeiro comando, int tempo, é chamado de declaragdo de variavel. Este comando determina que o compilador crie uma varidvel do tipo inteiro int chamada tezps. Esta opera¢do na realidade ira reservar um dos registradores: GPR disponivels para o armazenamenta do valor relativo a varidvel. 0 tipo In- teiro int especifica um tipo de dado de 8 bits com valores compreendidos en- tre 0 ¢ 255 decimal. Mais adiante neste livro, estudaremos os tipos de dados disponiveis na linguagem C e no compilador CCS. O nome dado a variavel é Identificador € pode ser composto de letras & nimeros. Mais adiante veremos mais detalhes sobre os identificadores vali- dos na linguagem C.. Em seguida, temos a linha temac-100 que constitulse em uma operacao de atribuigdo, AS atribulgdes em C sfo executadas pelo operador de igualdade "=". Desta forma, 6 linha tempo=100 faré com que © compllador gere uma se- gUéncia de instrugdes para fazer com que o valor 100 decimal seja armazena- do na variavel "tempo". © préximo comando, sutput_high(piw_50}, @ uma chamada a uma fun- go Intema do compilador. Inlredupdo & Urguageen © © Esta fungdo & utilizada para setar (ou seja, colocar em nivel ldgico '1') um pino do microcontrolador. Isto significa que o pino RBO (da porta B) sera seta- do. Note que "PIN_BO" & um simbolo predefinido para especificar o pino RBO, Este simbolo esta lacalizado no arquivo de cabegalho do processador utilizado {no presente caso o arquivo "16F828.h"). Uma caracteristica interessante do CCS C @ que o proprio compilador en tcarrega-se de configurar o pino para funcionar como uma entrada ow saida, dependendo do modo de tratamento de 1/0 em que se esteja trabalhando. Outro aspecto interessante desta chamada de fungao 6 que ela demons- tra uma chamada de fun¢do com um parametro, que no caso especifica o pine ‘do microcontrolador a ser setado. Este tipo de pardmetro de uma fungdo & chamado de pardmetro formal. Veremos mais detalhes sobre fungdes & parametros no capitulo 0 deste livro_ A préxima fungo a ser executada 6: delays (tempol Esta também @ uma funcao intema do compilador e é utilizade para gerar um atraso de X milissegundas. No caso, 0 atraso sera igual a 100ms (4 que a variavel tempo, utilizada como pardmetro, contém o valor 100). © aréximo comando do bloco €: putpet_lewsPIM_BD) 2 Esta também é uma fungao intema do compilador e é utilizada para res- setar (au seja, colocar em nivel l6gico "0") um pino qualquer do microcontrola- dor. Novamente neste caso, o pino em questao € o REO. Finalmente, o Ultima comando: delays (compo: Faré com que novamnente o compilador gere um atraso de 100 ms. Maiores detalhes sobre o funcionamento das fungdes intemas do compl lador podem ser vistos no capitulo 12, Desta forma, ao programarmos o PIC Como programa anterior € se tiver- mos conectado um LED (com o devido resistor de limitagito de corrente) ao pino REO, nds o veremos acender e apagar em uma freqiéncia de 5 Hz. eo Microcontrledares PIC -Prooramacio am C 4.1. Palavras Reservadas da Linguagem Toda linguagem de programagao possui um canjunto de palavras ou co- mandos para os quais ja existe interpretagdo interna prévia. Tais palavras nao podem ser utilizadas para outras finalidades que nao as definidas pela lingua gem. A linguagem C ANSI estipula as seguintes palavras reservadas: 4,2. Identificadores Identificadores $80 nomes dados pelo programador a variaveis, fungdes @ Outros elementos da linguagem C. Conforme j4 vimos, um identificador na linguagem © pode ser compost Ge caracteres numéricos e alfanuméricos. Além de nimeros e letras, o tnica outro caractere que pode ser utilizado em identificadores é sublinhado: ee Além disso, um identificador somente pode ser iniciado por uma letra ou Sublinhado, nunca por um ndmero. Veja em seguida alguns exemplos de iden- tficadores validos e Invalidos em C: 7" Nesta tabela o identificador “labe" é inv4lido porque se iniciou por um ndmero, "variavel" é invalido porque utiliza acenta, "return" 4 invalido porque & uma palavra reservada da linguagem e “erro\2" é invalide porque utiliza o ca ractere "\", Repare que néo & permitide utilizar como identificador uma palavra reser- vada da linguagem ou um nome de funcao ja definida em C. © padrao ANSI determina ainda que apenas os primeiros 31 caracteres do nome do identificador sero utilizados para a diferenciagdo entre eles. Isto significa que € possivel utilizar identificadores de qualquer tamanho, desde que existam diferengas nos primelros 31 caracteres, de forma a distin- gulr entre um € outro. Vejamos entdo as principals regras de nomeagdo de identificadores: S6 podem ser utilizadas letras, nGmeros ou 0 caractere sublinhado + Dever sempre ser Iniclados por uma letra ou sublinhado; + Identificadores sao Gnicos; um mesmo identificador néo pode ser atri- buido a coisas diferentes; + N&o podem ser utilizadas como identificadores as palavras reservadas: da linguagem e nomes de fun¢des ja definidas; + Somente os primeiros 31 caracteres do identificador sao validos, no entanto um identificador pode utilizer mais do que este nimero de ca- racteres, 4.3. Comandos e Funcdes Importantes Antes de prosseguinmos no estudo detalhado da linguagem, & interessante observarmos alguns comandes e fungées muito utilizades nos programas na linguagem C. Estas fungdes e comandos serao utilizados no decorrer deste livro, dai a import&ncia de termos a0 menos uma viséo superficial de cada um. 4.3.1. Comando If © comando ff (em portugués “se") 6 utilizado em testes condicionals do tipo: Af [eondigo) comandoy O que significa: se a condigio for verdadeira, entdo execute o comando especificado. eo IMiemeontrelasoras PIG - Progremacdo em C: Esta condi¢ao deve ser qualquer expressao que possa ser avaliada como verdadelra ou falsa, ou seja, uma proposi¢aa booleana. No capitulo 7 veremos um estudo detalhado de comando if. 4.3.2. Comando While O comando while (em portugués “enquanto"), confarme ja visto anterior mente, é utilizado para especificar uma estrutura ou lago de repeticaio, em que um ou mais comandos sao repetidamente executades enquanto uma determi nada condigdo for avaliada como verdadeira. A sua forma geral &: while Ceandiqnal eamanior 0 que significa: enquanto a condi¢ao for verdadeira, execute o comando especilicado, Esta condig¢ao & novamente qualquer expresso que possa ser avaliada tomo verdadeira ou faisa, ou seja, uma proposicao hooleana. © comando while sera melhor estudado no capitulo 7. 4.3.3. Funeao Printf A fung&o printf é utilizada para possibilitar a saida de dades na linguagem C. A saida de dados é direcionada para o dispositive padréo de saida, que nos computadores & normalmente o monitor de video. No caso dos PICs, o dispo- sitivo de saida eventualmente dispanivel é a saida serial. Assim, a fungio printf é uma excelente forma de transmitit dados serial mente do PIC para um outro dispositiva extemo, camo, por exemplo, um ter minal de video ou um microcomputacor. © formato geral da fungao printf é: prine® ( argumente(s) 1) Em que argumento pode ser uma constante de caracteres direta ou ainda um conjunto de caracteres de controle seguido de uma lista de varidveis. Veja os exemplos: print? (*Teste"): (7 imprite @ palavra Teste atrawis do dispositive +4 do saide padsso Ou, (etrodupéo & Linguagem C So dat var.ceste: // declara a voridvel inte! #f atribui o valor § A varsdvel var var_teste)s 7 isprine o valor da voridvel var_texte Observe que no ditimo exemple, a funcdo printf utilizou um codigo de for- matagao para especificar que o conteddo da varidvel deveria ser impresso no formato intelro. A tabela seguinte apresenta alguns dos cédigos de formatacao mais utilizacos: A funcio printf e os seus codigos de formatagao serao melhor estudados no capitulo 11. 4.3.4. Fun¢do GETC A fungao GETC 6 utilizada para entrada de dados, o que, no caso dos PICs, 4 feito por comunicagao serial, Esta fungao aguarda que seja recebido um cerectere pela linha serial pre- viamente configurada, retorando o valor do Caractere recebido. Veja o formato geral desta fungado: varidvel = getei}r ou simplesmente, perct); no caso de n&o ser desejado atribuir o valor retomado pela fungdio (que ¢ o caractere recebido serialmente) a qualquer variavel, Desde ja é interessante sabermos qué Uma funcao, na linguagem C, pode retamar valores, isto 6, apds a execugao da fungéo, ela pode retomar um valor ou dado referente ao processo realizado. Por ora, isso & tudo o que vocé precisa saber sobre a fungdo gate. No capitulo 11 veremos detalhacdamente o funclonamento desta e de outras fun- gdes disponivels na linguagem ¢. °o Mierecontroladores PIG -Programagio en C Capitulo) | Variaveis e Tipos de Dados A linguagem C disponibiliza ao programador uma gama de tipos de dados. A implementagdo C da CCS possibilita o uso de quase todos os tlpos de da dos disponiveis em C padrao ANSI, De fato os tipos de dados disponiveis na implementagaéo C da CCS sao os. maiores pontos positives, permitindo a construgéo de programas de grande camplexidade com uma relativa facilidade. Vejamos os tipas basicos de dados disponiveis; Tamanho em Bits Intervalo & Oa 255 & Oa 255. 32, 3,4E-38 a 3.4E+33 0: nenhum valor Tabela 5.1 Os tipos de dados sao identificados pelas palawras reservadas da lingua gem: char, int, float ¢ vald. O tipo char 6 utilizado para representagao de caracteres ASCII de @ bits. Cada variével do tipo char pode representar um caractere ASCII. © conjunto de caracteres ASCII é nommatizado universalmente e@ pode ser encontrado no apéndice 0 do livro. O tipo int 4 utilizado para representar nGmeros inteiros de 8 bits (0 a 255). Estes tipos de dados sdo amplamente usados em programagao C. Note que o tipo Int ne linguagem C & definido sempre para possulr o ta manho mais eficiente para 2 arquiteture-alvo: 8 bits no caso dos PICS, 32 bis ‘no caso dos computadores do tipo PC atuais. No entanto, o padréo ANS! es- pecifica que o tipo int deve representar um nimero de 16 bits. \Varineis « Tipos da Dados 9 ¢ Repare ainda que tanto ehar como int representam nimeros inteiros e nZo podem ser utilizados para representar nimeros fraciondrios. Para isso, deve ser utilizado 6 tipo float, também chamado de ponto flutuante. Este tipo de dado pode ser utilizado para representar grandezas compreencidas entre 3.438 ¢ 3.4798, tanto para nimeros frecionarios como intelros, Em mate- Mética séo os chamados nimeros reals. Note que este tipo de dado ocupa quatro posigoes de memdria RAM do PIC @ além disso, qualquer operag3o envolvendo varidveis float 6 traduzida pelo compilador em um conjunto complexe de operagdes. Senco assim, 0 uso de varidveis float deve ser evitado ao maximo e res- trito apenas 8s operagdes que realmente necessitarem de um tipo de dados como este. Temas ainda o tipo vold, utillzedo normalmente em fungdes para declarar que ela néo deve retomar nenhum valor. Maiores detalhes sobre a sua fun¢do. sero vistos mais adiante neste livro. *|/Observacdo: A linguagem C prevé ainda o tipo double, que consiste em uma versio com capacidade de representaclio dobrada (64 bits) em rela- 40 ao fino float. 0 compilador GCS nfo suporta este tipo de dado, no entante, a palavra double continua entre a8 palavras reservadas da lingua gem. 5.1. Modificadores de Tipo Além das tipos de dados vistos na tabela 5.1, podemos utilizar coman- des especiais da linguagem C para modificar os tipos bésicos, de forma a ob- termos outros tipos de dados. Esses comandos especiais sio chamados de modificadores @ sao os se- guintes: signed, unsigned, short, ¢ long. © modificador signed pode ser utilizado para modificar um tipo base de dados de forma que ele possa representer tanto ndmeros positives como na- meros negativos. A representagéo de nimeros negatives € feita tomando o bit MSB (Most Significant Bit ou Bit mais significativo) da variavel para representar o sinal: bit MSB = 1, sinal negativo, bit MSB = 0, sina! positivo. Nesta notagdo, chamada complemento de dols, 0 valor a ser representado 4 complementado (tem seus bits invertidos um @ um) ¢ entao & somado 4 ao resultado. oS Mcrooontrlaciores FIC - Programagia em & Note que devide ao fato de utilizar um bit para representagdo do sinal, a magnitude absoluta de representagdo do tipo modificado sera metade da magnitude do tipo nao modificade. Assim, um tipo de dados signed Int pade representar valores entre -128 @ +127, em vez de 0 a 255, ‘© modificador unsigned define um tipo de dado sem sinal, o que € o pa- draio do compilador CCS, Desta forma, néo @ necessario utilizar 0 modificador unsigned, j4 que ele nado produz qualquer efeito. Note que o padrdo ANSI es- pecifica que os tipos de dados padrao da Iinguagem C sao do tipo signed. Ja 0 modificador short é utilizado para definir uma variavel com tamanho menor que o tipe modificado, ou seja, uma verséo reduzida do tipo especifica- do. Assim, se especificarnos uma varidvel como sende do tipo short int, ela sera uma versio reduzida do tipo int, o que no caso do compilador CCS cra uma varidvel de apenas um bit de tamanho (o que é também chamado de flag ou sinalizedor). Note que esta aproximag-do difere do C padrao ANSI, J& qué 0 face princl- pal co compllador CCS é a eficiéncia as varldvels de 1 bit sao, sem divida, bemvindas em um ambiente tao restrito como em um microcontrolador. Finalmente, temos o modificador long, utilizado para ampliar a magnitude de representacgo do tipo especificado. esta forma, um tipo de dados long int tera um tamanho de 16 bits, ou seja, ira acupar duas posigdes de memoria RAM do PIC e teré uma magnitude de represontacdo de 65536 elementos. Observe ainda que a linguagem C permite a adogéo da forma de declara- Gao simplificada; basta que o programador informe o modificadar. Neste caso, © compilador assume que o tipo 6 o Int. Assim, a declaragao short Int produz co mesmo efeito que short, long int produz o mesmo efeito que long e assim por diante, 5.2. Outros Tipos Especificos do Compilador CCS C Além dos tipos de dados descrites anteriormente, encontramos no comp!- lador CCS outros tipes de dados, criados especificamente para a eficiéncia @ compatibilidade do compilador junto a dispositivos coma os PICs. Sao eles: * Int: especifica valores de 1 bit (equivale ao tipo short Int padrao); + boolean: especifica valores booleanas de bit (equivale ao short int & Int); * Int®: especifica valores de 8 bits (equivale ao tipo Int padraia); Ve is. Tipos de Dados oO * byte: especifica valores de 8 bits (eqiivale ao tipo int ¢ int); * Int: especifica valores de 16 bits (eqiivale ao tipo long int padrao); + int32: especifica valores de 32 bits. Note ainda que o compilador possui uma diretiva interna “#type” que pode ser utilizada para alterar 0 tamanho dos tipos padrdo. Esta diretiva sera methor estudada no capitulo 10, A seguir, temos uma tabela com todos os tipos de dados disponiveis por padréo no compilador CCS: Tamanho em Bits Faixa de valores er eee urainedenw [| a] 00358] [a,b | ass [set ssn [8 [aaa unsigned 7s unsigned Oa 255 fong int, inti 16 0365,.535 signed bong int 32.768 a 32.767 unsigned long int 32.768 a 32.767 0a 4,.254.967.295 “2.147.483.6438 a 0a 4.294.967.295 signed inta2 unsigned int32 Observagao: * Os tips boolean @ byte sdo definides nos erquivos de cabecalho de| cada PIC « so baseados nos tipos short Inte Int respectivamente. As varidweis Intelras sao armazenadas pelo compilador, iniciando pelo LS8 no endereco mals baixo de memOre € com o MSB no ditine ende-| rego acupade pola varidvel! oe Micrcaniladcras PIC - Progremsgiia em C §.3. Declaragao de Varlavels Em C, ao contrario de outras linguagens como BASIC, é necessario decla- far @ variavel antes de poder uséla, Declarar uma varidvel nada mals é do que informer ao compilador que uma varidvel chameda "x" € do tipo "y". O nome da variavel Identificador, come ]& fol visto, pode ter até 31 caracteres (letras, n(imeros e o caractere "_") @ nao pode iniciar por um ndmero. A declaragao de variaveis em C obede- ce & seguinte forma: TIPO nome da varidvel(,outras variéveish: Podemos ainda declarar e Inicilizar o conteGdo de uma ou mais variaveis: TIPO none da variével = valor da varidvel(, outras varidveisi: Velamos entao como declarar uma varidvel chamada "tempo" do tipo in- teiro de 8 bits sem sinal: unsigned int texpor ou: int tempo) Outro aspecto importante da declaragao de varidveis é o local onde elas 830 declaradas. A importancia do local onde a varldvel fol declarada relacionase direta- meme a acessibilidade ou nao de outras partes do programa a essa varidvel. Isto se denomina regre de escopo da linguagem. Basicamente, uma variavel pode ser declarada em trés pontos distintes do programa: * No corpo principal do programa: as variveis declaradas no corpe prin- cipal do programa (fora de qualquer fungdo, inclusive da fungéo main()} sao chamadas. de globais, porque podem ser acessadas de Qualquer ponto do programa; * Dentro de uma fungio: as varlivels declaradas dentro de uma fungao {incluindo a fungao main()) somente podem ser acessadas de dentro da fungao em que foram declaradas. Isto significa que uma varidvel local somente existe enquanto a fungao esta sendo executada. No momento em que ocorre o retorno da func, as varidveis locais s80 descartadas; * Como um parametro formal de uma fungiio: as varidvels declaradas como pardmetros formais dé uma fungdo sao um tips especial de va- navels locals. Este tépico seré melhor explicado no capitulo 8 quando estudarmos as fungdes da linguagem C. Em seguida temos um pequeno programa que demonstra a diferenca en- tre varlaveis locais e varldveis globais: Exemplo 5.1. us er, finelede <6f427.b> fue Galayielocke4ogcong) uses 18, SOWDT, FUT, HONROWROUT, NCHCLA, NOLYP fuse P cba 9200, xmitePI¥_32, revePIN_B1) Teste de variaveis lecals © globals int womatorior f/ varisvel global wold soma (int velor) € ant center /fvaridvel loca? da tungiia soca somaterio = somatoric * valorr pricté(*A comade 0")3 for (eonte-i; (contac(veloreL})) contar-) prINEE["+$d* conta}; PEOREEI" ah iguil a Sdir\n",comaterial; 1 void main() 1 ane contar #/ verldvel local da tuncao main acmatorio for (conta t } , ‘CORERE2]; canta++) soma (conta | A execugo deste programa no hardware de laboratério proposte gera a seguinte saida na tela do emulador de terminal serial: pore son sone oma fom soma BPR ER PP Poo > OrL oh Squal a 2 142 oh igual = 3 Or1+24) eh igual a 6 Gelededed ch igual a 10 OrleZea+4e5 eh igual @ 25 Osle2s]+4+5+6 oh igual a 2b O-1e2+3+4+506+7 eb igual a 28 DeLee jede516e740 gh igual = 38 Orle2s3i4564740e9 ch igual a 4s Osbedse4 SG 02-9020 oh dmiad mw 55 UrledeaedeseGe Tass Urlededega5e6e7ds Gv1+ds31665+667+8+3420-11+08—83 wh igual a 92 Q6loRedetoSoGePaGededOrddedaeaIe14 eh igual a 108 Goede] +4450G+7eGe9420edIelgeT3e14e15 eh dgual s °} Miereeonirelacioms PIC - Progremagdo em C eH 1GeL1siz-I7r 14405416 eh icval a 196 AND 1C411412099)/ 1448826017 oh igual a 153 S+S-RGedse1ze1 d+ 1de2S+L6ei 7418 eh Lgual a 171 FLOAT +1 Fel 3ad ai G+17+19019 ah igual a 190 Antes de analisarmos o funcionamente do programa, vamos explicar al- Bumas das novas declaragées encontradas nele: No Inicio do programa, encontramos duas declaragdes: fuse delaytclock=4000000) fuga ra2]2theud=19209, xml t=F1N_82, vev=PIN_53) Estas declaragdes so diretivas do compllacior € possuem a ‘seguinte fun- Gao: Acdiretiva delay, conforme j4 dito no capitulo anterior, é utilizada para ine formar ao compilador a velocidade do clock do processador em que sera exe- cutado a programa, A diretiva 18232 6 utilizada para ordenar ao compilador que gere cédigo para _comunicagao serial utillzando uma interface serial assincrona padrio $232, Podemos observar que os parametros da diretiva so: velocidade de co- Municagdo em bps (baud=19200}, pino de saida dos dades transmitidos (amit) & pino de entrada dos dados recebidos (rev), Malores detalhes sobre esta diretiva serao vistos mais adiante neste livro, Podemos veriflear que o programa @ composte de duas. fungdes: A fung4o soma, encarregada de realizar a soma do némero atual ao valor acumulaco até ali, € main, que & a fungdo principal do programa, sendo res- Ponsével pela contagem de 1a 20 a chamada da fungao soma. Podemos ainda constatar a existéncia dos trés tipos basicos de varidvels. no programa anterior: A variavel global “somatorio", encarregada de acumular o valor total da soma dos nimeros. Esta variavel, por estar declarada no como principal do Programa, ou seja, fora de qualquer fungao, pode ser acessada de qualquer ponto do programa, incluinda as fungdes soma & main, Dentro da fungdo soma, encontramos a varidvel "conte" que, em virtude de sua declaragdo dentro da fun¢do soma, & considerada local, isto 6, somen- te pode ser acessada dentro da fungao na qual fol declarada. Também encontramos um outro tipo de varidvel na fungado soma & que multas vezes passa despercebida. Observe a declaracao da fungao: void semafint valoz} ‘Vardveis ¢ Tipos:do Dacos © Podemos fazer duas constatagdes basicas sobre a declaragdo da func3o soma: a primeira é que esta fun¢ao nao retoma nemhum valor, j4 que foi de- clarada como séndo do tipo void. A segunda é que esta fun¢&o possui um pa- rametro formal declarado. A fungdo soma recebe o seu parémetro pela varidvel do tipo inteiro “valor*. Veja que esta varidvel constitul um tipo especial, pois. apesar de ser declarada na fungao soma, efetlvamente comporta-se como uma verlavel global, Finalmente, na fungdo malin encontremos também uma declaragao de va- ridvel: Snt conta: Este comando declara, dentro da fungao main, uma variavel intelra cha- mada conta. Observe que esta também é uma varlavel de escopo local, j& que esta declarada dentro do corpo da fun¢3o principal main. Uma observacao interessante a ser feita & que ambas as funcdes, soma e main, possuem uma variavel local chamada “conta”. Mote, no entanto, que o conteddo destas variaveis 6 diferente. Na pratica, o compilador aloca posigdes distintas de meméria RAM do PIC para acomodar as duas varidveis, mas isto depende da hierarquia de chamadas de fungdo € alguns fetores de otimizagao qué Seréo discutidos oportunamente neste livro. Outra observa¢do opartuna a ser feita: a variavel “somatorio”, por ter sido declarada no corpo principal do programa (ou seja, fora de qualquer fungao), pode ser acessada de qualquer ponto do programa, como pode ser constatado pela andlise da fungdo soma e da funogo main. 5.3.1. Varlaveis Locais Neste momento, ¢ importante obsenvanmos mais detalhadaments o fun- cionamento das varléveis locais na linguagem C, Ha pouco, definimos as variaveis locals como sendo aquelas decleradas ‘dentro do corpo de uma fungdo. Bem, i$s6 nao € inteiramente verdade. De fato, o corpo de uma fungdo é epenas uma espectficac3o de uma de- finizéo mais ampla: varlaveis locals sao aquelas declaradas dentro de um blo- co de cédiga. Isto é importante, pois podemos ter varidvels locals mesmo dentro de blocos de cédigo pertencentes a outros comandos. Veja a exemplo sepuinte: e Microcontroiedores PIC Progeamagio en C Exemplo 5.2 dat x; JJ deolare a varidvel lecal x x= 5; ff etribus o valor § a waridval x if (o2) Ff a0 x moior que 2 ontio € ine yr #) Geelara a warddwel leesl y i ‘0 cédiga snguinte atrilui a valor lide da porta A 4 varidvel yo om soguida conpare esse valor com 3. Ge forem iguals. os pirlos 2a porta B $20 zeredoe ourput_bi0)) se forcm dite- rentes, ¢ colocade na porta B 6 valor igual a x+1 “y LE (ty = Enput at) 93) outpee DOO): alee outpat_bixel); Este programa demonstra alguns dos conceltos abordados neste topico: observe que “y" é uma varlavel de escopo local declarada dentro do bloco da declaragao if. Esta variavel somente existirS durante a execugaéo do bloco de comandos da declaragao if (caso a condigao seja avallada como verdadeira). Observe também que a segunda declaragfo if demonstra uma outra caracteristica da linguagem C que é permitir a atribuigao em uma expressao relacional, No caso, o valor retemado da fungao Input_a() € primeiramente atribuido a varidvel "y", em seguida © valor & comparado a 3. 5.4. Constantes Alam das varidveis, também as constantes de dedos, devide a sua apli- cago, nao poderiam deixar de ser incluidas na linguagem c. Constantes $40 valores (numéricos ou nao) fixos e que no padem ser al- terados pelo programa durante @ ua execugéo. De maneira geral, qualquer tipo de dade pode ser utilizado para definir uma constante, cabendo apenas ao programador representar o valor dela ade- quadamente. Assim, qualquer constante pode ser declarada simplesmente especificando o nome do identificador € 0 seu valor. Veja os exemplos seguin- tes: const vali const val? conse vald conat. vald = const valS = "teste! As constantes sao também utllizadas para impedir que uma fungdo altere um parimetro passado 4 cla. Malores detalhes desta aplicagdo das constan- tes podem ser vistos no capitulo 8, Vardveis © Tipos de Dados So 5.4.1. Cédigos de Barra Invertida Alguns dos caracteres ASCII ndo podem ser inserldos diretamente em uma constante string. Um exemplo claro é o caractere de retomo de carro (co- digo 13 decimal), o caractere de nova linha (eédigo 10 decimal), o caractere de aspas ("), apdstrofo ('), entre outros. © motive pelo qual caca um nao poder ser inserido varia, mas vamos ‘exemplificar o de retorno de carro (que é aquele inseride pela tecla ENTER) e 0 caractere de aspas ("): o primeira no pode ser inserido diretamente pelo te slado, pols 0 retomo de carro é Inserido no cédigo-fente, provecando um efeita indesejado. O segundo, mesmo estando facilmente disponivel no teclado, no Pode ser inserido diretamente na string, porque o compilador ira Interpretélo como um sinal do términa da string. Para inserir estes @ outros caracteres em uma stnng, existem os chama- dos cédigos de barra invertida. Na tabela seguinte encontramos os. cédigos mais comumente utilizadas: Chdigo Caractere Constante Octal yw ‘Constante hexadecimal Nubo (mall) Na Campainha (BEL) Nb Retrocesso (backspace) ‘Mt ‘Tabulagio horizontal (TAB) Unha nova (ling feed) we Tabulagao vertical (vertical TAB) we Avango de farmulario (form feed) Retomo da carro (Retum| | 7 ODn | Aspas Apéstrofo: Barra invertida "\" Tabela 5.3 } Micrucanircladores PAG - Programagic em G 5.4.2. Constantes Binarlas, Hexadecimais e Octals ____ As constantes de bases numéricas diversas da decimal so de suma Im- portincia na programagéo orientada a microcontroladores. A linguagem:C prevé a capacidade de manusear dados numérleos nas ba- $e binaria, octal, decimal ¢ hexadecimal. Para utilizar uma constante de base ‘fhumérica diferente da decimal, podemos utilizar um dos seguintes codigos: Vejamos um exemplo de utilizagéo de constantes numéricas de outras bases: ant volorly valor = 50; ##-atribui 0 f 50 @acinal a variével valor? #7 atribui o «5 hexadeciaal 4 variével valozi #2 atribui o © 5 octal & varidvel valorl valert = OROLMIOOCO; #/ atcibui © velar bindrio OLDIO0GD 3 varddvel valori 5.5. Operadores Toda linguagem de programagao necessita de operadores e nesta maté- ria, podemos dizer que a linguagem C é realmente muito rica. Em C, contamos com operadores aritméticos (adig&o (+), subtragao (-), muitiplicagdo (*), diviséo (/), resto de divisdo (%), incremento (++) e decre- mento (-)), }Ggicos e relacionais (maior (>), menor {<), igual (==), diferente (I=), AND (&&), OR (1/}) @ muitos outros. Maiores detalhes sobre o conjunto de operadores da Iinguagem e o seu funcionamento podem ser vistos no capitulo 6. 5.6. Expressées Expressdes sao elementos formados pela unido de varidveis, constantes @ operadores entre si. De manelra geral as expressées seguem as mesmas. regras gerais das expressdes algébricas em matematica. Vejamos alguns exemplas de expressdes em C: \Varidveis © Tipes da Dados: @ Exemplo 5.3 eusro = valor aebe Renta * Em C, & também possivel a utilizagao de expressées condicionais, con- forme o exemplo a seguir: Exemplo 5.4 fat xy x= 10; y= (x * 5) ¢ 10) #4 Come a condigade ¢ aveliada verdadeira, y serd igual a (1) * 10 = 10 #4 $0 0 eupresuio fosse falgar y = (0) * 10 = 0. Isto € possivel porque em C, as expressies sao avaliadas e resultam sempre em O (falso) ou 1 (verdadeira), Outra caracteristica importante da utilizagao de expressdes em C 6 a au- séncia de verificagao de tipes. Suponha a seguinte expressdo: Exemplo 5.5 SS — 8 EEeee aned int ar shed inte unsigned int3z c; b= 300; = = 1pna0o, anc b Nao é dificil perceber que a varidvel “a, definida como sendo de 8 bits, do dispGe de capacidade 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 linguagens, mas naa em C. ¢ & uma linguagem muito maledvel quanto & construgdo de expressies constituidas de tipos diferentes de dados. A ferramenta que torna esta operagSo possivel é a chamada conversdo de tipos. Assim, no programa anterior, 6 compilador realiza uma conversdo de th fos, convertendo o 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 demonstrade em seguida: eo \icrocceiroledores. PIC - ProgeamarSa em C 95700 = OBDOORED URDDGED! iocoHOL OLLIEIOD ‘Convertido para 8 bits: a6 . gii1o100 No proxime tépico veremos as regras que regem a conversio de tipes nas expressdes em C. 5.7. Conversao de Tipos Sempre que tivermos uma expressdo composta por dados de tipos dife- fentes entre si, seré aplicada a chamada conversao de tipos. As regras de conversio de tipos em C sao basicamente trés: 1) Em uma atribuigao, 0 tipo do dado resultante da expressao & converti- do no tipo de dade da variavel que recebe a atribuigdo; 2) Todos os tipos short Int e char so convertides no seu tipo base Ime dlatamente superior, ou seja, Int; 3) Cada par de operandos de tipos diferentes é convertide no tipo base do tipo superior, o que é também chamado de promogao de tipas. Nas atribuigdes, a conversdo depende basicamente de a varidvel-alvo da atribulgao ser de maior ordem ou nao que o tipo resultante da expressdo. A tabela seguinte representa a forma de conversiio para cada tipo de dade envolvido em uma atribuigao. ‘Tipe da Tipo da Variavel expressia Alva aes char, int, long int | Somente o bit 0 é utilizado; 05 outros bits saa ou Int32 zorades short int O bit 0 do resultado da expresso @ armazenado ne variavel; 06 outros bits siio descartadas, 0 byte LSB da varidvel; assume o resultado da {ong int ou int 32 | cpressio; a parte MSA 6 zerode, ‘Os @ bits menos significativos do resultade da cherou int expresso sao armazenados na varidvel; os outros bits $40 descartados. Tabela 5.5 (Continua) short int char, int, long int ou int32 char ou int Varitwets» Tipos de Dados © ¢ Tipo da Varlavel ‘expressao Alyvo: Os 16 bits menos significativos do resultado da intaZ Fong int expressao $80 armazenados na variavel; 05. demais bits so descartados. © velor da expresso € truncada para © armaze- int32, float namento na variavel float; possivel perda de dados. O bit menas significative da parte inteira do re- = ‘iis sultado da expresséo 6 armazenado na variével. Os 8 bits menos significativos. da parte intelra do float char ou Int resultado da expressdo sio armazenados na varidiwel. OS 16 bits menos significativos da parte inteira bong int do resultado da expressio sho armazenados na varidvel. inta A parte Inteira do resultade da expressdo 6 armazenada na variavel, Se o resultado da expresséa for negative, o re saned unsigned | ccltedo sera msior que 0 médulo do resultado. Se 0 resultado da expresso for maior que 0 unsigned signed extremo de faixa do tipo, o resultado seré negative. Tabela 55 No caso de uma operagdo envolvendo dois tipos diferentes, o tipo de me- hor ordem sera convertido no tipo de maior ordem, conforme esta seqdéncia: Maior Ordem [| ong int owine 26 | a xs Sr z= 1000; exe 2 fo resultado y send igual a 237 decimal No exemple anterior, a expresso "x +z" resulta em um tipo long, que & convertide no mesmo tipo de y (int), provocando a truncagem dos 8 bits mais significativos. Example 5.7 ce} * ay J) © resulted b werd igual a 1721.5 Neste exemplo o compilador avalia as expressdes pela ordem determina. da pelos parénteses € traduzi primelramente a expressiio “e / d”, convertendo a varlavel “d" no tipo Int32. 0 resultado é somaco a varivel "c", sendo esta convertida no tipo Int32, da mesma forma, Em seguida, o Gltimo resultado 6 Multiplicade pela varidvel "a" do tipo float. Isto significa que o resultado ante- fior sera primelramente convertido no tipo float e em seguida multiplicado pela variével "a". Q resultado final € atribuide diretamente a varldvel "b", pois ela € do mesmo tipo (float) que o resultado da expresso, Além da converséo de tipos realizada pelo compllader, o programador pode forgar explicitamente uma expressao a ser de um determinado tipo. Esta operacdo chamase madelagem (ou em inglés CAST) e segue esta forma: (nove_tipe) expreasso Em que “novo_tipo", determina o tipo de dado {dentre os disponiveis em C) no qual a expresséo seguinte sera convertida. De fato, a modelagem do dado constitul-se em uma operagaa, o que faz do casting um tipo de operador unarlo (J4 que envolve apenas 1 operanda). Vejamos um exemplo de utllizagéo da modelagem de dados: suponha que se deseje dividir uma Geterminada varldvel intelra (por exemplo “x") por um outro valor imtelra (2, por exemplo}, mas por algum motivo sela necess4rio que 9 resultado inclua também a parte fracionéria. Se escrevermos simplesmente: xia Varidwvais @ Tipas da Dados r > _@ Note, que pelas regras j4 estudadas, o resultado da expressdo sera tam bém do tlpo inteiro. Assim, o resultado seré também sempre do tipo intelro, Para podermos obter um resultade do tipe float, do modo desejado, poderia- mos escrever, (fiver) ey 2 Um erro muita comum em programagio C é a escrita de uma expressao. como esta: Exemplo 5.8 tong x: int ¥7 y= 10) Key" 200, J/ # vAmiltede em x werd 232 1bt!t Este programa nfo produz o resultado esperado: a multiplicagdo de "y" {inteiro de 8 bits) por 100 (constante inteira de 8 bits) produz outro resultado de 8 bits, que sera ent&o convertido em um némero de 16 bits ¢ armazenado em "x". Para efetuar a operagéo desejada, devemos primeiramente converter a varlavel “y" em 16 bits, em seguida multiplicé-la por 100. Veja como seria: Exemplo 5.9 long x int y) yr x= (org) y * 100; // 9 resultado em ® Bera 1600 Outro erro classico em programagao C é o do exemple 5.10; Exemplo 5.10 long x.y? fi eet = 2 slide dys «oe 4 Q resultads 4a expresefia ocima serh igual a 12 o niio 12,5 com so ¥ = z f #4 poderia esperar Uma vez que as variavels "y" @ "x" $30 de tipos inteiros, a operagdo de divisao também sera inteira, provocando o descarte da parte fracionaria do resto da divisao, e Mcreconteadras PIC Programapia an Para alcangarmos 9 objetive desejado no programa acima, temos de ins- trulr primeiramente o compilador, de que a divisdo { y / x } deve ser realizada no formato de ponto flutuante, veja o exemplo 5.11. Exemple 5.11, long x.y? float a; y= lly xe dy B= 10+ ((fleacr y/ e J: 11-8 resultado da expresniio sera igual a 12,5 5.8. Modificadores de Acesso A linguagem C disponibiliza dois modificadores ou qualificadores de tipo usados para especificar a forma que o compilador utiliza para acessar o con- teddo das varidvels. 0 primeira modificador de tipo ¢ const, que determina ao compilador que @ variavel seja tratada como uma constante, conforme ja visto no item 5.4, O segundo modificador ¢ volatile, utilizado para determinar ao compilador que a@ veriavel por ele modificada pode ter seu conteddo alterado a qualquer tempo, evitando assim que o compilador efetue otimizagdes de codigo que de ‘outra forma poderiam provocar um comportamento errSneo do programa. De maneira geral, o compilador CCS nfo necessita do uso do modificador volatile. 5.9. Modificadores de Armazenamento Os modificadores de armazenamento séo elementos especiais utilizados para controlar a forma coma o compilador ir lidar com o armazenamento da varidvel, Existem quatro modificadores definidos em C padrao: auto, extem, static € register. 0 modificador aute é utilizado para definir 0 Ambito ou escopo da varidvel como local. Nao 6 necessario utilizar esse modificador, porque, por definigado, as varldvels em C possuem escopo local. O modificador extem 6 utillzado para definir variavels extemas ao programa, Isto 6 muito utilizado na criagao de programas grandes e complexos, utilizando diversos médulos separados @ que sGo depois ligados por melo de um programa ‘Varldveis e Tipos de Dados @ especial chamada Jinker. O compllador CCS nao permite varidveis do tipo extem, Oo entante esta continua sendo uma palavra reservada da linguagem. 0 modificador register é utilizado para instruir ao compilador que tente armazenar a varlavel diretamente em um registrador da CPU. Esse modificador no possui efeito na compilador CCS, j4 que todas as varldvels sdo armazena- das em registradores, 0 Gltimo modificador, static, determina ao compilador que a varidvel ocu- para uma posigao permanente na meméria, As variaveis do tipo static funcionam como as varidvels globais no sentl- do de que ndo so destruidas ao témino da execugdo da funcao na qual foram declaradas, e funcionarn como variavels locals no aspecto de que ndo s40 conhecidas fora da fungaa em que foram originalmente declaradas. Além disso, as varivels static sao sempre Inicializadas pelo compilacor com o valor oO. Varidveis static sao utilizacias quando necessitamos manter o valor de uma varlavel local da fungdo entre uma chamada @ outra, o que facillta o tra- balho de criagdo de bibliotecas de funcies. Um exempio de utilizagio de varidveis statie encontra-se em seguida: Exemplo 5.12 clude <16P628 he 1 delay (clock=4cORI00) see LIS, NOMOT, PUT, RORROWMOW! fe F232 (hawse1 9200, ‘sNOMCLE, MOLE j.sede-PIM_B. Few=PIN_ BL) int calcwlaiveidi; // provéeips @3 funeao main) { int conta; for leonianf) contaeSs contarel prinrf(-md -. ealeula()}; Leute {vada} static int valory valor = valor + 10; return (valor); 5.10. Alocacao de Memoria Como ja foi dito, cada ver que declaramos uma varidvel, 0 compilador iré reservar um ou mais enderegos da meméria RAM de forma a armazenar a va- ridvel. @ Micrpoontroladores FIC = Programario em Neste t6pico iremos estudar a forma core séo armazenadas as variaveis na memdria do microcontrolador. ‘Como Ja fol dita, as variavels do tipo inteiro sao armazenadas sempre inl- clando-se da parte menos significatlva (LSB) para a parte mais significativa (MSB). Isto significa que se uma varlavel Intelra de 32 bits contendo o valor 0x12345678 estiver armazenade no enderego 0x20 hexadecimal, teremos a seguinte distribuigao na memoria RAM; Enderego Ox20 O21 Oxe2 | Ox23- Tabela 5.7 No caso das varidvels do tipo float, o formato utillzado 6 0 ponto flutuante adotado pela Microchip. Neste formato, sao ulilizados 4 bytes de meméria, senco dividides da se- Buinte forma: Formato [enor [eee [onsen [ee oe [ aoe Tabela 5.8 Em que: * eb 6 o expoente do nimero somado a 127, s 6 0 bit de sinal e f0, f1 e f2 armazenam a parte fracionaria da ndmero. No caso do formato IEEE 754, y é 0 bit LSB do expoente eb. Observe que o formate padronizado pelo IEEE difere do utilizado pela Mi- crochip e adotado pelos compiladores CCS, Isto ocore por uma questéo de otimizagao, pois o o formate adotado pela Microchip permite uma execugao mais veloz dos céleulos envolvendo dados do tipa ponte flutuante. 5.11. Redefinindo Tipos de Dados A linguagem C prové ainda um comando que permite ao programador de- finir novas nomes para 0s tipos Ge dados existentes, Vrs Tipos da Dads © c Este comando é 0 typedef 0 seu formato Beral é: typedef elpo nove_nomey Vejamos um exemplo de utilizagdo do comando typedef: Exemplo 5.13 typedef float fracas; frorao varievel; // declara uma varidvel do tips fracao (float) 5.12. Exercicios 4) 2) 3) 4) 5) 6) 7) Quais sdo 0s tipos basicos de dados na linguagem C padrao? Qual é a diferenca entre os tipos short Int ¢ int no compilador CCS? Qual é a diferenga entre uma varidvel signed e outra unsigned? ‘Qual 6 a magnitude de armazenamente do tipo long int? Suponha qué o valor -1 @ armazenado em uma varlavel do tipo signed int @ em um determinado ponte do programa €8$a verlavel é atribulda a outra do tipo unsigned Int. Qual é o valor efetivamente armazenado na Ultima variavel? Qual é a diferenca entre uma variavel global e uma static? No programa seguinte, qual o escopo (global/loral) de cada uma das va- fiaveis? int teate; int funcaol {int a, int b) t return ab maint} t int velor: valor #51 tence = funcapdivalor. 1015 3 e@ Micraoantvoladones FHC Prograrsspo om 8) Qual o resultado armazenado na varldvel “y" mo programa seguinte? ant xy) we hs Y= (xees) * 25 9) Indique o resultado armazenado na variével "x" do programa seguinte: int x. yr Jong int t 2 = W124; yegedr weve dr 10) No programa seguinte, qual o valor armazenado em "2"? ant tr long ¥F Hloat 3; ws ilo y= 200) meyer 1:1) Qual a utilidade da modelagem de dados ou typecasting? Capitals) | £ | wn 6 PRUE Operadores Camo ja fol dito, a linguagem C possui uma gama de operadores, sendo pessivelmente uma das linguagens com malor nimero de operadores cispont- vel atualmente. Esta caracteristica 6 um dos pontos positives da linguagem, j4 que C agrega aos operadores comumente encontrados nas linguagens de alto nivel, 08 operadores encontrades freqiientemente em linguagens de balxo nivel como o Assembly. Podemos classificar os operadores da linguagem C em sete categorias Principals: atribuigao, aritméticos, ralacionais, légicos, Iigicos bit a bit, de meméria @ outros, 6.1. Atribuigao A primeira categoria de operadores 6 também a mals utilizada. Em C, o Operador de atribuigao "=" 6 utilizado para atribuir um determinado valor a uma variavel. Um exemple de atribuigdo: x ¥ Podemos verificar no programa anterior duas operegdes de atribuicéo: na primelra, foi atribuido 6 valor 10 varlavel "x", na segunda, fol atribuido o va- for de "x" (que € 10) a variavel "y". Conclui-se entdo que ao final do programa, "y* sera igual a 10. Repare que 2 atribuigdo ¢ sempre avaliada da cireita para a esquerda e nao é possivel realizar uma atribuigaa no sentido inverso. Operecones © 6.2. Aritméticos Sao utilizados para determinar ao compllador que efetue determinada operagdo matematica em relagdo a um ou mals dados; Tabela 6.1 Os operadores de adic¢do, subtragdo, multiplicagio @ diviséo dispensam comentarios. 0 operador % é utilizado para retomar o resto de uma operacao de divisdo inteira. Vejamos um exemplo: 5 / 2 = 2,5 em uma divisdo real, ou 5 / 2 = 4, em uma divisdo intelra, sendo 0 resto igual a 1. Assim, o valor de § /264.e 0 valorde 5% 2 & igual a 1. ‘Os operadores de incremento e decremento sao utilizados para somar 1 {incremento) ou subtrair 1 (decremento) de uma variavel. A forma geral para utilizagdo destes dols Gitimos operadores é: varidvel -+; ou varidvel --1 Ou ainda por meio de uma atribuigao: varsevel_t » variaval_2 ++: ou variavel_t = wariawel2 --; Observe que em ambos os casos, a atribuigao ocorre da seguinte form: 9 valor da variavel "variave:_2* 6 armazenado @M *variavel_1* e apds Issa, o conteddo de "variavel_2* é Incrementads ou dacrementado. No entanto, em C é também possivel eserever: variavel_l = ++ variavel_2; cu varievel_} === variavel_2; } Niceocortroladores PIC» Progmimacio em C Nestes casos, a operagao de incremento/decremento ¢ realizada antes da atribuigao propriamente dita. Vejamos um exempla: Unt x,y. 2e x= or yaxet bere g Neste caso, apés a execugéo dos trés comandos, o valor da varlavel "x" sera Igual a 2, 0 valor da varldvel *y* seré igual 4 0 ¢ o valor da variavel "2" sera igual a 2. Observagdo importante: Nio & possivel utilizar os operadores de Incre- mento ou decremento com varifweis ou tipos de dados complexos, tals coma os tipos ponte fiutuante. Note que ha uma diferenga clara entre escrever "y =x + 1" @ "y= +4x") Ambas produzirio o mesmo resultado em “y", no entanto, no primeira caso, somente a varldvel "y", alvo da atribuigao, € alleraca, Ja no segundo caso, tanto "y", como "x" sao alleradas ! 6.3. Relacionais Sao utilizados em testes condicionals para determinar a relagdo existente entre os dados: ‘Operador Agio > Maior que = Maior ou igual 2 = Menor qué 5", 0 que no presente caso resulta verdadeira, j4 que "x", que vale 10, é maior que 5. Em seguida, procede & avaliaggo da express3o "x < 20", a qual também resulta verdadeira. Finalmente, o compllador verifica o resultade da canjungae (verdadeire E verdadeiro) o qual é verdadeiro, executando assim a atribuigdo seguinte (y= x). Um aspecto importante a ser observado 6 que em C, uma veriavel com va- lor igual a zero, seré avaliada como falga € $e tiver um valor diferente de zero, sera aveliada como verdadelra, Vejamos um outro exemplar Lf (Itente) testeze=) ©} Microcentoladores PIG « Programagéa em © Como podemos perceber, a avaliagao de "teste" sera verdadelra, ja que @ variavel possul valor zero e o teste verifica a negagao da varidvel. Assim, no presente caso, a variavel “teste_2" terminaré com o valor 1. ‘Observagdo importante: Ndo 4 possivel utilizar os operadores Iégicos com s de dados complexos, tais como os tipos ponte fiutuante. 6.5. Logicos Bit a Bit Os aperadores Idgicos bit a bit sao utilizados para realizar operagdes ldg!- cas entre elementos ou varidveis. No entanto, ao contririo dos operadores: légicos simples, os operadores légicos bit a bit podem resultar em um valor da mesma magnitude dos elementos operados. AND (E) NOT (complemento de um} Deslocamento a dircita Deslocamento & esquerda Tabela 6.4 6.5.1, Operadior & (And) A operagdo l4gica AND funciona da mesma forma que 0 operador boolea- no AND, mas com a diferenga de que a operagéo € realizada separadamente para cada bit dos operandos. Vejamos um exemplo: ink vlivai vl = 100) v2 = vl & 18) A operagdo AND representada ocorrerd da seguinte forma: 100 decinal= 01100100 o0001111 Resultado = O0000100 Isto significa que o valor armazenado em "v2" sera igual a 4 decimal. ——__ ini - + @ Podemos perceber que o operador ligico AND & uma excelente forma de desligar um ou mais bits de uma determinada varidvel, j@ que um bit 0 em um dos operandes fard com que o respectivo bit do resultado seja também igual a zero. Imagine que desejemos desligar os bits 5, 6 ¢ 7 de uma varidvel chama- da “porth". A forma de fazer isso poderia ser: abyte port = 6 porth = perth & ObI11000007 6.5.2, Operador | (OR) A operacao OR, tal qual o operador AND, também trabalha de maneira st milar a0 seu equivalente booleano, com a diferen¢a de que também aqui a operagao é realizada para cada bit dos operandos. Vejamos um exemplo: Esta operagdo OR sera realizada da seguinte forma: 20 hexadecimal = 00100000 OR (1) 04 hexadecimal = 00000100 Resultado= 00100100 Como podemos perceber, 0 resultad6 armazenado em "v2" serd igual a 24 hexadecimal, e se analisarmos a operagdo, poderemos concluir que a ope- ragao OR constitul uma excelente forma de ligar bits de uma variavel, ja que os bits em um dos operandes permanecerao sempre ativados no resultado. 6.5.3. Operador * (XOR) A-XOR (exclusivamente OU) consiste em uma operapao ldgica entre dois, ha qual o resultado somente sera verdadeiro (nivel l6gico 1) se umn & somente um deles for verdadelro (nivel 1), Ou seja, Cas0 a5 operandos sejam iguais (0, 0.ou 4, 1}, 0 resultado sera falso (nivel 0}. Operacores XOR so muito utilizados em fungdes de comparagia de valo- res: se os bits das operandos sao |guals, o resultado é 0; se forem diferentes, o resultado é 1. Vejamos um exemplo do funcionamento do operador XOR em C Ant ays x= 10 yur 7 99) eo Microcorimledores PIC - Programagiio em C Vejamos a execugdo da operagdo XOR: 100 decimal= O1100100 XOR (*) 99 dec o1100011 Resultado ooo0oi11i Podemos observer que apenas os bits diferentes entre os dois operandos resultaram em um valor 1. Os bits iguais resultaram em um valor 0. Se os Operandos fassem iguais, o resultado seria igual a zero. 6.5.4. Operador ~ (NOT) OQ NOT atua como operador de negagao, ou em aritmética binaria o com plemento de um, Isto significa que o Operador NOT inverte o estado de cada bit do operando especificado. Vejamos um exemplo: Ant sey: Yong a,b; ze x 4 Vejamos a operagao do operador de camplemento: idecimal= QDOOO0001 & bits, varldvel x) Resultado= 11111110 ( 8 bits, variavel y) idecimal= DOOO0000000000001 [16 bits, varidvel a) Resultado= LLL2111111111110 (16 bits, variavel b) Concluimos entéo que a variavel "x", de 8 bits, terminara o programa com © complemento do valor 1, ou seja, 254, Ja a variavel "b" seré atribuido 0 valor da negagdo de "a", de 16 bits, o Que resulta no valor 65534_ 6.5.5. Operadores de Deslocamento << E >> Finalmente, temos ainda os operadores de deslocamento de bits & es- querda e € direita. O formato geral de uso destes operadores é: valar >> nGmero de bits a deslocar a direita ou + valor << ndmero de bits a deslocar 4 esquerda Oparadores Vejamos um pequend programa para demonstrar o funcionamento dos Operacores de deslocamento: yor x de 2s Ramer li 0 funcionamento dos operadores de desiocamento é 0 seguinte: Primeiramente € atribuido & varidvel "y" 0 deslocamento de dois bits & esquerda da variavel "x". Vejamos o funcionamento desta operagao: 10 decimal= 00001010 << 00010100 << Resultado— 00101000 Observe que foram realizadas duas operagdes de deslocamento, sendo que 6 primeiro desiocamento resultou em 00010100 bindrio (20 decimal). Em seguida @ realizado outro deslocamento, que resulta em 00101000 binaria (40 decimal), sendo este valor atribuide & variavel "y". A préxima linha atribui & varlével "2" o valor de "x" ceslocado um bit @ di- relta. Yejamos o seu funcionamento: 10 decimal= 06001010 >> z= 00000101 Percebemos que o conteddo da variavel "x" (00001010 binario ov 10 de- cimal) é deslocado um bit 4 direita, resultando em 60000101 bindrio ou 5 decimal, sendo este valor atribuido a variavel “2”. Com base nestas operacbes podemos verificar que no operacor de deslo- camento & esquerda, cada bit deslocado equivale a multiplicar o primelro ope- tando por 2. Ja no operador de deslocamento 4 cireita, eqUivale a divi operande por 2. Observe que cada operagdo de rotagdo é traduzida pelo compilador em uma instrugZo assembly de ratagao de bits (RLF ou RRF, conforme © caso}. ‘Observa¢io importante: Nao é possivel utilizar 03 operadores légicos bit a bit com variéveis ou tipos de dados complexos, tals como os tipos ponto. fiutuante. 6 Microantrolaccees PIC - Progranrario em C 6.6. Meméria Qs operadores de memdéria, também chamados de operadores de pontei- fas, $30 elementos de grande importancia na linguagem C. De fate, as pontel- ros so considerados um dos pilares da linguagem C, pois permitem 0 acesso direto a qualquer enderego de meméria do sistema. Existem dois operadores. ‘complementares para o acesso & meméria: ‘Operador Agia & Enderego do operando: * Contetide do enderego apontado pelo aperanda Tabela 6.5 6.6.1. Operador & 0 & 6 um operador unério utilizado para retomar a enderego de memoria do seu operando. Isto significa que se escrevermos: enderees_a = gay Teremos que a variavel “endereco_a” conteré o enderego em que esta armazenada a variavel “a". 6.6.2. Operador * Jao * & um operador unério utillzado para retomar o conteddo da posigao. de memdria enderegada pelo operando que o segue. Vejamos outro exempto: a = tenderera_ar © que fara com que o valor armazenado no local apontado pela variavel *endereco_a® seja atrinuido a varidvel "a". Vela em seguida um pequeno exemplo da utilizagao de pontelros: Exemplo 6.1 finelude <16€622.h> fuse delay ictock=4000060) A Cuses HS,NOWOT, PUT, ROBROWIUT, MOMCLE, NOLVE fuse ra232 Ubaude19209 parity, xd t=PIN_A2, revePTN_AL} int ‘endereco,x, ys pain { xe By

Você também pode gostar