Você está na página 1de 360
Microcontroladores PIC Programagao em C Microcontroladores PIC - Programagdo em C eo Seja Nosso Parceiro no Combate a Cépia llegal A copia llegal 6 crime. Ao efetud-la, 0 infrator estaré cometendo um grave erro, que ¢ inibir a produgio de obras literdrias, prejudicando profissionais que sero atingidos pelo crime praticado. Junte-se a nés nesta corrente contra a pirataria. Diga no a cépia ilegal Seu Cadastro E Muito Importante para Nos ‘Ao preencher @ remeter a ficha de cadastro constante no final desta publicagaio, vocé passard a receber, automaticamente, informagdes sobre nossos langamentos em sua area do proferéncia. Cojthecendo melhor nossos leitores @ suas preferéncias, vamos produzir titulos que aten- dam suas necessidades. Obrigado pela sua escolha. Fale Conosco! Eventuais problemas referentes ao contetido deste livro seréo encaminhados ao(s) respectivo(s) autor(es) para esclarecimento, excetuando-se as davidas que dizem respeito a pacotes de softwares, as quals sugerimos que sejam encaminhadas aos distribuidores ¢ revendedores desses produtos, que esto habilitados a prestar todos os esclarecimentos. Os problemas s6 podem ser enviados por: 1, E-mail: producao@erica.com.br 2. Fax: (11) 6197.4060 3. Carta: Rua Sao Gil, 159 - Tatuapé - CEP 03401-030 - Sao Paulo - SP e Microcontroladores PIC - Programagéo em C —— a Fabio Pereira Microcontroladores PIC Programagao em C Editora Erica Ltda. 2003 - 2* Edigaio Consetho Editorial: Diretor Editorial: Antonio Marco Vicari Cipelli Diretor Comercial: Paulo Roberto Alves Diretor de Publicidade: Waldir Joao Sandrini Capa: Mauricio S. de Franga Editoragao: Rosana Ap. Alves dos Santos Revisdo Intema: Erica Regina Pagano Revis&o Gramatical: Marlene Teresa Santin Alves Desenhos: Pedro Paulo V. Herruzo Flavio Eugénio de Lima Coordenagao ¢ Revisao: Rosana Arruda da Silva Microcontroladores PIC - Programagéo em C @ Copyright © 2003 da Editora Erica Lida. Dados Internacionals de Cataloga¢ao na Publicagao (CIP) (Camara Brasileira do Livro, SP, Brasil) Pereira, Fabio, 1974- __ Microcontroladores PIC: Programacéo em C / Fabio Pereira. -- Sao Paulo: Erica, 2003. Bibliogratia. ISBN 85-7194-935-2 4. C (Linguagem de programacao para computadores) 2. Microcontroladores |. Titulo. 02-6151 CDD-005.133 indices para catdlogo sistematico 1. C: Linguagem de programagdo: Aplicagées com microcontroladores PIC: Computadores: Processamento de dados 005.133, Todos os direitos reservados. Proibida a reprodugao total ou parcial, por qualquer meio ou processo, especialmente por sistemas gréficos, microfiimicos, fotogréficos, reprogréfi- cos, fonogrdticos, videograticos, internet, e-books. Vedada a memorizagéio e/ou recupera- 40 total ou parcial em qualquer sistema de processamento de dados e a incluso de qualquer parte da obra em qualquer programa juscibemético. Essas proibig5es aplicam-se também as caracteristicas gréficas da obra e @ sua editoragao. A violagéo dos direitos autorais 6 punivel como crime (art. 184 @ parégratos, do Cédigo Penal, ct. Lei n* 6.895, de 17.12.80) com pena de priséo e multa, conjuntamente com busca e apreensdo e inde- nizagdes diversas (artigos 102, 103 pardgrato tinico, 104, 105, 106 e 107 itens 1, 2e 3da Lei n* 9.610, de 19/06/98, Lei dos Direitos Autorais). © Autor @ a Editora acreditam que todas as informagdes aqui apresentadas esto corretas @ podem ser utilizadas para qualquer fim legal. Entretanto, ndo existe qualquer garantia, explicita ou implicita, de que 0 uso de tais informagées conduzira sempre ao resultado desejado. Os nomes de sites e empresas, porventura mencionados, foram utilizados apenas para ilustrar os exemplos, no tendo vinculo nenhum com o livro, nao garantindo a sua existéncia nem divulgagao, Eventuais erratas estar&o disponiveis no site da Editora Erica para download. “Algumas imagens utilizadas neste livro foram obtidas a partir do CorelDRAW 7, 8 e 9 e da Colegao do MasterClips/ MasterPhotos© da IMSI, 1985 Francisco Blvd. East, San Rafael, CA 94901-5506, USA." Editora Erica Ltda. Rua Sao Gil, 159 - Tatuapé CEP: 03401-030 - Sao Paulo - SP Fone: (11) 295-3066 - Fax: (11) 6197-4060 www.editoraerica.com.br Microcontroladores PIC - Programagéo em C de Hardware e de Software Hardware: + Microcomputador Pentium 200 MHz ou superior; * 16 MB de memoria RAM; * 50 Mbytes livres de HD; + Acesso a Internet. Software: * Sistema operacional Windows 95 ou superior; + Compilador CCS, PCWH, PCM, PCH ou PCW; +. Ambiente MPLAB; = IC-PROG ou um software de programagao. Sobre o Autor Nascido em Sao Francisco do Sul, Fabio Pereira € formado em direito e em eletrénica, e reside em Joinvile - SC. Atua desde 0 inicio da década de 90 na area de software e hardware. Desenvolveu diversos sistemas em plataformas, como: PCs, microprocessado- res Z-80, 8086, 80386, etc. e microcontroladores 8051 e PICs. E autor do livro Microcontroladores PIC: Técnicas Avancadas. Além de atuar na area de projetos industriais e automotivos (na qual ja desenvolveu diversos projetos comerciais, incluindo tacémetros digitais de alta precisdo e equipamentos de controle e medi¢ao industrial), leciona as discipli- nas de linguagem C e microcontroladores no SENAI-SC, no qual também auxilia no desenvolvimento de projetos didaticos envolvendo microcontroladores. E também sécio da SCtec, empresa que atua na area de desenvolvimento de projetos e sistemas de automagao industrial (www.sctec.com.br). Microcontroladores PIC - Programagao em C esposa Josi, aos meus pais e 4 minha avd. Tu me ensinards 0 caminho da vida; em tua presenga ha plenitude de alegria, a tua direita delicias eternas. $146, 14 Microcontroladores PIC - Programagto em C Agradecimentos Agradeco a todos aqueles que colaboraram direta ou indiretamente pat que este livro pudesse ser escrito, e em especial: * AAndré Rabner, da Artimar, pelas amostras e material de consulta; * ACCS pela cépia do compilador PCWH e pelo suporte fornecido; * Ao pessoal da Editora Erica por acreditar no meu trabalho; + Aos meus leitores e criticos que contribuem de uma forma ou de o1 para a melhoria dos meus livros. 6 Microcontroladores PIC - Programacéo em C is literaturas sobre a linguagem C disponiveis no mercado, Procuramos um livro que seja voltado para as aplicacdes com S, este universo reduz-se drasticamente. ‘@tender a esta lacuna que surgiu este livro, fruto de um extenso juisa e com uma abordagem simples e didatica. dos principios gerais de programacao, até os detalhes mais pro- (os da linguagem C, sempre enfatizando os microcontrolado- diversos exemplos e exercicios. apresentadas as diretivas e fungdes internas dos compilado- mapas de memoria dos PICs utilizados no livro (12F675, 16F628, 177, 18F252 e 18F452) e os conjuntos de instrugdes assembly ‘bits. ‘Gisso, foi dedicado um capitulo do livro ao estudo de técnicas de , abrangendo otimizagdo de cédigo, interrup¢gées, interfaceamento ‘© displays LCD), comunicagao serial (assincrona, SPI, I?C, 1-Wire, visao geral sobre CAN, LIN, etc.), geragao de PWM, medicdo de com o chip Dallas 18S20, conversao analégico/digital, dentre de uma obra indispens4vel a todos aqueles que desejam tanto @ linguagem C em maior profundidade, quanto a sua aplicagao aos jadores € pequenos sistemas em geral. Microcontroladores PIC - Programagéo em C @ Sobre o Material Disponivel na Internet O material disponivel na Internet contém os arquivos de exemplo e biblio- tecas apresentados no capitulo 12 e arquivos de cabegalho com as definigdes de registradores utilizadas nos programas. Para utiliz@-los, 6 necessario possuir instalados em sua maquina 0 compi- lador PCWH (para utilizar os PICs das séries 12,16 e 18), o PCW (para utilizar os PICs das séries 12 e 16), ou ainda os compiladores PCM ou PCH, além do ambiente MPLAB (para realizacdo de simulagdes) e um software de programa- ¢&o (no caso do autor, o IC-PROG). Arquivos.EXE 48 KB Procedimento para Download Acesse 0 site da Editora Erica Ltda.: www.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 livro desejado, digitando palavras-chaves (nome do livro ou do autor). Aparecerado os dados do livro e 0 arquivo para download, entéo dé um clique sobre o arquivo executavel que sera transferido. 2. Por meio do botao "Download". Na pagina principal do site, clique no item "Download". Sera exibido um campo, no qual devem ser digit das palavras-chaves (nome do livro ou do autor). Serao exibidos o nome do livro e 0 arquivo para download. Dé um clique sobre o arquivo executavel que sera transferido. Procedimento para Descompactacao Primeiro passo: apés ter transferido o arquivo, verifique o diretério em que se encontra e dé um duplo-clique sobre o arquivo. Sera exibida uma tela do. programa WINZIP SELF-EXTRACTOR que conduzira vocé ao processo de des- compactacao. Abaixo do Unzip To Folder, existe um campo que indica o desti- no do arquivo que sera copiado para o disco rigido do seu computador. C:\Microcontroladores PIC Segundo passo: prossiga com a instalagao, clicando no botao Unzip, 0 qual se encarrega de descompactar os arquivos. Logo abaixo dessa tela, apa- rece a barra de status a qual monitora o processo para que vocé acompanhe. Apés 0 término, outra tela de informagao surgira, indicando que o arquivo foi descompactado com sucesso e esta no diretério criado. Para sair dessa tela, clique no botao OK. Para finalizar 0 programa WINZIP SELF-EXTRACTOR, clique no botao Close. Microcontroladores PIC - Programagao em C indice Analitico Capitulo 1 - Introdugao..... 1.1. Um Pouco de Histéria 1.2. Programago de PICs em C. 1.3. Mensagem aos Programadores Pascal .. 4.4. Convengdes Deste Livro «.........-.. 1.5. Requisitos de Hardware e Software 16 18 Capitulo 2 - Principios de Programagao.... 2.1. Fluxogramas .... 2.2. Algebra Booleana 2.3. Variaveis e Dados . 2.4. Operadores .. 2.5. Exercicios.. Capitulo 3 - Compilador CCS C .... 3.1. Ambiente Integrado de Desenvolvimento (IDE). 3.2. Integragao com o MPLAB.... Capitulo 4 - Introdugao a Linguagem C. 47 4.1. Palavras Reservadas da Linguagem 53 4.2. Identificadores 53 4.3. Comandos e Funcdes Importantes . 54 4.3.1. Comando If... 54 4.3.2. Comando While 4.3.3. Fungao Printf . Fungo GETC Capitulo 5 - Variaveis e Tipos de Dados 5.1. Modificadores de Tipo ..... 5.2. Outros Tipos Especificos do Compilador CCS C 5.3. Declaragao de Variéveis 5.3.1, Variaveis Locai 5.4. Constantes... 5.4.1. Cédigos de Barra Invertida. 5.4.2. Constantes Binarias, Hexadecimais e Octais. 67 5.5. Operadores 67 5.6. Expressdes. .67 5.7. Conversao de Tipo: .69 5.8. Modificadores de Acesso. 5.9. Modificadores de Armazenamento 5.10. Alocagao de Memo6ri 5.11. Redefinindo Tipos de Dados 5.12. Exercicios.. ficrocontroladores PIC - Programagao em C oe 6.3. Relacionais 6.4. Légicos Booleanos.. 6.5. Légicos Bit a Bit ..... 6.5.1. Operador & (And) 6.5.2. Operador | (OR). 6.5.3. Operador * (KOR) 6.5.4. Operador ~ (NOT) 6.5.5. Operadores de Deslocamento << E >> 6.6. Meméria 6.6.1. Operador &. 6.6.2. Operador * 6.7. Outros Operadores 6.7.1. Operador? .... 6.7.2. Operador Virgul: 6.7.3. Operador Ponto 6.7.4. Operador -> 6.7.5. Operador de Modelagem de Tipo. 6.7.6. Operador Sizeof... 6.8. Associagao de Operadores 6.9. Precedéncia dos Operadores 6.10. Exercicios. Capitulo 7 - Declaragées de Controle. 7.1. Comando If 7.2. Comando Switch. 7.2.1. Clausula Break 7.3. Estruturas de Repetigao 7.3.1, Lago For.. 7.3.2. Lago While 7.3.3. Lago Do-While. 7.4. Comando Goto 7.5. Exercicios. Capitulo 8 - Tipos e Dados Avancados . 8.1. Ponteiros ... 8.1.1. Operagdes com Ponteiros .. 8.1.2. Tépicos Importantes Sobre Ponteiros 8.2. Matrizes de Dados... 8.2.1. Matrizes Multidimensionais .. 8.2.2. Strings de Caracteres.. 8.2.3. Matrizes e Ponteiros 8.3. Estruturas de Dados... 8. . Operagdes com Estruturas eo Microcontroladores PIC - Programagéo em C 8.3.2. Ponteiros para Estruturas 8.3.3. Campos de Bit 8.4. Unides ... 8.5. Enumeragée: 8.6. Streams... 8.7. Exercicios.... Capitulo 9 - Fungoes .... 9.1, Forma Geral..... 9.2. Regras de Escopo 9.3. Passagem de Parametros.... 9.4. Matrizes com Argumentos de uma Fungo .. 9.5. Estruturas como Argumentos de uma Fungao. 9.6, Funcdes com NGmero de Parametros Variavel 9.7. Retorno de Valores .... eae 9.8. Retorno de Valores em Funcdes Assembly .. 9.9. Prototipos de Fungo... 9.10. Recursividade 9.11. Exercicios.... Capitulo 10 - Diretivas do Compilador ....... Capitulo 14 - Fungdes do Compilador. 11.1, Matematicas .2. Manipulagao de Caracteres . Meméria.. 11.4. Atraso .. 41.5. Manipulagdo de Bit / Byte Entrada / Saida Analégicas.. Manipulagao de Timers .9. Comparagao / Captura / PWM 11.10. Manipulacaéo da EEPROM Interna .. 11.11. Controle do Processador .... 11.12. Porta Paralela Escrava.... 11.13. Comunicag&o Serial Assincrona 14.14. Comunicagao IC... 11.15. Comunicagao SPI Capitulo 12 - Tépicos Avangados .. 12.1. Escrevendo Cédigo Eficiente em C... 12.1.1. Utilizagao de Variaveis Booleanas 12.1.2. Testes Condicionais 12.1.3. Rotinas Matematicas. 12.1.4, Utilizando Assembly no Cédigo C.., Microcontroladores PIC - Programago em C o 12.2. Entrada e Saida em C . .2.4, Outra Modalidade de Acesso .. 12.3. Interrupgdes em C.. 12.3.1. Tratamento Automatica” 12.3.2. Tratamento "Manual". 12.3.3. Priorizagao de Interrupgées. 12.4, Utilizando os Timers Internos. 12.4.1. Timer O 12. 3. Obtendo Mais Precisdo dos Timers . 12.5. Comunicando-se com o PIC 12.5.1. Comunicagao Serial Assincrona . Protocolo SPI.. . Protocolo I?C . Protocolo 1-WIRE ie LEN. eres . Protocolo CAN . Interfaces Elétricas 12.6. Leitura de Tecias e de Teclado: 12.7. Apresentagao em Display..... 12.7.1. Displays LED de Sete Segmentos 12.7.2. Médulo LCD. 12.8, Leitura de Tensdes Analégicas com o PIC. 12.8.1. Conversor A/D Interno.. 12.8.2. Conversor a Delta - sane 12.9. Médulo PWM... manenevens Apéndice A - Tabela ASCII... Apéndice B - Fungées C - Referéncia Rapida.. Apéndice C - Instrugées PIC...... Apéndice D - Mapas de Memoria Apéndice E - Respostas dos Exercicios..... Indice Remissivo ..........s:csssssesssssessesseeseens Referéncias Bibliograficas.... e Microconirotadores PIC - Programagaio em C Introdugao i de programas para microcontroladores e microprocessadores uma tarefa desgastante 4 medida que aumenta a complexidade da desenvolvida. ros dispositivos programaveis tinham seus programas escritos S chamados cédigos de maquina, que consistiam normalmente em que eram inseridos por meio de um dispositivo de entrada de leitora de cartées, fitas perfuradas ou discos magnéticos) para executados pela maquina. rio dizer que a programacao em cédigo de maquina era ex- complexa, 0 que implicava em um elevado custo, além de muito 0 desenvolvimento de uma aplicacao. da necessidade crescente de programacao de sistemas, foi natural Ato de uma nova forma de programa¢gao de sistemas. Esta foi a ori- gem Assembly. consiste em uma forma alternativa de representagao dos cédi- ina usando mnemonicos, ou seja, abreviagdes de termos usuais @ operagao efetuada pelo comando em codigo de maquina. A ‘dos mneménicos em cédigos binarios executaveis pela maquina é tipo de programa chamado Assembler (montador). m, em vez de escrevermos o comando em codigo de maquina 110001100, o programador poderia simplesmente utilizar 0 coman- ‘Ox8C para realizar a mesma tarefa. ‘Givida nenhuma, a representagao em Assembly da instrugao € muito aples do que aquela utilizando cédigo de maquina, no entanto a utili- embly nado resolveu todos os problemas dos programadores. Assembly € de baixo nivel, ou seja, nado possui nenhum co- 4o ou fungao além daqueles definidos no conjunto de instru- Introdugéo goes do processador utilizado. Isto implica em um trabalho extra do programa- dor para desenvolver rotinas e operagao que nao fazem parte do conjunto de instrugdes do processador, produzindo, por conseguinte, programas muito extensos e complexos com um fluxo muitas vezes dificil de ser seguido. E ai que entram as chamadas linguagens de alto nivel, Elas sao criadas para permitir a programacao utilizando comandos de alto nivel e que s&o0 pos- teriormente traduzidos para a linguagem de baixo nivel (assembly ou direta- mente para codigo de maquina) do processador utilizado. 1.1. Um Pouco de Historia Como ja vimos, as linguagens de baixo nivel, surgidas praticamente junto com a era dos computadores digitais, possuem diversos aspectos negativos, como a complexidade, falta de compatibilidade entre diferentes sistemas, pouca legibilidade. A necessidade de uma abordagem mais concisa e simplificada para co- mandar computadores surgiu naturalmente com a evolugao e utilizagao dos computadores digitais. Essa abordagem simplificada, mais préxima da forma humana de pensamento, € chamada de linguagem de alto nivel. A primeira linguagem de alto nivel com real aceitaco pela comunidade de programadores foi FORTRAN (abreviagao de FORmula TRANsiator, ou tradutor de férmulas), uma linguagem voltada para a analise e resolugao de problemas mateméaticos criada na metade da década de 50, por pesquisadores da IBM. Em seguida vieram linguagens como COBOL (abreviagao de COmmon Business Oriented Language, ou linguagem comum para aplicagdes comer- ciais) em 1959, voltada para o desenvolvimento de aplicagdes comerciais, ALGOL (ALGOrithmic Language, ou linguagem algoritmica) em 1960, linguagem de programagao genérica e poderosa que originou diversas outras linguagens de alto nivel como PASCAL e C. A linguagem C, por sua vez, foi criada em 1972, por Dennis Ritchie, da Bell Laboratories, e consiste, na realidade, em uma linguagem de nivel inter- mediario entre o Assembly e as linguagens de alto nivel. E uma linguagem de programagao genérica desenvolvida para ser tao efi- ciente e rapida quanto a linguagem Assembly e tao estruturada e légica quanto as linguagens de alto nivel (PASCAL, JAVA, etc.). Suas origens s&o atribuidas a trés linguagens de programacao: * ALGOL; * BCPL (Basic Combined Programming Language: linguagem de progra- magao basica combinada) - derivada da linguagem CPL (que, por sua oe Mioroconiroladores PIC - Programagiio em C vez, foi derivada da ALGOL), foi desenvolvida em 1969, e alia a estru- tura da ALGOL a eficiéncia do Assembly, no entanto BCPL era uma lin- guagem demasiado complexa e relativamente limitada, razao pela qual nao teve éxito; 8: linguagem desenvolvida por Ken Thompson da Bell Laboratories, ‘em 1970. Baseada na linguagem CPL, B foi uma tentativa de simplifi- car e facilitar a linguagem CPL, no entanto também a B nao obteve éxito devido as sérias limitagdes que impunha ao programador. © desenvolvimento do C, nao existiam linguagens de programacgao de adequadas 4 tarefa de criacao de sistemas operacionais (programas is utilizados para o controle genérico de um computador) e outros de baixo nivel, restando aos desenvolvedores utilizar 0 Assembly execucao destas tarefas. entanto, o Assembly apresenta prés e contras em sua utilizagao. Ve- @iguns deles: Eficiéncia: devido a proximidade com o hardware da maquina, o Assembly € sem divida uma linguagem extremamente eficiente (des- de que 0 programador saiba o que esta fazendo !); Velocidade: devido & sua grande eficiéncia, os programas em Assembly sao também muito mais raépidos que os criados em outras linguagens. Complexidade: o Assembly necessita que 0 programador possua um profundo conhecimento do hardware utilizado. Além disso, somente stGo disponiveis os comandos do processador utilizado. Qualquer operacao mais complexa deve ser traduzida em um conjunto de co- mandos Assembly; Portabilidade: programas Assembly, que pela sua natureza nao sao portaveis. Isto significa que para utilizar um programa Assembly de um sistema em outro diferente, o programador deve executar a traducao completa do programa para o sistema de destino. principalmente a partir das necessidades de reescrita do sistema ope- UNIX (que até entao era escrito em Assembly) que surgiu a linguagem fato, a implementacao da linguagem € tao poderosa que C foi a esco- © desenvolvimento de outros sistemas operacionais além do UNIX, WINDOWS e€ 0 LINUX. Introdugdo @ Assim como outras linguagens de alto nivel, C utiliza a filosofia de pro- gramacao estruturada, ou seja, os programas sao divididos em médulos ou estruturas (que em C sao chamadas de funcdes) independentes entre si e com 0 objetivo de realizar determinada tarefa. Desta forma, a programagao estruturada permite uma construgéo mais simples e clara do software de aplicacao, 0 que permite a criagao de progra- mas de maior complexidade (quando comparada a outras linguagens nao es- truturadas como Assembly ou BASIC). 1.2. Programagao de PICs em C A utilizagao de C para a programacao de microcontroladores com os PICs parece uma escolha natural e realmente é. Atualmente, a maioria dos microcontroladores disponiveis no mercado con- tam com compiladores de linguagem C para o desenvolvimento de software. O uso de C permite a construg&o de programas e aplicagdes muito mais complexas do que seria viavel utilizando apenas o Assembly. Além disso, 0 desenvolvimento em C permite uma grande velocidade na criacéo de novos projetos, devido as facilidades de programacao oferecidas pela linguagem e também 4 sua portabilidade, o que permite adaptar progra- mas de um sistema para outro com um minimo esforco. Outro aspecto favoravel da utilizagdo da linguagem C é a sua eficiéncia. Eficiéncia no jargao dos compiladores € a medida do grau de inteligéncia com que o compilador traduz um programa em C para o cédigo de maquina. Quanto menor e mais rapido o cédigo gerado, maior sera a eficiéncia da lin- guagem e do compilador. Conforme ja dissemos, C, devido a sua proximidade com o hardware e o Assembly, & uma linguagem extremamente eficiente. De fato, C é considerada como a linguagem de alto nivel mais eficiente atualmente dispontvel. Repare que 0 aspecto eficiéncia € realmente muito importante quando tra- tamos de microcontroladores cujos recursos sao tao limitados como nos PICs, afinal, quando dispomos de apenas 512 palavras de memoria de programa e 25 bytes de RAM (como no PIC12C508 e 16C54), é imprescindivel que se economize memoria! Além disso, a utilizagéo de uma linguagem de alto nivel como C permite que 0 programador preocupe-se mais com a programagao da aplicacdo em si, ja que o compilador assume para si tarefas como o controle e localizag&o das variaéveis, operagdes mateméaticas e légicas, verificagdo de bancos de memé- ria, etc. eo Microcontroladores PIC - Programagéo em C 1.3. Mensagem aos Programadores Pascal Alguns dos leitores deste livro, assim como o autor, podem Ter expe- riéncia de programacao com outras linguagens como BASIC, Pascal, etc. Especificamente em relacéo a linguagem Pascal, acreditamos que o aprendizado de C sera feito sem maiores problemas. De fato, C e Pascal sao linguagens muito parecidas, sendo as principais diferengas: * Bloco de comandos: em Pascal, um bloco de comandos é delimitado pelas palavras begin e end, em C pelos caracteres { e }; * O operador de atribuigao em Pascal é o:=, em C 6 apenas =; * 0 operador relacional de igualdade em Pascal é 0 =, em C 60 * Em Pascal, temos as fungdes (function) e procedimentos (procedure), sendo que um procedimento pode ser interpretado como uma fun¢gao que nao retorna valores. Em C, temos apenas as fungdes, que nao re- cebem identificador especial e podem ou nao retornar resultados; * Pascal € uma linguagem mais conservadora e rigida com uma forte checagem de tipos e variaveis, 0 que restringe em muitos 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 programagao; * 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 mais agradavel que C. Estas sao apenas algumas das diferengas existentes entre C e Pascal. De qualquer forma, o leitor podera, por si mesmo, verificar as semelhancgas e diferencas existentes entre a linguagem C e as demais linguagens existentes na atualidade. 1.4. Convengoes Deste Livro Antes de iniciar os estudos sobre o compilador C, € necessario esclarecer ao leitor as convengdes adotadas neste livro. Os termos em lingua inglesa seréo sempre escritos em caracteres itali- cos. As referéncias a nomes de funcdes e palavras reservadas da linguagem C serao sempre grafadas em negrito. Introdug © Os operandos, termos ou parametros opcionais de uma declaragao esta- rao sempre grafados em italico. 1.5. Requisitos de Hardware e Software Os programas demonstrados neste livro foram testados com a versao 3.127 do compilador CCS e a versao 5.7 do ambiente integrado MPLAB. Os exemplos didaticos dos capitulos 2 a 9, em sua maioria, foram escri- tos para utilizar 0 hardware minimo proposto nas figuras 1.1 e 1.2. Ich GND* Figura 1.2 E possivel utilizar o oscilador interno disponivel nos PICs 16F62x, mas devido ao fato de os mesmos nao possufrem uma calibragdo confidvel, opta- mos por utilizar um cristal externo, ja que as rotinas de comunicagao serial so muito afetadas pela imprecisao do clock. 6 Microcontroladores PIC - Programagéo em C Alguns dos exemplos foram projetados para utilizar o circuito da figura Figura 1.3 Alguns dos exemplos do capitulo 12 podem ser implementados direta- mente na placa laboratério PIC Aplicagées Il da Symphony. Os softwares programadores foram o IC-PROG e o EPICWIN, utilizados respectivamente com os programadores JDM e PIC Aplicagées Il. Introdugéo 8 Anotagdes e Microcontroladores PIC - Programago em C Antes de iniciar o estudo da linguagem C propriamente dita, faz-se neces- sario relembrar os conceitos basicos de programacao de sistemas. Neste ca- pitulo vamos realizar um breve estudo sobre temas como Algebra booleana, algoritmos e outros principios importantes na programacao de sistemas. Podemos dizer que programagao, consiste na tradugao do pensamento légico necessario para o cumprimento de determinada tarefa, em uma se- qiléncia de comandos que podem ser interpretados € executados por uma maquina. Esta afirmagao denota, desde ja, a idéia de que um programa é€ fruto do ordenamento légico e traduzido do raciocinio humano. De fato, a tarefa de programacao constitui-se basicamente num processo de identificagao e solugdo de problemas. Para isso 0 programador utiliza-se de um conjunto de procedimentos genéricos: 1) Exposi¢ao do problema: o programador deve descrever detalhada- mente o problema a ser resolvido pelo programa; 2°) Andlise da solugao: sendo conhecido o problema, o programador deve elaborar a ou as solugdes que melhor resolvem o problema em questdo; 3°) Codificagao da solu¢ao: uma vez que 0 programador é capaz de des- crever tanto o problema quanto a solugao para ele, é necessario en- tao a codificagao, ou seja, a descricao seqiiencial passo a passo da solugao que melhor resolve 0 problema. A isto da-se 0 nome de algo- ritmo; 4°) Tradugao do cédigo: partindo da seqiiéncia de comandos obtidos do procedimento anterior, resta ao programador traduzir essa sequéncia em comandos que possam ser corretamente interpretados pela lin- guagem de programagao utilizada; Prinefpios de Programagao © z 5°) Depuragao (em inglés DEBUG): infelizmente, por mais experiente que seja 0 programador, um programa nunca esta livre de erros, por isso, apés implementagao do programa, seja qual for a linguagem utiliza- da, seré necess4rio proceder 4 sua depurac&o. Depuragao entado é o processo de verificagéo e teste do programa de forma a localizar € solucionar todas as eventuais falhas e erros de codificacao que te- nham acontecido em quaisquer das fases anteriores. Utilizam-se diversas técnicas para facilitar estas tarefas listadas. Na anélise e codificagdo da solugdo, por exemplo, utilizam-se diagramas e fluxo- gramas para a construgao grafica de algoritmos, 0 que permite uma melhor visualizagdo dos passos envolvidos nele. Dependendo da complexidade do programa, pode ser necess4rio utilizar alguns artificios de programagao: + Um conjunto de comandos utilizado repetidamente, em diferentes par- tes do programa, pode ser codificado separadamente, formando um médulo ou func&o. Desta forma, em vez de repetir a seqiiéncia de comandos a cada necessidade, o programador pode simplesmente executar a fungao especificada; + Um conjunto de comandos executado diversas vezes numa mesma seqiiéncia constitui, no jargao dos programadores, um lago de repeti- Gao ou em inglés LOOP. Mais adiante veremos as formas de codifica- gao de um loop; + Normalmente em um programa é necessario verificar ou testar deter minada condicao, seja comparar dois n&meros, verificar uma senha, etc. A codificac&o dos testes condicionais, baseados na Algebra boo- leana, também obedece a algumas regras que veremos adiante. Durante a fase de codificaco do algoritmo, o programador pode utilizar-se de ferramentas, ou programas de computador especiais, denominados gerado- res de programa, que realizam automaticamente a tarefa de converséo de um algoritmo em codigos ou mesmo comandos de determinada linguagem. Encontramos também alguns programas especiais e que sao utilizados na fase de tradugao de codigo. Estes programas sao classificados em duas cate- gorias: interpretadores e compiladores. As linguagens interpretadas sao aquelas em que a traducao da linguagem feita em tempo real, durante a execugao do programa. Isto significa que as linguagens interpretadas sao mais lentas, pois 0 processo de tradugao tem di ser feito para cada instruc&o do programa. Como exemplos de linguagens it terpretadas, podemos citar algumas versGes da linguagem BASIC, inclusive o BASIC STAMP, disponivel para os PICs. 8 Microcontroladores PIC - Programagdo em C J as linguagens compiladas so aquelas em que o processo de tradugao (compilagao) € feito previamente e o cédigo gerado pelo compilador (cédigo de maquina) pode ser carregado na meméria e executado diretamente por ele. Fica clara a vantagem das linguagens compiladas sobre as interpretadas, ja 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 0 cédigo gerado, 0 que em muitos casos (como no PIC em quest&o) resulta em uma enorme diferenga. Outro tema interessante sobre as linguagens interpretadas é 0 aspecto da otimizagéo de cédigo: nas linguagens interpretadas, cada comando de alto nivel 6 traduzido em uma respectiva seqiéncia de comandos de baixo nivel pelo programa interpretador. Se um mesmo comando for utilizado diversas vezes no programa, serao geradas tantas seqliéncias de comandos de baixo nivel quantas forem as aparigdes do comando de alto nivel. Por outro lado, em um compilador, isto ja nao acontece da mesma forma. De maneira geral, os compiladores s&o programas altamente complexos e utilizam diversos artificios para a otimizagao do cédigo gerado, tanto em fun- 40 do espaco ocupado, como também na velocidade de execu¢ao. Por isso mesmo, 0 processo de compilagao € complexo demais para ser embutido em um chip tao pequeno como os PICs, por exemplo, razao pela qual devemos utilizar plataformas computacionais mais potentes para a execugdo de tais softwares (denominagao em inglés para programas de computador). Finalmente, na fase de depuragdo, encontramos também diversos Programas e hardware (equipamentos) para auxiliar 0 programador na busca de erros e falhas no programa. Alguns desses programas e equipamentos es- peciais so utilizados para simular a execugado do programa, permitindo ao programador a checagem a qualquer tempo do estado do programa, verifica- cao de variaveis, etc. 2.1. Fluxogramas Como ja foi dito, os fluxogramas sao ferramentas que auxiliam grande- mente a tarefa de codificagao de um programa. Na realidade, fluxogramas sao elementos graficos utilizados para estabe- lecer a seqiiéncia de operagdes necess4rias para o cumprimento de determi- nada tarefa e, consequentemente, a resolugado de um problema. A seguir, veremos alguns exemplos de elementos utilizados na construgao de fluxogramas, bem como alguns exemplos deles. rincipios de Programagao @ — Infcio ou terminag&o: este tipo de simbolo € utilizado para representar 0 inicio ou término do programa ou algoritmo. Processo: este simbolo € utilizado para descrever a realiza- go de uma determinada tarefa. Dados: normalmente este simbolo é utilizado para descrever um processo de entrada de dados. Tomada de decisdo: este simbolo @ utilizado para represen- tar um ponto de tomada de decisdo, ou teste condicional. A tomada de decisdo pode conduzir sempre a um resultado: verdadeiro ou falso. Em um dos casos 0 fluxo do programa € desviado e no outro, normalmente, o programa seguira na sua seqiiéncia normal. Vejamos um exemplo de um fluxograma para a solugao de um problema simples: somar dois nameros (A e B) e armazenar o resultado em C. O fluxograma da figura 2.1 representa os passos necessArios para solu- cionar o problema descrito. Pega o primeiro nndmero (A) Pega o segundo nimero (B) [soma + Be guarda em C bt Figura 2.1 Um outro exemplo: um programa para contar de O até 10. 8 Microcontroladores PIC - Programagéo em C ‘Contagem = 0 Soma 1 & contagem Contagem = 10? Fim : Figura 2.2 2.2. Algebra Booleana Agora que ja vimos alguns detalhes sobre o funcionamento e aplicagao dos fluxogramas no planejamento da solugao de um problema, é necessério verificarmos alguns conceitos importantes sobre a resolug&o de problemas légicos: a Algebra booleana, um ramo da matematica encarregado da resolu- Ao de problemas légicos. Este nome é devido ao fato de ter sido o inglés George Boole (1815-1864) um dos seus principais articuladores. A Algebra booleana é baseada em regras e conceitos légicos simples: proposicdes e operadores légicos relacionais. Uma proposigaéo nada mais é do que qualquer afirmacao verbal passivel de ser classificada como sendo verdadeira ou falsa. Assim, a afirmagao "Hoje € domingo" pode ser considerada uma proposi¢ao, j4 que pode ser classifica da como verdadeira ou falsa. Ja a frase "Que dia 6 hoje?" nao é uma proposi- ¢4o, pois nao pode ser classificada como verdadeira ou falsa. Duas ou mais proposic¢des podem ser relacionadas com 0 uso dos opera- dores légicos relacionais E, OU e NAO. O operador relacional E é utilizado para conectar duas ou mais proposi- gdes, resultando na chamada CONJUNCAO. A conjungao de duas ou mais pro- Principios de Programagao 9g posigdes somente sera verdadeira se TODAS as proposigdes forem verdadei- ras. Em seguida temos a tabela-verdade, que demonstra o relacionamento en- tre as proposigdes "A" e "B", o que resulta na conjungao C. Imagine entao que tenhamos a seguinte afirmacao: "Se for no domingo E o tempo estiver bom, iremos a praia." Se considerarmos a afirmagao "Se for no domingo" como sendo a propo- sicdo "A" e a afirmacao "o tempo estiver bom" como sendo a proposi¢ao "B", a conjuncao C que ira 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?) Tabela 2.1 J& 0 operador OU é também utilizado para relacionar duas ou mais propo- sigdes, resultando em uma nova proposi¢ao chamada DISJUNCAO. A disjungao de duas ou mais proposicdes sera verdadeira se QUALQUER das proposicdes for verdadeira. No exemplo seguinte, temos a utilizago da DISJUNGAO. Imagine um sis- tema de alarme composto de dois sensores (A e B). A saida do alarme (C) sera verdadeira (alarme disparado) se qualquer dos sensores estiver ativado (verdadeiro). Vejamos a tabela-verdade para a disjungao: Tabela 2.2 Podemos verificar que a proposigado C (o alarme esta disparado) sera ver- dadeira se um dos sensores (A ou B) for verdadeiro. eS Microcontroladores PIC - Programagao em C Finalmente, temos 0 operador l6gico NAO utilizado para negar uma deter- minada proposic¢ao, fazendo com que a proposi¢&o possua sentido contrario ao original. Assim, considerando a proposig&o original: "Hoje € domingo", se verdadeira, concluiriamos que 6 domingo e se falsa, que nao é. Negando a proposigao, temos: "Hoje NAO é domingo". Observe que agora, se a nova pro- posigao for verdadeira, concluiremos que nao 6 domingo e se falsa, que é domingo, ao contrario portanto, da proposigao original. Em seguida temos a tabela-verdade para a fun¢ao NAO: [a |e | [Es Je Wes a Tabela 2.3 Observe ainda que a negac&o de B também pode ser expressa como nao B, Apés esta breve explanagao sobre alguns dos principios gerais de pro- gramagao, vejamos um pouco mais sobre as linguagens de programagao. 2.3. Variaveis e Dados Variavel 6 uma representacdo simbélica para elementos pertencentes a um determinado conjunto. As variaveis sao armazenadas na meméria da ma quina e podem assumir qualquer valor dentre o conjunto de valores possiveis. Sempre que necessitarmos armazenar algum tipo de dado, seja ele pro- veniente do mundo exterior (uma tecla pressionada, uma tensao lida externa- mente, etc.) como do préprio programa (o resultado de uma equacao, por exemplo) sera utilizada uma variavel. De fato, as variaveis ficam localizadas na meméria do equipamento, nao em qualquer tipo de memoria, mas nas chamadas memérias RAM. Isto signifi- ca que num computador, boa parte da sua memoria RAM é ocupada por varia- veis, definidas pelos programas em execug&o no computador. Um outro aspecto importante sobre as variaveis € que durante a execucdo de um programa, uma variavel pode assumir diversos valores diferentes, mas nunca dois ou mais valores simultaneamente. As variaveis sao classificadas segundo o tipo de conteddo que armaze- nam e podem ser: numéricas, caractere, alfanuméricas e légicas. As variaveis numéricas sao evidentemente utilizadas para o armazena- mento de dados numéricos e podem ser classificas em: ios de Programagéo © + Inteiras: quando utilizadas para armazenar valores inteiros. Exemplo: 0, 5, 156, etc. + Reals ou ponto flutuante: quando utilizadas para armazenar valores nao inteiros, ou seja, nimeros reais. Normalmente, este tipo de varia- vel utiliza uma notac&o binaria especial para o seu armazenamento e utilizam mais posigdes de memoria que as variaveis inteiras. A quantidade de memoria utilizada para armazenar uma variavel depende do seu tipo: variaveis inteiras sao normalmente encontradas com tamanhos de 8, 16 ou 32 bits. Uma variavel inteira de 8 bits pode armazenar um valor entre O e 255, uma variavel de 16 bits pode armazenar um valor entre 0 e 65535 e uma variavel de 32 bits pode armazenar um valor entre 0 e 4.294.967.295. Observe que os nimeros representados acima sao somente positivos, no caso de representagdo de nimeros com sinal, a magnitude de representagado reduz-se 4 metade daquela sem sinal. Ja as variaveis do tipo real ou de ponto flutuante sao normalmente encon- tradas em tamanhos de 16, 32, 64 ou 80 bits! A titulo de exemplificagéo, uma variavel de ponto flutuante de 80 bits pode representar valores entre 3,422 @ 4,142) Vale lembrar ainda que num sistema de 8 bits, uma variavel de 16 bits vai ocupar duas posicdes de meméria e, conseqiientemente, uma variavel de 32 bits ocuparé quatro posigdes de meméria. Ja as variaveis do tipo caractere sao utilizadas para representar um carac- tere, utilizando normalmente para isso um cédigo especial (normaimente o cédigo ASCII). As variaveis do tipo caractere podem ser agrupadas em conjuntos de va- riaveis para formar frases ou textos. As variaveis do tipo alfanumérica sao utilizadas para armazenar tanto ca- racteres como valores numéricos, mas nunca os dois simultaneamente. Sendo assim, uma variavel alfanumérica pode num dado momento conter um valor numérico e em outro ponto do programa, ser utilizada para armazenar um ca- ractere. Finalmente, temos as variaveis do tipo légico, capazes de armazenar um estado légico: verdadeiro ou falso. 2.4. Operadores Muitas vezes necessitamos relacionar ou modificar um ou mais elemen- tos como variaveis ou dados em um programa. e Microcontroladores PIC - Programago em C Operadores sao elementos ou simbolos graficos utilizados entao para re- facionar ou modificar um ou mais dados ou variaveis. Podemos classificar os operadores de uma linguagem em cinco catego- rias principais: + Matemiticos: sao utilizados para efetuar determinada operagao ma- tematica em relagao a um ou mais dados. Exemplo: adicao, subtra- 0, ete.; + Relacionais: sAo utilizados para relacionar dois elementos ou dados. Exemplo: maior, menor, igual; + Légicos: sao utilizados para efetuar operacdes logicas booleanas en- | tre dois ou mais elementos ou dados. Este tipo de operac&o somente | pode chegar a um dos resultados: verdadeiro (1) ou falso (0), e sao freqientemente utilizados na criagao de testes condicionais com mil- | tiplas variaveis. Exemplo: funcdo E, fungdo OU, fungdo Nao; + Légicos bit a bit: utilizados para realizar operagdes ldgicas bit a bit entre um ou mais elementos ou dados, conforme o caso. As opera- goes légicas bit a bit sao realizadas entre cada um dos bits dos da- dos, resultando em um valor qualquer. Exemplo: fungao E, fungao OU, | fungao Nao, rotagao de bit, etc.; + Memiria: sao operadores utilizados para efetuar operacdes em rela- cao 4 meméria do equipamento. Exemplo: atribuigado (=), & e *. 2.5. Exercicios 4) Nas equagiées booleanas seguintes, quais valores de A, B e C tornam R verdadeira? I R=(AeBeC) Principios de P o : rincipios de Programagao 2) 3) c) A=V, B=F, C=F dq) |, B=V, C=F IV. R = ((A ou B) e (nao C)) Supondo a afirmacao: se no estiver chovendo e eu sair mais cedo do trabalho, iremos a praia. E considerando A= "Esta chovendo?", B = "Eu sai mais cedo do trabalho?" e C a resposta: "Iremos a praia", determine @ equacao booleana que descreve corretamente a afirmagao inicial: a) AeB=C b) AouB=C c) Ae(nao B)=C d) (ndo Aye B=C Qual 0 tipo de variavel necess4rio para armazenar cada um dos seguin' dados: a) 150 b) "Linguagem C" c) 100,41 d) 250 e) "123" f) Vv g) -5 h) F Microcontroladores PIC - Programagéo em C Cape's) /TULO 4 Compiladores CCS C Conforme j4 dito, neste livro utilizaremos como plataforma de desenvolvi- mento o compilador PCWH da CCS. Ele consiste em um ambiente integrado de desenvolvimento (IDE) para 0 sistema operacional Windows e suporta toda a linha de microcontroladores PIC (séries PIC12, PIC14, PIC16 e PIC18). Existe previsdo para suporte aos DsPIC assim que estiverem disponiveis. Os PICs da série 17, além dos microcontroladores da UBICOM/SCENIX (SX), n@o sao su- portados por esta versao do compilador. O IDE na realidade 6 constituido de trés médulos compiladores indepen- dentes: * PCB: para dispositivos de 12 bits (séries PIC12 e PIC16C5x); * PCM: para dispositivos de 14 bits (séries PIC 14000 e PICL6xXxX); * PCH: para dispositivos de 16 bits (série PIC18). O usuario pode optar por adquirir os médulos separados ou o pacote completo, dependendo da aplicagao a que se destina o compilador. Existe também a possibilidade de utilizar 0 compilador pela linha de co- mando e também a partir do ambiente MPLAB da Microchip, conforme vere- mos adiante. Vejamos agora as principais caracteristicas do compilador em estudo: * Compatibilidade com a padronizagdo ANSI e ISO (algumas caracteris- ticas do compilador nao fazem parte da normatizagao ANSI devido ao fato de serem especificas para a arquitetura PIC); * Grande eficiéncia no cédigo gerado; * Grande diversidade de funcgées e bibliotecas da linguagem C (padrao ANSI), tais como: entrada/saida serial, manipulagao de strings e ca racteres, fungdes matematicas C, etc.; Compiladores CCS S © * Grande portabilidade de cédigo entre os diversos microcontrolado! PIC e inclusive com cédigo escrito para outros microcontroladores sistemas. Isto significa que € muito facil adaptar um programa esc em C para outro dispositivo ou sistema (seja ele um outro PIC, out tipo de microcontrolador, ou mesmo um programa para PC). 3.1. Ambiente Integrado de Desenvolvimento (IDE) Como ja dissemos, 0 compilador PCWH @ constituido de um IDE gréfi que pode ser executado em qualquer plataforma Windows™. Na figura 3.1 temos uma imagem do IDE. Fle Pot EX. Onens Coole Yr Tos ot fps | Eerie ee void naing Ant a.0,e3 Figura 3.1 Passemos entao a uma analise detalhada de cada opgao e icone disponr veis neste ambiente. 8 Microcontroladores PIC « Programagao em C Fechar programa Iniciar MPLAB Estatisticas Arvore de chamadas Lista de simbolos Figura 3.2 A selecdo de familia PIC é utilizada para especificar qual dos trés compi- ladores (PCB - 12 bits, PCM - 14 bits ou PCH - 16 bits) sera utilizado para compilar o programa. O conjunto de botdes % \& 6 utilizado para visualizar as seguintes informagées: = - Visualizar 0 cédigo Assembly gerado pelo compilador. A visualizagao desse cddigo pode auxiliar 0 programador na verificagao e otimizagao do cédigo gerado pelo compilador. No exemplo do programa da figura 3.1, o cédigo assembly visualizado é: CCS PCW C Compiler, Version 3.104, 14768 Filename: c:\meus documentos\picc\prog\teste.LsT ROM used: 59 (1%) Largest free fragment is 2048 RAM used: 9 (5%) at main() level 10 (6%) worst case Stack: 1 locations finclude <16£877.h> // Standard Header file for the PIC16F877 device fidevice PIC16F877 flist juse delay (clock=20000000) #£uses HS,NOWDT, PUT, BROWNOUT Compiladores CCS S So c void main() { int a,b,c; STATUS, F oF STATUS.5 ADCONL STATUS.5 ‘ asb*S+c; We 2765535 0034: MOVLW 05 0035: MOVWF @MULAS.P1 0036: GOTO @MULEs 0037: MOVF c,W 0038: ADDWF @78,W 0039: MOWWF a &- Visualizar simbolos gerados: esta op¢do permite ao programador vi- sualizar a lista de simbolos utilizados e criados pelo compilador para a tarefa de compilacao do programa. No exemplo da figura 3.1, 0 conjunto de simbolos gerado pelo programa 008 PSP_DATA 015-016 CCP_1 015 ccP_1_tow 016 ccP_1_HIcH 01B-01¢ ccP_2 01B ccP_2_Low oic cCP_2_HTGH 021 main.a 022 main.b 023 main.c 024 @MUL88.P1 024 main. @SCRATCH 025 @MUL88. Pt 077 @SCRATCH 078 @SCRATCH 078 —RETURN_ 079 @SCRATCH O7A @SCRATCH 078 @SCRATCH delay_ms.P1 delay_us.P2 0028 main 0004 @MULSs Project Files: ¢:\meus documentos \pice\prog\teste.c D: \picc\devices\16£877.h Microcontroladores PIC - Programacéo em C ®. Visualizar 4rvore de chamadas: esta opgdo permite ao programador visualizar toda a estrutura de chamada de fungdes que ocorre dentro do programa, além de apresentar detalhes sobre a utilizagao de me- moria RAM e ROM para cada funcdo do programa. U- Visualizar estatisticas: esta op¢do permite ao programador visualizar as estatisticas de compilacao do programa. ROM used: 59 (18) 2048 (25%) including unused fragments 0 Average locations per line 59 Average locations per statement RAM used: 9 (5%) at main() level 10 (6%) worst case Lines Stmts % Files 13 1 100 c:\meus documentos\picc\prog\teste.c 249 0 0 D:\pice\devices\16£877-h 524 2 Total Page ROM % RAM Functions: 0 16 27 4 main 0 39 66 2 @MULES Segment Used Free 0000-0003 40 0004-07FPF 55 1989 0800-OFFF 0 2048 1000-17FF 0 2048 1800-1FFP 0 2048 Vejamos agora a estrutura de menus do compilador PCWH: File Project “Edt Options Compile’ ‘View! Tools Help, Figura 3.4 No menu FILE encontramos os tradicionais comandos de criacéo, abertu- . fechamento e impress&o de arquivo. O menu PROJECT apresenta comandos para a criagdo, abertura, fecha- mento e impressao de arquivos de projeto. No menu PROJECT encontramos Compiladores CCS S o também a op¢ao INCLUDE DIRS, utilizada para especificar em quais diret6rios © compilador ira buscar os arquivos de inclusao (normalmente com a extensao. *Jh"). No meu EDIT encontramos os tradicionais comandos de edic¢&o (UNDO - desfazer (CTRL+Z), COPY - copiar (CTRL+C), CUT - recortar (SHIFT+DEL), PASTE. - colar (SHIFT+INS), SEARCH - procurar (CTRL+F), REPLACE - substituir (CTRL+R), NEXT - procurar préxima (F3)), além de outros, como: * COPY FROM FILE: copiar de arquivo - insere um arquivo no programa: em edicgao; * PASTE TO FILE: colar em arquivo - copia 0 texto selecionado para ui determinado arquivo; * MATCH BRACE (CTRL+]): utilizado para encontrar a abertura/fechi mento de chave correspondente a chave atual e mover © cursor pai aquela; * MATCH BRACE EXTENDED (SHIFT+CTRL+]): seleciona todo o bloco cor respondente a chave atual; * INDENT SELECTION (ALT+F8): utilizado para indentar a selecao de te) to atual; * TOGGLE BOOKMARK (CTRL+SHIFT+nGmero): marca um determina local do programa; * GOTO BOOKMARK (SHIFT+nGmero): desloca o cursor para um dos | cais previamente marcados; * NEXT WINDOW (CTRL+N): apresenta a préxima janela de edigao compilador; * PREVIOUS WINDOW (CTRL+P): apresenta a janela de edicao anterior. FR recace uk Dre rs watch erece omy JD matcnerace tended shnecee) Microcontrotadores PIC - Programagao em C No menu OPTIONS encontramos diversas opgdes de configuracao do edi- tor de arquivos e do compilador PCW, tais como: + REAL TABS: utiliza caracteres de tabulagado (TAB) em vez de espagos; * TAB SIZE: especifica o tamanho de cada tabula- Gao; * AUTO INDENT: ativa a auto-indentagao do editor; * WORDSTAR KEYS: ativa compatibilidade com se- quéncias de controle do editor do wordstar®; * EDITOR FONT: seleciona o tipo de caractere utili- Zado no editor; * SYNTAX HIGHLIGHTING: realce de sintaxe: exibe os comandos C em cores diferentes; + AUTO HIGHLIGHT BRACKETS: realca 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 configuragao dos formatos de ar- quivos de saida do compilador: Figura 3.7 Nesta janela podemos definir parametros, como: o tipo de arquivo de debug gerado (DEBUG FILE), 0 tipo de arquivo objeto gerado (OBJECT FILE), a extensao do arquivo objeto (normalmente HEX), 0 tipo de arquivo de erros, formato do arquivo de listagem (LIST FORMAT), extensdo do arquivo de lista- gem (LST). O arquivo de debug € normalmente utilizado pelos emuladores de hardware. Compiladores CCS S © O arquivo de objeto é o programa em codigo de maquina pronto para ser gravado na meméria do PIC. O arquivo de listagem é utilizado para verificagao do codigo gerado, in- cluindo o fonte em C e o assembly gerado pelo compilador. * GLOBAL DEFINES: Esta janela permite a criagdo de definig¢Ses padi para utilizagao no ambiente IDE. Repare que estas definigdes nao utilizadas pelo compilador de linha de comando ou pelo ambiente i tegrado no MPLAB. Nestes casos, 0 programador deve utilizar defint des no proprio cédigo-fonte do programa ou em um arquivo separado. Figura 3.8 Convém observar também que estas definigdes somente so utilizad: quando a op¢&o ENABLED esta selecionada. * DEBUGGER/PROGRAMER: Esta janela permite selecionar as opgi de programador de dispositivos e depurador/simulador. Figura 3.9 Microcontroladores PIC - Programagao em C No caso do programador, € possivel adicionar ainda parametros como o nome do arquivo a ser programado (%H) e 0 dispositivo (%D). No caso do debugador/simulador, € possivel adicionar parametros como © nome do projeto (4%P) e nome do arquivo de debug (%C). * INCLUDE DIRS: Esta janela permite alterar e adicionar a ordem e os diret6rios de pesquisa para os arquivos de inclusao. A ordem de pes- quisa é de cima para baixo. Figura 3.10 A préxima opgao do menu principal € 0 menu COMPILE, que conta com @penas uma op¢ao COMPILE. Ela é obviamente utilizada para dar inicio ao processo de compilac&o do programa. A seguir, temos o menu VIEW com as seguintes op¢des: Figura 3.11 As quatro primeiras opgGes ja foram vistas anteriormente neste capitulo. Neste menu, encontramos ainda as op¢des: * DATA SHEET: para visualizar a folha de dados do dispositivo em uso (€ necessario instalar separadamente os datasheets dos componentes, © que pode ser feito a partir do CD-ROM do compilador ou baixando cada arquivo do site do fabricante); Compiladores CCS S Qa + VALID FUSES: esta opcao permite visualizar as definigdes validas pal a palavra de configuragao do dispositivo selecionado; * VALID INTERRUPTS: permite visualizar as interrupgdes disponiveis no dispositivo selecionado; + BINARY FILE: abre um arquivo binario para visualizagao; * COD DEBUG FILE: abre um arquivo debug para visualizagao. No menu TOOLS encontramos algumas ferramentas internas e externas muito interessantes e que auxiliam o programador na tarefa de programagao: Figura 3.12 * DEVICE EDITOR: o editor de dispositivos 6 uma ferramenta muito inte- ressante que permite ao programador adicionar ou alterar a forma como o compilador trata cada dispositivo da familia PIC. Com esse editor € possivel adicionar novos dispositivos 4 medida que eles se tornarem disponivel + DEVICE SELECTOR: esta op¢do abre uma janela que permite ao pro- gramador selecionar e comparar as caracteristicas de cada dispositivo das familias PIC; + FILE COMPARE: permite efetuar a comparacdo entre dois arquivos; * NUMERIC CONVERTER: esse pequeno programa permite efetuar a conversdo entre os trés principais tipos de dados disponiveis na lin- guagem C: inteiros sem sinal, inteiros com sinal e ponto flutuante; * SERIAL PORT MONITOR: invoca um pequeno e simples terminal de comunicagao serial, que pode ser utilizado para efetuar a comunica- ¢ao com um microcontrolador por meio da porta serial do microcompu- tador; + DISASSEMBLER: o disassembler € um programa que faz 0 contrario do montador, ou seja, ele desmonta os cédigos binarios e traduz nova- mente em mneménicos assembly. oe Microcontroladores PIC - Programagao em C Para utilizar o disassembler, primeiramente informamos 0 nome do arquivo a ser desmon- tado em INPUT FILE, em seguida o nome do ar- quivo a ser gerado em OUTPUT FILE. Em seguida, selecionamos as opcdes de desmontagem: cédigo de 12 ou 14 bits (nado é possivel desmontar programas para PICs da familia 18), tipo de arquivo de entrada (hexade- cimal ou binario), tipo de rétulos (LABELS) utili- zado (endereco simples, rétulo C ou Assembly) e finalmente o formato numérico de saida. Figura 3.13 Ao clicar no botao DASM, o processo de desmontagem tera inicio e sera io 0 arquivo de saida especificado em OUTPUT FILE. * EXTRACT CAL DATA: esta opoao deve ser utilizada quando se trabalha com dispositivos dotados de clock interno com palavra de calibragao (12C50x, 12C51x, 12C67x, 12F629 e 12F675, entre outros). Uma vez selecionada esta opeao, 0 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 extragdo da palavra de calibragao (normal- mente localizada no Gltimo endereco valido da memoria de programa); * PROGRAM CHIP: invoca o programador de dispositivos (0 qual nao faz parte do pacote do compilador e deve ser adquirido separadamente); * MPLAB: invoca o ambiente MPLAB; * INTERNET: permite acesso ao site do fabricante do compilador. Finalmente, a Ultima op¢ao do menu principal do programa, HELP, contém de praxe: auxilio (em inglés) ao programador. .2. Integragao com o MPLAB Além do ambiente IDE, € possivel utilizar os compiladores PCB, PCM e integrados ao ambiente MPLAB. A seguir, veremos passo a passo os procedimentos necessarios para ramar em linguagem C dentro do MPLAB. Apés instalado o compilador no computador, inicie 0 MPLAB e selecione a a0 PROJECT > NEW PROJECT. Digite 0 nome do arquivo de projeto e clique em OK. Deve surgir a janela opcdes do projeto, como na figura 3.14. Compiladores CCS S Qo. Microcontroladores PIC - Programagao em C Figura 3.16 Figura 3.18 Em seguida, clique na opgao LANGUAGE SUITE e selecione o compilador CCS (figura 3.16). Surgem mensagens de alerta (normalmente trés); clique apenas OK. Repare que apds a modificagao da linguagem de programacao, a op¢ao ADD NODE, que anteriormente estava ativada, vai agora aparecer desativada como as outras. Clique no né principal do projeto (0 arquivo testec[.hex]) destacado na fi- gura 3.17 e selecione a op¢&o NODE PROPERTIES. Deve surgir a janela de propriedades do né do projeto (figura 3.18). Nessa jJanela o programador seleciona qual dos compiladores sera utilizado (PCB, PCM ou PCH, conforme o pacote adquirido). E possivel também acionar a op- cao GENERATE CALL TREE para fazer com que o compilador gere um arquivo com a 4rvore de chamadas de fungdes. Agora, basta selecionar qual 0 modo de funcionamento do MPLAB (em DEVELOPMENT MODE) clicando no botao CHANGE e selecionando o dispositivo © 0 modo desejado. Se j& houver um programa-fonte em C salvo no HD, o programador pode entao selecionar a opg&o ADD NODE e 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 op¢ao FILE > NEW, salvando em seguida o arquivo e adicionando-o 20 projeto, como mencionado anteriormente. Compliadores CCS S © Anotacoes eo Microcontroladores PIC - Programagéo em C . Capitulo) Introdugao a Linguagem C Agora que o leitor ja possui o conhecimento sobre o funcionamento do compilador e do ambiente de desenvolvimento, € hora de estudar os funda- mentos da linguagem C. Para facilitar a compreensao da linguagem C, vejamos primeiramente um exemplo de programa: Exemplo 4.1 J Primeire exemplo finclude <16F628.h> use delay(clock=4000000) #fuses INTRC_I0,NOWDT, PUT, BROWNOUT, NOLVP, NOMCLR main() { int tempo; tempo=100; // atribui o valor 100 a varidvel tempo while (true) { output_high(PIN_B0); // seta o pino RBO delay_ms (tempo! // aguarda 100ms output_low(PIN_BO); © // resseta o pino RBO delay_ms (tempo) // aguarda 100s Vejamos 0 significado de cada linha do programa. A primeira linha do programa: // Primeiro exemplo £ chamada de comentario. Os comentarios sao descrigdes inseridas no ligo-fonte pelo programador com 0 intuito de documentar o programa. Introdugdo & Linguagem C @ Esta versdo de compilador C admite duas formas de comentério: * Comentarios de linha simples: sao de apenas uma linha iniciados los caracteres "//", tais qual o comentario do programa anterior. tipo de comentario nao faz parte da padronizacao ANSI original, mi atualmente é encontrado em varios compiladores. Os comentarios de linha simples podem ser iniciados em qualq ponto de uma linha e s&o muito utilizados para descrever o funciot mento ao final de cada linha de cédigo, como podemos observar decorrer do programa. * Comentarios de miltiplas linhas: sao compostos por uma ou mai: linhas. Estes tipos de comentario utilizam a seqiéncia de caractet "/*" para iniciar 0 comentario e a seqiiéncia "*/" para terminar comentario. Exemplo: fe Este é um comentério de miltiplas linhas “4 Na préxima linha temos: #include "16F628.h* O comando #include é uma diretiva do compilador. Neste caso esta terminando ao compilador que anexe ao programa 0 arquivo especific: "16F628.h". Arquivos com a extensao "h" sao chamados de arquivos de cabegalho s&o utilizados em C para definir variaveis, tipos, simbolos e fungdes Gteis programa. O "16F628.h" € um arquivo com as definigdes relativas ao process: -alvo, para 0 qual o programa sera compilado. Podemos verificar que o pro‘ sador para o qual o programa foi escrito € o PIC 16F628. Se desejasse! modificar o processador-alvo, bastaria alterar esta linha do programa. Observagao: Ao alterar o processador utilizado no programa, pode ser ne- cessrio também, alterar a familia do processador na op¢ao disponivel na barra de {cones do compilador (figura 3.2). Microcontroladores PIC - Programagéo em C Na préxima linha encontramos; tuse delay (clock=4000000) A seqiiéncia #use especifica uma diretiva interna do compilador. No caso, a diretiva determina ao compilador que considere o valor de 4.000.000 de Hertz ou 4MHz para a freqiiéncia de clock do MCU. Este valor € utilizado para geracdo dos cédigos de atraso e outras rotinas que dependam de tempo (como, por exemplo, a rotina de comunicagao serial por software). Em seguida temos: #fuses INTRC_IO,NOWDT, PUT, BROWNOUT, NOLVP,NOMCLR Esta é uma diretiva que especifica 0 estado dos "fusiveis" da palavra de configurag&o do dispositivo. No presente caso, estamos selecionando pela ordem: oscilador de clock interno de 4MHz com pinos RAG e RA7 disponiveis para E/S, watchdog desligado, timer power-up ligado, reset por brown-out liga- do, programacao por baixa tensao desligada e MCLR interno (pino RAS dispo- nivel como entrada). Estas op¢des variam conforme o modelo de PIC utilizado. A lista com os valores validos para a determinagao do estado de cada fu- sivel pode ser verificada a qualquer momento no menu VIEW > Valid Fuses. Na préxima linha do programa encontramos: main() A declaragdo main() especifica 0 nome de uma fun¢&o. No caso, a fungao main() é padronizada na linguagem C e é utilizada para definir a fungao princi- pal, ou 0 corpo principal do programa. Uma fungdo, em C, é um conjunto de instrugdes que pode ser executado 2 partir de qualquer ponto do programa. O sinal de abertura de chave "{" 6 utilizado para delimitar 0 inicio da fun- co eo sinal de fechamento de chave "}" indica o final da fungao. Na realidade, as chaves delimitam o que chamamos de bloco de progra- ma, ou bloco de cédigo. Nas linguagens de programac&o estruturada (como C), um bloco de pro- grama consiste em um conjunto de comandos conectados logicamente e€ que assumem uma identidade Gnica, ou unidade. Assim, para todos os efeitos, um bloco de comandos e um Gnico comando funcionam da mesma forma. Podemos dizer que um programa em C é constituido por um ou mais dos seguintes elementos: Introdugo & Linguagem C So + Operadores: Operadores sao elementos utilizados para comandar interagdes ent variaveis e dados em C. Muitos dizem que um dos elementos que mais se destacam na li guagem C € a forca e flexibilidade dos seus operadores. O capitulo 6 faz um estudo sobre os operadores de dados encontr. dos na linguagem C. + Variaveis: E claro que nao podemos escrever um programa realmente itil set utilizar variaveis para o armazenamento de dados. A linguagem C dispde de uma grande variedade de tipos de varidveis dados, o que permite o desenvolvimento de praticamente qualqu tipo de aplicagao. No préximo capitulo, faremos um estudo detalhado das variaveis e pos de dados encontrados na linguagem C. + Comandos de controle: Os comandos ou declaragdes de controle so elementos essenciais escrita de programas em C. Como seu préprio nome diz, eles sao utilizados para controlar, testi e manipular dados e informagées dentro do programa. No capitulo 7 estudaremos os diversos comandos de controle disponi veis na linguagem C. + Fungdes: As funcdes, como ja foi dito, sao estruturas de programa utilizad para simplificar, otimizar ou apenas tornar mais claro o funcionamen' do programa. No capitulo 9 faremos um estudo mais profundo sobre o funcionam to e utilidade das fungdes na linguagem C. A primeira linha do bloco de comandos da funcao main() é: while (true) Este € um comando de controle utilizado na repetigao de um determinad bloco de instrugdes. Esse bloco sera repetido enquanto a avaliacdo da condi @do especificada entre parénteses for verdadeira. No caso, a avaliagdo é expli citamente verdadeira (true). O bloco de instrugdes que sera repetido é aquele especificado dentro da: chaves que seguem 0 comando while. 6 Microcontroladores PIC - Programagao em C Por ora, isto € tudo o que devemos saber sobre o comando while. Quando estudarmos as declaragdes de controle, retornaremos ao assunto. Como ja dissemos, os comandos que formam o bloco de instrugdes a se- rem repetidas sdo aqueles entre as chaves: { output_high (PIN_80) ; delay_ms (tempo) ; output_low (PINLBO); delay_ms (tempo) : ) E serao repetidos indefinidamente até que o processador seja desligado ressetado, Um detalhe interessante a ser observado é que ao final de cada uma das chamadas de fun¢ao, o dltimo caractere da linha foi um ponto-e-virgula (;). Co ponto-e-virgula é utilizado para delimitar o final de um comando. Observe que as diretivas do compilador nao necessitam (nem permitem) uso do ponto e virgula como delimitador. Analisemos ent&o os quatro comandos que compdem o bloco do coman- while: O primeiro comando, int tempo, € chamado de declaragao de variavel. comando determina que o compilador crie uma variavel do tipo inteiro int jada tempo. Esta operagao na realidade ira reservar um dos registradores disponiveis para o armazenamento do valor relativo a variavel. O tipo in- int especifica um tipo de dado de 8 bits com valores compreendidos en- 0 e 255 decimal. Mais adiante neste livro, estudaremos os tipos de dados jiveis na linguagem C e no compilador CCS. O nome dado 4 variavel é Identificador e pode ser composto de letras e ros. Mais adiante veremos mais detalhes sobre os identificadores vali- na linguagem C. Em seguida, temos a linha tempo=100 que constitui-se em uma operagao atribuigao. As atribuigdes em C sao executadas pelo operador de igualdade ". Desta forma, a linha tempo=100 fara com que o compilador gere uma se- éncia de instrugdes para fazer com que 0 valor 100 decimal seja armazena- na variavel "tempo". O primeiro comando, output_high(PIN_B0), 6 uma chamada a uma fun- interna do compilador. Introdugdo & Linguagem C od Esta func&o € utilizada para setar (ou seja, colocar em nivel légico '1') pino do microcontrolador. Isto significa que o pino RBO (da porta B) sera si do. Note que "PIN_BO" é um simbolo predefinido para especificar o pino RI Este simbolo esta localizado no arquivo de cabegalho do processador utiliz (no presente caso o arquivo "16F628.h"). Uma caracteristica interessante do CCS C é que o préprio compilador carrega-se de configurar 0 pino para funcionar como uma entrada ou saic dependendo do modo de tratamento de 1/0 em que se esteja trabalhando. Outro aspecto interessante desta chamada de fungao é que ela demor tra uma chamada de funcao com um parametro, que no caso especifica o pil do microcontrolador a ser setado. Este tipo de parametro de uma fungao é chamado de parametro form: Veremos mais detalhes sobre fungdes e parametros no capitulo 9 deste livro. A préxima fungao a ser executada é: delay_ms (tempo) ; Esta também é uma fung&o interna do compilador e é utilizada para ge! um atraso de X milissegundos. No caso, 0 atraso sera igual a 100ms (ja que variavel tempo, utilizada como parametro, contém o valor 100). O préximo comando do bloco é: output_low(PIN_BO) ; Esta também é uma fungao interna do compilador e é utilizada para re: setar (ou seja, colocar em nivel |6gico '0’) um pino qualquer do microcontrol: dor. Novamente neste caso, 0 pino em questdo é o RBO. Finalmente, 0 Gltimo comando: delay_ms(tempo) ; Fara com que novamente o compilador gere um atraso de 100 ms. Maiores detalhes sobre o funcionamento das funcdes internas do compli lador podem ser vistos no capitulo 12. Desta forma, ao programarmos o PIC com o programa anterior e se tiv mos conectado um LED (com o devido resistor de limitagao de corrente) pino RBO, nés 0 veremos acender e apagar em uma freqliéncia de 5 Hz. Microcontroladores PIC - Programagéo em C 4.1. Palavras Reservadas da Linguagem Toda linguagem de programagao possui um conjunto de palavras ou co- mandos para os quais ja existe interpretagao 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: | auto continue break default short switch typedef union unsigned volatile while Tabela 4.1 4.2. |dentificadores \dentificadores sao nomes dados pelo programador a variaveis, funcdes e outros elementos da linguagem C. Conforme ja vimos, um identificador na linguagem C pode ser composto de caracteres numéricos e alfanuméricos. Além de nameros e letras, 0 Gnico outro caractere que pode ser utilizado em identificadores é sublinhado "_". Além disso, um identificador somente pode ser iniciado por uma letra ou sublinhado, nunca por um namero. Veja em seguida alguns exemplos de iden- tificadores validos e invalidos em C: variavel valido variavel4 valido invalido variavel invalido _teste_2 valido return invélido .23_abe valido erro\2 invalido Tabela 4.2 Inredug &Linguagem C So —_— Nesta tabela o identificador "abc" é invalido porque se iniciou por ndmero, "variavel" é invalido porque utiliza acento, "return" € invalido porque uma palavra reservada da linguagem e "erro\2" é€ invalido porque utiliza o ractere "\". Repare que nao é permitido utilizar como identificador uma palavra res vada da linguagem ou um nome de func&o ja definida em C. O padr&o ANSI determina ainda que apenas os primeiros 31 caracteres nome do identificador serao utilizados para a diferenciacao entre eles. Isto significa que € possivel utilizar identificadores de qualquer taman! desde que existam diferengas nos primeiros 31 caracteres, de forma a di guir entre um e outro. Vejamos entao as principais regras de nomeacao de identificadores: * S6 podem ser utilizadas letras, nimeros ou 0 caractere sublinhi + Devem sempre ser iniciados por uma letra ou sublinhado; + Identificadores sao Gnicos; um mesmo identificador nao pode ser buido a coisas diferentes; + Nao podem ser utilizadas como identificadores as palavras rese' da linguagem e nomes de fungdes ja definidas; + Somente os primeiros 31 caracteres do identificador sao validos, entanto um identificador pode utilizar mais do que este nimero de racteres. 4.3. Comandos e Funcoes Importantes Antes de prosseguirmos no estudo detalhado da linguagem, é interes observarmos alguns comandos e fungdes muito utilizadas nos programas linguagem C. Estas fungdes e comandos sero utilizados no decorrer deste dai a importancia de termos ao menos uma visao superficial de cada um. 4.3.1. Comando If O comando if (em portugués "se") é utilizado em testes condicionai tipo: if (condig&o) comando: O que significa: se a condigao for verdadeira, ent&o execute o co! especificado. Microcontroladores PIC - Programagéo em C Esta condig&o deve ser qualquer expressdo que possa ser avaliada como icira ou falsa, ou seja, uma proposigao booleana. No capitulo 7 veremos um estuco detalhado do comando If. -2. Comando While O comando while (em portugués "enquanto"), conforme ja visto anterior- te, é utilizado para especificar uma estrutura ou lago de repeti¢ao, em que ou mais comandos sao repetidamente executados enquanto uma determi- condigao for avaliada como verdadeira. A sua forma geral é: while (condi¢#o) comando; O que significa: enquanto a condigao for verdadeira, execute 0 comando ificado. Esta condigaéo 6 novamente qualquer expressao que possa ser avaliada verdadeira ou falsa, ou seja, uma proposicao booleana. O comando while sera melhor estudado no capitulo 7. 3.3. Funeao Printf A fungao printf é utilizada para possibilitar a saida de dados na linguagem A saida de dados é direcionada para 0 dispositivo padrao de saida, que nos jputadores € normalmente o monitor de video. No caso dos PICs, o dispo- de saida eventualmente disponivel € a saida serial. Assim, a fungao printf 6 uma excelente forma de transmitir dados serial- ite do PIC para um outro dispositivo externo, como, por exemplo, um ter- inal de video ou um microcomputador. O formato geral da funcao printf é: printf ( argumento(s) ); Em que argumento pode ser uma constante de caracteres direta ou ainda conjunto de caracteres de controle seguido de uma lista de variaveis. Veja os exemplos: printé ("Teste"); // imprime a palavra Teste através do dispositivo // Ge saida padr&o Ou, Introdugdo & Linguagem C e int var_teste; // declara a varidvel inteira var_teste var_teste = 5; // atribui o valor 5 a varidvel var_teste printf ("8d", var_teste); J/ imprime o valor da variével var_teste Observe que no Ultimo exemplo, a fungao printf utilizou um cédigo de for matagao para especificar que o contetido da variavel deveria ser impresso formato inteiro. A tabela seguinte apresenta alguns dos codigos de formatac’ mais utilizados: Tabela 4.3 A fungdo printf e os seus cédigos de formatagdo serao melhor estudad no capitulo 11. 4.3.4. Fungao GETC A fungao GETC é utilizada para entrada de dados, o que, no caso PICs, € feito por comunicagao serial. Esta funcao aguarda que seja recebido um caractere pela linha serial pi viamente configurada, retornando o valor do caractere recebido. Veja o form: geral desta fungao: varidvel = gete(); ou simplesmente, getc(); no caso de nao ser desejado atribuir o valor retornado pela func&o (que € caractere recebido serialmente) a qualquer variavel. Desde ja é interessante sabermos que uma fungao, na linguagem C, retornar valores, isto 6, ap6s a execucao da fungao, ela pode retornar um val ou dado referente ao processo realizado. Por ora, isso € tudo o que vocé precisa saber sobre a fungao gete. capitulo 11 veremos detalhadamente o funcionamento desta e de outras des disponiveis na linguagem C. e Microcontroladores PIC - Programagao em C Variaveis e Tipos de Dados A linguagem C disponibiliza ao programador uma gama de tipos de dados. A implementacao C da CCS possibilita 0 uso de quase todos os tipos de da- dos disponiveis em C padrao ANSI. De fato os tipos de dados disponiveis na implementagao C da CCS sao os maiores pontos positivos, permitindo a construgao de programas de grande ‘complexidade com uma relativa facilidade. Vejamos os tipos basicos de dados disponiveis: Tipo Intervalo char 0a255 int 0a255 float 3.4E-38 a 3.4E+38 void | 0 nenhum valor Tabela 5.1 Os tipos de dados sao identificados pelas palavras reservadas da lingua- : char, int, float e void. 0 tipo char é utilizado para representacao de caracteres ASCII de 8 bits. ja variavel do tipo char pode representar um caractere ASCII. O conjunto de teres ASCIl € normatizado universalmente e pode ser encontrado no indice A do livro. O tipo int é utilizado para representar ndmeros inteiros de 8 bits (0 a 5). Estes tipos de dados sao amplamente usados em programacao C. Note que 0 tipo int na linguagem C é definido sempre para possuir o ta- ho mais eficiente para a arquitetura-alvo: 8 bits no caso dos PICs, 32 bits caso dos computadores do tipo PC atuais. No entanto, o padrao ANSI es- ‘ifica que o tipo int deve representar um ndmero de 16 bits. Vatiéveis e Tipos de Dados Repare ainda que tanto char como int representam nmeros inteiros nao podem ser utilizados para representar nameros fracionarios. Para is: deve ser utilizado o tipo float, também chamado de ponto flutuante. Este ti de dado pode ser utilizado para representar grandezas compreendidas en! 3,4-38 e 3,4*38, tanto para nimeros fracionarios como inteiros. Em mi matica so os chamados nimeros reais. Note que este tipo de dado ocupa quatro posig¢des de meméria RAM PIC e além disso, qualquer operacdo envolvendo variaveis float é traduzic pelo compilador em um conjunto complexo de operagées. Sendo assim, 0 uso de variaveis float deve ser evitado ao maximo e res trito apenas as operacdes que realmente necessitarem de um tipo de da como este. Temos ainda 0 tipo void, utilizado normalmente em fun¢des para declat que ela nao deve retornar nenhum valor. Maiores detalhes sobre a sua fungi serao vistos mais adiante neste livro. Observacao: A linguagem C prevé ainda o tipo double, que consiste em uma versao com capacidade de representagao dobrada (64 bits) em rela- gao ao tipo float. O compilador CCS nao suporta este tipo de dado, no entanto, a palavra double continua entre as palavras reservadas da lingua- 5.1. Mo Além dos tipos de dados vistos na tabela 5.1, podemos utilizar com: dos especiais da linguagem C para modificar os tipos basicos, de forma a termos outros tipos de dados. Esses comandos especiais sao chamados de modificadores e sao os guintes: signed, unsigned, short, e long. O modificador signed pode ser utilizado para modificar um tipo base dados de forma que ele possa representar tanto nimeros positivos como ni meros negativos. A representagao de nimeros negativos é feita tomando o bit MSB (Mos Significant Bit ou Bit mais significativo) da variavel para representar o sinal: MSB = 1, sinal negativo, bit MSB = 0, sinal positivo. Nesta notacgao, chami complemento de dois, 0 valor a ser representado € complementado (tem sel bits invertidos um a um) e entao é somado 1 ao resultado. 6 Microcontroladores PIC - Programagéo em C Note que devido ao fato de utilizar um bit para representacdo do sinal, a magnitude absoluta de representac&o do tipo modificado sera metade da magnitude do tipo nao modificado. Assim, um tipo de dados signed int pode representar valores entre -128 e +127, em vez de 0 a 255. O modificador unsigned define um tipo de dado sem sinal, 0 que é 0 pa- drao do compilador CCS. Desta forma, nao € necessario utilizar 0 modificador unsigned, ja que ele nao produz qualquer efeito. Note que o padrao ANSI es- pecifica que os tipos de dados padrao da linguagem C sao do tipo signed. Ja o modificador short é utilizado para definir uma variavel com tamanho menor que 0 tipo modificado, ou seja, uma versdo reduzida do tipo especifica- do. Assim, se especificarmos uma variaével como sendo do tipo short int, ela sera uma versdo reduzida do tipo Int, 0 que no caso do compilador CCS cria uma variavel de apenas um bit de tamanho (0 que 6 também chamado de flag ou sinalizador). Note que esta aproximagao difere do C padrao ANSI, ja que o foco princi- pal do compilador CCS 6 a eficiéncia e as variaveis de 1 bit sao, sem divida, bem-vindas em um ambiente tao restrito como em um microcontrolador. Finalmente, temos o modificador long, utilizado para ampliar a magnitude de representacao do tipo especificado. Desta forma, um tipo de dados long int tera um tamanho de 16 bits, ou seja, ira ocupar duas posigdes de memdéria RAM do PIC e tera uma magnitude de representacao de 65536 elementos. Observe ainda que a linguagem C permite a adogao da forma de declara- co simplificada; basta que 0 programador informe o modificador. Neste caso, © compilador assume que 0 tipo é 0 int. Assim, a declaragao short int produz © 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 descritos anteriormente, encontramos no compi- lador CCS outros tipos de dados, criados especificamente para a eficiéncia e compatibilidade do compilador junto a dispositivos como os PICs. Sao eles: + int: especifica valores de 1 bit (eqiivale ao tipo short int padrao); + boolean: especifica valores booleanos de bit (equivale ao short int e int1); + Int8: especifica valores de 8 bits (eqilivale ao tipo int padrao); Varidveis e Tipos de Dados @ * byte: especifica valores de 8 bits (eqilivale ao tipo int e int); * int16: especifica valores de 16 bits (eqijivale ao tipo long int padrao); * Int32: especifica valores de 32 bits. Note ainda que o compilador possui uma diretiva interna "#type" qi pode ser utilizada para alterar o tamanho dos tipos padrao. Esta diretiva si melhor estudada no capitulo 10. A seguir, temos uma tabela com todos os tipos de dados disponiveis padrao no compilador CCS: Tipo short int, int1, boolean Tamanho em Bits Faixa de valores char 8 0a 255 signed char 8 1284127 unsigned char 8 0a255 int, int8, byte 8 0a255 signed int, signed byte 8 128.4127 unsigned int, unsigned 8 0a 255 long int, intlé 0 a 65.535 signed long int 16 -32.768 a 32.767 unsigned long int 16 “32.768 a 32.767 int32 32 0 a 4.294.967.295 signed int32 32 -2.147.483.648 a 2.147.483.647 unsigned int32 Tabela 5.2 0 a 4.294,967.295 3.4% a 3.4% Os tipos boolean e byte sao definidos nos arquivos de cabecalho de cada PIC e sao baseados nos tipos short int e int respectivamente. As variaveis inteiras sao armazenadas pelo compilador, iniciando pelo LSB no endereco mais baixo de meméria e com o MSB no Ultimo ende- rego ocupado pela variavel! Microcontroladores PIC - Programagéo em . Declaragao de Variaveis Em C, ao contr4rio de outras linguagens como BASIC, é necessArio decla- @ variavel antes de poder us@la. Declarar uma variavel nada mais € do que informar ao compilador que variavel chamada "x" € do tipo "y". O nome da variavel identificador, ja foi visto, pode ter até 31 caracteres (letras, nameros e o caractere ~) 2 nao pode iniciar por um nGmero. A declaragao de variaveis em C obede- 2 seguinte forma: TIPO nome da varivel(,outras varidveis); Podemos ainda declarar e inicializar 0 conteGdo de uma ou mais variaveis: TIPO nome da varidvel = valor da varidvel{, outras varidveis}; Vejamos entao como declarar uma variavel chamada "tempo" do tipo in- de 8 bits sem sinal: unsigned int tempo; ou: int tempo; Outro aspecto importante da declaragado de variaveis € 0 local onde elas declaradas. A importancia do local onde a variavel foi declarada relaciona-se direta- @ acessibilidade ou nao de outras partes do programa a essa variavel. se denomina regra de escopo da linguagem. Basicamente, uma variavel pode ser declarada em trés pontos distintos programa: * No corpo principal do programa: as variaveis declaradas no corpo prin- cipal do programa (fora de qualquer fungdo, inclusive da funcg&o main()) sao chamadas de globais, porque podem ser acessadas de qualquer ponto do programa; * Dentro de uma funcdo: as varidveis declaradas dentro de uma funcdo. (incluindo a fungao main()) somente podem ser acessadas de dentro da fun¢caéo em que foram declaradas. Isto significa que uma variavel local somente existe enquanto a fungdo esta sendo executada. No momento em que ocorre o retorno da fungao, as variaveis locais sao descartadas; Varidveis e Tipos de Dados * Como um parametro formal de uma fungao: as variaveis declarat como parametros formais de uma fungao sao um tipo especial de riaveis locais. Este topico sera melhor explicado no capitulo 8 quai estudarmos as funcdes da linguagem C. Em seguida temos um pequeno programa que demonstra a diferenca tre variaveis locais e variaveis globais: Exemplo 5.1 #include <16£627.h> fuse delay(clock=4000000) fuses HS,NOWDT, PUT, NOBROWNOUT, NOMCLR, NOLVP fuse rs232(baud=19200, xmit=PIN_B2, rcv=PIN_B1) i" Teste de variaveis locais e globais ” int somatorio; // variavel global void soma(int valor) ( int conta; //varidvel local da fun¢ao soma somatorio = somatorio + valor; £(*A soma de 0"); for (conta=1; (conta<(valor+1)); conta++) printf ("+tu",conta); print£(* eh igual a %u\r\n",somatorio); } void main() { int cont: somatorio = 0; for (conta = 1; conta<20; conta++) { // varidvel local da fungao main soma (conta) ; ; A execucao deste programa no hardware de laboratério proposto gera seguinte saida na tela do emulador de terminal serial: soma de 0+1 eh igual a1 soma de 0+1+2 eh igual a 3 soma de 0+1+2+3 eh igual a 6 soma de 0+1+2+3+4 eh igual a 10 soma de 0+1+2+3+4+5 eh igual a 1 soma de 0+1+2+3+4+5+6 eh igual a 21 soma de 0+1+2+3+4+5+6+7 eh igual a 28 soma do 0+1+2+3+4+5+6+748 eh igual a 36 soma de 0+1+2+3+4+5+6+7+8+9 eh igual a 45 soma de 0+1+2+3+4+5+6+7+8+9+10 eh igual a 55 soma do 0+1+2+3+4+5+6+7+8+9+10+11 oh igual a 66 soma de 0+1+2+3+4+5+6+7+8+9+10+11+12 eh igual a 78 soma de 0+1+2+3+4+5+6+748+9410+11412413 eh igual a 91 soma de 0+1+2+3+4+5+6+7+8+9+10+11+12+13+14 eh igual a 105 soma de 0+1+2+3+4+5+6+7+8+9+10+ +13+14+15 eh igual a 120 PPP DD DD DD oP Microcontroladores PIC - Programagao em C soma de 0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16 eh igual a 136 soma de 0+1+2+3+4+5+6+7+8+9+10+11412+13+14+15+16+17 eh igual a 153 soma de 0#1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18 eh igual a 171 soma do 0+1+2+3+4+5+6+7+8+9+10+11412+134+14+15+16+17+18+19 eh igual a 190 wD wD Antes de analisarmos 0 funcionamento do programa, vamos explicar al- das novas declaragdes encontradas nele: No inicio do programa, encontramos duas declaragdes: fuse delay(clock=4000000) fuse rs232(baud=19200, xmit=PIN_B2,rcv=PIN_B3) Estas declaragdes sao diretivas do compilador e possuem a seguinte fun- Adiretiva delay, conforme ja dito no capitulo anterior, é utilizada para in- ao compilador a velocidade do clock do processador em que sera exe- © programa. A diretiva rs232 6 utilizada para ordenar ao compilador que gere cédigo comunicagao serial utilizando uma interface serial assincrona padrao Podemos observar que os parametros da diretiva sao: velocidade de co- wcacdo em bps (baud=19200), pino de saida dos dados transmitidos e pino de entrada dos dados recebidos (rcv). Maiores detalhes sobre diretiva sero vistos mais adiante neste livro. Podemos verificar que 0 programa € composto de duas fungdes: A fungdo soma, encarregada de realizar a soma do nimero atual ao valor lado até ali, e main, que € a fungao principal do programa, sendo res- | pela contagem de 1 a 20 e a chamada da fungao soma. Podemos ainda constatar a existéncia dos trés tipos basicos de variaveis rama anterior: A variavel global “somatorio", encarregada de acumular o valor total da dos nimeros. Esta variavel, por estar declarada no corpo principal do @, OU seja, fora de qualquer fun¢do, pode ser acessada de qualquer do programa, incluindo as fungdes soma e main. Dentro da fungao soma, encontramos a variavel “conta” que, em virtude declaragao dentro da fungao soma, é considerada local, isto €, somen- ser acessada dentro da fungdo na qual foi declarada. Também encontramos um outro tipo de varidvel na fungcao soma e que vezes passa despercebido. Observe a declaragao da fungao: Variaveis e Tipos de Dados So woid soma(int valor) Podemos fazer duas constatagdes basicas sobre a declaragao da soma: a primeira € que esta funcao nao retorna nemhum valor, ja que clarada como sendo do tipo void. A segunda é que esta funcao possui rametro formal declarado. A fungao soma recebe o seu parametro pela v. do tipo inteiro "valor". Veja que esta variavel constitui um tipo especial, apesar de ser declarada na funcao soma, efetivamente comporta-se uma variavel global. Finalmente, na fungao main encontramos também uma declaragao riavel: conta; Este comando declara, dentro da fungdo main, uma variavel inteira mada conta. Observe que esta também é uma variavel de escopo local, ja esta declarada dentro do corpo da fungao principal main. Uma observacao interessante a ser feita 6 que ambas as funcdes, e main, possuem uma variavel local chamada "conta". Note, no entanto, conteiido destas varidveis é diferente. Na pratica, o compilador aloca po: distintas de meméria RAM do PIC para acomodar as duas variaveis, m: depende da hierarquia de chamadas de fungao e alguns fatores de otimi: que serdo discutidos oportunamente neste livro. Outra observagao oportuna a ser feita: a variavel "somatorio", por ter declarada no corpo principal do programa (ou seja, fora de qualquer fur pode ser acessada de qualquer ponto do programa, como pode ser const pela analise da fungao soma e da fungao main. 5.3.1. Variaveis Locais Neste momento, é importante observarmos mais detalhadamente 0 cionamento das variaveis locais na linguagem C. Ha pouco, definimos as varidveis locais como sendo aquelas deci: dentro do corpo de uma fungao. Bem, isso nao é inteiramente verdade. De fato, 0 corpo de uma fungao € apenas uma especificagao de ul finigaéo mais ampla: variaveis locais séo aquelas declaradas dentro de ur co de cédigo. Isto é importante, pois podemos ter variaveis locais mesmo den\ blocos de cédigo pertencentes a outros comandos. Veja o exemplo seguil e Microcontroladores PIC - Programacéo em C Exemplo 5.2 int x7 // declara a varidvel local x x= 5; // atribui o valor 5 a varidvel x if (x>2) // se x maior que 2 entao fe int y+ // declara a variavel local y /* © cédigo seguinte atribui o valor lido da porta A a variavel y @ em seguida compara esse valor com 3. Se forem iguais, os pinos da porta B s&o zerados (output_b(0)) se forem dife- rentes, é colocado na porta B o valor igual a x+1 #) if ((y = input_a())==3) output_b(0); else output_b(x+1); Este programa demonstra alguns dos conceitos abordados neste tépico: ebserve que "y" € uma varidvel de escopo local declarada dentro do bloco da Geclaragao If. Esta variavel somente existira durante a execugao do bloco de omandos da declaragao if (caso a condigao seja avaliada como verdadeira). Observe também que a segunda declaracado if demonstra uma outra teristica da linguagem C que é€ permitir a atribuicdéo em uma expressao acional. No caso, 0 valor retornado da func&o input_a() é primeiramente uido a variavel "y", em seguida o valor é comparado a 3. 4. Constantes _Além das variaveis, também as constantes de dados, devido a sua apli- , No poderiam deixar de ser incluidas na linguagem C, Constantes so valores (numéricos ou nao) fixos e que nao podem ser al- S pelo programa durante a sua execugao. De maneira geral, qualquer tipo de dado pode ser utilizado para definir constante, cabendo apenas ao programador representar o valor dela ade- mente. Assim, qualquer constante pode ser declarada simplesmente ificando o nome do identificador e o seu valor. Veja os exemplos seguin- vall val2 val3 vala val5 nonnn 8 "teste* As constantes s&o também utilizadas para impedir que uma fungdo altere parametro passado a ela. Maiores detalhes desta aplicagado das constan- podem ser vistos no capitulo 8. Vatiéveis @ Tipos de Dados 5.4.1. Cédigos de Barra Invertida Alguns dos caracteres ASCII nao podem ser inseridos diretamente uma constante string. Um exemplo claro € 0 caractere de retorno de carro digo 13 decimal), o caractere de nova linha (cédigo 10 decimal), o car: de aspas ("), apdstrofo ('), entre outros. O motivo pelo qual cada um n&o poder ser inserido varia, mas vi exemplificar 0 de retorno de carro (que é aquele inserido pela tecla ENTER) caractere de aspas ("): o primeiro nao pode ser inserido diretamente pel clado, pois o retorno de carro é inserido no cédigo-fonte, provocando um indesejado. O segundo, mesmo estando facilmente disponivel no teclado, pode ser inserido diretamente na string, porque o compilador ira inter, como um sinal do término da string. Para inserir estes e outros caracteres em uma string, existem os cl dos cédigos de barra invertida. Na tabela seguinte encontramos os c mais comumente utilizados: Codigo Caractere Codigo ASCII \wy Constante Octal yyy : Axyyy Constante hexadecimal - yyy \o Nulo (null) 0 \a Campainha (BEL) O7h a \b Retrocesso (backspace) O8h \t Tabulagao horizontal 09h ‘AB) \n Linha nova (line feed) OAh Ww Tabulagao vertical OBh (Vertical TAB) \f ‘Avango de formulério 0Ch (form feed) \r Retorno de carro (Return) ODh ug Aspas 22h ne Apostrofo 27h \ Barra invertida "\" 5Ch Tabela 5.3 eo Microcontroladores PIC - Programagao em C 5.4.2. Constantes Binarias, Hexadecimais e Octais As constantes de bases numéricas diversas da decimal sao de suma im- portancia na programagao orientada a microcontroladores. A linguagem C prevé a capacidade de manusear dados numéricos nas ba- ses binaria, octal, decimal e hexadecimal. Para utilizar uma constante de base mérica diferente da decimal, podemos utilizar um dos seguintes cédigos: Valor ogg 0x99 Hexadecimal 0b10011001 Bindrio Tabela 5.4 Vejamos um exemplo de utilizagaéo de constantes numéricas de outras S: int valorl; valorl = 50; —// atribui o valor 50 decimal a variével valorl valor1 = 0x50; // atribui o valor 50 hexadecimal 4 varidvel valor valorl = 050; _/// atribui o valor 50 octal & variével valorl valorl = 0b01010000; // atribui o valor binaério 01010000 a variavel valorl 5. Operadores Toda linguagem de programagao necessita de operadores e nesta maté- , podemos dizer que a linguagem C é realmente muito rica. Em C, contamos com operadores aritméticos (adigao (+), subtragao (-), iItiplicagao (*), divisdo (/), resto de divisao (%), incremento (++) e decre- ito (--)), l6gicos e relacionais (maior (>), menor (<), igual (==), diferente :), AND (&&), OR (II)) e muitos outros. Maiores detalhes sobre 0 conjunto de operadores da linguagem e o seu ionamento podem ser vistos no capitulo 6. 6. Expressdes ExpressGes sao elementos formados pela unifo de variaveis, constantes operadores entre si. De maneira geral as expressdes seguem as mesmas is gerais das express6es algébricas em matematica. Vejamos alguns exemplos de express6es em C: Variveis e Tipos de Dados @g@ Exemplo 5.3 custo = valor; asbr+i; teste * 3; Em C, & também possivel a utilizagao de express6es condicionais, forme o exemplo a seguir: Exemplo 5.4 7/ Como a condig&o 6 avaliada verdadeira, y seré igual a (1) * 10 = 10. 1] Se a express&o fosse falsa: y = (0) * 10 = 0. Isto € possivel porque em C, as expressGes sao avaliadas e resul sempre em 0 (falso) ou 1 (verdadeiro). Outra caracterfstica importante da utilizagdo de expressdes em C 6 @ séncia de verificagao de tipos. Suponha a seguinte expressao: Exemplo 5.5 unsigned int® ay unsigned int16 b; unsigned int32 c; b Nao é dificil perceber que a variavel "a", definida como sendo de 8 nao dispde de capacidade para armazenar "c - b" que resulta no valor 99, ou seja, um valor de 17 bits. Este tipo de procedimento geraria um erro outras linguagens, mas nao em C. C € uma linguagem muito maleavel quanto a construgao de expre: constituidas de tipos diferentes de dados. A ferramenta que torna esta operacdo possivel 6 a chamada conve de tipos. Assim, no programa anterior, 0 compilador realiza uma conversao pos, convertendo o resultado de 17 bits (99.700 decimal), que é efetivar armazenado sob a forma de 32 bits, em um valor de 8 bits (116 decimal), qual demonstrado em seguida: eo Microcontroladores PIC - Programagao em C 99700 = 00000000 00000001 10000101 01110100 Convertido para 8 bits: 116 = 01110100 No préximo t6pico veremos as regras que regem a conversao de tipos nas expressdes em C. 5.7. Conversao de Tipos Sempre que tivermos uma expressao composta por dados de tipos dife- rentes entre si, sera aplicada a chamada conversdo de tipos. As regras de conversao de tipos em C sao basicamente trés: 1) Em uma atribuigdo, 0 tipo do dado resultante da expressdo é converti- do no tipo de dado da variavel que recebe a atribuigao; 2) Todos os tipos short int e char sao convertidos no seu tipo base ime- diatamente superior, ou seja, int; 3) Cada par de operandos de tipos diferentes é convertido no tipo base do tipo superior, 0 que é também chamado de promogao de tipos. Nas atribuigdes, a conversao depende basicamente de a variavel-alvo da atribuigaéo ser de maior ordem ou nao que 0 tipo resultante da expressao. A tabela seguinte representa a forma de conversao para cada tipo de dado envolvido em uma atribuicao. Tipo da Tipo da Varidvel expressao Alvo char, int, long int | Somente o bit 0 é utilizado; os outros bits sao ou int32 Resultado short int O bit O do resultado da expresso € armazenado na variavel; os outros bits sfo descartados. char, int, long int ou int32 Bhorrint + 7 O byte LSB da variavel; assume 0 resultado da long Intoulint S2 expressao; a parte MSB é zerada. Os 8 bits menos significativos do resultado da char ou int expressao sao armazenados na variavel; os outros bits sao descartados. long int ou int32 Tabela 5.5 (Continua) Variaveis e Tipos de Dados o Tipo da Tipo da Variavel expressao Alvo Heautteo! Os 16 bits menos significativos do resultado da int32 long int expressao sao armazenados na variavel; os demais bits sao descartados. O valor da expresso é truncado para o armaze- int32 float namento na variavel float; possivel perda de dados. O bit menos significativo da parte inteira do re- ee sborhins Sultado da expressao @ armazenado na variavels Os 8 bits menos significativos da parte inteira d float char ou int resultado da expressao sao armazenados na variavel. Os 16 bits menos significativos da parte inteira do resultado da expressao sao armazenados na variavel. float long int A parte inteira do resultado da expressao é baad isos armazenada na variavel. Se o resultado da express&o for negativo, 0 re- sultado sera maior que 0 médulo do resultado. signed unsigned Se 0 resultado da expressao for maior que o unsigned signed extremo de faixa do tipo, o resultado sera negativo. Tabela 5.5 No caso de uma operagao envolvendo dois tipos diferentes, o tipo de nor ordem sera convertido no tipo de maior ordem, conforme esta seqiiéncia Tabela 5.6 Maior Ordem Menor Ordem Vejamos alguns exemplos: Exemplo 5.6 int x,y? long 2; Microcontrokadores PIC - Programagéo om C +z: // 0 resultado y seré igual a 237 decimal No exemplo anterior, a expressdo "x + z" resulta em um tipo long, que é convertido no mesmo tipo de y (int), provocando a truncagem dos 8 bits mais significativos. Exemplo 5.7 float a,b; int ¢; long 4: int32 e; a= 5.5) = 10; = 330; = 100000; = (e/a) +c) * a; // 0 resultado b sera igual a 1721.5 vena Neste exemplo o compilador avalia as expressdes pela ordem determina- da pelos parénteses e traduzi primeiramente a expressao "e / d", convertendo 2 variavel "d" no tipo int32. O resultado € somado a variavel "c", sendo esta convertida no tipo int32, da mesma forma. Em seguida, 0 Ultimo resultado é multiplicado pela variavel "a" do tipo float. Isto significa que 0 resultado ante- rior sera primeiramente convertido no tipo float e em seguida multiplicado pela _yariavel "a". O resultado final € atribuido diretamente a variavel "b", pois ela é do mesmo tipo (float) que o resultado da expressao. Além da conversdo de tipos realizada pelo compilador, 0 programador pode forgar explicitamente uma expressao a ser de um determinado tipo. Esta operac&o chama-se modelagem (ou em inglés CAST) e segue esta forma: (nove_tipo) expressao Em que "novo_tipo", determina o tipo de dado (dentre os disponfveis em C) no qual a expressao seguinte sera convertida. De fato, a modelagem do dado constituise em uma operacao, 0 que faz do casting um tipo de operador undrio (j@ que envolve apenas 1 operando). Vejamos um exemplo de utilizagao da modelagem de dados: suponha que se deseje dividir uma determinada variavel inteira (por exemplo "x") por um outro valor inteiro (2, por exemplo), mas por algum motivo seja necessario que 0 resultado inclua também a parte fracionaria. Se escrevermos simplesmente: x/ 2 Vatiéveis © Tipos de Dados 8 Note, que pelas regras ja estudadas, o resultado da expressao sera bém do tipo inteiro. Assim, 0 resultado sera também sempre do tipo int Para podermos obter um resultado do tipo float, do modo desejado, Mos escrever: (float) x / 2 Um erro muito comum em programacao C é a escrita de uma expres: como esta: Exemplo 5.8 long x; int y; y= 10; x= y* 100; // 0 resultado em x serd 232 Este programa nao produz o resultado esperado: a multiplicagao de (inteiro de 8 bits) por 100 (constante inteira de 8 bits) produz outro resul de 8 bits, que sera entao convertido em um numero de 16 bits e armazen: em "x". Para efetuar a operagao desejada, devemos primeiramente convert variavel "y" em 16 bits, em seguida multiplicé-la por 100. Veja como seria: Exemplo 5.9 long x; int y; y= 10; x = (long) y * 100; // 0 resultado em x seré 1000 Outro erro classico em programacao C é o do exemplo 5.10: Exemplo 5.10 long x,y; float z; y= x= 2; z=10+(ysx)s // © resultado da expressdo acima ser4 igual a 15 e nfo 15,5 como se J] poderia esperar Uma vez que as varidveis "y" e "x" sao de tipos inteiros, a operagao divisao também ser4 inteira, provocando o descarte da parte fracionaria resto da divisao. e@ Microcontroladores PIC - Programacéo em C Para alcangarmos 0 objetivo desejado no programa acima, temos de ins- truir primeiramente o compilador, de que a divisdo ( y / x ) deve ser realizada no formato de ponto flutuante, veja o exemplo 5.11. Exemplo 5.11 long x,y; float z x= 2) z= 10+ ((float) y/ x); // 0 resultado da express&o acima seré igual a 15,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 0 con- tetido das variaveis. O primeiro modificador de tipo é const, que determina ao compilador que 2 variavel seja tratada como uma constante, conforme ja visto no item 5.4. O segundo modificador é volatile, utilizado para determinar ao compilador que a variavel por ele modificada pode ter seu contetido alterado a qualquer tempo, evitando assim que o compilador efetue otimizagdes de cédigo que de outra forma poderiam provocar um comportamento erréneo do programa. De maneira geral, o compilador CCS nao necessita do uso do modificador volatile. 5.9. Modificadores de Armazenamento Os modificadores de armazenamento sao elementos especiais utilizados para controlar a forma como o compilador ira lidar com 0 armazenamento da yeridvel Existem quatro modificadores definidos em C padrdo: auto, extern, static = register. O modificador auto é utilizado para definir 0 Ambito ou escopo da variavel mo local. Nao é necessario utilizar esse modificador, porque, por definicao, variaveis em C possuem escopo local. O modificador extem é utilizado para definir variaveis externas ao programa. (0 € muito utilizado na criagao de programas grandes e complexos, utilizando rsos médulos separados e que sao depois ligados por meio de um programa Vatiéveis ¢ Tipos de Dados © especial chamado /inker. O compilador CCS nao permite variaveis do tipo no entanto esta continua sendo uma palavra reservada da linguagem. O modificador register € utilizado para instruir ao compilador que armazenar a variavel diretamente em um registrador da CPU. Esse modific: nao possui efeito no compilador CCS, ja que todas as variaveis sao arm das em registradores. O Ultimo modificador, static, determina ao compilador que a variavel para uma posicao permanente na meméria. As variaveis do tipo static funcionam como as variaveis globais no do de que nao sao destruidas ao término da execugao da fungao na foram declaradas, e funcionam como variaveis locais no aspecto de que sao conhecidas fora da fungao em que foram originalmente declaradas. disso, as variaveis static sao sempre inicializadas pelo compilador com o 0. Variaveis static sao utilizadas quando necessitamos manter o valor uma variavel local da funcao entre uma chamada e outra, 0 que facilita o balho de criagao de bibliotecas de fungdes. Um exemplo de utilizagao de variaveis static encontra-se em seguida: Exemplo 5.12 #include <16F628.h> fuse delay (clock=4000000) #fuses HS, NOWDT, PUT, NOBROWNOUT , NOMCLR, NOLVP fuse 18232 (baud=19200,parity=N,2mit=PIN_B2, rev=PIN_B1) int calcula(void); // protétipo da fungao main() int conta; for (cont: 7 contasS; contar+) printf (**d *, calcula()); int calcula(void) static int valo valor = valor + 1! return(valor) ; 5.10. Alocagao de Memoria Como ja foi dito, cada vez que declaramos uma variavel, o compila reservar um ou mais enderegos da meméria RAM de forma a armazenar riavel. eo Microcontroladores PIC - Programago em C Neste topico iremos estudar a forma como sao armazenadas as variaveis na meméria do microcontrolador. Como ja foi dito, as variaveis do tipo inteiro sao armazenadas sempre ini- ciando-se da parte menos significativa (LSB) para a parte mais significativa (MSB). Isto significa que se uma variavel inteira de 32 bits contendo o valor 0x12345678 estiver armazenada no endereco 0x20 hexadecimal, teremos a seguinte distribuigdéo na meméria RAM: Endereco | Conteddo 0x20 0x78 Ox24 0x56 Ox22 0x34 0x23, Ox12 Tabela 5.7 No caso das variaveis do tipo float, o formato utilizado é o ponto flutuante adotado pela Microchip. Neste formato, sao utilizados 4 bytes de meméria, sendo divididos da se- guinte forma: Formato eb | f | « {2 TeEE7S4 =| soot sea | y.se0 scam | soe 2900 | x00 2000 Microchip 200K 2000 S-XXX XXXX KKK XXX XXKK XXX Tabela 5.8 Em que: * eb € 0 expoente do nimero somado a 127, s € 0 bit de sinal e f0, f1 e f2 armazenam a parte fracionaria da numero. No caso do formato IEEE 754, y é 0 bit LSB do expoente eb. Observe que o formato padronizado pelo IEEE difere do utilizado pela Mi- crochip e adotado pelos compiladores CCS. Isto ocorre por uma questao de otimizacao, pois 0 0 formato adotado pela Microchip permite uma execucao mais veloz dos calculos envolvendo dados do tipo ponto flutuante. 5.11. Redefinindo Tipos de Dados A linguagem C prové ainda um comando que permite ao programador de- finir novos nomes para os tipos de dados existentes. Variavels @ Tipos de Dados @ Este comando 6 0 typedef e o seu formato geral é: typedef tipo novo_nome; Vejamos um exemplo de utilizagao do comando typedef: Exemplo 5.13 typedef float fracao; fracao variavel; // declara uma varidvel do tipo fracao (float) 5.12. Exercicios 1) 2) 3) 4) 5) 6) 7 Quais so os tipos basicos de dados na linguagem C padrao? Qual é a diferenga entre os tipos short int e int1 no compilador CCS? Qual € a diferenga entre uma variavel signed e outra unsigned? Qual é a magnitude de armazenamento do tipo long int? Suponha que o valor —1 € armazenado em uma variavel do tipo signed e€ em um determinado ponto do programa essa variavel é atribuida a do tipo unsigned int. Qual é o valor efetivamente armazenado na Git variavel? Qual é a diferenga entre uma variavel global e uma static? No programa seguinte, qual o escopo (global/local) de cada uma das riaveis? int teste; int funcaol (int a, int b) ( return a+b; ) main() { dat valor; valor =5; teste = funcaol(valor,10); ) Microcontroladores PIC - Programagio em C 8) Qual o resultado armazenado na variavel "y" no programa seguinte? int x,y? x= 5; y= (xe=5) * 2; 9) Indique o resultado armazenado na variavel "x" do programa seguinte: int xvi long int 2; z = 0x1234; yezel xeye*dl; 10) No programa seguinte, qual o valor armazenado em "z"? int x; long y7 float 2; x = 110; y = 300; zey/ x 11) Qual a utilidade da modelagem de dados ou typecasting? \Varidve's e Tipos de Dados @ c Anotacgées cil aildailleiall e Microcontroladores PIC - Programago em C Operadores Como ja foi dito, a linguagem C possui uma gama de operadores, sendo possivelmente uma das linguagens com maior numero de operadores disponi- vel atualmente. Esta caracteristica 6 um dos pontos positivos da linguagem, ja que C agrega aos operadores comumente encontrados nas linguagens de alto nivel, os operadores encontrados freqiientemente em linguagens de baixo nivel como o Assembly. Podemos classificar os operadores da linguagem C em sete categorias principais: atribuicao, aritméticos, relacionais, légicos, ldgicos bit a bit, de meméria e outros, 6.1. Atribuigao A primeira categoria de operadores € também a mais utilizada. Em C, 0 operador de atribuigao "=" é utilizado para atribuir um determinado valor a uma variavel. Um exemplo de atribuigao: x ¥ 10; a7 Podemos verificar no programa anterior duas operagdes de atribuicao: na primeira, foi atribufdo o valor 10 a variavel "x", na segunda, foi atribuido 0 va- lor de "x" (que 6 10) a variavel "y". Conclui-se entao que ao final do programa, *y" sera igual a 10. Repare que a atribuigao € sempre avaliada da direita para a esquerda e nao € possivel realizar uma atribuigao no sentido inverso. oa ° 6.2. Aritméticos SAo utilizados para determinar ao compilador que efetue determin: operacao matematica em relagao a um ou mais dados: ‘Operador ‘Agao Adigao = ‘Subtragdo ou menos unério * Multiplicago / Divisao % Resto de divisdo inteira ++ Incremento Decremento Tabela 6.1 Os operadores de adic&o, subtragao, multiplicac&o e divisdo dispen: comentérios. O operador % é utilizado para retornar 0 resto de uma operagao de divi inteira. Vejamos um exemplo: 5 / 2 = 2,5 em uma divisao real, ou 5 / 2 = 2, em uma divisao inte sendo o resto igual a 1. Assim, 0 resultado de 5 / 2 € 2 € o resultado de 5 % 2 € igual a 1. Os operadores de incremento e decremento sao utilizados para som (incremento) ou subtrair 1 (decremento) de uma variavel. A forma geral para utilizagdo destes dois Gltimos operadores é: variavel ++; ou varidvel --; Ou ainda por meio de uma atribuigao: variavel_1 = variavel_2 ++; ou variavel_1 = variavel_2 --; Observe que em ambos os casos, a atribuigdo ocorre da seguinte for o valor da variavel "variavel_2" € armazenado em “variavel_1" e apés is: 0 conteddo de "variavel_2" € incrementado ou decrementado. No entanto, em C é também possivel escrever: variavel_1 = ++ variavel_2; ou variavel_i = -- variavel_2; Microcontroladores PIC - Programagéo em C Nestes casos, a operacao de incremento/decremento é realizada antes da atribuigao propriamente dita. Vejamos um exemplo: int x,y,z; 0; Neste caso, apés a execucao dos trés comandos, o valor da varidvel "x" sera igual a 2, o valor da variavel "y" sera igual a O e o valor da variavel "z" sera igual a 2. Observagao importante: Nao € possivel utilizar os operadores de incre- mento ou decremento com variaveis ou tipos de dados complexos, tais como 05 tipos ponto flutuante. Note que ha uma diferenga clara entre escrever "y =x + 1" e "y = +4x": Ambas produzirao 0 mesmo resultado em "y", no entanto, no primeiro caso, somente a variavel "y", alvo da atribuic¢ao, € alterada. Ja no segundo caso, tanto "y", como "x" sao alteradas ! 6.3. Relacionais Sao utilizados em testes condicionais para determinar a relacao existente entre os dados: Maior que Maior ou igual a Menor que Menor ou igual a Igual a Diferente de Tabela 6.2 Nao ha muito o que falar sobre estes operadores, j4 que o seu funciona mento é idéntico ao que todos estudamos na disciplina de matematica e que utilizamos no nosso dia-a-dia. Operadores 0 c Repare que os operadores relacionais podem ser utilizados para cons! express6es condicionais como ja visto no capitulo anterior. 6.4. Logicos Booleanos Os operadores légicos ou booleanos sao utilizados para realizar co! goes, disjungdes ou negagdes entre elementos em um teste condicional. operadores l6gicos somente podem resultar em um dos valores: verdadeiro falso. NOT (NAO) Tabela 6.3 Os operadores relacionais sao elementos de suma importancia na trugao de testes condicionais. Com esses operadores podemos relacit diversas condigoes diferentes em um mesmo teste légico. Vejamos um exemplo: int x,y7 x = 10; L£ (25 && x<20) y = x: Como podemos verificar, a variavel "y" somente sera igual ao valor riavel "x" se o valor de "x" for maior que 5 e "x" for menor que 20. O que leva a concluir que ao final da execugao do programa "y" sera igual a 10. Observe que para determinar o resultado da conjung¢ao no comando: compilador procede da seguinte forma: primeiramente avalia a expressao 5", 0 que no presente caso resulta verdadeiro, j4 que "x", que vale maior que 5. Em seguida, procede @ avaliagao da expressdo "x < 20", a também resulta verdadeira. Finalmente, o compilador verifica 0 resul conjungao (verdadeiro E verdadeiro) o qual é verdadeiro, executando as: atribuigao seguinte (y = x). Um aspecto importante a ser observado é que em C, uma variavel lor igual a zero, sera avaliada como falsa e se tiver um valor diferente de sera avaliada como verdadeira. Vejamos um outro exemplo: int teste, teste_2; teste = 0; teste_2 = 0; if (!teste) teste 2+t; eo Microcontroladores PIG - Programagéo em C Como podemos perceber, a avaliagao de "!teste" sera verdadeira, ja que _ a variavel possui valor zero e o teste verifica a negacao da variavel. Assim, no _ presente caso, a variavel "teste_2" terminara com o valor 1. 6.5. Légicos Bit a Bit Os operadores légicos bit a bit sao utilizados para realizar operagdes |dgi- cas entre elementos ou varidveis. No entanto, ao contrario dos operadores légicos simples, os operadores légicos bit a bit podem resultar em um valor da mesma magnitude dos elementos operados. Operador Agao & AND (E) | OR (OU) = XOR (OU exclusivo) = NOT (complemento de um) >> Deslocamento a direita =< Deslocamento a esquerda Tabela 6.4 6.5.1. Operador & (And) A operagao légica AND funciona da mesma forma que o operador boolea- no AND, mas com a diferenca de que a operacao é realizada separadamente para cada bit dos operandos. Vejamos um exemplo: int vi,v2; vl = 100; v2 = vl & 15; A operagao AND representada ocorrera da seguinte forma: 100 decimal= 01100100 AND (&) 015 decimal= 00001111 Resultado= 00000100 Isto significa que o valor armazenado em "v2" sera igual a 4 decimal. Operadores: eo c Podemos perceber que o operador légico AND é uma excelente forma desligar um ou mais bits de uma determinada variavel, j4 que um bit O em dos operandos fara com que 0 respectivo bit do resultado seja também igual zero. Imagine que desejemos desligar os bits 5, 6 e 7 de uma variavel char da "portb". A forma de fazer isso poderia ser: byte portb = 6 portb = portb & 0b11100000; 6.5.2. Operador | (OR) A operacao OR, tal qual o operador AND, também trabalha de maneira milar ao seu equivalente booleano, com a diferenga de que também aqui operacao é realizada para cada bit dos operandos. Vejamos um exemplo: int vi,v2; vi = 0x20; v2 = vl | 0x04; Esta operacdo OR sera realizada da seguinte forma: 20 hexadecimal= 00100000 OR (|) 04 hexadecimal= 00000100 Resultado= 00100100 Como podemos perceber, o resultado armazenado em "v2" sera igual 24 hexadecimal, e se analisarmos a operagao, poderemos concluir que a oj ragao OR constitui uma excelente forma de ligar bits de uma variavel, j4 que bits em um dos operandos permanecerao sempre ativados no resultado. 6.5.3. Operador “ (XOR) A XOR (exclusivamente OU) consiste em uma operagao légica entre doi na qual o resultado somente sera verdadeiro (nivel l6gico 1) se um e soment um deles for verdadeiro (nivel 1). Ou seja, caso os operandos sejam iguais (0, O ou 1, 1), 0 resultado sera falso (nivel 0). Operadores XOR so muito utilizados em fungdes de comparagao de val res: se os bits dos operandos sao iguais, o resultado é 0; se forem diferentes, 0 resultado 6 1. Vejamos um exemplo do funcionamento do operador XOR em C: eo Microcontroladores PIC - Programago em C Vejamos a execucéo da operacao XOR: 100 decimal= 01100100 XOR (4) 99 decimal= 01100011 Resultado= 00000111 Podemos observar 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 fossem iguais, o resultado seria igual a zero. 6.5.4. Operador ~ (NOT) O NOT atua como operador de negagao, ou em aritmética binaria 0 com- plemento de um. Isto significa que o operador NOT inverte o estado de cada bit do operando especificado. Vejamos um exemplo: int x,yF long a,b; xe 1; ti ~ xt ~ar a ¥ b Vejamos a operagao do operador de complemento: 1decimal= 00000001 (8 bits, variavel x) i Resultado = 11111110 (8 bits, variavel y) 1 decimal= 0000000000000001 (16 bits, variavel a) Resultado= 1111111111111110 (16 bits, variavel b) Concluimos entao que a variavel "x", de 8 bits, terminara o programa com ‘© complemento do valor 1, ou seja, 254. Ja variavel "b" sera atribuido o valor da negagao de "a", de 16 bits, 0 que resulta no valor 65534. 6.5.5. Operadores de Deslocamento << E >> Finalmente, temos ainda os operadores de deslocamento de bits a es- querda e a direita. O formato geral de uso destes operadores é: * valor >> numero de bits a deslocar 4 direita ou * valor << namero de bits a deslocar 4 esquerda cu ° Vejamos um pequeno programa para demonstrar o funcionamento dos operadores de deslocamento: int x, y, zy = 10; y=x << 2) = x >> Lp O funcionamento dos operadores de deslocamento é 0 seguinte: Primeiramente € atribuido a variavel "y" 0 deslocamento de dois bits a esquerda da variavel "x". Vejamos 0 funcionamento desta operacao: 10 decimal= 00001010 << 00010100 << Resultado= 00101000 Observe que foram realizadas duas operagdes de deslocamento, sendo que o primeiro deslocamento resultou em 00010100 binario (20 decimal). Em seguida € realizado outro deslocamento, que resulta em 00101000 bindrio (40 decimal), sendo este valor atribuido a variavel "y". A préxima linha atribui a variavel "2" o valor de "x" deslocado um bit a di- reita. Vejamos o seu funcionamento: 10 decimal= 00001010 >> z= 00000101 Percebemos que o contetido da variavel "x" (00001010 binario ou 10 de- cimal) € deslocado um bit a direita, resultando em 00000101 binario ou 5 decimal, sendo este valor atribuido a variavel "2". Com base nestas operagdes podemos verificar que no operador de deslo- camento a esquerda, cada bit deslocado equivale a multiplicar o primeiro ope- rando por 2. Ja no operador de deslocamento a direita, eqilivale a dividir o operando por 2. Observe que cada operagao de rotagao € traduzida pelo compilador em uma instrugéo assembly de rotacdo de bits (RLF ou RRF, conforme o caso). Observacao importante: Nao é possivel utilizar os operadores légicos bit a bit com varidveis ou tipos de dados complexos, tais como os tipos ponto flutuante. e Microcontroladores PIC - Programagao em C 6.6. Memoria Os operadores de meméria, também chamados de operadores de pontei- ros, Sao elementos de grande importancia na linguagem C. De fato, os pontei- ros sao considerados um dos pilares da linguagem C, pois permitem o acesso direto a qualquer enderego de meméria do sistema. Existem dois operadores complementares para 0 acesso a memoria: Enderego do operando Conteido do enderego apontado pelo operando Tabela 6.5 6.6.1. Operador & O & € um operador un4rio utilizado para retornar 0 endereco de memoria do seu operando. Isto significa que se escrevermos: endereco_a = &a; Teremos que a variavel "endereco_a" contera o enderego em que esta armazenada a variavel "a". 6.6.2. Operador * Jao * € um operador unério utilizado para retornar o conteGdo da posi¢gao de meméria enderegada pelo operando que o segue. Vejamos outro exemplo: a = *endereco_a; O que fara com que o valor armazenado no local apontado pela variavel “endereco_a" seja atribuido a variavel "a". Veja em seguida um pequeno exemplo da utilizagao de ponteiros: Exemplo 6.1 #include <16£628.h> tuse delay (clock=4000000) #fuses HS,NOWDT, PUT, NOBROWNOUT, NOMCLR, NOLVP fuse 16232 (baud-19200,parity=N,xmit=PIN_B2,rev-PIN_B1) int *endereco,x,y; rain () endereco = &x; y = *endereco; printf("valor x= td - endereco de x= %lx - valor y= td",x,endereco,y); ) Provavelmente a saida impressa deste programa sera: valor x= 5 - endereco de x= 26 - valor y= 5 O que significa que o valor de "&x" (enderego de "x") é igual a 0x26, seja, a variavel "x" esta localizada no enderego 0x26 da memoria RAM do PI Maiores detalhes sobre o funcionamento dos operadores de meméria rao vistos quando estudarmos a operagao dos ponteiros no capitulo 8. 6.7. Outros Operadores Além dos operadores anteriormente citados, podemos encontrar ainda tros operadores nao tao conhecidos em C: [rendor[ ate —*d |? | Operador ternario condicional ‘ Separador de expressdes Separador de estruturas Ponteiro de elemento de estrutura (tipo) Operador de Modelagem de dado sizeof Retorna o tamanho da varidvel Tabela 6.6 6.7.1. Operador? O operador ternario "?" & utilizado para substituir uma expressdo con cional baseada no comando IF e tem esse nome devido ao fato de ser cor posto sempre por trés expressdes. Sua forma geral é: Variaével = Express&ol? Express&o02: Express&o3 . s s 7 O que significa: avalie a expressao 1 e se ela for verdadeira, atribua 4 va- riavel a expressao 2; caso contrario, atribua a expressao 3. Vejamos um exemplo: 6 Microcontroladores PIC - Programagao em C O funcionamento deste programa é o seguinte: primeiramente é atribuido o valor 5 a variavel "x". Em seguida, a expressao condicional é avaliada: se "x" for igual a 7, entao "y" sera igual a 10; caso contrario, "y" sera igual a "x" mais 3. Como sabemos que "x" é igual a 5, teremos que "y" sera igual a 8 (5+3). Note que também é possivel utilizar 0 operador "?" de uma forma pouco convencional, como neste outro exemplo: Exemplo 6.2 #byte porta = 5 fbyte portb = 6 int liga_led(void) porta = porta | 1; // ativa o pino 0 da porta A ) int desliga_led(void) t porta = porta & 254; // desliga o pino 0 da porta A , main() while (true) (portb & 1) ? liga led() : desliga_led(); ) Neste pequeno programa, temos trés fungées: a principal main() e outras duas chamadas liga_led e desliga_led. Na fungao principal, 0 programa permaneceré num /oop infinito (while (true)) avaliando a expressao: (portb & 1) ? liga_led() : desliga_led(); Se a avaliacao de "portb & 1" resultar verdadeira, ou seja, diferente de zero, ou melhor dizendo: se o bit O da porta B estiver em nivel légico 1, sera executada a primeira fungao liga_led; caso contrario, sera executada a segun- da fungao desliga_led. 6.7.2. Operador Virgula Outro operador pouco conhecido da linguagem C € o virgula, utilizado para enfileirar duas ou mais expressées. A forma geral de utilizagao deste operador é& Operadores variével = (express%o 1, expresso 2[,expressio x]) Note que as expressées sao avaliadas da esquerda para a direitae a ridvel recebe o valor da Gitima expressao avaliada. Veja o exemplo seguinte: = (x20, x45); Como podemos perceber, primeiramente a varidvel "x" assume o vali zero € em seguida, "y" ira assumir o valor de "x" mais 5, ou seja, ao final avaliagdo da expresso, ""y=5". Observe ainda que é possivel colocar outras expressdes n&o necessari mente relacionadas com a atribuicao em si, como no exemplo seguinte: z= (x= 0, y= 5, x= 2); O compilador gera cédigo para cada expresso individualmente, termin: do por gerar o Ultimo cédigo: "z = x - 2". 6.7.3. Operador Ponto O operador ponto é utilizado em estruturas de dados como separador do: elementos e sera estudado mais adiante, no capitulo 8. 6.7.4. Operador -> Também chamado de operador seta, é utilizado para a fungdo de ponte Para uma estrutura de dados e sera devidamente estudado no capitulo 8. 6.7.5. Operador de Modelagem de Tipo Conforme ja visto no capitulo anterior, a linguagem C dispde de um o} rador unario destinado especificamente a forgar a conversdo do operan especificado em um tipo de dado determinado. A isto, dé-se o nome de mot lagem ou typecasting. A forma geral do operador de modelagem é: (tipo) varidvel Onde "tipo" especifica o novo tipo de dado para o qual o contetido atual da variavel especificada sera convertido. eG Microcontroladores PIC - Programago em C Observe que 0 contelido da variavel nao € alterado pelo operador, ao in- vés disso, aloca-se uma regido de RAM para 0 armazenamento temporario do valor modificado. 6.7.6. Operador Sizeof O operador sizeof é utilizado para retornar a quantidade de memoria utili- @ por uma determinada variavel ou um determinado tipo de dado. A principal aplicagdo deste tipo de operador € permitir ao programador itrolar a ocupagao de meméria pelo programa, auxiliando assim na portabi- le do programa. A forma geral do operador é: sizeof varidvel OU sizeof (tipo de dado) .8. Associacao de Operadores Para facilitar a vida do programador, a linguagem C inclui ainda uma outra teristica que € a abreviacao de operadores em atribuigdes e funciona da juinte forma. Normalmente, as operagdes de atribuigado mais freqiientemente encontra- Nos programas possuem a seguinte forma: varidvel = varidvel (operando) valor {ou variével) Nestes casos, a abreviagao de operadores permite economizar a Segunda rita da variavel, reduzindo 0 comando a seguinte forma: varidvel (operando)= valor {ou varidvel} Na tabela seguinte, podemos encontrar os tipos de operadores abrevia- admitidos em C. Forma expandida K=xX+y x=x-y Kex ty Tabela 6.7 (Continua) Operadores 6.9. Precedéncia dos Operadores Na tabela apresentada em seguida, podemos verificar a ordem de prece- déncia de todos os operadores disponiveis na linguagem C. Por ordem de pre- cedéncia entende-se a prioridade na avaliagao de miltiplos operadores numa determinada expressao. Isto significa que operadores de maior ordem de precedéncia serao avaliados primeiramente em relacdo aos operadores de menor ordem. E claro que o uso de parentesis em uma expressao, como podemos co- lher da tabela, permite aumentar a precedéncia de avaliagao do conteddo in- terno aos mesmos. Ordem Operador Maior Cy) bp > Tabela 6.8 (Continua) eo Microcontroladores PIC - Programagao em C Ordem Operador Menor i Tabela 6.8 No caso de operadores de mesma prioridade ou precedéncia, a ordem de avaliagdo é a natural, ou seja, da esquerda para a direita. 6.10. Exercicios 1) Qual é a diferenca entre o operador = e 0 operador ==? 2) Qual é 0 resultado da expressao (10 && 5)? 3) Qual € 0 resultado da expressao (10 | 5)? 4) Como é avaliada a expressdo (x = (10+5) < 20)? 5) Qual € 0 valor de "x" ao término do programa apresentado em seguida? int x,y7 y = 256; yte dr x=y>>1 6) Qual € 0 resultado da expresso (10 % 3 + 1)? 7) Qual é 0 valor de "y" ao término do programa seguinte? Jong int x? ty +z be 1; = (int) x; 8) Qual é 0 valor armazenado nas variaveis "y" e "2" no programa seguinte? long int x: int y,2z; x = 0x1234; y=x 2 = x>>8; eo Microcontroladores PIC - Programagao em C Declaragoes de Controle As declaragdes ou comandos de controle sao uma parte muito importante de uma linguagem de programacao, e a linguagem C dispde de um excelente conjunto de comandos. Podemos classificar as declaragdes de controle em duas categorias basicas: + Declaragdes de teste condicional: sao utilizadas para testar determi- nadas condigdes / variaveis e executar um cédigo para cada caso. A linguagem C dispde de dois tipos de declaragdes condicionais: 0 co- mando if e 0 comando switch; * Declaracdes de estrutura de repeticao: so utilizadas para provocar a execugdo de um bloco de comandos enquanto uma determinada con- digdo for verdadeira. Em C dispomos de trés declaragdes de repeti- ¢&o: for, while e do-while. Além destas declaracdes de controle, a linguagem C apresenta ainda a declarac&o goto, utilizada para provocar o desvio incondicional do programa. 7.1. Comando If O comando if ja foi visto anteriormente neste livro, portanto agora vamos analisar em maior profundidade o seu funcionamento. De maneira geral, 0 comando If (ou "se" em portugués) é utilizado para executar um comando ou bloco de comandos no caso de uma determinada condi¢ao ser avaliada como verdadeira. Opcionalmente, é também possivel executar outro comando ou bloco de comandos no caso da condig¢ao ser ava- liada como falsa. A forma geral do comando if é: if (condig&o) comandoA; { else comandoB;} Declaragdes de Controle 6 = Nesta forma ele pode ser um comando ou declaragao qualquer da lingu: gem C, ou um bloco de comandos na seguinte forma: if (condi¢&o) 4 comandoAl; // loco de comandos para a condi¢&o verdadeira comandoa2; } else 4 comandoB1 ; // bloco de comandos para a condig&o falso comandoB2; Observe que, em ambos os caso, a clausula else 6 opcional, nao sen obrigatéria para o funcionamento do comando. O principio de funcionamento do comando é muito simples: se a condigao for verdadeira, sera executado apenas 0 comandoA (ou o bloco de comando: A). Caso a condigao seja avaliada como falsa, entao sera executado apenas o comandoB (ou 0 bloco de comandos B). Um detalhe muito importante a ser observado é que nunca, no mesmo teste, os dois comandos ou blocos de co- mando serao executados, apenas um ou outro. Exem char letra; int x: letra = 'A'; if (letra: if (letra== + // caso a varidvel letra seja igual 'A', ent&o x=0; A‘) B') x=5; // caso a varidvel letra seja igual 'B', ent&o x=! Um aspecto muito importante da linguagem C e que muitas vezes provoca confusées ao programador iniciante 6 que a condi¢do a ser testada nado preci- sa necessariamente envolver operadores relacionais ou légicos. De fato, so- mente € necessario que a expressao possa ser avaliada como verdadeira ou falsa. Assim, 6 possivel escrever 0 seguinte programa em C: Exemplo 7.2 int x= 57 if (x) y = x; eo Microcontroladores PIC - Programa¢&o em C Veja que a condicao a ser testada é simplesmente o valor da varidvel "x". Se a condicao for verdadeira, ou seja, se "x" for diferente de zero, entaéo a atribuigao " " sera executada. Caso "x" seja avaliada como falsa, ou seja, caso "x" seja igual a zero, entao a atribuigao nao sera executada. E possivel ainda encadear, ou aninhar, diversos comandos if um dentro do outro. Veja a forma geral em seguida: if (condig&o1) comandoa; else if (condicao2) comandoB; else if (condig&o3) comandot; Neste caso, sera primeiramente avaliada a expressdo "condigado1", se verdadeira, sera executado o "comandoA", caso falsa, sera avaliada a "condi- ¢802", caso seja verdadeira, sera executado o "comandoB", caso seja falsa, ser avallada a "condig&o3" e se esta for verdadeira, sera executado o "co- mandoC". No exemplo seguinte, 0 programa faz uma leitura da porta A do microcon- trolador e em seguida, utilizando uma estrutura de declaragao if/else, testa sucessivamente o valor da variavel "x" (lida da porta A), até encontrar um valor igual ao da variavel, executando 0 comando output_high correspondente que fara setar um determinado pino da porta B do microcontrolador. Exemplo 7.3 include fuse delay (clock=4000000) fuses INTRC,NOWDT, PUT, NOBROWNOUT, NOMCLR, NOLVP int x7 main() { while (true) ‘ x = input_a(); output_port_b(0); if (1x) output_high (pin_b0); else ) output_high(pin_b1); else ) output_high(pin_b2); else ) output_high(pin_b3); else ouput_high (pin_b4); Suponha que apenas 0 pino RA1 esteja em nivel légico 1 e os outros pi- nos da porta A estejam em nivel |6gico 0. Deciaragées de Controle @ A execugao deste programa fara com que seja atribuido o valor decimal 2 (lido da porta A) a variavel "x". Em seguida, o primeiro comando if verifica se o valor da expressao (!x) € verdadeiro. Como "x" é igual a 2, entao a expressao sera avaliada como falsa e a préxima declaracao If sera avaliada. Novamente, 0 resultado da avaliagao sera falso, ja que "x" € diferente de 1, fazendo com que a proxima declaracao if seja analisada. Agora, como "x" é igual a 2, a ava- liag&o da expressao sera verdadeira e 0 comando output_high(pin_b2) sera executado, fazendo com que o pino RB2 seja setado. Os outros pinos da porta B permanecerao em nivel 0. Observe que o préximo if nao é avaliado. 7.2. Comando Switch Eni alguns casos, como na comparacao de uma determinada variavel a diversos valores diferentes, 0 comando If pode tornar-se um pouco confuso ou pouco eficiente. A declaragao switch permite a realizagao de comparagdes sucessiva: como a anterior, de uma forma muito mais elegante, clara e eficiente. Vejamo: entao o formato geral da declaracao switch: switch (variével) ¢ case constantel: comandoa; break; case constante2: comandoB; break; default: comandoz; ) Observe que o valor da variavel 6 testado contra as constantes especi cadas pela clausula case. Caso a variavel e a constante possuam o mes! valor, entao os comandos seguintes aquela clausula case serao executados. Caso o valor da variavel nao encontre correspondentes nas constantes especi- ficadas pelas case, entéo os comandos especificados pela clausula default s&o executados. Repare que cada seqliéncia de comandos da clausula case é encerrada por uma clausula break. Caso esta clausula seja omitida, entao todos os mandos subseqiientes ao case especificado serfo executados, até que seja encontrada uma outra clausula break, ou seja, atingido o final do blo switch, Microcontroladores PIC - Programago em C A explicagao para este comportamento € simples: uma seqiéncia de co- mandos apés uma clausula case nao é um bloco de comandos e sendo as- sim, deve haver uma forma de especificar o termino dessa seqiiéncia, 0 que 6 feito pela clausula break. Uma alternativa ao cédigo anterior utilizando o comando switch pode ser: Exemplo 7.4 // Bste exemplo utiliza o circuito da figura 1.3 #include <16£877.h> fuse delay (clock=4000000) #£uses HS,NOWDT, PUT, NOBROWNOUT, NOLVP main() { setup_adc_ports (no_analogs) ; while (true) { output_port_b(0); switch (input_a()) { 0 + output_high (pin_b0); break; 1 + output_high(pin_b1); break; 2: output_high(pin_b2); break; 3: output_high(pin_b3); break; default: output_high (pin_b4) ; No programa anterior, o valor lido da fungao input_a(), que efetua a leitu- ra da porta A do microcontrolador, sera comparado as constantes 0, 1, 2 e 3. Caso o valor corresponda a uma das constantes, a respectiva clausula case sera executada. Caso 0 valor lido nao encontre correspondentes, sera execu- tada a clausula default. Algumas caracteristicas importantes da declaracdo switch: * A declarag&o switch somente pode testar igualdades. Nao sao admi- tidos outros operadores relacionais ou légicos como em if; * Somente dados ordinais podem ser utilizados como constantes, ou seja, nameros inteiros de 1, 8, 16 ou 32 bits, ou ainda constantes de Caractere; * N&o € permitido que, dentro do mesmo switch, duas cases tenham constantes iguais; Declaragées de Controle So * As clausulas break e default sao opcionais, havendo situagdes que a néo-utilizaco da clausula break permite a construcao de e: turas switch ainda mais eficientes, como veremos em seguida. 7.2.1. Clausula Break Como ja dito anteriormente, a clausula break possui a funcdo de ence! uma seqiiéncia de comandos de uma clausula case. No entanto, podemos deliberadamente omitir a clausula break para com que uma mesma seqiiéncia de comandos seja executada para vai case. No fragmento de programa seguinte, caso a variavel "x" possua um vali entre O e 3, sera executado o primeiro bloco de comandos, caso possua valor 4, sera executado o segundo bloco de comandos e caso seja outro val sera executado 0 Ultimo bloco de comandos: Exemplo 7.5 switch (x) case case case case // caso o valor de x esteja entre 0 e 3, executa os comandos daqui 7/ até o préximo break break; // encerra os comandos de todas as case acima case 4: // caso o valor seja igual a 4, executa os comandos daqui até o // prximo break break; default: // caso seja diferente de 0,1,2,3 ou 4, executa estes comandos E af que percebemos 0 motivo de n&o definir um bloco de comandos (na forma tradicional utilizando { e }) para cada clausula case, pois se para cad: case fosse definido um bloco de comandos, entao nao seria possivel escrever a clausula case 1 anterior, pois nao poderiamos iniciar um bloco de cédigo € nao feché-lo antes de outro bloco. Repare que normalmente nao se utiliza uma clausula break apés a clau- sula default, ja que normalmente default é a Gitima clausula de um comando switch. © Microcontroladores PIC - Programacéo em C . Estruturas de Repeti¢ao Como ja foi dito no inicio deste capitulo, as estruturas de repeticao, ou s de repeticao, como sao também chamadas, sao estruturas especiais de andos, construidas de forma a executar repetidamente um determinado ando ou bloco de comandos. Na verdade, como veremos mais adiante, a estrutura no precisa executar virtualmente nenhum comando. Existem trés estruturas de repeticao na linguagem C: "Para", "Enquanto" “Faga - enquanto". A primeira estrutura 6 baseada no comando for ("Para") e é basicamente wtilizada para lacos finitos de contagem, normaimente utilizando uma variavel controle da contagem. Aestrutura baseada no comando while ("Enquanto") é utilizada para repe- Zo de um determinado conjunto de instrugdes enquanto uma condi¢ao for werdadeira. Finalmente, a estrutura baseada no comando do-while ("Faca - enquanto") muito similar a estrutura while, com a diferenga de que aqui a condicao é€ analisada no final do bloco de comandos. Vejamos entao cada estrutura mais detalhadamente. 7.3.1. Lago For O laco for é uma das mais comuns estruturas de repeticao, sendo a ver- 's30 C considerada uma das mais poderosas e flexiveis dentre todas as |in- guagens de programacao. O formato geral do laco for é: for ( inicializac&o ; condic&o ; incremento ) comando; ou, for ( inicializag&o ; condi¢fo ; incremento ) ¢ /Peloco de comandos; comandol ; comando2y } Cada uma das trés secdes do comando for possui uma fungao distinta, conforme em seguida: Declaragdes de Controle @ * Inicializagao: esta secdo contera uma expressao valida utilizada ni malmente para inicializagdo da variavel de controle do lago for. * Condi¢ao: esta secdo pode conter a condicdo a ser avaliada para cidir pela continuidade ou nao do laco de repeticao. Enquanto a cor gao for avaliada como verdadeira, 0 lago for permanecera em exe‘ cao. + Incremento: esta secdo pode conter uma ou mais declaragées pi incremento da variavel de controle do lago. O funcionamento basico do comando é€ 0 seguinte: primeiramente a sé de inicializagéo do comando é executada, em seguida, a condigao de teste avaliada € caso seja verdadeira, 6 executado 0 comando ou bloco de col dos, em seguida a segao de incremento € executada e o laco é repetido (' tando a avaliar a condigao de teste). O comando for pode ser utilizado para repetir um comando ou bloco comandos, no entanto é também possivel nao executar nenhum comando neste caso, 0 comando for possui apenas a funcao de retardar a execucado programa por um periodo de tempo. Vejamos alguns exemplos de utilizagao do comando for: O programa seguinte envia serialmente uma sequéncia de ndmeros de até 10: Exemplo 7.6 #include <16F628.h> fuse delay(clock=4000000) #fuses INTRC_IO, NOWDT, PUT, NOBROWNOUT, NOMCLR, NOLVP fuse rs232(baud=19200,parity=N, xmit=PIN_B2, rev=PIN_B1) main() 4 int conta; for (conta=0; conta<=10; conta++) printf (*tu\r\n", conta); ) 7.3.1.1. Outras Formas do Laco For Como ja dissemos no inicio do tépico anterior, o lago for possui ul grande flexibilidade na sua forma de construgao e uso. Esta flexibilidade 6 devido ao fato de que é permitida a utilizagao de qui quer expressao valida em C, mesmo nao sendo relacionada com o lago repeti¢ao em si, em quaisquer das segdes do comando. Microcontroladores PIC - Programagtio em C De fato, podemos criar |agos muito interessantes e pouco usuais pela manipulagao correta dos argumentos do comando for. A primeira aplicagao € na criagdo de lacos de atraso (delays). Veja o se- guinte fragmento de programa: for (atraso=0; atraso<100; atraso++); Este laco for nao possui nenhum comando associado a ele, o que implica simplesmente que serao executadas 100 iteracdes do lago antes de o pro- gfama continuar a execugao normalmente. Esta € uma forma muito eficiente de criar uma pequena rotina de atraso de tempo. E possivel também executar contagens regressivas com o comando for. O programa seguinte imprime na saida serial os nimeros de 10 a 0 em ordem decrescente: Exemplo 7.7 Hinclude <16F628.h> fuse delay (clock=4000000) #fuses INTRC_IO, NOWDT, PUT, NOBROWNOUT, NOMCLR,NOLVP fuse rs232(baud=19200, parity=N, xmit=PIN_B2,rcv=PIN_B1) main () { int conta; for (contas10; conta>=0; conta--) print£(*Bu\r\n", conta) ; Outra caracteristica interessante do comando for é ser possivel utilizar mais de uma variavel para o controle do funcionamento do lago. No exemplo seguinte, demonstramos o uso de miltiplas variaveis de controle num mesmo lago: Exemplo 7.8 #include <16F628.h> fuse delay(clock=4000000) #fuses HS,NOWDT, PUT, NOBROWNOUT, NOMCLR, NOLVP fuse rs232(baud=19200, parity=N, xmit=PIN_B2, rcv=PIN_B1) main() t int x,y; for (x=0, y=10 7 x<=10 ; x++, y--) printf ("tu , &u\r\n",x,y)7 , Declaragées de Controle @ ¢ O PIC programado com o cédigo anterior imprime serialmente esta qiiéncia: 5 PNURAaroor HeauanEeLenro 0,0 Observe que no exemplo anterior existem duas variaveis (apesar de mente uma ser testada na condi¢ao), sendo uma incrementada e outra crementada a cada ciclo do laco. Uma outra caracteristica do comando for é ser possivel utilizar uma ct digdo de teste nao relacionada a variavel de controle do laco. No prograr seguinte, construimos um lago de contagem que realiza uma contagem de 0 1000, mas caso 0 pino RB3 esteja em nivel l6gico 0, 0 lago terminara imedi: tamente e sera impresso 0 valor final da contagem do Iago: Exemplo 7.9 #include <16F628.h> fuse delay(clock=4000000) #fuses HS,NOWDT, PUT, NOBROWNOUT, NOMCLR, NOLVP fuse rs232(baud=19200,parity=N, xmit=PIN_B2,rcv=PIN_B1) main () { long int x; for (x=0 ; (x<=1000) && input(pin_b3) ; x++); printé("#lu\r\n",x); d Este laco for nado executa qualquer comando, mas permanece em con' gem enquanto a variavel "x" for menor ou igual a 1000 e o pino RB3 es‘ em nivel légico 1. € também possivel criar um lao infinito, ou seja, um lago que sera rey tido indefinidamente. Veja o comando seguinte: for (513 Alguns detalhes importantes sobre 0 comando for: * Cada uma das secdes de argumentos do comando for admite qual quer tipo de declaragao valida da linguagem C; oO Microcontroladores PIC - Programa em C

Você também pode gostar