Você está na página 1de 42

Curso de Mcrocontroadores PIC

Programao em nguagem C
Introduo

O que um mcrocontroador?

Mcrocontroador X mcroprocessador

Apcaes

PIC16F628A e PIC16F876A
Estrutura bsca dos PICs usados

Cque para edtar os estos do texto mestre

Segundo nve

Tercero nve

Ouarto nve

Ounto nve
Caracterstcas Etrcas

GND e VDD: 2,2 a 5,5V (nos exempos: 5V)

Pno MCLR em 5 V (em 0V reseta o uC)

Pnos OSC1 e OSC2 gados a um crsta

O PIC16F628A dspensa o uso do MCLR e do crsta,


utzando apenas a amentao
Hardware mnmo
Hardware mnmo

Confgurao dos pnos (entradas ou sadas)

Confgurao dos perfrcos utzados

Decarao das varves da main()

Chamadas das funes ncas


Incazao

Letura das entradas

Processamento dos dados

Atuazao das sadas


Loop nfnto
Software mnmo
//---- Programa Esqueleto----
#include <16F628A.h>
#uses !"#$%&!'( "')%*$
#use dela+,cloc-./0000001

#use ast&io,a1
#use ast&io,31

4oid main,4oid15
set&tris&a ,031111111116
set&tris&3 ,0716

8hile,true15

9
9
//---- Programa Esqueleto----
#include <16F8:6A.h>

#uses ;#
#use dela+,cloc-./0000001

#use ast&io,a1
#use ast&io,31
#use ast&io,c1

4oid main,4oid15
set&tris&a ,031111111116

set&tris&3 ,0716
set&tris&c ,0716
8hile,true15
9
9
Software mnmo
O compador case nsenstve!
Output_hgh(pno);
Ex: output_hgh(PIN_A0);
Output_ow(pno);
Ex: output_ow(PIN_A1);
Output_togge(pno);
Ex: Output_togge(PIN_A2);
Output_x(dado);
Ex: Output_a(0b00010001);
Funes de sada / trs
Output_foat(pno)
Ex:
Output_foat(PIN_A4);
Output_drve(pno)
Ex:
Output_drve(PIN_A5);
deay_ms(tempo em msegundos);
deay_us(tempo em mcrosegundos);
deay_cyces(tempo em ccos);
Funes de deay
//---- Programa Esqueleto----
#include <16F628A.h>

#uses !"#$%&!'( "')%*$
#use dela+,cloc-./0000001

#use ast&io,a1
#use ast&io,31

4oid main,4oid15
set&tris&a ,031111111016

set&tris&3 ,0716

8hile,true15
ou<ut&high,<in&a016
dela+&ms,=0016
out<ut&lo8,<in&a016
dela+&ms,=0016
9
9
//---- Programa Esqueleto----
#include <16F8:6A.h>

#uses ;#
#use dela+,cloc-./0000001

#use ast&io,a1
#use ast&io,31
#use ast&io,c1

#use ast&io,d1

#use ast&io,e1

4oid main,4oid15
set&tris&a ,031111111016

set&tris&3 ,0716
set&tris&c ,0716
set&tris&d ,0716
set&tris&e ,0716
8hile,true15
ou<ut&high,<in&a016
dela+&ms,=0016
out<ut&lo8,<in&a016
dela+&ms,=0016
9
9
1Ex: Hello World!
1Ex: Hello World!
1Ex: Hello World!

Em uma entrada utzada para er um boto,


deve-se usar um resstor gado ao terra. Sem
o resstor (chamado de pull-down), se o boto
no estiver pressionado, o nivel lgico na
entrada no ser zero, pois este est e alta
iped!ncia" #sse estado pode ser
denoinado floating $flutuando), onde o sinal
no te u valor fi%o, fica variando
aleatoriaente e fun&o de ru'dos locais"
Push-button e o Resstor de Pu-
down
Input(pno);
Ex: f(nput(pn_a0)){
...
}
Input_x();
Ex: a = Input_a();
Input_state(pno);
Ex: estado = nput_state(PIN_A2);
Funes entrada dgta
//-------- Pisca *E> ---------
#include <16F628A.h>
#uses !"#$%&!'( "')%*$
#use dela+,cloc-./0000001

#use ast&io,a1
#use ast&io,31

4oid main,4oid15
set&tris&a ,031111111016
set&tris&3 ,0716

8hile,true15
i,in<ut,<in&c/11
ou<ut&high,<in&a016
else out<ut&lo8,<in&a016
9
9
//-------- Pisca *E> ---------
#include <16F8::A.h>
#uses ;#
#use dela+,cloc-./0000001

#use ast&io,a1
#use ast&io,31
#use ast&io,c1
#use ast&io,d1
#use ast&io,e1

4oid main,4oid15
set&tris&a ,031111111016
set&tris&3 ,0716
set&tris&c ,0716
set&tris&d ,0716
set&tris&e ,0716
8hile,true15
i,in<ut,<in&c/11
ou<ut&high,<in&a016
else out<ut&lo8,<in&a016
9
9
2Ex: (us)-button
2Ex: (us)-button

Podemos engathar uma rotna especfca


dentro do nosso mcrocontroador a partr de
snas externos ou mesmo eventos nternos do
mcrocontroador, sendo esta uma forma mas
efcente de controar as suas atvdades |
que desta forma no h perda de tempo ao se
reazar a etura do estado do pno a cada
cco de trabaho.
Interrupo externa

Enabe_nterrupts(parmetros)

Ex: enabe_nterrupts(GLOBAL|INT_RB0)
Ext_nt_edge(parmetros)
ex: ext_nt_edge(L_TO_H)
Defno da nterrupo:
#INT_RB
Vod funcao(){
cdgo
}
Funes bscas: Interrupo
3Ex: *nterrup&o #%terna
/----!nterru<?@o E7terna----/
#include <16F8::A.h>
#uses ;#
#use dela+,cloc-./0000001
#use ast&io,a1
#use ast&io,31
#use ast&io,c1
#use ast&io,d1
#use ast&io,e1

4oid main,4oid15
set&tris&a ,031111111016
set&tris&3 ,0716
set&tris&c ,0716
set&tris&d ,0716
set&tris&e ,0716
e7t&int&edge,*&#'&A16
ena3le&interru<ts,B*'CA*D!"#&$C16
8hile,true15
slee<,16
9
9
#!"#&$C
4oid <iscaled,4oid1
5
i,in<ut,<in&3011
5
dela+&ms,2016
i,in<ut,<in&3011
5
out<ut&toggle,<in&a016
9
9
9

#ncude <cdt.c>

Bboteca de comuncao com o LCD,

cd_nt()

Incaza o LCD

Lcd_gotoxy(poso x, poso y)

Va para a poso x,y do cd. O canto superor esquerdo a


poso (1,1)

cd_getc(poso x, poso y)

Pega o caracter da poso x,y

Prntf(cd_putc,"Mensagem")

Escreve a mensagem na tea a partr da poso atua.


Dspay LCD

\f - Apaga todo o contedo do cd e vota


poso (1,1)

\b - Vota 1 caractere no cd

\n - pua uma nha


Dspay LCD
4Ex: +ispla,
//--------- *%>
---------
#include <16F8::A.h>

#uses ;#
#use
dela+,cloc-./0000001

#use ast&io,a1
#use ast&io,31
#use ast&io,c1
#use ast&io,d1

#use ast&io,e1


#include <lcdt.c>
#deine lig out<ut&high
#deine des out<ut&lo8
#deine seta out<ut&3it
#deine es< dela+&ms
#deine led <in&a0
#deine 3ot <in&c/
#deine 3l <in&c:
4oid main,4oid15
unsigned int i6
set&tris&a,031111111016

set&tris&c,030111111116
lcd&init,16
<rint,lcd&<utc(EF!G HEEEEII E16

<rint,lcd&<utc(EFn P!%a<turandoE16
lig,3l16
des,led16
or,i.06i<66iJJ15
seta,led(Iin<ut,led116 es<,/0016
9
8hile,true15
i,in<ut,3ot115
<rint,lcd&<utc(EF FeliKE16
<rint,lcd&<utc(EFn L1E16
lig,led16 lig,3l16
9else5
<rint,lcd&<utc(EF #risteE16
<rint,lcd&<utc(EFn L,E16
des,led16 des,3l1
9
es<,20016
9
9
4Ex: +ispla,

Neste exempo o uC ser


confgurado para uma
converso de 8 bts, e o
range de tenso a ser
convertda ser o padro,
(0-5V). Portanto, essa
faxa ser dvdda em 256
partes guas, e o
resutado de uma
converso ser o byte
correspondente a parte
em que se encontra a
tenso convertda.
Converso Anagco -Dgta

Setup_adc_ports(parmetros)

Ex: setup_adc_ports(a_anaog);

Setup_adc()

Setup_adc(adc_cock_nterna)

Set_adc_channe()

Setup_adc_channe(0);

Read_adc()

Varave=read_adc
Converso AD
5Ex: ADC

Para cada para cada grau de temperatura


a tenso de sada do LM35 de 10 mV
Sensor de Temperatura : LM35
#include <16F8::A.h>

#uses ;#
#use dela+,cloc-./0000001

#use ast&io,a1
#use ast&io,31
#use ast&io,c1
#use ast&io,d1

#use ast&io,e1

#include <lcdt.c>
4oid main,4oid15
loat tem< . 06
set&tris&a ,031111111116

set&tris&c ,070111111116
5Ex: Termmetro (LM35)
setu<&adc,A>%&%*'%M&!"#E$"A*16
setu<&adc&<orts,A"016
set&adc&channel,016

lcd&init,16
<rint,lcd&<utc( E#estando *%>E16
out<ut&high,<in&c:16

8hile,true15
tem<.,loat1read&adc,1N=.0/
,2=6.0N0.0116
<rint,lcd&<utc( EF#em<eraturaLFnOE(
tem<16
dela+&ms,20016
9
9

A UART defnda como um perfrco de


comuncao entre dspostvos dgtas. Este
mduo se basea no protocoo RS-232, o mas
popuar padro de comuncao assncrona, ou
se|a, entre dspostvos com fontes de rego
dstntas. A grande maora dos uCs possuem
este )ardware integrado" Uma comuncao
sncrona permte uma taxa de transmsso mas
eevada, pos o nstante da etura do sna bem
defndo devdo refernca do rego. O nosso
exempo abordar a comuncao assncrona.
Comuncao Sera (UART)

Cque para edtar os estos do texto mestre

Segundo nve

Tercero nve

Ouarto nve

Ounto nve
Start bit: Avsa que a transfernca de um dado ser feta. Possu
nve gco zero.
Stop bit: Avsa que a transfernca do dado fo fnazada. Possu
nve gco um.
Baud rate: Determna quantos bts estaro contdos em um
segundo de comuncao.
Tempo de bit: o tempo de durao de um bt, tem o vaor 1/
(baud rate).
Payload: a carga de dados da comuncao, nesse caso o
caractere "a".

use rs232(parmetros)

Ex: #use rs232(baud=9600,rcv=PIN_C7,xmt=PIN_C6)

Putc(caracter)

Ex: putc(a)

Varve = Getc();

Ex: caractere = getc();

Puts(mesagem) ou prntf("mensagem")

Ex: puts("mensagem fez")

Varve = Gets();

Ex: msg = gets();

Kbht();

Ex: f(kbht());
Comuncao Sera (UART)
#include <16628A.h>
#uses !"#$%&!'( "')%*$
#use dela+,cloc-./0000001
#use rs2P2,3aud.Q600( rc4.<in&31( 7mit.<in&321
#use ast&io,a1
#use ast&io,31
4oid main,4oid15
char dado.RaR6
set&tris&a,031111111116
set&tris&3,031111101116
8hile,true15
i,in<ut,<in&a0115
dela+&ms,2016
i,in<ut,<in&a0115
<utc,dadoJJ16
i,dado .. RhR1 dado .
RaR6
dela+&ms,20016
99
9
9
8Ex: UART TX
8 Ex: UART TX

Cque para edtar os estos do texto mestre

Segundo nve

Tercero nve

Ouarto nve

Ounto nve
8Ex: UART RX
#include <16F8::A.h>
#uses ;#
#use dela+,cloc- . /0000001
#use ast&io,a1
#use ast&io,31
#use ast&io,c1
#use ast&io,d1
#deine use&<ort3&lcd true
#include <lcdt.c>
#use rs2P2,3aud.Q600 ( rc4 . <in&c:
( 7mit . <in&c61
4oid main,4oid15
char dado6
set&tris&a,031111111016
set&tris&c,031011111116
lcd&init,16

8hile,true15
i,-3hit,115
dado . getc,16
<rint,lcd&<utc(EF>adoLFn
OcE(
dado16
9
9
9
8 Ex: UART RX
#include <168::A.h>
#uses ;#
#use dela+,cloc-./0000001

#use ast&io,a1
#use ast&io,31
#use ast&io,c1
#use ast&io,d1

#use ast&io,e1


#include <lcdt.c>
#use rs2P2,3aud.Q600(
7mit.<in&c6( <arit+."(
rc4.<in&c:1
short lag.16
char dado.SMT6
#!"#&$>A
4oid int&rece3er,4oid15
dado.getc,16
lag.16
9
4oid main,4oid15
set&tris&a,0716
set&tris&c,031011111116

lcd&init,16
ena3le&interru<ts,B*'CA*16
ena3le&interru<ts,!"#&$>A16
8hile,#$UE15
i,lag15
<rint ,lcd&<utc(EF >adoL
E16
<rint ,lcd&<utc(EFn O1cE(
dado16
lag . 06
9
9
9
8Ex: RX Int. recebmento

Os -iers so perif.ricos responsveis pela


contage de tepo, as /ue tab. pode
ser usados para contar pulsos de u sinal
externo. So muto tes quando se dese|a um
ntervao de tempo precso entre eventos"
(ode realizar o papel da fun&o
0dela,1s$2)34, as peritindo /ue o
prograa trabal)e e outras atividades
en/uanto o tepo est sendo contado"
Tmer

setu<&timer&7,<arVmetros16

setu<&timer&0,$#%%&!"#E$"A*D$#%%&>!W&6/16

set&timer7,4alor16

E7L set&timer7,1P116

ena3le&interru<ts,<arVmetros16

ena3le&interru<ts,B*'CA*D!"#&#!)E$016

#!"#&timer7

>eine a un?@o de tratamento de


interru<?@o
Interrupo Tmer
11 Ex: Tmer 0
//----- Pisca *E> ------
#include <16F8::A.h>
#uses ;#
#use dela+,cloc-./0000001
#use ast&io,a1
#use ast&io,31
#use ast&io,c1
#use ast&io,d1
#use ast&io,e1
short led6
unsigned int cont6
#!"#&#!)E$0
4oid trata&tmr0,4oid15
set&timer0,1P1Jget&timer0,116
i,JJcont..12=15
cont.06
led.Iled6
out<ut&3it,<in&a0(led16
9
9
4oid main,4oid15
set&tris&a,031111111016
set&tris&3,031111111116
set&tris&c,031111111116
setu<&timer&0,$#%%&!"#E$"A*D$#%%&>!W&6/16
set&timer0,1P116
ena3le&interru<ts,B*'CA*D!"#&#!)E$016
8hile,true15
9
9

Cque para edtar os estos do texto mestre

Segundo nve

Tercero nve

Ouarto nve

Ounto nve
FIM

Você também pode gostar