Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila Curso Pic Microgenios C
Apostila Curso Pic Microgenios C
umento
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.
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.
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.
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.
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.
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:
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?
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.
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++.
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.
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:
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.
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
Equipamentos portteis
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:
Equipamentos Eletrodomsticos
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
Aplicaes reais com Comunicao Serial RS232 e RS485 Supervisrios Industriais Comunicao com computadores PC Comunicao com outras mquinas
Veremos tambm como ler e interpretar valores analgicos vindo de sensores de temperatua (LM35) utilizando os recurso da linguagem C.
Sensores de proximidade
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.
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
umento
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.
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.
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
umento
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
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.
Pino (DIP)
Funo
Tipo
Descrio
/MCLR/VPP
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
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
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.
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.
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.
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
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:
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
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.
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:
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:
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.
Oscilador externo RC, com RA6 configurado como pino de saida de clock;
Oscilador do tipo EC, utilizando o pino RA6 como saida de clock (Fosc/4);
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.
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 :
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
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
Microgenios 1998 - 2007. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br
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
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:
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
2 3 4 5 6
do do do do do
o o o o o
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
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 }
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 }
PORTB
O PORTB, tal qual o PORTA, implementa diversas outras funes multiplexadas aos seus pinos, acompanhe:
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.
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
PORTD
O PORTD, tal qual o PORTA, PORTB e PORTC implementa diversas outras funes multiplexadas aos seus pinos, acompanhe:
20 21 22 27 28 29 30
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.
PORTE
O PORTE, tal qual as outras portas, implementa diversas outras funes multiplexadas aos seus pinos, acompanhe:
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.
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
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:
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.
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.
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.
Figura 04
Para acion-lo, digite as primeiras letras e pressione CTRL + SPACE que aparecer uma janela informando os comandos associados s letras digitadas.
Para acion-lo, basta pressionar as teclas CTRL + SHIFT + SPACE. voltar para o topo da pgina
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.
Figura 06
Project Setup
Em Project Setup podemos alterar as configuraes dos projetos criado no mikroC. Para acess-lo pressione Project > Edit Project.
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.
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 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.
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 com maiores detalhes os endereos, tamanho das rotinas compiladas do projeto.
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
umento
Criao de um projeto
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); }
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
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
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 */
//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 } }
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 */
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 ;.
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.
//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
//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
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
- - 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; ?
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
Representao binria:
portb = 0b00100110;
Representao hexadecimal:
portb = 0x26;
Representao octal:
portb = 046;
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
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; }
{
/* 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:
Neste trecho do programas definido o cabealho do programa, e nele foi declarado as varivel globais do programa.
Dicas:
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.
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
umento
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
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
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
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().
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
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
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
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
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
// //
// 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
Este bloco no obrigatrio, mas sempre importante colocarmos em nosso programa pois trata-se da apresentao do funcionamento e dados do projeto:
// //
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
// //
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.
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).
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:
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;
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).
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
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:
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
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;
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;
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
umento
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;
}
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.
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;
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.
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
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:
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 } }
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.
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; }
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. }
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.
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
umento
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);
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
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.
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.
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. */
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
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() {
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:
//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.
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
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.
Exerccio 2:
Qual o resultado da varivel "a" aps a seguinte expresso ? a = 25 & 12; Resposta: 25 = 000011001 & 12 = 000001100
________________ 00001000 A=8
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.
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.
Exerccio 5:
Analise Qual dos dois comandos If executar a instruo portb = 0? Explique o porqu?
Resposta:
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.
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.
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
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
umento
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:
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.
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
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
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
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
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.
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
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:
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); }
//*********** 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.
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.
/*********************** 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};
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); } }
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
umento
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
Registrador ADCON1:
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.
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); }
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
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
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.
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
umento
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
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.
Exemplo:
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
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:
Exemplo de programa:
Para entendermos melhor o funcionamento da funo Pwm do mikroC, vamos estudar um exemplo de programa simples, acomanhe: Programa:
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:
Segundo Programa
Programa:
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.
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
O programa exemplo foi compilado no mikroC e simulado no programa de simulao PROTEUS (www.labcenter.co.uk).
Microgenios 1998 - 2007. Todos os direitos reservados. proibido cpia parcial ou integral desse material sem prvio aviso. Maiores informaes: suporte@microgenios.com.br
umento
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:
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).
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.
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.
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:
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.
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
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:
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.
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
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.
TMR1H = 0; TIMER1
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
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); }
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.
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.
--Bit7
TMR2ON
Bit2
T2CKPS1
Bit1
T2CKPS0
Bit0
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 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
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) )
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
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
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
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 ********************************************************** *************/
0b10110001; //programa TIMER3 com prescaler 16 bits, clock interno 0; //inicia contagem a partir do 0 0; //inicia contagem no modo 16 bits
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
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.
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:
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
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
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
Desafio: Faa voc mesmo um programa de varredura de teclado operando o timer0 com tempo de varredura de 80ms.
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
umento
Exerccios resolvidos
1.0 Exerccio 01 1.1 Exerccio 02 1.2 Exerccio 03
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 }
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.
********************************************************************** */ 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.
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
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:
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); }
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:
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); }
Simulao no PROTEUS:
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:
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); }
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); } }
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