Você está na página 1de 33

MICROCONTROLADORES PIC PROGRAMAO EM LINGUAGEM C

HANDS ON!

O QUE UM MICROCONTROLADOR?
O microcontrolador PIC um componente eletrnico fabricado pela MICROCHIP, capaz de ser programado para realizar operaes l gicas e aritmticas, interagindo com

perifricos !leds, botes, sensores ou at outro PIC"# $este fato %em o nome PIC !Peripheral Integrated Controller, ou controlador integrado de perifricos"# &m microcontrolador !uC", diferentemente de um microprocessador, possue mem ria %ol'til !R(M" e n)o %ol'til !**PROM", alm de outros perifricos internos, o +ue o torna bastante ,til# *ste capaz de operar independente de mem rias e-ternas, alm de poder ser programado em linguagem de alto n.%el, como a linguagem C#

ESTRUTURA BSICA DO PIC


/esta apostila ser)o abordados os modelos PIC16F628A, e PIC16F876A, pois estes est)o inclusos em uma boa gama de poss.%eis solues# (pesar da estrutura a+ui mencionada tratar destes espec.ficos modelos, esta descre%e a grande parte dos microcontroladores# MEM RIA FLASH! 0 a mem ria em +ue ser' guardado o programa propriamente dito, no formato de 1linguagem de m'+uina2# 3oi desen%ol%ida na dcada de 45 pela 6os7iba e do tipo **PROM, porm se assemel7a com a R(M, permitindo +ue m,ltiplos endereos se8am apagados ou escritos em uma s opera)o# MEM RIA SRAM! Static R(M, significa +ue n)o precisa ser periodicamente atualizada como as R(Ms comuns, +ue sem atualiza)o perdem seus dados# 0 a mem ria %ol'til, rapidamente acessada, e +ue apagada toda %ez +ue a alimenta)o se ausenta# 9ocal onde s)o armazenadas as %ari'%eis declaradas no programa# MEM RIA EEPROM! 0 a mem ria n)o %ol'til, +ue mantm os dados escritos independente da alimenta)o do PIC# 0 acessada +uando se dese8a armazenar dados por per.odos indeterminados, como a sen7a de um usu'rio# CPU !Central Processing Unit"! 0 um con8unto composto por: PC" !Program Counter" ;eleciona na 39(;H o corrente comando a ser e-ecutado# #REG$" !Work Registeres" Registradores especias de trabal7o# ;)o acessados constantemente e ser%em para realizar operaes de mo%imenta)o e tem acesso direto < &9(#

ULA" &nidade 9 gica e (ritmtica do uC !microcontrolador", respons'%el pelas operaes l gicas e aritimticas dos >R*?s# FUS%&EIS" Perifricos especiais respons'%eis pelo pleno funcionamento do sistema# ?arantem +ue o programa n)o 1tra%e2 e +ue o uC n)o opere sob tenses abai-o ou acima do permitido# PERIFRICOS" Circuitos au-iliares +ue li%ram o programa de realizar trabal7os espec.fios# 3uncionam de forma paralela ao programa do usu'rio !na 39(;H", ocupando o c digo apenas para ser configurado ou entregar o resultado de algum ser%io# Os perifricos abordados nesse documento s)o: GPIO !General Purpose Input/Output": &sados para entradas digitais, como um bot)o ou uma c7a%e, e sa.das digitais, como um 9*$ ou um motor $C# O programa usu'rio pode setar uma sa.da, colocando um pino e-terno do PIC em n.%el l gico @5A!5B" ou @CA!DB"# ADC !Analog to Digital Converter": &sado para recol7er sinais anal gicos e-ternos e transorm'Elos em digitais, para ent)o serem processados pelo programa# USART !Universal Synchronous and Asynchronous Receiver-Transmitter": Perifrico respons'%el por en%iar e receber dados atra%s do protocolo R;E=F=# TIMERS" 6emporizadores de uso geral# ?arantem precis)o de tempo entre e%entos#

3igura C G *strutura interna b'sica

HARD#ARE

Para o pleno funcionamento do uC necess'rio +ue: *le este8a corretamente alimentado, com seu pino &'' ligado em =,= < D,DB e seu pino &$$ ligado ao ?/$# !Os e-emplos deste documento usam a tens)o de alimenta)o de DB"# 0 recomendado +ue um capacitor de C55n3 !de cerHmica com o r tulo C5I" se8a posto na alimenta)o, pr -imo aos terminais do uC, pois este funciona como um filtro contra ru.dos gerais# O pino MCLR !Masterclear" este8a em DB# (o ir para 5B este pino pro%oca um reset e-terno do PIC# Os pinos O;CC e O;C= este8am ligados no oscilador e-terno, +ue nos e-emplos ser' um cristal de +uartzo de IMHz# $e%eEse ressaltar +ue a fre+uJncia interna !c7amada de F()" do uC %ale K da fre+uJncia usada como fonte de rel gio ! F*$("# Para uma correta gera)o de clock e-terno, recomendo o uso de dois capacitores de desacoplamento nos terminais do cristal, no %alor de ==p3#

O uC PIC16F628A tem o benef.co de poder usar um clocL interno de IMHz, alm de n)o precisar do MCRL+ Isso permite +ue os trJs pinos correspondentes se8am usados como ?PIO# *sta ser' a configura)o usada para este uC nos nossos e-emplos#

3igura = G Hardware b'sico: PICCM3M=4(

3igura F G Hardware b'sico: PICCM34NM(

SOFT#ARE
D

Como ambiente de desen%ol%imento, ser' usado o compilador PC>H da CC;# *ste constitu.do de um I$* gr'fico +ue pode ser e-ecutado em +ual+uer plataforma >indoOs# O compilador, como o pr prio nome 8' diz, tem o papel de compilar o c digo em linguagem C para a linguagem de m'+uina, a +ual est' pronta para ser gra%ada na mem ria 39(;H do uC# $e%eEse ressaltar +ue este compilador case insensitive, ou se8a, n)o diferencia letras ma.usculas de min,sculas# Portanto, se forem declaradas as %ari'%eis 16emperP(tual2 e 1temperPatual2, o compilador acusar' erro, pois %isto como ambiguidade# Os programas embarcados seguem, como os outros t picos 8' %istos, uma estrutura b'sica# Quando o dispositi%o ligado o programa inicia sua e-ecu)o numa fase c7amada de 1inicializa)o2# /essa fase feita toda a configura)o do sistema: Quais pinos ser)o entradas ou sa.das# Quais perifricos ser)o utilizados e como ser)o utilizados# $eclara)o das %ari'%eis usadas pela fun)o main# C7amadas de funes !ou comandos" +ue de%em ser e-ecutados apenas no in.cio do processo# $e%e ficar claro +ue o c digo pertencente a essa fase e-ecutado apenas uma %ez, sendo e-ecutado no%amente apenas se o uC for reiniciado# ( partir disto o uC est' pronto para iniciar sua fase de trabal7o propriamente dito# *ssa fase recebe o nome de 1loop infinito2, pois onde o programa de%e permanecer en+uanto o dispositi%o esti%er energizado# Rasicamente, as aes se+uencias nesse lao s)o: 9eitura das entradas# Processamento dos dados# (tualiza)o das sa.das#

3igura I G 3lu-o b'sico de um programa embarcado

PodeEse adotar como softwares iniciais:


SSEEPrograma *s+ueletoEEEEESS Tinclude UCM3M=4(#7V Tfuses I/6RCPIO, /OMC9R Tuse delaW!clocLXI555555" Tuse fastPio!a" Tuse fastPio!b" %oid main!%oid"Y setPtrisPa!5bCCCCCCCC"Z setPtrisPb!5-ff"Z O7ile!true"Y [ [ SSEEEEEEEEEEEEEEEEEEEEEEEEESS [ SSEEPrograma *s+ueletoEEEEESS Tinclude UCM34NM(#7V Tfuses \6 Tuse delaW!clocLXI555555" Tuse fastPio!a" Tuse fastPio!b" Tuse fastPio!c" %oid main!%oid"Y setPtrisPa!5bCCCCCCCC"Z setPtrisPb!5-ff"Z setPtrisPc!5-ff"Z O7ile!true"Y [

SSEEEEEEEEEEEEEEEEEEEEESS

E,-./0/12*"
Tinclude UCM3\\\(#7V

Riblioteca +ue ser' utilizada para o compilador gerar o c digo espec.fico para o dispositi%o utilizado#
Tfuses I/6RCPIO, /OMC9R, \6

3us.%eis configurados# INTRC3IO significa +ue ser' utilizado como fonte de rel gio o oscilador interno, +ue de I MHz# NOMLCR 7abilita o pino I do CM3M=4 para ser usado como ?PIO# 4T indica +ue a fonte de rel gio um cristal e-terno de fre+uJncia UX IMHz# /)o ser)o abordados todos os fus.%eis, porm estes podem ser %istos no CC; em 1 iew! -" # alid $uses!#
Tuse delaW!clocLXI555555"

Comando +ue fornece a base de tempo para as rotinas de delay usadas no programa, +ue ser)o %istas mais adiante#
Tuse fastPio!a" SS!b ou c"

Configura todos os pinos como ?PIO !?eneral purpose InSOut"# Cada pino do uC pode ser configurado com diferentes prop sitos, o +ue pode ser %isto nas 3iguras = e F# Por omiss)o, diremos +ue todos os pinos ser)o ?PIO# (ssim, se +uisermos outra fun)o para algum deles, indicaremos adiante, atualizando o seu prop sito# Os canais ?PIO no PIC seguem um padr)o: cada um de%e estar associado a um bWte e a um bit# Os bWtes s)o nomeados por %ogais e s)o c7amados pelo datas7eet de POR6, como POR6(, POR6R, POR6C, etc# Os bits s)o mapeados por n,meros, assim, podemos obser%ar nas 3iguras = e F +ue o canal A5 !apresentado como RA5" est' no pino = do CM3M=4, e no pino D doCM34NM# Como cada POR6 um bWte, cada um tem 4 canais# Por e-emplo, o POR6( %ai de A6 at A7, e este ,ltimo identificado pelo programa do usu'rio como 1pinPaN2# O PICCM3M=4 contm as portas ( e R, en+uanto o PICCM34NM tem as portas (, R e C# Porm, nem todos os canais endere'%eis em teoria est)o dispon.%eis nos pinos e-ternos#
%oid main!%oid"Y

3un)o principal de +ual+uer programa em C# 0 onde realmente comea o programa +ue ser' embarcado# Os comandos mencionados anteriormente s)o c7amados de 1direti%as do compilador2, ou se8a, s)o usados pelo compilador mas n)o ser)o e-ecutados pelo PIC# O compilador utiliza esses comandos para configurar registradores especiais no momento da gra%a)o# Portanto, se %ocJ escre%eu 1Tfuses \62, o registrador respons'%el por indicar a fonte de rel gio ser' configurado no momento do download, e n)o na inicializa)o#
setPtrisPa!5bCCCCCCCC"Z

Primeiro comando do programa !para este e-emplo"# *ssa fun)o configura os canais ?IPO como entrada ou sa.da# @CA significa 1I/2 e @5A 1O&62, o +ue facilita a memoriza)o pela semel7ana: CEVIn e 5EVOut# O prefi-o 15b2 indica +ue o n,mero adiante est' representado em bin'rio# Para representar um n,mero em 7e-adecimal, o prefi-o usado 15-2, portanto essa fun)o pode ser escrita: 1 setPtrisPa !5-ff"Z2# ;e um n,mero n)o ti%er nen7um prefi-o, este ser' interpretado pelo compilador como no formato decimal, +ue nossa forma natural# Podemos dizer ent)o +ue essa fun)o tambm pode ser escrita na forma: 1 setPtrisPa !=DD"Z2, +ue surtir' o mesmo efeito# Con%m escre%er tal fun)o em bin'rio pela mel7or %isualiza)o dos canais, +ue est)o dispostos em ordem decrescente# Portanto, se o primeiro pino do CM3M=4 for usado para acender um 9*$, de%eEse configurar o canal A2 como sa.da, escre%endo: 1setPtrisPa !5bCCCCC5CC"Z2# RecomendaEse +ue todos os canais +ue n)o ser)o utilizados se8am configurados como entrada, pois estar)o em altaEimpedHncia, admitindo +ual+uer %alor# Quanto mais pinos s)o configurados como sa.da, maior a probabilidade do usu'rio acidentalmente toc'Elos ao manusear o proto%oard, e isso pode ocasionar a +ueima do dispositi%o#
O7ile!true"Y

*+ui%ale a escre%er 1O7ile!CXXC"Y2 ou 1O7ile!C"Y2# *sse o tal loop infinito, onde o programa permanecer' indefinidamente# 0 dentro desse while +ue o programador de%e construir a fase de trabal7o do uC#

17 E4EMPLO" Hello World!


SSEEEEEEEE Pisca 9*$ EEEEEEEE Tinclude UCM3M=4(#7V Tfuses I/6RCPIO, /OMC9R Tuse delaW!clocLXI555555" [ Tuse fastPio!a" Tuse fastPio!b" %oid main!%oid"Y s7ort flagX5Z setPtrisPa!5bCCCCCCC5"Z setPtrisPb!5-ff"Z SSEEEEEEEEEEEEEEEEEEEEEEEEESS SSEEEEEEEE Pisca 9*$ EEEEEEEE Tinclude UCM34NM(#7V Tfuses \6 Tuse delaW!clocLXI555555" O7ile!true"Y outputPbit!pinPa5,flag"Z delaWPms!D55"Z flagX]flagZ [

Tuse fastPio!a" Tuse fastPio!b" Tuse fastPio!c" %oid main!%oid"Y setPtrisPa!5bCCCCCCC5"Z setPtrisPb!5-ff"Z setPtrisPc!5-ff"Z

O7ile!true"Y outputP7ig7!pinPa5"Z delaWPms!D55"Z outputPloO!pinPa5"Z delaWPms!D55"Z [ [ SSEEEEEEEEEEEEEEEEEEEEEEEEESS

E,-./0/12*"
s7ort flagX5Z

$eclara)o e inicializa)o da %ari'%el de C bit c7amada 1flag!# 6ambm pode ser escrito nas formas: 1 boolean flagX5Z! ou 1intC flagX5Z!
outputP7ig7!pinPa5"Z outputPloO!pinPa5"Z

Coloca o pino mencionado em n.%el l gico 1 !DB"# Coloca o pino mencionado em n.%el l gico 6 !5B"#
outputPbit!pinPa5, flag"Z

Coloca o pino mencionado no n.%el l gico correspondente ao %alor corrente da 1flag!#


delaWPms!D55"Z

O programa literalmente p'ra durante o %alor de tempo informado !em milisegundos"# O pr prio compilador gera o c digo respons'%el por esta a)o, atra%s de contadores, os +uais se baseiam em 1Tuse delaW!clocLXI555555"2#
flagX]flagZ

Realiza o 1complemento de um2 da %ari'%el 1flag2# O s.mbolo 1]2 corresponde < opera)o l gica NOT# Os pinos configurados como entrada drenam uma corrente e-tremamente pe+uena, na ordem de picoE ampres, pois s)o colocados em altaEimpedHncia# (ssim, podemos consider'Ela desprez.%el# Os pinos definidos como sa.da n)o podem receber sinal e-terno !corrente", pois, como 8' dito anteriormente, isso certamente causar' o falecimento do uC# *stes dois dispositi%os abordados podem fornecer at =Dm( por pino de sa.da# Portanto, se a carga utilizada drenar mais do +ue esse %alor, de%e ser utilizado um driver, como um transistor#

C5

3igura D G *-emplo C: hardware CM34NM

3igura M G *-emplo C: hardware CM3M=4

C*8-9./12* '* -:*;:/8/" Inicialmente abra o compilador PICC !PC>H$", cli+ue no s.mbolo de 1pastas2 !primeiro acima", e em seguida
CC

1Close &ll2# (gora, para criar um no%o pro8eto, cli+ue no%amente no s.mbolo de 1pastas2, e ap s isso em 1 'ew2 EV 1Source $ile2# *scol7a o diret rio onde ficar' sal%o este primeiro programa e o nomeie de 1e-emploC2# $igite o c digo de e-emplo para o uC escol7ido e em seguida compile o programa em 1Compile2 EV 1Compile2, ou atra%s da tecla de atal7o 13^2# /este processo o compilador gera D ar+ui%os de sa.da, porm ser' utilizado apenas o 1e-emploC#7e-2, +ue o c digo +ue ser' transferido para a mem ria 39(;H do uC# G:/</12* '* -:*;:/8/" Colo+ue o uC escol7ido no proto%oard e, antes de colocar os outros componentes !capacitor, etc#", insira apenas os (umpers relati%os ao IC;P !In Circuit Serial Programming"# Plugue agora o cabo do IC;P no proto%oard e no gra%ador PIC_it=, e plugue o cabo &;R do gra%ador no PC# 3eito isso, abra o software PIC_it=# ;e o procedimento dito foi feito corretamente, de%e aparecer uma mensagem confirmando a detec)o do dispositi%o# ;e isso n)o ocorreu, confira se 7ou%e alguma fal7a no dito procedimento !ordem dos (umpers, mau contato, etc#", e ent)o cli+ue em 1 )ools2 EV 1Check Communication2# /)o se de%e continuar a partir deste ponto at +ue o uC n)o ten7a sido detectado# (ntes de transferir o c digo, desabilite a fun)o 1)ools2 EV 1$ast Programming2, pois esse modo est' bem mais suscept.%el a fal7as de transferJncia, alm de ser pe+uena diferena em rela)o ao modo normal# Para %erificar se o c digo foi transferido corretamente, 7abilite a fun)o 1Programmer2 EV 1 erify on Write2# 3eito tudo, cli+ue em 1$ile2 EV 1*mport He+2# *scol7a o 1e-emploC#7e-2 +ue foi gerado na compila)o e, depois de importado o ar+ui%o, cli+ue finalmente em 1Write2 para realizar a transferJncia do c digo para o uC# Confirmado o sucesso do download, desconecte o plugue IC;P do proto%oard, insira os componentes necess'rios e energize o circuito# ;e tudo deu certo, o 9*$ piscar' a cada C segundo# Os componentes n)o precisam ser retirados para realizar um no%o doOnload# Porm, recomendado +ue sempre se inicie a constru)o de um 7ardOare pelos 8umpers do IC;P, pois na ocorrJncia de uma fal7a !muito

C=

comum" de%eEse reduzir o 7ardOare para encontrar o defeito# Outra maneira de realizar o doOnload pelo bot)o no PIC_it= !hardware"# *ssa fun)o 7abilitada em 1Programmer2 EV 1Write on P*Ckit ,utton2# Quando tal bot)o pressionado, o ar+ui%o #7e- +ue est' sendo apontado no campo 1Source2 do PIC_it= !software" transferido para o uC !de%idamente conectado"# O mesmo efeito obtido pelo bot)o 1 Write2, eliminando a necessidade de toda %ez importar o ar+ui%o a ser transferido# Para testar essa funcionalidade, 7abiliteEa primeiro, depois, se o campo 1 Source2 esti%er apontando para o 1e-emploC#7e-2, mude o tempo de delay no programa !compilador" para C55ms e o recompile# B' agora para o PIC_it= !software" e, obser%ando a tela, pressione o bot)o no PIC_it= !hardware"# O programa percebe +ue 7ou%e uma altera)o e realiza um 1reloading!Os e-emplos seguintes abordar)o apenas o PICCMf4NM(, por +uestes de total semel7ana# ;empre +ue for escre%er um no%o programa +ue possa se basear no atual, copie o te-to deste, cli+ue em 1 Close &ll2, depois em 1'ew2 EV 1Source $ile2# Cole o te-to copiado#

27 E4EMPLO" Push-button
SEEEEEEEEEEEEEEEEEEEEEEE pus7Ebutton EEEEEEEEEEEEEEEEEEEEEEEEE Tinclude UCM34NM(#7V Tfuses \6 Tuse delaW!clocLXI555555" Tuse fastPio!a" Tuse fastPio!b" Tuse fastPio!c" %oid main!%oid"Y setPtrisPa!5bCCCCCCC5"Z setPtrisPb!5-ff"Z setPtrisPc!5-ff"Z O7ile!true"Y if!input!pinPcI"" outputP7ig7!pinPa5"Z else outputPloO!pinPa5"Z [

SEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

E,-./0/12*"
input!pinPcI"Z

CF

Realiza a leitura e-terna do n.%el l gico no pino mencionado e a retorna para o programa#

3igura N G *-emplo =: hardware CM34NM

*m uma entrada utilizada para ler um bot)o, de%eEse usar um resistor ligado ao terra# ;em o resistor !c7amado de pull-down", se o bot)o n)o esti%er pressionado, o ni%el l gico na entrada n)o ser' 5, pois este estar' alta impedHncia# *sse estado pode ser denominado floating !flutuando", onde o sinal n)o tem um %alor fi-o, fica %ariando aleatoriamente em fun)o de ru.dos locais# (ten)o ao ligar um push-%utton de I terminais no proto%oard# $ois de seus terminais est)o conectados aos outros dois# Portanto, se um dos terminais foi ligado < DB, o outro terminal conectado < esse tambm estar' em DB, in%iabilizando o uso do seu ramo no proto%oard#

57 E4EMPLO" INTERRUO E TERNA


Podemos engatil7ar uma rotina espec.fica dentro do nosso microcontrolador a partir de sinais e-ternos ou mesmo e%entos internos do microcontrolador# /este e-emplo trabal7eremos com interrupes e-ternas, +ue em resumo a e-ecu)o de determinada rotina +uando 7ou%er uma mudana de estado em um pino prEdeterminado, sendo esta uma forma mais eficiente de controlar as ati%idades do microcontrolador por e%entos e-ternos, 8' +ue desta forma
CI

n)o 7' perda de tempo ao se realizar a leitura do estado do pino a cada ciclo de trabal7o # O 7ardOare +ue utilizaremos a seguir o mesmo do e-emplo anterior ! pus7Ebutton", e-ceto pelo fato +ue o bot)o de%e estar conectado ao pino respons'%el por c7amar interrupes e-ternas , no caso do PICCM34NM( o pino rb5#
SSEEEEEEEEI/6*RR&P`aO *\6*R/(EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
Tinclude UCM3M=4(#7V Tfuses I/6RCPIO, /OMC9R Tuse delaW!clocLXI555555" Tuse fastPio!a" Tuse fastPio!b" s7ort int cont X 5Z %oid main!%oid"Y contX5Z setPtrisPa!5-ff"Z setPtrisPb!5bCCCCC5CC"Z e-tPintPedge!9P6OPH"Z enablePinterrupts!?9OR(9"Z enablePinterrupts!I/6PRR"Z O7ile!true"Y sleep!"Z [[ TI/6PRR Boid piscaledPintPe-t!%oid" Y if!input!pinPb5"" Y delaWPms!=5"Z if!input!pinPb5"" Y outputPbit!pinPa5,cont"Z if!contXX5" contXCZ else contX5Z [[[

SSEEEEEEEEI/6*RR&P`aO *\6*R/(EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

E,-./0/12*"
e-tPintPedge!9P6OPH"Z

*sta fun)o define +ue o microcontrolador entrar' em interrup)o +uando o pino de interrup)o e-terna em +uest)o passar do estado 5 para C! loO to 7ig7"#
enablePinterrupts!?9OR(9"Z

3un)o respons'%el por 7abilitar +ual+uer tipo de interrup)o +ue microcontrolador ten7a, de%e ser usada antes de 7abilitar +ual+uer interrup)o especificamente#
enablePinterrupts!I/6PRR"Z

*specifica a interrup)o +ue ser' usada, no caso interrup)o e-terna por altera)o de estado nos pinos RR +ue s)o respons'%eis pelas interrupes e-ternas#

=7 E4EMPLO" D!s"l#$ LCD 2,16


SSEEEEEEEEEEEEEEEEEEEEEEEEEEEEE 9C$ EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
Tinclude UCM34NM(#7V Tfuses \6 Tuse delaW!clocLXI555555"

CD

Tuse fastPio!a" Tuse fastPio!b" Tuse fastPio!c" Tinclude Ulcdt#cV Tdefine lig outputP7ig7 Tdefine des outputPloO Tdefine seta outputPbit Tdefine esp delaWPms Tdefine led pinPa5 Tdefine bot pinPcI Tdefine bl pinPcN %oid main!%oid"Y unsigned int iZ setPtrisPa!5bCCCCCCC5"Z setPtrisPc!5b5CCCCCCC"Z lcdPinit!"Z printf!lcdPputc,bcfCurso de uC PIC b"Z printf!lcdPputc,bcnP*6E*ng*let#&fes2"Z

lig!bl"Z des!led"Z for!iX5ZiUMZidd"Y seta!led,]input!led""Z esp!I55"Z [ O7ile!true"Y if!input!bot""Y printf!lcdPputc,bcf 3elizb"Z printf!lcdPputc,bcn :"b"Z lig!led"Z lig!bl"Z [elseY printf!lcdPputc,bcf 6risteb"Z printf!lcdPputc,bcn :!b"Z des!led"Z des!bl"Z [ esp!=55"Z [

SSEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEESS

E,-./0/12*"
Tinclude Ulcdt#cV

Inclus)o da biblioteca do 9C$# *sse ar+ui%o de%e estar na mesma pasta onde ser' sal%o o programa +ue a utiliza#
Tdefine lig outputP7ig7

(marra)o entre duas entidades# ;er%e para aumentar a legibilidade do c digo# O compilador substitui a parte es+uerda pela direita no momento da compila)o do programa#
unsigned int iZ

$eclara)o da %ari'%el de 4 bits e sem sinal !5 G =DD" c7amada 1i2#


lcdPinit!"Z

Inicializa)o da biblioteca do 9C$# *ssa fun)o configura os pinos da porta R !menos o R5, +ue pode ser configurado na 1main./2", e prepara o 9C$ para iniciar sua opera)o#
printf!lcdPputc,bcfCurso de uC PIC b"Z

3un)o de impress)o no 9C$# *-istem comandos especiais: cf EV 9impa a tela toda e pe o cursor na primeira posi)o !C,C"# cn EV Pe o cursor no in.cio da segunda lin7a# cb EV Retorna o cursor uma posi)o# Os caracteres s)o impressos sempre na posi)o corrente do cursor, +ue pode ser alterada pela fun)o
CM

1lcdPgoto-W!-,W"Z2# ( fun)o 1lcdPgetc!-,W"Z2 retorna o atual caractere +ue ocupa a posi)o informada# Como os canais RM e RN s)o utilizados para gra%a)o e comunica)o com o 9C$, de%eEser usar dois resistores para aumentar a impedHncia de entrada dos terminais P?$ e P?C do PIC_it=# ;em tais resistores, o 9C$ e o PIC drenam, 8untos, muita corrente do gra%ador, resultando numa distor)o do sinal de gra%a)o# O pino F do display o sinal 1B62, +ue determina o contraste entre a parte escrita e o plano de fundo da tela# O potencimetro de%e ser regulado para obterEse uma boa %isualiza)o#

3igura 4 G Hardware 0isplay 1C0

>7 E4EMPLO" C*0<?:$2* A@D


/o instante em +ue o programa usu'rio re+uisita ao m dulo um processo de con%ers)o (S$, o corrente %alor de tens)o na entrada especificada con%ertido em um %alor digital, para ent)o ser manipulado pelo programa# /este e-emplo o uC ser' configurado para uma con%ers)o de 4 bits, e o range de tens)o a ser con%ertida ser' o padr)o, ou se8a, a pr pria alimenta)o do PIC !5GDB"# Portanto, essa fai-a ser' di%idida em =DM partes iguais, e o resultado de uma con%ers)o ser' o bWte correspondente a parte em +ue se encontra a tens)o con%ertida#

CN

3igura ^ G 3un)o de transferJncia da con%ers)o (S$ desse e-emplo SSEEEEEEEEEEEEEEEEEEEEEEEE Bolt.metro EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE Tinclude UCM34NM(#7V Tde%ice adcX4 Tfuses \6 Tuse delaW!clocLXI555555" Tuse fastPio!a" Tuse fastPio!b" Tuse fastPio!c" Tinclude Ulcdt#cV Tdefine esp delaWPms %oid main!%oid"Y unsigned int digitalZ float tensaoZ setPtrisPa!5bCCCCCCCC"Z setPtrisPc!5b5CCCCCCC"Z setupPadcPports!(99P(/(9O?"Z setupPadc!($CPC9OC_PI/6*R/ (9"Z setPadcPc7annel!5"Z

lcdPinit!"Z printf!lcdPputc,bcf Boltimetro b"Z printf!lcdPputc,bcnP*6E *ng*let#&fesb"Z esp!=555"Z outputP7ig7!pinPcN"Z O7ile!true"Y digitalXreadPadc!"Z tensaoX D#5e!float"digitalS=DD#5Z printf!lcdPputc,bcf6: fC#=fb,tensao"Z printf!lcdPputc,bcn$: fFub,digital"Z esp!D55"Z [ [

SSEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEESS

E,-./0/12*" O PICCM3M=4( n)o tem con%ersor (S$#


Tde%ice adcX4

Configura a resolu)o da con%ers)o# Pode ser obser%ado na 3igura ^ +ue a %aria)o m.nima +ue essa con%ers)o pode recon7ecer de apro-imadamente =5mB# Isso significa +ue
C4

um sinal de C5mB e outro de CDmB ser)o con%ertidos para o mesmo %alor !5"# Isso pode ser ruim para determinadas aplicaes# Por e-emplo, o sensor de temperatura 9MFD fornece em sua sa.da C5mBSAC# &ma con%ers)o de 4 bits n)o capaz de perceber a diferena entre 5 e C AC# Porm, podeEse mel7orar a resolu)o, utilizando C5 bits# Isso torna o sistema capaz de perceber uma diferena m.nima de DmB !5,DAC"# /)o se de%e es+uecer de utilizar uma %ari'%el do tipo 1unsigned long int2 !CM bits", cu8a impress)o feita pela sinta-e 1fIlu2# Outra forma de mel7orar a resolu)o diminuir o range do %alor a ser con%ertido# Para isso, s)o utilizados sinais e-ternos como B R*3H eSou BR*39, os +uais podem ser configurados na pr -ima fun)o#
setupPadcPports!(99P(/(9O?"Z

Configura todas as portas poss.%eis como anal gicas# /este caso, nen7uma delas poder' ser utilizada como ?PIO# Para %er as poss.%eis configuraes do perifrico ($C, no I$* CC;, cli+ue com o bot)o direito em Tinclude UCM34NM(#7V EV 12pen $ile at Cursor2, e %' < lin7a ==5# Por omiss)o !default", ser)o adotados como BR*3H e BR*39 os sinais de alimenta)o, B$$ e B;;, respecti%amente#
setupPadc!($CPC9OC_PI/6*R/(9"Z

Configura a fre+uJncia de opera)o !fonte de rel gio" do hardware#


setupPadcPc7annel!5"Z

*ste PIC tem %'rios canais anal gicos, porm apenas um m dulo de con%ers)o# *ssa fun)o indica o canal +ue ser' ligado ao m dulo para o pr -imo processo# Como este e-emplo utiliza apenas um canal, este foi configurado na 1inicializa)o2 e n)o sofrer' altera)o# *m uma aplica)o +ue utiliza m,ltiplos canais, esta fun)o de%e estar no 1loop infinito2, pois ser' dinHmica# O compilador recomenda +ue entre a configura)o de um canal e a leitura do mesmo de%e 7a%er um inter%alo de C5gs# B' no 1Help! do compilador !3C", na aba 1*nde+2, e digite: 1setupPadcPc7annel2# Be8a o t pico 13+amples2# digitalXreadPadc!"Z Realiza a con%ers)o (S$ do ,ltimo canal configurado e atribui o resultado do processo < %ari'%el 1digital2# /ote +ue no programa deste e-emplo o %acklight do display ligado ap s o comando 1esp!=555"Z2# Isso implica +ue, em algumas %ezes, o %acklight estar' aceso durante a apresenta)o, e nas outras ele estar' apagado# Isso se d' ao fato de +ue um canal configurado como sa.da, se n)o for
C^

atualizado, assumir' %alores impre%is.%eis# *ssa uma comum fonte de erros, pois sa.das podem iniciarEse inde%idamente acionadas e pro%ocar pre8u.zos# RecomendaEse +ue, logo ap s configurar as entrasSsa.das, se desati%e todas as sa.das#

3igura C5 G Hardware &0C

67 E4EMPLO" UART

( &(R6 definida como um perifrico de comunica)o utilizado para troca de informaes entre dispositi%os digitais# *ste m dulo se baseia no protocolo R;E=F=, o mais popular padr)o de comunica)o ass.ncrona, ou se8a, entre dispositi%os com fontes de rel gio distintas# Por isso, a grande maioria dos uCs possuem este hardware integrado# (pesar de seguirem o mesmo protocolo, um uC e uma porta serial de um PC n)o podem ser diretamente ligados, pois a representa)o eltrica dos s.mbolos !bits 5 e C" n)o a mesma# Os uCs utilizam o padr)o 669, ou se8a, o bit 5 representado como 5B e o bit C como DB !ou a alimenta)o, caso se8a diferente"# &ma porta serial, bem como aparel7os industriais, recon7ecem o sinal l gico C um %alor entre E=DB e EFB, e o sinal l gico 5 um %alor entre F e =DB !geralmente usaEse hC=B"# *ssa escol7a se d' ao fato de aumentar a rela)o sinalSru.do, permitindo uma maior ta-a de transmiss)o, maior distHncia do cabo +ue conecta os dispositi%os, alm de diminuir a 6*R !ta-a de erro de bit"#
=5

Para +ue um uC e um PC possam trocar informaes e-iste o M(\=F=, +ue um con%ersor de padr)o eltrico para o R;E=F=# *ste m dulo tambm pode ser nomeado como &;(R6, +ue significa 1Universal Synchronous and Asynchronous Receiver-Transmitter!- /essa configura)o, alm dos sinais R\ e 6\, transmitido tambm um sinal de rel gio, fornecido por apenas um dos n s en%ol%idos# &ma comunica)o s.ncrona permite uma ta-a de transmiss)o mais ele%ada, pois o instante da leitura do sinal bem definido de%ido < referJncia do rel gio# O e-emplo demonstrado a+ui abordar' a comunica)o ass.ncrona# *m um sistema de comunica)o R;E=F=, todos os elementos en%ol%idos de%em ser configuradados com os mesmos parHmentros, pois s assim o sucesso da transmiss)o garantido# Como se os n s da rede 1falassem a mesma l.ngua2# Os parHmetros desse protocolo s)o: %#ud r#te: $efine a ta-a de transmiss)o e conse+uentemente o tempo de bit !BC9B", +ue o in%erso desse n,mero# O %alor mais comum ^M55 bps, e outros bastante usados s)o =I55, I455, C^=55 e CCD=55 bps !bits por segundo"# St#rt b!t: 0 um parHmetro imut'%el, unit'rio, tem %alor l gico zero e dura C BC9B, como todos os outros bits transmitidos# P#$lo#d: 6amb c7amado de carga ,til, o dado transmitido# Pode assumir de D a ^ bits, e seu %alor padr)o 4 bits !C %yte"# P#r!t$ b!t: Rit de paridade# 6em o papel de identificar erros na transmiss)o e, se presente, fica entre o payload e o stop %it# Pode ser configurado de trJs formas: paridade par, paridade .mpar ou ausente# /a paridade par, ele inserido de forma a tornar o n,mero de @CsA no 1payloaddparity %it2 um %alor par# (nalogamente funciona a paridade .mpar# $essa forma, se for en%iado o caractere @aA !5CC5555C" e os dispositi%os en%ol%idos foram configurados com paridade par, o bit de paridade assumir' %alor @CA, totalizando +uatro n,meros @CsA# ;e +ual+uer um dos bits for lido erroneamente !de%ido < ru.do", o bit de paridade !+ue no caso @CA" acusar' o erro na transmiss)o, e o dado recebido ser' descartado#
=C

*-iste, no entanto, a probabilidade !mesmo +ue .nfima" de dois bits serem alterados numa mesma transmiss)o, e assim o mecanismo de paridade n)o detectar' o erro# Sto" b!t: Pode ser unit'rio ou duplo, e tem %alor l gico um# /o PIC, um canal serial pode ser implementado por hardware, ou se8a, a &(R6, ou por software# /essa ,ltima, o programa embarcado integralmente respons'%el pela transmiss)oSrecep)o dos dados, tornando a CP& indispon.%el para realizar +ual+uer outra tarefa durante esse ato# (s duas implementaes surtem o mesmo efeito !e-terno" e o receptor segue o mesmo algor.tmo para capturar o dado:

3igura CC G 6ransmiss)o de um caractere @aA !5-MC i 5b5CC5555C"# Oito bits de payload, sem bit de paridade e um stop%it

A G O canal constantemente obser%ado# *speraEse o start%it# B G ( transi)o negati%a indica o in.cio do start%it# (guardaEse ent)o j BC9B# C G O start%it %erificado, pois a transi)o pode ter sido causada por ru.do# ;e %erdadeiro, aguardaEse C BC9B e o processo continua# ;e n)o, o processo %olta ao estado A# D G IniciaEse o processo de a+uisi)o# O bit menos significati%o !9;R" capturado e aguardaEse C BC9B para a a+uisi)o do pr -imo bit# 6odos os outros bits do payload s)o capturados desta mesma forma# E G 0 %erificado o stop%it, pois e-iste a c7ance de ru.dos terem %alidado as etapas B e C# ;e %erdadeiro, o dado recebido finalmente entregue

==

ao programa usu'rio# ;e falso, o dado descartado# RetornaEse ao estado A#

SSEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE 6\ EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE Tinclude UCM3M=4(#7V Tfuses I/6RCPIO, /OMC9R Tuse delaW!clocLXI555555" Tuse fastPio!a" Tuse fastPio!b" Tuse rs=F=!baudX^M55, rc%XpinPbC, -mitXpinPb=, paritWX/" c7ar dadoX@aAZ %oid main!%oid"Y setPtrisPa!5-ff"Z setPtrisPb!5bCCCCC5CC"Z [ TI/6P*\6 %oid trataPintPe-t!%oid"Y putc!dadodd"Z if!dadoXX@fA" dadoX@aAZ delaWPms!=55"Z [ enablePinterrupts!?9OR(9"Z enablePinterrupts!I/6P*\6"Z O7ile!true"Y sleep!"Z [

e-tPintPedge!9P6OPH"Z SSEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEESS SSEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE R\ EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE Tinclude UCMf4NM(#7V Tfuses \6 Tuse delaW!clocLXI555555" Tuse fastPio!a" Tuse fastPio!b" Tuse fastPio!c" Tinclude Ulcdt#cV Tuse rs=F=!baudX^M55, rc%XpinPcN, -mitXpinPcM, paritWX/" s7ort flagXCZ c7ar dadoX@LAZ TI/6PR$( %oid trataPintPr-!%oid"Y =F dadoXgetc!"Z flagXCZ [ %oid main!%oid"Y setPtrisPa!5-ff"Z setPtrisPc!5bC5CCCCCC"Z lcdPinit!"Z enablePinterrupts!?9OR(9k I/6PR$("Z printf!lcdPputc,bcf$ado: b"Z O7ile!true"Y if!flag"Y printf!lcdPputc,bcn fcb,dado"Z flagX5Z [

[ [ SSEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEESS

E,-./0/12*"

Tuse rs=F=!baudX^M55, rc%XpinPbC, -mitXpinPb=, paritWX/"

$efini)o dos parHmetros do canal serial criado# ;e os pinos mencionados s)o R\ e 6\ !&(R6", o canal implementado por 7ardOare# Porm, podeEse usar +uais+uer outros pinos de ISO para se criar um canal# /esse caso, a implementa)o feita por softOare, e o pr prio compilador o respons'%el por esta tarefa#
c7ar dadoX@LAZ

$eclara)o e inicializa)o da %ari'%el global do tipo 1c7ar2 !4 bits" c7amada 1dado2# 0 dita global por+ue n)o foi declarada dentro de uma fun)o, e, portanto, pode ser acessada por +ual+uer uma do programa#
e-tPintPedge!9P6OPH"Z

Configura)o da interrup)o e-terna, realizada pelo pino RB6@INT# O parHmetro 19P6OPH2 indica +ue, se 7abilitada, a interrup)o ocorrer' na transi)o low to high, ou se8a, na borda de subida do sinal e-terno# Portanto, de%eEse usar no pino RB6@INT um push-%utton com um resistor de pulldown, assim como descrito no segundo e-emplo#
enablePinterrupts!?9OR(9"Z

Para +ue +ual+uer interrup)o se8a acionada, necess'rio 7abilitar a c7a%e interna c7amada GLOBAL# *sse mecanismo foi criado para +ue se possa desabilitar todas as fontes de interrup)o !+ue foram pre%iamente 7abilitadas" atra%s de um ,nico comando# (ssim, se o programa entra em uma regi)o cr.tica, onde n)o pode ser interrompido, n)o se faz necess'rio desabilitar as interrupes uma a uma# 3unciona como um 1dis8untor geral2 das interrupes#
enablePinterrupts!I/6P*\6"Z

Habilita a interrup)o e-terna#


enablePinterrupts!I/6PR$("Z sleep!"Z

Habilita a interrup)o por recep)o de dado na &(R6# Coloca o dispositi%o em modo sleep# /esse estado o n,cleo p'ra de trabal7ar e alguns perifricos s)o desabilitados, diminuindo drasticamente o consumo de corrente# O sistema 1despertado2 com a ocorrJncia de uma
=I

interrup)o, +ue nesse caso a e-terna# /em todas as fontes de interrup)o podem acordar o processador, como, por e-emplo, o T98?:6#
TI/6P*\6

$ireti%a +ue indica ao compilador +ue a pr -ima fun)o a rotina de tratamento para a interrup)o e-terna# /o instante em +ue a interrup)o ocorre, o programa principal !main./" p'ra onde esti%er e a fun)o 1%oid trataPintPe-t!%oid"2 e-ecutada# (p s o seu trmino, o programa principal %olta a ser e-ecutado a partir de onde parou#
TI/6PR$(

Indica ao compilador +ue a pr -ima fun)o a rotina de tratamento para a interrup)o gerada pela recep)o de um dado#
putc!dadodd"Z

Comando para en%iar um caractere atra%s do canal serial criado# ;e este canal usa o pino 6\ como sa.da, a %ari'%el 1dado2 simplesmente transferida para o 6\R*? !registrador de transmiss)o", pois a &(R6 se encarregar' de gerar o sinal correspondente# Para o programa, esta tarefa consome poucos ciclos de rel gio, bem como instrues# Porm, se o canal serial utiliza outro pino como sa.da, o programa o respons'%el por gerar o sinal ade+uado# /este caso, o compilador insere no c digo !no momento da compila)o" uma fun)o respons'%el por realizar tal tarefa# $e%e ficar claro +ue, durante a e-ecu)o dessa fun)o, o processador n)o pode realizar outra tarefa ou ser interrompido, pois o sinal de transmiss)o pode ser comprometido#
dadoXgetc!"Z

6ransferJncia do dado recebido por um canal para uma regi)o na mem ria R(M !%ari'%el 1dado2"# *sta fun)o de%e estar no in.cio da I;R !Interrupt Service Routine" referente ao 1TI/6PR$(2, ou ap s a %alida)o do teste da flag 1Lb7it!"2, pois +uando um no%o dado estar' dispon.%el# *sta flag foi criada para indicar o instante em +ue um dado recebido, caso n)o se +ueira usar a interrup)o 1 TI/6PR$(2, ou caso ten7aEse escol7ido um canal por softOare !o +ual n)o pode gerar tal interrup)o"# ;e o canal por 7ardOare !&(R6", essa flag 1le%antada2 no instante em +ue o stop%it confirmado, indicando +ue o dado est' dispon.%el no R\R*?# /o entanto, se a implementa)o por softOare, essa flag setada assim +ue se identifica o in.cio do
=D

start%it# ( partir da. a fun)o 1getc!"2 in%oca a subErotina !criada pelo compilador" respons'%el por receber o frame# *m ambos os casos, a e-ecu)o da fun)o 1 getc!"2 faz com +ue a flag 1Lb7it!"2 se8a zerada de forma autom'tica, preparando o sistema para uma no%a recep)o#

77 E4EMPLO" T!&er 6
Os )imers s)o perifricos respons'%eis pela contagem de tempo, mas +ue tambm podem ser usados para contar pulsos de um sinal e-terno# ;)o muito ,teis +uando se dese8a um inter%alo de tempo preciso entre e%entos, pois podem ser configurados pelo programa usu'rio para contar uma certa +uantidade de tempo !manipulada como n,mero de clocks"# Podem realizar o papel da fun)o 1 delaWPms!\"Z2, mas o uso de um timer permite +ue o programa trabal7e em outras ati%idades en+uanto o tempo est' sendo contado# *sse e-emplo aborda apenas o T98?:6, +ue um contador crescente e de oito bits !assume %alores de 5 a =DD"# Porm, os outros timers presentes nesses dois PICs funcionam a partir do mesmo mecanismo, com outras poucas particularidades# Para utilizar o T98?:6 o programador de%e inicialmente configurar a fonte de contagem, a +ual est' associada a uma fre+lJncia# Para preparar o T98?:6 para contar uma certa +uantidade de tempo de%eEse obter, com uma simples 1regra de trJs2, +uantos pulsos da fonte de contagem corresponde ao inter%alo de tempo dese8ado# Como a contagem crescente, retiraEse de =DM o n,mero de pulsos obtido, e o resultado carregado para o T98?:6# ( partir disto, o programa 7abilita a contagem e fica li%re para realizar outras ati%idades, pois o T98?:6 estar' sendo incrementado na fre+lJncia da fonte de contagem# Quando se atinge o numero =DD, o pr -imo incremento faz com +ue a contagem assuma o %alor zero# /esse instante o T98?:6 acusa o estouro !overflow" ao programa, indicando +ue se passou o tempo dese8ado# O programador pode ainda 7abilitar a ocorrJncia de uma interrup)o no momento do estouro, fazendo com +ue se8a e-ecutada uma fun)o espec.fica nesse instante# Por fim, o programa usu'rio pode tambm ler o %alor atual do T98?:6 para saber +uanto tempo se passou desde o in.cio da contagem#
=M

Por e-emplo, se a fonte de contagem tem fre+lJncia de CMHz e se dese8a 1agendar2 um estouro para da+ui a CD5gs, de%eEse carregar no T98?:6 o n,mero C5M !X=DME CD5", pois ser' contado de C5M at =DM !+ue corresponde ao zero de%ido ao overflow"# /o entanto, se necess'rio +ue os estouros ocorram periodicamente com inter%alos de CD5gs, de%eEse carregar o T98?:6 a cada estouro# ;en)o, ap s o primeiro estouro ser' contado de 5 a =DM, totalizando =DMgs# /ormalmente usaEse a fonte de rel gio interna para contagem, pois n)o necessita de hardware adicional# * para +ue se possa trabal7ar com %'rias fai-as de fre+lJncias e-iste o mecanismo de 1prescale2# O %alor atribu.do a esse parHmetro ser' usado como di%isor do clock interno# Portanto, se dese8ado +ue o T98?:6 se8a incrementado com a metade da fre+lJncia interna, o 1 prescale2 de%e configurado com o n,mero =# PodeEse usar os %alores =, I, 4, CM, F=, MI, C=4 ou =DM# *is outro e-emplo para esclarecer o funcionamento: dese8aEse obter e%entos com inter%alos de =5I4gs# ;abeEse +ue nos e-emplos abordados neste documento usaEse fre+lJncia de IMHz !F*$(", e +ue a fre+lJncia interna desses PICs !F()" s)o K da F*$(, ou se8a, CMHz !%ide p'gina F"# Portanto, a partir de F(), s poss.%el contar at =DMgs# Para atingir o inter%alo dese8ado podeEse utilizar um contador para saber +uantos estouros se passaram, ou a8ustar o prescale, o +ue bem mais simples# ;e esse for configurado com o %alor 4, o T98?:6 ser' incrementado a cada 4gs !F()S4", e, portanto, sua contagem pode ser de
=N

3igura C= G Interface entre o programa usu'rio e T98?:6

at =5I4gs, +ue o inter%alo dese8ado# Para este caso n)o necess'rio carregar nen7um %alor ao T98?:6, pois este de%e contar de 5 at =DM !+ue o zero da pr -ima contagem"#

3igura CF G Comportamento temporal do T98?:6 para este subE e-emplo

O primeiro e-emplo deste documento !Pisca 9*$" pode ser implementado com o uso do T98?:6, sem a necessidade do programa ter +ue trabal7ar contando o tempo, e com maior precis)o# Isso ocorre no pr -imo c digo, +ue faz um 9*$ piscar a 5,DHz#

SSEEEEEEEEEEEEEEEEEEEEEEEEEE Pisca 9*$ EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE Tinclude UCM34NM(#7V Tfuses \6 Tuse delaW!clocLXI555555" Tuse fastPio!a" Tuse fastPio!b" Tuse fastPio!c" s7ort ledZ unsigned int contZ TI/6P6IM*R5 %oid trataPtmr5!%oid"Y setPtimer5!CFCdgetPtimer5!""Z if!ddcontXXC=D"Y [ %oid main!%oid"Y setPtrisPa!5bCCCCCCC5"Z setPtrisPb!5bCCCCCCCC"Z setPtrisPc!5bCCCCCCCC"Z setupPtimerP5!R6CCPI/6*R/(9k R6CCP$IBPMI"Z setPtimer5!CFC"Z =4 contX5Z ledX]ledZ outputPbit!pinPa5,led"Z [

enablePinterrupts!?9OR(9k I/6P6IM*R5"Z O7ile!true"Y

[ [

SSEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEESS

E,-./0/12*" /esse programa o T98?:6 incrementado a cada MIgs e o per.odo entre estouros corresponde a C=D incrementos, ou se8a, 4ms# &m contador usado para indicar +ue se passaram C=D !coincidJncia" estouros desde a ,ltima altera)o da sa.da ligada ao 9*$# $etectada essa ocorrJncia, a sa.da tem seu n.%el l gico alterado e o contador zerado para recomear uma no%a contagem# Portanto, o estado do 9*$ muda a cada MIgs - C=D - C=D X C segundo#
TI/6P6IM*R5

Indica ao compilador +ue a pr -ima fun)o a rotina de tratamento para a interrup)o gerada pelo estouro do T98?:6#
setPtimer5!CFCdgetPtimer5!""Z

( cada estouro o programa carrega o T98?:6 com o %alor CFC# 3az a contagem correspondente ao per.odo de estouro ser de CFC a =DM, ou se8a, C=D# ( fun)o 1 getPtimer5!"2 ser%e para aumentar a precis)o da contagem, pois a fun)o 1setPtimer5!CFCdgetPtimer5!""Z2 n)o e-ecutada e-atamente no momento do estouro# *-iste um pe+ueno inter%alo de tempo entre o estouro e a e-ecu)o da rotina de tratamento, denominado 1tempo de latJncia da interrup)o2# ;upeEse +ue esse pe+ueno inter%alo corresponde a I incrementos do T98?:6# ;e n)o 7ou%esse a fun)o 1getPtimer5!"2, o T98?:6 seria carregado com o %alor CFC, porm nesse instante 8' 7a%eria se passado I incrementos desde o ,ltimo estouro# Isso faria com +ue o os estouros ocorressem a cada C=^ incrementos, o +ue destoa do c'lculo realizado# O uso de 1getPtimer5!"2 implica +ue o %alor carregado se8a CFD e a contagem at o pr -imo estouro se8a de C=C incrementos# *sse inter%alo mais o tempo de latJncia ocasionam C=D incrementos entre estouros#
if!ddcontXXC=D"Y =^

6este +ue indica se passaram C=D incrementos da %ari'%el 1conta2 desde a ,ltima altera)o da sa.da#
setupPtimerP5!R6CCPI/6*R/(9kR6CCP$IBPMI"Z

Configura o clock interno como fonte de contagem e o prescaler com MI, alm de 7abilitar o funcionamento do T98?:6# *ntretanto, a interrup)o s ocorrer' se for 7abilitada, o +ue feito na pr -ima fun)o#
enablePinterrupts!?9OR(9kI/6P6IM*R5"Z

Habilita a interrup)o referente ao estouro do T98?:6#

3igura CI G Comportamento temporal do T98?:6 e (*0B para esse e-emplo

F5

A-D0'9(?"
T/C?./ ASCII" Quando se utiliza a comunica)o serial os caracteres en%iados entre dispositi%os s)o codificados de acordo com a tabela (;CII, en%iandoEse o %alor bin'rio correspondente ao caractere dese8ado#

3igura CD G 6abela de s.mbolos (;CII e seus respecti%os %alores em decimal, octal e 7e-adecimal P90/;?8 PIC 16E628 ? 16E876/ Podemos e-trair in,meras informaes do dispositi%o ol7ando somente para a configura)o de pinos# B$$SB;; Pinos utilizados para a alimenta)o do dispositi%o, sendo B$$ a alimenta)o positi%a e B;; a alimenta)o negati%a# $e%e ser %erificado sempre a tens)o a ser utilizada# /ormamlemte essa pode ser de =#= B a D#D B, porm alguns modelos n)o podem ultrapassar um %alor m'-imo de F#M B# BPPSMC9R Pino ati%a)o do c7ip# *ste s estar' ligado se a tens)o nesse pino for B$$# FC

RWT: *-emplo : W: Port ao +ual o pino est' ligado# Para os dispositi%os abordados nesse material %emos os ports (, R e C T: bPosi)ob do pino no port# Comumente %emos n,meros de 5 a N, formando os ports de 4 bits !5 a N"# Os pinos com essa nomenclatura s)o utilizados como entradas eSou sa.das digitais# $e%eEse consultar +uais destes podem ser utilizados como entrada ou sa.da# Como e-emplo o pino R(D do PIC CMfM=4 pode ser utilizado somente como entrada# R\S6\: Pinos ligados < comunica)o serial !R;=F=", diretamente ligados ao perifrico &(R6 ou &;(R6, +ue tira a carga da comunica)o da rotina principal# O pino R\ utilizado para o recebimento de dados e o pino 6\ utilizado para en%iar dados# (/T: Pinos com essa nomeclatura s)o utilizados como canais de con%ers)o (S$, sendo T o n,mero do canal# BR*3dSBR*3E *stes pinos s)o utilizados para definir limeites superiores e inferiores < con%ers)o (S$, respecti%amente# ;e fizermos B R*3d X FB e BR*3EXCB, somente %alores anal gicos entre C e F B ser)o considerados, e toda a resoluc)o ser' concentrada nesse inter%alo, de modo +ue para uma con%ers)o de 4 bits, uma leitura de 5 representar' CB e uma leitura de =DD representar' FB 6TC_IS 6TO;OS 6TO;I: Os pinos 6TC_I e 6TO;I s)o utilizados como base de clocL para o timer T do microcontrolador, sendo +ue para um mesmo timer somente um de%e ser utilizado# O 6TO;5 utilizado para e-ternar a base de clocL do timer T# O;CCSO;C= Pinos de entrada para o oscilador +uando se utiliza um cristal# C9_I/SC9_O&6 Quando se utiliza um oscilador capaciti%o ou uma onda +uadrada como base de tempo do PIC, de%eEse conectar esse sinal ao pino C9_I/# *ste pode ser e-ternado pelo pino C9_O&6# CMPTSCCPT Pinos diretamente ligados ao perifrico capturaScompara)oSP>M, sendo sua fun)o configurada por softOare para gerar um sinal de fre+uJncia fi-a e tempo altoSbai-o %ari'%eis!P>M", guardar o %alor de contagem do timer associado com um est.mulo e-terno!captura" e controlar o pino associado +uando o contador c7egar ao %alor dese8ado!compara)o"# ;;S;C_S;$IS;$O Pinos associados < comunica)o ;PI, sendo ;; !sla%e select" o pino de sele)o do dispositi%o a transmitir, ;C9 o pino de clocL

F=

compartil7ado, ;$I e ;$O os canais de recebimento e transimss)o, respecti%amente# ;$(S;C9

Pinos associados < comunica)o I=C, sendo ;C9 o pino de clocL compartil7ado e ;$( o pino de comunica)o bidirecional# C_S$6 Os pinos C_ e $6 s)o utilizados para comunicarEse pela &;(R6 de forma s.ncrona, sendo C_ o clocL e $6 o canal de dados# P?CSP?$SP?M Pinos associados < gra%a)o do c7ip# *m P?C de%e ser fornecido o clocL, em P?$ os dados a serem programados e P?M utilizado somente para gra%a)o de bai-a tens)o#

I/6 Pino utilizado para a interrup)o e-terna# ;e 7ou%er uma %aria)o nesse pino a rotina de interrup)o engatil7ada#

FIN+

FF

Você também pode gostar