Você está na página 1de 271

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Histrico e utilizao dos microcontroladores


1.0 A evoluo da Tecnologia 1.1 Os primeiros computadores 1.2 Evoluo dos sistemas eletrnicos 1.3 Onde possvel encontrar microcontroladores

Introduo aos sistemas microcontrolados e microprocessados


1.0 Microprocessadores e Microcontroladores: 1.1 Microprocessador: 1.2 Microcontrolador: 1.3 Funcionamento bsico dos sistemas microcontrolados: 1.4 O que necessrio para trabalharmos com microcontroladores 1.5 O Mercado de Microcontroladores

A evoluo da tecnologia:
Desde os primrdios da sociedade, os homens buscavam maneiras de facilitar e simplificar atividades complicadas e repetitivas; com o conhecimento matemtico adquirido com o passar dos anos, e seu grande uso nas atividades comerciais um dos maiores problemas encontrados passou a ser a realizao de clculos mais complexos, o que levou a criao de dispositivos mecnicos para auxlio nesta tarefa, os quais so chamados genericamente de baco. Pode no parecer, mas com a criao destes dispositivos to simples, nascia um conceito de mquina que muitos anos e sculos depois daria origem a sistemas muito complexos como os microprocessadores e microcontroladores.

figura 1.0 - baco

Apartir de ento essas ferramentas foram sendo aperfeioadas continuamente durante sculos, originando diversos dispositivos e ferramentas que auxiliavam em tarefas complexas, principalmente nos cculos matemticos.

figura 1.1 Calculadora de Pascal

Figura 1.2 Maquina Diferencial de Babbage

voltar para o topo da pgina Os primeiros computadores: Com domnio da manipulao da tenso e da corrente eltrica, os dipositivos de clculo anteriormente mecnicos passaram a ser eltricos, o que facilitava o projeto, a construo e reduzia o tamanho dos sistemas, mesmo assim os primeiros computadores eram gigantescos e ocupavam prdios inteiros devido aos componentes utilizados na poca (vvulas). Um bom exemplo era o ENIAC utilizado para realizao de clculos balsticos na dcada de 40.

figura 2.0 ENIAC

Observando todos esses equipamentos, embora eles sejam muito diferentes possvel notar um ponto em comum, todos eles foram projetados com uma finalidade especfica e nica, caso se quisesse que eles realizassem outra tarefa, todo o projeto teria que ser refeito. Essa

era uma caracterstica muito ruim, pois tornava extremamente difcil qualquer alterao ou atualizao que fosse necessria.

figura 2.1 Fita perfurada

neste contexto que as idias e mquinas do Sr. Herman Hollerith, um dos precursores da IBM, comeam a ter espao e se tornam uma soluo para o problema apresentado, pois ele havia desenvolvido, j no final do sculo XIX, um sistema de cartes e fitas perfuradas capazes de informar maquinas especficas, o que elas deveriam fazer, nasciam os conceitos de programa e de memria, tornando o sistema muito mais verstil, uma vez que era posvel com uma mesma mquina a realizao de diversas tarefas e clculos diferentes, unicamente com a mudaa dos cartes ou da fita.

voltar para o topo da pgina

Evoluo dos sistemas eletrnicos:


Conforme as tecnologias para produo de componentes eletrnicos avanavam, os computadores eletrnicos tornavam-se cada vez mais compactos e poderosos, j na dcada de 70 esse avano chegou a tal ponto que foi possvel, a partir da idia do o Dr. Marcian Hoff, um dos primeiros funcionrios da Intel, a criao do primeiro dispositivo eletrnico capaz de ser programado para a realizao de diversas tarefas e controles, nascia ali o primeiro microprocessador, componente que revolucionaria a histria da eletrnica devido sua versatilidade, rapidez e preciso, podendo controlar qualquer tipo de sistema ou processo. Os microcontroladores que so o foco de nosso estudo so frutos de toda essa evoluo e hoje com o barateamento dessa tecnologia e as facilidades de projeto e utilizao, eles so empregados em praticamente todas as reas com as mais diferentes aplicaes e funcionalidades.

voltar para o topo da pgina Onde possvel encontrar microcontroladores?


Telefonia Atomveis Aviao Diverso Eletrodomsticos Calculadoras Mquinas Informtica Sistemas bancrios Segurana Celulares

Sist. Hospitalares etc..

Microprocessadores e Microcontroladores:
Vimos at agora que microprocessadores e microcontroladores so o fruto de muitos anos de avano tcnico, so utilizados para controlar diversos tipos de sistemas e mquinas, e que a grande vantagem de seu uso a possibilidade de alterao e atualizao rpida e simples, bastando para isso a criao de um novo programa. Mas quais as diferenas entre microprocessadores e microcontroladores, em que casos eles so utilizados? Embora muitos confundam as duas nomenclaturas e as utilizem at como sinnimos, eles so dispositivos com conceitos e funes distintas, pelos seguintes aspctos:

voltar para o topo da pgina Microprocessador:


Dispositivo eletrnico destinado a controle de processamento de sistemas grandes e complexos, ele tem como funo processar os dados vindos de dispositivos externos (memrias, sistema de I/O, etc) e apartir deles executar tarefas pr-programadas. Dentro do encapsulamento do microprocessador existe apenas uma estrutura a CPU, a qual composta basicamente pela ULA, pela UC e alguns registradores. CPU: Unidade Central de Processamento ULA: Unidade Lgica e Aritmtica (responsvel pelas operaes matemticas e lgicas) UC: Unidade de controle (responsvel pelo controle de fluxo dos dados, pelo gerenciamento e execuo dos comandos e atividades)

voltar para o topo da pgina Microcontrolador:


Os microcontroladores por sua vez tm como alvo o controle autnomo de sistemas, dessa forma geramlente procura-se que eles sejam baratos e pequenos, para atingir esse objetivo, inserido no mesmo encapsulamento, alm da CPU, diversos Perifricos Internos, isso reduz muito o espao fsico na PCI (placa de circuito impresso), barateando o projeto e tornando atualizaes e modificaes um processo muito mais simples e rpido; hoje dependendo da aplicao possvel se escolher o microcontrolador mais adequado observando a lista de perifricos internos que ele possui. Perifricos Internos: So sub-circuitos presentes na mesma pastilha de silcio da CPU, hoje podemos encontrar incorporado aos microcontroladores uma grande lista de perifricos internos:

Funcionamento bsico dos sistemas microcontrolados:


Os microcontroladores e microprocessadores embora sejam considerados por muitos como componentes inteligentes, no possuem intelecto algum, por si s no so capazes de executar nenhum tipo de tarefa, ficando a cargo do programador informar a esses dispositivos tudo que eles precisam saber para realizarem o trabalho, assim se o programador informou algum dos procedimentos de forma errada o microcontrolador executar a tarefa erroneamente. Por outro lado eles so componentes extremamente rpidos e precisos, ento quando ordenarmos que um microcontrolador faa algo, poderemos ter certeza que ele executar exatamente como pedimos e num intevalo de tempo curtssimo. Outro apecto importantssimo e que deve ficar bem claro de agora em diante que os microcontroladores so mquinas seqnciais, ou seja executam as funes uma a uma, de forma seguida e contnua, assim a metodologia para trabalhar e programar microcontroladores deve ser a seguinte: 1 Estudar muito bem a tarefa a ser realizada pelo microcontrolador 2 Dividir a tarefa em partes ou atividades 3 Ordenar corretamente cada uma das atividades 4 Agora sim, podemos informar ao microcontrolador o que fazer Vamos enteder melhor com um exemplo simples: Vamos pensar em uma tarefa bem simples e apresentar cada um dos passos que devem ser executadas para a realizao da mesma. Tarefa: Fazer um copo de suco de laranja Materiais necessrios: trs laranjas faca espremedor coador copo colher acar

Sequncia de procedimentos: 1 Pegar todos os materiais necessrios 2 Utilizar a faca e cortar as trs laranjas 3 Utilizar o espredor para retirar o suco das laranjas 4 Utilizar o coador para coar o suco 5 Colocar o suco no copo 5 Acrescentar acar a gosto e misturar com a colher 6 Acrescentar gelo a gosto Com esse simples exemplo foi possvel verificar que mesmo as atividades mais simples passam por vrias etapas at sua concluso, e quando estivermos criando nossos programas para os microcontroladores deveremos pensar em todas as etapas da tarefa. Um bom modo para essa anlise a criao de um fluxograma, mas isso discutiremos um pouco mais para frente. Porm existe um detalhe importantssimo que no levamos em considerao at agora: que idioma ou linguagem usaremos para transmitir as informaes da tarefa ao microcontrolador?

Ser o portugus? Ingls? Japons? Javans? Esperanto?


Na verdade cada famlia de microcontroladores possui um idioma prprio chamado genericamente de linguagem Assembly, esta criada pelo fabricante e conversa diretamente com a mquina. Mas existe um outro detalhe tcnico, a linguagem Assembly na verdade apenas uma representao grfica, constituda por pequenas palavras chamadas MNEMNICOS, que so como apelidos para os cdigos binrios ou hexadecimais, os quais so a nica informao que os microcontroladores ou qualquer dispositivo eletrnico realmente entende, a que entra um novo personagem o COMPILADOR. Linguagem Assembly: Conjunto de cdigos (mnemnicos) que representam o conjunto de instrues interpretadas por um microcontrolador MNEMNICOS: Pequenas palavras, geralmente baseadas no idioma ingls, que representam cada uma da instrues ou cdigos da linguagem Assembly Compilador: um software que pode ser considerado como um tradutor, ele pega os mnemnicos da linguagem e os transforma nos respectivos cdigos de mquina (hexadecimal ou binrio) Aps a compilao de nosso programa, o arquivo gerado (binrio ou hexadecimal) gravado dentro do microcontrolador, e sendo assim o mesmo j pode comear a executar os comandos do programa passoa a passo.

voltar para o topo da pgina Curiosidade:


Onde o microcontrolador armazena os passos da tarefa a serem executados? Os microcontroladores possuem uma memria que chamamos de memria de programa, ela do tipo no voltil, ou seja, no perde as informaes quando a desenergizamos, assim o microcontrolador estar, sempre que for ligado, apto a executar a tarefa desejada!!! Assembly e Assembler so as mesmas coisas? No, Assembly a designao da linguagem, j Assembler (montador em ingls) um sinnimo de compilador, portanto no confunda mais!!!

O que necessrio para trabalharmos com microcontroladores?

Para trabalhar com microcontroladores so necessrios as seguintes ferramentas: Editor e compilador (IDE): Software onde escreveremos o programa e ir traduzir os comandos da linguagem (assembly, C, BASIC, PAscal, etc) para o cdigo de mquinas (hexadecimal ou binrio) Software para simulao e teste da lgica do programa Hardware de gravao do microcontrolador ou Kit de desenvolvimento

O Mercado de Microcontroladores
Existe uma grande disponibilidade de fabricantes de microcontroladores, onde cada um desenvolve seus componentes com determinadas caractersticas. Entretando, caso venhamos compar-los, descobriremos que sua estrutura bsica interna de funcionamento so semelhantes. Quando projetamos determinado circuito com microcontrolador, devemos selecionar o modelo de microcontrolador mais adequado, levando em considerao, as facilidades de compra, obteno continua deste chip e multiplicidade de fornecedores para projetos industriais. Os principais fabricantes de microcontroladores disponveis no mercado so descritos a seguir: Atmel: - Famlia AVR, 8051 Microchip - Famlia PIC Freescale (Motorola) - Famlia HS908 NXP (Phlips) - Famlia ARM (LPC) Texas Instruments - Famlia MSP, TMS e C2000 Zilog - Famlia F8 National - Famlia COP Cypress - Famlia PSOC Intel - Famlia 8051, 8052, 8096 Analog Device - Famlia ADuc ... etc.

voltar para o topo da pgina

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Introduo a programao
1.0 Um pouco de Histria 1.1 Escrevendo programas em C para Microcontroladores 1.2 O papel do Compilador 1.3 Etapas de desenvolvimento e gravao de um programa em C no microcontrolador PIC

Introduo a programao
1. 0 Kit PICgenios I 1.1 Controle de display LCD 1.2 Varredura de displays de 7 segmentos 1.3 Varredura de teclado matricial 1.4 Acionamento de leds 1.5 canal de comunicao serial RS232 e RS485 1.6 Conversores A/D 1.7 Canal PWM

Um pouco de Histria
A liguagem C foi criada por Dennis Ritchie e Ken Thompson no Laboratrio Bell em 1972. C uma linguagem profissional e aceita e utilizada na criao de sistemas operacionais, tais como Unix, Windows e Linux. A linguagem de programao C tornou-se rapidamente uma das mais importantes e populares, principalmente por ser muito poderosa, porttil e flexvel. Essa flexibilidade tem seus incovenientes de permitir que se criem programas desorganizados e de difcil compreenso. uma linguagem de programao genrica desenvolvida para ser to eficiente e rpido quanto o assembly e to estruturada e lgica quanto as linguagens de alto nvel (PASCAL, JAVA, etc).

C foi desenhada para que usurios possa planejar programas mais estruturados e modulares. O resultado um programa mais legvel e documentado. Os programas em C tendem a ser bastante compactos e de execuo rpida. A linguagem C habitualmente pe denominada general purpose, pois sua aplicao no se destina a uma rea especfica, diferente de outras linguagem como COBOL, PASCAL, FORTRAN, entre outras, e esta uma das grandes vantagens, pois adapta-se ao desenvolvimento de qualquer projeto. A linguagem C utilizada para construo de compiladores de outras linguagens. Vamos descrever algums pontos importantes com relao as caractersticas do C: Rapidez - possui performance semelhante as obtidas pelo assembly, pois permite acesso a memria e manipulaes de bits, utilizando linguagem de alto nvel. Simples - possui sintaxe simples, e nmeros de comandos reduzidos, facilitando o aprendizado da linguagem. Portvel - a linguagem C padronizada (ANSI) no qual define padres para os compiladores. Podemos transportar nossos programas para outras plataformas e compila-los sem alterao no cdigo. Popular - internacionalmente conhecida e amplamente utilizada por programadores. Modular - permite a separao do cdigo em mdulos distintos e independentes, podendo estes serem utilizados em varos programas. Alto Nvel - o C considerado linguagem de alto nvel, quando comparada com a linguage Assembly. Bibliotecas Poderosas - possui diversas bibliotecas e permite a criao de novas pelo programador. Evoluo - o C deu origem a novas linguagens de programao, como por exemplo o C++.

Escrevendo programas em C para Microcontroladores


Devido a sua qualidade, portabilidade, eficincia e controle , o C, podemos dizer, a linguagem mais utilizada por programadores de microcontroladores. Atualmente, a maioria dos microcontroladores existentes no mercado contam com compiladores de linguagem C para o desenvolvimento de programas. Quanto estamos tratando de programas para microcontroladores, devemos tomar certos cuidados com relao a escolha da linguagem de programao e do compilador a ser utilizada , pois a capacidade de memria de armazenamento do programa extremamente reduzida, comparando com PC.

Programa escrito em linguagem C

Sabemos que hoje temos computadores portteis com capacidades de centenas de gigabytes de memria, nesses aspectos o "tamanho" do cdigo no to importante para o programador. Agora, quando estamos falando de microcontroladores devemos tomar certas preocauses, pois microcontroladores como: PIC12C508 e PIC16C54 possuem apenas 512byte de memria de programa e 25 byte de RAM, fato que exige do programador otimizao do cdigo e eficincia na elaborao lgico do programa.

O papel do Compilador
A nica maneira de se comunicar com o microcontrolador atravs da linguagem de mquina, ou melhor dizendo, atravs de cdigos de mquinas. Por tanto os programas em C devem necessariamente serem interpretados e compilados a fim de termos como resultado os comandos de mquinas a serem gravados na memria de programa do microcontrolador.

Existem no mercado diversos compiladores de programas em C para microcontroladores PIC, tais como: HI-TECH PICC, C18, C30, CCS, SDCC, WIZ-C, mikroC, CC5, PICmicro C, entre outros. Em nosso curso iremos utilizar a IDE MikroC desenvolvido pela empresa Mikroelektronika (www.mikroe.com), no qual permite editar, compilar e simular programas em C para microcontroladores PIC da familia 12, 16 e 18.

IDE mikroC - Editor, compilador, simulador e debugador para PIC em linguagem C Iremos utilizar o mikroc devido a sua eficincia e flexibilidade. Alm disso, este compilador possui uma extensa biblioteca de funes prontas para controle de diversas perifricos conectados ao nosso microcontrolador PIC. Aos escrevermos e compilarmos um programa em nosso compilador, caso o programa no tenha erros de sintaxe, ou algum outro erro cometido pelo programador, teremos como resultado a criao do arquivo de mquina hexadecimal (extenso .hex). Este arquivo .hex conhecido como cdigo de mquina, e ser este o arquivo a ser gravado na memria do microcontrolador.

Etapas de desenvolvimento e gravao de um programa em C no microcontrolador PIC


Descreveremos abaixo as etapas passo a passo para editar, compilar, simular e gravar um programa no microcontrolador PIC.

1 Fase: A elaborao do Fluxograma.


Estude as tarefas e funes que o microcontrolador PIC dever executar. Para melhor entendimento das funes lgicas a ser executadas faa um fluxograma.

2 Fase: Edio e compilao do programa em C


A partir das informaes e funes elaborada no fluxograma, escreva seu programa em linguagem C na IDE mikroC, compile e simule seu programa (estudaremos detalhadamente cada funo e ferramenta do mikroC mais adiante).

3 Fase: O programa compilado Aps a compilao do seu programa em C, o compilador criar o arquivo de mquina .hex (nomedoprograma.hex). Este o arquivo que dever ser gravado no microcontrolador PIC.

4 Fase: Gravao do programa no PIC Gravar o arquivo compilado .hex no microcontrolador atravs de um gravador de microcontroladores PIC, ou atravs de um Kit de desenvolvimento.

Estudaremos com mais detalhes nas unidades seguintes do nosso curso os processos de edio, compilao e gravao de programas. Durante nosso curso estudaremos basicamente 4 assuntos:
O microcontrolador PIC - PIC18F452 / 4520 A IDE mikroC - editor, compilador e simulador para PIC 12, 16 e 18 em linguagem C. Estudo da Linguagem C para programao de microcontroladores PIC Projetos e aplicaes prticas com PIC18F Descreveremos agora algumas dos exemplos de programas e aplicaes prticas que sero estudados em nosso curso:

Kit PICgenios PIC18F - Mdulo Profissional :

Atravs deste Kit podemos desenvolver os mais variados tipos de programas, tais como: Controle de displays LCD alfanumrico 16X2 (16 colunas por 2 linhas ) no modo 4 e 8 bits. Os displays LCD so utilizados nas grandes maioria dos projetos eletrnicos hoje em dia. 4 displays de 7 segmentos acionados por varredura. Matriz de teclado com 12 teclas. 7 teclas de acesso direto ao pino, sendo que 3 teclas dessas simulam a interrupes externa INT0, INT1 e INT2 do PIC. 16 leds para controle lgico visual. 2 rels NA/NF para acionamento de cargas externas de 10A / 220V. RTC - relgio de tempo real com bateria. Atravs desse relgio o programador poder programar temporizadores, acionamentos programados, calendarios, entre outras aplicaes. Canal Serial RS232: canal para comunicao serial com PC ou outras mquinas Canal Serial RS232 Emulada: o programador pode emular uma serial via software e ento trabalhar com duas seriais RS232 no seu projeto. Canal USB 2.0 para implementaes em projetos que necessitem comunicao USB (necessrio usar PIC18F4550) Canal PS/2: permite ligar ao microcontrolador teclado de PC ou mouse para otimizar o projeto eletrnico. Aquecedor via PWM. O aluno poder controlar o canal PWM do PIC simulando na placa. Sensor de temperatura LM35: o aluno poder realizar ensaios prticos com este sensor de temperatura. Acionamento de Buzzer. Em alguns projetos indispensvel a utilizao de um alarme sonoro. Acesso a todas as portas de expanso do microcontrolador PIC, que nos permite ligar outros dispositivos externos ao Kit. Ventoinha acionada por PWM. importante pois o aluno poder controlar por PWM a velocidade de giro da ventoinha. Contadores de Pulsos. Atravs desse circuito poderemos saber a velocidade de giro da ventoinha. (contador RPM). Memria serial E2PROM via I2C 24C04. Este tipo de memria so muito utilizada em diversos equipamento e mquinas.

2 trimpots para simulao e programao do canal A/D do PIC (Analgico 1 , e Analgico 2). Canal de comunicao RS485: Protocolo muito utilizado em redes industriais e em PLC's. Chave Load/Run para gravao ISP (gravao no prprio circuito). Microcontrolador PIC18F452 DIP com 32Kbyte de Flash; Canal de gravao ICSP: Conector para modo debugger e ICD2. Regulador de tenso. Chave Dip seletora de funes. Suporte para displays LCD Grficos 128 x 64 controlador KS107/108. Suporte para displays LCD Grficos 128 x 64 controlador T6963C. Suporta os PIC18F4xxxx, PIC18F2XX0 e os PIC16F873/876 de 28 pinos. Sei que voc deve estar pensando, nossa quanto dispositivo conectado ao microcontrolador. verdade, mas esses microcontroladores podem realizar muitas outras funes... em outras palavras, esse PIC 10! Durante nosso treinamento iremos realizar diversas experincias prticas utilizando os recursos da linguagem C junto com as funes da IDE mikroC. Vamos detalhar um pouco cada experincia e conhecer um pouco mais sobre o que vamos estudar daqui por diante.

Aulas de laboratrio e experincias prticas


Veremos abaixo algumas das aplicaes prticas que iremos realizar durante nosso treinamento:

Controle de display LCD


Iremos no decorer das unidades programar o PIC para controlar e escrever mensagens publicitria nos display LCD 16X2 alfanumrico:

Os displays LCD so amplamente utilizados em diversos equipamentos e aparelhos. No decorrer dos estudos iremos explorar as funes do mikroC em linguagem C para controle de displays LCD. Estudaremos passo a passo como escrever mensagens de textos nos modos 4 e 8 bits. Aplicaes com displays LCD:

Equipamentos industriais

Equipamentos domsticos

Equipamentos de Informtica

CLPs e controladores industriais

Equipamentos portteis

Varredura de displays de 7 segmentos


Os diplays de 7 segmentos so largamente utilizados em equipamentos como: balana, painis de mquinas industriais, equipamentos mdicos, eletrodomsticos entre outros. Podemos controlar os displays de 7 segmentos atravs de conversores BCD, como por exemplo o 74HC247 (decodificador BCD) ou desenvolver cdigos BCD pelo microcontrolar. Em nosso caso, os displays esto sendo acionados por varredura.

Para acionar os displays de 7 segmentos, iremos utilizar o sistema de varredura, que permite atravs de um barramento de dados de 8 bits e mais 4 pinos de acionamento, "escrever" o valor correspondente ao dado que deve ser mostrado no visor. Aplicaes reais com displays de 7 segmentos:

Panis de equipamentos industriais Balanas

Varredura de Teclado matriciais


O sistema de varredura de teclado matricial permite que o microcontrolador leia muitas teclas ligada ao seus pinos. O teclado matricial muito utilizado para economizar pinos fsicos do microcontrolador. Equipamentos de diversos tipos usam o teclado matricial para inserir dados ao microcontrolador.

Aplicaes reais com teclados matriciais:

Equipamentos Eletrodomsticos

Aparelhos de som CLPs

Acionamento de Leds
Os leds so utilizados praticamente em quase todas as aplicaes eletrnicas. Atravs dos leds podemos visualizar o status de uma mquina, "desenhar" mensagens de textos, iluminar objetos, criar animaes visuais, entre outras aplicaes. Iremos estudar os recursos de programao em C para controle das portas de sada disponveis no microcontroladores PIC utilizando os leds como barramento de dados visual.

Aplicaes reais com Leds Os leds so utilizados em diversos equipamento no mercado para as mais variadas aplicaes. Muitas das aplicaes o microcontrolador responsvel pelo controle desses leds.

letreiros com leds

Letreiros

Controle de Iluminao de painis

Canal de comunicao serial RS232 e RS485


de grande importncia que os equipamentos eletrnicos tenham um canal de comunicao com o meio externo. Atravs de um canal de comunicao possvel monitorar o estado do equipamento assim como enviar e receber informaes em tempo real. Iremos aprender a utilizar o canal de comunicao serial do microcontrolador PIC realizando comunicaes de envio e recepo de dados com o PC.

Aplicaes reais com Comunicao Serial RS232 e RS485 Supervisrios Industriais Comunicao com computadores PC Comunicao com outras mquinas

Conversor Analgico digital (A/D)


A aplicao bsica do microcontrolador PIC trabalhando com o conversor A/D abaixo simples, mas possui um grande contedo educativo para ns neste momento. No exemplo abaixo utilizamos dois simples trimpots para variarmos o valor de tenso no pino A/D do PIC. Este exemplo na verdade representa inumeras aplicaes prticas de equipamentos do mercado, tais como: aparelhos de medio, leitores de sensores de temperatura, atuadores, entre outros. Criaremos programas para controle e leitores de tenso nas unidades seguintes.

Veremos tambm como ler e interpretar valores analgicos vindo de sensores de temperatua (LM35) utilizando os recurso da linguagem C.

Aplicaes reais com os conversores A/D do PIC

Sensores de proximidade

Sondas e termopares equipamentos de medio

Controle PWM de dispositivos Iremos simular programas de controle de largura de pulsos. Atravs do canal PWM disponvel no PIC, podemos controlar diversos equipamentos, tais como: inversores de frequncia, estabilizadores, fonte chaveada, controle de velocidade de motores DC, entre outras. Nem nossos laboratrio, iremos controlar a velocidade de giro de uma ventoinha e controlar o aquecimento de uma caraga resistiva via PWM.

Aplicaes reais com os conversores A/D do PIC

inversores de frequncia Fontes chaveadas Drive de Motores Informaes importantes

Outros exemplos de programas tambm sero tratados e comentados em nosso curso, mas ficaro como sendo material complementar ao aluno. voltar para o topo da pgina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC Programao em C Microgenios 1998 - 2008. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

As caractersticas gerais da famlia PIC


1.0 A famlia PIC 1.1 Desempenho da famlia PIC 1.2 Tipo de memrias de programa

A famlia PIC

Os microcontroladores PIC so fabricados pela empresa Microchip. Existem basicamente trs familias de PICs diferenciadas pelo tamanho da palavra de memria de programa: 12, 14 e 16 bits. Todos estes dispositivos possuem internamente um barramento de 8 bits. Atualmente a Microchip lanou recentemente uma nova famlia de microcontroladores chamada DsPIC que possui barramento interno de 16 bits e 24 bits, contrrio da tradicional famlia de 8 bits.

O PIC possui uma arquitetura interna do tipo Havard. A diferena entre essa arquitetura e as tradicionais, do tipo Von-Neumann, que ela possui um barramento para o programa e outro para os dados, diferente da arquitetura tradicional em que um barramento tanto de dados como de endereo. O aumento no tamanho da palavra de programa possibilita um aumento no nmero de instrues: os PICs de 12 bits (12C508, 12C509, 12CE518, 16C54, 16C55) possuem apenas 33 instrues, os de 14 bits (12C671, 12C672, 12CE673, 12C674, 14000, 16C55x) possuem 35 instrues e os de 16 bits (17C4x, 17C75X, 17C76X, 18C2XX, 18C4XX) possuem 77 instrues. Os PICs foram otimizados para trabalharem com execuo de pequeno conjunto de instrues a grandes velocidades de processamento. Podemos trabalhar com alguns microcontroladores PIC a 10MIPS ( Milhes de Instrues por segundo) com um pic da srie 16 ou 18 trabalhando com cristal de 40Mhz.

voltar para o topo da pgina

Desempenho da famlia PIC


Capacidade de pepilene (enquanto executa uma instruo, o processador busca a prxima instruo na memria, de forma a acelerar a execuo do programa) Execuo de uma instruo por ciclo de mquina, com exceo das instrues de desvios que consomem dois ciclos de mquinas para serem executadas. Um ciclo de mquina no PIC equivale a 4 ciclos de clock, ou seja, o sinal de clock dividido por 4 antes de executar a instruo (falaremos mais sobre esse tpico adiante). Cada Instruo ocupa uma posio de memria de programa (FLASH). Tempo de execuo das instrues fixa, com exceo das instrues de desvios que consomem dois ciclos de mquina. Outra caracterstica importante da arquitetura PIC reside na semelhana e compatibilidade entre os diversos microcontroladores membros de sua famlia. Isto facilita grandemente a migrao de microcontrolador para outro, bastando mudar, em alguns casos, apenas alguns comandos no programa, pois partes dos registradores internos no se diferem muito entre si.

voltar para o topo da pgina

Tipos de Memria de Programa

Os PICs da srie 12, 14 e 16 armazenam o programa em sua memria interna. Membros da famlia 17 e 18 podem funcionar com memria de programa externas. Tipos de memrias de programas disponveis nos PICs: ROM: Memria do tipo no voltil gravadas na fbrica pelo processo conhecido como mscara. Os chips com esse tipo de memria normalmente possuem custos menores mas somente so viveis na fabricao de grandes quantidades. OTP: Memria fabricadas do tipo PROM. Saem da fbrica "virgens" e permitem uma nica gravao. So inviveis nas fases de implantao e desenvolvimento de equipamentos. Esses chips so identificados pelo sufixo "C". EEPROM: Podemos encontrar chips com memria do tipo EEPROM. Normalmente so mais caros que os dispositivos ROM e OTP e podem ser identificados atravs do seu sufixo "JW" para os dispositivos com encapsulamento DIP, ou "CL" para os dispositivos com encapsulamento do tipo PLCC. FLASH: Os microcontroladores PIC que utilizam este tipo de memria so indicados para etapas de desenvolvimento e testes at mesmo para implantaes finais. Permitem no mximo 1000 ciclos de gravaes/apagamento, possem um custo relativamente mediano com relao aos outros chips.

voltar para o topo da pgina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2007. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Conhecendo o Hardware do PIC18F452


1.0 O PIC18F452 1.1 Tipos de Capsulamentos 1.2 Estrutura Interna do PIC18F452 1.3 Descrio das funes dos pinos do PIC18F452

Memria do PIC18F452
1.0 Tipos de Memrias 1.1 Memria de Programa 1.2 Memria de dados - EEPROM 1.3 Memria de dados - RAM

Osciladores
o o o o o o o

1.0 O clock 1.1 Osciladores: Cristal e Ressonador 1.2 Cristal de Oscilao RC 1.3 Modo HSPLL 1.4 Ciclos de Mquina 1.5 Reset

Bits configurations

1.0 Os bits de configurao 1.1 FOSC (frequncy Oscilator) 1.2 OSCSEN (SYSTEM CLOCK SWITCH BIT) 1.3 PWRTEN (SYSTEM CLOCK SWITCH BIT) 1.4 BROWN-Out 1.5 BOREN 1.7 WDTEN - Watchdog Timer Enable (co de guarda) 1.8 Watchdog Postscale Select Bit

1.9 CCP2MX 2.0 BKBUG (debug) 2.1 LVP (Low Voltagem Programming) 2.2 STVREN (Stack Full/Underflow Reset Enable Bit)

O PIC18F452
O PIC18F452 um microcontrolador que possui memria do tipo FLASH, que nos representa uma grande facilidade em desenvolvimentos de projetos e prottipos pois no requer apaglo atravs de luz-ultravioleta como as verses antigas que utilizavam EEPROM.

O PIC18F452 um microcontrolador com tecnologia CMOS (baixssimo consumo) fabricado pela empresa Microchip Technology. Veja em seguida as principais caractersticas do PIC18F452
words) memria de dados RAM de 1536 bytes; memria EEPROM de 256 byte; Processamento de at 10MIPS (milhes de instrues por sergundo) quatro temporizadores internos (um de 8 bits e 3 de 16 bits) (TIMER0, TIMER1, TIMER2, TIMER3) 2 canais capture/compare/PWM - mdulo CCP Master synchronous Serial Port (MSSP) module. Unhaced Usart 8 canais A/D de 10 bits; Detector de baixa voltagem programvel microcontrolador de 40 pinos; memria de programa FLASH de 32K ( 16384 bytes

Permite at 100 000 ciclos de escrita e leitura na memria de programa Flash permite 1 000 000 ciclos de leitura e escrita na E2PROM Reteno de dados na Flash de 40 anos Watchdog timer com oscilador prprio e programvel trs pinos de interrrupo externa. INT0, INT1, INT2

voltar para o topo da pgina

Tipos de encapsulamentos:
As primeiras verses do PIC eram baseadas em encapsulamentos do tipo DIP40, hoje os dipositivos de 40 pinos ainda so muito comuns, porm de acordo com a aplicao e os perifricos internos presentes no Chip eles podem ser encontrados em diversos encapsulamentos como: DIP Dual In-line Pin PLCC Leadless Chip Carrier. TQFP

Nosso estudo ser baseado em microcontroladores com o encapsulamento DIP (Dual In-line Pin), devido a facilidade de utilizao e disponibilidade no mercado, porm no h grandes dificuldades para se migrar para outros encapsulamentos, basta analisar um pouco o datasheet do microcontrolador.

voltar para o topo da pgina

Estrutura interna do PIC18F452

voltar para o topo da pgina

Descrio das funes dos pinos do PIC18F452


O PIC18F452 possui no total de 33 pinos de I/O divididos entre as PORTA, PORTB, PORTC, PORTD e PORTE. PORTA: encontramos 7 pinos fsicos intitulados de RA0 a RA6 que podem ser utilizados como I/O de uso geral ou como conversor analgico/ digital A/D, (com excesso de RA4), alm de possuir tambm a funo de deteco de baixa tenso (LVD), referncia analgica do A/D e contador externo. PORTB: encontramos 8 pinos intitulado de RB0 a RB7 configurveis como I/O de uso geral. Nesse PORT podemos trabalhar com trs interrupes externas, mdulo CCP e pinos de gravao e debugger. PORTC: encontramos 8 pinos intitulados de RC0 a RC7 configurveis como I/O de uso geral, sada do oscilador do timer, mdulo CCP, Clock e data para os modos SPI, I2C e UART. PORTD: encontramos 8 pinos intitulado de RC0 a RC7 que pode ser configurado como I/O de uso geral ou ser configurado como PSP para ter sada TTL (por exemplo: interfaciamento com microprocessadores ). PORTE: podemos utiliz-lo como PORT de I/O de uso geral ou utilizar os pinos de WR e CS para acesso ao modo paralelo Slave Port (acesso a memria externa por exemplo). Abaixo segue com detalhes a funo de cada pino do microcontrolador PIC18F452.

Pino (DIP)

Funo

Tipo

Descrio

/MCLR/VPP

entrada entrada entrada

Entrada do RESET externo. Pino de habilitao de alta voltagem ICSP

entrada do cristal oscilador / entrada do clock externo sada do cristal oscilador / entrada do sada 14 OSC2 / CLK1/ RA6 clock exteno / entrada e sada de uso sada - I/O geral I/O entrada e sada de uso geral / entrada do 2 RA0 / AN0 entrada conversor AD0 I/O entrada e sada de uso geral / entrada do 3 RA1 / AN1 entrada conversor AD1 I/O entrada e sada de uso geral/ entrada do 4 RA2 / AN2 /Vrefentrada conversor AD2 / entrada de referncia entrada baixa do A/D 13 OSC1 /CLK1

I/O 5 RA3 / AN3 / Vref+ entrada entrada I/O 6 RA4 / T0CKI entrada entrada I/O entrada 7 RA5/AN4/SS/LVDIN entrada entrada I/O 33 RB0 / INT0 entrada I/O 34 RB1 / INT1 entrada I/O 35 RB2 / INT2 entrada

entrada e sada de uso geral / entrada do conversor AD3 / entrada de referncia Alta do A/D entrada e sada de uso geral / entrada de clock timer0 entrada e sada de uso geral / entrada do conversor AD4 / entrada de seleo SPI, detector de baixa voltagem.

entrada e sada de uso geral / interrupo externa 0 entrada e sada de uso geral / interrupo externa 1 entrada e sada de uso geral / interrupo externa 2 entrada e sada de uso geral / mdulo 36 RB3 / CCP2** I/O - I/O CCP2 (multiplexado com RB3 ) entrada e sada de uso geral / pino de 37 RB4 I/O interrupo por mudana de nvel entrada e sada de uso geral (interrupo 38 RB5/PGM I/O - I/O por mudana de estado) / pino de habilitao ICSP baixa voltagem entrada e sada de uso geral (interrupo 39 RB6 / PGC I/O - I/O por mudana de estado) / pino ICSP InCircuit Debugger entrada e sada de uso geral (interrupo 40 RB7 / PGD I/O - I/O por mudana de estado) / pino ICSP InCircuit Debugger I/O - sada - entrada e sada de uso geral / sada do 2 15 RC0/T10S0/T1CKI entrada oscilador /Contador externo Timer 1 I/O entrada e sada de uso geral / entrada 2 RC1 / T10SI / 16 entrada oscilador / mdulo CCP2 (multiplexado CCP2** sada com RB3 ) entrada e sada de uso geral / mdulo 17 RC2/CCP1 I/O - I/O CCP1 entrada e sada de uso geral / entrada e I/O - I/O - sada do clock serial para o modo SPI / 18 RC3/SCK/SCL I/O entrada e sada do clock serial para o modo I2C I/O entrada e sada de uso geral / entrada de 23 RC4/SDI/SDA entrada dados SPI / entrada e sada de dados I2C I/O entrada e sada de uso geral / sada de 24 RC5/SD0 I/O - sada dados SPI I/O - sada - entrada e sada de uso geral / canal de 25 RC6/TX/CK I/O transmisso UART / clock de sincronismo

26 RC7/RX/DT 19 RD0/PSP0 20 RD1/PSP1 21 RD2/PSP2 22 RD3/PSP3 27 RD4/PSP4 28 RD5/PSP5 29 RD6/PSP6 30 RD7/PSP7 8 RE0/RD/AN5

I/O entrada I/O I/O - I/O I/O - I/O I/O - I/O I/O - I/O I/O - I/O I/O - I/O I/O - I/O I/O - I/O I/O

RE1/WR/AN6

I/O

10 RE2/CS/AN7 12 , GND 31 11, VCC 32

I/O

UART entrada e sada de uso geral / canal de recepo UART / clock de sincronismo UART entrada e sada de uso geral / porta de comunicao paralela entrada e sada de uso geral / porta de comunicao paralela entrada e sada de uso geral / porta de comunicao paralela entrada e sada de uso geral / porta de comunicao paralela entrada e sada de uso geral / porta de comunicao paralela entrada e sada de uso geral / porta de comunicao paralela entrada e sada de uso geral / porta de comunicao paralela entrada e sada de uso geral / porta de comunicao paralela entrada e sada de uso geral / controle de leitura do port paralelo / entrada analgica AD5 entrada e sada de uso geral / controle de escrita do port paralelo / entrada analgica AD6 entrada e sada de uso geral / controle de seleo do port paralelo / entrada analgica AD7

alimentao negativo alimentao positivo

Tipos de Memrias
No PIC18F452 encontramos trs tipos de memrias: Memria de Programa - FLASH Memria de dados - RAM Memria de dados EEPROM Como ns sabemos, memria de programa (ROM, EPROM, FLASH) do tipo no voltil, ou seja, podemos desenergizar nosso sistema microcontrolado e ele no perder o programa gravado.

Nosso microcontrolador estudado possui internamente 32Kbyte de memria de programa e possui um barramento de programa de 16 bits. Alm disso, existem 21 bits para endereamento da memria de programa, o que permite que at 2 Mbyte sejam endereados pelo microcontrolador da familia PIC18F.

voltar para o topo da pgina

Memria de Programa
A memria de programa utilizada em nosso microcontrolador do tipo FLASH (sufixo "F") que permite ser gravada/apagada no minimo 1000 vezes. Este tipo de memria utilizada ideal para ser utilizada em desenvolvimento de projetos e at mesmo em produtos finais.

Memria de Programa FLASH do PIC18F442

Podemos perceber que a memria de programa do PIC18F452 iniciase no endereo 0000h e atinge o valor mximo de 7FFFH, ou seja , 32767K byte (32Kbyte).

Nota: No podemos confundir de forma alguma memria de programa e memria de dados. Sabemos que memria de programa onde nosso programa estar gravado, enquanto memria de dados onde os valores de nossas variveis sero salvas temporariamente.
O endereo inicial 0000h chamado de vetor de reset. A instruo de programa que estiver nesse endereo de memria ser a primeira a ser executada pelo processador do PIC. Sempre que energizarmos ou resetarmos o microcontrolador, o contador de programa PC apontar sempre para este primeiro endereo da memria. Em seguida temos os endereos 0008h e 0018h. Estes endereos so chamados de vetores de interrupo. (veremos mais adiante em nosso curso sobre esses vetores de interrupo). Em seguida temos os endereos 0008h e 0018h. Estes endereos so chamados de vetores de interrupo. (veremos mais adiante em nosso curso sobre esses vetores de interrupo). Vamos exemplificar um processo de gravao na memria de programa do PIC. Acompanhe o programa exemplo de programa abaixo: /Este programa tem por funo alterar o estado dos 8 pinos do PORTB do PIC em intervalos de 1 segundo. void main() { TRISB = 0; // configura o portB como sada PORTB = 0x00; // coloca zero em todos os pinos do portB do { PORTB = 0xFF; // coloca um em todos os pinos do portB Delay_ms(1000); // delay de 1 segundo (1000 ms) PORTB = 0x00; // Coloca zero em todos os pinos do portB Delay_ms(1000); // delay de 1 segundo } while(1); } Ao compilarmos o programa acima com o mikroC teremos como resultado o seguinte cdigo de mquina (descrito somente algumas linhas do cdigo gerado;

A partir da imagem acima, podemos verificar os valores que sero gravados na memria de programa aps gravao do programa exemplo acima. Esses valores so teis para o programador experiente, pois permite visualizar e acompanhar a execuo por completo da compilao dos arquivos.

Nota: Os cdigos em assembly visualizado na figura acima foi gerado pelo compilador mikroC aps a compilao de um programa escrito em C.

voltar para o topo da pgina

Memria de dados - EEPROM


Como estudamos anteriormente, sabemos que as memrias do tipo EEPROM so muito parecidos com a memria RAM, sua diferena que as distingue devido ao fato da memria EEPROM no "perder" as informaes salvas quando a desenergizarmos. Podemos salvar nesta memria dados no volteis durante o decorrer da execuo de nosso programa. O PIC18F452 possui internamente 256 byte de memria de dados EEPROM.

O endereo inicial da memria de dados EEPROM 0 e seu ltimo endereo FFh. Estudaremos atravs de comandos como escrever e ler dados nessa memria de programa nas unidades seguintes. voltar para o topo da pgina

Memria de dados - RAM


Chegamos a um assunto de grande importncia no estudo referente ao nosso microcontrolador PIC, neste tpico apresentaremos toda a estrutura de memria de dados RAM. Aprenderemos a trabalhar com ela e tambm onde esto localizados os botes que ligam/desligam, configuram e controlam os perifricos internos do PIC, ou seja, os SFR (Registradores de Funes Especiais). A memria de dados RAM dividida em dois grupos: os chamados GPR (Registradores de Propsito Geral) e os SFR ( Registradores de Funes Especiais). Os GFR tem a funo de armazenar dados de uso geral que utilizamos e criamos durante a execuo do nosso programa. Podemos guardar nesse

regio da memria RAM dados volteis de variveis, tabelas, constantes, entre outras. Os SFR's a parte principal do microcontrolador, nesta rea da memria RAM que esto armazenados todo o setup de funcionamento do PIC. Apartir desses registradores podemos configurar o modo de trabalho dos timers/counters, USART, conversores analgicos digitais, etc. O PIC18F452 em estudo possui internamente 1536 bytes de memria de dados RAM. O banco de memria RAM da famlia 18F dividido em 16 bancos que contm 256 bytes de memria. Os 6 primeiros bancos so a regio dos GPR's, e o ltimo banco so dos SFR's. Acompanhe a figura abaixo:

Vamos examinar o mapa de registradores dos SFR's. (endereo F80h FFFh)

Os SFRs so registradores de funes especiais responsveis pela configurao dos modos de trabalhos do PIC. Atravs da configurao desses registradores especiais, podemos tambm monitorar o status do microcontrolador em determinados momentos e situaes. Estudaremos a funo desses registradores quando estivermos trabalhando com projetos, pois dessa maneira ficar mais claro seu funcionamento e aplicaes.

O Clock

Todo microcontrolador requer um circuito de oscilao pois quem d o sinal de "partida" e "sincronismo" para qualquer atividade interna da chip. A freqncia de operao de oscilao um dos agentes que determinam a velocidade de execuo das instrues do microcontrolador. O PIC18F452 pode funcionar com diversas fontes de osciladores:

1. LP 2. XT 3. HS 4. 5. 6. 7. 8.
ressonador HS + PLL RC RCIO EC ECIO

low-power cristal cristal ou ressonador High-Speed cristal (cristal de alta velocidade) ou High-Speed cristal ou ressonador com PLL habilitada Resistor / Capacitor externo Resistor / Capacitor externo com pino de I/O Clock externo Clock exteno com pino de I/O

voltar para o topo da pgina

Osciladores: Cristal e Ressonador


Para utilizarmos cristal ou ressonadores em nosso chip, devemos conect-lo da seguinte maneira:

Figura 01 - clock gerado a partir de um cristal de quartzo

Nota: Quando projetamos um dispositivo, a regra colocar o oscilador to perto quanto possvel do microcontrolador, de modo a evitar qualquer interferncia nas linhas que ligam o oscilador ao microcontrolador.

Note que existe dois capacitores ligados em paralelo com o cristal. O valor desses capacitores variam de acordo com a frquencia do cristal utilizado. Abaixo segue uma tabela apresentando os valores dos capacitores: Valores Tipo de Freqncia tipicos para oscilador do cristal o capacitor C1 C2 LP (cristal de 32kHz 33pF 33pF baixa 200KHz 15pF 15pF freqncia) 2222200KHz 68pF 68pF XT (cristal) 1.0MHz 15pF 15pF 4.0MHz 15pF 15pF 4.0MHz 15pF 15pF 15158.0 MHz 33pF 33pF HS (cristal de alta 151520.0MHz freqncia) 33pF 33pF 151525MHz 33pF 33pF

cristal de quartzo

Ressonador cermico

Os ressonadores cermicos so comercializados em dois tipos: com dois terminais e com trs terminais. Os mais utilizados so os ressonadores com trs terminais pois no precisam de capacitores externos. O ressonador com dois terminais obedecem a ligao da figura 01, enquanto no de trs o pino central deve ser aterrado. segue abaixo o esquema de ligao do ressonador com trs terminais:

Os ressonadores cermicos uma segunda opo. No to barato quanto um RC mas bem mais estvel e preciso. Nota: Antes de gravarmos um programa no microcontrolador PIC devemos "queimar" os fusivel de configurao informando qual o tipo de oscilador estamos utilizando em nosso hardware.
Nos projetos do nosso curso iremos utilizar cristal de quartzo de 4MHz pois garantimos maior preciso nas rotinas de tempo nas execues das instrues.

voltar para o topo da pgina

Circuito de Oscilao RC
Este o tipo de oscilador mais simples que existe e tambm o mais barato, mas, por outro lado, o menos preciso, variando muito a tenso de trabalho, temperatura e tolerncias. O circuito RC deve ser ligado conforme a figura abaixo:

voltar para o topo da pgina

Modo HSPLL
HSPLL na verdade um modo em que podemos multiplicar o valor da freqncia de entrada do cristal oscilador por 4. ideal para ambientes em que o dispositivo no pode gerar EMI (interferncia Eletromagntica). Este modo deve ser habilitado nos "fusveis de configuraes" no momento em que formos gravar o chip.

Por exemplo: Caso venhamos conectar ao PIC um cristal de 10 MHz entre os pinos OSC1 e OSC2 e ativarmos o modo HSPLL no momento em que gravarmos o chip, o PIC passa a operar a 40 MHz, executando as instrues internas em 10MHz (10 MIPS - milhes de instrues por segundo), pois a frequncia real de operao do seu microcontrolador : Fosc / 4. Para representar os bits de configurao de nosso microcontrolador, iremos utilizar um software gratuito de gravao de microcontroladores PIC disponvel na internet, chamado WinPIC800. (www.winpic800.com). Nota: No programa Winpic800 podemos definir o tipo de oscilador utilizado no PIC atravs do seguinte setup:

voltar para o topo da pgina

Os bits de configurao (fusveis)


Os microcontroladores PIC possui internamente regies de memrias no volteis que so resposveis por determinar o modo de trabalho do chip. So chamados de bits de configurao ou fusveis. de grande importncia que venhamos entender o funcionamento desses bits, caso contrrio teremos srios problemas no funcionamento do nosso projeto. Os bits de configurao do PIC esto armazenados em uma rea reservada do PIC. Mapa dos bits de configurao do PIC18F452 Internamente no microcontrolador, encontramos 8 registradores de 16bits, divididos em duas partes: Byte alto e Byte Baixo, e so responsveis pela configurao geral do PIC. Esta regio de

memria no acessivel durante a execuo do programa, mas somente podemos configura-l no momento da gravao do chip.

Apresentamos a seguir uma tabela com a descrio de todos os bits de configurao do PIC18F452:
RC, EC, LP, XT, HS, HS-PLL, RC-SOC2 com RA6, EC-OSC2 com RA6 habilitado ou desabilitado habilitado ou desabilitado habilitado ou desabilitado 2.5V, 2.7V, 4.5V ou 4.7V

Oscilador oscilador switch enable power up timer brown out detect brown out voltage watchdog timer

habilitado ou desabilitado 1:1 , 1:2, 1:4, 1:8, watchdog postscaler 1:16, 1:32, 1:64, ou 1:128 ccp2mx pino RC1 ou RB3 habilitado ou stack overflow enable desabilitado habilitado ou low voltage program desabilitado code protect 0x0200 a habilitado ou

0x1FFF desabilitado code protect 0X2000 a habilitado ou 0X3FFF desabilitado code protect 0X4000 a habilitado ou 0X5FFF desabilitado code protect 0X6000 a habilitado ou 0X7FFF desabilitado habilitado ou data ee read protect desabilitado habilitado ou code protect boot desabilitado Table write protect habilitado ou 0x2000 a 0x1FFF desabilitado Table write protect habilitado ou 0x2000 a 0x3FFF desabilitado Table write protect habilitado ou 0x4000 a 0x5FFF desabilitado Table write protect habilitado ou 0x6000 a 0x7FFF desabilitado habilitado ou data ee write protect desabilitado table write protect habilitado ou boot desabilitado habilitado ou config write protect desabilitado Table read protect habilitado ou 0x0200 a 0x1FFF desabilitado Table read protect habilitado ou 0x2000 a 0x3FFF desabilitado Table read protect habilitado ou 0x4000 a 0x5FFF desabilitado Table read protect habilitado ou 0x6000 a 0x7FFF desabilitado Table read protect habilitado ou boot desabilitado

No WinPIC800, programa de gravao de microcontroladores PIC utilizado no kit PICGenios da Microgenios, podemos visualizar e configurar os bits de configurao antes de gravarmos o programa no PIC.

Podemos configurar os bits de configurao de duas maneiras: Atravs do mikroC, no momento ou no decorrer da elaborao do projeto Atravs do programa de gravao do PIC (WinPIC800, ICProg, etc) A melhor maneira de configurar os bits de configurao no momento de criao do programa no compilador, pois uma vez configurado esses bits, no precisaremos reconfigura-los a cada compilao de nos programa.

Configurando os bits de configurao do PIC


FOSC (frequncy Oscilator) Atravs dessa opo podemos configurar o tipo de clock com o qual o microcontrolador ir operar. As fontes de clock que podem ser selecionadas so:

Oscilador externo RC, com RA6 configurado como pino de saida de clock;

Oscilador HS com PLL ativo - multiplica o valor da frequncia de oscilao por 4;

Oscilador do tipo EC, utilizando o pino RA6 como saida de clock (Fosc/4);

Oscilador EC Utilizando o pino RA6 como I/O

Oscilador HS, XT, LP

OSCSEN (SYSTEM CLOCK SWITCH BIT) Atravs desse bit de configurao, podemos selecionar o modo de acionamento do oscilador do PIC. Caso venhamos a selecionar este bit, a frequncia de oscilao passa a ser gerada internamente pelo TIMER1, caso contrrio, o oscilador selecionado FOSC. Obs: Caso desejemos utilizar o oscilador interno do PIC, devemos selecionar este bit de configurao e configurar o TIMER1 para trabalhar como oscilador para o clock (basta habilitar o T1OSCSEN do TIMER1), caso no venhamos a programar o TIMER1 corretamente, automaticamente o bit de configurao do OSCSEN ser desabilitado. voltar para o topo da pagina PWRTEN (SYSTEM CLOCK SWITCH BIT)

A travs desse bit, podemos configurar o modo POWER para o acionamento do PIC, quando este bit estiver acionado o modo POWER-UP TIMER estar habilitado. O temporizadore de power-up pode seu utilizado para fazer com que o chip permanea em reset por aproximadamente 72ms aps o chip ter sido ligado. E deve ser utilizado para garantir a estabilizao da fonte de energia no projeto.

voltar para o topo da pagina BROWN-OUT voltage

O detector de brown-out utilizado para provocar o reset da CPU no caso de a tenso de alimentao cair abaixo de um determinado limite. Uma vez que a tenso retorne ao seu valor nominal, o circuito de reset liberado e o programa reiniciado. No PIC18F452 podemos selecionar 4 tipos de tenses para o BROWN-OUT: 2.0V, 2.7V, 4.2V ou 4.5V. voltar para o topo da pagina BROWN-OUT detect Podemos habilitar ou desabilitar o detector de brown-out, basta selecionar o bit de configurao caso desejemos habilitar o brown-out. voltar para o topo da pagina WDTEN - Watchdog Timer Enable (co de guarda) O watchdog timer ou co de guarda um sistema interno ao microcontrolador que evita que o programa pare em um determinado ponto. Imagine que voc desenvolveu uma aplicao e que por um erro de software em certo momento o seu programa pra (entra em loop infinito). Caso o watchdog dog no seja resetado em tempos em tempos ele ir "estourar", ou seja, chegar ao final da sua contagem fazendo com que o microcontrolador resete e reinicie todo o processo. Para habilitar o Watchdog marque o bit WDTEN. (basta deixar em ON). voltar para o topo da pagina Watchdog Postscale Select Bit O tempo minimo para estouro do watchdog de 18 ms, porm podemos estender esse tempo atravs do postscale. Com essa funo podemos multiplicar o tempo mnimo de 18 ms com os seguintes multiplicadores do prescaler: 1:1; 1:2, 1:4, 1:8, 1:16, 1:32, 1:64, 1:128. voltar para o topo da pagina CCP2 MX Podemos atravs desse bit definir se queremos multiplexar o mdulo CCP2 com o pino RC1 (CCP2MX = 0) com o pino RB3 (CCP2MX = 1) voltar para o topo da pagina

BKBUG (debug) Atravs desse bit , podemos habilitar o modo DEBUGGER no PIC. Nesse modo possivel emular um programa no prprio projeto eletrnico. Emular consiste no processo de junto com o computador, testar passo a passo o funcionamento do programa que est rodando no microcontrolador. Se esta opo estiver ativa, os pinos de gravao RB6 e RB7 deixam de funcionar como I/O's; caso contrrio, o funcionamento desses pinos fica normal. Faz necessrios a utilizao de equipamentos de debugao fornecidos pela Microchip, ou outras empresas para realizar esta operao. voltar para o topo da pagina LVP (Low Voltagem Programming) Quando o PIC gravado, acionado uma tenso de 12Vcc no pino MCLR. Se a opo LVP estiver ativa, para gravar o PIC basta ter nivel lgico 1 no pino RA5. Esta opo ideal para aplicaes em campo onde dificil encontrar tenses de 12V disponvel em determinados equipamentos. voltar para o topo da pagina STVREN (Stack Overflow Reset Enable Bit) O PIC18F452 possui internamente 31 endereos de pilha. Quando habilitamos esse bit STVREN, toda vez que ultrapassarmos o limete da pilha (ocorrer overflow) o microcontrolador ser resetado. voltar para o topo da pagina rea de Protees contra leitura e escrita

Code Protect 0x0200 a 0x1FFF Caso este bit esteja habilitado, protege contra leitura a memria de programa de 0x0200 a 0x1FFF. Code Protect 0x2000 a 0x3FFF Caso este bit esteja habilitado, protege contra leitura a memria de programa de 0x2000 a 0x3FFF. Code Protect 0x4000 a 0x5FFF

Caso este bit esteja habilitado, protege contra leitura a memria de programa de 0x4000 a 0x5FFF. Code Protect 0x6000 a 0x7FFF Caso este bit esteja habilitado, protege contra leitura a memria de programa de 0x6000 a 0x7FFF. Data EE Read Protect Caso este bit esteja habilitado, protege contra leitura os 256 bytes da memria EEPROM (memria no voltil). Code Protect Boot Caso este bit esteja habilitado, protege contra leitura a regio de memria Boot (rea da memria de programa) 0x0000 at 0x0FF0. Table Write Protect 0x0200 a 0x1FFF Caso este bit esteja habilitado, protege a memria de programa contra escrtita por tabela no endereo especificado. Table Write Protect 0x2000 a 0x3FFF Caso este bit esteja habilitado, protege a memria de programa contra escrtita por tabela no endereo especificado. Table Write Protect 0x4000 a 0x5FFF Caso este bit esteja habilitado, protege a memria de programa contra escrtita por tabela no endereo especificado. Table Write Protect 0x6000 a 0x7FFF Caso este bit esteja habilitado, protege a memria de programa contra escrtita por tabela no endereo especificado. Data Write Protect Caso este bit esteja habilitado, protege contra escrita os 256 bytes da memria EEPROM (memria no voltil). Table Write Protect Boot Caso este bit esteja habilitado, protege contra escrtita por tabela a rea de boot. Config Write Protect

Caso este bit esteja habilitado, protege contra escrita a rea de configurao do microcontrolador. Table Read Protect 0x0200 a 0x1FFF Caso este bit esteja habilitado, protege a memria de programa contra leitura por tabela no endereo especificado. Table Read Protect 0x2000 a 0x3FFF Caso este bit esteja habilitado, protege a memria de programa contra leitura por tabela no endereo especificado. Table Read Protect 0x4000 a 0x5FFF Caso este bit esteja habilitado, protege a memria de programa contra leitura por tabela no endereo especificado. Table Read Protect 0x6000 a 0x7FFF Caso este bit esteja habilitado, protege a memria de programa contra leitura por tabela no endereo especificado.

Ciclos de mquina
A contagem de tempo no medida diretamente pela freqncia de oscilao do cristal e sim atravs do que chamamos de CICLO DE MQUINA. Internamente no microcontroladores PIC a freqncia do cristal dividida por 4, o que nos resulta que a freqncia real de trabalho :

freqncia de trabalho real = freqncia oscilador / 4


Concluimos ento que: a cada 1 cliclo de mquina corresponde a 4 pulsos do oscilador. Para exemplificar vamos supor que temos conectado ao microcontrolador um cristal de quartzo de 8MHz. Qual a freqncia real de execuo das instrues do nosso microcontrolador? muito simples, acompanhe: Sabemos que a freqncia do cristal utilizado de 4 MHz, e que cada instruo leva exatamente 1 ciclo de mquina para ser executada; Basta dividir o valor do cristal por 4 para sabermos o valor real de trabalho do PIC.

freqncia de trabalho real = 8MHz / 4 => 2MHz

Concluimos ento que nosso microcontrolador PIC com cristal de 8MHz esta trabalhando efetivamente a 2MHz, ou seja , cada instruo de programa leva 0,5 us para ser executada. Nota: Temos que lembrar que nosso microcontrolador em estudo pode operar com cristal oscilador de at 40MHz, disso nos resulta em 10MHz a freqncia mxima de trabalho permitida por esse chip. Freqncia de trabalho real = 40MHz / 4 => 10MHz

voltar para o topo da pgina

Reset
Sempre que ligamos ou energizamos nosso circuito microcontrolado interessante que o PIC seja resetado, para isso necessria a insero de um circuito eletrnico bem simples, mas capaz de realizar esse procedimento que costumamos chamar de POWER ON RESET. Alm disso interessante que exista um boto para que o usurio possa reiniciar o sistema sempre que for necessrio (reset manual), a seguir indicamos um exemplo de circuito para o reset.

Os PICs possuem diversos tipos de reset: POR - Power On Reset - o reset que ocorre quando o chip ligado. Reset do MCLR durante a operao normal Reset do MCLR durante o modo SLEEP Reset do watchdog durante operao normal Reset do detector de Brown-out (BOR) Instruo de Reset Reset por estouro de Pilha - Stack Overflow

voltar para o topo da pgina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC Programao em C

Microgenios 1998 - 2007. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

As Portas de I/O's
1.0 Introduo as Portas de I/O 1.1 PORTA 1.2 PORTB 1.3 PORTC 1.4 PORTD 1.5 PORTE

Introduo as portas de I/O


Os microcontroladores PIC possuem pinos fsicos destinados comunicao de dados com os circuitos externos. Atravs desses pinos podemos enviar nveis lgicos (0 ou 1) para, por exemplo, acender ou apagar um LED, acionar displays LCD, ler botes e sensores, etc. O microcontrolador PIC18F452 da Microchip possuem 34 pinos de escrita e leitura (I/O), os quais esto divididos em quatro portas chamadas: PORTA, PORTB, PORTC, PORTD e PORTE.

figura 01
Os PORTB, PORTC e PORTD possuem 8 pinos de I/O cada, enquanto o PORTE possue 3 pinos de I/O e PORTA 6 pinos de I/O. Cada porta de I/O possui dois registradores que controlam suas funes: um registrador PORT e um registrador TRIS. Os registradores PORT (PORTA, PORTB, PORTC, PORTD, PORTE) que so posies na RAM que contm os dados das portas paralelas (I/O's) do microcontrolador. Qualquer escrita realizada em um desses registros automaticamente altera todo o contedo presente na sada do chip. O registrador TRIS utilizado para configurar cada pino da respectiva porta como entrada ou sada. Assim, cada bit do registrador corresponde a um pino da porta. Se o bit estiver em 1 (um), o pino correspondente esta configurado como entrada de dados, e se estiver em 0 (zero) configuramos este pino como sada de dados. As portas de comunicao paralela do PIC so utilizadas para efetuar diversas tarefas:

voltar para o topo da pgina

PORTA

A primeira porta a ser estudada a PORTA. Alm das funes de entrada e sada de dados encontramos tambm diversas outras funes multiplexadas aos pinos da PORTA: Vamos conhecer as funes de cada pino da PORTA:

PINO
2 3 4

FUNO

TIPO

DESCRIO
Pino de entrada e sada de uso geral / entrada do conversor AD0 Pino de entrada e sada de uso geral / entrada do conversor AD1 Pino de entrada e sada de uso geral/ entrada do conversor AD2 / entrada analgica de referncia baixa Pino de entrada e sada de uso geral / entrada do conversor AD3 / entrada analgica de referncia alta Pino de entrada e sada de uso geral / entrada de contador T0 do timer0 Pino de entrada e sada de uso geral / entrada do conversor AD4 / entrada de seleo SPI, detector de baixa voltagem. sada do cristal oscilador / entrada do clock exteno / entrada e sada de uso geral

14

I/O RA0 / AN0 entrada I/O RA1 / AN1 entrada I/O RA2 / AN2 /Vref- entrada entrada I/O RA3 / AN3 / Vref+ entrada entrada I/O RA4 / T0CKI entrada entrada I/O entrada RA5/AN4/SS/LVDIN entrada entrada sada OSC2 / CLK1/ RA6 sada I/O

Registrador PORTA

Figura 02
O resistrador PORTA esta localizado na memria RAM do PIC e possui o endereo (0XF80). Este registrador ir acessar os pinos da PORTA da seguinte maneira: BIT 0 do registrador PORTA -> atua sobre o bit RA0 BIT 1 do registrador PORTA -> atua sobre o bit RA1

BIT BIT BIT BIT BIT

2 3 4 5 6

do do do do do

registrador registrador registrador registrador registrador

PORTA PORTA PORTA PORTA PORTA

-> -> -> -> ->

atua atua atua atua atua

sobre sobre sobre sobre sobre

o o o o o

bit bit bit bit bit

RA2 RA3 RA4 RA5 RA6

Toda a porta de I/O possui internamente um latch de sada para cada pino. Dessa forma, uma escrita no registrador PORTA ir na realidade escrever em cada latch do PORTA. Para ler um dado na PORTA, basta ler o contedo do registrador PORTA.

Nota: O registrador PORTA o "espelho" dos pinos da PORTA do PIC, para lermos ou escrevermos nesse registrador estamos na verdade atuando sobre os pinos do port respectivamente. No podemos esquecer que o registrador TRISA tambm afeta a leitura e escrita no port.
Alm de operar como I/O de uso geral, o PORTA, pode ser configurado como entrada analgica. Para isso, faz necessrio que o programador venha a programar os pinos do PORTA como entrada analgica, atravs do registrador ADCON1. Nota: aps o reset do seu microcontrolador, os pinos do PORTA e PORTE vem configurados como A/D (entrada analgica), caso queiramos acionar por exemplo um rel com um pino deste PORT, precisamos configurar adequamente este pino como I/O atravs do registrador ADCON1. Conhecendo o registrador ADCON1:

X pode ser 0 ou 1 Figura 03 O registrador ADCON1 responsvel por determinar quais os pinos do PORTA e PORTE (com excesso de RA4) sero entrada analgica ou digital. Repare que na tabela (figura 03) para configurarmos todos os pinos do PORTA como entrada digital, ou seja, como I/O de uso geral, basta carregar o valor ADCON1 = 0B00000111; ou ADCON1 = 0B00000110; Exemplo de programa:
void main() { adcon1 = 0b00000111; // configura pinos do PORTA e PORTE como I/O digital trisa.f0 = 0; //configura pino RA0 como saida porta.F0 = 1; // envia nivl lgico 1 no pino RA0 }

Podemos definir determinadas tenses externas de referncia para nosso conversor analgico / digital, atravs dos pinos RA2 (AN2) e RA3 (AN3). Podemos tambm programar nossa referncia de tenso do conversor A/D como sendo VSS e VDD, ou seja, a prpria tenso de alimentao do chip. Neste caso, os pinos RA2 e RA3 podero ser utilizados como entrada analgica, ou como I/O de uso geral. Registrador TRISA
O registrador TRISA utilizado para o controle da direo de atuao de cada pino de I/O do PORTA. Atravs desse registradores definimos e configuramos o modo de trabalho do pino do microcontrolador como entrada ou sada de dados. Este registrador define os pinos do PORTA da seguinte maneira: BIT BIT BIT BIT BIT BIT BIT 0 1 2 3 4 5 6 do do do do do do do registrador registrador registrador registrador registrador registrador registrador TRISA TRISA TRISA TRISA TRISA TRISA TRISA -> -> -> -> -> -> -> atua atua atua atua atua atua atua sobre sobre sobre sobre sobre sobre sobre o o o o o o o bit bit bit bit bit bit bit RA0 RA1 RA2 RA3 RA4 RA5 RA6

Se o bit do registrador TRISA estiver em nvel lgico 1, o pino correspondente a este bit do PORTA estar configurado como entrada. Se o bit do registrador TRISA estiver em nvel lgico 0, o pino correspondente a este bit do PORTA estar configurado como sada. void main() { trisa = 0b00000000; PORTA como saida

//configura todos os pinos do

trisb = 0b00001111; //configura somente RB7 a RB4 do PORTB como saida trisa.f0 = 0; //configura pino RA0 como trise.f2 = 1; //configura pino RE2 como dados trisc.f1 = 1; //configura pino RC1 como dados }

os pinos de saida entrada de entrada de

Aprendendo como configurar os pinos do PIC18F452:


Exemplo: Com base no circuito eletrnico abaixo, vamos configurar os registradores de direo de pinos:

void main() { adcon1 = 0b00000110; //configura pinos do PORTA e PORTE como I/O digital trisa.f0 = 0; //configura RA0 do PORTA como saida trisa.f2 = 0; //configura RA2 do PORTA como saida trisa.f4 = 0; //configura RA4 do PORTA como saida porta = 0b00010101; //ascende somente todos os leds. trisb.f0 = 1; //configura pino RB0 como entrada de dados trisb.f3 = 1; //configura pino RB3 como entrada de dados trisb.f7 = 1; //configura pino RB7 como entrada de dados }

No circuito acima, os pinos RA0, RA2, RA4 dO PORTA so responsveis pelo acionamento dos leds. Devemos configurar o PORTA como sada, pois nosso objetivo "escrever" no port, ou seja, enviar "0" ou "1" lgico nos pinos do PORTA correspondente. Os pinos RB0, RB3 e RB7 do PORTB tem a funo de "ler" os estados das teclas, quando as teclas esto soltas temos nvel lgico 1 nos pinos, quando a tecla pressionada, o estado do pino alterado para nvel 0. Devemos configurar o PORTB como entrada, pois iremos "ler" o estados dos pinos, ou seja, o estados das teclas. Seguindo o mesmo raciocnio lgico, vamos programar o PIC abaixo de forma que todos os leds pisquem a cada segundo.

void main(){ trisd = 0; //configura todos os pinos do PORTC como saida portd = 0; //inicia programa com portd em zero while(1){ //lao de repetio portd = 0; //apaga todos os leds delay_ms(1000); //delay de 1 segundo portd = 0b11111111; //envia nvel lgico 1 em todos os pinos do PORTD delay_ms(1000); //delay de 1 segundo } }

Exerccio:

Com base na tabela (figura 03), programa os pinos RA0, RA1 e RA3 como entrada analgica, as demais entradas analgicas devero ser programadas como I/O digital.
void main(){ adcon1 = 0b00000100; //configura pinos RA0, RA1, RA3 do PORTA entrada analgica }

Leitura do LATCH de um pino do PIC


Para ler o LATCH de sada do microcontrolador ao invs do pino utilizamos o registrador LATA, referente ao PORTA, ou LATB, referente ao PORTB. O latch de sada encontra-se antes do buffer de sada do pino, e por esse motivo podemos ler seu estado.

voltar para o topo da pgina

PORTB
O PORTB, tal qual o PORTA, implementa diversas outras funes multiplexadas aos seus pinos, acompanhe:

PINO FUNO TIPO


33 RB0 / INT0

DESCRIO

I/O Pino de entrada e sada de uso geral / interrupo entrada externa 0 I/O Pino de entrada e sada de uso geral / interrupo 34 RB1 / INT1 entrada externa 1 I/O Pino de entrada e sada de uso geral / interrupo 35 RB2 / INT2 entrada externa 2 I/O 36 RB3 / CCP2 Pino de entrada e sada de uso geral / mdulo CCP I/O Pino de entrada e sada de uso geral / pino de 37 RB4 I/O interrupo por mudana de nvel Pino de entrada e sada de uso geral (interrupo I/O 38 RB5/PGM por mudana de estado) / pino de habilitao ICSP I/O baixa voltagem Pino de entrada e sada de uso geral (interrupo I/O 39 RB6 / PGC por mudana de estado) / pino ICSP In-Circuit I/O Debugger Pino de entrada e sada de uso geral (interrupo I/O 40 RB7 / PGD por mudana de estado) / pino ICSP In-Circuit I/O Debugger Assim como no PORTA, o PORTB possui dois registradores que definem o modo de trabalho dos seus pinos de I/O: so eles: PORTB e TRISB. Tanto o registrador PORTB quanto o registrador TRISB esto localizados na memria RAM do PIC e pertencem aos SFR'S (Registradores de Funes Especiais). O registrador TRISB tem as mesmas funes que o registrador TRISA estudado anteriormente, que programar os pinos do PIC para serem entradas ou sadas. O registrador PORTB funciona da mesma maneira descrita no PORTA.

voltar para o topo da pgina

PORTC
O PORTC, tal qual o PORTA, implementa diversas outras funes multiplexadas aos seus pinos, acompanhe:

PINO
15

FUNO

TIPO

DESCRIO
Pino de entrada e sada de uso geral / sada do oscilador timer1 / entrada oscilador timer1 / timer3 Pino de entrada e sada de uso geral / entrada do oscilador timer1 / mdulo CCP2 Pino de entrada e sada de uso geral / mdulo CCP2 Pino de entrada e sada de uso geral / entrada e sada do clock serial para o modo SPI / entrada e sada do clock serial para o modo I2C

16 17

I/O RC0/T10S0/T1CKI sada entrada I/O RC1 / T10S1 / entrada CCP2 -sada I/O RC2/CCP1 I/O RC3/SCK/SCL I/O I/O I/O

18

I/O Pino de entrada e sada de uso geral / entrada entrada de dados SPI / entrada e sada de dados I2C - I/O I/O - Pino de entrada e sada de uso geral / sada de 24 RC5/SD0 sada dados SPI I/O - Pino de entrada e sada de uso geral / canal de 25 RC6/TX/CK sada - transmisso UART / clock de sincronismo I/O UART I/O - Pino de entrada e sada de uso geral / canal de 26 RC7/RX/DT entrada recepo UART / clock de sincronismo - I/O UART Assim como no PORTA, o PORTC possui dois registradores que definem o modo de trabalho dos seus pinos de I/O: so eles: PORTC e TRISC. Tanto o registrador PORTC quanto o registrador TRISC esto localizados na memria RAM do PIC e pertencem aos SFR'S (Registradores de Funes Especiais). O registrador TRISC tem as mesmas funes que o registrador TRISA estudado anteriormente, que programar os pinos do PIC para serem entradas ou sadas. O registrador PORTC funciona da mesma maneira descrita no PORTA. As funes especiais de cada pino sero vistas quando estudarmos suas aplicaes reais atravs dos projetos que vamos desenvolver durante nosso curso. 23 RC4/SDI/SDA

voltar para o topo da pgina

PORTD
O PORTD, tal qual o PORTA, PORTB e PORTC implementa diversas outras funes multiplexadas aos seus pinos, acompanhe:

PINO FUNO TIPO 19 RD0/PSP0 I/O -

DESCRIO entrada e sada de uso geral / porta de

20 21 22 27 28 29 30

RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7

I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O

comunicao paralela entrada e sada de uso geral / porta de comunicao paralela entrada e sada de uso geral / porta de comunicao paralela entrada e sada de uso geral / porta de comunicao paralela entrada e sada de uso geral / porta de comunicao paralela entrada e sada de uso geral / porta de comunicao paralela entrada e sada de uso geral / porta de comunicao paralela entrada e sada de uso geral / porta de comunicao paralela

Assim como nas outras portas, o PORTD possui dois registradores que definem o modo de trabalho dos seus pinos de I/O: so eles: PORTD e TRISD. Tanto o registrador PORTD quanto o registrador TRISD esto localizados na memria RAM do PIC e pertencem aos SFR'S (Registradores de Funes Especiais). O registrador TRISD tem a funo de programar os pinos do PIC para serem entradas ou sadas. O registrador PORTD o "espelho" dos pinos do PORTD do PIC, para lermos ou escrevermos nesse registrador estamos na verdade atuando sobre os pinos do port respectivamente. No podemos esquecer que o registrador TRISD tambm afeta a leitura e escrita no port. As funes especiais de cada pino sero vistas quando estudarmos suas aplicaes reais atravs dos projetos que vamos desenvolver durante nosso curso.

voltar para o topo da pgina

PORTE
O PORTE, tal qual as outras portas, implementa diversas outras funes multiplexadas aos seus pinos, acompanhe:

PINO FUNO TIPO


8 9 10 RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 I/O I/O I/O

DESCRIO
Pino de entrada e sada de uso geral / controle de leitura do port paralelo / entrada analgica AD5 Pino de entrada e sada de uso geral / controle de escrita do port paralelo / entrada analgica AD6 Pino de entrada e sada de uso geral / controle de seleo do port paralelo / entrada analgica AD7

Assim como nas outras portas, o PORTE possui dois registradores que definem o modo de trabalho dos seus pinos de I/O: so eles: PORTE e TRISE. Tanto o registrador PORTE quanto o registrador TRISE esto localizados na memria RAM do PIC e pertencem aos SFR'S (Registradores de Funes Especiais). O registrador TRISE tem a funo de programar os pinos do PIC para serem entradas ou sadas. O registrador PORTE o "espelho" dos pinos do PORTE do PIC, para lermos ou escrevermos nesse registrador estamos na verdade atuando sobre os pinos do port respectivamente. No podemos esquecer que o registrador TRISE tambm afeta a leitura e escrita no port. As funes especiais de cada pino sero vistas quando estudarmos suas aplicaes reais atravs dos projetos que vamos desenvolver durante nosso curso.

voltar para o topo da pgina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2008. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

O Compilador mikroC
Manipulando as Portas de I/O 1.0 Introduo 1.1 Conhecendo o mikroC 1.2 Criao de um projeto no mikroC 1.3 Conhecendo o ambiente mikroC 1.4 Code Editor (editor de cdigo) 1.5 Code Assistant (assistente de cdigo) 1.6 Parameter Assistant (assistente de parmetro) 1.7 Auto Correct (correo automtica) 1.8 Comment / Uncomment (Comentar / no comentar) 1.9 Goto Line (v para linha) 2.0 Messages Window (janela de mensagens) 2.1 Procedures List (Lista de procedimentos) 2.2 Project Setup 2.3 Ferramentas Integradas

Introduo
O mikroC um compilador desenvolvido e comercializado pela empresa MikroElektronika (www.mikroe.com). Ele se consiste um sistema integrado de desenvolvimento (IDE) para os sistema operacional Windows e suporta toda a linha de microcontroladores PIC (sries PIC12, PIC14, PIC16, PIC18) e existe outras verses para dsPIC (dsPIC30, dsPIC33 e PIC24). Os PICs da srie 14 e 17, alm dos microcontroladores da UBICOM/SCENIX (SX), no so suportados por esta verso do compilador.

Integrado ao compilador mikroC, temos diversas ferramentas que nos auxiliam no desenvolvimento de aplicaes, tais como: emuladores de Terminal Serial, ferramentas para LCD grficos e displays de 7 segmentos, EEPROM, etc. Temos tambm a opo de utilizar o debugador de cdigo na prpria IDE. Vejamos agora as principais caracteristicas do compilador em estudo: Grande facilidade na elaborao de programas Grande eficincia no cdigo gerado; Grande diversidade de funes e bibliotecas para controle dos mais variados tipos de dispositivos, fato que o torna um dos mais prticos compiladores C para microcontroladores PIC nos dias atuais. Grande portabilidade de cdigo de entre os diversos microcontroladores PIC, ou seja, muito fcil adaptar um programa escrito em C para outro microcontroladore de outra srie PIC. O mikroC possui seu prprio debugger que comercializado pelo fabricante. O mikroC no compatvel com o MPLAB da Microchip. Diverge em alguns pontos com relao ao padro ANSI-C. O mikroC no um software gratuito, e comercializado pelo seu fabricante por poucos dlares. A verso demo que iremos utilizar no desenvolvimento do nosso curso possui limite de gerao de cdigo de 2 kbyte de programa. Ultrapassando esse limite, necessrio adquirir a verso completa (full). O mikroC possui diversas bibliotecas de funes prontas para o tratamento dos mais variados dispositivos. Acompanhe:
Bibliotecas de Funes do mikroC

ADC Library CAN Library CANSPI Library Compact Flash Library EEPROM Library Ethernet Library SPI Ethernet Library Flash Memory Library Graphic LCD Library T6963C Graphic LCD Library IC Library Keypad Library LCD Library LCD Custom Library LCD8 Library Manchester Code Library Multi Media Card Library OneWire Library PS/2 Library PWM Library RS-485 Library

Software IC Library Software SPI Library Software UART Library Sound Library SPI Library USART Library USB HID Library Util Library SPI Graphic LCD Library Port Expander Library SPI LCD Library SPI LCD8 Library SPI T6963C Graphic LCD Library
Bibliotecas ANSI C Standard

ANSI C Ctype Library ANSI C Math Library ANSI C Stdlib Library ANSI C String Library
Outras bibliotecas

Conversions Library Trigonometry Library sprint Library Setjmp Library Time Library voltar para o topo da pgina

Conhecendo o mikroC
Vamos conhecer nosso compilador mikroC Aps a instalao do compilador, visualizado um cone na rea de trabalho denominado mikroC. Clique duas vezes nesse cone que o programa comea a ser carregado e apresenta a seguinte tela:

Figura 01 - O compilador mikroC

A primeira vez que instalamos o MikroC em nosso computador, sua interface apresentado com background de cor preta. Podemos alterar esta configurao acessando o menu Tools > options > Colors > Scheme.

Nosso compilador trabalha com a concepo de criao de projeto. Necessriamente devemos criar um projeto para cada aplicao que venhamos a desenvolver. A concepo de criao de projeto no mikroC importante para que possamos incluir vrios arquivosfontes e configuraes ao nosso projeto.

voltar para o topo da pgina

Criao de um projeto no mikroC


Para criarmos uma aplicaes no mikroC muito fcil, acompanhe o modelo passo a passo: Abra o mikroC e v ao menu Project > New Project. A tela seguinte aparece:

Figura 02 - criao de um projeto no mikroC >> Em Project Name digite o nome do seu projeto, em Project Path. Todos os arquivos de saida (list, hex, ASM) tero o mesmo nome do campo Project Name. Nota: No crie projetos com nomes com acentuao, caracteres especiais, espaos entre caracteres, e nomes reservados pelo compilador, como por exemplo: Button. >> Em Devide Flag, ajuste os configurantions bits do microcontrolador, que informam como o microcontrolador deve operar. Com ele possvel alterar o tipo de oscilador utilizado pelo projeto, assim como se vai usar o watchdog ou acionar a proteo contra leitura do chip. Esses bits so conhecidos como "fusveis". >> O campo Description opcional. Neste campo podemos descrever de forma resumida o funcionamento de nosso projeto, assim como colocar verses ou informaes adcionais que o programador ache necessrio.

>> No campo Device podemos selecionar o modelo do microcontrolador PIC que utilizaremos em nosso projeto. >> No campo Clock especificamos o valor da frequencia de trabalho de nosso microcontrolador. No caso de aplicaes com o Kit PICgenios PIC18F, utilizaremos o valor de 8MHz (frequencia do cristal externo conectado ao chip).

O campo Device Flags onde iremos configurar os bits de configurao de nosso microcontrolad or. Atravs desses bits de configurao podemos determinar as configuraes iniciais de funcionamento de nosso microcontrolador, assim como proteger nosso programa contra leituras, determinar os tipo de oscilador utilizado no projeto, dentre outras. Podemos nomear e salvar as configuraes dos bits de configurao aps termos configurados todos seus bits, pois dessa forma no precisaremos reconfigurar esses bits a cada criao de um novo projeto, basta apenas carregar as configuraes j salvas anteriormente. Repare que cada modelo de microcontrolador possui um painel diferente de bits de configurao. Estudaremos mais detalhado a funo de cada um dos fusveis mais adiante em nosso curso;

Aps ter configurado todos os parmentros e campos, basta clicar no boto ok para salvar seu projeto. Pronto, nosso projeto est pronto e podemos inserir os cdigos do programa no editor.

voltar para o topo da pgina

Conhecendo o ambiente mikroC


Observe o ambiente mikroC na figura abaixo:

Figura 03
O compilador mikroC permite o desenvolvimento rpido de aplicaes complexas graas aos recursos do editor avanado Code Editor. Alm disso, permitido utilizar as bibliotecas includas na linguagem para aumentar a velocidade e a facilidade de desenvolvimento dos projetos como comunicao serial, displays, aquisio de dados, memria, etc. Aps a compilao de nosso programa, o mikroC tambm gera arquivos LIST, cdigo em assembly e arquivo .HEX. Integrado ao compilador, temos um debugador para testes do programa no ambiente.

voltar para o topo da pgina

Code Editor (editor de cdigo)


O editor de cdigo do compilador mikroC oferece grandes auxlios no desenvolvimentos de projetos. Alguns aspectos desse editor so: Sintaxe ajustvel Assistentes de parmetros Cdigo modelo Autocorreo para tipos comuns Funo para saltos de linhas. Assistentes de cdigos

voltar para o topo da pgina

Code Assistant (assistente de cdigo)


O Assistente de cdigo uma excelente ferramenta disponvel no mikroC, pois o programador no precisa editar todo o cdigo e ainda por cima analisa o formato da constuo do comando;

Figura 04
Para acion-lo, digite as primeiras letras e pressione CTRL + SPACE que aparecer uma janela informando os comandos associados s letras digitadas.

voltar para o topo da pgina

Parameter Assistant (assistente de parmetro)


O assistente de parmetro usado para auxiliar o programador a redigitar alguns parmetros do programa;

Para acion-lo, basta pressionar as teclas CTRL + SHIFT + SPACE. voltar para o topo da pgina

Auto Correct (correo automtica)


O compilador mikroC possui a opo de correo automtica, corrigindo erros de sintaxe cometido pelo programador. Para corrigir os palavras necessrio que voc adicione as palavras corretas e erradas atravs do menu Tools > Preferences > Auto Correct. As palavras erradas sero substitudas pelas palavras corretas desde que estejam registradas no menu > Auto Correct.

voltar para o topo da pgina

Comment / Uncomment (Comentar / no comentar)

Atravs dessa funo voc poder facilmente adicionar linhas ou blocos de comentrios no seu programa. Basta clicar com o mouse no cone Comment / Uncomment do Code Toolbar.

voltar para o topo da pgina

Goto Line (v para linha)


Essa opo aplicada para saltar de uma linha do editor de cdigo para outra. Basta pressionar as teclas de atalho CTRL + G que aparecer uma caixa onde dever ser inserida o nmero da linha que deseja saltar.

Figura 05 voltar para o topo da pgina

Messages Window (janela de mensagens)


Nos casos de erros encontrados durante a compilao, o compilador reporta o erro e no gera o arquivo .hex. Alm disso, o Message Window informa o tamanho do cdigo de programa (ROM) gerado pelo sistema, assim como a memria de dados (RAM) usada pelo programa. Para visualizar a janela de mensagens, v em View > Messages.

Figura 06

voltar para o topo da pgina

Procedures List (Lista de procedimentos)


Para visualizar a lista de todos os procedimentos utilizados pelo compilador, selecione View > Procedures List pelo menu ou prossione CTRL + L no teclado.

voltar para o topo da pgina

Project Setup
Em Project Setup podemos alterar as configuraes dos projetos criado no mikroC. Para acess-lo pressione Project > Edit Project.

voltar para o topo da pgina

Ferramentas Integradas
O compilador MikroC possui diversas ferramentas que nos auxiliaro no desenvolvimento de nosso projeto. Dentre as ferramentas, encontramos terminais seriais, terminais de comunicao USB, Ethernet, LCD alfanumrico e Grfico, Bootloader, display de 7 segmentos, dentre outros. Para ter acesso a esses painis, acesse o menu Tools.

Figura 07 Vamos conhecer cadas uma das ferramentas do MikroC:

ASCII Chart standart


Atravs desse painel podemos visualizar os caracteres presente na tabela ASCII. Os caracteres ASCII so muito utilizados na grande maioria dos programas que fazem comunicao serial e operaes com displays LCD. Repare que ao passarmos o mouse sobre os caracteres, ser nos apresentado o valor do caracterer em ASCII, decimal, hexadecimal e binrio.

Figura 08 - Tabela ASCII Chart

Export Code to HTML


Podemos exportar todo nosso programa desenvolvido para HTML (pgina simples de internet), dessa forma, podemos visualizar e garantir a formatao e tabulao das fontes e linhas de nosso programa.

MikroBootLoader
Alguns modelos de microcontroladores PIC possui internamente uma regio em sua memria de programa denominada Boot. Nesta regio podemos gravar um pequeno programa chamado BootLoader, no qual permite, via um software de PC,

gravar o microcontrolador via PC RS232 < > USART do PIC. A empresa Mikroelektronika disponibilizou o programa de Boot para diversos componentes da famlia PIC16F e PIC18F, que podem ser encontrados na pasta: c:\...\MikroeleKtronica\Mikro_c\Examples\EasyPic5\extra_examples\Bootloader

Figura 09 - MikroBootLoader O sistema de Bootloader so altamente utilizados em equipamentos que permitem atualizao de verses do programa do microcontrolador, tais como CLP. Nota: Existe vrios programas de bootloader para microcontroladores PIC na internet. Digite bootloader PIC no google (www.google.com.br) para conhecer um pouco melhor sobre o tema.

USART Terminal
O mikroC possui uma excelente ferramenta para recepo e envio de dados seriais via RS232, o Comunication Terminal (terminal de comunicao). Para acess-lo, clique no menu Tools > USART Terminal ou no cone terminal que fica na Toolbar.

Figura 10 - Terminal Serial RS232


Para configur-lo muito fcil e simples; basta escolher a porta de comunicao serial atravs do Settings Com Port, definir a velocidade de comunicao em Settings Baud, os bits de dados e a paridade. Aps este procedimento, clique em Connect COM para que a porta seja aberta. Todos os caracteres recebidos e enviados sero mostrados na caixa de texto maior da janela. Para enviar algum dado, basta digit-lo na caixa de texto ao lado do boto send e pressionar send.

Seven Segment Display Decoder (Decodificador de 7 segmentos)


O decodificador de 7 segmentos uma ferramenta simples que permite descobrir os valores decimais ou hexadecimais correspondente ao dgito do display desejado. Basta clicar com o mouse na imagem do display para visualizar os valores em ctodo e nodo comum. Esta ferramenta muito importante quando acionamos displays de 7 segmentos por varredura.

Figura 11 - Decodificador 7 segmentos

Graphic LCD Bitmap Generator (gerador de imagem para LCD Grfico)


Esta ferramenta do mikroC gera cdigo hex. de uma imagem BMP para utilizar em display grficos.

Figura 12 - Painel de display Grfico


Sua utilizao muito simples, permite que utilizemos LCD's grficos com controladores T6963C e com Drives KS0108. Basta clicar no boto Load BMP Picture para carregar a imagem BMP.

LCD Custom Caracterer


Em muitas aplicaes, precisamos criar novos caracteres e simbolos em nosso display LCD alfanmerico (lcd 16x1, 16x2, 20x4, dentre outros). Para que possamos "desenhar" estes novos caracteres, faz necessrio acessarmos a rea de memria editvel do LCD: a CGRAM. O compilador MikroC disponbiliza uma excelente ferramenta que iro acelerar e muito o desenvolvimento de nosso programa para esta aplicao, pelo qual podemos ter acesso a ela via menu Tools > LCD custom character.

Figura 13 - Ferramenta de criao de um novo caracterer no LCD Aps termos desenhado nosso caracterer, podemos clicar no boto GENERATE, para que aparea uma tela com nosso cdigo (subrotina) pronto para inserirmos em nosso programa principal.

Outras Ferramentas: Debugger


possvel debugar o programa compilado atravs do prprio mikroC. O uso do debugador muito importante para certos aplicativos, pois evita a necessidade de gravar um programa em uma placa de teste. Para ativar o Debugador, v em Run > Start Debugger.

Figura 12 - Painel de debugao Atravs do debugador voc poder testar o funcionamento lgico do seu programa, podendo visualizar todos os registradores, variveis, funes entre outras.

Janelas de estatsticas

Aps a compilao do programa, possivel ter acesso janela de estatsticas que nos informa o tamanho do cdigo gerado, tamanho das rotinas, posies ocupadas pelas variveis, memria de programa e dados, etc. Para visualiz-la, clique em View > View Statistics.

Note que a janela de estatsticas composta por seis abas. A primeira informa o tamanho de RAM e ROM usadas pelo programa.

Informa o tamanho das rotinas utilizadas no programa

Informa os endereos de incio e trmino de cada rotina do programa

Informa com maiores detalhes os endereos, tamanho das rotinas compiladas do projeto.

Informa todos os endereos das variveis na RAM, os SFR's e os GPRS.

Informa nosso programa C convertido em Assembly pelo compilador.

voltar para o topo da pgina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2008. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Criao de um projeto

Criao de um projeto no mikroC passo a passo


Vamos aprender passo a passo como criar um projeto no mikroC:

1. O primeiro passo abrir o mikroC;

2. Acesse o menu Project > New Project...

3. No menu New Project, coloque o nome do seu projeto, a pasta onde sero salvos os arquivos-fontes do programa, escolha o microcontrolador que deseja programar, o valor da freqncia do cristal, e configure os fusveis do PIC selecionado. Neste exemplo, colocamos no nome de meu_programa em nosso projeto, os arquivos -fontes do projeto sero salvos em C:\...\Meu_programa\ , o microcontrolador que iremos utilizar no projeto o PIC18F452, a freqncia do cristal utilizado de 8 MHZ, e os fusveis configurados so: Oscilador -> HS (definimos o tipo de oscilador utilizado no projeto) Watchdog -> OFF (Watchdog timer desligado) LVP -> OFF (Low Voltagem Programming - desligado) Brown Out -> OFF (Brown-out desligado) 4. Clique no boto ok do painel New Project para salvar as configuraes do projeto. A tela seguinte ir aparecer, edite seu programa no Code Editor (painel de edio). Para exemplificar copie e cole o programa abaixo no painel de edio do mikroC.
// o programa abaixo tem por funo escrever no PORTD do PIC o valor FF void main() { TRISD = 0x00; PORTD= 0xff; while (1); }

clique aqui e baixe o programa:

5. Salve seu programa atravs do cone salvar na barra de ferramentas do mikroC e pressione o cone Build Project compilar seu programa; ou pressione as teclas de atalho CTRL + F9 para

6. Seu programa ser compilado e seu resultado poder ser visualizado atravs da Janela de mensagens:

Pronto, seu projeto foi criado e compilado com sucesso; O compilador mikroC gerou na compilao o arquivo .HEX, este arquivo que dever ser gravado no microcontrolador PIC.

Arquivo meu_programa.hex gerado pelo mikroC na compilao do nosso projeto :1000000004EF00F0FFFFFFFF956AFF0E836EFFD73E :10001000FFD7FFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :020000040030CA :0E000000FFFAFFFEFFFFFBFFFFFFFFFFFFFF0A :00000001FF

voltar para o topo da pgina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2008. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

A linguagem C
1.0 Introduo a Linguagem C 1.1 Formas e representao numricas e de caracteres 1.2 mikroC: Case Insensitive 1.3 Manipulao de registradores no mikroC

Introduo a Linguagem C
At este pondo do curso, estudamos vrios tpicos fundamentais para o desenvolvimento do nosso curso, conhecemos a histria dos microcontroladores, estudamos os recursos e estruturas de hardware do PIC18F452 e aprendermos a compilar e editar um programa no compilador mikroC. Chegou o momento de aprendermos a programar em linguagem C os microcontroladores PIC. Antes de estudarmos os conceitos da linguagem, devemos saber que a linguagem C trata-se de uma linguagem complexa e de difcil assimilao para programadores inexperientes. Procuraremos abordar o contedo e estrutura da linguagem baseando-se em exemplos de programas, pois dessa forma, ficar muito mais claro para o aluno entender a linguagem. Acompanhe o exemplo abaixo:
//Primeiro Programa /* Programa Pisca -Pisca (1 segundo) Este programa tem por objetivo ascender e apagar um led conectado no pino RB0 do PIC em intervalos de 1 segundo aproximadamente; Curso Online: Microcontroladores PIC - Programao em C */

void main() { trisb = 0; portb = 0;

//define portb como sada //coloca nvel lgico 0 em todos os pinos do portb

while(1) { portb.f0 = 1; //seta pino RB0 Delay_ms(1000); //aguarda 1000 ms (milisegundos) portb.f0 = 0; //resseta pino RB0 Delay_ms(1000); // aguarda 1 segundo } }

Vejamos o significado de cada linha de programa: A primeira linha de programa:


//Primeiro Programa

chamada de comentrio. Os comentrios so importantes para documentar o programa. Podemos adicionar comentrios em nosso programa de duas maneiras: Atravs de comentrios de linhas simples: quando queremos comentar apenas uma linha de programa, iniciamos os comentrios com os caracaters " // " (igual a linha do programa anterior). Esses tipo de comentrio no faz parte da padronizao ANSI original, mas atualmente encontrado em vrios compiladores. Atravs de comentrios de mltiplas linhas: podemos comentar linhas ou blocos de cdigo de programa utilizando a seqncia de caracteres "/* " para iniciar o comentrio e a seqncia "*/" para terminar o comentrio.
/* Programa Pisca -Pisca Este programa tem por objetivo ascender e apagar um led conectado no pino RB0 do PIC em intervalos de 1 segundo aproximadamente; Curso Online: Microcontroladores PIC - Programao em C */

Na prxima linha temos:


void main()

A declarao main()especifica o nome da funo. A funo main(), na linguagem C,


sempre a primeira a ser executada e deve ser a nica no programa. O programa termina quando for encerrada a execuo da funo main(). Uma funo, em C, nada mais do que um conjunto de instrues que pode ser executada a partir de qualquer ponto do programa. Utilizamos o sinal de abertura de chave "{" para iniciar uma funo e o sinal de fechamento de chave "}" para finalizar a funo. Todas as instrues devem estar dentro das chaves que iniciam e terminam a funo e so executadas na ordem em que as escrevemos No caso deste programa exemplo, ela no recebe nenhum parmetro e tambm no retorna parmetro nenhum. Isto fica explcito atravs da palavra-chave void escrita na frente do programa.

As funes e as suas caractersticas sero apresentadas em detalhes mais adiante em nosso curso; Na prxima linha de programa encontramos: trisb = 0; portb = 0; //define portb como sada //coloca nvel lgico 0 em todos os pinos do portb

Como estudamos nas unidades anteriores, o comando trisb define o sentido de acionamento do PORTB do PIC. Neste exemplo, trisb = 0, logo o PORTB foi programado como sada. O comando portb = 0 coloca nivl lgico 0 em RB0 a RB7. As instrues C so sempre encerradas por um ponto-e-vrgula ( ; ). O ponto-e-vrgula parte da instruo e no um simples separador e devemos ao final de cada instruo colocar o acrscimo de um ponto-vrgula ;.

Na prxima linha temos:


while(1)

Este um comando de controle utilizado na repetio de um determinado bloco de instruo. O bloco de instruo ser executado repetidamente enquanto o condio for verdadeira, ou seja, for diferente de zero. No nosso exemplo, o valor 1 utilizado no comando while garante que a condio seja sempre verdadeira. Estudaremos mais sobre o comando while mais adiante no curso; Os comandos a seguir pertencem ao bloco da instruo while; { portb.f0 = 1; //seta pino RB0 Delay_ms(1000); //aguarda 1000 ms (milisegundos) portb.f0 = 0; //resseta pino RB0 Delay_ms(1000); // aguarda 1 segundo } Como no temos nenhum comando que interrompa o lao while, os blocos de comandos apresentados sero executados indefinitamente at que o processador seja desligado ou reiniciado. A operao portb.f0 = 1 faz com que o pino RB0 do PORTB seja colocado em nivel lgico 1; Para se referir a um pino das portas do PIC, PORTA, PORTB, PORTC, PORTD, PORTE, devemos apresentar o nome do porta, mais o ponto ".", mais a inicial "f" e o nmero do pino correspondente. Exemplo: portb.f0 = 0; // estamos nos referindo ao pino RB0 do portb portd.f5 = 1; // estamos nos referindo ao pino RD5 do portd porte.f1 = 1; // estamos nos referindo ao pino RE1 do porte

A linha de programa seguinte, Delay_ms(1000), uma funo interna do compilador mikroC utilizada para gerar atrasos em escala de milissegundos. No nosso exemplo, o comando ir gerar atraso de 1000 milessegundos, ou seja, 1 segundo.

A operao portb.f0 = 0 faz com que o pino RB0 do PORTB seja colocado em nvel lgico 0;

Desta forma, ao programarmos o PIC com o programa exemplo, o pino RB0 ficar mudando de estado lgico 1 e 0 a cada 1 segundo,

Coloque em prtica este pequeno projeto. Copie e compile este programa exemplo no compilador mikroC, isso lhe ajudar nos seus estudos.

Vamos estudar mais um programa: Acomanhe:


//Segundo Programa /* Programa Pisca -Pisca (100 milisegundos) Este programa tem por objetivo ascender e apagar um led conectado no pino RB0 do PIC em intervalos de 1 segundo aproximadamente; Curso Online: Microcontroladores PIC - Programao em C */ void main() { trisb = 0; portb = 0; trisd = 0; portd = 0;

//define portb como saida //coloca nvel lgico 0 em todos os pinos do portb //define portb como saida //coloca nvel lgico 0 em todos os pinos do portb

while(1) { portb = 255; portd = 255; Delay_ms(100); portb = 0; portd = 0; Delay_ms(100); } }

//seta todos os pinos do portb //seta todos os pinos do portd //aguarda 1000 ms (milisegundos) //resseta todos os pinos do portb //resseta todos os pinos do portd //aguarda 1000 ms (milisegundos)

O programa acima tem por objetivo piscar infinitamente o portb e portd do PIC em intervalos de 100 milissegundos. Suas caracteristicas so parecidas com a do programa anterior, sua nica diferena esta no tratamento das portas;
portb = 255; portd = 255; //seta todos os pinos do portb //seta todos os pinos do portd

voltar para o topo da pgina

Formas e representao numricas e de caracteres


No compilador mikroC podemos manipular dados do tipo: decimal, binrio, hexadecimais e octal. Podemos representar um valor numrico de diversas formas. Para exemplificar, vamos supor o que desejamos carregar o valor 187 no registrador PORTB no PIC utilizando o mikroC, acompanhe: Representao decimal: Para representarmos um nmero em decimal basta colocar seu valor sem nenhuma abreviatura, conforme o linha abaixo:
portb = 187; //representao decimal

ATENO: NUNCA DEVEMOS REPRESENTAR UM NMERO DECIMAL INICIANDO COM 0 (ZERO), POIS O MIKROC INTERPRETAR O NMERO COMO OCTAL. EX: portb = 25 (25 representado em decimal) diferente de portb = 025 (025 representado em octal)

Representao Hexadecimal: Para representar um nmero em hexadecimal devemos colocar o prefixo 0x (ou 0X) antes do nmero hexadecimal. (0 a F)
portb = 0xBB; ou portb = 0Xbb; //representao hexadecimal do numero 187 decimal //representao hexadecimal do numero 187 decimal

Representao binria: Para representarmos um nmero em binrio devemos colocar o prefixo 0b (ou 0B) antes do nmero em binrio.
portb = 0b10111011; ou portb = 0B10111011; //representao binria do nmero 187 decimal //representao binria do nmero 187 decimal

A representao binria de um nmero ocorre da seguinte forma: 0B 1 0 1 1 1 0 1 1

- - RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 - - MSB LSB

Observe que na representao binria de um nmero, o bit mais significativo fica ao lado do prefixo 0b. No confunda de forma alguma a construo e as representaes de um nmero binrio, caso contrrio seu programa no funcionar corretamente. Representao octal: O sistema octal no um sistema muito difundido nos dias atuais. Apesar do compilador mikroC suportar esse tipo de representao numrica, somente devemos utiliz-la quando for realmente necessrio. Para representar um nmero octal necessrio colocar o prefixo 0 (zero) antes do valor numrico octal.
portd = 0273; //representao octal do nmero 187 em decimal

Ateno: No confundir nmeros decimais com octais. Nmeros Octais so precedidos com 0, ex: 0140 um nmero octal. Nmeros decimais no tem prefixo: ex: 140 um nmero decimal

Exerccios 01: Gostaramos de enviar aos pinos do PORTB os seguintes estados; RB0 = 0 RB1 = 1 BR2 = 1 RB3 = 0 RB4 = 0 RB5 = 1 RB6 = 0 RB7 = 0 Qual o valor numrico que devemos colocar na instruo abaixo para representar os estados dos pinos do PORTB. Obedea as representaes numricas solicitadas: Representao decimal:
portb = X; ?

Representao binria:
portb = X; ?

Representao hexadecimal:
portb = X; ?

Representao octal:
portb = X; ?

obs: A respostas desse exerccio esto disponvel no final dessa matria!

voltar para o topo da pgina

mikroC : Case Insensitive


Diferente do pradro ANSI C, No mikroC podemos utilizar caracteres maisculos e minsculos no programa (case insensitive). Acompanhe: contador, Contador e COnTadOR so interpretados como sendo a mesma palavra. (esse recurso uma particularidade do mikroC e no pertence ao padro ANSI C Standart).

voltar para o topo da pgina

Manipulao de registradores bit no mikroC


Podemos manipular os bits de registradores do PIC de diversas formas no compilador mikroC Vejamos: Exemplo de Manipulao de bits de registradores: Podemos manupular os bits dos registradores do PIC da seguinte maneira: PORTA.F5 = 0; // -->> faz referncia ao pino RA5 do PIC. PORTD.F7 = 1; //-->> faz referncia ao pino RD7 do PIC. TRISB.RB0 = 1; // -->> faz referencia ao bit 0 do registrador TRISB T0CON.PSA = 0; //-->> faz referncia ao bit 3

Ou acess-los dessa maneira: obs: no so todos os registradores que permitem acesso direto dos seus bits: RB0 = 0; --->> faz referncia ao pino 0 do PORTB RA2 = 1; -->> faz referncia ao pino 0 do PORTA

voltar para o topo da pgina

Respostas dos exerccios 01:


Representao decimal:
portb = 38;

Representao binria:
portb = 0b00100110;

Representao hexadecimal:
portb = 0x26;

Representao octal:
portb = 046;

voltar para o topo da pgina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2007. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Estrutura da Linguagem C
1.0 Estrutura de um programa em C 1.1 Prottipos de Funes

Estrutura de um programa em C
Todo programa escrito em C consiste em uma ou mais funes, tendo como poarticularidade deste fato a possibilidade de construir programas modulares e estruturados. O programa principal escrito em C uma funo. O C uma linguagem estremamente estruturada e exige do programador domnio adequado de tal conceito. Veja a seguir, o menor programa possvel de ser escrito em C: main( ) { } em que: main() - a primeira e principal funo a ser executada { } - inicia ou abre o corpo da funo - finaliza ou fecha o corpo da funo

A funo main() a principal instruo a ser considerada em um programa escrito na linguagem C e deve estar presente em algum lugar do programa, pois ela que marca o ponto de inicializao do processo de execuo do programa. A seguir veremos um modelo de escrita de um programa em C, com todas as definies e comentrios. Acompanhe: [ blocos de comentrios de grande importncia na documentao do programa] [<definies de pre-processamento - cabealhos>] [<declarao das variveis globais>]

[<tipo>] nome_da_funcao([<parmetros>]) [<declarao de parmentros>] { /* Este trecho reservado para o corpo da funo_nome, com a declarao de suas variveis locais, seus comandos e funes de trabalho. Esta funo pode ser chamada de sub-rotina do programa. */ [return ou return() ou return(valor)] }

void main([<parmetros>])

{
/* Este trecho reservado para o corpo da funo, com a declarao de suas variveis locais, seus comandos e funes de trabalho. Aqui esto os primeiros comandos que sero executados no programa. */ }

Toda a informao situada entre colchetes "[" e "]" indica informaes que podem ou no estar presentes em um programa. Vamos comentar cada bloco de programa: O primeiro bloco: Os comentrios gerais [ blocos de comentrios de grande importncia na documentao do programa] O programador poder inserir ou no o comentrios em seu programa. Por conveno, importante colocarmos sempre os cabealhos nos programas, pois a apresentao do programa.

O segundo bloco: O cabealho [<definies de pre-processamento - cabealhos>] [<declarao das variveis globais>]

Neste trecho do programas podemos declarar todo o cabealho do nosso programa assim como definir variveis globais que podero ser utilizadas em todas as funes do nosso programa. Exemplo de cabealho: #include "minhas_funcoes.h" // incluimos em nosso programa as bibliotecas de funes que esto no arquivo minhas_funcoes.h. int a ; //definimos a varivel a como inteiro e como sendo global int b; //definimos a varivel b como inteiro e como sendo global O terceiro bloco: As funes de subrotinas [<tipo>] nome_da_funcao([<parmetros>]) [<declarao de parmentros>] { /* Este trecho reservado para o corpo da nome_da_funcao, com a declarao de suas variveis locais, seus comandos e funes de trabalho. Esta funo pode ser chamada de sub-rotina do programa. */ [return ou return() ou return(valor)] } Este ltimo bloco trata-se de uma funo que carrega o nome nome_da_funcao. Seu tipo pode ou no ser explicitado. Caso no seja, qualquer funo ser do tipo int por default. Esta funo no faz parte da funo main() e dever ser chamada em algum momento pelas funo main() ou por outra funo para seja executados seus comandos. Podemos no momento da chamada da funo enviar parmetros (estudaremos mais sobre as funes a seguir). No final da funo, encontramos o comando return, cujo objetivo retornar a funo que a chamou um valor de retorno da funo. No obrigatrio o uso do comando return, caso no precisemos retornar nenhum valor na funo. Exemplo de funo de subrotina: void funcao(void) { portb = ~portb; return; }

O quarto bloco: A funo main() void main([<parmetros>])

{
/* Este trecho reservado para o corpo da funo, com a declarao de suas variveis locais, seus comandos e funes de trabalho. Aqui esto os primeiros comandos que sero executados no programa. */ }

A funo main() ser a primeira a ser executada pelo processador. Junto a funo main(), temos o modificador de tipo void que tem a funo de declarar que a funo main() no deve retornar nenhum valor. A manipulao de programas em linguagem C para microcontroladores diferente de trabalharmos com programas para PC's, pois nos computadores PC's existem o sistema operacional que receber o retorno da funo main(). Nos microcontroladores, como no possuimos um sistema operacional rodando em paralelo com o programa, no podemos retornar nenhum valor na funo main(). Para este caso, devemos sempre iniciar a funo main() com o modificador de tipo nulo void. Exemplo de funo main(): void main() { PORTB = 0; TRISB = 0; PORTB = ~PORTB; Delay_ms(1000); }

INFORMAES IMPORTANTISSIMAS: AS FUNES DE SUBROTINAS DEVEM SER COLOCADAS ANTES DA FUNO MAIN(), CASO CONTRRIO OCORRER ERRO DE COMPILAO DO PROGRAMA. ISSO OCORRE PORQUE no podemos usar uma funo sem declar-la previamente. PARA COLOCARMOS FUNES ABAIXO DA FUNO MAIN() FAZ NECESSRIO UTILIZAR OS PROTTIPOS DE FUNES, CUJO OBJETIVO MOSTRAR AO COMPILADOR O TIPO, NOME E PARMETROS DA FUNO DAS SUBROTINAS.

Exerccio 01:
Vamos anlisar um exemplo de programa em linguagem C disponvel no prprio compilador mikroC como exemplo. Em princpio, no quero que voc entenda o funcionamento do programa, mas quero que voc identifique os principais blocos de funes desse programa. Vejamos: /* * Project name: PWM_Test_01 (PWM library Demonstration) * Copyright: (c) MikroElektronika, 2005. * Test configuration: MCU: P18F8520 Dev.Board: BIGPIC3 Oscillator: HS, 10.0 MHz Ext. Modules: SW: mikroC v5.00 * NOTES: None. */ unsigned short j, oj; void InitMain() { PORTB = 0; TRISB = 0; ADCON1 |= 0x0F;

PORTA = 255; TRISA = 255; PORTC = 0x00; TRISC = 0; Pwm_Init(5000); }//~ void main() { initMain(); j = 127; oj = 0; Pwm_Start(); while (1) { if (Button(&PORTA, 0,1,1)) j++ ; if (Button(&PORTA, 1,1,1)) j-- ; if (oj != j) { Pwm_Change_Duty(j); oj = j; PORTB = oj; } Delay_ms(200); } }//~!

Resposta:

Primeiro bloco: Os comentrios


/* * Project name: PWM_Test_01 (PWM library Demonstration) * Copyright: (c) MikroElektronika, 2005. * Test configuration: MCU: P18F8520 Dev.Board: BIGPIC3 Oscillator: HS, 10.0 MHz Ext. Modules: SW: mikroC v5.00 * NOTES: None. */ Este bloco do programa so comentrios e so resposvel pela parte "documental do programa". No momento da compilao, esses textos sero descartados pelo compilador.

Segundo Bloco: O cabealho


unsigned short j, oj;

Neste trecho do programas definido o cabealho do programa, e nele foi declarado as varivel globais do programa.

Terceiro Bloco: as subrotinas


void InitMain() { PORTB = 0; TRISB = 0; ADCON1 |= 0x0F; PORTA = 255; TRISA = 255; PORTC = 0x00; TRISC = 0; Pwm_Init(5000); }//~ Esta funo uma subrotina do programa, e foi chamada pelo programador de InitMain();

Quarto Bloco: as funo main()


void main() { initMain(); j = 127; oj = 0; Pwm_Start(); while (1) { if (Button(&PORTA, 0,1,1)) j++ ; if (Button(&PORTA, 1,1,1)) j-- ; if (oj != j) { Pwm_Change_Duty(j); oj = j; PORTB = oj; } Delay_ms(200); } }//~! Apesar do funo main() ser a ltima na ordem de escrita do programa, ela ser a primeira funo a ser executada pelo processador.

Dicas:

Porque usar funes de subrotinas ?

Para permitir o reaproveitamento de cdigo j construdo(por voc ou por outros programadores); Para evitar que um trecho de cdigo que seja repetido vrias vezes dentro de um mesmo programa; Para permitir a alterao de um trecho de cdigo de uma forma mais rpida. Com o uso de uma funo preciso alterar apenas dentro da funo que se deseja; Para que os blocos do programa no fiquem grandes demais e, por conseqncia, mais difceis de entender; Para facilitar a leitura do programa-fonte de uma forma mais fcil; Para separar o programa em partes(blocos) que possam ser logicamente compreendidos de forma isolada. voltar para o topo da pgina

Prottipos de Funes
No podemos usar uma funo sem declar-la previamente. Trata-se duma instruo geralmente colocada no incio do programa ou do arquivo, obrigatoriamente antecedendo a definio e a chamada da funo. O prottipo informa ao compilador o tipo que a funo retorna, o nome da funo, bem como os parmetros que ela recebe. Eis um exemplo:

void minha_rotina (); //prottipo de funo, esta linha de programa deve ser colocada no topo do programa , junto com as declaraes; //.... void main() { // aqui esta meu programa principal }

//***************** funo de subrotina ******************** void minha_rotina() { //aqui esta os comandos da sua subrotina }

Confome podemos ver no programa acima, a funo de subrotina minha_rotina() ficou em depois da funo main(), nesse caso, necessariamente, devemos colocar o prottipo de funo (linha de programa com o cabealho da funo de subrotina) no topo do programa, caso contrrio teremos erro de compilao pois o no podemos utilizar nenhuma funo antes de declar-la. No caso de colocarmos as funes de subrotinas antes da funo main() no programa, no precisamos declarar os prottipos de funes no programa.

voltar para o topo da pgina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2007. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Variveis e Tipos de Dados


1.0 Os indetificadores 1.1 Tipos de dados 1.1 Modificadores de Tipo 1.1 Declarao de variveis 1.1 Variveis globais: 1.1 Variveis locais:

Os indetificadores
A linguagem C define identificadores como sendo nomes usados para se fazer referncia a entidades do programa (variveis, funes, rtulos, etc.) definidas pelo programador. Em C, um identificador composto de um ou mais caracteres, sendo que, para identificadores internos, os 31 primeiros so significativos. O primeiro caractere deve ser uma letra ou um sublinha (_) e os caracteres subseqentes devem ser letras, nmeros ou sublinhas. Eis aqui alguns exemplos de identificadores corretos e incorretos: Corretos Incorretos descrio Um identificador deve sempre comear com cont 1cont uma letra do alfabeto, nunca por um nmero. Um identificador no pode conter valor23 al acentos (, ^, ~, ) Um identificador no pode conter totalGeral valor-total simbolos (-) Isto quer dizer que se duas variveis tm em comum os 31 primeiros caracteres e diferem apenas a partir do trigsimo segundo, o compilador C no ser capaz de distingui-Ias. Por exemplo, esses dois identificadores so iguais:

isto_e_um_exemplo_de_um_nome_longo isto_e_um_exemplo_de_um_nome_longo_tambem

voltar para o topo da pgina

Tipos de dados
Existem cinco tipos primitivos de dados em C suportados no mikroC: caractere, inteiro, ponto flutuante (float e double) e sem valor. As palavras reservadas usadas para declarar variveis desse tipo so char, int, float/double e void, respectivamente. A tabela abaixo representa o valor e a escala de cada tipo de dado em C.

TIPO
char int float void

TAMANHO INTERVALO EM BITS


8 8 32 0 0 a 255 0 a 255 3.4E-38 a 3.4E+38 nenhum valor

O tipo char utilizado para representao de caracteres ASCII de 8 bits. Cada varivel do tipo char pode representar um caractere ASCII. O tipo int utilizado para representar nmeros inteiros de 8 bits (0 a 255). Estes tipos de dados so amplamente usados em programao C. O tipo char e int representam nmeros inteiros e no podem ser utilizados para representar nmeros frcionrios. Para isso, deve ser utilizado o tipo float, tambm chamado de ponto flutuante. O tipo float deve ser evitado ao mximo e restrito apenas s operaes que realmente necessitarem de um tipo de dados como este. voltar para o topo da pgina

Modificadores de Tipo
Podemos utilizar comandos especiais do C para obter outros tipos de dados. Esses comandos especiais so chamados de modificadores de tipo e so os seguintes: signed, unsigned, short, e long. O modificador de tipo signed pode ser utilizado para modificar um tipo base de dados para que ele possa representar um nmero positivo ou negativo; O modificador short utilizado para definir uma varivel com tamanho menor que o tipo modificado, ou seja, uma verso reduzida do tipo especificado. O modificador long utilizado para ampliar a magnitude de representao do tipo especificado.

TIPO TAMANHO
(unsigned ) 8 -bit

RANGER
0 255

char signed char 8 -bit (signed) 8 - bit short (int) unsigned 8 - bit short (int) (signed) int 16 - bit unsigned 16 - bit int (signed) 32 - bit long int unsigned 32 - bit long int float 32 - bit

-128 +127 -128 +127 0 255 -32768 32767 0 65535 -2147483648 2147483647 0 4294967295

+/- 1.17549435082E-38 +/6.80564774407E38 +/1.17549435082Edouble 32 - bit 38 +/6.80564774407E38 +/1.17549435082Elong double 32 - bit 38 +/6.80564774407E38 void nulo sem valor Obs: tipos de float, double e long double so considerados do mesmo tipo no mikroC. voltar para o topo da pgina

Declarao de variveis
Definir uma varivel cri-la na memria (aloc-la), dar a ela um nome e especificar o tipo de dado que nela vai armazenar. Varivel, do ponto de vista da rea de programao, uma regio de memria previamente identicada que tem por finalidade armazenar os dados ou informaes de um programa por um determinado espao de tempo. Uma varivel llimita-se a armazenar apenas um valor por vez. Sintaxe para criao de uma varivel em C; <tipo> nome_da_variavel; O tipo deve ser um tipo de dado vlido em C tais como: char, int, float, com ou sem seus modificadores, unsigned, signed, short e long. E nome_da_variavel o nome da varivel adotada pelo programador. Em C, podemos declarar vrias variveis do mesmo tipo em um nica linha de programa, bastando apenas separ-las por vrgulas, acompanhe:

int soma ; unsigned char i,j,k ; float salrio; unsigned int idade; short int y; long caminho, estado; unsigned valor;

Outro aspecto importante da declarao das variveis o local onde so declaradas. Basicamente, uma varivel pode ser declarada em dois pontos distintos do programa: voltar para o topo da pgina

Variveis globais:
No corpo principal do programa: variveis declaradas no corpo principal do programa so variveis globais que podem se acessadas por qualquer funo do programa. Essas variveis esto fora de qualquer funo do programa, inclusive a funo main(). Exemplo:
int contador; char a; void main() { //define a varivel global "contador" como inteiro //define a varivel global "a" como char //funo principal do programa

contador = contador + 10 }

Repare que as variveis "contador" e "a" forma definidas fora de qualquer funo do programa, essas variveis sero tratadas como variveis globais e seus dados podero ser manipulados por qualquer funo do programa; Vamos apresentar mais um exemplo de programa utilizando as variveis globais: int contador; como inteiro char a; char //define a varivel global "contador" //define a varivel global "a" como

void subrotina () //funo de sub-rotina qualquer do programa { contador = contador - 20;

a = 100; }

void main() //funo principal do programa { contador = contador + 10; a = 55; } Repare no programa exemplo acima que as variveis "contador" e "a" esto sendo manipuladas no corpo da funo main() e na funo subrotina(). Este tipo de manipulao de variveis somente possvel se declararmos como sendo do tipo GLOBAIS, ou seja, necessriamente devemos defini-las no corpo do programa (fora de qualquer funo do programa, inslusive a funo main()). voltar para o topo da pgina

Variveis locais:
Ao contrrio das variveis globais, uma varivel local somente existe dentro da funo em que foi declarada. Isto significa que uma varivel local somente existe enquanto a funo esta sendo executada. No momento que ocorre o retorno da funo, as variveis locais so descartadas; Acompanhe o exemplo abaixo:
void main() //funo principal do programa { int contador; //define a varivel local "contador" como int contador = contador + 10 }

Repare que a varivel "contador" foi declarada (criada) dentro da funo main(), as varivel locais somente ter validade dentro da funo que a declarou, neste caso, "contador" somente poder ser manipulada no programa dentro da funo main().

Acompanhe mais um exemplo de varivel local:

void subrotina () programa {

//funo de sub-rotia qualquer do

int tempo; tempo = tempo * 2; } void main() //funo principal do programa { int tempo; tempo = tempo / 2; } Repare no programa exemplo acima que temos duas funes, a funo main() e a funo subrotina(). Dentro de cada uma dessas funes foram criada uma varivel chamada "tempo" do tipo int, essas variveis so locais e somente tem validade dentro da funo que a declarou, ou seja, a varivel "tempo" da funo subrotina() NO tem nenhuma ligao com a varivel "tempo" da funo main(), pois so variveis locais; Se por ventura cometermos o seguinte erro abaixo, acompanhe: void subrotina () programa { tempo = tempo * 2; } void main() { int tempo; } //funo de sub-rotia qualquer do

//funo principal do programa

Repare que a varivel "tempo" foi declarada unicamente dentro da funo main() e que seus dados esto sendo manipuladas por outra funo chamada subrotina(). Ao compilarmos este programa, certamente o compilador apresentar um erro de compilao nos informando que a varivel "tempo" no foi definida. Esse um erro comum que muitos programadores inexperientes cometem na linguagem C, pois esquecem que uma varivel local somente tem validade dentro da funo que a declarou. Podemos declarar variveis como parmetros formais de uma funo, que so tambm tratadas como variveis locais. Iremos estudar esse tipo de varivel quando estivermos falando de funes em nosso curso; voltar para o topo da pgina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2007. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Exerccios Resolvidos
Programando os bits de configurao do PIC 1.0 Exerccio 1 1.1 Exerccio 2 1.2 Exerccio 3 Estudando a estrutura de um programa em C 1.3 Exerccio 4 1.4 Exerccio 5 1.5 Exerccio 6 1.6 Exerccio 7

Programando os bits de configurao do PIC


EXERCCIO 1:
Pergunta: Analise a figura abaixo e descreva como foi configurado os bits configurations (fusiveis) do PIC. Comente somente os bits que esto ativos no painel de controle:

Resposta: Devemos programar corretamente os bits de configuraes do PIC, caso contrrio nosso programa no funcionar corretamente ou no funcionar definitivamente. Podemos configurar esses bits de configurao no momento ou durante a criao do projeto no compilador mikroC. O gravador de PIC WinPic800 permite que alteramos os bits de configurao antes de gravarmos nosso programa no microcontrolador PIC. Podemos ver que: O bit HS esta selecionado no nosso painel (figura acima), isso comprova que nosso microcontrolador PIC ser acionado por oscilador exteno do tipo cristal ou ressonador (pois bit OSCSEN no esta habilitado). O bit BOREN esta acionado e programado para provocar reset no PIC quando a tenso cair abaixo de 2.0V (verifique o valor da tenso selecionado). O watchdog esta ativado (WDTEN ativo) com prescaler de 1:128, o que nos resulta tempo de 2304us para ocorrer o reset. Os restantes dos bits de configurao esto desativados. voltar para o topo da pagina

EXERCCIO 2:

Pergunta: Faa uma anlise apurada dos estados dos bits de configurao do PIC descrevendo as funes de cada bit que esteja ativado:

Resposta: O microcontrolador selecionado no menu o PIC18F442 (no winpic, o sistema de gravao o mesmo para o PIC18F442 e para o PIC18F4439); O oscilado utilizado o cristal ou ressonador. O bit HS w/PLL ON ativa o modo PLL do PIC, fazendo com que o valor do tempo de oscilao seja multiplicado por 4. O bit de configurao PWRTEN esta habilitado, fazendo com que
o PIC ative o temporizador de power-up, responsvel em fazer com que o chip permanea em reset por aproximadamente 72ms aps o chip ter sido ligado. O bit de configurao do BROWN-OUT esta ativo e programado para ser acionado para tenses abaixo de 4,5V, ou seja, quando a tenso de alimentao do PIC ser inferior a 4.5V o BROWN-OUT acionado e mantem o PIC resetado. Watchdog timer esta ativado graas ao bit WDTEN, e ajustado com prescaler de 1:8. O bit CCP2MX esta ativado, fazendo com que o modo CCP2 do PIC seja acionado atravs do pino RB3. O bit do modo LVP esta ativado. Este bit afeta o modo de gravao de baixa tenso do PIC. STVREN esta ativado, isto signigica que nosso PIC esta programado para resetar no caso da pilha "estourar", ou seja, ultrapassar sua capacidade mxima de 31 endereos. O modo de proteo contra leitura CPB, protege a regio de boot (memria de programa ) do PIC; O bit de configurao WRTD aciona o modo de proteo contra escrita na EEPROM do PIC.

Os restantes dos bits de configurao esto desativados. voltar para o topo da pagina

Estudando a estruturas de programas em C

EXERCCIO 3:
Pergunta: Separe e comente cada bloco do programa exemplo abaixo identificando as 4 principais divises: Comentrios, cabealho, subrotinas e programa principal: Obs: o exemplo de programa que apresentamos vem na instalao do mikroC. O objetivo desse exerccio fazer com que voc se acostume a estudar atravs dos mais varidos cdigos nas mais varidas linguas, pois nessa ara de microcontroladores as informaes so restritas e precisamos nos acostumar com os exemplos que encontramos, muita das vezes na internet.

/* * Project name: Seg2Cif_Static (Usage of 7Seg displays) * Copyright: (c) Mikroelektronika, 2005. * Description: This code demonstrates how to display a static number on two 7-segment displays (common cathode), in multiplex mode. Both displays are connected to PORTB (RB0..RB7, segment A to RB0, segment B to RB1, etc), with refresh via pins of porta (RA0,RA1). This code also demonstrates how to use interrupts. * Test configuration: MCU: PIC16F877A Dev.Board: EasyPIC3 Oscillator: HS, 08.0000 MHz Ext. Modules: SW: mikroC v6.0 * Notes: None. */ unsigned short v, por1, por2; void interrupt() { if (v==0) {

PORTB = por2; PORTA = 1; 2nd v = 1; } else { PORTB = por1; PORTA = 2; 1st v = 0; } TMR0 = 0; INTCON = 0x20; }//~ void main() { trisC = 0; OPTION_REG = 0x80; PORTA = 0; displays are off) TRISA = 0; PORTB = 0; off) TRISB = 0; TMR0 = 0; por1 = 0x7F; por2 = 0x4F; portC = 2; INTCON = 0xA0; // wait for interrupt }//~!

// //

send mask for digit 3 to portb turn on 1st 7 seg., turn off

// //

send mask for digit 8 to portb turn on 2nd 7 seg., turn off

// //

clear TMRO clear TMR0IF and set TMR0IE

// pull up resistors // clear porta (make sure both // designate porta pins as output // clear portb (make sure LEDs are // // // // designate portb pins as input clear TMRO mask for 8 (7 seg. display) mask for 3 (7 seg display)

// enable T0IE

Resposta:

Acompanhe as divises dos blocos passo a passo e vejam como um programa em C estruturado: Primeiro bloco: Os comentrios
/* * Project name: Seg2Cif_Static (Usage of 7Seg displays) * Copyright: (c) Mikroelektronika, 2005. * Description: This code demonstrates how to display a static number on two 7-segment displays (common cathode), in multiplex mode. Both displays are connected to PORTB (RB0..RB7, segment A to RB0, segment B to RB1, etc), with refresh via pins of porta (RA0,RA1). This code also demonstrates how to use interrupts. * Test configuration: MCU: PIC16F877A

Dev.Board: Oscillator: Ext. Modules: SW: * Notes: None. */

EasyPIC3 HS, 08.0000 MHz mikroC v6.0

Este bloco no obrigatrio, mas sempre importante colocarmos em nosso programa pois trata-se da apresentao do funcionamento e dados do projeto:

Segundo Bloco: O cabealho


unsigned short v, por1, por2; No cabealho apresentamos as variveis globais do programa, assim como as chamadas de incluso de bibliotecas defunes, definies do compilador e prottipos de funes.

Terceiro Bloco: As funes de Sub-rotinas


void interrupt() { if (v==0) { PORTB = por2; PORTA = 1; 2nd v = 1; } else { PORTB = por1; PORTA = 2; 1st v = 0; } TMR0 = 0; INTCON = 0x20; }//~

// //

send mask for digit 3 to portb turn on 1st 7 seg., turn off

// //

send mask for digit 8 to portb turn on 2nd 7 seg., turn off

// //

clear TMRO clear TMR0IF and set TMR0IE

Esta a nica funo de sub-rotina do nosso programa exemplo e chamada de interrupt(), A funo interrupt() do tipo void, que representa que esta funo no possui retorno.

Quarto Bloco: Funo Principal main().


void main() { trisC = 0; OPTION_REG PORTA = 0x80; = 0; // pull up resistors // clear porta (make sure both

displays are off) TRISA = 0; PORTB = 0; off) TRISB = 0; TMR0 = 0; por1 = 0x7F; por2 = 0x4F; portC = 2; INTCON = 0xA0; // wait for interrupt }//~!

// designate porta pins as output // clear portb (make sure LEDs are // // // // designate portb pins as input clear TMRO mask for 8 (7 seg. display) mask for 3 (7 seg display)

// enable T0IE

Esta a funo main() do programa , esta a primeira funo que ser executada pelo processador do PIC. voltar para o topo da pagina

EXERCCIO 4:
Pergunta:
Suponhamos que temos precisamos criar uma varivel no programa que assumir valores de 0 a 100 durante toda a execuo do programa, utilizaremos o compilador mikroC. Qual o tipo de varivel que devemos declarar em nosso programa para armazenar o valor apresentado? Obs: Procure definir o tipo de varivel mais adequado pois sabemos que se ttratando de microcontroladores nossos recursos de memria so limitados Resposta: Sabemos que no mikroC basicamente temos os tipos de dados: char, int, float, double e void. No mikroC os tipos float e double so interpretados como sendo do mesmo tipo, ou seja, ambos tem os mesmos tamanhos. O tipo de dados que se enquadra para o ranger de 0 a 100 so: unsigned char, short int, unsigned int e long int. Mas conforme o anunciado precisamos criar uma varivel mais adequada, pois assim otimizaremos o consumo de memria de dados em nosso microcontrolador; O tipo que mais adequado unsigned char. (0 a 255) ou o unsigned short int (0 a 255).

voltar para o topo da pagina

EXERCCIO 5:
Pergunta:
Qual a diferena entre um varivel unsigned e signed?

Resposta: As variveis signed podem representar nmeros com sinais e possuem magnitude de representao inferior s unsigned que no podem representar valores com sinais. voltar para o topo da pagina

EXERCCIO 6:
Pergunta: No programa seguinte, descubra quais so as variveis local e quais so as variveis globais: Defina a diferena entre variveis local e global:

//programa exemplo char contador; int limite;

void funcao(void) { int a; limite = a + contador; portb = limite; }

void funcao2(void) { signed char b; portd = b; }

void main() { int c; trisb = 0; portb = 0; trisd = 0;

portd = 0; funcao() ; funcao2(); }

Resposta: Varivel Local:


int a; signed char b; int c;

Varivel Global:
char contador; int limite; Diferena entre variveis local e global: As variveis local somente tem validade dentro da funo que a definiu, no podendo ser utilizada em nenhuma outra funo, inclusive a funo main(). As variveis global so definidas no corpo do programa (fora de qualquer funo) e pode ser utilizada por qualquer parte do programa e a qualquer momento;

voltar para o topo da pagina

EXERCCIO 7:
Pergunta:
Analise o trecho do programa abaixo e descreva as diferenas entre as variveis int a: void limite(void) { int a; portb = a; } void tempo(void) { int a; portd = a; } Resposta:

Dentro da funo limite e a funo tempo formam definida uma varivel chamada "a" do tipo int. Apesar de possuirem o mesmo nome, elas so tratadas como duas variveis distintas em si (possuem endereos diferentes na memria de dados), pois so variveis locais (definidas dentro de funes).

voltar para o topo da pagina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2007. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Os Operadores
1.0 Os operadores Aritmticos: 1.1 Adio e Subtrao 1.2 Multiplicao e Diviso 1.3 O operador % 1.4 O operador de Incremento ++ e decremento --: 1.5 Operadores Relacionais; 1.6 Operadores lgicos ou Booleanos 1.7 Os operadores Bit a Bit 1.8 O Operador AND (E) 1.9 O Operador OR (|) 2.0 O Operador XOR (^) 2.1 O Operador NOT (~) 2.2 O Operador de deslocamento << >>

Tipos de Operadores
A linguagem C faz uso de diversos operadores. Podemos classifica-los em algumas categoria principais: artmticos, relacionais, lgicos, lgicos bit a bit , outros. Os operadores Aritmticos: Os operadores aritmticos so utilizados para efetuar determinadas operaes matemticas entre dados e so classificados em duas categorias, sendo binrio ou unrio. Os operadores binrios atuam em operaes de exponenciao, diviso, adio e

subtrao. Os unrios atua na inverso de valores, atribuindo o sinal de positivo ou negativo. operador + * / % ++ -voltar para o topo da pagina ao adio subtrao ou menos unrio Multiplicao Diviso Resto da diviso inteira incremento Decremento

Adio e Subtrao Os operadores de adio e subtrao so muito simples de serem utilizados, acompanhe: c = a + b; d = d + b; c = c - a; a = d - a + c; voltar para o topo da pagina

Multiplicao e Diviso Os operadores de multiplicao e de diviso, em C, so de fcil assimilao; c = a * b; d = d * d; c = c / a; a = (d * a) / c; voltar para o topo da pagina

O operador % O operador % utilizado para retornar o resto de uma operao de diviso inteira. Vejamos um exemplo:

7 / 3 = 2, em uma diviso inteira, sendo o resto igual a 1. Assim, o valor de 7 / 3 = 2 e o valor de 7 % 3 = 1. voltar para o topo da pagina

O operador de Incremento ++ e decremento --: O operador de incremento e decrevemento so utilizados para somar 1 ou subtrair 1 de uma varivel. Exemplo: C = C + 1; No exemplo acima a varivel C foi incrementada em 1 unidade. Podemos ter o mesmo resultado da operao acima atravs do operador de incremento ++ que termos o mesmo resultado; C++; c ++; d--; (equivale a c = c + 1;) //incrementa em 1 unidade o valor da varivel C //incrementa em 1 unidade o valor da varivel D

Acompanhe o exemplo abaixo: variavel _a = variavel_b ++; Observe que o valor da varivel variavel _b atribuido a varivel variavel _a, e logo aps isso, o valor de variavel _b incrementado em 1 unidade: Isso tambm vlido para o comando de decremento --. variavel _a = variavel_b --; Observe que o valor da varivel variavel _b atribuido a varivel variavel _a, e logo aps isso, o valor de variavel _b decrementado em 1 unidade:

Devemos tomar alguns cuidados em C com relao aos operadores de incremento e decremento: vejam; variavel _a = variavel_b ++; diferente de variavel _a = ++ variavel_b;

Note que no primeira linha de comando, variavel_b incrementada em 1 depois que atribuiu seu valor a varivel variavel _a. Na segunda linha, o valor da variavel_b incrementada em 1 antes de atribuir seu valo a varivel variavel _a. Vejamos um exemplo: int a, b, c; a = 0; b = a ++; c = ++ a; Neste caso, aps a execuo dos trs comandos, o valor de "a" ser igual a 2, o valor da varivel "b" ser igual a 0 e o valor da varivel "c" ser igual a 2. voltar para o topo da pagina

Operadores Relacionais; Os operadores relacionais servem para comparar expresses. So muito utilizado para comparar condies de controle do fluxo de execuo de programas. operador > >= < <= == != Operao realizada maior que maior ou igual a menor que menor ou igual a igual a diferente de

Estes operadores sero muito utilizado para construir expresses condicionais, como veremos mais adiante em nosso curso. voltar para o topo da pagina

Operadores lgicos ou Booleanos Os operadores lgicos ou booleanos so de grande importncia para construes de testes condicionais. operador && || Operao realizada AND (E) OR (OU)

NOT (NO)

Com esses operadores podemos relacionar diversas condies diferentes em um mesmo teste lgico. if (c = 10 && b = 5) c = 5; // condio verdadeira de teste: se a varivel "c" for igual a 10 e a varivel b = 5 ento "c" assumir o valor 5. if (c>0 || a==0) b = a; // condio verdadeira de teste: se a varivel "c" for maior que 0 ou a for igual a 0 ento "b" igual a varivel "a". if (!a) b = c; // condio verdadeira de teste: se a varivel "a" for igual a 0, a varivel "b" assumir o valor da varivel "c". Note que estamos utilizando o operador de negao "!" NOT, por esse motivo a varivel "a" assumir o valor verdadeiro, j que possui valor 0. voltar para o topo da pagina

Os operadores Bit a Bit Os operadores Bit a Bit so utilizados para realizar operaes lgicas entre elementos ou variveis. operador & | ^ ~ >> << voltar para o topo da pagina Operao realizada AND (E) OR (OU) XOR (OU exclusiva) NOT (complemento de um) deslocamento direita deslocamento esquerda

O Operador AND (E) O operador lgico AND realiza operao separadamente para cada bit dos operandos. Utilizamos muito este o operando AND como "mscara" de um byte, para habilitar ou desabilitar somente os bits que desejamos. Veja um exemplo:

int a, b; a = 125; b = 28; a = a & b; A operao AND ocorrer da seguinte maneira:


a = 100 ----> 01100100 AND (&) b = 28 ----> 00011100 ___________________ Resultado= 00000100 //ou 4 decimal

voltar para o topo da pagina

O Operador OR (|) O operador OR muito similar ao operador AND, sua operao tambm realizada para cada bit do operando. Exemplo: int a, b; a = 125; b = 28; a = a | b; A operao OR ocorrer da seguinte maneira:
a = 100 ----> 01100100 OR (|) b = 28 ----> 00011100 ___________________ Resultado= 01111100 //ou 124 decimal

voltar para o topo da pagina

O Operador XOR (^) O operador XOR so muito utilizado em funes de comparao de valores, pois em uma operao lgica, o resultado somente ser verdadeiro (nvel lgico 1) se um e somente um deles for verdadeiro ( nvel 1). Exemplo: int a, b; a = 125; b = 28; a = a ^ b;

A operao OR ocorrer da seguinte maneira:


a = 100 ----> 01100100 XOR (^) b = 28 ----> 00011100 ___________________ Resultado= 01111000 //ou 120 decimal

voltar para o topo da pagina

O Operador NOT (~) O operador NOT inverte o estado de cada bit do operando em uma operao. Exemplo: int a, b, c; a = 1; b = 1; b = ~a c = ~b A operao OR ocorrer da seguinte maneira:
a = 0B00000001; NOT de "a" ----> b = 0b00000001; NOT de "b" ----> 0b11111110; 0b11111110;

voltar para o topo da pagina

O Operador de deslocamento << >> O operador >> desloca para a direita os bits de uma varivel um determinado nmero de vezes. exemplo: int a, b, c; a = 10; b = 10; b = a >> 1; c = b << 5; No exemplo acima, os valores dos bits da varivel "a" foram deslocados 2 vezes para a direita, enquanto os bits da varivel b foram deslocados 5 vezes para a esquerda. Teremos como resultado: varivel a; // ----> 00001010 - valor 10 em binrio >>

// ----> 00000101 - valor 5 em binrio Observe que o valor aps deslocamento passa a ser agora 5 em binrio. A descrio do operador (>>), deslocamento direita, anloga ao operador deslocamento esquerda (>>), com ressalva de que os bits sero deslocados esquerda. voltar para o topo da pagina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2008. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Estruturas de controles e laos de repetio


1.0 O comando IF (SE) 1.1 O comando Switch

Estruturas de Controle
As estruturas de controle so usadas nos programas em lugares em que necessitamos que a mquina faa repetidas operaes ou necessite de tomadas de deciso.

O comando IF (SE)
O IF (SE, em portugus) uma estrutura de tomada de deciso baseada no resultado lgico de um teste. Sua forma geral : if (condio) comando; ou if (condio) { blocos de comandos}; Em C, qualquer nmero diferente de zero tido como verdadeiro. O que significa que uma condio em C s falsa, quando os resultados dos operadores que aplicados for zero (0). Qualquer outro valor, mesmo negativo, considerado como verdadeiro ou no zero. No comando If, caso a condio seja verdadeira (diferente de zero), o comando, ou blocos de comandos sero executados, caso contrrio, quando a condio for falsa (0 zero) o comando ser ignorado.

Exemplo: void main() { char a = 10; char b = 0 ; if (a) b--; } A varivel "a" foi atribuida o valor 10, que diferente de zero (0). Consequentemente, a o comando if ser executado e a condio de decremento da varivel b ser executado; ( if (a) b--; ). tambm possvel executar outro comando ou bloco de comandos no caso da condio ser avaliada como falsa, para isso utilizamos os recursos do comando if - else. Acompanhe seu formato geral: if (expresso) comando 1 else comando 2

Exemplo: if (x > 5) z = 10; else z = 20; A linha de comando if (x > 5) tem por funo verificar se acondio x>5 verdadeira, caso seja verdadeira, a linha de programa z = 10 ser executada. Caso a condio do comando IF seja falsa, ou seja, se "x" for menor que 5, ento a linha de comando z = 20 ser executada. Todos os operadores do C podem ser incluidos no teste de uma condio, expresses vlidas da linguagem C podem ser avaliadas para a gerao de um resultado booleano na estrutura if. As expresses seguintes so vlidas e seus resultados dependero do valor de suas variveis. Exemplo: if (a > b) b = a; // se a expresso a > b for verdadeira, a varivel "b" assume o valor da "a" if (b < a) b = 10; // se a expresso a < b for verdadeira, a varivel "b" assume o valor 10 if (a != b) b = 55; // se a expresso a !=b (diferente) for verdadeira, a varivel "b" assume o valor 55 if ( (a + b) > (b + d) ) b++; // se a expresso (a + b) > (b + d) for verdadeira, a varivel "b" ser incrementada em uma unidade.

Observaes importantes:
O operador de atribuio de igualdade em C (=) diferente do operador relacional de igualdade (==). Para testar a condio de uma varivel qualquer, utilizamos o operador relacional de igualdade (==). Acompanhe: if (a == b) c = 10; diferente de if (a = b) c = 10;

A condio (a == b) faz uma comparao entre as duas variveis, caso a condio seja verdadeira, a varivel "C" assumir o valor 10; O comando If seguinte, possui uma expresso de atribuio de igualdade (a = b). O compilador ao compilar este comando, ir primeiramente atribuir a varivel "a" o valor contido em "b", e depois disso, verificar se acondio no zero, caso seja verdadeiro o resultado (diferente de zero), a varivel "c" assumir o valor 10;

No comando IF para adicionarmos blocos de programas, faz necessrio o uso dos simbolos abre- chaves ({) efecha-chaves (}). Exemplo: if (portb == portc) { //blocos de comandos a++; portb.f0 = 1; d = c + e; }

A estrutura if, else, if Podemos criar arranjos (nesting) de comandos atravs da estrutura if, else, if. Os arranjos so criados bastando colocar estruturas if aninhadas com outras estruturas if. Seu formato geral : if (condio1) declarao 1; else if (condio2) declarao 2; else if (condio3) declarao 3; else if (condio4) declarao 4; Exemplo: void main() { int contador = 10; int sinal = 5; if (contador > sinal) sinal++; else if (contador < sinal) sinal--; else if (contador == sinal) sinal = 0; }

Podemos tambm executar blocos de comandos utilizando os recursos das chaves ( { e } ). Exemplo:

void main() {

int contador = 10; int sinal = 5; if (contador > sinal) { sinal++; contador = 20;

//utilizao de blocos de comando na estrutura if-else-if

}
else if (contador < sinal)

{
sinal--;

contador = 15; }
else if (contador == sinal) sinal = 0; }

A estrutura if uma das mais utilizadas para tomada de decises lgicas. Iremos utiliz-la em vrios programas que desenvolveremos durante nosso curso.

voltar para o topo da pagina

O comando Switch
O comando switch uma forma mais clara e elegante de tomar deciso dentro de um programa em C. Diferente do comando if, a estrutura switch no aceita expresso para a tomada de deciso, mas s aceita constante. switch (varivel) { case constante1: declarao1A; declarao1B; declarao1N; break; case constante2: declarao2A; declarao2B; declarao2N;

break; default; declarao_default; }

O valor da varivel no comando switch comparada contra as constantes especificadas pela clusula case. Caso a varivel e a constante possuam valores iguais, os comandos seguinte a clusula case sero executados. Caso no tenha nennhuma constante com o mesmo valor da varivel, ento os comandos especificados pela clusula default sero executados. Acomanhe o exemplo: void main() { int contador = 10; int sinal = 5; switch(contador) { case 2: sinal++; break; case 1: sinal = 2; break; case 10: contador--; break; default: sinal = 0; } }

No exemplo de acima, a varivel contador ser comparada s constantes 2, 1 e 10. Como a varivel contador possui o valor 10, consequentemente o comando que ser executado no exemplo acima case 10: contador--; (decrementa a varivel contador). A clusula Break possui a funo de encerrar uma sequencia de comandos de uma clusula case. A clusula default o ltimo comando switch.

voltar para o topo da pagina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2008. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Estruturas de Repetio
1.0 O comando For 1.1 O comando While 1.2 O comando do - while 1.3 O comando break e continue

Introduo
Os laos de repetio servem para repetir uma ou mais vezes determinada instruo ou blocos de instrues. Existem basicamente trs tipos de estruturas de repetio na linguagem C: for While Do - While A estrutura for basicamente utilizada para laos finitos de contagem, normalemtne utilizando uma varivel de controle da contagem. A estrutura while basicamente utilizado para repetio de um determinado conjunto de instruo enquanto uma condio for verdadeira. O comando do - while similar estrutura while, diferenciando apenas o momento que analisada a condio. Vamos conhecer sobre cada estrutura de repetio, acompanhe:

voltar para o topo da pagina

O comando For

O lao for utilizado quando necessitamos de um ciclo de repeties controlado, pois em sua declarao podemos inicializar e incrementar ou decrementar a varivel de controle. Antes de serem executados os comandos do lao For-next, primeiramente avaliada a condio do teste. Caso seja verdadeira, so executados os comandos do lao. A cada ciclo que executado o fao for, a varivel de controle ser incrementada ou decrementada no valor programado no incremento. Veja a estrutura do comando For : For (inicializao ; condio ; incremento ) comando; ou For (inicializao ; condio ; incremento ) { ... comandoA1 comandoA2 ... }

em que: inicializao: expresso vlida utilizada normalemtne para inicializao da varivel de controle do lao for. condio: condio para que decide pela continuidade ou no do lao de repetio, enquanto esta condio foi verdadeira , o lao for permanecer em execuo. incremento: valor incrementado em a cada repetio do lao for. Exemplo: int contador; for (contador = 0 ; contador = 10 ; contador ++ ) portb = contador; Na estrutura anterior, a varivel contador inicialmente carregada com o valor 0 (zero), e os comandos do lao for so executados. Aps a execuo de todos os comandos presentes no lao for, a varivel contador incrementada no passo do valor do incremento, que no nosso exemplo 1 unidade, e novamente os comandos do lao for so executados. A estrutura de repetio for termina quando a varivel contador assume o valor 10. Exemplo: int v, d; for (v = 0 ; v = d ; v++) { Comando A Comando B }

Este exemplo funciona da seguinte maneira: 1) A varivel V recebe o valor 0. 2) O comando A e o comando B so executados. 3) A varivel V tem seu valor incrementado em 1 unidade. 4) Aps esta incrementao, o valor de V comparado com o valor D, e a seqncia retorna ao item 2, para nova repetio. 5) Caso contrrio (V ultrapassou D), o lao de repetio for finalizado.

O grande benifcio do lao for sua flexibilidade, pois aceita qualquer expresso vlida em C, mesmo que essas expresses no tenham relacionamento com o lao de repetio diretamente. Um exemplo simples de aplicao do lao for a criao de pequenos tempos de atrasos (delays).

int atraso;
for (atraso = 0 ; atraso < 1000 ; atraso++); O lao for acima faz com que o processamento fique incrementando constantemente a varivel atraso em 1 at que esta varivel seja igual ao valor 1000; Observe o fragmento de programa seguinte vlido dentro do loop for: for (n = 0 ; (n < 100) && portb.f0 ; n++) No exemplo acima a varivel n ser incrementada 100 vezes, desde que o pino RB0 permanea em estado lgico alto. Se o pino RB0 em algum momento do lao cair para nivel lgico baixo, o loop ser imediatamente encerrado.

Programa Exemplo: Aproveitando que estamos estudando as estruturas do lao de repetio for, vamos elaborar um program que pisca um led conectado ao pino RD0 do PIC utilizando os recursos do lao for. Acompanhe o esquema abaixo:

O programa seguinte vai contar at 100.000. Para acomodar um nmero dessa grandeza poderiamos ter utilizado uma varivel long, mas optamos pela varivel int para que voc entenda a construo de dois laos for encadeados. Para contar at 100,000 necessrio termos uma varivel que conte at 100 e outra at 1000 (100 * 1000 = 100.000).

//**********************************************************
// programa de perda de tempo utilizando o lao de repetio for. //********************************************************** void atraso(void) // rotina de perda de tempo { int contador1, contador2; for (contador1 = 0 ; contador1 < 100 ; contador1++) //lao de repetio for for (contador2 = 0; contador2 < 1000; contador2++) ; } void main() { trisd = 0; while(1) { atraso(); //chama rotina de perda de tempo portd = ~portd; // inverte os estados do portd do PIC } }

voltar para o topo da pagina

O comando While
Muitos dos programadores iniciantes no sabem do que iremos comentar agora.

Os microcontroladores no geral no possuem sistemas operacionais, os programas que desenvolvemos para os microcontroladores PIC devem rodar eternamente, ou possuirem mecanismos que paralise a operao da CPU em alguns momentos. Isso necessrio, pois, por no possuir sistem operacional, o programa do PIC no tem para onde sair, devendo ficar em operao, de preferncia eterna. Esses um dos motivos da funo principal main() dos programa para microcontroladores deverem ser do tipo void (valor nulo), pois no tem quem receba os valores de retorno da funo principal main().
O comando while o comando ideal criar loops infinitos no nosso programa.

A estrutura while verIfica inicialmente se a condio de teste verdadeira. Caso verdadeiro, todas os comandos dentro do lao while sero executados. Ao retornar para o incio do lao, verificado novamente se a condio de teste verdadeira, se for verdadeira, executa novamente os blocos de comandos; se for falsa, o lao while finalizado.
A companhe o exemplo abaixo: void main() { while (1) // condio a ser testada. Neste exemplo a condio sempre ser verdadeira (1); { declarao 1; declarao 2; declarao n; } }

Veja outro exemplo de programa: void main() { int a = 25; while (a = 5) { a++; portb = a; } }

Repare que no exemplo acima o valor a condio do lao while falsa, neste cado os comandos do lao no sero executados no programa at que a condio seja verdadeira, ou seja, at que a = 5.

voltar para o topo da pagina

O comando do - while
O comando do -while forma uma estrutura de repetio diferente dos comandos while e for estudado anteriormente. Sua diferena fundamental com relao as outras tradicionais laos de loop while e for esta no fato da avaliao da condio de teste ser no final do lao de repetio, contrrio dos outros laos que estudamos, que testam as condies no incio de cada ciclo. formato geral: do comando while (condio); ou do { comando 1; comando 2; } while (condio de teste);

Na estrutura do-while a condio de teste efetuada somente na parte final do loop. Isso faz com que as instrues contidas no interior do lao do - while sejam executadas ao menos uma vez. Caso a condio teste seja atendida, o lao de repetio finalizado, caso contrrio o bloco que est na estrutura seria novamente executado at que a condio teste seja atendida.
Exemplo: void main() { int a = 0; //declara a varivel a como inteiro com o valor 0 do { a++; //incrementa a varivel a em uma unidade portd = ~portd; //inverte os estados do portd } while(a > 100); // enquanto a < 100 permanece no loop do-while; }

voltar para o topo da pagina

O comando break e continue

Break
O comando break, na linguagem C, utilizado para interromper (quebrar) qualquer lao de repetio instantaneamente. No momento da execuo do loop, ao encontrar o comando break, o lao de repetio finalizado. Exemplo: void main() { int a = 0; do { a++; //incrementa a varivel A em uma unidade break; //interrompe a execuo do lao de repetio do-while portd = ~portd; //inverte os estados dos portd } while(a < 100); //enquanto a varivel a for menor que 100 a rotina do-while ser executada. }

O comando break valido para os laos do-while, while, for e case.

Continue
O comando continue reinicia novamente o teste da condio do lao de repetio. Toda a vez que no lao for encontrado o comando continue, os comandos seguintes no sero executados no lao. Exemplo:

void main() { int a = 0; do { a++; //incrementa a varivel A em uma unidade continue; //iretorna para o inicio do lao de repetio portd = ~portd; //inverte os estados dos portd } while(a < 100); //enquanto a varivel a for menor que 100 a rotina do-while ser executada. }

No exemplo de programa acima, os comandos abaixo de continue no sero executados, pois, toda a vez que for executado o comando continue, automaticamente o programa ser redirecionado para o cabealho do lao de repetio independente de qualquer estado de variveis. O comando continue valido para os laos do-while, while, for e case.

voltar para o topo da pagina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2008. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Manipulao de Teclados no mikroC

Introduo
um dispositivo indispensvel na maioria dos projetos, pois permite adicionar dados ao Mc. Acompanhe o esquema de um teclado:

O resistor utilizado chama-se pull-up, pois garante o nvel lgico 1 na entrada do Mc quando a chave estiver aberta. Quando pressionamos a tecla, alteramos o nvel lgico do

pino do Mc, ou seja, se por exemplo: o pino RB0, RB4 e RB7 estiver em nvel lgico 1, ao pressionarmos a tecla S1 o pino vai para nvel 0. ( apesar do portb do PIC possuir resistores de pull-up interno convencionamos a utilizao tambm de resistores externos) Quando tivermos no projeto teclas conectadas ao Mc, devemos tomar cuidado com o efeito mecnico Debouncing ao pressionarmos essas teclas. Debouncing: o efeito mecnico de rebatimento que a tecla sofre logo aps ser pressionada chamado "boucing", o qual provoca a leitura falsa da tecla, isto , o rebatimento faz com que a tecla seja lida mais de uma vez. A rotina de debouncing nada mais do que um pequeno intervalo de tempo entre o momento em que a tecla solta e a nova leitura do teclado. Esse intervalo permite que o fenmeno do rebatimento termine naturalmente, evitando assim a leitura falsa dela. Tempo aproximado de 25 ms. No mikroC podemos manipular teclados atravs de uma simples funo intitulada button. Acompanhe:

A Funo Button
A funo button tem como sintaxe: Button(&port, onde: &port = port onde esta ligado a tecla, pode ser PORTA, PORTB, PORTC, PORTD ou PORTE. pin = o pino onde esta ligado a tecla no PIC, pode ser de 0 a 7. timer = tempo de debounce em escala de milisegundos. estado_de_ativao = determina se a tecla vai ser ativada em nvel 0 ou em 1. Exemplo: button (&portb, 1, 10, 0) Apartir da configurao da funo button acima, descobrimos que a tecla que ser lida est conectada ao portb, pino RB0, delay de debounce de 10 milisegundos e acionada em nvel lgico 0 (zero). O retorno da funo button : valor 0 (tecla no pressionada) ou 1 (tecla pressionada). A funo button automaticamente configura os respectivo port como entrada. pin, time, estado_de_ativao);

Vejamos um exemplo de programa utilizando a funo button:

Primeiro Programa:
Conectado ao PIC temos uma tecla ( push- button) e um led. Repare que o led ligado com nivel lgico 1.

figura 01

Desejamos que toda vez que pressionarmos e soltermos a tecla S1, o led 1 dever alterar seu estado lgico, ou seja, se o led estiver acesso, ao pressionar e soltar a tecla S1, o led ser apagado, e ao pressionar a tecla novamente, o led ser acesso. Devemos programar delay para correo de debounce de 20 milisegundos. Para realizar essa tarefa, iremos fazer um programa bem simples utilizando a funo button, acomanhe:
void main() { trisd.f0 = 0; trisb.f0 = 1;

//configura pino RD0 como saida (leds) //configura pino RB0 (tecla) como entrada //se a tecla S1 estiver pressionada o

do { if (Button(&PORTB, 0, 20, 0))

comando if ser executado { delay_ms(200); //delay de 200 milisegundos portd.f0 = ~pord.f0; //inverte o estado do led } } while(1); }

No programa acima configuramos o pino RD0 como sada, pois trta-se de um led.
trisd.f0 = 0; //configura portd como saida (leds)

Criamos um lao de repetio atravs do comando do-while, cujo objetivo fazer com que o microcontrolador sempre esteja executando os comandos do lao.

A funo button foi programada da seguinte forma:

Acompanhe o trecho de programa seguinte:


if (Button(&PORTB, 0, 20, 0)) //se a tecla S1 estiver pressionada o comando if ser executado { delay_ms(200); //delay de 200 milisegundos portd.f0 = ~pord.f0; //inverte o estado do led }

Caso a tecla S1 seja pressionada, ao executar a funo button, teremos como retorno valor 1 (verdadeiro), e caso no venhamos a pressionar a tecla, a funo button nos retornar o valor 0. Apartir disso conclumos que a condio IF somente ser verdadeira caso o retorno da funo button for verdadeiro, que neste caso, ocorrer quando a tecla for pressionada. O programa apresentado acima possui um problema, pois caso deixamos a tecla pressionada, a condio IF sempre ser verdadeira e ento seus comandos sero executados, fazendo com que o led acenda e apague enquanto a tecla estiver pressionada.

Nosso segundo Programa :


Para corrigir o problema do programa anterior, vamos elaborar um novo programa que acenda e apague o led 1 da figura 01 para cada toque que dermos no teclado, ou seja, temos que pressior e soltar a tecla para executar a inverso do estado do led, se deixarmos a tecla pressionada, o estado lgico do led somente mudar um vez. O tempo de debouncing programado dever ser de 20 milisegundos. Programa:
/* Programa de leitura de tecla. Curso: Microcontroladores PIC programao em C Este programa tem por objetivo ler o estado de uma tecla para ligar/desligar um led. */ #define led1 portd.f0 nome led1. //a diretiva define atribui ao pino RD0 o

int estado_antigo; //define uma varivel de controle, cujo objetivo armazenar um estado. void main() { trisd.f0 = 0; //configura o pino RD0 como saida, pois iremos ligar/desligar o led. trisb.f0 = 1; //configura pino RB0 (tecla) como entrada do { if (Button(&PORTB, 0, 20, 0)) estado_antigo = 1; //se a tecla fo pressionada, a varivel estado_antigo = 1. if (estado_antigo == 1 && Button(&PORTB, 0, 20, 1)) { //verifica se a tecla foi solta led1 = ~led1; //inverte o estado do led 1. estado_antigo = 0; //inverte o valor da varivel estado_antigo para o prximo acionamento. } } while(1); }

Estudo detalhado do programa: Primeira parte: Comentrio Nesta primeira parte do programa, acrescentamos comentrio de apresentao do programa.
/* Programa de leitura de tecla. Curso: Microcontroladores PIC programao em C Este programa tem por objetivo ler o estado de uma tecla para ligar/desligar um led. */

Segunda parte: a diretiva define

At este ponto do curso no estudamos a utilizao da diretiva define. Esta diretiva tem por funo atribuir a uma constante ou registrador um novo nome. Veja o comando:
#define led1 portd.f0 nome led1. //a diretiva define atribui ao pino RD0 o

A diretiva #define atribui o nome led1 ao pino RD0 do PIC, partir deste ponto do programa, toda vez que utilizarmos o nome led1, o compilador sabe que se refere ao pino portd.f0 (RD0), e substituir na compilao este novo nome pelo endereo fisico de memria do pino RB0. Exemplo:
#define display1 portd.f0 nome led1. #define led2 portd.f1 nome led1. void main() { trisd = 0; ligar/desligar o led. display1 = 0; led2 = 1; } //a diretiva define atribui ao pino RD0 o //a diretiva define atribui ao pino RD0 o

//configura o pino RD0 como saida, pois iremos

Terceira parte: definio da varivel Definimos uma varivel do tipo int chamada estado_antigo. Esta varivel tem por funo fazer com que o led seja ligado/desligado somente com um unico toque na tecla, evitando que ao deixarmos a tecla pressionada os comandos if sejam sempre executados.
int estado_antigo; //define uma varivel de controle, cujo objetivo armazenar um estado.

quarta parte: a funo principal A funo principal main() a primeira a ser executada no programa em C. Repare que a funo main() acompanha um modificador de tipo void que tem como objetivo informar ao compilador que esta funo nula e no possui retorno de dados, pois, no tem pra quem retornar os dados pois trat-se da funo principal.
void main() {

Quinta parte: programando as portas como entrada ou saida


Como j estudamos anteriormente, o registrador TRIS do PIC, tem por funo informar a direo (leitura ou escrita) dos pinos da porta. Neste programa temos uma tecla conectado ao pino RB0, e para lermos essa tecla necessrio configurar este pino como entrada. A funo

button se encarrega de configurar esses registradores de sentido para ns. Conectado ao pino RD0, temos um led. Para acionar este led, faz necessrio enviar nvel lgico 1 a este pino, ento devemos configurar este pino como sida. trisd.f0 = 0; //configura o pino RD0 como saida, pois iremos ligar/desligar o led.

Sexta parte: Rotina de loop Lembre-se que devemos sempre manter o microcontrolador executando alguma rotina, mesmo que essa rotina seja um comando sem saida (while(1);). Devemos criar um programa que "amarre" o microcontrolador a sempre executar suas funes. No nosso programa exemplo utilizamos os recursos do lao de repetio do - while.
do { if (Button(&PORTB, 0, 20, 0)) estado_antigo = 1; //se a tecla fo pressionada, a varivel estado_antigo = 1. if (estado_antigo && Button(&PORTB, 0, 20, 1)) { //verifica se a tecla foi solta led1 = ~led1; //inverte o estado do led 1. estado_antigo = 0; //inverte o valor da varivel estado_antigo para o prximo acionamento. } } while(1); }

Repare que a condio de teste do lao de repetio do-while ser sempre verdadeira (while(1)).

Stima parte: Rotina de tomada de deciso e funo button Os comandos seguintes tem por objetivo ler o estado da tecla S1, conectada ao pino RB0 do PIC, e ligar ou apagar o led 1 conectado ao pino RD0. Para lermos a tecla, utilizamos a funo do mikroC: Button, em conjunto com o comando de tomada de deciso IF. Vejamos:
if (Button(&PORTB, 0, 20, 0)) estado_antigo = 1; pressionada, a varivel estado_antigo = 1. //se a tecla fo

Sabemos que o comando if somente ser executado se a condio de teste for verdadeira, neste caso, a varivel estado_antigo somente ser executada se a funo button for verdadeira, para isso necessrio que a tecla seja pressionada. Outro comando:

if (estado_antigo == 1 && Button(&PORTB, 0, 20, 1)) { se a tecla foi solta

//verifica

Nesta linha de programa efetuamos uma operao AND (E) entre a varivel estado_antigo e o retorno da funo Button, cujo objetivo verificar se a tecla foi solta ou no. Repare que nesta segunda funo Button o estado lgico de acionamento da tecla passa a ser 1 (Button(&PORTB, 0, 20, 1)), contrrio da funo Button da linha anterior, essa alterao indica que somente teremos a condio de retorno verdadeira (1), caso a tecla no esteja pressionada. Os comandos seguintes somente sero executados se a condio if for verdadeira, e para isso faz necessrio que a varivel estado_antigo seja igual a 1 e que o retorno da funo Button seja verdadeira, ou seja, a tecla tem que estar solta.

oitava parte: Inverso do estado do led e resset de varivel de estado


led1 = ~led1; //inverte o estado do led 1. estado_antigo = 0; //inverte o valor da varivel estado_antigo para o prximo acionamento.

Leituras de 4 teclas:
Nosso prximo passo elaborar um programa para lermos 4 teclas conectado ao PIC, conforme figura abaixo:

Figura 03 Perceba no esquema eletrnico acima que nossos teclados no possuem mais resistores de pull-up externo (compare com o circuito eletrnicos da figura 01), neste caso devemos acionar os resistores de pull-up interno disponivel no PORTB do PIC atravs do bit RBPU do registrador INTCON2.

No PORTB do PIC18f442, por default, o circuito de pull-up interno vem desativado (aps reset). Esses resistores de pull-up so automaticamente ativados quando programamos o PORTB como saida (trisb = 0), para outros casos, devemos ns mesmos ativ-los. O registrador bit RBPU ativado com nvel lgico 0 (zero), e destivado com nvel lgico 1 (um). Nosso programa:
/* Programa de leitura de tecla. Curso: Microcontroladores PIC programao em C Este programa tem por objetivo ler o estado de 4 tecla para ligar/desligar um led. */ #define led1 portd.f0 nome led1. //a diretiva define atribui ao pino RD0 o

int estado_antigo; //define uma varivel de controle, cujo objetivo armazenar o estado anterior da tecla. void main() { trisd = 0; ligar/desligar o led. portd = 0; //configura o pino RD0 como saida, pois iremos

intcon2.rbpu = 0; //habilita os resistores internos de pull-up do PORTB do PIC trisb.f0 = 1; //configura pino RB0 (tecla) como entrada trisb.f1 = 1; //configura pino RB1 (tecla) como entrada trisb.f2 = 1; //configura pino RB2 (tecla) como entrada trisb.f3 = 1; //configura pino RB3 (tecla) como entrada do { if (Button(&PORTB, 0, 20, 0)) //l tecla 1 portd = 0b00000001; else if (Button(&PORTB, 1, 20, 0)) //l tecla 2 portd = 0b00000010; else if (Button(&PORTB, 2, 20, 0)) //l tecla 3 portd =0b00000011; else if (Button(&PORTB, 3, 20, 0)) //l tecla 4 portd =0b00000100; Delay_ms(200); //delay de 200 milisegundos } while(1); }

Video do funcionamento do programa acima no KIT PICGenios . Your browser does not support inline frames or is currently configured not to display inline frames. voltar para o topo da pagina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2007. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Exerccios Resolvidos
1.0 Exerccio 1 1.1 Exerccio 2 1.2 Exerccio 3 1.3 Exerccio 4 1.4 Exerccio 5 1.5 Exerccio 6 1.6 Exerccio 7 1.6 Exerccio 8

Introduo
Apartir de agora iremos colcolar em prtica tudo que estudamos nesta unidade do curso atravs de exerccios; voltar para o topo da pagina

Exerccio 1:
Qual a diferena entre o operador = e o operador ==? Resposta: O operador = de atribuio, enquanto o operador == de igualdade.

voltar para o topo da pagina

Exerccio 2:
Qual o resultado da varivel "a" aps a seguinte expresso ? a = 25 & 12; Resposta: 25 = 000011001 & 12 = 000001100
________________ 00001000 A=8

voltar para o topo da pagina

Exerccio 3:
Comparando os laos de repetio, do-while e while, descreva suas principais diferenas com relao a avaliao da condio de teste: Resposta:

O lao do-while avalia a condio de teste somente no final, aps ter executado todos os comandos do lao. Como garantia temos que o lao ser executado ao menos uma vez no programa. O lao while analisa a avaliao de teste no incio do programa, caso a condio seja verdadeira, os comandos dos seu lao sero executados, caso falso, o lao de repetio while finalizado. voltar para o topo da pagina

Exerccio 4:
O programa seguinte tem como objetivo piscar um led conectado ao pino RB5 do PIC em intervalos de 1 segundo. Ao compilar esse programa, o programador percebeu que o programa no funcionou. Analise o programa abaixo e aponte o erro cometido pelo programador inesperinte: Refaa o programa com as correes necessrias para seu perfeito funcionamento.

void main() { trisb = 0; portb.f5 = 1;

Delay_ms(1000); portb.f5 = 0; Delay_ms(1000); }

// 1 second delay // 1 second delay

Resposta: O erro cometido no programa acima, se deve ao fato de no existir uma rotina de loop que faa com que o processamento do programa volte a se repetir. Para corrigir este erro, colocamos o comando de repetio while em nosso programa com a condio verdadeira.

void main() { trisb = 0; while(1){ portb.f5 = 1; Delay_ms(1000); portb.f5 = 0; Delay_ms(1000); } }

// condio sempre verdadeira

// 1 second delay // 1 second delay

voltar para o topo da pagina

Exerccio 5:
Analise Qual dos dois comandos If executar a instruo portb = 0? Explique o porqu?

x = 0; if (x = 1) portb = 0; ou x = 1; if (x ==0) portb = 0;

Resposta:

Somente o primeiro comando IF ( if (x = 1) portb = 0; ) verdadeira e executar a instruo portb =


0; A condio de teste (x = 1) esta atribuindo a varivel "x" o valor 1, e por causa disso a condio if passa a ser verdadeira.

O segundo if, (if (x == 1) portb = 0; ) a condio de de igualdade falsa, pois x no igual a 1, por esse motivo a instruo if no ser executada.

voltar para o topo da pagina

Exerccio 6:
Faa um programa que monitore o acionamento de uma tecla conectado ao port RB1 do PIC, conforme esquema abaixo. A cada acionamento da tecla todos os leds do portd devero alterar seu estado anterior (ligado/desligado). Para realizar este programa , utilize os recursos do comando if para detectar o acionamento das teclas. No iremos considerer neste programa o efeito debouncing.

Programa:
/* Programa de leitura de tecla. Curso: Microcontroladores PIC programao em C Este programa tem por objetivo ler o estado de uma tecla para ligar/desligar todos os leds do portd */ #define tecla1 portb.f0 // atribui ao pino RB0 o nome tecla1

void main() { trisd = 0; portd = 0; intcon2.rbpu = 0; //habilita os resistores internos de pull-up do PORTB do PIC while(1){ if (tecla1 == 0){ //se tecla1 for pressionada ento.... portd = ~portd; //inverte os estados dos leds do portd Delay_ms(200); //delay de 200 milisegundos } } }

Visualizao do programa na prtica: Your browser does not support inline frames or is currently configured not to display inline frames. Repare no video que ao pressionarmos a tecla1, os leds so acionados e desacionados diversas vezes, isso representa que enquanto a tecla estiver pressionada (nivel 0) a condio if ser verdadeira e seus comandos sero executados. Para resolver esse problema, podemos utilizar diversos artificios em C, mas no nosso estudo vamos utilizar a funo button do mikroC. voltar para o topo da pagina

Exerccio 7:
Faa o mesmo exerccio anterior s que agora utilizando a funo button do mikroC para leituras da tecla. Utilize delay de 25ms para correo do debouncing. Programa:
/* Programa de leitura de tecla. Curso: Microcontroladores PIC programao em C Este programa tem por objetivo ler o estado de uma tecla para ligar/desligar todos os leds do portd */ #define tecla1 portb.f0 // atribui ao pino RB0 o nome tecla1

void main() { trisd = 0; portd = 0; intcon2.rbpu = 0; //habilita os resistores internos de pull-up do PORTB do PIC while(1){ if (button(&portb, 0, 25, 0)){ //se tecla1 for pressionada a condio ser verdadeira. portd = ~portd; //inverte os estados dos leds do portd Delay_ms(200); //delay de 200 milisegundos

} } }

Observe que a funo button no momento que executada, configura o port como entrada (trisb = 255) . Por esse motivo, no obrigatrio configurarmo o
registrador TRISB.F0.

voltar para o topo da pagina

Exerccio 8:
Faa um programa utilizando os recursos da funo button para ler 3 teclas conectada aos pinos RB0, RB1, RA5. Cada tecla deve ser programada para funcionarem somente com toque, ou seja, necessrio pressionar e soltar a tecla para cada acionamento. A tecla RB0 tem a funo de ascender somente os leds pares. A tecla RB1 tem a funo de ascender somente os leds impares. a tecla RA5 tem a funo de Ascender todos os leds. Inicialmente os todos os leds devero estar desligados. Tempo de debouncing: 25ms. hardware:

Programa:
/* Programa de leitura de tecla. Curso: Microcontroladores PIC programao em C Este programa tem por objetivo ler o estado de uma tecla para ligar/desligar um led. */ #define tecla1 portb.f0 #define tecla2 portb.f1 #define tecla3 porta.f5 void main() { int estado_tecla1 = 0; estado para as teclas int estado_tecla2 = 0; int estado_tecla3 = 0; adcon1 = 6; geral trisa = 0; portd = 0; intcon2.rbpu = 0; PORTB do PIC //atribui ao pino RB0 o nome tecla1 //atribui ao pino RB0 o nome tecla1 //atribui ao pino RB0 o nome tecla1 //funo principal do programa //definio de variveis sinalizadores de

//configura todos os pinos A/D como I/O de uso

//habilita os resistores internos de pull-up do

while(1){ if (button(&portb, 0, 25, 0)) estado_tecla1 = 1; if (button(&portb, 1, 25, 0)) estado_tecla2 = 1; if (button(&porta, 5, 25, 0)) estado_tecla3 = 1; if (estado_tecla1 && button(&portb, 0, 25, 1) ){ portd = 0b10101010; Delay_ms(200); estado_tecla1 = 0; } if (estado_tecla2 && button(&portb, 1, 25, 1) ){ portd = 0b01010101; Delay_ms(200); estado_tecla2 = 0; } if (estado_tecla3 && button(&porta, 5, 25, 1) ){ portd = 0b11111111; Delay_ms(200); estado_tecla3 = 0; } } }

Your browser does not support inline frames or is currently configured not to display inline frames. voltar para o topo da pagina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2007. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Os Displays LCD Alfanumricos


1.0 Introduo 1.1 Hardware e Pinagem 1.2 Endereos de cada caractere no LCD 16x2 1.3 LCD Modo 8 Bits 1.4 LCD Modo 4 bits - Somente um port de controle/dados 1.5 LCD Modo 4 bits - Controlado por dois ports do PIC

Introduo
Agora que j conhecemos os recursos fundamentais da linguagem C, estamos prontos para criar nossos programas para controle de equipamentos. Estudaremos as principais funes e ferramentas para manipular displays LCD. Para implementar nossos projetos interessante a utilizao de um display, capaz de tornar mais simples a visualizao de informaes e a interao com nosso equipamento, escolhemos para tratar nesta obra de um display de utilizao muito comum em sistemas microcontrolados, suas caractersticas so as seguintes: Tipo: Display LCD Exibio: Caracteres Alfanumricos Quantidade de informaes: 16 x 2 (dezesseis caracters em 2 linhas) Controlador: padro HD44780 Hitchi Um display LCD desse tipo, possui embutido em seu circuito um outro microcontrolador, e para podermos utiliz-lo temos que entender um pouco de seus comandos e funes. Dessa forma, da mesma maneira com que trabalhamos com o PIC, para utilizar um display LCD temos que seguir uma sequncia de procedimentos.

Hardware e Pinagem
Existem modelos diferentes, com localizao diferente da pinagem, porm a numerao e funo dos pinos geralmente a mesma, nos kits didticos e profissionais Microgenios utilizado o LCD apresentado em seguida:

Descrio das Pinagens: Pino Funo 1 alimentao 2 Alimentao 3 4 5 6 7 8 9 10 11 12 12 14 15 16 Descrio Terra ou GND VCC ou +5V Tenso para ajuste de V0 contraste (ver figura1) RS Seleo: 1 - dado, 0 - instruo R/W seleo 1 - Leitura, 0 - Escrita E chip 1 ou (1 - 0) Habilita, 0 Select desabilita B0 LSB B1 B2 B3 B4 barramento de dados B5 B6 B7 MSB A (display Anodo p/ LED backlight c/ back) K (display Catodo p/ LED backlight c/ back)

Alm da pinagem importante entendermos uma outra caracterstica de hardware desse dispositivo, que so suas reas de memria; ele possui trs reas de memria com funes bem diferentes:

CGROM: Memria no voltil onde esto gravados os cdigos para escrita dos caracteres, isso muito til, pois apenas enviamos o cdigo ASCII do caracter e esse j escrito no display. DDRAM: uma rea de memria voltil, onde escrevemos o que queremos que aparea no display, cada endereo dessa memria equivale a um endereo de caracter dos display, podemos fazer a seguinte analogia para facilitar, cada caracter do display como uma janela que exibe o contedo que escrevemos na DDRAM. CGRAM: uma pequena rea de memria onde podemos desenhar caracteres diferentes (apenas 8 caracteres). Ela muito utilizada quando precisamos criar caracteres que no so comuns a todas as lnguas como por exemplo o caracter do portugus.

Endereo de cada caracter no display 16 x 2 Abaixo est o endereo em hexadecimal de cada caracter no display LCD 16 x 2, assim fica mais fcil a movimentao do cursor e das letras a serem escritas:

Lista de cdigos dos Caracteres A seguir o cdigo que devemos enviar para o LCD a fim de obtermos um determinado caracter:

Endereos e Instrues Agora conhecemos a pinagem desse LCD, vamos conhecer seu modo de funcionamento e saber um pouco mais das instrues e dados que precisaremos utilizar.

interessante atentarmos para a seguinte caracterstica, a via de dados e instrues a mesma, dessa forma a sinalizao, que indica se o Byte que chega no display dado ou instruo proveninte do sinal encontrado no pino 4 (RS): RS = 0 -> Instruo RS = 1 -> Dado Outra caracterstica importante que precisamos pulsar (de 1 para 0) o sinal Enable (pino 6) para que a informao que chega aos terminais do LCD seja interpretada pelo controlador do display. Em nosso estudo manteremos o pino 5 (R/W) em zero, pois apenas escreveremos no LCD. Podemos ligar este pino do LCD no PIC tambm.

Para utilizarmos esse novo dispositivo em nossos projetos, devemos seguir alguns passos: 1 Inicializar o LCD: Primeiramente criar uma rotina em nosso programa, que envie para o display uma sequncia de informaes que determinar o modo com o qual trabalharemos, com por exemplo: Definio da matriz de pontos (nosso caso 5 x 7) Definio do cursor Definio da direo de deslocamento (mensagem ou cursor) Limpeza do display.

O mikroC automaticamente carrega as rotinas de inicilizao do LCD na compilao de um programa. O programador no precisa se preocupar em inicilizar o LCD desde que o hardware do dispositivo esteja configurado no programa corretamente no modo 4 ou 8 bits; (veremos com detalhes mais adiante).

Tabelas de Instrues Na seqncia disponibilizamos as tabelas de instrues para esse tipo display, como nosso objetivo no o estudo do display propriamente dito, aconselhamos aos interessados nesse dispositivo que procurem bibliografias dedicadas a eles para um maior detalhamento das funes. Tabela com o conjunto completo de instrues:

Tabela com as instrues mais comuns:

Resumo com as instrues mais teis:

Endereos de cada caractere no LCD 16x2


Abaixo est o endereo em hexadecimal de cada caracter no display LCD 16 x 2, assim fica mais fcil a movimentao do cursor e das letras a serem escritas:(ENDEREOS EM HEXADECIMAL)

80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF

Inicializao do LCD
Toda vez que alimentarmos o LCD, devemos executar um procedimento de inicializao, o qual consiste em enviar comandos que configuram o modo de operao para execuo de um dado programa: fixao das condies de utilizao, fixao do modo de controle ativo/inativo do display e limpeza da tela. No mikroC no precisamos nos preocupar em programar todos os comandos de inicializao do LCD, pois, atravs de simples funes, o compilador se encarrega de program-lo para ns. Por esse motivo devemos informar ao sistema o tipo de LCD que estamos utilizando por meio de linhas de comando. A seguir, vamos conhecer e estudar as instrues de controle de LCD usadas no mikroC.

Definindo o modo de operao do LCD.


Os LCD's podem ser programados para operarem das seguintes formas: modo 8 bits modo 4 bits

No mikroC possvel trabalhar com os LCD's nos dois modos. no modo 8 bits. no modo 4 bits - somente um port de controle/dados no modo 4 bits - com dois ports para controle e dados do LCD

LCD Modo 8 Bits


No modo 8 bits, todos os pinos do barramento de dados do LCD so utilizados, conforme figura abaixo:

Repare que todos os 8 pinos do barramento de dados do LCD (D0 a D7) esto ligados no microcontrolador PIC, neste modo, estamos enviando as instrues e comandos para o LCD em 8 bits.

O compilador mikroC possui diversas bibliotecas de funes prontas para trabalharmos com displays LCD. Para exemplificar, vamos apresentar um programa em C que utiliza os recursos das funes de controle de LCD do compilador mikroC, acompanhe:

/********************************************************************* ***** Centro de tecnologia Microgenios Programa exemplo: LCD_modo_8bits.c Este programa tem por objetivo escrever a mensagem "Microgenios" na primeira linha do LCD e na segunda "Kit PICGENIOS". ********************************************************************** **** */ void main() { trisd = 0; //configura todos os pinos do portd como sada trise = 0; //configura todos os pinos do porte como saida ADCON1 = 0x06; //configura todos os pinos de A/D como I/O de uso geral lcd8_config(&porte, &portd,2,1,0,7,6,5,4,3,2,1,0); //configura e inicializa o LCD lcd8_cmd(lcd_clear); //apaga LCD lcd8_cmd(lcd_cursor_off); // desliga cursor lcd8_out(1,1,"Microgenios"); // escreve mensagem na primeira linha do LCD lcd8_out(2,1,"KIT PICGENIOS"); // escreve mensagem na segunda linha do LCD delay_ms(10); //delay de 10 ms while(1); //loop infinito }

Descrio detalhada do programa: O programa acima tem a funo de escrever no LCD 16X2 duas mensagens "Microgenios" na primeira linha do LCD, e "KIT PICGENIOS" na segunda linha do LCD. A funo main(), j conhecemos. Os comando abaixo definem os sentidos das portas de i/o do PIC.
trisd = 0; //configura todos os pinos do portd como sada trise = 0; //configura todos os pinos do porte como saida ADCON1 = 0x06; //configura todos os pinos de A/D como I/O de uso geral

Os comandos seguintes controlam o display LCD no modo 8 bits. Vamos estudar cada um dos comandos: O comando lcd8_config ( ): O comando lcd8_config determina quais so os pinos do barramento de dados e de controle do LCD que esto ligados ao PIC, assim como tambm inicializa o LCD.

Sintaxe:
lcd8_config(&port_controle, &port_dados, RS, EN, RW, D7, D6, D5, D4, D3, D2, D1, D0 );

Onde: port_controle e port_dados pode ser: PORTA, PORTB, PORTC, PORTD ou PORTE. RS : pino do port_controle que determina o bit de instrues ou dado do LCD. EN : pino do port_controle que determina o bit de "enable" do LCD. RW : pino do port_controle que determina o bit de leitura /escrita do LCD. (nolmalmente coloca-se este pino do LCD no GND). D7 D0: Pinos do port_dados Vejamos nosso exemplo de programa:
lcd8_config(&porte, &portd,2,1,0,7,6,5,4,3,2,1,0); //configura e inicializa o LCD

A funo lcd8_config acima, determina os PORTs e os pinos que participam do controle do LCD: Port que controla o LCD: PORTE Funes dos pinos de controle do port de controle: RS: 1 EN: 1 RW: 0
//pino RE2 //pino RE1 //pino RE0

Port de dados do LCD; PORTD Funes dos pinos do port de dados no LCD; D7: 7 D6: 6 D5: 5 D4: 4 D3: 3 D2: 2 D1: 1 D0: 0
//pino //pino //pino //pino //pino //pino //pino //pino RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0 do do do do do do do do PORTD PORTD PORTD PORTD PORTD PORTD PORTD PORTD

Configuramos ento nosso lcd conforme figura abaixo:

Apartir desta primeira linha de programa, concluimos que nosso LCD esta ligado da seguinte maneira:

Repare que o pino R/W do LCD foi aterrado. No comando Lcd8_config informamos que o pino RW era RE0 do PIC.

O comando lcd8_cmd(comandos_LCD):

No mikroC podemos configurar o LCD de diversas formas diferentes. Atravs da funo lcd8_cmd(), podemos determinar diversas "tarefas" que o LCD dever executar. Acompanhe: Sintaxe: Lcd8_cmd(comandos_LCD); onde: Comando_LCD pode ser:
Comandos Descrio LCD_FIRST_ROW Move cursor para primeira linha do LCD LCD_SECOND_ROW Move cursor para segunda linha do LCD LCD_THIRD_ROW Move cursor para a terceira linha do LCD LCD_FOURTH_ROW Move cursor para a quarta linha do LCD LCD_CLEAR Apaga display LCD_RETURN_HOME Retorna cursor para a primeira coluna da primeira linha do LCD LCD_CURSOR_OFF Desliga cursor LCD_UNDERLINE_ON Salta cursor para a linha inferior LCD_BLINK_CURSOR_ON Ativa o modo piscante do cursor LCD_MOVE_CURSOR_LEFT Move cursor para a esquerda sem movimentar os textos LCD_MOVE_CURSOR_RIGHTMove cursor para a direita sem movimentar os textos LCD_TURN_ON Liga cursor LCD_TURN_OFF Apaga todo o visor do LCD, sem perder os dados no visor LCD_SHIFT_LEFT Movimenta textos do LCD para a esquerda LCD_SHIFT_RIGHT Movimenta textos do LCD para a direita No exemplo utilizamos o seguinte comando para apagar o display LCD: lcd8_cmd(lcd_clear); //apaga LCD

Este e os demais comandos que estudaremos somente podem ser utilizados aps a execuo do comando lcd8_config(). Utilizamos o comando para desligar o cursor do LCD
lcd8_cmd(lcd_cursor_off); // desliga cursor

E agora escrevemos a mensagem "Microgenios" na coordenada informada pela funo lcd8_out no LCD.
lcd8_out(1,1,"Microgenios"); // escreve mensagem na primeira linha do LCD

Os nmeros 1, 1 da funo acima, informa que a mensagem "Microgenios" ser escrita na primeira linha da primeira coluna do LCD. o Primeiro numero informa a linha do LCD e o segundo nmero informa a coluna do LCD. Os displays LCD so constituidos de linhas e colunas conforme podemos ver na figura abaixo:

O LCD apresentado possui 4 linhas por 20 colunas. Podemos escrever um dado em qualquer posio do LCD. basta informar a linha e a coluna para inicio do texto.

No caso de desejarmos escrever uma mensagem "ligado" na quarta linha, dcima coluna do LCD 20 x 4, basta escrever o seguinte comando:
lcd8_out(4,10,"ligado"); // escreve mensagem na quarta linha, dcima coluna do lcd 20 x 4

Vamos escrever agora outro programa que escreve uma mensagem no display lcd 16 x 4:

/********************************************************************* ***** Centro de tecnologia Microgenios Programa exemplo: LCD_modo_8bits_01.c Este programa tem por objetivo escrever a mensagem "Maquina: ligado"

na primeira linha do LCD e na segunda linha "Prog: ligado". ********************************************************************** **** */ char *texto = "ligado" void main() { trisd = 0; //configura todos os pinos do portd como sada trise = 0; //configura todos os pinos do porte como saida ADCON1 = 0x06; //configura todos os pinos de A/D como I/O de uso geral lcd8_config(&porte, &portd,2,1,0,7,6,5,4,3,2,1,0); //configura e inicializa o LCD lcd8_cmd(lcd_clear); //apaga LCD lcd8_cmd(lcd_cursor_off); // desliga cursor lcd8_out(1,1,"Maquina: "); // escreve mensagem na primeira linha do LCD lcd8_out_cp(texto); // escreve mensagem na segunda linha do LCD lcd8_out(2,1,"Prog: "); // escreve mensagem na segunda linha do LCD lcd8_out_cp(texto); // escreve mensagem na segunda linha do LCD delay_ms(10); //delay de 10 ms while(1); //loop infinito }

Neste exemplo repare que utilizamos a mesma configurao de hardware do LCD anterior. Repare que agora temos um comando novo em nosso programa, o comando lcd8_out_cp, cuja funo escrever no lcd uma string ou varivel na corrente posio do cursor. Repare que o comando lcd8_out(1,1,"Maquina: "); deixa o cursor posicionada na stima coluna da primeira linha do lcd. O prximo comando que vem em seguida no programa lcd8_out_cp(texto), que escreve na posio do cursor do lcd o valor da varivel "texto", que neste caso a string "ligado". Teremos como resultado: M aq u i n a : L i ga do P r o g: Li g a do

LCD Modo 4 bits - Somente um port de controle/dados


No modo de 4 bits, devemos ligar apenas o nibble mais significativo (DB4 a DB7) do barramento de dados do LCD ao microcontrolador, conforme o esquema eltrico seguinte:

Para exemplificar este modo 4 bits iremos apresentar um programa: /********************************************************************* ***** Centro de tecnologia Microgenios Programa exemplo: LCD_modo_4bits_00.c Este programa tem por objetivo escrever a mensagem "teste LCD" na primeira linha do LCD. Programa no modo 4 bits ********************************************************************** **** */

void main() { TRISD = 0; // programa portD como saida Lcd_Config(&PORTD,1,3,2,7,6,5,4); //configura e inicializa LCD Lcd_Cmd(Lcd_CLEAR); // apaga display Lcd_Cmd(Lcd_CURSOR_OFF); // desliga cursor Lcd_Out(1, 1, "teste LCD"); // escreve texto "teste LCD" na primeira linha, primeira coluna do LCD while(1); }

Descrio detalhada do programa: O programa acima tem a funo de escrever na primeira linha do display lcd o texto "teste LCD". Repare na imagem acima que utilizamos somente um port do PIC para controle e envio de dados para o LCD. Os comandos seguintes controlam o display LCD no modo 4 bits. Vamos estudar cada um dos comandos: O comando lcd_config ( ): O comando lcd_config( ) determina quais so os pinos do barramento de dados e de controle do LCD que esto ligados ao PIC, assim como tambm inicializa o LCD. Sintaxe:
lcd_config(&port_controle/dados, RS, EN, RW, D7, D6, D5, D4 );

Onde: port_controle e port_dados pode ser: PORTA, PORTB, PORTC, PORTD ou PORTE. RS : pino do port_controle que determina o bit de instrues ou dado do LCD. EN : pino do port_controle que determina o bit de "enable" do LCD. RW : pino do port_controle que determina o bit de leitura /escrita do LCD. (nolmalmente coloca-se este pino do LCD no GND). D7 D4: pinos do port_dados Vejamos nosso exemplo de programa:
Lcd_Config(&PORTD,1,3,2,7,6,5,4); //configura e inicializa LCD

A funo lcd_config acima, determina o PORT e os pinos que participam do controle do LCD: Port que controla o LCD: PORTD

Funes dos pinos de controle do port de controle:


//pino RD2 //pino RD3 //qualquer valor de outro pino, pois o RW do LCD esta aterrado

RS: 1 EN: 3 RW: 2

Port de dados do LCD; PORTD Funes dos pinos do port de dados no LCD; D7: 7 D6: 6 D5: 5 D4: 4
//pino //pino //pino //pino RD7 RD6 RD5 RD4 do do do do PORTD PORTD PORTD PORTD

PODEMOS ATERRAR O PINO R/W DO LCD, POIS AS FUNES DE CONTROLE DE LCD DO MIKROC NO UTILIZA ESTE PINO SIMPLESMENTE DEIXAM ESTE PINO EM NIVEL LGICO 0. CASO VENHAMOS A ATERRAR O PINO RW, ECONOMIZAREMOS 1 PINO DE I/O DO PIC.

Os demais comandos do programa estudamos anteriormente, em caso de dvida leia novamente o contedo do tpico lcd modo 8 bits.

LCD Modo 4 bits - Controlado por dois ports do PIC


Este mais um dos modos 4 bits de trabalharmos com LCD. Neste novo modo podemos ter um port de controle e outro port do PIC para dados. Veja o esquema abaixo:

Repare que para controlar o display LCD utilizamos dois ports do PIC, o PORTA para controle, e o PORTD como dados. Vamos estudar um programa para entendermos os comandos de controle:
/********************************************************************* ***** Centro de tecnologia Microgenios Programa exemplo: LCD_modo_4bits_01.c Este programa tem por objetivo escrever a mensagem "Programa LCD" na primeira linha do LCD. Programa no modo 4 bits ********************************************************************** **** */

void main() { ADCON1 = 6; geral // programa pinos de A/D como I/O de uso

TRISA = 0; // programa portA como saida TRISD = 0; // programa portD como saida Lcd_custom_Config(&PORTD,0,2,4,5,&PORTA,1,2,3); //configura e inicializa LCD no modo 4 bits Lcd_Cmd(Lcd_CLEAR); // apaga display Lcd_Cmd(Lcd_CURSOR_OFF); // desliga cursor Lcd_Out(1, 4, "Programa LCD"); // escreve texto "Programa LCD" na primeira linha, quarta coluna do LCD while(1); }

Descrio detalhada do programa: O programa acima tem a funo de escrever na primeira linha, quarta coluna do display lcd o texto "Programa LCD". Repare no esquema eletrnico acima que temos dois ports do PIC ligado ao LCD. Os comandos seguintes controlam o display LCD no modo 4 bits. Vamos estudar cada um dos comandos: O comando lcd_custom_config ( ): O comando lcd_custom_config( ) determina quais so os pinos do barramento de dados e de controle do LCD que esto ligados ao PIC, assim como tambm inicializa o LCD. Sintaxe:
lcd_config(&port_dados, D7, D6, D5, D4, &port_controle, RS, RW, EN );

Onde: port_controle e port_dados pode ser: PORTA, PORTB, PORTC, PORTD ou PORTE. RS : pino do port_controle que determina o bit de instrues ou dado do LCD. EN : pino do port_controle que determina o bit de "enable" do LCD. RW : pino do port_controle que determina o bit de leitura /escrita do LCD. (nolmalmente coloca-se este pino do LCD no GND). D7 D4: pinos do port_dados Vejamos nosso exemplo de programa:
Lcd_custom_Config(&PORTD,0,2,4,5,&PORTA,1,2,3); //configura e inicializa LCD no modo 4 bits

A funo lcd_custom_Config acima, determina os PORTs e os pinos que participam do controle e envio de dados para o LCD: Port que controla o LCD: PORTA

Funes dos pinos de controle do port de controle:


//pino RA1 //pino RA3 //qualquer valor de outro pino, pois o RW do LCD esta aterrado, neste caso conectados a RA2

RS: 1 EN: 3 RW: 2

Port de dados do LCD; PORTD Funes dos pinos do port de dados no LCD; D7: 0 D6: 2 D5: 4 D4: 5
//pino //pino //pino //pino RD0 RD2 RD4 RD5 do do do do PORTD PORTD PORTD PORTD

Aprendendo Programando:
Apartir de agora, iremos desenvolver alguns exemplos de programas utilizando display LCD alfanumricos.

1 Programa:
Vamos elaborar um programa utilizando os recursos das funes de display LCD do MikroC para que funcione da seguinte maneira: Nosso hardware esta operando o LCD no formato 8 bits Inicialmente ser escrito uma string na primeira linha do display LCD e outra na segunda linha. As mensagem devero se deslocar 16 casas para a direita e posteriormente dever retornar ao seu local de origem: Cada deslocamente levar aproximadamente 200 milisegundos. Microcontrolador: PIC18F4x2 Cristal: 8MHz Acompanhe o harware:

figura 01 - Esquema eltrico


/*********************** Animao de Display LCD ************************ Centro de Tecnologia Microgenios Programa: Animao LCD Compilador: MikroC Cristal: 8Mhz Microcontrolador: PIC18F452 Objetivo: Deslocar as mensagem dos display LCD para a direita e para a esquerda utilizando lao For. ********************************************************************** ***/ void main() { unsigned char inc = 0; char //declara variavel chamada "inc" como

trisd = 0; //configura todos os pinos do portd como sada trise = 0; //configura todos os pinos do porte como saida ADCON1 = 0x06; //configura todos os pinos de A/D como I/O de uso geral lcd8_config(&porte, &portd,2,1,4,7,6,5,4,3,2,1,0); // lcd8_cmd(lcd_clear); //apaga display LCD lcd8_cmd(lcd_cursor_off); //desliga cursor lcd8_out(1,1,"Microgenios"); //escreve no display LCD lcd8_out(2,1,"KIT PICGENIOS"); //escreve no display LCD //*********** desloca mensagens do lcd para a direita ********************* for (inc = 0 ; inc < 16 ; inc++){ lcd8_cmd(LCD_SHIFT_RIGHT); //desloca mensagem para a direita

Delay_ms(200); }

//aguarda 200 milisegundos

//*********** desloca mensagens do lcd para a esquerda ********************* for (inc = 0 ; inc < 16 ; inc++){ lcd8_cmd(LCD_SHIFT_left); //desloca mensagem para a esquerda Delay_ms(200); //aguarda 200 milisegundos } while(1); //loop infinito }

Obs: repare neste programa que o pino R/W do display LCD foi aterrado, e na funo lcd8_config foi declarado como sendo pino RE4. O pino R/W normalmente no utilizado nas maioria das aplicaes, neste caso, como a funo lcd8_config necessita de algum parmetro, informamos um valor qualquer, neste caso foi um pino inexistente no chip. (lembre-se que todos os ports do PIC so composto por 8 bits, neste caso a posio de memria RE4 existe, porm no tem aplicao para este chip). Regras do C: Se na declarao de uma funo declararmos "n" parametros, necessriamente deveremos enviar todos os "n" parmetros na chamada desta funo.

2 Programa:
Nosso segundo programa, tem como objetivo escrever no display LCD o valor numrico 100 armazenado em uma varivel do tipo char, chamada "contador". Utilizaremos o mesmo esquema eletrnico apresentado do exemplo 01.

Acompanhe:
/*********************** Animao de Display LCD ************************ Centro de Tecnologia Microgenios Programa: Animao LCD Compilador: MikroC Cristal: 8Mhz Microcontrolador: PIC18F452 Objetivo: enviar para o display LCD o valor da varivel contador ********************************************************************** ***/ void main() { unsigned char contador = 100; //declara varivel char contador e atribui o valor 100 unsigned char texto[10]; //cria vetor (array) do tipo char com 11 elementos (os indice comeam do 0) trisd = 0; //configura todos os pinos do portd como sada trise = 0; //configura todos os pinos do porte como saida ADCON1 = 0x06; //configura todos os pinos de A/D como I/O de uso geral

lcd8_config(&porte, &portd,2,1,4,7,6,5,4,3,2,1,0); // lcd8_cmd(lcd_clear); //apaga display LCD lcd8_cmd(lcd_cursor_off); //desliga cursor bytetostr(contador, texto); //converte o valor numrico de contador e atribui ao vetor Texto lcd8_out(1,1,texto); //escreve no display LCD o valor do vetor texto while(1); //loop infinito }

O programa deste exerccio possui muitas informaes importantes, dentre elas, a utilizao de Arrays, ou como neste caso chamado, vetor. Para que possamos enviar o valor numrico presente em uma varivel qualquer, a principio precisamos converter cada um de seus algorismo em caracterer, pois a funo de display LCD do MikroC somente opera com caracteres e string. Um erro comum (acredito que voc j tentou), utilizar as funes dessa forma:
lcd8_out(1,1,contador); varivel contador //escreve no display LCD o valor da

Se voc pensou que iria aparecer no display LCD o valor da varivel contador no display LCD voc se enganou. Vamos analizar com mais calma: Seu display LCD somente pode operar com caracterer, ou seja, char. Lembre-se que o barramento do LCD de 8 bits, no qual permite o envio de valores de 0 a 255 no mximo. Cada caracterer no padro ASCII do comprimento de um char, neste caso voc j comea a pensar... "Tenho que enviar um caracter por vez no display LCD". exatamente isso, temos que enviar caracter por caracter, caso nossa intenso seja escrever uma mensagem no visor do LCD. Nosso compilador possui algumas bibliotecas que iro nos ajudar e muito na elaborao do nosso programa. Utilizamos uma funo chamada bytetostr no programa, que tem por objetivo converter o valor numrico de uma varivel para String e armazenar em uma Tabela (vetor).
" Professor, estou com uma dvida !! . Afinal qual a diferena entre um caractere e uma string??? Na linguagem C diferenciamos um caractere de uma string atravs das aspas simples ' e aspas duplas ". Exemplo: 'A' ---> caractere A padro ASCII "A" ---> string A mas qual a diferena?

Caractere: todo caractere ASCII possui um valor numrica (consulte o menu Tools > ASC Chart do MikroC) String: No exite uma representao numrica para uma string, pois est composta por caractere + 1 caractere de terminao, chamado "Null", cujo valor Zero. ento teremos: "A" ---> igual a: --- > 'A' (caractere) + "\0" (caractere de terminao de string null) Pense e responda: Qual o nmero que representa seu nome? resp: No existe um nmero que represente seu nome, e isso acontece em qualquer string.

Veja como ficar o resultado no modo de debugao no MikroC:

Figura 02 - Debugao do programa anterior Perceba o preenchimento do vetor Texto aps a execuo do comando:
bytetostr(contador, texto);

3 Programa:
Este Terceiro programa tem por objetivo mostrar utilizar os recursos da memria CGRAM do display LCD. Neste exemplo, aparecer um pequeno "cavalinho" andando no display LCD alfanumrico.

Teste este programa no seu kit PICgenios e veja o resultado:

/*********************** Animao de Display LCD ************************ Centro de Tecnologia Microgenios Programa: Animao LCD Compilador: MikroC Cristal: 8Mhz Microcontrolador: PIC18F452 Objetivo: enviar para o display LCD o valor da varivel contador http://br.youtube.com/watch?v=NS6-T3bGNd4 ********************************************************************** ***/ //1 caracterer************ const char character1[] = { const char character2[] = { const char character3[] = { const char character4[] = { const char character5[] = { const char character6[] = { const char character7[] = { const char character8[] = { const const const const const const const const const const const const const const const const char char char char char char char char char char char char char char char char character1a[] character2a[] character3a[] character4a[] character5a[] character6a[] character7a[] character8a[] character1b[] character2b[] character3b[] character4b[] character5b[] character6b[] character7b[] character8b[] = = = = = = = = = = = = = = = = { { { { { { { { { { { { { { { { 32 32 32 32 12 31 31 28 32 32 32 32 16 31 31 24 , , , , , , , , , , , , , , , , 32 , 32 , 32 , 3 , 7 , 14 , 14}; 32 , 32 , 32 , 15 , 31 , 31 , 31}; 32 , 32 , 32 , 3 , 31 , 31 , 31}; 1 , 31 , 31 , 31 , 27 , 19 , 16}; 24 , 16 , 1 , 1 , 1 , 32 , 32}; 31 , 30 , 23 , 32 , 32 , 16 , 32}; 31 , 1 , 1 , 1 , 1 , 32 , 32}; 28 , 4 , 4 , 8 , 32 , 32 , 32}; 32 , 32 , 32 , 32 , 7 , 15 , 30}; 32 , 32 , 32 , 14 , 31 , 31 , 31}; 32 , 32 , 32 , 7 , 31 , 31 , 31}; 2 , 31 , 31 , 31 , 27 , 19 , 16}; 32 , 32 , 1 , 1 , 1 , 32 , 32}; 31 , 27 , 18 , 1 , 1 , 17 , 32}; 31 , 1 , 1 , 1 , 1 , 32 , 32}; 28 , 4 , 8 , 16 , 32 , 16 , 32};

32 , 32 , 32 , 7 , 15 , 14 , 28 , 24}; 32 , 32 , 32 , 15 , 31 , 31 , 31 , 3}; 32 , 32 , 32 , 3 , 31 , 31 , 31 , 31}; 1 , 31 , 31 , 31 , 27 , 27 , 16 , 16}; 19 , 19 , 2 , 2 , 4 , 32 , 32 , 32}; 31 , 7 , 14 , 6 , 1 , 32 , 32 , 32}; 15 , 7 , 19 , 15 , 32 , 16 , 32 , 32}; 16 , 24 , 12 , 4 , 2 , 1 , 32 , 32};

void escreve(char pos_row, char pos_char, char pos_row1, char pos_char1,char num) { char i; if (num == 1){ LCD8_Cmd(64); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character1[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character2[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character3[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character4[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character5[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character6[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character7[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character8[i]); LCD8_Cmd(LCD_RETURN_HOME); lcd8_chr(pos_row, pos_char, 0); LCD8_Chr_cp(1); LCD8_Chr_cp(2); LCD8_Chr_cp(3); lcd8_chr(pos_row1, pos_char1, 4); LCD8_Chr_cp(5); LCD8_Chr_cp(6); LCD8_Chr_cp(7); } if (num == 2){ LCD8_Cmd(64); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character1a[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character2a[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character3a[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character4a[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character5a[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character6a[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character7a[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character8a[i]); LCD8_Cmd(LCD_RETURN_HOME); lcd8_chr(pos_row, pos_char, 0); LCD8_Chr_cp(1); LCD8_Chr_cp(2); LCD8_Chr_cp(3); lcd8_chr(pos_row1, pos_char1, 4); LCD8_Chr_cp(5); LCD8_Chr_cp(6); LCD8_Chr_cp(7); } if (num == 3){ LCD8_Cmd(64); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character1b[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character2b[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character3b[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character4b[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character5b[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character6b[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character7b[i]); for (i = 0; i<=7; i++) LCD8_Chr_Cp(character8b[i]); LCD8_Cmd(LCD_RETURN_HOME);

lcd8_chr(pos_row, pos_char, 0); LCD8_Chr_cp(1); LCD8_Chr_cp(2); LCD8_Chr_cp(3); lcd8_chr(pos_row1, pos_char1, 4); LCD8_Chr_cp(5); LCD8_Chr_cp(6); LCD8_Chr_cp(7); } } void main() { unsigned char texto[10]; trisd = 0; //configura todos os pinos do portd como sada trise = 0; //configura todos os pinos do porte como saida ADCON1 = 0x06; //configura todos os pinos de A/D como I/O de uso geral lcd8_config(&porte, &portd,2,1,4,7,6,5,4,3,2,1,0); // lcd8_cmd(lcd_clear); //apaga display LCD lcd8_cmd(lcd_cursor_off); //desliga cursor while(1){ escreve (1,1,2,1,3); delay_ms(100); escreve (1,1,2,1,2); delay_ms(100); escreve (1,1,2,1,1); delay_ms(100); } }

voltar para o topo da pagina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2008. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Conversor A/D do PIC


1.0 Introduo

Introduo
O PIC18F452 possui internamente 8 canais de A/D com resoluo de 10 bits cada. Comu m conversor A/D com resoluo de 10 bits e tenso de referncia de 5V, podemos obter um valor de 4,8876.. mV, pois 5V/ (2E10 - 1) = 4,8876... mV. Os conversores A/D dos PICs utilizam uma tcnica de aproximao sucessivas, normalmente com resoluo de 10 bits, com clock selecionvel pelo usurio e mltiplas entradas multiplexadas.

Canais AD multiplexados Os conversores A/D do nosso microcontrolador esto ligados nos pinos RA0 (AN0), RA1 (AN1), RA2 (AN2), RA3 (AN3), RA5 (AN4), RE0 (AN5), RE1 (AN6), RE7 (AN7). Os registradores que participam da configurao do conversor A/D so: ADCON0 e ADCON1. Nosso A/D possui resoluo de 10 bits (8 + 2 bits), onde os valores das converses so armazenados nos registradores ADRESH e ADRESL.

Registrador ADCON0:
vejamos o funcionamento de cada bit desse registrador:

ADCON0:
ADCS1
Bit7

ADCS0
Bit6

CHS2
Bit5

CHS1
Bit4

CHS0
Bit3

GO/DONE
Bit2 Bit1

----- ADON
Bit0

ADCS1 , ADCS2: Bits de seleo de velocidade de converso A/D

tabela 1.0 CHS2, CHS0: Bit de seleo de canal A/D

GO/DONE: Bit de status da converso A/D


0 - Converso A/D no est sendo realizada 1 - Converso A/D est sendo realizada

ADON: Liga ou desliga o A/D


0 - Conversor A/D desligado 1 - Conversor A/D ligado Antes de configurarmos os registradores ADCS2, ADCS1 e ADCS0, devemos levar em considerao a frequncia do cristal que estamos utilizando, pois nosso conversor necessita de 1,6us para fazer a converso. A tabela seguinte apresenta os valores de configurao dos registradores ADCS2, ADCS1 e ADCS0 para as faixas de frquencia do cristal utilizado.

Registrador ADCON1:

vejamos o funcionamento de cada bit desse registrador:

ADCON1:
ADFM
Bit7

ADCS2
Bit6

-----Bit5

----Bit4

PCFG3
Bit3

PCFG2
Bit2

PCFG1
Bit1

PCFG0
Bit0

ADFM : Ajusta o formato do resultado da converso A/D 0 - Justifica a direita 1 - Justifica a esquerda ADCS2 : Bit de seleo da velocidade de converso

*consulte a tabela 1.0 PCFG3, PCFG2, PCFG1, PCFG0: bits configurao do A/D

tabela 2.0 O bit de ADFM tem a funo de organizar o resultado da converso A/D, de forma que o os valores convertidos sejam justificados a direita ou a esquerda nos registradores ADRESH e ADRESL. Caso venhamos configurar ADFM = 1, organizamos o valor da converso a direita, ou seja, os oitos bits menos significativo ser armazendo em ADRESL, e os 2 bits mais significativo sero armazenados em ADRESH.

Caso ADFM = 0, justificaremos a esquerda os valores de converso, desta forma os oitos bits mais significativos ficaro em ADRESH e os 2 menos significativo ficar em ADRESL. Atravs dos bits PCFG3, PCFG2, PCFG1, PCFG0 informamos quais os pinos que sero A/D ou I/O digital. Exemplo (consulte tabela 2.0): ADCON1 = 0 ; //programamos todos os pinos RA0, RA1 , RA2 , RA3, RA5, RE0, RE1, RE2 como A/D ADCON1 = 6 ; //programamos todos os pinos RA0, RA1 , RA2 , RA3, RA5, RE0, RE1, RE2 como I/O de uso geral ADCON1 = 14 ; //programamos os pinos RA1 , RA2 , RA3, RA5, RE0, RE1, RE2 como I/O de uso geral e somente RA0 como AD (referncia VDD). ADCON1 = 4 ; //programamos os pinos RA2 , RA5, RE0, RE1, RE2 como I/O de uso geral e RA0, RA1 e RA3 como AD (referncia VDD). Nosso mdulo possui um conversor com resoluo mxima de 10 bits, ou seja, 1024 divises (0 a 1023 divises). Podemos configurar e determinar tenses de referncia externa para nosso conversor A/D atravs dos pinos AN3 e AN2, ou selecionar a tenso interna do chip (vcc e gnd) como referncia. Frmula de converso analgico para digital: Rad = ( Vin - Vref-) * 1023 / (Vref+ - Vref-) onde: Rad = Resultado da converso Vref+ e Vref- = valor de tenso de referncia mxima e mnima Vin = Tenso de entrada no pino A/D obs: 1023 o valor mximo de converso do A/D, lembrando que o valor de 0 a 1023. Analize o esquema eltrnico seguinte:

figura 01 Analizando o esquema eletrnico apresentado, vamos encontrar o valor analgico convertido para digital: Digamos que o valor da tenso Vin no momento de leitura do AN0 seja de 2V. Nossa Frmula: Rad = ( Vin - Vref-) * 1023 / (Vref+ - Vref-) logo: Rad = (2 - 1) *1023 / (3 - 1) Rad = 1 * 1023 / 2 Rad = 511 OBS: A TENSO DE VREF EXTERNA NUNCA PODER ULTRAPASSAR A TENSO DE ALIMENTAO DO MICROCONTROLADOR.

Trabalhando com o MikroC


No mikroC utilizamos os seguinte funo para leitura do conversor A/D do PIC:

sintaxe: Adc_Read(canal_ AD); onde: Canal_AD: canal do conversor AD do PIC que desejamos ler. O nmero do canal AD depende do tipo de PIC usado. Exemplo:
int leitura_ad; leitura_ad = Adc_Read(0); varivel temp_res //le canal ad0 do PIC e salva valor na

A funo adc_read salva o valor da converso AD (canal 0 - pino RA0) na varivel leitura_ad. Lembre-se que o valor da resoluo do AD do PIC18F452 de 10 bits, e por esse motivo devemos utilizar uma varivel do tipo inteiro para armazenar o valor do A/D. Estudo do registrador ADCON1: O registrador ADCON1 responsvel por configurar o modo de trabalho dos pinos com A/D. Atravs dos bits PCFG3, PCFG2, PCFG1, PCFG0 configuramos o pino como A/D ou como I/O de uso geral.

Exemplo de programa: Acompanhe o exemplo simples onde utilizamos um potenciometro a entrada RA0 e um display LCD 16x2 para visualizarmos o valor da converso do AD.

Exemplo de programa:
/********************************************************************* ******* Centro de Tecnologia Microgenios Programa: Diplay_7_seg_01 Placa: KIT PICGENIOS Objetivo: este programa tem por funo ler o canal AD0 e escrever no lcd o valor de converso ********************************************************************** ********* */ char texto[16]; int temp_res = 0; void main() { trisd = 0; //define portd como saida trise = 0; //define porte como saida trisa.f0 = 1; //define pinos RA0 como entrada ADCON1 = 0B00001110; //configura pino RA0 como entrada analgica e os demais com I/O digital Lcd8_Config(&PORTE,&PORTD,2,1,4,7,6,5,4,3,2,1,0); //inicializa lcd Lcd8_Cmd(Lcd_Clear); //apaga lcd Lcd8_Cmd(LCD_CURSOR_OFF); //desliga cursor do lcd

Lcd8_Out(1, 1, "Canal AN0: "); //escreve mansagem na linha 1, coluna 1 do lcd Delay_ms (10); //delay 10 milisegundos do { temp_res = Adc_Read(0); //le canal ad0 do PIC e salva valor na varivel temp_res Delay_10us; //delay de 10 microsegundos wordToStr(temp_res, texto); //converte valor da converso do ad0 para string lcd8_out(1,11,texto); //escreve no lcd o valor da converso do ad0 }while (1); }

Detalhes do programa: Primeiramente definimos as variveis globais do programa


char texto[16]; int temp_res = 0;

Depois iniciamos a funo main() e definimos o sentido dos ports que participam do controle do LCD: Repare que programamos o registrador ADCON1 com o valor 2, pois o porte do PIC utilizado como I/O para controlar o LCD.
trisd = 0; //define portd como saida trise = 0; //define porte como saida trisa.f0 = 1; //define pinos RA0 como entrada ADCON1 = 0B00001110; //configura pino RA0 como entrada analgica e os demais com I/O digital

Os comandos seguintes so utilizados para controle e escrita do display LCD.


Lcd8_Config(&PORTE,&PORTD,2,1,4,7,6,5,4,3,2,1,0); //inicializa lcd Lcd8_Cmd(Lcd_Clear); //apaga lcd Lcd8_Cmd(LCD_CURSOR_OFF); //desliga cursor do lcd Lcd8_Out(1, 1, "Canal AN0: "); //escreve mansagem na linha 1, coluna 1 do lcd Delay_ms (10); //delay 10 milisegundos

O comando seguinte l o canal AN0 do PIC e salva o valor na varivel temp_res.

temp_res = Adc_Read(0); varivel temp_res

//le canal ad0 do PIC e salva valor na

A funo abaixo tem pertence ao compilador mikroC e tem por objetivo converter o valor de uma varivel numrica do tipo word em string. Esta converso necessria pois iremos escrever o valor numrico da varivel temp_res, resultado da converso AN0, e escrever no LCD. A varivel que assimilar o valor convertido em string chamada de "texto".
wordToStr(temp_res, texto); para string //converte valor da converso do ad0

Em seguida enviamos para o LCD o valor da varivel texto.


lcd8_out(1,11,texto); //escreve no lcd o valor da converso do ad0

Projeto: Leitura do sensor de Temperatura LM35 Para solidificarmos a teoria de leitura do A/D do PIC, vamos efetuar a leitura de sensor de temperatura LM35 conectado ao canal AN1 e de um trimpot conectado ao canal AN0 do PIC. O valor da converso dever ser escrito no LCD: Esquema eltrico:

Programa:
/********************************************************************* ******* Centro de Tecnologia Microgenios Programa: Diplay_7_seg_01 Placa: KIT PICGENIOS Objetivo: este programa tem por funo ler o canal AD0 e AD1 e escrever no lcd o valor de converso ********************************************************************** ********* */ char texto[16]; int leitura_an0 = 0; int leitura_an1 = 0; void main() { trise = 0; //define portb como saida trisd = 0; //define portd como saida ADCON1 = 0b00000100; //habilita canal A/D 0 e A/D1 do PIC trisa = 0b00001111; //define pinos como entrada Lcd_custom_Config(&PORTD,7,6,5,4,&PORTE,2,0,1); //inicializa lcd Lcd8_Cmd(Lcd_Clear); //apaga lcd Lcd8_Cmd(LCD_CURSOR_OFF); //desliga cursor do lcd

Lcd8_Out(1, 1, "Canal AN0: "); coluna 1 do lcd delay_ms (10); Lcd8_Out(2, 1, "Canal AN1: "); coluna 1 do lcd delay_ms (10); do {

//escreve mansagem na linha 1, //delay de 10ms //escreve mensagem na linha 2, //delay 10 milisegundos

leitura_an0 = Adc_Read(0); //le canal ad0 do PIC e salva valor na varivel leitura_an0 wordToStr(leitura_an0, texto); //converte valor da converso do ad0 para string lcd8_out(1,11,texto); //escreve no lcd o valor da converso do ad0 leitura_an1 = Adc_read(1); //l canal ad1 do PIC e salva valor na varivel leitura_an1 leitura_an1 = leitura_an1 / 2.048; //ajusta a escala de converso do sensor de temperatura wordToStr(leitura_an1, texto); //converte valor da converso do ad1 para string lcd8_out(2,11,texto); //escreve no lcd o valor da converso do ad1 }while (1); }

O o sensor de temperatura utilizado em nosso projeto o LM35 fabricado pela empresa National Semicondutores. Este circuito integrado um sensor de temperatura linear cujo valor de saida de tenso diretamente proporcional temperatura. Sua escala j calibrada em graus celsius com saida de 10mV / C no ranger minim de - 55 C a +150 C. A resoluo do A/D de nosso microcontrolador de 10 bits e em nosso programa utilizamos a tenso de referencia interna do A/D (5V).

Calculo para leitura correta do sensor de temperatura: Resoluo do PIC: Tenso de referencia (resoluo do AD - 1) = resoluo 5V (1024 - 1) = 4,8876 mV A resoluo do A/D do PIC para tenso de referencia de 5V de 4,8876mV Resoluo do sensor LM35: 10mV/C (dado fornecido pelo fabricante)

Logo teremos 10 / 4,8876 = 2,048 Em nosso programa arrendondamos o valor 2.046 para 2 para que nosso programa no ultrapasse o valor limite demo do compilador (2Kbyte).
leitura_an1 = adc_read(1); //l canal ad1 do PIC e salva valor na varivel leitura_an1 leitura_an1 = leitura_an1 / 2.048; //ajusta a escala de leitura do sensor lm35.

voltar para o topo da pagina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2007. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Canal PWM do PIC

Introduo
Os controles de potncia, inversores de freqncia, conversores para servomotor, fonte chaveadas e muitos outros circuitos utilizam a tecnologia do PWM (Pulse Width Modulation) ou Modulao de Largura de Pulso como base de seu funcionamento.

Fonte Chaveada

ServoMotores Inversores de Freqncia

PWM a abreviao de Pulse Width Modulation ou Modulao de Largura de Pulso. Para que se entenda como funciona esta tecnologia no controle de potncia, partimos de um circuito imaginrio formado por um interruptor de ao muito rpida e uma carga que deve ser controlada, conforme a figura abaixo:

Quando o interruptor est aberto no h corrente na lmpada e a potncia aplicada nula. No instante em que o interruptor fechado, a carga recebe a tenso total da fonte e a potncia aplicada mxima. Como fazer para obter uma potncia intermediria, digamos 50%, aplicada carga? Uma idia fazermos com que a chave seja aberta e fechada rapidamente de modo a ficar 50% do tempo aberta e 50% fechada. Isso significa que, em mdia, teremos metade do tempo com corrente e metade do tempo sem corrente. A potncia mdia e, portanto, a prpria tenso mdia aplicada carga neste caso 50% da tenso de entrada.

Veja que o interruptor fechado pode definir uma largura de pulso pelo tempo em que ele fica nesta condio, e um intervalo entre pulsos pelo tempo em que ele fica aberto. Os dois tempos juntos definem o perodo e, portanto, uma freqncia de controle. A relao entre o tempo em que temos o pulso e a durao de um ciclo completo de operao do interruptor nos define ainda o ciclo ativo. Variando-se a largura do pulso e tambm o intervalo de modo a termos ciclos ativos diferentes, podemos controlar a potncia mdia aplicada a uma carga. Assim, quando a largura do pulso varia de zero at o mximo, a potncia tambm varia na mesma proporo (duty cycle), conforme est indicado na figura abaixo:

Este princpio usado justamente no controle PWM: modulamos (variamos) a largura do pulso de modo a controlar o ciclo ativo do sinal aplicado a uma carga e, com isso, a potncia aplicada a ela.

Trabalhando com PWM no PIC


O microcontrolador PIC18F442 possui internamente 2 mdulos CCP (capture/Compare/PWM Module), CCP1 e CCP2. Podemos manipular com grande facilidade as instrues para gerao de sinal PWM no mikroC. Acompanhe: Os comandos para manipular o mdulo CCP1 so os seguintes:

Pwm_Init Pwm_Change_Duty Pwm_Start Pwm_Stop

Funo de Inicializao da gerao do sinal PWM:


No mikroC utilizamos a funo Pwm_Init() para informar a freqncia do sinal PWM:

//Sintaxe Pwm_Init(valor_da_freqncia) onde: valor_da freqncia: fator da freqncia em Hz do sinal PWM.

PS.: Consultar datasheet do PIC utilizado para saber a freqncia de oscilao.

Exemplo:

Pwm_Init(4000); // inicia pwm com freqncia de 4khz

Funo de duty Cycle:


A travs da funo Pwm_Change_Duty() podemos controlar o duty cycle do sinal PWM. O valor do duty cycle varia de 0 a 255, onde "0" igual a 0%, "127" igual a 50% e "255" igual a 100%. Sintaxe: Pwm_Change_Duty(valor_duty_cycle) onde: valor_duty_cycle: valor do tipo char (0 255) que determina a porcentagem do duty cycle PWM. Exemplo: Pwm_Change_Duty(192); // carrega duty cycle para 75%

Para outros valores de duty cycle calculamos atravs da formula: (Percentual * 255) /100 No caso de configurarmos o duty conforme a figura acima, devemos carregar o seguinte valor para: Duty de 10% Pwm_Change_Duty(25); // carrega valor 26 pois : (10% * 255) / 100 = 25,5 , como somente podemos colocar valores inteiros entre 0 a 255, o valor ser arrendondado para 25 Duty de 50% Pwm_Change_Duty(127); // carrega valor 127 pois : (50% * 255) / 100 = 127,50 , como somente podemos colocar valores inteiros entre 0 a 255, o valor ser arrendondado para 127 Duty de 90%

Pwm_Change_Duty(229); // carrega valor 229 pois : (90% * 255) / 100 = 229,50 , como somente podemos colocar valores inteiros entre 0 a 255, o valor ser arrendondado para 229

Funo de Start e Stop:


Atravs da funo Pwm_Start(), damos incio a gerao do sinal PWM no PIC, e atravs da funo Pwm_Stop() finalizamos a gerao do sinal Pwm. Sintaxe: Pwm_Start(); Pwm_Stop(); // inicial a gerao do sinal PWM no mdulo CCP1 do PIC // interrompe a gerao do sinal PWM no mdulo CCP1 do PIC

Nem todos os PIC possuem um segundo mdulo CCP2, para os PIC que possuem este segundo mdulo ou mais mdulos, basta acrescentar o nmero 1 ou 2 nas funes para informar o mdulo que est sendo programado: Exemplo:

Pwm1_Init Pwm1_Change_Duty Pwm1_Start Pwm1_Stop


As funes acima faz referncia ao mdulo CCP2 do PIC e possue configurao identica a funo do mdulo CCP1 estudado acima.

Exemplo de programa:
Para entendermos melhor o funcionamento da funo Pwm do mikroC, vamos estudar um exemplo de programa simples, acomanhe: Programa:

void main() { Pwm_init(5000); Pwm_Change_Duty(127); Pwm_Start(); while(1); }

No programa acima configuramos o mdulo CCP1 do PIC para trabalhar como PWM com freqncia de 5Khz e duty cycle de 50%, conforme grfico abaixo:

No qual: Freqncia = 1 / perodo --> 5Khz Duty = 50%

Segundo Programa

Vamos programar o mdulo CCP2 do PIC18F442:

Programa:

void main() { Pwm1_init(5000); Pwm1_Change_Duty(127); Pwm1_Start(); while(1); }

repare que o programa acima tem a mesma funo do programa anterior, a nica diferena que colocamos o nmero 1 nas funes para indicar que estamos trabalhando com o segundo mdulo CCP do PIC, ou seja, o mdulo CCP2.

Controlando a velocidade de uma ventoinha:

Vamos elaborar um programa em C cuja finalidade carregar na funo Pwm_change_duty() o valor lido do conversor AN0 do PIC, ou seja, iremos ler constantemente o valor do AD AN0 do PIC, tratar o valor nmerico da converso para que fique na escala de 0 a 255, pois esta a escala de 0% a 100% de duty do PWM. A sada PWM do PIC controlar a velocidade de rotao de uma ventoinha. Esquema:

Programa: /********************************************************************* ******* Centro de Tecnologia Microgenios Programa: Leitura_AD_e_PWM Placa: KIT PICGENIOS Objetivo: Controlar uma ventoinha via PWM atravs da entrada AD0. */ //**************** definio de variveis ******************************** void main() { int a = 0; ADCON1 = 0b00001001; //define varivel //reconfigura e define pinos de A/D

trisa = 255; Pwm_Init(5000); Pwm_Start(); do { a = Adc_Read(0); a = (a * 0.24); Pwm_Change_Duty(a); mdulo CCP1 pwm Delay_10us; } while (1); }

//define os pinos como saida // Inicializa mdulo PWM com 5Khz // Start PWM // rotina de loop //l canal ad0 e salva em temp_res //converte valor para o duty cycle //envia o valor lido de "a" para o //aguarda 10us

Termos como resultado o valor a seguinte forma de onda:

O programa exemplo foi compilado no mikroC e simulado no programa de simulao PROTEUS (www.labcenter.co.uk).

Voltar para o topo da pgina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C

Microgenios 1998 - 2007. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Introduo ao estudo dos TIMERS


1.0 Os Timers/Counters 1.1 TIMER0 1.2 TIMER1 1.3 TIMER2 1.4 TIMER3

Os Timers/Counters
Os timers so ferramentas internas dos microcontroladores em geral que servem para contagem de tempo, eventos, temporizao entre outras funes. O PIC18F452 possui internamente 4 TIMERS: TIMER0 TIMER1 TIMER2 TIMER3 Vamos conhecer cada um desses temporizadores:

voltar para o topo da pgina

TIMER0

O TIMER0 um temporizador/contador de 8 ou 16 bits que possuem duas funes bsicas: Contagem de eventos externos (quando a entrada de clock feita por meio do pino RA4/T0CKI; Temporizao (contagem de tempo) quando os pulsos de contagem proveniente do clock interno do PIC (o clock do sistema dividido por 4). O TIMER0 pode ser configurado para trabalhar com prescaler dedicado. O prescaler nada mais do que um contador/divisor programvel que utilizado para reduzir a freqncia do sinal de clock aplicado ao TIMER0 por um fator conhecido.

O valor do prescaler pode ser configurado a partir dos bits T0PS2, T0PS1 e T0PS0 do registrador T0CON (TIMER0 CONTROL REGISTER); O prescaler passa a ser uma importantssima ferramentas do timer, pois atravs dele conseguimos gerar tempos muito maiores. Quando o TIMER0 configurado para operar no modo de 8 bits, podemos efetuar contagens de 0 a 255 (limite da capacidade para 8 bits). Quando a contagem chega at seu valor mximo de 255, o prximo pulso acarretaria o que chamamos de "estouro de contagem", fazendo com que o valor de contagem de incio novamente a partir do 0 (zero). No caso anterior, caso tenhamos a interrupo do TIMER0 habilitada, no momento que ocorre o "estouro de contagem", seria gerado um pedido de interrupo do TIMER0. No modo 16 bits do TIMER0, seu funcionamento igual ao modo de 8 bits, porm neste cado a faixa de contagem de 0 a 65535. Os valores de iniciais de temporizao/contagem devem ser carregados nos registradores especiais intitulado de TMR0L (TIMER0 Module Low Byte Register) e TMR0H (TIMER0 Module Hight Byte Register); Quando programamos os timers para atuarem como temporizadores, estamos considerando que os pulsos que incrementam os registradores de contagem so proveniente do valor do oscilador / 4, ou seja, caso estivermos utilizando um cristal de 4MHz, iremos incrementar em uma unidade os registradores de contagem a cada 1 us, pois 4Mhz/4 = 1MHz = 1us (microsegundos).

Dica: Repare que a unidade resultante da diviso da Frequencia do oscilador / 4 (ciclo de mquina) esta em MHz ( unidade de frequncia), neste caso para sabermos o tempo (periodo), basta dividir 1 / seu valor. Ex: 1 / (Fosc / 4 )

Para um cristal de 8 MHz teremos o seguinte tempo de ciclo de mquina: 1 / (8 / 4) = 0,5 us (microsegundos).

Os Registradores relacionados ao TIMER0 so:

Figura 01 - Registrador relacionados com o TIMER0 TMR0L um registrador de contagem de 8 bits que possui a funo de armazenar a parte baixa do valor de contagem programada do TIMER0. TMR0H um registrador de contagem de 8 bits que possui a funo de armazenar a parte alta do valor de contagem programada do TIMER0. Os registradores TMR0L e TMR0H juntos formam um nico registrador de 16 bits, que nos permite uma contagem mxima de 0 a 65535. INTCON um registrador de 8 bits responsvel pela configurao do modo de operao do TIMER0. Podemos definir atravs desse registrador o valor do prescaler que desejamos acionar, o modo de operao de contagem de 8 ou 16 bits, seleo da fonte de clock (interna ou externa) para o timer, seleo de disparo do timer atravs de borda de subida ou borda de descida do clock externo no pino RA4/T0CK1.

Faa download do diagrama esquemtico do TIMER0 disponvel na informaes complementar dessa unidade.

Registradores TIMER0:

de

configurao

do

O registrador T0CON responsvel pela configurao pelo modo de operao do Timer0, de vital importncia conhecer todas as funes de seus bits.

T0CON: (TIMER0 Counter Register)


TMR0ON T08BIT
Bit7 Bit6

T0CS
Bit5

T0SE
Bit4

PSA
Bit3

T0PS2
Bit2

T0PS1
Bit1

T0PS0
Bit0

TMR0ON: Bit de controle para ligar e desligar a contagem do TIMER0; 0 - TIMER para de contagem 1 - Habilita a contagem do TIMER0 T08BIT: Bit de seleo de funcionamento do TIMER0 em 8 ou 16 bits; 0 TIMER0 configurado para funcionar como contador/temporizador em 16 bits; 1 - TIMER0 esta configurado para funcionar como contador /temporizador de 8 bits; T0CS: Bit de seleo de fonte de clock para o TIMER0; 0 - A fonte de clock proveniente do meio interno do chip 1 - A fonte de clock proveniente do pino T0CKI (meio externo) T0SE: Bit de seleo de borda (vlido somente caso a fonte de clock seja pelo meio externo ao chip) 0 - Contagem do timer ocorre por borda de subida no Pino T0CKI 1 - O incremento do timer ocorre na borda de descida no pino T0CKI /PSA: Bit de seleo da utilizao do prescaler; 1 - TIMER0 no utiliza prescaler. A cada alterao do pulso de clock, corre incremento de uma unidade nos registradores de contagem. 0 - TIMER0 utiliza prescaler. T0PS2; T0PS1; T0PS0 : Bits de seleo de fonte de prescaler

T0PS2 T0PS1 T0PS0 Prescaler 1 1 1 1 0 0 1 1 0 0 1 1 1 0 1 0 1 0 1:256 1:128 1:64 1:32 1:16 1:8

0 0

0 0

1 0

1:4 1:2

Configurao do Prescaler:
Como sabemos, atravs do prescaler conseguimos tempos maiores com os timers, para entendermos melhor sua utilizao acompanhe o exemplo abaixo: Digamos que o ciclo de mquina no PIC sej de 1us e o TIMER0 esteja configurado no modo 8 bits (contagem de 0 a 255) e sem o presacaler. O TIMER0 ira "estourar" sua contagem em 256us. Agora digamos que para o mesmo anunciado anterior, configuramos e acionamos o prescaler para 1:2. Nosso intervalo de "estouro" do TIMER0 no mais ser 256us mas sim 512us. Se ao invs de prescaler de 1:2 utilizarmos prescaler 1:32, o tempo agora ser de 256us x 32 = 8192us.

Como calcular o tempo de estouro do TIMER0?


Para calcular o tempo de "estouro" do TIMER com prescaler, utilizamos a seguinte frmula: Tempo de estouro: ciclo de mquina x prescaler x (modo 8 /16bits valor de contagem). Em que:

Ciclo de mquina: o valor da relao entre: 1 / (Fosc / 4 ), onde Fosc justamente a frequencia do cristal. Obs: modo PLL desabilitado, iremos estudar esta funo mais adiante. Prescaler : o fator de diviso programado. Podemos considerar como sendo um "redutor" de frequencia. Modo 8/16bits: o modo de contagem programado no TIMER0, para 8 bits o valor 256, e para 16 bits, o valor ser de 65535. Valor de contagem: o valor de carregagem no registrador de contagem TMR0H eTMR0L.

Exemplo: Precisamos ligar e desligar um rel a cada segundo ( um segundo ligado e um segundo desligado), estamos utilizamdo um cristal de 8Mhz, utilizaremos para isso os recursos do Temporizador Timer0, acompanhe:
T0CON = 0B10000110; //configura timer modo 16 bits, com prescaler 1:128, fonte de clock interno TMR0L = 0XF6; //carrega valores de contagem C2F6 equivale a TMR0H = 0XC2; //carrega valores de contagem

Calculo do tempo de estouro do Timer0: Tempo de estouro: 1 / (8 / 4) x 128 x (65536 49910 ) Tempo de estouro: 1.000.064 us (microsegundos) ou aproximadamente 1 segundo.

obs: o valor 49910 surgio da converso do valor em hexadecimal F6C2 para decimal

O registrador INTCON
O registrador INTCON possui diversar funes, entre elas a de habilitar algumas interrupes do PIC (veremos mais adiante no nosso curso) e de armazenar os bits de estatus de estouro do TIMER0:

INTCON (Interrupt Control)


GIE/GIEH PEIE/GIEL TMR0IE
Bit7 Bit6 Bit5

INT0IE
Bit4

RBIE
Bit3

TMR0IF
Bit2

INT0IF
Bit1

RBIF
Bit0

Iremos estudar todos esses bits mais adiante em nosso curso, pois eles tratam das configuraes das interrupes, e neste momento no importante conhecer alguns deles. Vamos apresentar somente os bits que so utilizados nos TIMERS. INTCON. GIEH = bit de acionamento da "chave geral das interrupes" e habilitao das interrupes de alta prioridade 0 - liga a chave geral das interrupes 1 - desliga a chave geral das interrupes INTCON. GIEL = bit de habilitao das interrupes de baixa prioridade 0 - TIMER0 no ocorreu estouro de contagem (overflow) 1 - TIMER0 ocorreu estouro de contagem (overflow). Este bit deve ser apagado por software. INTCON.TMR0IE = bit que habilita interrupo do TIMER0 na ocorrncia do estouro de contagem. 0 - Desabilita interrupo do TIMER0 por ocorrencia de estouro de contagem (overflow) 1 - Habilita interrupo do TIMER0 por ocorrncia de estouro de contagem (overflow). INTCON. TMR0IF = bit sinalizador de estouro do TIMER0 0 - TIMER0 no ocorreu estouro de contagem (overflow) 1 - TIMER0 ocorreu estouro de contagem (overflow). Este bit deve ser apagado por software.

Aprendendo a programar os TIMER0:


Conhecemos os registradores responsveis pela configurao do TIMER0 do PIC, agora vamos configur-los: Vamos nos recordar da frmula do TIMER0:
Tempo de estouro: ciclo de mquina x prescaler x (modo 8 /16bits valor de contagem).

Exemplo 1 : Se tivermos conectado ao nosso PIC um cristal de 8 MHz e o TIMER0 seja programado como temporizador, com prescaler de 1:4, modo 8 bits e contagem inicial em TMR0L = 0, teremos ento:
Tempo de estouro: ciclo de mquina x prescaler x (modo 8 /16bits valor de contagem). Tempo de estouro: 0,5us * 4 *(255 - 0) Tempo de estouro: 510us

Exemplo 2 : Se tivermos conectado ao nosso PIC um cristal de 8 MHz e o TIMER0 seja programado como temporizador, com prescaler de 1:256, modo 16 bits e contagem inicial em TMR0L = 0 e TMR0H = 0, teremos ento:
Tempo de estouro: ciclo de mquina x prescaler x (modo 8 /16bits valor de contagem). Tempo de estouro: 0,5us * 256 * (65536 - 0) Tempo de estouro: 8.388.608us, ou seja, 8, 388 segundos

Obs: Repare que este o tempo mximo de estouro do TIMER0 Vamos realizar mais um exemplo de programa: vamos supor que desejamos que um led conectado ao pino RB0 do PIC pisque em intervalos de 1 segundo (ligado e desligado) utilizando os recursos de temporizao do TIMER0. Cristal: 8Mhz PIC18F452 TIMER0 / MODO 16BITS Acompanhe o esquema eletrico abaixo:

Primeiramente devemos programar os TIMER0: Para este exemplo, vamos programar o TIMER0 no modo 16 bits (contagem de 0 a 65535), prescaler de 1:16, clock interno, cristal de 8Mhz e modo HSPLL desativado (multiplicador do oscilador), termos ento: tempo de estouro do TIMER0 = ciclo de mquina x prescaler x (modo 8/16 bits - valor de contagem do TIMER0) logo: 1 000 0000 = 0,5 * 16 * (65536 - X) x = 59464 Concluimos que o valor de carregagem em TMR0L e TMR0H dever ser de 59464, ou seja, TMR0L = 0X48; , TMR0H = 0XE8; (valores 59464 convertido em hexadecimal igual a E848) Exemplo:

/********************************************************* ************ Centro de tecnologia Microgenios Configurao parcial de um programa de configurao do TIMER0 ********************************************************** *************/

Comandos:
T0CON = 0b10000011; //configura temporizador 16 bits, com prescaler ativado em 1:16, clock interno TMR0L = 0x48; //carrega valores de contagem em TMR0L - registrador baixo de contagem TMR0H = 0xE8; //carrega valores de contagem em TMR0H - registrador alto de contagem

O programa abaixo tem por funo configurar o modo de trabalho do TIMER0. Repare que o registrador T0CON foi configurado da seguinte forma: TIMER0 ligado. (TMR0ON = 1) Clock interno (T0CS = 0) Modo de contagem de 16 bits (T08BIT = 0) Prescaler ligado (PSA = 0) Prescaler 1:16 (T0PS2 = 0, T0PS1 = 1, T0PS0 = 1)

Os registradores de contagem TMR0L e TMR0H inicializados com o valor 59464. Vamos realizar mais um exemplo de programa:

sero

O programa seguinte tem por objetivo alterar os estados dos leds conectados ao PORTB em intervalos de 1 segundo. Hardware: Cristal: 8 Mhz Microcontrolador: PIC18f452 Temporizador: Timer0

/********************************************************* ************ Centro de tecnologia Microgenios Placa: Kit PICGenios Programa: Pisca Pisca utilizando o TIMER0 do PIC Objetivo: Este programa tem por objetivo piscar os leds do portb em intervalo de 1 segundo (ligado e desligado) utilizando o TIMER0 do PIC. Modo programado: 16 bits, prescaler 1:128 ********************************************************** *************/ void main() { T0CON = 0b10000110; prescaler TMR0L = 0XF7; TMR0H = 0XC2; intcon.tmr0if = 0; TRISB = 0; PORTB = 0xFF; //funo principal do programa //configura timer modo 16 bits, com //carrega valores de contagem //carrega valores de contagem // PORT B configurado como sada // Initialize PORT B

do { if (intcon.tmr0if == 1) { //se o flag de estouro do TIMER0 for igual a 1, ento PORTB = ~PORTB; // inverte o estado do portb TMR0L = 0xF7; TMR0H = 0XC2; Iintcon.tmr0if = 0; // apaga flag de entouro do TIMER0 //para uma nova contagem }

} while(1); }

// loop

Calculo do tempo de estouro do timer0 tempo de estouro do TIMER0 = ciclo de mquina x prescaler x (modo 8/16 bits - valor de contagem do TIMER0) tempo de estouro = 0,5 * 128 * (65536 - 49911) Tempo de estouro = 1.000,000 us ou 1 segundo Estudo detalhado do programa:
void main() { //funo principal do programa T0CON = 0b10000011; //configura timer modo 16 bits, com prescaler 128 TMR0L = 0XF7; //carrega valores de contagem TMR0H = 0xC2; //carrega valores de contagem intcon.tmr0if = 0; // apaga flag de entouro do TIMER0

Os comandos seguinte configuram o portb como sada.


TRISB = 0; PORTB = 0xFF; // PORT B configurado como saida // Initialize PORT B

Repare que nosso TIMER0 j foi configurado e iniciou a contagem dos pulsos de ciclo de mquina. Agora precisamos monitorar o bit de estouro do TIMER0, pois no sabemos a que momento o estouro vai ocorrer, o que sabemos que vai levar 1 segundos para ocorrer o estouro, ou seja, o bit TMR0IF vai para 1. Para isso, utilizaremos o comando de tomada de deciso IF, que ter a seguinte funo: Se o bit de estouro intcon.tmr0if for igual a 1, representa que o TIMER0 estourou, e os comandos do bloco IF so executados. Toda a vez que o TIMER0 estura, ou seja, o timer chega at 1 segundos, invertido o estado do portb e reiniciado a contagem do TIMER0.
if (intcon.tmr0if == 1) { //se o flag de estouro do TIMER0 for igual a 1, ento PORTB = ~PORTB; // inverte o estado do portb TMR0L = 0XF7; //carrega valores de contagem TMR0H = 0xC2; //carrega valores de contagem intcon.tmr0if = 0; // apaga flag de entouro do TIMER0

Modo Contador do TIMER0: Vamos fazer mais um exemplo de programa utilizando o TIMER0 do PIC:

Neste novo exemplo de programa, vamos programar o TIMER0 do PIC para trabalhar como contador de pulsos externos. Neste modo, os pulsos externos, so aplicados no pino RA0/T0CK1 do PIC. Devemos contar apenas 10 pulsos externos, que neste caso, configuraremos o TIMER0 do PIC no modo 8 bits com prescaler 1:1, e os pulsos sero lidos por borda de descida. Ao completar a contagem de 10 pulsos, o led conectado ao pino RB7 do PIC dever acender para sinalizar o fim da contagem. Esquema eltrico:

Para realizar o seguinte desafio necessrio configurar os seguintes registradores do TIMER0: INTCON.TMR0IF (Bit de estouro do TIMER0) TMR0L (registrador de contagem do TIMER0) T0CON (registrador de configurao do modo de operao do TIMER0) Programa:
/********************************************************* ************

Centro de tecnologia Microgenios Placa: Kit PICGenios Programa: Pisca Pisca utilizando o contador T0CK1 do PIC Objetivo: Este programa tem por objetivo piscar os leds do portb a cada 10 pulsos gerados no pino contador RA4/T0CK1 do PIC. ********************************************************** *************/ void main() { T0CON = 0b11100000; prescaler 1:1 TRISB.f7 = 0; saida PORTB.f7 = 0; TMR0L = 246; pulsos //funo principal do programa //configura timer modo 8 bits, com // PORT B configurado como // Initializa PORT B //carrega valores de contagem de

//como somente vamos contar 10 pulsos, temos: (255 - 10 = 245) intcon.tmr0if = 0; do { if (intcon.tmr0if == 1) { //se o flag de estou for igual a 1, ento PORTB.f7 = ~PORTB.f7; // inverte o estado do pino RB0 TMR0L = 246; //recarrega valor de contagem de contagem intcon.tmr0if = 0; // Seta T0IE, apaga flag de entouro do TIMER0 //para uma nova contagem } } while(1); // loop }

Estudo detalhado do programa: Repare que o nos comandos abaixo que o registrador T0CON foi configurado como contador de pulsos externos, modo de operao do TIMER0 de 8 bits, com prescaler 1:1. O registrador de contagem TMR0L o registrador onde ser armazenado os valores de contagem dos pulsos externos, e neste caso ele foi pr configurado com o valor 246, devido a necessidade de contarmos apenas 10 pulsos. Devemos lembrar que os registradores de contagem do TIMER0 so incrementados em 1 unidade e contam para cima, neste caso, como desejamos programar o TIMER0 para que a cada 10 pulsos no pino RA0/T0CK1 seja gerado um estouro, devemos carregar em TMR0L o valor da diferena entre o valor mximo de contagem para o modo 8 bits, que 256, pelo valor da quantidade de pulsos a ser contado, que neste cado 10. Ento teremos: 256 - 10 = 246

O TIMER1:
Realizamos nas unidades passadas um estudo no muito aprofundado sobre as funes e caractersticas dos TIMERS do PIC. Agora chegou o momento de estudarmos mais profundamente os recursos e a programao dos registradores e modos de trabalho desses temporizadores e contadores. O TIMER1 pode operar como temporizador ou como contador de 16 bits, suas caractersticas so muito parecida com a do TIMER0. Dizemos que o timer est operando como temporizador quando a referncia do clock de incremento da contagem realizada pelo clock interno do PIC, e dizemos que o timer esta operando como contador quando a referncia do clock de incremento da contagem proveniente de um clock externo ao PIC. (pulso aplicado no pino RB6/T1OSO/T1CK1). Registradores de configurao do TIMER1:

Figra 01 - Registrador relacionados com o TIMER0

P1R1: um registrador onde armazenado os bits de status das interrupes e estouro dos timers. P1E1: um registrador de 8 bits onde habilitado as interrupes do PIC. TMR1L um registrador de contagem de 8 bits que possui a funo de armazenar a parte baixa do valor de contagem programada do TIMER0. TMR1H um registrador de contagem de 8 bits que possui a funo de armazenar a parte alta do valor de contagem programada do TIMER0. Os registradores TMROL e TMR0H juntos formam um nico registrador de 16 bits, que nos permite uma contagem mxima de 0 a 65535. T1CON um registrador de 8 bits responsvel pela configurao do modo de operao do TIMER1. Podemos definir atravs desse

registrador o valor do prescaler que desejamos acionar, o modo de operao de contagem de 8 ou 16 bits, seleo da fonte de clock (interna ou externa) para o timer, seleo de disparo do timer atravs de borda de subida ou borda de descida do clock externo no pino RB6/T10S0/T1CK1.

T1CON: (TIMER1 CONTROL REGISTER):

RD16
Bit7 Bit6

---

T1CKPS1
Bit5

T1CKPS0
Bit4

T10SCEN
Bit3

T1SYNC
Bit2

TMR1CS
Bit1

TMR1ON
Bit0

RD16: bit de leitura e escrita em 16bits 0 leitura e escrita em 16 bits habilitada 1 leitura e escrita em 16 bits desabilitada T1CKPS1; T1CKPS0: Bits de seleo de fonte de prescaler

T1CKPS1 T0CKPS0 Prescaler 1 1 0 0 1 0 1 0 1:8 1:4 1:2 1:1

T1OSCEN: Habilitao do oscilador externo de baixa frequencia nos pinos T1OSO e T1OSI 0 - Oscilador desligado 1 - Oscilador Ligado T1SYNC: Controle do sincronismo interno. Caso TMR1CS = 0, esse bit descartado 0 - Sincronismo ligado 1 - Sincronismo desligado TMR1CS: Bit de seleo de clock; 0 - A base de clock para o TIMER1 interna (Fosc/4); 1 - Clock externo no pino RC0/T1CK1; TMR1ON: Habilita TIMER1; 0 - TIMER1 desligado 1 - TIMER1 ligado

Obs: Bit6 no implementado, lido como "0". Abaixo o diagrama simplificado do Timer1:

Faa download do diagrama esquemtico do TIMER1 disponvel na informaes complementar dessa unidade.

O TIMER1 opera de maneira identica a do timer anterior, suas diferenas bsicas que este novo timer pode operar como temporizador para o modo Capture/Compare para o modo CCP. Foi implementado neste novo Timer a possibilidade de ligarmos um outro cristal oscilador, de forma que nos permite ligar cristais de baixa frequncia, tais como 32,768 KHz, para maiores preciso na temporizao. Obs: Este segundo cristal dever ser ligado entre os pinos RC0 e RC1 e em iptese alguma poderemos dispensar o uso do cristal oscilador principal Fosc. A figura 01 apresenta o diagrama de funcionamento do TIMER1 operando com o oscilador de baixa frequncia.

Figura 01 Abaixo segue um exemplo de ligao ( Revista Elektor / Ano 4 N 43)

Programando o TIMER1 do PIC.


Para exemplificar a utilizao do TIMER1 do PIC vamos analizar um exemplo de programa: /********************************************************* ************ Centro de tecnologia Microgenios Configurao parcial de um programa de configurao do TIMER1 ********************************************************** *************/ T1CON = 0B10110001; //liga TIMER1, prescaler 1:8, modo temporizador 16 bits. PIR1.TMR1IF = 0; //apaga flag de estouro do TIMER1 TMR1L = 0; //carrega valor de contagem baixa do TIMER1

TMR1H = 0; TIMER1

//carrega valor de contagem alta do

O programa acima configura o TIMER1 para operar em 16bits com prescaler 1:8, clock interno. Anlise detalhado do programa: Sabendo que nosso microcontrolador esta trabalhando com um cristal externo de 4MHz, vamos calcular o tempo de estouro do TIMER1:

Configurao do TIMER1: Modo de Operao: 16 bits Fonte de oscilao: Ciclo interno. Prescaler: 1:8 Tempo de estouro:, Clculo: (65535 - valor do registrador de contagem) x (1 (Fosc / 4)) x Prescaler 65535 x 1us x 8 = 524, 28 ms, ou 0.5 segundos.

Exemplo de programa:

/********************************************************* ************ Centro de tecnologia Microgenios Placa: Kit PICGenios Programa: Pisca Pisca utilizando o TIMER1 do PIC Objetivo: Este programa tem por objetivo piscar os leds do portb em intervalo de 0,5 segundo (ligado e desligado) utilizando o TIMER1 do PIC. Modo programado: 8 bits, prescaler 1:16 ********************************************************** *************/ void main() //funo principal do programa { TRISB = 0; //define portb como saida T1CON = 0B10110001; //liga TIMER1, prescaler 1:8, modo 16bits. PIR1.TMR1IF = 0; //apaga flag de estouro do TIMER1 TMR1L = 0; TIMER1 //carrega valor de contagem baixa do

TMR1H = 0; TIMER1 PORTB = 0x00;

//carrega valor de contagem alta do //reseta portb em 1, do portb de de estouro do

do { if (PIR1.TMR1IF == 1) //se flag estiver representa que houve o estouro do timer1 { PORTB = ~PORTB; //inverte o valor TMR1L = 0; //recarrega valor contagem baixa do timer1 TMR1H = 0; //recarrega valor contagem alta do timer1 PIR1.TMR1IF = 0; //resseta flag de timer1 para uma nova contagem. } } while (1); }

voltar para o topo da pgina

O TIMER2 :
O TIMER2 um timer de 8 bits com recarga automtica. Esse TIMER tem um registrador de configurao, um de contagem e outro de comparao. Ele possui um registrador de contagem de 8 bits (

0 a 255) chamado TMR2. Diferentemente dos outros timers, o TIMER2 possui um prescale e um postscaler. Os registradores especiais
responsvel pela configurao do TIMER2 so: T2CON (TIMER2 CONTROL REGISTER): Configura o setup do TIMER2; TMR2: Registrador de contagem do TIMER2 (8 bits); PR2: Registrador de comparao do TIMER2 Dizemos que o TIMER2 um timer com recarga automtica pois quando o valor carregado em PR2 igual ao de contagem TMR2, o valor de TMR2 zerado e inicia-se uma nova contagem, ou melhor dizendo, temporizao.

Os registradores relacionados com o TIMER2 so:

Atravs do registrador T2CON, podemos configurar o modo de operao do TIMER2, tais como: valor do prescale e postcale e ligar ou desligar o timer2. Faa download do diagrama esquemtico do TIMER3 disponvel na informaes complementar dessa unidade.

Registradores de configurao do TIMER2:


Registradores de configurao do TIMER2:
T2CON: (TIMER1 CONTROL REGISTER):

--Bit7

TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0


Bit6 Bit5 Bit4 Bit3

TMR2ON
Bit2

T2CKPS1
Bit1

T2CKPS0
Bit0

TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0: Bits de ajuste do postcale:

TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 Postscale

0 0 0 0 0 0 0 0 1

0 0 0 0 1 1 1 1 0

0 0 1 1 0 0 1 1 0

0 1 0 1 0 1 0 1 0

1:1 1:2 1:3 1:4 1:5 1:6 1:7 1:8 1:9

1 1 1 1 1 1 1

0 0 0 1 1 1 1

0 1 1 0 0 1 1

1 0 1 0 1 0 1

1:10 1:11 1:12 1:13 1:14 1:15 1:16

O funcionamento do postcale muito semelhante ao prescaler, sua diferena bsica est na contagem. Em vez de contar pulsos de ciclos de mquina, o postcale conta n comparaes do TIMER2 com PR2. Aps n comparaes, o flag de estouro do TIMER2 sinalizado com nvel lgico 1. TMR2ON: Habilitao do TIMER2; 0 - TIMER2 desligado 1 - TIMER 2 ligado T2CKPS1 T2CKPS0: Bits responsveis pelo ajuste de prescaler:

T2CKPS1 T2CKPS0 Prescaler 0 0 1 0 1 x 1:1 1:4 1:16 X pode ser 1 ou 0 Para exemplificar, vamos estudar um programa que tem como funo piscar um led conectado ao pino RB0 do PIC em intervalos de 1 segundo (ligado e desligado). Neste exemplo iremos utilizar o TIMER2 com ajuste de prescale e postcale para entendermos o funcionamento. Esquema eltrico:

Programa:
/********************************************************* ************ Centro de tecnologia Microgenios Configurao parcial de um programa de configurao do TIMER2 ********************************************************** *************/ T2CON = 0b01111111; //programa TIMER2 com prescaler 1:16, postcale 1:16 TMR2 = 0; //inicia contagem a partir do 0 PR2 = 0; //inicia contagem a partir do 0

Descrio detalhada do programa: Para calcularmos o tempo de estouro do TIMER2 utilizamos as seguintes contas (observe que estamos utilizando um cristal externo de 4MHz):
Tempo de estouro do TIMER2 = valor do prescale x valor do postcale x PR2 x ( 1 /(Fosc/4) )

que nos resulta: Tempo de estouro do TIMER2 = 16 x 16 x 255 x 1us = 65280us

Exemplo de Programa:
/********************************************************* ****************** Microgenios solues eletrnica Ltda Programa: Pisca Pisca utilizando o TIMER2 Compilador: MikroC Objetivo: Este programa tem por objetivo piscar o led conectado ao pino RB0 do PIC em intervalos de 1 segundo (ligado / desligado) APROXIMADAMENTE. ********************************************************** *****************/ unsigned short i; //define varivel i //************************* subrotina de inverso do led ******************* void inverte_led() { //subrotina de inverso do estado do led PORTB.f0 = ~PORTB.f0; } //************************ funo principal do programa ****************** void main() { i = 0; TRISB = 0; PORTB = 0; T2CON = 0b01111111; //programa TIMER2 com prescaler 1:16, postcale 1:16 PR2 = 200; //inicia contagem a partir do 0 while (1) { if (pir1.tmr2if == 1) //se o TIMER2 estourar os comandos sero executados { i++; //foi criado a varivel i para que somente depois de //15 estouros do TIMER2, a subrotina de inverso do //estado do led seja chamada. //a varivel i incrementada em um unidade a cada //estouro do TIMER2 if (i > 15) //caso i seja maior que 15, ento chama subrotina de { inverte_led(); //inverso dos leds i = 0; //zera novamente i para uma nova contagem } PIR1.TMR2IF = 0; //apaga o bit de sinalizao de estouro do TIMER2

//para inciar uma nova contagem } } }

O TIMER3 :
O TIMER3 um temporizador e contador de 16 bits. Possui internamente dois registradores de 8 bits, TMR3L e TMR3H, que juntos formam um registrador de 16 bits (contagem de 0 a 65535). Os registradores relacionados com o TIMER3 so:

Atravs do registrador T3CON, podemos configurar o modo de operao do TIMER3, tais como: valor do prescale , ligar ou desligar o TIMER3, seleo de clock interno ou externo (contador) e fonte do timer para o mdulo CCP do PIC.

Faa download do diagrama esquemtico do TIMER3 disponvel na informaes complementar dessa unidade. Registradores de configurao do TIMER3:
O registrador de controle do TIMER3; T3CON: (TIMER3 CONTROL REGISTER); RD16
Bit7

T3CCP2
Bit6

T3CKPS1
Bit5

T3CKPS0
Bit4

T3CCP1
Bit3

T3SYNC
Bit2

TMR3CS
Bit1

TMR3ON
Bit0

RD16: bit de leitura e escrita em 16bits 0 leitura e escrita em 16 bits habilitada 1 leitura e escrita em 16 bits desabilitada T3CCP2 T3CCP1: Habilita a fonte de timer para o mdulo CCP; T3CCP2 T3CCP1 Prescaler TIMER1 fonte de timer para os mdulos CCP TIMER1 fonte de timer para o mdulo CCP1 TIMER3 fonte de timer para o mdulo CCP2 TIMER3 fonte de timer para os mdulos CCP

T3CKPS1 T3CKPS0: bits de ajuste do prescaler do TIMER3;

T3CKPS1 T3CKPS0 Prescaler 0 0 1 1 0 1 0 1 1:1 1:2 1:4 1:8

/T3SYNC: Controle de sincronismo interno. Caso TMR3CS = 0, este bit descartado;

obs: este bit somente utilizado para trabalhar com outro cristal ligado ao T1OSO e T1OSI.
0 - Sincronismo ligado 1 - Sincronismo desligado TMR3CS: Seleo de Clock 0 - Clock Interno ( Fosc/ 4 )

1 - clock externo no pino T1CK1 TMR3ON: Habilitao do TIMER3; 0 - TIMER3 desligado 1 - TIMER3 ligado

Para exemplificar a utilizao do TIMER3, vamos programar seus registradores:

Primeiramente devemos programar os TIMER3: Para este exemplo, vamos programar o TIMER3 no modo 16 bits (contagem de 0 a 65535), prescaler de 1:8, clock interno, cristal de 4Mhz e modo HSPLL desativado (multiplicador do oscilador), termos ento: Tempo de estouro do TIMER0 = valor de contagem do TIMER0 x PRESCALER X tempo de ciclo de mquina 65535 x 8 x 1us = 524280 us, ou 0.524 segundos. Logo o tempo de estouro do TIMER3 ser a cada 0.524 segundos.

/********************************************************* ************ Centro de tecnologia Microgenios Configurao parcial de um programa de configurao do TIMER3 ********************************************************** *************/

T3CON = 1:8, modo TMR3l = TMR3H =

0b10110001; //programa TIMER3 com prescaler 16 bits, clock interno 0; //inicia contagem a partir do 0 0; //inicia contagem no modo 16 bits

Descrio detalhada do programa :

O programa abaixo tem por funo configurar o modo de trabalho do TIMER3. Repare que o registrador T3CON foi configurado da seguinte forma: TIMER3 ligado. (TMR3ON = 1) Clock interno (TMR3CS = 0) Modo temporizador em 16 bits (RD16 = 1) Prescaler 1:8 (T3CKPS1 = 0, T3CKPS0 = 1)

Os registradores de contagem dos pulsos dos clocks internos do PIC so inicializados a partir do zero. voltar para o topo da pgina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2007. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Programando o Timer0
1.0 Estudo dos Timers/Counters do PIC

O TIMER0:
Realizamos nas unidades passada um estudo no muito aprofundado sobre as funes e caracteristicas dos TIMERS do PIC. Agora chegou o momento de estudarmos mais profundamente os recursos e a programao dos registradores e modos de trabalho desses temporizadores e contadores. O TIMER0 pode operar como temporizador ou como contador. Esse perifrico do PIC pode operar em dois modos: Modo 8 bits, com contagem mxima de 0 a 255 Modo 16 bits, com contagem mxima de 0 a 65535 Dizemos que o timer esta operando como temporizador quando a referencia do clock de incremento da contagem realizada pelo clock interno do PIC, e dizemos que o timer esta operando como contador quando a referencia do clock de incrremento da contagem proveniente de um clock externo ao PIC. (pulso aplicado no pino T0CK1 Os Registradores relacionados ao TIMER0 so:

Figra 01 - Registrador relacionados com o TIMER0 TMR0L um registrador de contagem de 8 bits que possui a funo de armazenar a parte baixa do valor de contagem programada do TIMER0. TMR0H um registrador de contagem de 8 bits que possui a funo de armazenar a parte alta do valor de contagem programada do TIMER0. Os registradores TMROL e TMR0H juntos formam um nico registrador de 16 bits, que nos permite uma contagem mxima de 0 a 65535. INTCON um registrador de 8 bits responsvel pela configurao do modo de operao do TIMER0. Podemos definir atravs desse registrador o valor do prescaler que desejamos acionar, o modo de operao de contagem de 8 ou 16 bits, seleo da fonte de clock (interna ou externa) para o timer, seleo de disparo do timer atravs de borda de subida ou borda de descida do clock externo no pino RA4/T0CK1. ESTUDE O MATERIAL DA SEGUNDA UNIDADE DO CURSO PARA OBTER MAIORES INFORMAES SOBRE OS MODOS DE TRABALHO DOS TIMERS. A final como realmente funciona um TIMER? Primeiramente vamos estudar o TIMER0. Analise o diagrama do Timer0 seguinte:

Repare que os esquemas parecem com uma instalao eltrica, no qual vai habilitando ou desabilitando mdulos, de acordo com o chaveamanto definido pelo operador.

Agora vamos elaborar um desafio: Exemplo 01:


Vamos programar o TIMER0 para funcionar como temporizador programado para "estourar" sua contagem em 3 segundos. A cada estouro do TIMER0 ser alterado os estados dos leds ligado ao PORTD, e uma nova contagem de 3 segundo reiniciada. Descrio do nosso hardware:

Configuraes: Cristal: 8 Mhz Microcontrolador: PIC18F452

Vamos programar nosso TIMER0 passo a passo: Acompanhe a numerao da figura seguinte:

Numerao Funo 1 Cristal externo Chave seletora de funo: define se o 2 timer0 ir operar como temporizador ou contador PSA : Chave seletora que habilita ou desabilita a utilizao do prescaler 3 (podemos considerar prescaler como um "redutor" de tempo) 4 Escala de ajuste do prescaler Chave seletora do modo de contagem 5 do TIMER0: formato 8 bits ou formato 16 bits Registradores de contagem TMR0L e 6 TMR0H (dois registradores de 8 bits, formando 16 bits) Bit de sinalizao de estouro do 7 TIMER0 (muita ateno no uso desse bit) 8 Chave liga desliga do Timer0 Vamos inciar nosso programa
void main(){ //************ configurao do Leds ************************

trisd = 0; //define portd como saida portd = 0; //estado incial dos leds apagado //*********** configurao do Timer0 ************************ //vamos seguir a numerao //cristal de 8Mhz, ciclo de mquina: 8MHz / 4 = 2Mhz --> 1/2Mhz = 0,5us t0con.t0cs = 0; //numero2: timer0 operando como temporizador t0con.psa = 0; //numero3: prescaler ativado t0con.t0ps2 = 1; //numero4: define prescaler 1:128 t0con.t0ps1 = 1; //numero4: define prescaler 1:128 t0con.t0ps0 = 0; //numero4: define prescaler 1:128 t0con.t08bit = 0; //numero5: define contagem no modo 16 bits tmr0h = ?? ; tmr0l = ??; intcon.tmr0if = 0; //numero7: apaga flag de estouro do timer0, pois fundamental para a sinalizao do estouro t0con.tmr0on = 1; //numero8: liga timer0 while(1){ if (intcon.tmr0if == 1){ portd = ~portd; //inverte o estado do portd tmr0l = ??; tmr0h = ?? ; intcon.tmr0if = 0; //apaga flag de estouro do timer0 para uma nova contagem de tempo } } }

Calculo do tempo de estouro do timer0: Sabemos que a formula para o calculo do estouro do Timer0 : tempo de estouro = ciclo de mquina * prescaler * (modo 8/16 bits - valor de contagem inicial em TMR0L e TMR0H) logo teremos: (lembre-se que nosso objetivo gerar um pisca pisca com tempo de 3 segundos, para isso converteremos 3 segundos para escala de microsegundo: 3000000) 3.000.000us = 0,5us * 128 (65536 - valor de contagem) Logo teremos: Valor de contagem = 18661 O valor 18661 justamente o valor que devemos carregar em TMR0L e TMR0H. Para realizarmos com facilidade esta operao matemtica, basta simplesmente converter este valor decimal para hexadecima: 18661 (decimal) = 48E5 , teremos ento: TMR0L = 0XE5;

TMR0H = 0X48; Com certeza voc dever estar pensando da onde surgio o valor 1:128 do prescaler no exerccio?? Na formula de temporizao do Timer0, mais fcil encontrarmos o valor de carregagem nos registradores de contagem TMR0H e TMR0L do que o valor do prescaler, pois lembre-se que temos algumas poucas opes de valores de prescaler, que j so pr-definidas no hardware do PIC. No exerccio adotamos um valor alto do prescaler, pois nossa temporizao de 3 segundos considerado um tempo alto para quem trabalha em escalas de us segundos. pronto, nosso programa final esta pronto, basta compilarmos e visualizarmos seu funcionamento no kit de desenvolvimento. Programa Final:
void main(){ //************ configurao do Leds ************************ trisd = 0; //define portd como saida portd = 0; //estado incial dos leds apagado //*********** configurao do Timer0 ************************ //vamos seguir a numerao //numero1: cristal de 8Mhz, ciclo de mquina: 8MHz / 4 = 2Mhz --> 1/2Mhz = 0,5us t0con.t0cs = 0; //numero2: timer0 operando como temporizador t0con.psa = 0; //numero3: prescaler ativado t0con.t0ps2 = 1; //numero4: define prescaler 1:128 t0con.t0ps1 = 1; //numero4: define prescaler 1:128 t0con.t0ps0 = 0; //numero4: define prescaler 1:128 t0con.t08bit = 0; //numero5: define contagem no modo 16 bits tmr0l = 0xe5; tmr0h = 0x48 ; //carrega o valor baixo do numero 18661 //carrega o valor alto do nmero 18661

intcon.tmr0if = 0; //numero7: apaga flag de estouro do timer0, pois fundamental para a sinalizao do estouro t0con.tmr0on = 1; //numero8: liga timer0 while(1){ if (intcon.tmr0if == 1){ //monitorando estado do flag de estouro do timer0 portd = ~portd; //inverte o estado do portd tmr0l = 0xe5; //carrega o valor baixo do numero 18661 tmr0h = 0x48 ; //carrega o valor alto do nmero 18661 intcon.tmr0if = 0; //apaga flag de estouro do timer0 para uma nova contagem de tempo } } }

Dica: Refaa o programa acima criando um pisca pisca com temporizao de 5 segundos (ligado e desligado).

Exemplo 02:

Vamos elaborar um programa de varredura de teclado utilizando os recursos de temporizao do Timer0. Neste novo exemplo, iremos realizar um programa que ir ler os estados de 2 teclas ligada ao PIC a cada 20ms. Enquando nosso timer0 permanece incrementando sua contagem, ficaremos alternando o estado de um led para simbolizar o funcionamento do programa. Nosso hardware:

Configuraes: Cristal: 8 Mhz Microcontrolador: PIC18F452

Esboo do programa: Calculo do tempo de estouro TIMER0: tempo de estouro = ciclo de mquina * prescaler * (modo 8/16 bits - valor de contagem inicial em TMR0L e TMR0H)
Logo: (lembre-se que nosso tempo desejado agora de 20ms, ou seja, 20 000us

20.000us = 0,5us * 16 * (65536 - valor de contagem) portanto: valor de contagem = 63036

O valor 63036 justamente o valor que devemos carregar em TMR0L e TMR0H. Para realizarmos com facilidade esta operao matemtica, basta simplesmente converter este valor decimal para hexadecima: 63036 (decimal) = F63C , teremos ento: TMR0L = 0X3C; TMR0H = 0XF6;

Programa:
//********************** rotina de varredura do teclado ************************************** void varredura_teclas(){ if (portb.f0 == 0 ){ portb.f7 = 1; } if (portb.f1 == 0 ){ portb.f7 = 0; } portb.f6 = ~portb.f6; led rb6 //verifica se tecla rb0 foi pressionada

//verifica se tecla rb1 foi pressionada

//fica constantemente alterando o estado do //esta alterao ocorre a cada 20ms

tmr0l = 0x3c; //carrega o valor baixo do numero 18661 tmr0h = 0xf6; //carrega o valor alto do nmero 18661 intcon.tmr0if = 0; //apaga flag de estouro do timer0 para uma nova contagem de tempo } //********************** programa principal***************************************************** void main(){ //************ trisb.f0 = trisb.f1 = trisb.f6 = trisb.f7 = configurao do Leds ************************ 1; //define portb.rb0 como entrada 1; //define portb.rb1 como entrada 0; //define portb.rb6 como sada 0; //define portb.rb7 como sada

portb.f6 = 0; //apaga led rb6 portb.f7 = 0; //apaga led rb7 //*********** configurao do Timer0 ************************ //vamos seguir a numerao //numero1: cristal de 8Mhz, ciclo de mquina: 8MHz

/ 4 = 2Mhz --> 1/2Mhz = 0,5us t0con.t0cs = 0; //numero2: timer0 operando como temporizador t0con.psa = 0; //numero3: prescaler ativado t0con.t0ps2 = 0; //numero4: define prescaler 1:16 t0con.t0ps1 = 1; //numero4: define prescaler 1:16 t0con.t0ps0 = 1; //numero4: define prescaler 1:16 t0con.t08bit = 0; //numero5: define contagem no modo 16 bits tmr0l = 0x3c; tmr0h = 0xf6 ; //carrega o valor baixo do numero 63036 //carrega o valor alto do nmero 63036

intcon.tmr0if = 0; //numero7: apaga flag de estouro do timer0, pois fundamental para a sinalizao do estouro t0con.tmr0on = 1; //numero8: liga timer0 while(1){ if (intcon.tmr0if == 1) varredura_teclas(); } }

Obs: Podemos substituir o seguinte trecho do nosso programa por uma simples linha de cdigo:
t0con.t0cs = 0; //numero2: timer0 operando como temporizador t0con.psa = 0; //numero3: prescaler ativado t0con.t0ps2 = 0; //numero4: define prescaler 1:16 t0con.t0ps1 = 1; //numero4: define prescaler 1:16 t0con.t0ps0 = 1; //numero4: define prescaler 1:16 t0con.t08bit = 0; //numero5: define contagem no modo 16 bits

e
t0con.tmr0on = 1; //numero8: liga timer0

por: t0con = 0b10000011;

Desafio: Faa voc mesmo um programa de varredura de teclado operando o timer0 com tempo de varredura de 80ms.

voltar para o topo da pagina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2008. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Exerccios resolvidos
1.0 Exerccio 01 1.1 Exerccio 02 1.2 Exerccio 03

Os exerccios abaixo so baseados no esquema eltrico seguinte:

Exerccio 01 Programando o TIMER0 do PIC: Vamos gerar um pisca pisca com intervalo de 1 segundo ligado e 1 segundo desligado: Nosso hardware: Cristal: 8 Mhz Microcontrolador: PIC18F452

Clculo do tempo de estouro do timer0: Tempo de estouro do TIMER0 = ciclo de mquina * prescaler * ( modo 8 /16 bits - valor de contagem TMR0H e TMR0L) logo: Tempo de estouro do TIMER0 = 0,5 * 128 * (65536 - 49911) 1.000.000us = 0,5 * 128 * (65536 - valor de contagem) portanto: valor de contagem = 49911

O valor 49911 justamente o valor que devemos carregar em TMR0L e TMR0H. Para realizarmos com facilidade esta operao matemtica, basta simplesmente converter este valor decimal para hexadecima: 49911 (decimal) = C2F7 , teremos ento: TMR0L = 0XF7; TMR0H = 0XC2;

Programa:
/********************************************************************* Centro de tecnologia Microgenios Placa: Kit PICGenios Programa: Pisca Pisca utilizando o TIMER0 do PIC Objetivo: Este programa tem por objetivo piscar os leds do portb em intervalo de 1 segundo (ligado e desligado) utilizando o TIMER0 do PIC. Modo programado: 16 bits, prescaler 1:128 cristal 8mhz kitpicgenios pic18f ********************************************************************** */ void main() { //funo principal do programa T0CON = 0b10000110; //configura timer modo 16 bits, com prescaler 1:128 TMR0L = 0xF7; //carrega valores de contagem TMR0H = 0xC2; //carrega valores de contagem TRISD = 0; // PORTD como saida PORTD = 0xFF; // Inicializa PORTD com 255 intcon.tmr0if = 0; // apaga flag de estouro do TIMER0 do { if (intcon.tmr0if == 1) { //se o flag de estouro do TIMER0 for igual a 1, ento PORTD = ~PORTD; // inverte o estado do portD TMR0L = 0xF7; //parte baixa do valor de contagem TMR0H = 0xC2; //parte balta do valor de contagem intcon.tmr0if = 0; // apaga flag de entouro do TIMER0 //para uma nova contagem } } while(1); // loop }

voltar para o topo da pagina Exerccio 02:


Vamos programar o TIMER0 para gerar um pisca pisca com intervalo de 1 minuto ligado, 1 minuto desligado. Para realizar este exerccio, utilizaremos boa parte do programa do exerccio anterior. Repare que no programa anterior, programamos o TIMER0 para "estourar" a cada segundo, desta forma basta ento forar que 60 "estouro" do TIMER0 para que venhamos alterar o estado dos leds.

1 segundo * 60 ciclos = 60 segundos

Nosso hardware: Cristal: 8 Mhz Microcontrolador: PIC18F452


Acompanhe o programa: /********************************************************************* Centro de tecnologia Microgenios Placa: Kit PICGenios Programa: Pisca Pisca utilizando o TIMER0 do PIC Objetivo: Este programa tem por objetivo piscar os leds do portb em intervalo de 1 minuto (ligado e desligado) utilizando o TIMER0 do PIC. Modo programado: 16 bits, prescaler 1:128 cristal: 8mhz kit picgenios pic18f ********************************************************************** */ void main() { //funo principal do programa unsigned char a = 0; //define varivel "a" como byte sem sinalizao T0CON = 0b10000110; //configura timer modo 16 bits, com prescaler 1:128 TMR0L = 0xF7; //carrega valores de contagem TMR0H = 0xC2; //carrega valores de contagem TRISB = 0; // PORTB is output PORTB = 0xFF; // Initialize PORTB do { if (intcon.tmr0if == 1) { //se o flag de estouro do TIMER0 for igual a 1, ento a++; //incrementa uma unidade em "a" if (a == 30){ //somente quando a varivel "a" for igual a 30 o portb ser invertido PORTB = ~PORTB; // inverte o estado do portb a = 0; } //zera a para uma nova temporizao TMR0L = 0xF7; //carrega valores de contagem TMR0H = 0xC2; //carrega valores de contagem intcon.tmr0if = 0; //apaga flag de estouro timer0 } } while(1); // loop } Clculo do tempo de estouro do timer0: Tempo de estouro do TIMER0 = ciclo de mquina * prescaler * ( modo 8 /16 bits - valor de contagem TMR0H e TMR0L) logo: Tempo de estouro do TIMER0 = 0,5 * 128 * (65536 - 49911) 1.000.000us = 0,5 * 128 * (65536 - valor de contagem)

portanto: valor de contagem = 49911

O valor 49911 justamente o valor que devemos carregar em TMR0L e TMR0H. Para realizarmos com facilidade esta operao matemtica, basta simplesmente converter este valor decimal para hexadecima: 49911 (decimal) = C2F7 , teremos ento: TMR0L = 0XF7; TMR0H = 0XC2; Agora basta repetir o ciclo por 60 vezes para que altere os estados dos leds:
if (intcon.tmr0if == 1) { //se o flag de estouro do TIMER0 for igual a 1, ento a++; //incrementa uma unidade em "a" if (a == 60){ //somente quando a varivel "a" for igual a 30 o portb ser invertido PORTB = ~PORTB; // inverte o estado do portb a = 0; } //zera a para uma nova temporizao TMR0L = 0xF7; //carrega valores de contagem TMR0H = 0xC2; //carrega valores de contagem intcon.tmr0if = 0; //apaga flag de estouro timer0 }

repare que criamos e incrementamos uma varivel 'a' a cada estouro do TIMER0. Quando esta varivel assumir o valor 60 representa que nosso ciclo de estouro chegou ao final (1 segundo) e os leds so invertidos seus estados. voltar para o topo da pagina

Exerccio 03:
Vamos programar o TIMER0 para gerar um pisca pisca com intervalo de 1 hora ligado, 1 hora desligado.

Nosso hardware: Cristal: 8 Mhz Microcontrolador: PIC18F452


Acompanhe o programa: /********************************************************************* Centro de tecnologia Microgenios Placa: Kit PICGenios Programa: Pisca Pisca utilizando o TIMER0 do PIC Objetivo: Este programa tem por objetivo piscar os leds do portb em intervalo de 1 HORA (ligado e desligado) utilizando o TIMER0 do PIC. Modo programado: 16 bits, prescaler 1:256 cristal: 8mhz

********************************************************************** */ void main() { int a = 0; T0CON = 0b10000111; 1:256 TMR0L = 0xdc; TMR0H = 0x0B; TRISB = 0; PORTB = 0xFF; //funo principal do programa //configura timer modo 16 bits, com prescaler //carrega valores de contagem //carrega valores de contagem // PORTB is output // Initialize PORTB

do { if (intcon.tmr0if == 1) { //se o flag de estouro do TIMER0 for igual a 1, ento a++; //incrementa uma unidade em "a" intcon.tmr0if = 0; //apaga flag de estouro do timer0 para uma nova contagem TMR0L = 0xdc; //carrega valor de contagem do timer0 TMR0H = 0x0B; //carrega valor de contagem do timer0 if (a == 450){ //somente quando a varivel "a" for igual a 450 o portb ser invertido PORTB = ~PORTB; // inverte o estado do portb a = 0; } //zera a para uma nova temporizao } } while(1); // loop } O funcionamento o mesmo dos programas anteriores, a nica diferena que agora o TIMER0 foi programado como temporizador de 8 segundos. Sabendo que 1 hora equivale a 3600 segundos, logo temos: 3600 / 8 = 450 ciclos de repetio de estouro do TIMER0 Na unidade seguinte estudaremos outros TIMERS/COUNTERS e as interrupes.

voltar para o topo da pagina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2007. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc

umento

Exerccios resolvidos
1.0 Exerccio 01 1.1 Exerccio 02 1.2 Exerccio 03 1.3 Exerccio 04 1.4 Exerccio 05 1.5 Exerccio 06 1.6 Exerccio 07

Vamos colocar em prtica as funes de tratamento dos displays LCD do compilador mikroC. Baseado nos esquemas eletrnicos apresentado, vamos configurar nosso display lcd.

Exerccio 01:
De acordo com o esquema eltrico abaixo, configure o LCD da seguinte maneira: Cursor desligado Mensagem:

Maqu i na L i gada

Esquema eltrico:

Figura 01 - Ligao do display LCD

Programa: /********************************************************************* ******* Centro de Tecnologia Microgenios Programa: acionamento LCD modo 8 bits ********************************************************************** ********* */ void main() { Lcd8_Config(&PORTC,&PORTB,2,1,0,7,6,5,4,3,2,1,0); //inicializa lcd modo 8 bits Lcd8_Cmd(Lcd_Clear); //apaga lcd Lcd8_Cmd(LCD_CURSOR_OFF); //desliga cursor do lcd Lcd8_Out(1, 1, "Maquina Ligada"); //escreve mansagem na linha 1, coluna 1 do lcd while (1); }

No modo o bits

Exerccio 02:
De acordo com o esquema eltrico ANTERIOR, configure o LCD da seguinte maneira: Cursor desligado Mensagem:

Maqu i n a L i gada

Programa:

/********************************************************************* ******* Centro de Tecnologia Microgenios Programa: acionamento LCD modo 8 bits ********************************************************************** ********* */ void main() { Lcd8_Config(&PORTC,&PORTB,2,1,0,7,6,5,4,3,2,1,0); //inicializa lcd modo 8 bits Lcd8_Cmd(Lcd_Clear); //apaga lcd Lcd8_Cmd(LCD_CURSOR_OFF); //desliga cursor do lcd Lcd8_Out(1, 1, "Maquina"); //escreve mansagem na linha 1, coluna 1 do lcd Lcd8_Out(2, 9, "Ligada"); //escreve mansagem na linha 9, coluna 2 do lcd while (1); }

voltar para o topo da pagina

Exerccio 03:

vamos configurar abaixo o LCD para operar no modo 4 bits. Programa o LCD do esquema eltrico abaixo de forma que seu configurao seja:

Cursor ligado e piscante: Mensagem:

P ROGRA MAC AO EM C PA R A P I C 1 8 F
Esquema eltrico:

Programa:

/********************************************************************* ***** Centro de tecnologia Microgenios Programa exemplo: LCD_modo_4bits Perceba que neste modo 4 bits, somente 1 port do PIC controla todo o diaplay LCD ********************************************************************** **** */ void main() {

Lcd_Config(&PORTB,3,1,2,7,6,5,4); //configura e inicializa LCD no modo 4 bits Lcd_Cmd(Lcd_CLEAR); // apaga display Lcd_Cmd(Lcd_BLINK_CURSOR_ON); // torna cursor piscante Lcd_Out(1, 1, "PROGRAMACAO EM C"); // escreve na primeira linha, primeira coluna do LCD Lcd_Out(2, 1, "PARA PIC18F"); // escreve na primeira linha, segunda coluna do LCD while(1); }

Configurao dos pinos do LCD

lcd_config(&port_controle/dados, RS, EN, RW, D7, D6, D5, D4 );

Simulao no PROTEUS:

voltar para o topo da pagina

Exerccio 04:
vamos configurar abaixo o LCD para operar no modo 4 bits. Programa o LCD do esquema eltrico abaixo de forma que seu configurao seja: Cursor desligado : Mensagem:

# # # L C D 1 6X 2 ### ALFA NUM ER I CO


Esquema eltrico:

Programa:

/********************************************************************* ***** Centro de tecnologia Microgenios Programa exemplo: LCD_modo_4bits Perceba que neste outro modo 4 bits, 2 ports do PIC participam para controle do LCD ********************************************************************** **** */ void main() {

ADCON1 = 6; TRISA = 0;

//define pinos do porta e porte como I/O //programa porta como saida

Lcd_custom_Config(&PORTB,7,6,5,4,&PORTA,2,1,0); //configura e inicializa LCD no modo 4 bits Lcd_Custom_Cmd(Lcd_CLEAR); // apaga display Lcd_Custom_Cmd(Lcd_CURSOR_OFF); //desliga cursor do lcd Lcd_custom_Out(1, 1, "### LCD 16X2 ###"); // escreve na primeira linha, primeira coluna do LCD Lcd_Custom_Out(2, 1, "ALFANUMERICO"); // escreve na primeira linha, segunda coluna do LCD while(1); }

Configurao dos pinos do LCD

lcd_config(&port_dados, D7, D6, D5, D4, &port_controle, RS, RW, EN ); Simulao no PROTEUS:

Exerccio 05:

Apartir de agora iremos trabalhar com display LCD e teclado juntos. O programa seguinte tem por objetivo incrementar uma varivel chamada contador enquanto a tecla RB0 (S1) estiver pressionada e decrementar esta mesma varivel quando a tecla RB1 (S2) estiver pressionada. O valor dever ser monitorado atravs do display LCD 16x2, programado no modo 8 bits. Dados do projeto: LCD modo 8 bits Microcontrolador PIC18F452 Kit PICgenios PIC18F - Mdulo Profissional Cristal: 8MHz Esquema eltrico:

Programa:
/********************************************************************* ***** Centro de tecnologia Microgenios Programa exemplo: LCD_modo_8bits_01.c Este programa tem por objetivo escrever no LCD o valor de incremento e decremento da varivel contador. Cristal: 8Mhz Kit PICgenios PIC18F Compilador MikroC ********************************************************************** **** */ void main() { char contador = 0; char texto[10]; ADCON1 = 6; geral TRISE = 0; TRISD = 0; trisb.f0 = 1; trisb.f1 = 1; //programa principal //define varivel contador do tipo char //define vetor texto // programa pinos de A/D como I/O de uso // programa // programa //configura //configura porte portD tecla tecla como saida como saida RB0 como entrada RB1 como entrada

Lcd8_Config(&porte, &portd,2,1,4,7,6,5,4,3,2,1,0); //configura e inicializa LCD no modo 8 bits Lcd8_Cmd(Lcd_CLEAR); // apaga display Lcd8_Cmd(Lcd_CURSOR_OFF); // desliga cursor Lcd8_Out(1, 1, "Exemplo"); // escreve texto "Programa LCD" na primeira linha, quarta coluna do LCD delay_ms(1000); Lcd_custom_Out(2, 1, "Painel LCD"); // escreve texto "Programa

LCD" na segunda linha, primeira coluna do LCD while(1){ if (portb.f0 == 0){ //se a tecla RB0 for pressionada ... contador++; //incrementa contador wordToStr(contador, texto); //converte valor numrico de contador para string e salva o resultado em texto Delay_ms(200); Lcd8_Out(2, 12,texto); // escreve varivel texto na 2 linha, 12 coluna do LCD } else if (portb.f1 == 0 ) { //seno, se a tecla RB1 for pressionada contador--; //decrementa contador wordToStr(contador, texto); //converte valor numrico de contador para string e salva o resultado em texto Delay_ms(200); Lcd8_Out(2, 12,texto); // escreve varivel texto na 2 linha, 12 coluna do LCD } }while(1); }

Podemos utilzar as seguintes funes de converso numrica <-> string no MikroC: ByteToStr ShortToStr WordToStr IntToStr LongToStr FloatToStr Substitua os cdigos acima por uma das funes acima e veja o resultado.

Exerccio 06: Nosso prximo programa exemplo, tem por objetivo modificar o programa anterior (Exerccio 05) de forma que o incremento do teclado somente ocorra quando o operador pressionar e soltar a tecla. Repare no programa anterior que enquanto estivermos pressionando a tecla, a varivel contador ser incrementada ou decrementada (dependendo da tecla pressionada).
Dados do projeto: LCD modo 4 bits Microcontrolador PIC18F452 Kit PICgenios PIC18F - Mdulo Profissional Cristal: 8MHz

Esquema eltrico:

Programa:
/********************************************************************* ***** Centro de tecnologia Microgenios Programa exemplo: LCD_modo_4bits_01.c Este programa tem por objetivo escrever o valor da varivel contador no LCD Tecla RB0 incrementar 1 unidade em contador. Tecla RB1 decrementar 1 unidade em contador. Cursor desligado ********************************************************************** *****/ //******** cabealho do programa ************************************ char estado_antigo, estado_antigo1; char contador = 0; char texto[10]; // ********************* Programa principal ******************************* void main() { ADCON1 = 6; geral TRISE = 0; TRISD = 0; trisb.f0 = 1; trisb.f1 = 1; //programa pinos de A/D como I/O de uso //programa porte como saida //programa portD como saida //define pinos RB0 como entrada (tecla 0) //define pinos RB1 como entrada (tecla 1)

Lcd_custom_Config(&PORTD,7,6,5,4,&PORTE,2,4,1); //configura e inicializa LCD no modo 4 bits Lcd_custom_Cmd(Lcd_CLEAR); // apaga display Lcd_custom_Cmd(Lcd_CURSOR_OFF); // desliga cursor Lcd_custom_Out(1, 1, "Exemplo"); // escreve texto "Programa LCD" na 1 linha, 1coluna do LCD delay_ms(1000); Lcd_custom_Out(2, 1, "Painel LCD"); // escreve texto "Programa

LCD" na 2 linha, 1 coluna do LCD while(1){ // *************** bloco de programa para incremento ********************************** if (button(&portb, 0, 30, 0)) estado_antigo1 =1; // se tecla RB0 for pressionada altera o valor da varivel if (button(&portb, 0, 30, 1)&& estado_antigo1){ //se tecla RB0 estiver solta e estado_antigo == 1 ento... contador++; //incrementa contador shortToStr(contador, texto); //converte valor da varivel contador para string e salva em Texto Delay_ms(200); Lcd_custom_Out(2, 12,texto); // escreve varivel texto na 2 linha, 12 coluna do LCD Lcd_Custom_Chr_CP('%'); //escreve na possio do cursor o simbolo de % Porcentagem estado_antigo1 = 0; //zera varivel estado_antigo1 } else // *************** bloco de programa para decremento ********************************** if (button(&portb, 1, 30, 0)) estado_antigo =1; if (button(&portb, 1, 30, 1)&& estado_antigo){ contador--; shortToStr(contador, texto); //converte valor da converso do ad0 para string Delay_ms(200); Lcd_custom_Out(2, 12,texto); // escreve varivel texto na 2 linha, 10 coluna do LCD Lcd_Custom_Chr_CP('%'); estado_antigo = 0; } } while(1); }

Exerccio 07: Vamos programar agora nosso display LCD sem auxilio de nenhuma funo pronta do MikroC. Em alguns momentos, iremos nos deparar com situaoes em que nosso display LCD no esto conectados diretamente aos pinos fsicos do LCD, para esses casos, temos que nos recorrer a programao um pouco mais trabalhosa. Acompanhe:
Dados do projeto: LCD modo 8 bits Microcontrolador PIC18F452 Kit PICgenios PIC18F - Mdulo Profissional Cristal: 8MHz

O programa tem por objetivo escrever duas simples mensagem no display LCD no modo 8 bits, conforme esquema do exerccio 05.

Nosso Programa:
#define CD porte.re2 //Ligado ao pino CD do display (seleo comando/dado) #define CS porte.re1 //Ligado ao pino CS do display (habilitao) //Rotina para aguardar tempo proporcional ao valor passado como argumento void delay (unsigned char tempo) { for(;tempo!=0;tempo--); } //Rotina para enviar byte ao display //Argumentos: d-> Byte a ser enviado // s-> em 0 indica comando, e em 1 indica dado void send(unsigned char d, char s) { //Coloca o byte na P1 Portd = d; //Configura o pino CD do display indicando se o byte a ser enviado //ser comando(0) ou dado(1) if (s==0) CD=0; else CD=1; //Borda de descida em CS, para forar leitura do byte CS=1; CS=0; //Aguarda algum tempo, esperando o display porcessar o byte recebido delay(20); //Caso o byte enviado seja um comando de "Limpar Display" ou "Home de cursor" //aguarda mais tempo. Estes comandos so mais demorados... if((s==0)&&(d<5)) delay(100); } //Rotina de inicializao do Display void initlcd() { //Configura display em modo 8bits, 2 linhas e fonte 5x7 dots send(0x39,0); //Configura auto-incremento da posio do cursor para a direita send(0x06,0); //Liga display, e inibe exibio do cursor send(0x0c,0); //Limpa contedo da memria do display send(0x01,0); } //Rotina para escrita de uma string no display void write(char *c)

{ //Enquanto o caractere apontado por c no for nulo (final da string), //Percorre a string enviando caracteres para o display for(;*c!=0;c++) send(*c,1); } //Programa principal void main () { trisd = 0; //define portd como saida trise = 0; //define porte como sada adcon1 = 6;//configura todos os pinos que so A/D como I/O digital trisb.f0 = 1; //configura pino RB0 como entrada de dados trisb.f1 = 1; //configura pino RB1 como entrada de dados //inicializa display initlcd(); //loop inifinito, o uC executar este trecho do cdigo indefinidamente while(1){ //Posiciona cursor na primeira posio, da primeira linha send(0x80,0); //Escreve string write("Programa LCD"); //Posiciona cursor na primeira posio, da segunda linha send(0xc0,0); //Escreve string write("Sem a funcao LCD "); //Agurada algum tempo delay(100); } }

voltar para o topo da pagina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programao em C Microgenios 1998 - 2007. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br