Académique Documents
Professionnel Documents
Culture Documents
rodrigomax @ unifei.edu.br
13 de Dezembro de 2013
1 Licenciado
sobre
Contedo
1 Introduo
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
1.10
1.11
1.12
1.13
1.14
vingugem g F F F F F F F F F F F F F F F F F F F F
rrdwre utilizdo F F F F F F F F F F F F F F F F F
emiente de progrmo F F F F F F F F F F F F F
snstlo F F F F F F F F F F F F F F F F F F
gon(guro do grvdor sghP F F F F F
grio de um novo projeto F F F F F F F
sndento e pdro de esrit F F F F F F F F F F
gomentrios F F F F F F F F F F F F F F F F F F F F F
erquivos F e Fh F F F F F F F F F F F F F F F F F F F
hiretivs de ompilo F F F F F F F F F F F F F F
5inlude F F F F F F F F F F F F F F F F F F
5de(ne F F F F F F F F F F F F F F F F F F F
5ifdefD 5ifndefD 5else e 5endif F F F F F F
ipos de ddos em g F F F F F F F F F F F F F F F F
epresento inri e hexdeiml F F F
wodi(dores de tmnho e sinl F F F F F
wodi(dores de esso F F F F F F F F F F
wodi(dores de posiionmento F F F F F
wodi(dor de persistni F F F F F F F F
yperes ritmtis F F F F F F F F F F F F F F F
puno min@A F F F F F F F F F F F F F F F F F F F
otins de tempo F F F F F F F F F F F F F F F F F F
yperes om its F F F F F F F F F F F F F F F F F
xy F F F F F F F F F F F F F F F F F F F F F
exh F F F F F F F F F F F F F F F F F F F F F
y F F F F F F F F F F F F F F F F F F F F F F
y F F F F F F F F F F F F F F F F F F F F F
hift F F F F F F F F F F F F F F F F F F F F F
vigr um it @it setA F F F F F F F F F F F
hesligr um it @it lerA F F F F F F F F F
ror o vlor de um it @it )ipA F F F F
eri(r o estdo de um it @it testA F F
grindo funes trvs de de(ne9s F F F
heug de sistems emrdos F F F F F F F F F F
ixternlizr s informes F F F F F F F F
rogrmo inrementl F F F F F F F F F
gher possveis pontos de memoryElek F
guiddo om frgmento d memri
ytimizo de digo F F F F F F F F F F F
eproduzir e isolr o erro F F F F F F F F F
onteiros e endereos de memri F F F F F F F F F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
I
P
Q
Q
R
S
U
W
W
W
II
II
IP
IQ
IR
IS
IT
IU
IU
IV
IW
PI
PP
PQ
PQ
PR
PR
PR
PS
PT
PT
PU
PV
QP
QP
QQ
QQ
QQ
QQ
QQ
QR
2 Arquitetura de microcontroladores
2.1
2.2
2.3
2.4
eesso memri F F F F F F F F F F F F F F F F F F F F F F
glok e tempo de instruo F F F F F F F F F F F F F F F F
isquem eltrio e iruitos importntes F F F F F F F F F
wultiplexo nos terminis do miroontroldor
egistros de on(guro do miroontroldor F F F F F F
3.5
3.6
3.7
3.8
3.9
3.10
3.11
3.12
3.13
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
4.1
4.2
4.3
5.1
5.2
5.3
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
5 Anexos
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
36
QV
RH
RI
RP
RQ
45
RT
RV
SI
SP
SR
SS
SU
SU
TH
TP
TR
TV
UP
UP
UT
UW
VP
VP
VR
VT
VV
VW
WP
WR
WS
WW
100
IHI
IHP
IHR
IHU
IHV
110
on(gFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F III
sioFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IIP
snstlr grvdoresGdepurdores de sg em sistems xTR F F F F F F F F F F F F F F IIQ
ii
Lista de Figuras
IFI
IFP
IFQ
IFR
IFS
IFT
IFU
IFV
IFW
IFIH
IFII
F F F F F F F
emrdo
F F F F F F F
F F F F F F F
F F F F F F F
F F F F F F F
F F F F F F F
F F F F F F F
F F F F F F F
F F F F F F F
F F F F F F F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
I
P
R
S
T
T
U
IQ
IR
PH
PH
PFI
PFP
PFQ
PFR
PFS
PFT
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
QU
QV
QW
QW
RI
RQ
QFI
QFP
QFQ
QFR
QFS
QFT
QFU
QFV
QFW
QFIH
QFII
QFIP
QFIQ
QFIR
QFIS
QFIT
QFIU
QFIV
QFIW
QFPH
QFPI
QFPP
QFPQ
QFPR
QFPS
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
RV
SI
SP
SP
SQ
SU
SV
SV
SW
TI
TR
TR
TT
TU
TW
UQ
UQ
UR
UR
UR
UU
VP
VQ
VQ
VQ
iii
F
F
F
F
F
F
QFPT
QFPU
QFPV
QFPW
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
VR
VS
VS
VV
RFI
RFP
RFQ
RFR
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
IHR
IHV
IHV
IHV
iv
F
P
F
F
F F F
its
F F F
F F F
F
F
F
F
F
F
F
F
Lista de Tabelas
IFI
IFP
IFQ
IFR
IFS
IFT
IFU
IFV
IFW
F
F
F
F
F
F
F
F
F
Q
R
IR
IS
IT
PV
PW
QH
QI
PFI
RH
QFI
QFP
QFQ
QFR
QFS
QFT
QFU
RT
RW
SQ
TV
UP
UV
VW
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
F F F F F F
presler
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
Lista de Programas
IFI
IFP
IFQ
IFR
QFI
QFP
QFQ
QFR
QFS
QFT
QFU
QFV
QFW
QFIH
QFII
QFIP
QFIQ
QFIR
QFIS
QFIT
QFIU
QFIV
QFIW
QFPH
QFPI
QFPP
QFPQ
QFPR
QFPS
QFPT
QFPU
QFPV
QFPW
QFQH
RFI
RFP
RFQ
RFR
RFS
RFT
RFU
SFI
SFP
esumo do dispUsegF F F F F F F F F F F F F F F F F F F F F F F F F F F
esumo do dispUsegFh F F F F F F F F F F F F F F F F F F F F F F F F F F
istrutur de heder F F F F F F F F F F F F F F F F F F F F F F F F F F F
yperes ritmtis om tipos diferentes F F F F F F F F F F F F F F F
dispUsegF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
dispUsegFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
tilizndo iliote dispUseg F F F F F F F F F F F F F F F F F F F F F
teldoF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
teldoFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
ixemplo de uso d iliote teldo F F F F F F F F F F F F F F F F F F
ldFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
ldF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
ixemplo de uso d iliote de vgh F F F F F F F F F F F F F F F F F
rite g F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
ed g F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
otins de esrit e leitur no g F F F F F F F F F F F F F F F F F F F
otins de onverso fgh x inteiro F F F F F F F F F F F F F F F F F F
serilF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
serilFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
ixemplo de uso d iliote de omunio seril F F F F F F F F F F
dF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
dFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
ixemplo de uso d iliote de onversores eh F F F F F F F F F F F
pwmF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
pwmFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
ixemplo de uso d iliote ds sds w F F F F F F F F F F F F
timerF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
timerFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
ixemplo de uso d iliote de um temporizdor F F F F F F F F F F
eproduo de sons F F F F F F F F F F F F F F F F F F F F F F F F F F F
pontes de snterrupo F F F F F F F F F F F F F F F F F F F F F F F F F F
rtmento ds interrupes F F F F F F F F F F F F F F F F F F F F F F F
sniilizo do sistem om interrupes F F F F F F F F F F F F F F F
sniilizo do sistem om interrupes F F F F F F F F F F F F F F F
ixemplo de rquitetur singleEloop F F F F F F F F F F F F F F F F F F F
rolem n sinroni de tempo pr o singleEloop F F F F F F F F F F
ixemplo de sistem snterruptEdriven F F F F F F F F F F F F F F F F F F
ixemplo de sistem snterruptEdriven om se de tempo F F F F F F F
ixemplo de oopertive multitsking F F F F F F F F F F F F F F F F F F
ixemplo de oopertive multitsking om uso do top slot F F F F F F
ixemplo de sistem goopertiveEmultitsking om slot temporizdo
on(gFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
sioFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
vi
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
IH
IH
IQ
IV
SS
ST
ST
TP
TQ
TQ
TW
UH
UI
US
US
UT
UU
VH
VH
VI
VT
VT
VU
WH
WH
WI
WP
WQ
WQ
WR
WT
WU
WV
WW
IHI
IHI
IHP
IHQ
IHS
IHT
IHU
III
IIP
Captulo 1
Introduo
The real danger is not that computers will begin to think like men,
but that men will begin to think like computers.
E ydney tF rrris
rogrmo pr sistems emrdos exige um srie de uiddos espeiisD pois estes sistems
gerlmente possuem restries de memri e proessmentoF or se trtr de sistems om
funes espe(sD s rotins e tnis de progrmo diferem dquels usds pr projetos
de plitivos pr desktopsF
mm neessrio onheer mis fundo o hrdwre que ser utilizdoD pois d miE
roproessdor possui um rquitetur diferenteD om quntidde e tipos de instrues diversosF
rogrmdores voltdos pr desktops no preism se ter tnto estes itensD pois eles proE
grmm pr um sistem operionlD que reliz o ppel de trdutorD disponiilizndo um
interfe omumD independente do hrdwre utilizdo@pigur IFIAF
Aplicao
Sistema Operacional
Firmware
Hardware
pigur IFIX gmds de stro de um sistem operionl
r sistems emrdosD neessrio progrmr espei(mente pr o hrdwre em quesE
toF m opo pr se oter rti(ilmente est md de stro que er gerd pelo
sistem operionl utilizo de dois itensX um ompildor prprio pr o omponente em
questo e um iliote de funesF y ompildor ser o responsvel por trduzir lingugem
de lto nvel em um lingugem que o miroontroldor onsegue entenderF e iliote de
funesD ou frmeworkD em gerlD disponiilizd pelos frintes do miroontroldorF
1.1
Linguagem C
C is quirky, awed, and an enormous success.
E hennis wF ithie
xeste urso ser utilizd lingugem gF ist um lingugem om diverss rterstis que
tornm um o esolh pr o desenvolvimento de softwre emrdoF epesr de ser um
lingugem de lto nvelD permite o progrmdor um esso direto os dispositivos de hrdwreF
I
Introduo
Hardware utilizado
People who are really serious about software should make their own
hardware.
E eln uy
I uzzer ligdo um sd w
Notas de Aula ELT024 - Programao para Sistemas Embarcados
Introduo
Ambiente de programao
First, solve the problem. Then, write the code.
E tohn tohnson
Instalao
e el IFI present os softwres que sero utilizdos no ursoF
el IFIX oftwres utilizdos no urso
Item
shi
gompildor
vinkerGessemler
lugin wvef
Verso
Licena
wvef
VFSH
roprietrio
hgg
PFWFHH @winQPA
qv
qtils
HFIQFU @winQPA
qv
sdEmpl
HFI
qv
name 18f4550
using 18f2455
ror letr f minsul d primeir linhD pens do IVfRSSHD pr um p misuloX
name 18F4550
using 18f2455
Introduo
Localizao
gpsm
gpsmFexe
gXerquivos de progrmsgputilsin
sd link
sdFexe
gXerquivos de progrmshggin
sdIT
sdFexe
gXerquivos de progrmshggin
eps estes pssos sute wvef est pront pr trlhr om o ompildor hggCqtilsF
Introduo
Introduo
Introduo
E prnis qlssorow
Introduo
gdigo indentdo
1
gdigo no indentdo
i;
temp ;
teclanova =0;
InicializaSerial ( ) ;
InicializaDisplays ( ) ;
InicializaLCD ( ) ;
InicializaAD ( ) ;
for
InicializaSerial ( ) ;
InicializaDisplays ( ) ;
InicializaLCD ( ) ;
InicializaAD ( ) ;
for
(;;)
if
teclanova = Tecla ;
( i =0; i < 1 6 ; i++)
{
( BitTst ( Tecla ,
teclanova = Tecla ;
( i =0; i < 1 6 ; i++)
for
if
i) )
EnviaDados ( i +48) ;
i) )
EnviaDados ( i +48) ;
for
( BitTst ( Tecla ,
}
}
(;;)
AtualizaDisplay ( ) ;
( teclanova != Tecla )
if
for
if
=0;
AtualizaDisplay ( ) ;
( teclanova != Tecla )
{
(i = 0;
< 1000;
for
i++) ;
(i = 0;
< 1000;
i++) ;
odemos notr pelo digo nterior que quele que possui indento filit n veri(o
de quis instruesGrotins esto suordinds s demisF
yutr rtersti de pdronizo est n rio de nomes de funes e de vriveisF el
lingugem g um funo ou vrivel pode ter qulquer nome desde queX sej iniid por um
letrD misul ou minsulD e os demis rteres sejm letrsD nmeros ou undersore F
e lingugem g permite tmm que sejm delrds dus vriveis om mesmo nome so
possum letrs diferentes pens qunto ix @misul ou minsulAF or exemploX vr e
ver so vriveis distintsD o que pode gerr erro no desenvolvimento do progrmD usndo
dvids e erros de digitoF
or isso onvenionEse que os nomes de vriveis sejm esritos pens em minsulsF
undo o nome ompostoD se utiliz um misul pr difereniElos omoD por exemploD s
vriveis ontos e ontotlF
xomes de funo sero esritos om primeir letr misul e no so de nome ompostoD
d iniil ser grfd em misuloX sniilizeldo@AD ristem@AF
gs de de(nies @utilizdos em onjunto om diretiv 5de(neA sero grfdos exlusivE
mente em misuloX xwiyhiyveD gyxqesegsyxevF
gd hve ser olod num ni linhD onforme exemplo nteriorD evitndoEse onstruE
es do tipoX
if
( PORTA == 0 x30 ) {
PORTB
= 0 x10 ;
yu
if
( PORTA
PORTB =
== 0 x30 ) {
0 x10 ; }
Introduo
possui seu prprio onjunto de normsF importnte ter onheimento deste onjunto e pliElo
em seu digoF
y estilo dotdo nest postil onheido tmm omo estilo ellmnD sd @no emsA
ou exsD j que todos os doumentos do pdro exs g utilizm este estiloF epesr disto o
pdro exs g no espei( um estilo pr ser usdoF
1.5
Comentrios
If the code and the comments disagree, then both are probably
wrong.
E xorm hryer
#include
#define
int main int
< s t d i o . h>
DIST
(
260
/*
esse
mostrar
printf
return
1.6
programa
como
( " So
se
char *
argv [ ] )
serve
//
argc ,
para
distancia
insere
entre
SP
comentrios
Ita
*/
DIST ) ;
0;
Arquivos .c e .h
Diretivas de compilao
10
Introduo
10
11
12
13
14
15
apenas
dentro
deste
arquivo
// v a r i v e l
que
ser
usada
tambm
fora
do
arquivo
// f u n e s
usadas
dentro
8
9
usada
valor
fora
do
arquivo
val )
val ;
16
// c d i g o
17
18
void
da
funo
19
20
// f u n o
apenas
21
22
usada
AtualizaDisplay (
// c d i g o
da
void
dentro
deste
arquivo
funo
1
2
3
4
5
6
#ifndef
define VAR_H
void MudaDigito char val
char LerDigito void
void InicializaDisplays void
#endif
VAR_H
);
);
);
//VAR_H
11
Introduo
#include
e diretiv de ompilo 5inlude responsvel por permitir que o progrmdor utilize no seu
digo funes que form implementds em outros rquivosD sej por ele prprio ou por outrs
pessosF xo neessrio possuir o digo fonte ds funes que se desej utilizrF neessrio
pens de um rquivo que indique os prottipos ds funes @omo els devem ser hmdsA e
possuir funo disponvel em su form ompildF
im gerl um rquivo que possui pens prottipos de funes denomindo de reder e
possui extenso FhF
#dene
yutr diretiv muito onheid 5de(neF qerlmente utilizd pr de(nir um onstnteD
ms pode ser utilizd pr que o digo fonte sej modi(do ntes de ser ompildoF
yriginl
gompildo
#define
void main void
void
CONST 1 5
(
3) ;
puno yriginl
void
char
else
char
#endif
PADRAO Serial
* msg = " SERIAL " ;
* msg
printf ( msg ) ;
void
printf ( "%d" ,
15
3) ;
45
MostraSaidaPadrao ( )
#ifdef
main (
esultdo n el
esultdo n el
#include
#define
void main void
SERIAL
< s t d i o . h>
PADRAO S e r i a l
(
MostraSaidaPadrao ( ) ;
#include
#define
void main void
< s t d i o . h>
PADRAO LCD
(
LCD
MostraSaidaPadrao ( ) ;
elo digo presentdo pereemos que mesm funo wostriddro@AD present reE
sultdos diferentes dependendo de omo foi de(nid opo eheyF
ys de(ne9s tmm judm filitr lolizo dos dispositivos e justr s on(gures
no miroontroldorF odo perifrio possui um ou mis endereos pr os quis ele respondeF
istes endereos podem vrir inlusive dentro de um mesm fmliF or exemploX o endereo
d port h @onde esto ligdos os ledsA HxpVQF r ligr ou desligr um led preiso lterr
o vlor que est dentro do endereo HxpVQF r filitr este proedimentoD de(nido um
ponteiro pr este endereo e rotuldo om o nome yhF he(nir ypp omo H e yx omo I
filit leitur do digoF
Notas de Aula ELT024 - Programao para Sistemas Embarcados
12
Introduo
void
ImprimirTemp (
char
valor )
#ifdef
LCD
Imprime_LCD ( valor )
else
if
( valor > 3 0 )
led
= 1;
else
}
{
led
= 0;
#endif
//LCD
char
void
void
char
LerSerial (
EnviaSerial (
);
val ) ;
char
void
void
char val
LerTemperatura (
AjustaCalor (
);
);
od vez que funo verempertur@A for hmdD el deve fzer um teste e se o vlor for
mior que um ptmr hmr funo invieril@A om o digo HxQHF r isso o rquivo
tempFh deve inluir o rquivo serilFhF
);
);
od vez que funo vereril@A reeer um vlorD el deve hmr funo ejustglor@A
e repssr esse vlorF r isso o rquivo serilFh deve inluir o rquivo tempFh
);
val ) ;
13
Introduo
1
2
3
5
#ifndef
TAG_CONTROLE
#define
// t o d o
#endif
TAG_CONTROLE
contedo
do
arquivo
vem
aqui .
//TAG_CONTROLE
y prolem que deste modo rid um referni irulr sem (mX o ompildor l o
rquivo serilFh e peree que tem que inserir o rquivo tempFhF snserindo o rquivo tempFh
peree que tem que inserir o rquivo serilFhD onforme pode ser visto n pigur IFVF
temp.h
#include serial.h
char LerTemperatura(void);
void AjustaCalor(char val);
serial.h
#include temp.h
char LerSerial(void);
void EnviaSerial(char val);
temp.h
#include serial.h
char LerTemperatura(void);
void AjustaCalor(char val);
Tipos de dados em C
19 Jan 2038 at 3:14:07 AM. The end of the world according to Unix
(2
32
y tipo de um vrivel inform quntidde de memriD em bytesD que est ir oupr e omo
est deve ser interpretdX om ou sem fro @vrgulAF ys tipos sios de ddos n lingugem
Notas de Aula ELT024 - Programao para Sistemas Embarcados
14
Introduo
temp.h
#ifndef TEMP_H
#define TEMP_H
#include serial.h
char LerTemperatura(void);
void AjustaCalor(char val);
#endif
serial.h
#ifndef SERIAL_H
#define SERIAL_H
#include temp.h
temp.h
char LerSerial(void);
void EnviaSerial(char val);
#endif
#ifndef TEMP_H
//tag j definida,
//pula o contedo
#endif
g so presentdos n el IFQF
el IFQX ipos de ddos e fix de vlores
Tipo
Bits Bytes
Faixa de valores
hr
EIPV IPU
int
IT
EQPFUTV QPFUTU
)ot
QP
doule TR
odemos notr que s vriveis que possuem mior tmnho podem rmzenr vlores miE
oresF xotmos tmm que pens os tipos )ot e doule possuem ss deimisF
15
Introduo
SF Apresentar o resultado
or exemplo o nmero IVF
IVGP a WD resto 0
WGP a RD resto 1
RGP a PD resto 0
PGP a ID resto 0
IGP a HD resto 1
vendo do ltimo resultdo pr o primeiro temos que
IV10 a IHHIH2
hevido grnde utilizo de nmeros inrios n progrmo de ixo nvel muito omum
esrevermos estes nmeros n se IT ou hexdeimlF e vntgem de esrever o nmero nest
se que existe um onverso simples de inrio pr hexdeiml e o nmero resultnte
oup em menos espo n telF
e se hexdeiml possui IT 4uniddes4diferentesF gomo existem pens IH lgrismos no
sistem de numero rio @HD ID PD QD RD SD TD UD VD WA utilizmos T letrs pr omplementElos
@eD fD gD hD iD pAF e onversoD entre vlores inriosD deimis e hexdeimisD presentd
n el IFRF
el IFRX epresento deiml ! inri E hexdeiml
Decimal Binrio Hexadecimal Decimal Binrio Hexadecimal
HHHH
IHHH
HHHI
IHHI
HHIH
IH
IHIH
HHII
II
IHII
HIHH
IP
IIHH
HIHI
IQ
IIHI
HIIH
IR
IIIH
HIII
IS
IIII
16
Introduo
Bytes
Excurso mxima
unsigned hr
H PSS
signed hr
EIPV IPU
unsigned int
H TSFSQS
signed int
EQPFUTV QPFUTU
long int
EPFIRUFRVQFTRV PFIRUFRVQFTRU
H RFPWRFWTUFPWS
short int
EQPFUTV QPFUTU
Modicadores de acesso
hurnte o proesso de ompilo existe um etp de otimizo do progrmF hurnte est
etpD o ompildor pode retirr prtes do digo ou desfzer loops om perodos (xosF or
exemplo o digo ixoX
#define *
void main void
while X X
X (
( near
unsigned char *
) 0 xF83 )
!=
);
Starting
pCode
block
S_Teste__main code
_main :
. line
19
// T e s t e . c
while
(X!=X) ;
RETURN
#define * volatile
void main void
while X X
X (
(
near
unsigned char *
) 0 xF83 )
!=
);
17
Introduo
//
Starting
pCode
block
S_Teste__main code
_main :
_00105_DS_ :
. line
19
MOVLW
0 x83
MOVWF
r0x00
MOVLW
0 x0f
MOVWF
r0x01
MOVFF
r0x00 , FSR0L
MOVFF
r0x01 , FSR0H
MOVFF
INDF0 , r0x00
MOVLW
0 x83
MOVWF
r0x01
MOVLW
0 x0f
MOVWF
r0x02
MOVFF
r0x01 , FSR0L
MOVFF
r0x02 , FSR0H
MOVFF
INDF0 , r0x01
MOVF
r0x00 , W
XORWF
r0x01 , W
BNZ
_00105_DS_
RETURN
//
Teste . c
// p r i m e i r a
while
parte
(X != X) ;
do
// s e g u n d a
parte
// r e a l i z a
primeira
// p r i m e i r a
do
parte
parte
// r e a l i z a
segunda
// f a z
teste
endereo
leitura
do
// s e g u n d a
do
para
endereo
endereo
endereo
leitura
igualdade
odemos pereer queD deste modoD o ompildor fordo ler vrivel x dus vezes e relizr
o teste pr ver se el permnee om o mesmo vlorF
im lgums situes neessrio indir que lgums vriveis no podem reeer vlores
pelo progrmF r isto utilizmos plvr reservd constF tilizmos este modi(dor
pr indir que vrivel represent um lol que pens pode ser lido e no modi(doD por
exemplo um port pr entrd de ddosF xest situo omum utilizr s plvrs volatile
e const juntoF
// i n c i o
do
near
programa
unsigned char *
) 0 xF83 )
= 3;
33:
(=)
Modicadores de posicionamento
es vriveis podem ser delrds utilizndo os modi(dores near e farF istes modi(dores
indim o ompildor em qul regio de memri devem ser olods s vriveisF
e regio near gerlmente se refere zero pgeF um regio mis fil de ser essdF e
regio far exige mis tempo pr exeutr mesm funo que nearF
odemos pensr nests regies omo memri ew e memri ghe do omputdorF
e segund mis rpidD ms possui um lto usto e por isso gerlmente menorF im lgums
situes interessnte que lgums vriveis nun sim do heD pois so utilizds om
grnde frequni ou so rtis pr o sistemF
Modicador de persistncia
im gerlD s vriveis utilizds dentro ds funes perdem seu vlor o trmino d funoF r
que este vlor no se per podemos utilizr um modi(dor de persistniX sttiF gom esse
modi(dor vrivel pss possuir um endereo (xo de memri ddo pelo ompildorF elm
18
Introduo
1
2
3
4
5
6
7
8
var08
var08
var16
var32
var32
pont16
pont16
pont16
9
10
11
12
13
14
15
16
var08 + var16 ;
var08 + var08 ;
var08 * var08 ;
var32 / var16 ;
pont32 * var32 ;
var08 / var16 ;
pont32 * var32 ;
=
=
=
=
=
=
=
=
40
//
//
//
//
//
//
//
80;
//
disso o ompildor no reutiliz este endereo em nenhum outr prte do digoD grntindo
que n prxim vez que funo for hmd o vlor ontinue o mesmoF
// c r i a
um
contador
persistente
que
// i n c r e m e n t a d o
cada
chamada
de
funo
varivel_persistente
else
return
return
= 0;
}
{
( varivel_persistente ++) ;
}
}
1.9
1;
Operaes aritmticas
If people do not believe that mathematics is simple, it is only because they do not realize how complicated life is.
xeumnn
var8
var16 ;
//
corrigido
e som de dois hrD onforme linh WD segundo so pode gerr um prolem se mos
forem muito prximo do vlor limiteF or exemploX IHH C IHH a PHHD que no e num hrD
j que este s permite rmzenr vlores de EIPV IPUF
var16
var8
var8 ;
//
corrigido
19
Introduo
y tereiro so @linh IHA est orretoD multiplio de dois hr possui um vlor mximo
de IPUBIPUaITFIPWF y prolem que multiplio de dois hr ger um outro hrD perdendo
informoF neessrio relizr um typest ntesF
var16
= ((
int
) var8 )
* var8 ;
//
corrigido
y qurto so @linh IIA pode presentr um prolem de preisoF e diviso de dois inteiros
no rmzen prte frionriF e isto no for rtio pr o sistem est orretoF vemrr que
diviso de nmeros inteiros mis rpid que de nmeros frionriosF
y quinto so @linh IPA pode presentr um prolem de preisoF y resultdo d ont de
um nmero inteiro om um ponto )utunte um ponto )utunteF ermzenr esse vlor num
outro nmero inteiro ger perd de informoF
y sexto so @linh IQA present um prolem muito omumF e diviso de dois nmeros
inteiros ger um nmero inteiroF xo import se rmzenremos o vlor num vrivel de ponto
)utunte hver perd de informo pois os operandos so inteirosF r evitr esse prolem
neessrio um typestF
pont16
= ((
float
) var8 )
var16 ;
//
corrigido
xo stimo so @linh IRA pode hver perd de preiso pois o resultdo d opero um
douleD e estmos rmzenndo este vlor num )otF
y oitvo so @linh ISA similr o sextoF istmos relizndo um ont om dois nmeros
inteiros esperndo que o resultdo sej HDSF gomo os operndos so inteiros expresso ser
vlid omo resultnte em eroF m o prti sempre usr FH ou f ps o nmero
pr indir operes om vrgulF
pont16
= 40 f
80.0;
//
corrigido
float
while
(x
0.1;
!=
1.1)
y treho de digo im present um loop in(nitoF gomo existem restries de preiso nos
nmeros de ponto )utunte @)ot e douleA nem todos os nmeros so representdos (elmenteF
ys erros de rredondmento podem fzer om que ondio @x 3aIFIA nun sej stisfeitF
empre que houver neessidde de ompro om nmeros de ponto )utunte utilizr miorD
menor ou vriesF
float
while
(x <
0.1;
1.1)
Funo main()
odo sistem neessit de iniir em lgum lugrF im gerlD os miroontroldoresD ssim que
ligdosD prourm por sus instrues no primeiro ou ltimo endereo de memriD dependendo
d rquitetur utilizdF y espo de memri disponvel neste endereo gerlmente muito
Notas de Aula ELT024 - Programao para Sistemas Embarcados
20
Introduo
pequenoD pens o neessrio pr inserir um instruo de pulo e o endereo onde est funo
priniplF iste espo onheido omo posio de resetF ixistem ind outros espos de
memri similres este queD gerlmenteD so lodos prximosF y onjunto destes espos
onheido omo vetor de interrupo @pigur IFIIAF
Endereo Instruo
0x00
Pulo
0x01
0x8A
0x02
Pulo
0x03
0x55
0x04
...
0x55
0x56
0x57
0x58
0x59
Limpa A
A recebe
30
Testa A
0x8A
0x8B
0x8C
0x8D
0x8E
A recebe
50
Salva em
Porta B
...
...
21
Introduo
ompildores lom funo min@A em lgum lugr d memri onde hj espo disponvelF
hepois disso dispem de um instruo de pulo pr o primeiro endereo de memriD onde foi
lod funo minF
void
main
// a q u i
void
entra
)
o
cdigo
do
programa
yutr ois interessnte que pr sistems emrdos funo prinipl no reee nem
retorn ndF gomo el primeir ser hmd no h omo envir lgum vlor por prE
metroF il tmm no retorn nd pois o trmino dest o sistem no est mis opertivoF
im gerl sistems emrdos so projetdos pr omerem funionr ssim que ligdos e
pens prr su tref qundo desligdosF gomo tods s funionliddes so hmds dentro
d funo min@A1 esperEse que o progrm ontinue exeutndo s instrues dentro del t
ser desligdo ou reeer um omndo pr desligrF iste omportmento pode ser otido trvs
de um loop in(nitoF eixo esto s dus lterntivs mis utilizdsF
(;;)
(1)
// a q u i
entra
// c d i g o
// a q u i
principal
entra
// c d i g o
principal
Rotinas de tempo
1.11
E pord refet
muito omum neessitr que o miroontroldor (que um tempo sem fzer ndF m mneir
de tingir esse ojetivo utilizr um lo FOR 2 F
unsigned char
for i i
(
=0;
<
i;
10;
i++) ;
em
assembler
MOVF
r0x00 , W
SUBLW
0 x0a
MOVWF
r0x00
_00107_DS_ :
DECFSZ r0x00 , F
BRA _00107_DS_
1
equivalente
f o r ( i =0;
// i n i c i a l i z a W com
// c o l o c a
// muda
valor
valor
10
(1
i <10;
para
F,
o
(0 x0a )
se
i ++) ;
ciclo )
de W para
// d e c r e m e n t a
// " p u l a "
no
r e g i s t r o W (1
(1
ciclo )
F > 0
lugar
executa
marcado
prxima
linha
como _00107_DS_
(2
(1
ciclo )
ciclos )
Em sistemas mais complexos algumas tarefas so executadas independentemente da funo principal, tendo
ciclo )
22
Introduo
unsigned char i
for i i
for j j
for k k
(
=0;
<
34;
j, k;
i++) // 3
=0;
j++)
< 100;
=0;
<
+ 34
(30.003
// 3 + 1 0 0
k++) ;
98;
//
3 + 98
+ 3) =
1.020.207
instrues
(297 + 3) =
30.003
instrues
(3)
= 297
instrues
DL )
) // e x e c u t a DL
vezes .
=0;
<
34;
++) // 3 + 34
=0;
< 100;
=0;
<
98;
j++)
(30.003
// 3 + 1 0 0
k++) ;
//
3 + 98
+ 3) =
1.020.207
instrues
(297 + 3) =
30.003
instrues
(3)
= 297
instrues
}
}
}
1.12
E grl gn
Este valor s vlido quando estamos trabalhando com variveis char. Se utilizarmos variveis int o cdigo
Para 8MHz, 1 ciclo = 0.125s. No PIC, cada instruo precisa de 4 ciclos de clock, portanto 0.5s.
23
Introduo
NOT
e opero xy lgi retorn 9I9 @umA se o vlor for 9H9 @zeroA e 9H9 se o vlor for 9I9F
A !A
H I
I H
e opero itwise xy @operdor A exeut um xy lgiF ssso signi( que opero
relizd pr d um dos its d vrivelD no mis pr vrivel omo um todoF x tel
seguinte presentd diferen entre s dus operesF
Declarao
Lgico
char
result
= 12;
// A = 0 b 0 0 0 0 1 1 0 0
//
Bitwise
result
result
= ~A ;
A;
//
= 0
// A = 0 b 0 0 0 0 1 1 0 0
//
result
= 243
r = 0 b11110011
AND
e opero exh lgi @operdor 88A retorn H se lgum dos vlores for zeroD e I se os dois
vlores forem diferentes de zeroF
A B A&&B
H H
H I
I H
I I
char
char
Lgico
= 5;
//
// B = 0 b 0 0 0 0 0 1 0 1
result
//
result
= 8;
// A = 0 b 0 0 0 0 1 0 0 0
Bitwise
result
&&
= 1
B;
result
&
B;
= 0
// A = 0 b 0 0 0 0 1 0 0 0
// B = 0 b 0 0 0 0 0 1 0 1
//
r = 0 b00000000
Lembrar que para linguagem C uma varivel com valor 0 (zero) representa falso, e qualquer outro valor
representa verdadeiro.
24
Introduo
OR
e opero y lgi @operdor ||A retorn I se lgum dos vlores for diferente de zeroD e H se
os dois vlores forem zeroF
e f e||f
H H
H I
I H
I I
char
char
Lgico
result
//
result
= 8;
// A = 0 b 0 0 0 0 1 0 0 0
Bitwise
= 5;
//
result
B;
||
result
B;
= 13
// A = 0 b 0 0 0 0 1 0 0 0
= 1
// B = 0 b 0 0 0 0 0 1 0 1
// B = 0 b 0 0 0 0 0 1 0 1
//
r = 0 b00001101
XOR
e opero y no possui orrespondente lgi n lingugem gF ist opero pode ser
representd omo e y f a @e 88 3fA||@3e 88 fA
e
ef
char
char
Bitwise
result
= 8;
// A = 0 b 0 0 0 0 1 0 0 0
Lgico
= 5;
// B = 0 b 0 0 0 0 0 1 0 1
//
//
no
existe
em C
result
B;
= 13
// A = 0 b 0 0 0 0 1 0 0 0
// B = 0 b 0 0 0 0 0 1 0 1
//
r = 0 b00001101
Shift
e opero shift deslo os its pr esquerd @operdor ``A ou direit @operdor bbAF
neessrio indir qunts ss sero deslodsF
25
Introduo
Declarao
char
Shift Esquerda
result
= 8;
//
result
Shift Direita
<
<
result
2;
= 32
//
result
>
>
2;
= 2
// A = 0 b 0 0 0 0 1 0 0 0
// A = 0 b 0 0 0 0 1 0 0 0
//
// A = 0 b 0 0 0 0 1 0 0 0
//
r = 0 b00100000
r = 0 b00000010
H FFF
FFF H
#define
#define
void main void
char mascara
// d e f i n e ' s
para
TRISD
// i n c i o
do
volatile
volatile
portas
PORTD ( * (
(*(
de
unsigned char *
unsigned char *
entrada
near
near
programa
sada
) 0 xF83 )
) 0 xF95 )
TRISD
PORTD
// v a r i v e l
mascara
// l i g a
primeiro
bit
mascara
// L i g a r
bit
PORTD
PORTD
// mantm
2,
2;
todos
bit
varivel
<
<
guarda
porta
os
leds
mscara
D como
sada
( lgica
negativa )
varivel
//
mascara
for
da
= 1;
r o t a c i o n a s e
que
// c o n f i g u r a
= 0 x00 ;
// l i g a
//
= 0 x00 ;
= 0 b00000001
para
//
bit
desligando
que
bit
chegue
na
posio
= 0 b00000100
3o
led
mascara ;
sistema
ligado
indefinidamente
(;;) ;
desejada
26
Introduo
I FFF
FFF I
#define
#define
void main void
char mascara
// d e f i n e ' s
para
TRISD
// i n c i o
do
volatile
volatile
portas
PORTD ( * (
(*(
de
near
programa
unsigned char *
unsigned char *
entrada
near
sada
) 0 xF83 )
) 0 xF95 )
TRISD
PORTD
// v a r i v e l
mascara
// d e s l i g a
primeiro
bit
da
= 1;
a
todos
varivel
para
que
mascara << 2 ; // m a s c a r a =
// i n v e r t e s e o s v a l o r e s d e c a d a b i t
mascara = ~ mascara ;
// m a s c a r a =
PORTD
for
// mantm
bit
PORTD
o
&
2,
mscara
D como
os
leds
sada
( lgica
negativa )
mascara = 0 b00000001
// D e s l i g a
guarda
porta
varivel
//
r o t a c i o n a s e
mascara
que
// c o n f i g u r a
= 0 xFF ;
// l i g a
//
= 0 x00 ;
ligando
3o
bit
chegue
na
posio
desejada
0 b00000100
0 b11111011
led
mascara ;
sistema
ligado
indefinidamente
(;;) ;
H FFF
FFF H
27
Introduo
#define
#define
void main void
char mascara
// d e f i n e ' s
para
TRISD
// i n c i o
do
volatile
volatile
portas
PORTD ( * (
(*(
de
unsigned char *
unsigned char *
entrada
near
near
programa
sada
) 0 xF83 )
) 0 xF95 )
TRISD
PORTD
// v a r i v e l
mascara
// d e s l i g a
primeiro
mascara
// L i g a
PORTD
//
bit
2,
PORTD
mascara
mascara
// l i g a
PORTD
for
// mantm
2;
bit
//
bit
PORTD
mascara
sada
primeiros
leds
( lgica
negativa )
varivel
para
//
que
bit
chegue
na
posio
desejada
na
posio
desejada
mascara = 0 b00000100
desligando
mascara
// D e s l i g a
da
os
D como
mascara = 0 b00000001
<
<
primeiro
guarda
porta
todos
varivel
= 1;
mascara
3o
led
mascara ;
r o t a c i o n a s e
//
bit
= 1;
r o t a c i o n a s e
//
que
// c o n f i g u r a
= 0 xF0 ;
// l i g a
= 0 x00 ;
da
varivel
mascara = 0 b00000001
varivel
<
<
6,
6;
para
//
que
bit
chegue
mascara = 0 b01000000
ligando
7o
led
mascara ;
sistema
ligado
indefinidamente
(;;) ;
H FFF
FFF H
#define
#define
void main void
char mascara
char teste
// d e f i n e ' s
para
TRISD
// i n c i o
do
volatile
volatile
portas
PORTD ( * (
(*(
de
unsigned char *
unsigned char *
entrada
near
near
programa
sada
) 0 xF83 )
) 0 xF95 )
TRISD
teste
= 0 x00 ;
= 0 x00 ;
// r o d a r
// t e s t e
//
cria
mascara
//
que
guarda
mascara
// c o n f i g u r a
// d e s l i g a
depois
mesmo
uma
varivel
= 1;
=
//
a
mascara
( teste &
PORTD
porta
todos
os
programa
D como
sada
bits
com
os
bits
ligados .
= 0xff ;
// V e r i f i c a
// v a r i v e l
r o t a c i o n a s e
mascara
if
apenas
o n d e APENAS o
varivel
<
<
o
primeiro
bit
mascara = 0 b00000001
2;
bit
//
para
que
bit
chegue
na
posio
desejada
mascara = 0 b00000100
mascara )
= 0 x00 ;
// s e
resultado
for
verdadeiro
liga
todos
os
leds
A maioria dos compiladores C adotam uma varivel com valor diferente de zero como sendo verdadeiro.
28
Introduo
else
}
{
PORTD
= 0 xff ;
// s e
resultado
for
falso
desliga
todos
os
leds
for
// mantm
sistema
ligado
indefinidamente
(;;) ;
fit set
char
char
sso sso
bit = 2 ;
mascara ;
mascara = 1 << bit ;
arg = arg | mascara ;
//em
arg
linha
arg
(1<< bit ) ;
// ou
arg
|= (1<< bit ) ;
// L i g a n d o
ixemplo de uso
PORTD
bit
PORTD
da
porta
(1<<2) ;
// ou
PORTD
gom de(ne
=
|=
#define
(1<<2) ;
B i t S e t ( arg , b i t )
da
( ( arg )
porta
|= (1<< b i t ) )
29
Introduo
fit ler
char
char
sso sso
bit = 2 ;
mascara ;
mascara = 1 << bit ;
arg = arg & ~ mascara ;
//em
arg
linha
arg
// ou
arg
// D e s l i g a n d o
ixemplo de uso
PORTD
PORTD
bit
da
porta
& ~(1<<2) ;
// ou
PORTD
gom de(ne
&= ~(1<<2) ;
#define
B i t C l r ( arg , b i t )
da
( ( a r g ) &= ~(1<< b i t ) )
porta
30
Introduo
fit )ip
char
char
sso sso
bit = 2 ;
mascara ;
mascara = 1 << bit ;
arg = arg ^ mascara ;
//em
arg
linha
arg
^ (1<< bit ) ;
// ou
arg
^= (1<< bit ) ;
// T r o c a n d o
ixemplo de uso
PORTD
PORTD
valor
do
bit
da
porta
^ (1<<2) ;
// ou
PORTD
gom de(ne
^= (1<<2) ;
#define
BitFlp ( arg , b i t )
do
( ( a r g ) ^= (1<< b i t ) )
bit
da
porta
31
Introduo
fit test
sso sso
char bit
char mascara
mascara
bit
if arg mascara
if arg
bit
= 2;
;
= 1 <
<
//em
&
if
linha
& (1<<
// T e s t a n d o
ixemplo de uso
( PORTD
bit
))
da
porta
(1<<2) )
// . . .
#define
gom de(ne
if
BitTst ( arg , b i t )
// T e s t a n d o
bit
da
( ( a r g ) & (1<< b i t ) )
porta
( BitTst ( PORTD , 2 ) )
// . . .
32
Introduo
1.13
In the beginner's mind there are many possibilities; in the expert's
mind there are few.
E hunryu uzuki
Externalizar as informaes
e primeir neessidde onheer o que est onteendo em teu sistemF x progrmo
trdiionl pr desktop omum utilizrmos de mensgens no onsole visndo o estdo do
progrmF
do
programa
argv [ ] )
if
else
}
{
return
}
}
0;
hevemos ter em mente onde neessrio olor estes lerts e lemrr de retir-los do digo
(nlF
r pl em questo utilizremos o rrmento de leds que est ligdo port hF e opeE
ro deste dispositivo ser estudd posteriormente em detlhesF or enqunto st sermos
que d it d vrivel yh est ligd um led diferenteF or us d onstruo fsi
d plD o led eso om vlor H @zeroA e desligdo om o vlor I @umAF elm disso temos que
on(gurr port hF ssto feito iniindo vrivel sh om o vlor HxHH8 F
#define
#define
void main void
// d e f i n e ' s
para
volatile
volatile
near
todos
os
pinos
como
// d e s l i g a
todos
os
portas
PORTD ( * (
TRISD
// i n c i o
do
(*(
de
near
programa
unsigned char *
unsigned char *
entrada
sada
) 0 xF83 )
) 0 xF95 )
// c o n f i g u r a n d o
TRISD
PORTD
// l i g a
= 0 xFF ;
apenas
BitClr ( PORTD , 1 )
for
// mantm
sadas
= 0 x00 ;
bit
leds
1.
sistema
ligado
indefinidamente
(;;) ;
Mais informaes sobre debug de sistemas embarcados referir ao artigo The ten secrets of embedded debug-
As variveis PORTD e TRISD so denidas como unsigned char e possuem portanto 8 bits.
33
Introduo
Programao incremental
eo invs de esrever todo o digo e tentr ompilrD interessnte relizr testes inrementisF
e d ltero no digo relizr um novo testeF ivitr lterr o digo em muitos lugres
simultnementeD no so de preer um erro ( mis difil ser onde ele estF
Otimizao de cdigo
epens se preoupe om otimizo se estiver tendo prolems om o umprimento de trefsF
wesmo ssim onsidere em migrr pr um pltform mis poderosF istems emrdos
preonizm segurn e no veloiddeF
gso sej neessrio otimizr o digo nlise ntes o lol de relizr otimizoF xo
dint otimizr um funo grnde se el hmd pens um vezF tilizeEse de ferrments
do tipo pro(ler sempre que possvelF ssto evit perd de tempo e uxili o progrmdor
visulizr rel neessidde de otimizo de digoF
if
//
}
//
aqui
tem um monte
( PORTB >= 5 )
BitClr ( PORTD , 3 )
for
(;;) ;
aqui
continua
de
cdigo . . .
//PORTB no
// l i g a
// t r a v a
led
deveria
ser
um
valor
maior
que
programa
com um monte
de
cdigo . . .
5.
34
Introduo
1.14
Writing in C or C++ is like running a chain saw with all the safety
guards removed.
E fo qry
od vrivel rid rmzend em lgum lugr d memriF iste lugr de(nido de mneir
ni trvs de um endereoF
r onheermos o endereo de um vrivel podemos utilizr o operdor 8F guiddo3 iste
operdor tmm utilizdo pr relizo d opero itwise exhF ixemploX
// c r i a
int
varivel
num
endereo
de
// d e c i d i d o
pelo
a =
a = a +
printf (
printf (
);
// i m p r i m e
valor
);
// i m p r i m e
endereo
elF
memria
ser
compilador
0;
1;
&a
1
de
( por
exemplo
157821)
ixemploX
int * apint
float * apfloat
;
heveEse tomr uiddoD pois nos exemplos imD pint e p)ot so vriveis que rmzenm
endereos de memri e no vlores tipo int ou )otF y lugr eyxehy pel vrivel pint
que rmzen um inteiroD do mesmo modo que o lugr pontdo por p)ot rmzen um vlor
frionrioF
e quisermos mnipulr o vlor do endereo utilizremos pint e p)ot ms se quisermos
mnipulr o vlor que est dentro deste endereo devemos usr um steriso ntes do nome d
vrivelF ixemploX
apfloat = 3 . 2 ;
* apfloat = 3 . 2 ;
e primeir instruo indi o ompildor que queremos que o ponteiro p)ot ponte pr
o endereo de memri nmero QFPD que no existeD gerndo um erroF e quisermos gurdr o
vlor QFP no endereo de memri pontdo por p)ot devemos utilizr segund expressoF
r trlhr om ponteiros preiso muito uiddoF eo ser de(nidoD um ponteiro tem omo
ontedo no um endereoD ms lgo inde(nidoF e tentrmos usr o ponteiro ssim mesmoD
orremos o riso de que o ontedo do ponteiro sej interpretdo omo o endereo de lgum lol
d memri vitl pr outro progrm ou t mesmo pr o funionmento d mquinF xeste
so podemos provor dnos no progrmD nos ddosD ou mesmo trvr mquinF
neessrio tomr uiddo o iniilizr os ponteirosF y vlor triudo eles deve ser
relmente um endereo disponvel n memriF
or exemploD podemos rir um ponteiro que pont pr o endereo de um vrivel j
de(nidX
// d e f i n i n d o
varivel
ivar
35
Introduo
int
int
ivar ;
// d e f i n i n d o
// o
ponteiro
iptr
//
ponteiro
iptr
* iptr ;
as
iptr
recebe
valor
do
endereo
da
varivel
ivar
= &ivar ;
prximas
linhas
so
equivalentes
ivar = 4 2 1 ;
* iptr = 4 2 1 ;
gom sistems emrdos existem lguns endereos de memri que possuem rterstis
espeiisF istes endereos possuem registros de on(guroD interfes om o meio externo e
vriveis importntes pr o projetistF pelo meio d utilizo de ponteiros que possvel
essr tis endereos de mneir simplesD trvs d lingugem gF
Captulo 2
Arquitetura de microcontroladores
Any suciently advanced technology is indistinguishable from magic.
E erthur gF glrke
QT
37
Arquitetura de microcontroladores
38
Arquitetura de microcontroladores
Acesso memria
2.1
y termo possiilidde foi usdo pois pesr de poder lnr tod ess extensoD nem sempre
existe memri fsi pr rmzenmentoF odemos imginr memri omo um rmrioF m
rmrio om T suportes pode rigr t T gvetsF hepende do mreneiro frir e olor
s gvets neste rmrioF odemos t indir posio onde queremos gurdr lgum ojetoD
ms se gvet no foi olod no possvel rmzenr nd @pigur PFPAF
Suporte
nmero:
Existe
gaveta?
sim
sim
no
no
sim
no
39
Arquitetura de microcontroladores
Suporte
nmero:
Existe
gaveta?
Vitrine
Gaveta
Dispenser
No
Gaveta
Cofre
Vetor de
Interrupo
Stack 1
...
Stack 31
GPR1
GPR2
0x0000
0x0008
0x0018
Memria EEPROM
0x100
0x1FF
GPR3
0x200
0x2FF
GPR4
0x300
0x3FF
No implementado
Reset
Baixa prioridade
Alta prioridade
0x000
0x0FF
...
SFR
0xF60
0xFFF
0x0028
0x7FFF
0X8000
No implementado
0X1FFFFF
40
Arquitetura de microcontroladores
2.2
A
B
C
wultiplio de frionrios
A
B
C
= 123456;
=
=
= 1.23456
= 3.4567
=
A x B
//C =
//
A x B;
// 1 .
Converter
//
//
Multiplicar
os
nm er os
3.4567
// 2 .
34567
//
Multiplicar
somar
//
4267503552
10
^9
10
expoente
10
os
mesmo
^
nm er os
mantissa
12.3456
10
3.4567
10
42.67503552
10
//
// 3 .
//
para
12.3456
// e
123456
*
10 ^ 4
4.267503552
//
//
10 ^ 5
34567;
//C = 4 2 6 7 5 0 3 5 5 2
// 1 .
x
x
Corrigir
quantidade
4.267503552
10
de
casas
dec .
gonheer qunto tempo o digo lev pr ser exeutdo permite o desenvolvedor ser de
mneir determinsti qul exigni nvel de hrdwre pr o sistem emrdoF
or exemploX m sistem preis exeutr PHH operes d milsimo de segundoF gd
opero possui um quntidde diferente de trefs onforme podemos ver n el PFIF
el PFIX untidde de operes e trefs
Operao com: Quantidade Total de tarefas
I tref
IHR
IHR
P trefs
TQ
IPT
Q trefs
PI
TQ
R trefs
IP
RV
otl
PHH
QRI
y totl de trefs serem relizds de QRI trefs por milissegundoF ssso d um quntiE
dde de QRI mil trefs por segundoF e d tref relizd em um ilo de lokD preismos
de um miroontroldor ujo proessdor trlhe no mnimo em QRI krzF
Nmeros fracionrios podem ser armazenados de dois modos no ambiente digital. O modo mais comum o
41
2.3
Arquitetura de microcontroladores
42
Arquitetura de microcontroladores
e esolh de qul funionlidde ser utilizd depende do projetistF im sistems mis vnE
dos possvel inlusive utilizr mis de um funionlidde no mesmo terminl em perodos
lterndosD desde que o iruito sej projetdo levndo est opo em onsideroF
43
Arquitetura de microcontroladores
2.4
e miori dos terminis dos miroontroldores podem ser on(gurdos pr trlhr de diE
verss mneirsF ist on(guro relizd trvs de registros espeiisF istes registros
so posies de memri prEde(nids pelo frinteF r onheer quis so e o que fzem
preiso reorrer o dtsheet do omponenteF
elm dos registros de on(guro dos terminisD existem registros que indim omo o miE
roontroldor deve operrF y miroontroldor sg IVfRSSH possui dez registros que ontrolm
seu modo de operoD veloiddeD modo de grvoD etF istes registros so presentdos n
pigur PFTF
//
at
at
Watchdog
code
//
desligado
Oscilador
code
//
char
char
char
char
Pll
code
Sem
code
at
0 x300000
c/
0 x300001
controlado
0 x300003
programao
at
CONFIG1L
cristal
em
0 x300006
externo
CONFIG1H
por
HS
= 0 x0C ;
software
CONFIG2H
baixa
= 0 x01 ;
= 0 x00 ;
tenso
CONFIG4L
= 0 x00 ;
44
Arquitetura de microcontroladores
#pragma
#pragma
#pragma
#pragma
//
Oscilador
//
Pll
//
Watchdog
//
Sem
c/
config
cristal
externo
HS
FOSC = HS
desligado
config
CPUDIV = OSC1_PLL2
controlado
por
software
c o n f i g W T = OFF
D
programao
config
em
baixa
tenso
LVP = OFF
Captulo 3
E ghuk eid
Barramento de Led's(3.3)
Display de 7 segmentos(3.4)
Sadas PWM(3.9)
Leitura de teclas(3.5)
Conversor AD(3.8)
1
2
Perifricos que fornecem informaes aos usurios ou enviam comandos da placa eletrnica para o meio externo
Perifricos que recebem informaes ou comandos do meio externo
RS
46
3.1
gd port est ligd dois endereos de memriF y primeiro rmzen o vlor que
queremos ler do meio externo ou esrever pr o meio externo dependendo d on(guroF y
segundo endereo reliz ess on(guro indindo quis its sero utilizdos pr entrd e
quis sero utilizdos pr sd @el QFIAF
el QFIX indereos de memri pr s ports do sg IVfRSSH
Porta
ye
HxpVH
HxpWP
yf
HxpVI
HxpWQ
yg
HxpVP
HxpWR
yh
HxpVQ
HxpWS
yi
HxpVR
HxpWT
void
// i n c i o
void
do
main (
programa
// Para
que
// e l e s
so
definidos
ponteiro
// a )
unsigned
// b )
volatile :
volatile
volatile
// c )
near :
char :
near
near
0 =
//
1 =
* TRISD
sada
pois
os
unsigned char
unsigned char
que
todos
porta
D e
Tris
funcione
os
bits
podem
registro
est
* PORTD
* TRISD
pinos
representam
mudar
como
na
valores
qualquer
memria
de
momento
dados
= 0 xF83 ;
= 0 xF95 ;
sadas
( Output )
entrada
( Input )
= 0 b00000000 ;
// l i g a
apenas
* PORTD
= 0 b11110000 ;
for
// mantm
variveis
indica
// c o n f i g u r a n d o
//
as
para
como :
os
quatro
sistema
ltimos
ligado
leds
indefinidamente
(;;) ;
xotr queD por serem ponteirosD sempre que preisrmos utilizr o vlor de tis vriveis
neessrio que oloquemos o sterisoF
Notas de Aula ELT024 - Programao para Sistemas Embarcados
47
m outr mneir de mnipulr s ports rir de(ne9s que permitem o uso ds ports
omo vriveisD sem neessidde de utilizr ponteiros de modo explitoD nem sterisos no
digoF
#define
#define
void main void
// d e f i n e ' s
para
TRISD
// i n c i o
do
volatile
volatile
near
todos
pinos
portas
PORTD ( * (
(*(
de
near
programa
unsigned char *
unsigned char *
entrada
sada
) 0 xF83 )
) 0 xF95 )
// c o n f i g u r a n d o
TRISD
// l i g a
PORTD
for
como
sadas
apenas
os
quatro
ltimos
leds
= 0 b11110000 ;
// mantm
os
= 0 b00000000 ;
sistema
ligado
indefinidamente
(;;) ;
48
3.2
iinstein
E elert
49
2
4
7
8
9
10
13
14
16
17
19
20
21
22
25
26
27
28
29
30
33
34
35
36
37
38
39
40
Descrio do pino
AN0
RA0/
RA2
RA5
RE0
RE1
RE2
OSC1
OSC2
Funo
/AN2/VREF-/CVREF Display 2
/AN4/SS/C2OUT
Display 1
/AN5/CK1SPP
RS-LCD / Display 3
/AN6/CK2SPP
EN-LCD
/AN7/OESPP
/CLKI
RW-LCD / Display 4
Cristal
/CLKO/RA6
CCP2
CCP1
RD0
RD1
RD2
RD3
TX
RX
RD4
RD5
RD6
RD7
RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7
RC1/T1OSI/
RC2/
/P1A
Aquecedor
Ventilador / Buzzer
/SPP0
/SPP1
/SPP2
/SPP3
RC6/
RC7/
/CK
RS232
/DT/SDO
/SPP4
/SPP5/P1B
/SPP6/P1C
/SPP7/P1D
/AN12/INT0/SDI
/AN10/INT1/SCK
/AN8/INT2/VMO
/AN9/CCP2/VPO
/AN11/KBI0/CSSPP
/KBI1/PGM
/KBI2/PGC
/KBI3/PGD
50
TRISA =
ADCON1 =
0 b00000001 ;
0 b00001110 ;
// c o n f i g u r a n d o
// a p e n a s
os
terminais
primeiro
terminal
como
entrada
sada
analgico
e port f possui os R primeiros its omo sd e os qutro ltimos omo entrdF ist
port serve pr leitur d mtriz de hvesF possvel relizr leitur trvs de interrupoF
TRISB
0 b11110000 ;
// c o n f i g u r a o
INTCON =
INTCON2 =
// c o n f i g u r a n d o
interrupo
os
terminais
como
entrada
sada
pela
porta
no
habilitada
0 b11000101 ;
0 b00000001 ;
// c o n f i g u r a o
INTCON =
INTCON2 =
SPPCFG =
com
sem
interrupo
0 b00000000 ;
0 b00000001 ;
0 b00000000 ;
//RB0
RB4
so
controlados
pelo
SPP
0 b10000000 ;
0 b00001100 ;
0 b00001100 ;
0 b00101100 ;
0 b10010000 ;
0 b00001000 ;
0 b00000000 ;
0 b00100010 ;
// c o n f i g u r a n d o
os
terminais
segundo
como
// c o n f i g u r a
// c o n f i g u r a
terceiro
// c o n f i g u r a
transmisso
de
// c o n f i g u r a
recepo
dados
// c o n f i g u r a
sistema
// c o n f i g u r a
para
para
terminal
de
sada ,
apenas
RC7
entrada
como P M
W
como P M
W
dados
da
velocidade
da
serial
serial
56 k
// c o n f i g u r a
de
terminal
da
serial
56 k
0 b00000000 ;
// c o n f i g u r a n d o
os
terminais
como
sada
e port i possui pens os Q primeiros its on(gurdos omo sds digitisF o utilizdos
pr ontrole de tivo dos displys e tmm omo sinis de ontrole do vghF
TRISE
0 b00000000 ;
// c o n f i g u r a n d o
os
terminais
como
sada
51
3.3
Barramento de Led's
ixiste n pl utilizd um rrmento de V itsD onde d linh possui um led ssoidoF iste
rrmento est ligdo diretmente om port h do miroontroldor onforme pigur QFPF
void
main (
TRISD
PORTD
for
void
= 0 x00 ;
= 0 xF0 ;
(;;) ;
// c o n f i g u r a
// l i g a
// mantm
os
apenas
o
pinos
os
sistema
da
quatro
num
porta
D como
ltimos
loop
sada
bits .
infinito
52
3.4
Display de 7 segmentos
el pigur QFR podemos notr que pr que pre o nmero P no disply neessrio
ender os leds D D gD eD dF e estivermos utilizndo um disply om todo omumD preismos
olor um nvel lto pr ligr o ledD ou sejD o led lig om vlor I @umA e deslig om vlor H
@zeroAF ssto tmm onheido omo lgi positivF x el QFQ so presentdos os vlores
em inrio e em hexdeiml pr d represento lfnumri3 F hentre s letrs disponveis
esto presentds pens os rteres eD D gD dD iD pF ists form esolhids por serem s
mis utilizds pr presentr vlores em hexdeiml nos displysF xeste urso utilizremos
3
Notar que os valores hexadecimais apresentados servem apenas quando existe uma sequncia na ligao entre
a porta do microcontrolador e os pinos do display. Em alguns sistemas, o display pode ser controlado por duas
portas diferentes, ou possuir alguma alterao na sequncia de ligao. Para tais casos necessrio remontar a
tabela apresentada.
53
yrdem diret
I I I I I I H
Ui
H I I I I I I
Qp
H I I H H H H
QH
H H H H I I H
HT
I I H I I H I
Th
I H I I H I I
Sf
I I I I H H I
UW
I H H I I I I
Rp
H I I H H I I
I I H H I I H
TT
I H I I H I I
Sf
I I H I I H I
Th
I H I I I I I
Sp
I I I I I H I
Uh
I I I H H H H
UH
H H H H I I I
HU
I I I I I I I
Up
I I I I I I I
Up
I I I I H I I
Uf
I I H I I I I
Tp
I I I H I I I
UU
I I I H I I I
UU
I H I I I I H
Si
I I I I I H H
Ug
I H H I I I I
Rp
H I I I H H I
QW
H I I I I H I
Qh
I H I I I I H
Si
I H H I I I I
Rp
I I I I H H I
UW
I H H H I I I
RU
I I I H H H I
UI
void
main (
void
54
que
armazena
TRISD
TRISA
PORTA
for
0 x6F ,
= 0 x00 ;
converso
= { 0 x3F ,
[]
time ;
0 x06 ,
0 x77 ,
dos
algarismos
0 x5B ,
0 x7C ,
0 x4F ,
0 x39 ,
para
0 x66 ,
0 x5E ,
display
0 x6D ,
0 x79 ,
0 x7D ,
0 x71 } ;
seg
0 x07 ,
= 0 x00 ;
= 0 xFF ;
( var = 0 ;
var
<
var ++)
16;
// c o l o c a
PORTD
for
// a p e n a s
os
caracteres
em
sequncia
na
sada
conv [ var ] ;
para
contar
( time = 0 ;
time
tempo
< 65000;
time ++) ;
Multiplexao de displays
gd disply exige U ou V terminis de ontroleD so tmm sej utilizdo o ponto deimlF
r utilizr R displysD por exemplo um relgio om dois dgitos pr hors e dois pr minutosD
preisrmos de QP terminis de sdD o que pode ser um usto4 muito lto pr o projetoF
m tni que pode ser utilizd multiplexo dos displysF ist tni lev em ont
um efeito iolgio denomindo perepo retininF y olho humno inpz de pereer
mudns mis rpids que IGQH @sAF yutro ftor importnte que s imgens mis lrs
(m grvds n retin devido o tempo que lev pr sensiilizr e dessensiilizr s luls
@stonetesAF
heste modo podemos ligr e desligr rpidmente o disply que imgem ontinur n
retinF e ligrmos d displyD um por vezD sequenilmenteD de mneir su(ientemente
rpidD teremos impresso que todos esto ligdosF e frequni de hvemento deve ser
mis rpid que QHrzF
e pigur QFS present o iruito om R displys multiplexdosF ereemos que os terminis
iguis esto ligdos juntosF ereemos tmm que os terminis de todo omum esto d
um ligdo um sd diferenteF gom est rquitetur reduzimos quntidde de terminis
neessrios de QP pr IPD um eonomi de PH terminisF
ws est eonomi tem um ustoD o sistem se torn mis omplexo pois no podemos ligr
dois displys o mesmo tempoF
y ontrole de qul disply ser ligdo feito trvs do trnsistor que permite ligo do
todo omum o terrD ou o nodo omum o gg @depende do tipo de dispositivoAF r o
orreto funionmento no st gor ender os leds orretos pr formr o nmeroD temos
que seguir um lgoritmo mis omplexoX
IF colocar no barramento de dados o valor a ser mostrado no display X
PF ligar o display X atravs da linha de comando
QF esperar um tempo adequado para evitar icker5
RF desligar o display
SF escolher o prximo display (X+1)
TF voltar ao passo 1
4
Microcontroladores com mais terminais possuem um custo superior, mesmo possuindo os mesmos perifricos
internamente.
Se a taxa de atualizao dos displays for muito baixa, estes vo apresentar uma variao na intensidade, como
55
Criao da biblioteca
y progrm QFI present um exemplo de digo pr rir um iliote pr os displys de U
segmentosF y progrm QFP present o heder d ilioteF t o progrm QFQ present um
demonstro de uso d ilioteF
rogrm QFIX dispUsegF
1
2
#include
// v e t o r
armazenar
converso
do
display
0 x06 ,
0 x7D ,
5
6
7
8
9
10
11
AtualizaDisplay (
42
// d e s l i g a
44
PORTA
PORTE
45
dos
if
16
if
17
18
19
20
if
21
22
23
24
25
v0
pos )
val ;
v2
55
57
59
60
v3
62
break
case
63
val ;
64
65
void
67
InicializaDisplays (
30
// c o n f i g u r a o
34
BitClr ( TRISA , 2 )
BitClr ( TRISA , 5 )
BitClr ( TRISE , 0 )
BitClr ( TRISE , 2 )
35
// a p e n a s
31
32
33
36
ADCON1
37
// P o r t a
TRISD
38
AN0
dos
void
pinos
68
de
69
controle
72
73
74
;
1:
;
2:
;
3:
break
default
display
break
:
71
= 0;
}
}
analgico
= 0 x0E ;
de
display
0:
70
PORTD = valor [ v3 ] ;
BitSet ( PORTE , 2 ) ;
display = 0 ;
66
apenas
PORTD = valor [ v2 ] ;
BitSet ( PORTE , 0 ) ;
display = 3 ;
61
leds
( display )
break
case
58
( pos == 3 )
os
PORTD = valor [ v1 ] ;
BitSet ( PORTA , 2 ) ;
display = 2 ;
56
val ;
todos
= 0 x00 ;
break
case
53
54
( pos == 2 )
displays
PORTD = valor [ v0 ] ;
BitSet ( PORTA , 5 ) ;
display = 1 ;
52
val ;
os
51
= 0 x00 ;
// l i g a
49
void
= 0 x00 ;
switch
case
48
50
( pos == 1 )
v1
PORTD
47
== 0 )
43
46
displays
todos
// d e s l i g a
15
39
void
atual
display
14
28
// v a l o r e s
13
29
0 x39 ,
12
26
40
41
0 x7C ,
4
0 x5B ,
0 x07 ,
valor [ ] = { 0 x3F ,
0 x4F , 0 x66 , 0 x6D ,
0 x7F , 0 x6F , 0 x77 ,
0 x5E , 0 x79 , 0 x71 } ;
dados
= 0 x00 ;
da
vez
56
1
2
3
4
5
6
#ifndef
define DISP7SEG_H
void MudaDigito char val char
void AtualizaDisplay void
void InicializaDisplays void
#endif
DISP7SEG_H
pos ) ;
);
);
1
2
3
5
6
7
8
9
#include
#include
#include
do
10
11
12
14
15
tempo ;
InicializaDisplays ( ) ;
MudaDigito ( 0 , 0 ) ;
MudaDigito ( 1 , 1 ) ;
MudaDigito ( 2 , 2 ) ;
MudaDigito ( 3 , 3 ) ;
for
13
programa
(;;)
16
AtualizaDisplay ( ) ;
17
// g a s t a
18
19
20
for
um t e m p o
para
evitar
efeito
flicker
57
3.5
Leitura de teclas
el pigur QFT pereemos que tenso de sd igul gg qundo hve est desligdF
xo hvendo irulo de orrente no iruito qued de tenso em I zeroF
undo hve pressiond um orrente )ui de gg pr o terr pssndo por IF gomo
no existe nenhum outr resistni no iruitoD tod tenso ( em im de IF heste modo
tenso de sd pss ser zeroF
epesr do funionmento prentemente simplesD este tipo de iruito present um prolem
de osilo do sinl no momento em que tel pressiondF ist osilo onheid omo
ouning @pigur QFUAF
ists osiles indevids podem gerr ionmentos identisD usndo mu funionE
mento do progrmF r evitr isso podemos utilizr tnis de deouneD por hrdwre ou
softwreF
e opo de deoune por hrdwre pode ser visulizd n pigur QFVF
xeste iruitoD o pitor desempenh o ppel de morteedor do sinlF m iruito om um
resistor e um pitor possui um tempo de trso pr o sinlF iste o tempo neessrio pr
rregr o pitorF heste modo s lteres rpids no sinlD devido osilo meni d
hveD so (ltrds e no oorre o prolem dos hvementos indevidosD omo pode ser visto
n pigur QFWF xotr que o nvel do sinl (ltrdo no heg zero em nenhum momentoD devido
onstnte de tempo do (ltro g ser mior que o perodo de deouneF
58
59
VwrzA de HDS6 @sAF entes de utilizr o vlor que estmos lendo n port em questo devemos
esperr QHH ilos de lok ps lgum mudn pr ter ertez que o sinl se estilizouD ou
sejD fse de ouning ouF
xotr queD no digoD o ontdor iniido om o vlor PPF etrvs d nlise do ssemler
podemos ser que d ilo de onferni do sinl possui IR instruesF essim neessrio
que o sinl permne om o mesmo vlor durnte QHV ilos pr que vrivel vletul ree
o vlor d port fF istes vlores podem ser determindos empirimente trvs de testes om
osilospiosF
valTemp ;
valAtual ;
tempo ;
TRISB = 0 xF0 ;
// mantm o s 4 l t i m o s b i t s como e n t r a d a
TRISD = 0 x00 ;
// C o n f i g u r a a p o r t a D como s a d a
PORTB = 0 x00 ;
// l i g a o s 4 p r i m e i r o s b i t s
BitClr ( INTCON2 , 7 ) ;
// h a b i l i t a
p u l l up
ADCON1 = 0 b00001110 ; // c o n f i g u r a t o d o s o s b i t s da p o r t a B
for
como
digitais
(;;)
while
// a g u a r d a
uma
mudana
na
porta
( valAtual==PORTB ) ;
// q u a n d o
acontecer
alguma
mudana ,
conta
um t e m p o
pra
ver
se
valTemp = PORTB ;
tempo = 2 2 ;
( tempo > 0 )
while
if
( valTemp ==
PORTB )
//
se
no
mudar
continua
contar
tempo ;
permanente
60
else
}
{
valTemp
tempo =
PORTB ;
//
se
mudar ,
atualiza
sistema
reinicia
tempo
22;
}
}
valAtual = valTemp ; // v a l o r a t u a l i z a d o ;
PORTD = valAtual ; // c o l o c a o v a l o r no b a r r a m e n t o
de
leds
}
}
i,j;
chave [ 2 ] [ 4 ] = { { 0 , 0 , 0 , 0 } , { 0 , 0 , 0 , 0 } } ;
INTCON2 &= 0 x7F ;
// h a b i l i t a
p u l l up
ADCON1 = 0 b00001110 ; // a p e n a s AN0 a n a l g i c o ,
TRISB = 0 xF0 ;
// o s 4 l t i m o s b i t s s o e n t r a d a
TRISD = 0 x00 ;
// c o n f i g u r a a p o r t a D como s a d a
PORTD = 0 xff ;
for
for
(;;)
(i = 0;
<
2;
i++)
PORTB = 0 xff ;
// " d e s l i g a " t o d a s a s c o l u n a s
( j = 0 ; j < 1 0 0 ; j++) ;
BitClr ( PORTB , i ) ;
// " l i g a " o b i t da c o l u n a c o r r e s p o n d e n t e
for
for j
for j
if
// g a s t a
= 0;
= 0;
tempo
< 100;
// r e a l i z a
(!
<
4;
para
garantir
que
pino
atingiu
bit
atualiza
nvel
j++) ;
teste
para
cada
matriz .
j++)
chave [ i ] [ j ] = 1 ;
BitSet ( PORTD , j +4* i ) ;
else
}
{
chave [ i ] [ j ] = 0 ;
BitClr ( PORTD , j +4* i ) ;
}
}
alto
61
62
1
2
3
4
5
6
7
8
9
10
11
12
){
= 0;
<
4;
++){
PORTB |= 0 x0F ;
BitClr ( PORTB , ( i ) ) ;
15
// g a s t a
tempo
16
17
19
// l i g a
22
23
realizar
nvel
todas
coluna
funo
as
colunas
correspondente
necessrio
para
garantir
atualiza
que
pino
varivel
alto
< 1 0 0 ; ++) ;
o
= 0;
teste
<
4;
para
cada
bit
++) {
,
+4) )
,(
21
i * 4 )+j ) ;
,(
i * 4 )+j ) ;
BitClr ( valorNovo
24
if valorAntigo
tempo
else
25
26
27
==
valorNovo ) {
28
29
30
if
31
32
33
34
tempo = 1 0 ;
valorAntigo
valorNovo ;
( tempo == 0 ) {
valor = valorAntigo ;
}
}
void
void
InicializaTeclado (
){
TRISB = 0 xF0 ;
// q u a t r o e n t r a d a s e q u a t r o
INTCON2 &= 0 x7F ;
// h a b i l i t a
p u l l up
ADCON1 = 0 b00001110 ; // a p e n a s AN0 a n a l g i c o
SPPCFG = 0 x00 ;
39
40
41
42
(!
20
37
=0;
// r e a l i z a
18
38
sem
// d e s l i g a
for j j
j
for j
j
j
if BitTst PORTB j
BitSet valorNovo
else
atingiu
35
= 0 x0000 ;
= 0 x0000 ;
14
13
){
sadas
}
}
}
Criao da biblioteca
y progrm QFR present um exemplo de digo pr rir um iliote pr um teldo de
IT tels om leitur mtriilF y heder pode ser visto no progrm QFSF t o progrm QFT
present um demonstro de uso d ilioteF
63
1
2
4
5
6
7
#ifndef
TECLADO_H
#define
TECLADO_H
);
);
);
//TECLADO_H
1
2
3
5
6
7
#include
#include
#include
void
// i n c i o
8
9
11
12
13
14
16
programa
InicializaTeclado ( ) ;
TRISD = 0 x00 ; // C o n f i g u r a a p o r t a D como
PORTD = 0 xFF ; // d e s l i g a t o d o s o s l e d s
15
void
do
main (
while
10
sada
(1==1)
DebounceTeclas ( ) ;
PORTD = LerTeclas ( ) ;
}
}
64
3.6
y disply de vgh utilizdo neste urso possui dus linhs por IT oluns de rteresD ompE
tvel om o rhRRUVHF x pigur QFII presentdo um modelo genrio deste tipo de displyF
e pigur QFIP present o verso do disply om os terminis expostosF
65
IF Terra
WF Bit 2
2. VCC (+5V)
10. Bit 3
3. Ajuste do contraste
11. Bit 4
4. Seleo de registro(RS)
12. Bit 5
5. Read/Write (RW)
13. Bit 6
14. Bit 7
7. Bit 0
8. Bit 1
66
67
68
RS
RW
Tempo
7
Limpa todo o display e congura o endereo
37 us
1.52 ms
ID
37 us
37 us
37 us
1 DL
37 us
X 0
BF
para 0.
Congura o endereo para 0. Retorna o disde shift.
Congura a movimentao do cursor e o modo
de shift do display
Congura o display (D) inteiro para desligado
blinking (B) do cursor.
Move o cursor e/ou o display sem alterar o
contedo
Congura o tamanho da palavra (DL), nmero de linhas (N) e fonte dos caracteres (F)
Desloca o cursor para a posio desejada: linha e coluna.
Verica se o display est disponvel ou se est
ocupado com alguma operao interna.
SC RL
Coluna
37 us
10 us
N: 1 2 linhas, 0 1 linha
X: 1 2a linha, 0 1a linha
Criao da biblioteca
r filitr o ontrole do displyD podemos rir trs funesD um pr iniilizoD um pr
esrever um rtere e ltim pr envir um omndoF ists funes esto presentds no
progrm QFVD que onstitui um exemplo de ilioteF elm dests trs funes neessrio ter
um funo de delyD que grnt um determindo tempo pr que s informes sejm lids
orretmente pelo vghF
y heder dest iliote e um exemplo de omo usEl so presentdos nos progrms QFU
e QFWD respetivmenteF
69
1
2
3
4
5
6
#ifndef
define LCD_H
void EnviaComando char cmd
void EnviaDados char valor
void InicializaLCD void
#endif
LCD_H
);
);
);
//LCD_H
70
1
2
3
4
5
7
8
9
EN 1
Inicializa
12
13
14
//
18
19
20
config .
// c o n f i g u r a
22
// 8 b i t s ,
// modo
// z e r a
38
39
41
42
43
44
blinking
contadores
internos
display
EnviaComando ( 0 x01 ) ;
// p o s i o
inicial
EnviaComando ( 0 x80 ) ;
}
=0;
<
){
25;
++) ;
=0;
66
em
em
baixo
nvel
baixo
void
EnviaComando (
67
68
on
nvel
BitClr ( PORTE , RW ) ;
Delay40us ( ) ;
63
char
// comando
BitClr ( PORTE , RS ) ;
69
70
//
72
73
// h a b i l i t a
75
78
// t e r m i n a
leitura
leitura
BitClr ( PORTE , EN ) ;
// d e i x a
em
nvel
baixo
BitClr ( PORTE , RS ) ;
79
80
escrita
BitSet ( PORTE , EN ) ;
Delay2ms ( ) ;
74
76
habilita
BitClr ( PORTE , RW ) ;
PORTD = cmd ;
71
// d e i x a
em
nvel
baixo
BitClr ( PORTE , RW ) ;
Delay2ms ( ) ;
81
83
){
< 200;
Delay40us ( ) ;
// d e i x a
62
64
leitura
BitClr ( PORTE , RS ) ;
82
// d e i x a
77
45
46
61
leitura
BitClr ( PORTE , EN ) ;
60
5 x8
EnviaComando ( 0 x03 ) ;
33
37
59
incremental
// l i m p a r
31
36
linhas ,
// t e r m i n a
58
display
EnviaComando ( 0 x0F ) ;
29
34
// d i s p l a y , c u r s o r
27
32
(E/ S )
escrita
BitSet ( PORTE , EN ) ;
Delay40us ( ) ;
56
57
EnviaComando ( 0 x06 ) ;
25
30
// h a b i l i t a
55
EnviaComando ( 0 x38 ) ;
23
28
54
habilita
BitClr ( PORTE , RW ) ;
PORTD = valor ;
52
direo
valor )
BitSet ( PORTE , RS ) ;
//
53
de
21
26
o LCD
char
// d a d o s
50
16
17
24
49
Delay2ms ( ) ;
Delay2ms ( ) ;
Delay2ms ( ) ;
Delay2ms ( ) ;
Delay2ms ( ) ;
11
EnviaDados (
51
//
void
48
10
15
47
R
W 2
i++){
}
}
cmd )
71
1
2
3
5
6
7
8
9
10
11
12
#include
#include
#include
do
programa
[]
World !" ;
() ;
13
14
15
=0;
< 1 1 ; ++)
EnviaDados ( msg [ i ] ) ;
( j = 0 ; j < 6 5 0 0 0 ; j++) ;
for
for
16
17
(;;) ;
72
3.7
Comunicao serial
im gerl omunio entre dois dispositivos eletrnios relizd de modo serilD isto D s
informes so pssds it it do trnsmissor pr o reeptorF iste tipo de omunio
possui lgums vntgens em relo omunio prlelD n qul plvr @yteA envid
tod de um vezF
e primeir simpli(o do hrdwreF gomo os ddos so envidos um umD quntidde
de (os envolvidos n trnsmisso menorF
e segund mior tx de trnsmissoD o que primeir vist pode preer inonsistente
j que omunio prlel envi mis de um it o mesmo tempoF r frequnis muito
lts nem sempre o envio ds informes so sinronizds em todos os (osF ixiste tmm
o prolem do rosstlkingD onde o mpo mgntio gerdo por um o induz um tenso
no o djenteD trplhndo omunioF istes prolems umentm om frequniD
limitndo ssim mxim trnsferni possvel pelo rrmento prleloF este o motivo que
levou os projetists de hrdwre desenvolverem o protoolo eeD em detrimento o shiGeeD
pr omunio entre o rh e pl me onforme pode ser visto n el QFSF
el QFSX xs de trnsmisso pr diferentes protoolos
Protocolo
Taxa (bits/s)
Taxa (bytes/s)
eril wshs
QIFPS kitGs
QFW kfGs
PQHFR kitGs
PVFV kfGs
eril e mx
PFUTRV witGs
QRSFT kfGs
sP
QFR witGs
RPS kfGs
IH witGs
IFPS wfGs
s fus @p to IHHwrzA
IHH witGs
IPFS wfGs
S qitGs
TPS wfGs
rhws vF IFQ
IHFP qitGs
IFPUS qfGs
IDHTR witGs
IQQ wfGs
eril ee Q @eeETHHA
TDHHH witGs
THH wfGs
SDIPH witGs
TRH wfGs
IDPHH wfGs
I2C
y protoolo sPg foi desenvolvido pel hillips n dd de IWVH pr permitir que omponentes
eletrnios de um mesm pl pudessem se omunir de modo simples e filF y protoolo
iniilmente foi desenvolvido pr um omunio de IHHkpsF e verso RFH de PHIP 7 espei(
veloiddes de t SwrzF
iste um protoolo seril snronoD ou sejD o lok envido junto om o sinlD possiilitndo
o dispositivo reeptor ser o momento erto de ler os sinis no rrmentoF ssto permite o
desenvolvimento de um sistem ou dispositivo mis simples e onsequentemente mis rtoF
e espei(o normtiz um protoolo do tipo mestreGesrvo e permite mis de um mestre
ou esrvo no rrmentoF r isto d um dos dispositivos possue um registro de U ou IH
7
73
its que permite identi(Elo de mneir niF heste modo possvel onstruir um sistem
integrdo om ixo usto de onexoF e (gur QFIT mostr um exemplo de um rrmento om
mis de dois omponentes no mesmo rrmentoF
HT1380
y dispositivo rIQVH um relgio de tempo rel @gA om um protoolo proprietrio sedo
no sPgF m g um dispositivo espeilizdo em mnter ontgem de tempo pr longos
perodos de tempoF
74
elm dos dois terminis do protoolo @lok e ddosA este g possui um terminl pr hE
ilitrGdesilitr omunio do hipF e omunio tmm no exige um it de respost
omo no sPgF e (gur QFIV present form de ond que deve ser gerd pr omunio
entre os dispositivosF
75
void
//
Escreve
= 0;
(
comando
<
// A n a l i s a
8;
++) {
bit
ser
& 0
transmitido
() ;
10
RTC_IO_OFF ( ) ;
11
12
// p e g a
13
dados
14
// g e r a o
prximo
bit
>
>= 1 ;
do
pulso
16
17
// i n f o
de
clock
RTC_SCLK_ON ( ) ;
DELAY ( ) ;
15
19
20
21
valida
RTC_SCLK_OFF ( ) ;
DELAY ( ) ;
18
}
}
rogrm QFIIX ed g
1
2
3
4
5
= 0;
= 0;
<
8;
++) {
RTC_SCLK_ON ( ) ;
DELAY ( ) ;
//
informao
// RTC_IO_STATUS( ) ;
if
( RTC_IO_STATUS ( ) )
10
11
12
|=
0 x80 ;
// l e r
duas
vezes ,
problema
do H
W de
leitura
dados >>= 1 ;
RTC_SCLK_OFF ( ) ;
DELAY ( ) ;
13
14
15
16
return
17
18
dados
vlida
dados ;
76
void
char
ht1380write (
RTC_RESET_OFF ( ) ;
RTC_SCLK_OFF ( ) ;
RTC_IO_OFF ( ) ;
// l i g a
2
3
4
11
12
o RTC
RTC_RESET_OFF ( ) ;
RTC_SCLK_OFF ( ) ;
RTC_IO_OFF ( ) ;
14
15
16
19
addr <<= 1 ;
addr |= 0 x80 ; // w r i t e
writeByte ( addr ) ;
writeByte ( dados ) ;
9
10
20
dados )
RTC_RESET_ON ( ) ;
17
char
addr ,
char
RTC_RESET_OFF ( ) ;
RTC_SCLK_OFF ( ) ;
RTC_IO_OFF ( ) ;
21
22
23
28
RTC_RESET_ON ( ) ;
addr <<= 1 ;
addr |= 0 x81 ; // r e a d
writeByte ( addr ) ;
29
// muda
25
26
27
31
32
para
ler
sinais
RTC_RESET_OFF ( ) ;
RTC_SCLK_OFF ( ) ;
RTC_IO_OFF ( ) ;
RTC_IO_OUT ( ) ;
dados ;
34
35
36
37
38
39
pino
RTC_IO_IN ( ) ;
DELAY ( ) ; DELAY ( ) ; DELAY ( ) ; DELAY ( ) ;
dados = readByte ( ) ;
30
return
RS 232
y protoolo de omunio PQP @eommended tndrd PQPA muito utilizdo pr oE
munio entre dispositivos que trnsmitem ou reeem pou quntidde de informoF
um dos protoolos mis ntigos ind em usoD tendo seu primeiro uso em IWTP pr mquins
eletromenis de esreverF y pdro PQP reviso g dtdo de IWTWF im IWVT pree
Notas de Aula ELT024 - Programao para Sistemas Embarcados
77
1
2
3
4
5
6
7
8
char
rtcGetSeconds void
char value
value
ht1380read
return value
void rtcPutSeconds char
(
(0) ;
//
read
seconds
>
> 4 ) &0 x07 ) * 1 0 + ( value & 0 x0f ) ) ;
(((
ht1380write ( 0 ,
seconds )
( seconds % 1 0 )
{
|
((
seconds
10) <
< 4) ) ;
reviso h pel ise @iletroni sndustries ellineAF e verso tul do protoolo dtd de
IWWU pel se @eleommunitions sndustry essoitionA sendo hmd seEPQPEpF
y proedimento de envio de um vlor pel seril trvs do pdro PQP pode ser visto
omo um opero de itEshiftF
or exemplo letr uX em egss odi(d omo UT10 e em inrio omo IIHIHHIH2 F x
miori dos dispositivos primeiro se envi o it menos signi(tivoF entes de iniir trnsmisso
dos itsD envido um it de omeoD indindo que hver trnsmisso prtir dquele instnteF
eps isso o it menos signi(tivo envido pr sd do miroontroldorF elizEse ento
um shift pr direit e o novo it menos signi(tivo reenvidoF ist opero relizd
oito vezesF eps esse proedimento enviEse um it de prdD que pode ter duro de um ou
dois itsF
e pigur QFPI present o sinl eltrio8 envido o longo do tempo pr letr uF xotr
regio em rnoD que se estende entre CQ e EQF il indi regio de tenso n qul o
sinl no est de(nidoF gso tenso lid estej entre estes limiresD sej devido rudos ou
outros prolemsD o sistem de reepo no entender mensgem e os ddos sero perdidos
ou orrompidosF
Para o protocolo RS232 o nvel alto ou 1 (um) aquele com tenses positivas entre +3 e +15. O nvel lgico
78
reiso x de trnsmisso
FOSC
[64 (n + 1)]
FOSC
=
[16 (n + 1)]
Vits F232 =
Vits
ITits
ITits
F232
Vits F232 =
ITits
FOSC
[4 (n + 1)]
e equo que ger o menor erro tereirF gomo queremos trlhr om um omuniE
o ssnronD d el QFT otemos que os its de on(guro devem serX e@RA a HD
fehgyx@QA a I e e@PA a IF e seguir temos todo o proesso de on(guro d port
seril PQPF
BitClr ( BAUDCON , 0 )
BitSet ( BAUDCON , 3 )
BitClr ( BAUDCON , 6 )
BitClr ( RCSTA , 1 ) ;
BitClr ( RCSTA , 2 ) ;
BitClr ( RCSTA , 4 ) ;
BitClr ( RCSTA , 6 ) ;
; // D e s a b i l i t a
auto
deteco
; // R e g i s t r o
de
gerao
; // O p e r a o
de
recepo
// D e s a b i l i t a
bit
de
// D e s a b i l i t a
bit
erro
// H a b i l i t a
// S e l e c i o n a
bit
de
de
de
sinal
velocidade
com
16
bits
ativa
erro
na
de
overrun
comunicao
bits
recepo
79
BitSet ( RCSTA , 7 )
BitSet ( TXSTA , 2 )
BitSet ( TXSTA , 3 )
BitClr ( TXSTA , 4 )
BitSet ( TXSTA , 5 )
BitClr ( TXSTA , 6 )
SPBRGH = 0 x00 ;
SPBRG = 0 x22 ;
BitSet ( TRISC , 6 )
BitClr ( TRISC , 7 )
// C o n f i g u r a
//Modo
// E n v i a
//Modo
// H a b i l i t a
// S e l e c i o n a
// C o n f i g u r a
para
56 k
// C o n f i g u r a
para
56 k
// C o n f i g u r a
pino
de
recepo
// C o n f i g u r a
pino
de
envio
de
RX/TX como
alta
bit
pinos
velocidade
de
parada
de
comunicao
habilitado
( break
character
bit )
assncrono
transmisso
bits
(SPBRGH | SPBRG = 3 2 )
(SPBRGH | SPBRG = 3 2 )
como
como
entrada
sada
y proedimento de serilizo dos its feito de mneir utomti pelo hrdwreF inE
qunto ele est relizndo este proesso no devemos mexer no registro que rmzen o yte
ser envidoF or isso devemos veri(r se o registro est disponvelF ssto feito trvs do it R
do registro sF undo este vlor estiver em I st esrever o vlor que desejmos trnsmitir
no registro iqF
c)
(!
TXREG=c ;
,4) ) ;
// a g u a r d a
// c o l o c a
o
o
registro
valor
ficar
para
ser
disponvel
enviado
= 0;
resp
return
RCREG ;
resp ;
,5) )
// V e r i f i c a
// r e t o r n a
// r e t o r n a
se
existe
algum
valor
disponvel
valor
zero
Criao da biblioteca
y progrm QFIR present um exemplo de digo pr rir um iliote pr omunio
serilF y rquivo de heder presentdo no progrm QFIS e o exemplo de uso demonstrdo no
progrm QFITF
e seguir o rquivo de hederF
80
1
2
4
5
6
7
8
10
11
12
13
14
// c o l o c a
o
o
registro
valor
ficar
para
ser
disponvel
enviado
= 0;
void
23
24
25
26
27
28
resp
return
22
29
// a g u a r d a
17
20
,4) ) ;
16
21
TXREG=c ;
15
18
c)
,5) )
RCREG ;
// V e r i f i c a
// r e t o r n a
resp ;
// r e t o r n a
InicializaSerial (
void
TXSTA = 0 b00101100 ;
RCSTA = 0 b10010000 ;
BAUDCON = 0 b00001000 ;
SPBRGH = 0 b00000000 ;
SPBRG = 0 b00100010 ;
BitSet ( TRISC , 6 ) ;
BitClr ( TRISC , 7 ) ;
se
existe
algum
valor
disponvel
valor
zero
// c o n f i g u r a
transmisso
de
// c o n f i g u r a
recepo
dados
// c o n f i g u r a
sistema
// c o n f i g u r a
para
de
para
dados
da
velocidade
da
serial
serial
56 k
// c o n f i g u r a
de
56 k
// p i n o
de
recepo
de
// p i n o
de
envio
da
serial
dados
de
dados
1
2
3
4
5
6
#ifndef
define SERIAL_H
void EnviaSerial unsigned char c
unsigned char RecebeSerial void
void InicializaSerial void
#endif
SERIAL_H
);
);
);
//SERIAL_H
81
1
2
3
5
6
7
8
9
10
11
#include
#include
#include
do
programa
[]
World !" ;
TRISD = 0 x00 ; // a c e s s o
InicializaSerial ( ) ;
j =0;
12
for
13
14
15
aos
leds
(;;)
for
16
// d e l a y
17
18
(i = 0;
// e n v i a
< 65000;
21
EnviaSerial ( msg [ j ] )
j ++;
( j > 11)
22
19
i++) ;
dados
if
20
23
24
j =0;
EnviaSerial ( 1 3 ) ;
25
26
// r e c e b e
27
if
resp
28
29
30
31
PORTD
resp ;
32
33
dados
RecebeSerial ( ) ;
( resp ! = 0 )
=
}
}
82
3.8
Conversor AD
Elementos sensores
e onverso eh muito utilizd pr relizrmos leitur de sensoresF odo sensor sedo
num trnsdutorF m elemento trnsdutor quele que onsegue trnsformr um tipo de grndez
em outroD por exemplo um lmpd inndesente @pigur QFPPAF
VRL =
VS R2
R2
= VS (
)
R1 + R2
RPot
210
83
84
Processo de converso AD
ixistem lguns iruitos que relizm onverso de um sinl nlgio dvindo de um trnsE
dutor pr um sinl digitl om um preiso ritrriF
e ordgem mis simples utilizo de omprdoresF gd omprdor possui um
nvel diferente de tenso de referniF istes nveis so esolhidos de form que represento
inri f sentidoF
ixemploX gonverso de um vlor nlgio que vri de zero ino volts num plvr
digitl de dois itsF
r N its temos 2N representes diferentesF interessnte ento dividir mplitude
iniil por 2N divises iguisF r N = 2 temos R representes de IFPSv dF omum
nestes omprdores que primeir tenso possu um o'setF
epresento inri om P its lor em tenso lor em enso om o'set
HH
HFHHH
HFTPSv
HI
IFPSH
IFVUSv
IH
PFSHH
QFIPSv
II
QFUSH
RFQUSv
85
5
11
4,375
10
3,125
01
1,875
00
0,675
Intervalos
de valor
Limites de
comparao
86
rogrm QFIUX dF
1
2
3
4
5
6
7
8
9
11
12
13
14
15
16
BitSet ( TRISA , 0 ) ;
ADCON0 = 0 b00000001 ;
ADCON1 = 0 b00001110 ;
ADCON2 = 0 b10101010 ;
// s e t a
bit
// s e l e c i o n a
// a p e n a s
//FOSC
0
o
AN0
/32 ,
como
canal
entrada
0
liga
analgico ,
Alinhamento
ad
referncia
direita
tempo
baseada
de
na
fonte
c o n v = 12 TAD
,1) ;
ADvalor
ADvalor
ADvalor
17
18
19
20
return
;
// i n i c i a
, 1 ) ) ; //
ADRESH ;
//
converso
espera
o
terminar
converso ;
resultado
<
<= 8 ;
+= ADRESL ;
ADvalor ;
1
2
3
4
5
#ifndef
define ADC_H
void InicializaAD void
int LeValorAD void
#endif
ADC_H
);
);
//ADC_H
y iruito eletrnio responsvel pels ompres pode ser visulizdo n pigur QFPVF
y iruito d pigur QFPV onheido omo onversor nlgio digitl do tipo )sh onde
d nvel de tenso possui seu prprio omprdorF ixistem outrs ordgens que minimizm
o uso de onversores @prte mis r do iruitoA ms inserem trso no proesso de onversoF
y trso depende do tipo de iruito que implementdoF
Criao da biblioteca
od onverso lev um determindo tempo queD onforme itdo n seo nteriorD depende
d rquitetur que estmos utilizndoD d qulidde do onversor eD lgums vezesD do vlor de
tenso que queremos onverterF r que o miroontroldor relize orretmente onverso
neessrio seguir os seguintes pssosX
IF gon(gurr o onversorY
PF sniir onversoY
QF wonitorr o (nl d onversoY
RF ver o vlorF
ys progrms QFIU e QFIV presentm os rquivos de digo e heder de um iliote
exemplo pr onversores nlgios pr digitl no miroontroldor sgF y progrm QFIW
present um digo exempli(ndo o uso d iliote ridF
87
1
2
3
4
5
6
7
8
9
10
programa
= 0;
InicializaDisplays ( ) ;
InicializaAD ( ) ;
for
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
do
(;;)
temp = LeValorAD ( ) ;
temp %= 1 0 0 0 0 ;
MudaDigito ( temp / 1 0 0 0 , 3 ) ;
temp %= 1 0 0 0 ;
MudaDigito ( temp / 1 0 0 , 2 ) ;
temp %= 1 0 0 ;
MudaDigito ( temp / 1 0 , 1 ) ;
temp %= 1 0 ;
MudaDigito ( temp
,0) ;
AtualizaDisplay ( ) ;
( i = 0 ; i < 1 0 0 0 ; i++) ;
for
88
3.9
Sadas PWM
es sds w so sds digitis que possuem um hvemento opldoF y sinl mud seu
estdo de positivo pr zero vris vezes por segundoF e porentgem do tempo que este sinl
permnee em nvel alto de(ne o ilo de trlhoD ou duty yleD d sdF e pigur QFPW
present Q sinis w om mesm frequni ms om duty yle diferentesF
Freq.PWM =
FOSC
[(PR2 ) + 1] 4 (TMR2 Prescaler )
FOSC
log( FPWM )
log(2)
bits
Para ser considerada sucientemente alta a frequncia do PWM deve possuir um valor mais alto que a maior
suciente para que o sistema no sinta esse impacto. No entanto cada caso deve ser analisado em particular
89
PFHHHFHHH
UFVIPDS
SHHFHHH
IFWSQDP
IT
IPSFHHH
RVVDQ
DutyCycle PWM =
Criao da biblioteca
r on(gurr s sds w devemos espei(r frequni de trlho trvs de P
e gyxPD lm do duty yle em ggIv e ggPvF xo registro sg on(gurdo o
terminl omo um sd e em ggIgyx e ggPgyx de(nimos que ele deve trlhr omo
um wF y presler foi on(gurdo pr IT its de modo oter mior fix de frequni
udvel disponvel @el QFUAF xotr que importnte relizr primeiro multiplio e
somente depois divisoD pr no hver perd de informoF xo progrm QFPH presentdo
um digo exemplo de omo rir s rotins de opero do wF y heder dest iliote
presentdo no progrm QFPIF or (mD o progrm QFPP present um exemplo de utilizo
dest ilioteF
90
1
2
4
5
// f r m u l a
// DC_porcento = V /
unsigned int
val
10
11
val
val
13
// o s
CCPR1L
15
// o s
void
val
/=
|=
>
>
unsigned int
*
4 = DC *
apenas
10
( PR2+1)
/25
) porcento )
* ( PR2 +1) ;
bits
bits
so
colocados
no CCPR1L
2;
dois
so
colocados
unsigned char
256 =
na
posio
do CCP1CON
do CCP1CON
4;
26
// o s
25.600
val
porcento * PR2 ;
que
tem
apenas
10
bits
&= 0 x03ff ;
8
27
CCPR2L
28
// o s
primeiros
val
ltimos
CCP2CON
29
porcento )
25;
// g a r a n t e
val
|=
>
>
bits
so
colocados
no CCPR1L
2;
dois
so
colocados
na
posio
4;
void
SetaFreqPWM (
34
//PR2 =
PR2
35
unsigned int
freq )
f o s c / ( fpwm * 4 * p r e s c a l e r ) 1 =
= ( 1 2 5 0 0 0 / ( freq ) )
(8000000/( f r e q *4*16) )
1;
void
40
41
42
43
44
45
46
val
SetaPWM2 (
25
39
tem
ltimos
// 1 0 0
24
38
= ((
25;
unsigned int
23
36
val
que
22
33
( ( PR2+1) * 4 ;
( PR2+1)
21
32
cycle :
primeiros
CCP1CON
16
30
duty
&= 0 x03ff ;
14
20
// g a r a n t e
12
19
do
//V = DC/ 1 0 0
17
porcento )
InicializaPWM (
void
BitClr ( TRISC , 1 ) ;
BitClr ( TRISC , 2 ) ;
T2CON
|= 0 b00000011 ;
BitSet ( T2CON , 2 ) ;
CCP1CON |= 0 b00001100 ;
CCP2CON |= 0 b00001100 ;
// c o n f i g u r a
os
// c o n f i g u r a
// L i g a
pinos
como
prescale
timer
do
sadas
timer
para
// c o n f i g u r a
CCP1 como um P M
W
// c o n f i g u r a
CCP2 como um P M
W
1
2
3
4
5
6
7
#ifndef
define PWM_H
void SetaPWM1 unsigned char porcento
void SetaPWM2 unsigned char porcento
void SetaFreqPWM unsigned int freq
void InicializaPWM void
#endif
P M H
W _
(
(
);
);
);
);
//P M H
W _
1:16
91
1
2
3
4
5
6
7
8
9
do
programa
InicializaPWM ( ) ;
InicializaAD ( ) ;
for
10
11
(;;)
temp
12
13
{
=
LeValorAD ( ) ;
// a j u s t a n d o
frequncia
14
15
// a j u s t a n d o
de
acordo
com
entrada
analgica
SetaFreqPWM ( temp ) ;
17
18
d u t y c y c l e
para
50%
SetaPWM1 ( 5 0 ) ;
16
}
}
92
1
2
3
4
5
6
7
8
9
10
12
13
14
(!
void
// t e m p o
em
micro
,2) ) ;
unsigned char
// p a r a
placa
unsigned int
segundos
ResetaTimer (
com
8MHz 1
19
20
21
22
ciclos
tempo )
us = 2
ciclos
tempo * 2 ;
// o v e r f l o w a c o n t e c e com 2^15 1 = 6 5 5 3 5 ( max u n s i g n e d i n t )
ciclos = 6 5 5 3 5 ciclos ;
ciclos = 1 4 ; // s u b t r a i t e m p o d e o v e r h e a d ( e x p e r i m e n t a l )
TMR0H = ( ciclos >> 8 ) ; // s a l v a a p a r t e a l t a
TMR0L = ( ciclos & 0 x00FF ) ; // s a l v a a p a r t e b a i x a
BitClr ( INTCON , 2 ) ; // l i m p a a f l a g d e o v e r f l o w
18
void
27
28
29
17
25
16
26
,2) ;
15
23
InicializaTimer (
void
T0CON = 0 b00001000 ; // c o n f i g u r a
BitSet ( T0CON , 7 ) ; // l i g a o t i m e r
timer
sem
prescaler
3.10
Timer
11
Overow conhecido como estouro de varivel. Toda varivel digital possui um valor mximo, por exemplo
255 para uma varivel do tipo unsigned char. Se uma varivel unsigned char possui o valor 255 e acrescida de
1, seu valor passa a ser zero e acontece o estouro ou overow.
93
1
2
3
4
5
6
7
8
#ifndef
define TIMER_H
char FimTimer void
void AguardaTimer void
void ResetaTimer unsigned int
void InicializaTimer void
#endif
TIMER_H
);
// t e m p o
em
micro
);
segundos
( us )
tempo ) ;
);
//TIMER_H
do
6
7
9
10
cont ;
TRISD =0 x00 ;
InicializaTimer ( ) ;
ResetaTimer ( 1 0 0 0 0 ) ;
cont = 0 ;
for
programa
(;;)
14
AguardaTimer ( ) ;
ResetaTimer ( 1 0 0 0 0 ) ;
cont ++;
( cont >= 5 0 ) // 50
15
11
12
if
13
16
17
18
10ms = 0 , 5 s
PORTD ^= 0 xFF ;
cont = 0 ;
19
20
}
}
94
3.11
Reproduo de Sons
1
2
3
4
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include
#include
#include
#include
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
40
41
42
das
43
musicais
44
45
// f r e q u n c i a
// n o t a s
39
523
// I m p e r i a l
10 ,
587
5,
DS 6 2 2
FS
5,
784
GS 8 3 0
A
880
AS 9 3 2
47
48
987
49
for
50
22
23
24
25
26
27
28
29
30
31
32
33
34
37
38
12
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
// s e g u n d a
#define
// sem
C2
oitava
52
D* 2
54
E* 2
F2
10 ,
50 ,
50 ,
25 ,
2,
50 ,
50 ,
100 ,
10 ,
V)
10 ,
5,
5,
5,
2,
G* 2
59
A* 2
61
B* 2
63
53
if
55
58
60
62
64
pos ++;
SetaFreqPWM ( notas [ pos ] )
SetaPWM1 ( 5 0 ) ;
cont =0;
}
}
}
som
50 ,
25 ,
25 ,
25 ,
10 ,
(;;)
A2S AS * 2
B2
5,
50 ,
5,
57
G2S GS* 2
A2
10 ,
5,
50 ,
56
F2S FS * 2
G2
50 ,
5,
F* 2
D2S DS * 2
E2
25 ,
= {50 ,
AguardaTimer ( ) ;
ResetaTimer ( 1 0 0 0 0 ) ;
cont ++;
( cont >= tempo [ pos ] )
C2S CS * 2
D2
51
C* 2
50 ,
25 ,
(SW E p i s o d e
tempo [ ]
2,
10 ,
5,
5,
5,
50 ,
50 ,
50 ,
25 ,
100 ,
50 ,
100 ,
10 ,
50 ,
5,
10 ,
250};
50 ,
notas [ ] = { G , v , G , v , G , v , E , v , B ,
v , G , v , E , v , B , v , G , v , D2S , v , D2S , v ,
D2S , v , E2 , v , B , v , FS , v , E , v , B , v , G , v ,
G2S , v , G , v , G , v , G2S , v , G2 , v , F2S , v , F2 ,
v , E2 , v , F2S , v } ;
InicializaPWM ( ) ;
InicializaTimer ( ) ;
SetaFreqPWM ( notas [ 0 ] ) ;
SetaPWM1 ( 5 0 ) ; // g a r a n t e d u t y c y c l e d e 50%
46
740
5,
cont =0;
pos =0;
March
unsigned int
659
698
50 ,
programa
CS 5 5 4
do
125000
Esta a mxima frequncia possvel para o PWM operado com prescaler de 16x.
95
Interrupo
3.12
et o momento todos os progrms que form desenvolvidos seguim um )uxo sequenil sendo
lterdo pens por hmds de funesD estruturs de deiso ou loopF m dos prolems de
se utilizr este tipo de estrutur que lguns perifrios possuem um tempo muito grnde pr
relizrem su funo omo o onversor eh por exemploF xest situo o que fzemos iniir
onverso e (r monitorndo um vrivel que indiv qundo onverso tinh termindoF
ist tni onheid omo poolingF
y prolem de se relizr leitur de lgum perifrio por pooling que o proessdor perde
tempo relizndo operes desneessris hendo vrivel de ontroleF m lterntiv
utilizr um sistem queD qundo opero desejd estivesse (nlizdD nos vissse pr que
pudssemos tomr um providniF iste proedimento hmdo de interrupoF
elguns dispositivos possuem possiilidde de operrem om interrupesF undo onE
dio do dispositivo for stisfeit @(m d onverso pr o ehD hegd de informo n serilD
mudn no vlor d vrivel n port fA ele ger um interrupoF e interrupo pr o
progrm no ponto em que ele estiverD slv todos os ddos tuis e vi pr um funo prE
de(nidF ist funo reliz seu trlho e ssim que terminr volt o progrm no mesmo
ponto onde estv ntes d interrupoF
hos dispositivos estuddos t gor os que germ interrupo soX
ort erilX qundo heg lgum informo em giq ou qundo o u'er de trnsE
misso iq estiver disponvelF
ort fX qundo lgum dos its on(gurdos omo entrd lter seu vlorF
r gerenir interrupoD deveEse rir um rotin que ir veri(r qul foi o hrdwre
que gerou interrupo e tomr s providnis neessrisF e mneir de delrr que um
determind funo ser responsvel pelo trtmento d interrupo depende do ompildorF
r o ompildor hgg st que oloquemos expresso interrupt I ps o nome d
funoF
void
NomeDaFuncao (
// c d i g o
void
interrupt
...
r o ompildor gIV d wirohip temos que gerr um digo em ssemler que indir
qul funo ser responsvel pel interrupoF
void
NomeDaFuncao (
// c d i g o
void
...
#pragma
void interrupt_at_high_vector void
// I n d i c a r
code
posio
no
vetor
de
interrupes
h i g h _ v e c t o r =0x 0 8
#pragma
#pragma
}
code
interrupt
NomeDaFuncao
96
1
2
void
Interrupcao (
//
no
//
if
if
if
if
if
if
if
if
if
if
if
if
if
if
if
if
if
if
if
if
if
aqueles
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void
necessrio
das
interrupt
utilizar
interrupes
( BitTst ( PIR1 , 0 ) )
( BitTst ( PIR1 , 1 ) )
( BitTst ( PIR1 , 2 ) )
( BitTst ( PIR1 , 3 ) )
todos
os
if 's ,
apenas
desejadas
/* c d i g o */
// F l a g
de
overflow
/* c d i g o */
// F l a g
de
comparao
do
/* c d i g o */
// F l a g
de
comparao
do
CCP1
/* c d i g o */
// F l a g
de
fim
de
operao
de
transmisso
do
TIMER1
na
porta
paralela
( BitTst ( PIR1 , 4 ) )
/* c d i g o */
// F l a g
de
fim
( BitTst ( PIR1 , 5 ) )
/* c d i g o */
// F l a g
de
recepo
/* c d i g o */
// F l a g
de
fim
( BitTst ( PIR1 , 7 ) )
/* c d i g o */
// F l a g
de
leitura /escrita
( BitTst ( PIR1 , 6 ) )
de
da
da
Serial
Serial
converso
do AD
da
porta
paralela
( BitTst ( PIR2 , 0 ) )
/* c d i g o */
// F l a g
de
comparao
( BitTst ( PIR2 , 1 ) )
/* c d i g o */
// F l a g
de
overflow
do
TIMER3
/* c d i g o */
// F l a g
de
condio
de
Tenso
( BitTst ( PIR2 , 3 ) )
/* c d i g o */
// F l a g
de
deteco
de
coliso
( BitTst ( PIR2 , 2 ) )
do
CCP2
A l t a / Baixa
no
barramento
( BitTst ( PIR2 , 4 ) )
( BitTst ( PIR2 , 5 ) )
( BitTst ( PIR2 , 6 ) )
/* c d i g o */
// F l a g
de
fim
/* c d i g o */
// F l a g
de
interrupo
/* c d i g o */
// F l a g
de
mudana
escrita
na
na
memria
flash
da USB
entrada
de
comparao
( BitTst ( PIR2 , 7 ) )
( BitTst ( INTCON , 0 ) )
( BitTst ( INTCON , 1 ) )
/* c d i g o */
// F l a g
de
falha
/* c d i g o */
// F l a g
de
mudana
no
oscilador
na PORTA B
/* c d i g o */
// F l a g
de
interrupo
( BitTst ( INTCON , 2 ) )
/* c d i g o */
// F l a g
de
overflow
/* c d i g o */
// F l a g
de
interrupo
externa
INT1
( BitTst ( INTCON3 , 1 ) )
/* c d i g o */
// F l a g
de
interrupo
externa
INT2
( BitTst ( INTCON3 , 0 ) )
externa
INT0
no TIMER0
ixiste um orrelo entre o nmero que vem depois d expresso interrupt pr o omE
pildor hgg e o nmero o (nl d expresso 5prgm ode highvetor pr o gIVF istes
nmeros representm posio pr qul o miroontroldor vi qundo ontee um interE
rupoF ists posies esto num re onheid omo vetor de interrupesF
r o miroontroldor sg IVfRSSH este vetor possui trs posies importntesX HxHH@HAD
HxHV@IA e HxIV@PAF y ompildor gIV us posio fsi e o hgg o nmero entre prntesesF
e posio H @HxHHA represent o endereo que o miroontroldor us qundo este
de ser ligdoF posio de resetF qerlmente smos deste vetor e vmos direto pr funo
min@AF
es posies I e P @HxHVDHxIVA so reservds pr s interrupes de lt e ix prioriddeD
respetivmenteF neessrio que o progrmdor esolh quis dispositivos so de lt e quis so
de ix prioriddeF ixiste ind um modo de omptiilidde om os miroontroldores mis
ntigos no qul todos os perifrios so mpedos n primeir interrupo @HxHVAF tilizremos
este modo por questo de filiddeF
gomo todos os perifrios esto mpedos n mesm interrupoD funo deve ser pz de
diferenir entre s diverss fontes de requisioF m mneir de se relizr est veri(o
trvs ds )gs de ontroleD ou sejD its que indim situo de d perifrioF
y progrm QFPU present um funo que trt de tods s fontes possveis de interrupo
pr o sg IVfRSSHF
im gerl no neessrio trtr tods s interrupesD pens quels que in)ueniro
o sistemF y progrm QFPV present um exemplo de um funo que trt s interrupes
dvinds d port fD do timer HD d seril e do ehF
r que funo presentd no progrm QFPV funione orretmente devemos iniilizr
s interrupes de modo dequdoD onforme presentdo no progrm QFPWF
Notas de Aula ELT024 - Programao para Sistemas Embarcados
97
1
2
3
4
5
6
7
8
9
10
11
12
}
14
15
,6) )
//AD
fim
de
converso
ADvalor = ADRESH ; // l o r e s u l t a d o
ADvalor <<= 8 ;
ADvalor += ADRESL ;
BitClr ( PIR1 , 6 ) ; // l i m p a a f l a g
if
13
( BitTst ( PIR1 , 5 ) )
// S e r i a l :
recepo
16
// B i t C l r ( PIR1 , 5 ) ;
Serial
17
if
18
19
20
21
22
RCREG ;
// l i m p a
( BitTst ( INTCON , 0 ) )
sozinho
//PORTA B
quando
mudou
valor
for
( i = 0 ; i < 4 ; i++){
PORTB |= 0 xFF ;
BitClr ( PORTB , ( i ) ) ;
( j =0; j < 1 0 ; j++) ;
( j = 0 ; j < 4 ; j++){
( ! BitTst ( PORTB , j +4) ) {
BitSet ( Tecla , ( i * 4 )+j ) ;
for
for
if
else
23
24
25
26
27
28
29
30
31
32
PORTB = 0 x00 ;
BitClr ( INTCON , 0 )
33
34
if
35
36
37
( BitTst ( INTCON , 2 ) )
//TIMER0 :
Overflow
38
// t e m p o
mximo
de
interrupo
do
timer
BitClr ( INTCON , 2 ) ; // l i m p a a f l a g
TMR0H = 0 x00 ; // r e i n i c i a c o n t a d o r d e t e m p o
TMR0L = 0 x00 ; // r e i n i c i a c o n t a d o r d e t e m p o
ADCON0 |= 0 b00000010 ; // i n i c i a c o n v e r s o
39
40
41
42
43
44
}
}
98
1
2
3
4
// c o n f i g u r a n d o
todas
as
interrupes
TRISD = 0 x00 ;
TRISB = 0 xF0 ; // mantm o s 4 l t i m o s b i t s como e n t r a d a
PORTB = 0 x00 ; // mantm l i g a d a s a s 4 c o l u n a s
InicializaSerial ( ) ;
InicializaDisplays ( ) ;
InicializaLCD ( ) ;
InicializaAD ( ) ;
InicializaTimer ( ) ;
BitClr ( RCON , 7 ) ; // d e s a b i l i t a IPEN ( modo d e c o m p a t i b i l i d a d e )
BitSet ( PIE1 , 6 ) ; // l i g a a i n t e r r u p o p a r a o AD
BitSet ( PIE1 , 5 ) ; // l i g a a i n t e r r u p o p a r a a r e c e p o na s e r i a l
BitSet ( INTCON , 5 ) ; // l i g a a i n t e r r u p o p a r a o t i m e r 0
BitSet ( INTCON , 3 ) ; // l i g a a i n t e r r u p o p a r a a p o r t a B
BitSet ( INTCON , 7 ) ; // h a b i l i t a t o d a s a s i n t e r r u p e s g l o b a i s
BitSet ( INTCON , 6 ) ; // h a b i l i t a t o d a s a s i n t e r r u p e s d e p e r i f r i c o s
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for
19
20
(;;){
AtualizaDisplay ( ) ;
temp = ADvalor ;
temp %=10000;
MudaDigito ( temp / 1 0 0 0 , 3 ) ;
temp %=1000;
MudaDigito ( temp / 1 0 0 , 2 ) ;
temp %=100;
MudaDigito ( temp / 1 0 , 1 ) ;
temp %=10;
MudaDigito ( temp , 0 ) ;
( teclanova != Tecla ) {
teclanova = Tecla ;
( i =0; i < 1 6 ; i++){
( BitTst ( Tecla , i ) ) {
EnviaDados ( i +48) ;
21
22
23
24
25
26
27
28
29
if
30
31
32
33
34
35
for
if
36
37
38
for
39
40
41
(i = 0;
< 1000;
i++) ;
99
1
3
4
5
6
7
8
#define
C R T
L W D( )
do
programa
TRISD =0 x00 ;
PORTD =0 x00 ;
BitSet ( WDTCON , 0 )
for
10
11
12
PORTD ++;
(i = 0; i
15
for
16
17
// l i g a
sistema
de
watchdog
(;;)
14
13
< 10000;
i++)
CLRWTD ( ) ;
18
19
_asm C R D
L W T _endasm
}
}
3.13
Watchdog
or lgum motivo o softwre pode trvr em lgum pontoD sej por um loop in(nito ou por
esperr respost de lgum omponente trvs de pooling de um vrivelF
e primeir ondio pode ser evitd trvs de um projeto uiddoso de softwre lido
um o vlidoF t segund exige que os hrdwres djentes funionem orretmenteF
e lgum hrdwre present um flh e no envi respost que o miroontroldor est
esperndoD este ltimo ir trvrF xests situes possvel utilizr o wthdogF
y wthdog um sistem que vis umentr segurn do projetoF ile funion omo
um temporizdor que preis onstntemente ser reiniidoF gso no sej reiniido no tempo
exigidoD o wthdog reinii o miroontroldor dndo possiilidde de sir de um loop in(nito
ou de um pooling sem respostF
r hilitr o wthdog neessrio lterr os registros de on(guroD espei(mente
o gyxpsqPr @HxQHHHHPAF yutro mtodo onsiste em deixr o wthdog desligdo no registro e
ligElo trvs de softwreD omo presentdo no progrm QFQHF
xotr o 5de(ne rido n primeir linh do progrm QFQHF e expresso gvh o
omndo em ssemler responsvel por resetr o wthdogF es diretivs sm e endsm
informm o ompildor que os omndos utilizdos devem ser trnsritos extmente iguis
pr o rquivo ssemler ser gerdoF
e ps ligr o wthdog no relizrmos opero de reset deleD omentndo ou exluindo
funo gvh@AD o sistem ir trvr to logo o tempo ssoido o wthdog tenh expirdo
pel primeir vezD reiniindo o sistemF gomo pens reiniir no soluion o prolemD pois o
progrm rido no ter funo pr reiniir o wthdogD o sistem ontinu sendo reiniido
inde(nidmenteF
Captulo 4
Arquitetura de desenvolvimento de
software
Constrained by memory limitations, performance requirements, and
physical and cost considerations, each embedded system design requires a middleware platform tailored precisely to its needs, unused
features occupy precious memory space, while missing capabilities
must be tacked on.
IHH
101
de
// f u n o
includes
principal
int ia
float fa
// d e c l a r a o
10
11
12
das
variveis
ib , ic ;
, fb , fc ;
// i n i c i a l i z a o
dos
perifricos
14
InicializaTeclado ( ) ;
InicializaDisplays ( ) ;
15
// l o o p
13
for
16
17
18
// chamada
das
tarefas
DebounceTeclas ( ) ;
ia = LerTeclas ( ) ;
ImprimeDisplay ( ia ) ;
19
20
21
22
23
principal
(;;)
// tem
que
ser
executado
pelo
menos
cada
1 0 ( ms )
cada
1 0 ( ms )
}
}
for
// l o o p
// chamada
das
tarefas
DebounceTeclas ( ) ;
ia = LerTeclas ( ) ;
ImprimeDisplay ( ia ) ; // tem
ic = RecebeSerial ( ) ;
fa = 2 . 0 * ic / 3 . 1 4 ;
EnviaSerial ( fa & 0 x00FF ) ;
EnviaSerial ( fa >> 8 ) ;
5
6
7
8
9
10
11
12
principal
(;;)
que
ser
executado
pelo
menos
4.1
E indereo d epple
ist estrtgi utilizd t gor nos exemplos presentdosF hentro d funo prinipl
olodo um loop in(nitoF ods s trefs so hmds trvs de funesF
e vntgem de se utilizr est ordgem filidde de se iniir um projetoF r
sistems miores ome (r omplido oordenr s trefs e grntir exeuo num
tempo determinstioF yutro prolem modi(oGmplio do softwreF qerlmente
insero de um funo no meio do loop pode gerr erros em outrs funes devido restries
de tempo dos perifrios ssoidosF
xo exemplo imD insero d omunio seril e os lulos podem trplhr esrit
no disply de sete segmentosD gerndo )ikerF
102
1
2
3
4
5
6
int ia
void Interrupcao void
if BitTst INTCON
;
// t r a t a m e n t o
12
via
interrupo
interrupt
11
teclado
8
9
do
ia
,0) )
//PORTA B
mudou
valor
LerTeclas ( ) ;
}
}
void
main (
13
void
// i n i c i a l i z a o
dos
perifricos
15
InicializaTeclado ( ) ;
InicializaDisplays ( ) ;
16
// i n i c i a l i z a o
14
18
19
for
20
21
22
interrupo
( ; ; ) // l o o p
principal
23
// chamada
das
tarefas
ImprimeDisplay ( ia ) ;
24
25
26
da
17
}
}
4.2
103
1
2
3
4
int ia
void Interrupcao void
;
// e x i s t e
6
7
10
11
uma
fonte
apenas
de
interrupo :
interrupt
Timer
ResetaTimer ( 5 0 0 0 ) ; // r e i n i c i a t i m e r p a r a p r x i m a i n t e r r u p o
ImprimeDisplay ( ia ) ;
BitSet ( INTCON , 5 ) ; // r e l i g a a i n t e r r u p o p a r a o t i m e r 0
void
main (
12
void
// i n i c i a l i z a o
dos
perifricos
15
InicializaTeclado ( ) ;
InicializaDisplay ( ) ;
InicializaTimer ( ) ;
16
// i n i c i a l i z a o
13
14
18
19
20
for
21
22
23
24
25
26
27
da
interrupo
BitClr ( RCON , 7 ) ; // d e s a b i l i t a
BitSet ( INTCON , 5 ) ; // l i g a a
BitSet ( INTCON , 7 ) ; // h a b i l i t a
BitSet ( INTCON , 6 ) ; // h a b i l i t a
ResetaTimer ( 5 0 0 0 ) ;
17
(;;)
// l o o p
IPEN
( modo
interrupo
de
compatibilidade )
para
timer
todas
as
interrupes
globais
todas
as
interrupes
de
perifricos
principal
DebounceTeclas ( ) :
ia = LerTeclas ( ) ;
}
}
104
4.3
Cooperative multitasking
Inicio
Ler
Teclado
Atualiza
Display
Escreve
Serial
Atualiza
Display
Ler Serial
Atualiza
Display
105
1
2
void
main (
char
void
// d e c l a r a o
4
5
das
variveis
slot ;
// f u n e s
de
inicializao
InicializaSerial ( ) ;
InicializaTeclado ( ) ;
InicializaDisplay ( ) ;
6
7
for
8
9
(;;){
// i n c i o
10
// * * * * * * * * * * * * * * *
11
// * * * * * * * * * * * * * * * *
13
// * * * * * * * * * * *
switch
case
14
15
loop
fim
incio
tops l o t
tops l o t
do
da
infinito
do
mquina
de
******************
******************
estado
************
( slot ) {
0:
ProcessaTeclado ( ) ;
slot = 1 ;
16
break
case
17
18
19
;
1:
AtualizaDisplay ( ) ;
slot = 2 ;
20
break
case
21
22
23
;
2:
RecebeSerial ( ) ;
slot = 3 ;
24
break
case
25
26
27
;
3:
AtualizaDisplay ( ) ;
slot = 4 ;
28
break
case
29
30
31
;
4:
EnviaSerial ( ) ;
slot = 5 ;
32
break
case
33
34
35
;
5:
AtualizaDisplay ( ) ;
slot = 0 ;
36
37
38
break
default
slot
break
;
39
40
41
:
= 0;
42
43
// * * * * * * * * * * * *
45
// * * * * * * * * * * * * * *
46
// * * * * * * * * * * * * * * *
47
48
do
incio
// f i m
loop
fim
da
mquina
incio
fim
infinito
do
do
de
estado
bottoms l o t
bottoms l o t
**************
*****************
*****************
(!?)
106
1
2
void
main (
char
void
// d e c l a r a o
4
5
das
variveis
slot ;
// f u n e s
de
inicializao
InicializaSerial ( ) ;
InicializaTeclado ( ) ;
InicializaDisplay ( ) ;
6
7
for
8
9
(;;)
// i n c i o
do
10
11
// * * * * * * * * * * * * * * *
loop
infinito
incio
13
// * * * * * * * * * * * * * * * *
16
// * * * * * * * * * * *
switch
case
17
18
tops l o t
******************
fim
incio
tops l o t
do
da
mquina
de
******************
estado
************
( slot )
19
0:
ProcessaTeclado ( ) ;
slot = 1 ;
20
break
case
21
22
23
;
1:
RecebeSerial ( ) ;
slot = 2 ;
24
break
case
25
26
27
;
2:
EnviaSerial ( ) ;
slot = 0 ;
28
29
30
break
default
slot
break
;
31
32
33
:
= 0;
34
35
// * * * * * * * * * * * *
38
// * * * * * * * * * * * * * *
40
// * * * * * * * * * * * * * * *
42
43
do
AtualizaDisplay ( ) ;
12
// f i m
loop
fim
da
mquina
incio
fim
infinito
do
do
de
estado
bottoms l o t
bottoms l o t
**************
*****************
*****************
(!?)
107
1
2
void
main (
char
void
// d e c l a r a o
4
5
das
variveis
slot ;
// f u n e s
de
inicializao
InicializaDisplay ( ) ;
InicializaTimer ( ) ;
for
7
8
9
(;;)
// i n c i o
do
10
// * * * * * * * * * * * * * * *
infinito
incio
ResetaTimer ( 5 0 0 0 ) ;
AtualizaDisplay ( ) ;
11
12
13
// * * * * * * * * * * * * * * * *
16
// * * * * * * * * * * *
switch
case
17
18
fim
incio
ms
para
mquina
******************
cada
tops l o t
do
da
tops l o t
do
// 5
de
slot
******************
estado
************
( slot )
19
0:
ProcessaTeclado ( ) ;
slot = 1 ;
20
break
case
21
22
23
;
1:
RecebeSerial ( ) ;
slot = 2 ;
24
break
case
25
26
27
;
2:
EnviaSerial ( ) ;
slot = 0 ;
28
29
30
break
default
slot
break
;
31
32
33
:
= 0;
34
35
// * * * * * * * * * * * *
38
// * * * * * * * * * * * * * *
40
// * * * * * * * * * * * * * * *
fim
da
mquina
incio
fim
do
do
de
estado
bottoms l o t
bottoms l o t
**************
*****************
*****************
AguardaTimer ( ) ;
41
42
43
loop
// f i m
loop
infinito
(!?)
108
tempoF xotr que o slot I @FIA gst um tempo de PFH@msAD o slot P de QFI @msA e o slot Q pens
IFP @msAF t o topEslot onsome HFS @msA e o ottomEslot HFQ @msAF
Top
S.1
S.2
S.3
Bottom
"vago"
0
10
15
20
25
30
Top
S.1
1
3
1
3
Bottom
"vago"
1
3
1
3
Top
S.1
1
1
Bottom
"vago"
Interr.
3
1
2
3
1
2
2
1
109
gd interrupo gst um tempo de I @msA onforme pode ser visto n pigur RFRF gomo
temos um tempo vgo de Q @msA em d ilo st grntir que os eventos que germ
interrupo no ultrpssem frequni de Q eventos d V @msAF
Captulo 5
Anexos
IIH
111
Anexos
#ifndef
// p a r a
#define
code
code
code
code
#endif
compilador
SDCC + G P U t i l s
CONFIG_H
CONFIG_H
at 0 x300000
at 0 x300001
at 0 x300003
at 0 x300006
char
char
char
char
CONFIG1L
CONFIG1H
CONFIG2H
CONFIG4L
= 0 x01 ;
= 0 x0C ;
= 0 x00 ;
= 0 x00 ;
//
Pll
//
Oscilador
//
Watchdog
//
Sem
c/
cristal
controlado
programao
em
externo
HS
por
software
baixa
tenso
//CONFIG_H
10
// p a r a
11
//#pragma
config
FOSC = HS
12
//#pragma
config
CPUDIV = OSC1_PLL2
13
//#pragma
c o n f i g W T = OFF
D
//
Watchdog
14
//#pragma
config
//
Sem
5.1
desligado
compilador
C18
LVP = OFF
//
Oscilador
//
Pll
c/
cristal
externo
HS
desligado
controlado
programao
em
por
baixa
software
t e n s o \\\ h l i n e
cong.h
112
Anexos
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
// f u n o
para
// f u n e s
de
watchdog
_asm C R D
L W T _endasm
bit
B i t S e t ( arg , b i t )
( ( arg )
B i t C l r ( arg , b i t )
( ( a r g ) &= ~(1<< b i t ) )
BitFlp ( arg , b i t )
( ( a r g ) ^= (1<< b i t ) )
BitTst ( arg , b i t )
( ( a r g ) & (1<< b i t ) )
// d e f i n e ' s
5.2
limpar
C R T
L W D( )
para
PORTA
PORTB
PORTC
PORTD
PORTE
TRISA
TRISB
TRISC
TRISD
TRISE
(*(
near
(*(
near
(*(
near
(*(
near
(*(
near
(*(
near
(*(
near
(*(
near
(*(
near
INTCON2
PIR1
TMR0L
TMR0H
T0CON
(*(
(*(
(*(
(*(
near
ADCON2
ADCON1
ADCON0
ADRESL
ADRESH
RCREG
SPBRG
(*(
(*(
BAUDCON
(
(*(
W T O
D C N
T2CON
PR2
(
(*(
CCPR2L
CCP1CON
CCPR1L
) 0 xF94 )
) 0 xF95 )
) 0 xF96 )
) 0xFF2 )
) 0xFF1 )
) 0xF9D )
) 0xF9E )
) 0xFD6 )
) 0xFD7 )
) 0xFD5 )
) 0 xF63 )
) 0xFC0 )
near
) 0xFC1 )
near
) 0xFC2 )
near
) 0xFC3 )
near
near
near
near
near
) 0 xF93 )
near
near
CCP2CON
) 0 xF92 )
near
(*(
) 0 xF84 )
) 0 xF65 )
near
) 0 xF83 )
near
near
(*(
) 0 xF82 )
near
(*(
) 0 xF81 )
near
near
(*(
) 0 xF80 )
near
SPBRGH
RCON
near
near
SPPCFG
TXSTA
near
TXREG
near
near
SPPCON
RCSTA
near
(*(
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
unsigned char *
especiais
near
(*(
INTCON
PIE1
volatile
volatile
volatile
volatile
volatile
volatile
volatile
volatile
volatile
volatile
* volatile
* volatile
volatile
volatile
volatile
volatile
volatile
* volatile
* volatile
* volatile
* volatile
* volatile
* volatile
* volatile
volatile
volatile
volatile
volatile
volatile
* volatile
* volatile
volatile
* volatile
volatile
volatile
* volatile
* volatile
* volatile
* volatile
registros
|= (1<< b i t ) )
) 0xFC4 )
) 0xFAB)
) 0xFAC)
) 0xFAD)
) 0xFAE)
) 0xFAF )
) 0xFB0 )
) 0xFB8 )
) 0xFD0 )
) 0xFD1 )
) 0xFCA)
) 0xFCB)
near
) 0xFBA)
near
) 0xFBB)
near
) 0xFBD)
near
) 0xFBE )
basico.h
113
5.3
Anexos
ys pssos seguir devem ser seguidos pr instlr os devie drivers orretmente em sistems
operionis de TR itsF etulmente pens os seguintes prelhos so suportdosX
wvef sgh Q
Antes de Comear
y dispostivo no deve ser plugdo num port f ntes de omer instlo do hriverF
e vo j plugou o dispositivo e preeu informo 4xovo hrdwre enontrdo4D lique
em nelrF hesligue o dispositivo e ontinue om os pssos seguirF
e vo j utilizou o setup do windowsD provvelmente os drivers errdos form instldosF
ig s instrues de remoo dos drivers ntes de prosseguirF
Passo 1
e primeir vez que o dispositivo onetdo pree um mensgem indindo que o sistem
enontrou um novo hrdwreF undo preer um jnelD esolh opo volizr e instlr
o driver @reomenddoAF
xotX e preer um mensgem perguntndo sore permisso no indows UD lique em simGE
ontinurF
Passo 3
e prxim tel indir que o softwre foi instldo orretmenteF glique em fehr pr termiE
nr instloF
Passo 7
114
Anexos
Soluo de erros