Apostila de Sistemas Embarcados
Apostila de Sistemas Embarcados
Apostila de Sistemas Embarcados
LASEC
FEELT
APOSTILADESISTEMASEMBARCADOS1
UNIVERSIDADEFEDERALDEUBERLNDIA
FACULDADEDEENGENHARIAELTRICAFEELT
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 2
ESCLARECIMENTOS
Esta apostila foi criada para servir de roteiro para as aulas da Disciplina de
Sistemas Embarcados, oferecida pela Faculdade de Engenharia Eltrica da
Universidade Federal de Uberlndia. Este material deve ser utilizado em
conjunto com os tutoriais Como Criar um Projeto em C para ARM e
Gravando e Debugando o Microcontrolador ARM.
Todos os arquivos dos programas na Linguagem C, utilizados nos
exemplos de sala de aula, podem ser encontrados nas subpastas da pasta
Aulas, que foi criada durante a descompactao do arquivo Aulas.zip,
disponvel para download no site: www.lasec.feelt.ufu.br
Sumrio
ESCLARECIMENTOS.......................................................................................................................2
Introduo.....................................................................................................................................4
MicrocontroladorARM.................................................................................................................7
SoftwaresparaProgramarARM.................................................................................................10
LED_Blink.....................................................................................................................................11
ExerccioProposto...................................................................................................................11
ProgramaLED_BlinkComentado............................................................................................13
ConfigurandooClockdaCPU......................................................................................................15
OperadoresLgicosBitaBit.......................................................................................................16
Displayde7Segmentos..............................................................................................................18
ExerccioProposto...................................................................................................................19
Nmerosmgicosemprogramao...........................................................................................21
PortabilidadeeoPrprocessadorC...........................................................................................28
TiposPrimitivosemC..................................................................................................................30
ExerccioProposto...................................................................................................................36
TecladoMatricial.........................................................................................................................37
ExerccioProposto...................................................................................................................39
DisplaydeCristalLquido............................................................................................................40
ExerccioProposto...................................................................................................................43
InterfacedeComunicaoSPI.....................................................................................................44
OperaesATOMIC..................................................................................................................45
STRUCTUREPADDINGESERIALIZAO...............................................................................50
Referncias..................................................................................................................................61
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 3
EdioeReviso:.....................................................................................................................62
Agradecimentos......................................................................................................................62
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 4
Introduo
Na dcada de 30 e 40 os primeiros computadores possuam tarefas
especficas. O Atanasoft-Berry Computer, o ABC, mostrado na Figura 01, foi o
primeiro computador a usar eletricidade, inventado por John Vincent Atanasoff
e Clifford Berry em 1939. O computador tinha vlvulas eletrnicas, nmeros
binrios, capacitores e 1 quilmetro de fios.
Figura 1- Primeiro computador a usar eletricidade, inventado por John Vincent Atanasoff
e Clifford Berry em 1939.
O primeiro sistema embarcado reconhecido foi o Apollo Guidance
Computer (AGC), desenvolvido por Charles Stark Draper no MIT, na dcada de
60. O AGC, mostrado na Figura 01, realizava o processamento de dados e o
controle em tempo real do sistema de orientao e navegao do Mdulo de
Comando e do Mdulo Lunar da espaonave desenvolvida no Programa Apolo.
Interface do AGC AGC montado no painel de controle da
Apollo
Figura 2 - Apollo Guidance Computer, considerado o primeiro sistema embarcado
moderno.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 5
Caractersticas do ARM7:
Arquitetura RISC de 32-bit com conjunto de instrues ARM e Thumb;
Pipeline de 3 estgios (arquitetura von Neumann);
Performance de at 130 MIPs (Dhrystone 2.1) num tpico processador
de 0.13m;
Baixssimo consumo de energia;
Amplo SO e suporte RTOS incluindo Windows CE, Palm OS, Symbian
OS, Linux;
Excelente suporte de debug para desenvolvimento SoC, incluindo
interface ETM;
Disponibilidade de processos de 0.25m, 0.18m e 0.13m;
Cdigo compatvel com processadores ARM9 e permitem a
reutilizao dos cdigos de aplicao;
Migrao e suporte para novas tecnologias de processadores.
O ARM7 um processador RISC de 32-bit que faz uso de instrues
Thumb para reduzir a densidade de cdigo e executar efetivamente as
instrues.
Muitos perifricos podem ser utilizados junto com essa arquitetura, de
acordo com a finalidade da utilizao. Porm alguns so utilizados com mais
frequncia. O principal perifrico a memria, pois nela que se encontram
todas as instrues, rotinas de execuo, dados, etc. Elas podem ter tamanhos
variados e ser do tipo ROM ou RAM e, atualmente, as mais usadas em
microcontroladores so a Flash e SRAM, respectivamente.
Timers (Temporizadores) tambm so importantes, pois so utilizados para
gerar bases de tempo que podem ser utilizadas para os mais diversos fins,
como, por exemplo, gerar sinais de clock para outros perifricos, calcular
intervalos de tempo ou medir perodo de sinais. possvel encontrar
microcontroladores de 3 (NXP) 32 canais (Texas).
Outro perifrico frequentemente utilizado junto com o ARM o conversor
A/D. Ele quem faz a representao digital de uma grandeza analgica que
pode ser velocidade, temperatura, tempo, etc. Atualmente, pode-se encontrar
de 4 (Zilog) 16 canais (Atmel, ST) de conversores em um mesmo
microcontrolador.
As principais caractersticas do microcontrolador ARM, modelo LPC2148
da NXP so descritas a seguir:
Clock de at 60MHz, configurado atravs de PLL interno;
Realizao de operaes a at 60 MHz;
Dois timers/counters de 32 bits;
Unidade lgica aritmtica com arquitetura RISC de 32 bits com
instrues de soma e subtrao executadas em um nico ciclo,
instrues de multiplicao e multiplicao longa (32x32 bits e resultado
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 10
LED_Blink
O objetivo deste exemplo criar um programa que ir configurar o pino
P0.31 de um microcontrolador ARM LPC2148 como entrada/sada digital (I/O).
Este pino ser utilizado para acionar um LED, como mostra a Figura 03.
Para atingir esta meta, os seguintes passos sero executados:
Passo 1: Crie um novo projeto denominado LED_Blink. As instrues sobre
como criar um projeto esto no arquivo denominado Tutorial - Como Criar um
Projeto em C para ARM.pdf, disponvel no arquivo Aulas.zip
Passo 2: Copiar o contedo do arquivo LED_Blink.txt, localizado em
...\Aulas\Aula_01\Programas, e colar no arquivo main.c criado no projeto
LED_Blink. Onde ...\ representa o local onde o arquivo Aulas.zip foi
descompactado.
Passo 3: Compilar o programa de acordo com as instrues fornecidas no
arquivo chamado Tutorial - Como Criar um Projeto em C para ARM.pdf
Passo 4: Transferir o arquivo binrio gerado para o microcontrolador ARM.
Exerccio Proposto
Exerccio 01: Crie um programa para acionar de modo sequencial e
ininterrupto os quatro LEDs mostrados na Figura 04. O LED 1 dever piscar,
depois o LED 2, e assim sucessivamente, at retornar para o LED 1
novamente. Utilize a funo delay_ms do mdulo delay_loop para
implementar o tempo de espera.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 12
XTAL1
62
XTAL2
61
P0.0/TxD0/PWM1
19
P0.1/RxD0/PWM3/EINT0
21
P0.2/SCL0/CAP0.0
22
P0.3/SDA0/MAT0..0/EINT1
26
P0.4/SCK0/CAP0.1/AD0.6
27
P0.5/MISO0/MAT0.1/AD0.7
29
P0.6/MOSI0/CAP0.2/AD1.0
30
P0.7/SSEL0/PWM2/EINT2
31
P0.8/TxD1/PWM4/AD1.1
33
P0.9/RxD1/PWM6/EINT3
34
P0.10/RTS1/CAP1.0/AD1.2
35
P0.11/CTS1/CAP1.1/SCL1
37
P0.12/DSR1/MAT1.0/AD1.3
38
P0.13/DTR1/MAT1.1/AD1.4
39
P0.14/DCD1/EINT1/SDA1
41
P0.15/RI1/EINT2/AD1.5
45
P0.16/EINT0/MAT0.2/CAP0.2
46
P0.17/CAP1.2/SCK1/MAT1.2
47
P0.18/CAP1.3/MISO1/MAT1.3
53
P0.19/MAT1.2/MOSI1/CAP1.2
54
P0.20/MAT1.3/SSEL1/EINT3
55
P0.21/PWM5/AD1.6/CAP1.3
1
P0.22/AD1.7/CAP0.0/MAT0.0
2
P0.23
58
P0.25/AD0.4/AOUT
9
P0.27/AD0.0/CAP0.1/MAT0.1
11
P0.28/AD0.1/CAP0.2/MAT0.2
13
P0.29/AD0.2/CAP0.3/MAT0.3
14
P0.30/AD0.3/EINT3/CAP0.0
15
V3
23
RST
57
VREF
63
VSS
6
VSSA
59
P1.16/TRACEPKT0
16
P1.17/TRACEPKT1
12
P1.18/TRACEPKT2
8
P1.19/TRACEPKT3
4
P1.20/TRACESYNC
48
P1.21/PIPESTAT0
44
P1.22/PIPESTAT1
40
P1.23/PIPESTAT2
36
P1.24/TRACECLK
32
P1.25/EXTIN0
28
P1.26/RTCK
24
P1.27/TDO
64
P1.28/TDI
60
P1.29/TCK
56
P1.30/TMS
52
P1.31/TRST
20
V3
43
V3
51
VSS
18
VSS
25
VSS
42
VSS
50
RTXC1
3
RTXC2
5
V3A
7
VBAT
49
P0.31
17
P0.26/AD0.5
10
U1
LPC2138
3.3V
D3
LED-GREEN
R7
300
3.3V
3 4
U2:B
74HCT04
3.3V
C1
22pF
C2
22pF
X1
CRYSTAL
FREQ=12MHz
D1
DIODE
R1
47k
C3
100pF
Figura 4 LED acionado pelo pino P0.31
XTAL1
62
XTAL2
61
P0.0/TxD0/PWM1
19
P0.1/RxD0/PWM3/EINT0
21
P0.2/SCL0/CAP0.0
22
P0.3/SDA0/MAT0..0/EINT1
26
P0.4/SCK0/CAP0.1/AD0.6
27
P0.5/MISO0/MAT0.1/AD0.7
29
P0.6/MOSI0/CAP0.2/AD1.0
30
P0.7/SSEL0/PWM2/EINT2
31
P0.8/TxD1/PWM4/AD1.1
33
P0.9/RxD1/PWM6/EINT3
34
P0.10/RTS1/CAP1.0/AD1.2
35
P0.11/CTS1/CAP1.1/SCL1
37
P0.12/DSR1/MAT1.0/AD1.3
38
P0.13/DTR1/MAT1.1/AD1.4
39
P0.14/DCD1/EINT1/SDA1
41
P0.15/RI1/EINT2/AD1.5
45
P0.16/EINT0/MAT0.2/CAP0.2
46
P0.17/CAP1.2/SCK1/MAT1.2
47
P0.18/CAP1.3/MISO1/MAT1.3
53
P0.19/MAT1.2/MOSI1/CAP1.2
54
P0.20/MAT1.3/SSEL1/EINT3
55
P0.21/PWM5/AD1.6/CAP1.3
1
P0.22/AD1.7/CAP0.0/MAT0.0
2
P0.23
58
P0.25/AD0.4/AOUT
9
P0.27/AD0.0/CAP0.1/MAT0.1
11
P0.28/AD0.1/CAP0.2/MAT0.2
13
P0.29/AD0.2/CAP0.3/MAT0.3
14
P0.30/AD0.3/EINT3/CAP0.0
15
V3
23
RST
57
VREF
63
VSS
6
VSSA
59
P1.16/TRACEPKT0
16
P1.17/TRACEPKT1
12
P1.18/TRACEPKT2
8
P1.19/TRACEPKT3
4
P1.20/TRACESYNC
48
P1.21/PIPESTAT0
44
P1.22/PIPESTAT1
40
P1.23/PIPESTAT2
36
P1.24/TRACECLK
32
P1.25/EXTIN0
28
P1.26/RTCK
24
P1.27/TDO
64
P1.28/TDI
60
P1.29/TCK
56
P1.30/TMS
52
P1.31/TRST
20
V3
43
V3
51
VSS
18
VSS
25
VSS
42
VSS
50
RTXC1
3
RTXC2
5
V3A
7
VBAT
49
P0.31
17
P0.26/AD0.5
10
U1
LPC2138
3.3V
LED 1
LED-GREEN
R7
300
3.3V
1 2
U2:A
74HCT04
3.3V
C1
22pF
C2
22pF
X1
CRYSTAL
FREQ=12MHz
D1
DIODE
R1
47k
C3
100pF
LED 2
LED-GREEN
R2
300
3.3V
3 4
U2:B
74HCT04
LED 3
LED-GREEN
R3
300
3.3V
5 6
U2:C
74HCT04
LED 4
LED-GREEN
R4
300
3.3V
13 12
U2:D
74HCT04
Figura 5 LEDs acionados pelos pinos P0.31, P0.25, P0.19 e P0.14
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 13
Observao: A definio padro para a funo main segundo ANSI C :
int main(int argc, char *argv[])
{
...
return 0; // retorna um cdigo de erro para o sistema operacional (0 = nenhum erro)
}
No entanto, em se tratando de sistemas embarcados, isto depende do
sistema operacional usado, do compilador, das bibliotecas e, s vezes, da
forma como se chama a rotina principal (main), a partir do boot que feito em
linguagem assembly. Por isso, o mais comum :
int main(void)
{
...
return 0; // retorna um cdigo de erro para o sistema operacional (0 = nenhum erro)
}
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 15
Para que apenas um BIT seja forado a assumir nvel lgico baixo ( 0 ),
em um determinado registrador, necessrio utilizar o operador lgico E e uma
mscara que possua apenas o bit desejado em nvel lgico baixo ( 0 ).
A Figura 7 mostra como forar para nvel alto o bit 10 de um registrador
denominado Registrador_X.
BIT: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Registrador_X: 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 0
Operador E E E E E E E E E E E E E E E E E
Mscara: 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
Registrador_X: 1 0 1 1 1 0 1 1 1 1 1 1 0 1 1 0
Figura 7 Operador Lgico E
Na linguagem C esta operao pode ser realizada da seguinte maneira:
uint16_t Registrador_X = 0b1011111111110110; // cria uma varivel de 16 bits chamada
Registrador_X e a inicializa com o nmero do tipo binrio 0b1011111111110110
uint16_t Mascara = ~(1 << 10); //inicializa uma Mascara de 16 bits com o bit 10 igual a 1 e
em seguida inverte todos os bits, isto , os bits igual a 1 so convertidos em 0 e os bits igual a
0 so convertidos em 1
Registrador_X &= Mascara; // Esta linha de cdigo realiza os trs passos descritos abaixo:
1) L o valor do Registrador_X;
2) Realiza uma operao lgica E bit a bit do valor lido com a Mascara;
3) Armazena o resultado no Registrador_X.
Para que apenas um BIT seja negado, isto , se for nvel lgico alto ( 1 )
seja forado a assumir nvel lgico baixo ( 0 ) e vice-versa, em um determinado
registrador, necessrio utilizar o operador lgico XOR (OU Exclusivo) e uma
mscara que possua apenas o bit desejado em nvel lgico alto ( 1 ).
A Figura 7 mostra como negar o bit 10 de um registrador denominado
Registrador_X.
BIT: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Registrador_X: 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 0
Operador XOR XOR XOR XOR ... ... ... ... ... .. .. ... ... ... ... XOR XOR
Mscara: 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
Registrador_X: 1 0 1 1 1 0 1 1 1 1 1 1 0 1 1 0
Figura 8 Operador Lgico XOR (OU Exclusivo)
Na linguagem C esta operao pode ser realizada da seguinte maneira:
uint16_t Registrador_X = 0b1011111111110110; // cria uma varivel de 16 bits chamada
Registrador_X e a inicializa com o nmero do tipo binrio 0b1011111111110110
uint16_t Mascara = 1 << 10; //inicializa uma Mascara de 16 bits com o bit 10 igual a 1
Registrador_X ^= Mascara; // Esta linha de cdigo realiza os trs passos descritos abaixo:
1) L o valor do Registrador_X;
2) Realiza uma operao lgica XOR bit a bit do valor lido com a Mascara;
3) Armazena o resultado no Registrador_X.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 18
Display de 7 Segmentos
O objetivo deste exemplo criar um programa que ir acionar um display
de 7 segmentos, como exibido na Figura 05. Toda vez que um push botton for
pressionado, o display ser incrementado de uma unidade at 9.
Aps exibir o nmero 9, na prxima vez que o boto for pressionado, o
display dever exibir o nmero 0.
Os seguintes passos devero ser executados:
Passo 1: Crie um novo projeto denominado Display_7Seg01. As instrues
sobre como criar um projeto esto no arquivo denominado Tutorial - Como
Criar um Projeto em C para ARM.pdf, disponvel no arquivo Aulas.zip
Passo 2: Copiar o contedo do arquivo Display_7Seg01.txt, localizado em
...\Aulas\Display_7Seg01\Programas, e colar no arquivo main.c criado no
projeto Display_7Seg01. Onde ...\ representa o local onde o arquivo Aulas.zip
foi descompactado.
Passo 3: Compilar o programa de acordo com as instrues fornecidas no
arquivo chamado Tutorial - Como Criar um Projeto em C para ARM.pdf
Passo 4: Transferir o arquivo binrio gerado para o microcontrolador ARM.
XTAL1
62
XTAL2
61
P0.0/TxD0/PWM1
19
P0.1/RxD0/PWM3/EINT0
21
P0.2/SCL0/CAP0.0
22
P0.3/SDA0/MAT0..0/EINT1
26
P0.4/SCK0/CAP0.1/AD0.6
27
P0.5/MISO0/MAT0.1/AD0.7
29
P0.6/MOSI0/CAP0.2/AD1.0
30
P0.7/SSEL0/PWM2/EINT2
31
P0.8/TxD1/PWM4/AD1.1
33
P0.9/RxD1/PWM6/EINT3
34
P0.10/RTS1/CAP1.0/AD1.2
35
P0.11/CTS1/CAP1.1/SCL1
37
P0.12/DSR1/MAT1.0/AD1.3
38
P0.13/DTR1/MAT1.1/AD1.4
39
P0.14/DCD1/EINT1/SDA1
41
P0.15/RI1/EINT2/AD1.5
45
P0.16/EINT0/MAT0.2/CAP0.2
46
P0.17/CAP1.2/SCK1/MAT1.2
47
P0.18/CAP1.3/MISO1/MAT1.3
53
P0.19/MAT1.2/MOSI1/CAP1.2
54
P0.20/MAT1.3/SSEL1/EINT3
55
P0.21/PWM5/AD1.6/CAP1.3
1
P0.22/AD1.7/CAP0.0/MAT0.0
2
P0.23
58
P0.25/AD0.4/AOUT
9
P0.27/AD0.0/CAP0.1/MAT0.1
11
P0.28/AD0.1/CAP0.2/MAT0.2
13
P0.29/AD0.2/CAP0.3/MAT0.3
14
P0.30/AD0.3/EINT3/CAP0.0
15
V3
23
RST
57
VREF
63
VSS
6
VSSA
59
P1.16/TRACEPKT0
16
P1.17/TRACEPKT1
12
P1.18/TRACEPKT2
8
P1.19/TRACEPKT3
4
P1.20/TRACESYNC
48
P1.21/PIPESTAT0
44
P1.22/PIPESTAT1
40
P1.23/PIPESTAT2
36
P1.24/TRACECLK
32
P1.25/EXTIN0
28
P1.26/RTCK
24
P1.27/TDO
64
P1.28/TDI
60
P1.29/TCK
56
P1.30/TMS
52
P1.31/TRST
20
V3
43
V3
51
VSS
18
VSS
25
VSS
42
VSS
50
RTXC1
3
RTXC2
5
V3A
7
VBAT
49
P0.31
17
P0.26/AD0.5
10
U1
LPC2138
3.3V
R7
300
3 4
U2:B
74HCT04
3.3V
C1
22pF
C2
22pF
X1
CRYSTAL
FREQ=12MHz
D1
DIODE
R1
47k
C3
100pF
R2
2k2
3
.3
V
R3
300
1 2
U2:A
74HCT04
R4
300
5 6
U2:C
74HCT04
R5
300
13 12
U2:D
74HCT04
R6
300
11 10
U2:E
74HCT04
R8
300
9 8
U2:F
74HCT04
R9
300
1 2
U3:A
74HCT04
3.3V
Figura 9 - Display de 7 Segmentos acionado pelos pinos P1.25, P1.26, P1.27, P1.28,
P1.29, P1.30 e P1.31
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 19
Programa:
#include " LPC214x. h" / / I nf or ma ao compi l ador que el e deve i ncl ui r o ar qui vo LPC214x. h.
#include " cpu_i ni t . h" / / I nf or ma ao compi l ador par a i ncl ui r o ar qui vo cpu_i ni t . h
int main ( void)
{
cpu_i ni t ( ) ; / / Chama a r ot i na de i ni ci al i zao da CPU
int i = 0; / / Decl ar a umi nt ei r o de 32bi t e i ni ci al i za como val or zer o
/ / O r egi st r ador PI NSEL2 cont r ol a a f uno dos pi nos do PORT1. Se o bi t 2 do
r egi st r ador PI NSEL2 f or i gual a 0 ( zer o) , os pi nos P1. 36- 26 so conf i gur ados como
ent r ada/ sa da e se o bi t 3 dest e r egi st r ador f or i gual a 0 ( zer o) , os pi nos P1. 25- 16 so
conf i gur ados como ent r ada/ sa da. Por padr o, os bi t s 2 e 3 so i ni ci al i zados comval or 0
( zer o) - Ver Tabl e 62: Pi n f unct i on Sel ect r egi st er 2 no document o LPC214X User
Manual.pdf
I ODI R1 | = ( 1<<25) | ( 1<<26) | ( 1<<27) | ( 1<<28) | ( 1<<29) | ( 1<<30) | ( 1<<31) ; / / Conf i gur a os
pi nos P1. 25 a P1. 31 como sa da
I OCLR1 = 0xFFFFFFFF; / / For a t odos os pi nos do PORT1 par a n vel bai xo
I OSET1 = ( 1<<25) | ( 1<<26) | ( 1<<27) | ( 1<<28) | ( 1<<29) | ( 1<<30) ; / / For a n vel al t o nos
pi nos P1. 25, P1. 26, P1. 27, P1. 28, P1. 29 e P1. 30
while( 1) {
if ( ! ( I OPI N0 & ( 1<<15) ) ) / / Ver i f i ca se o Bot o f oi pr essi onado
{
I OCLR1 = 0xFFFFFFFF; / / For a n vel bai xo emt odos os pi nos do PORT1
/ / Conver sor Deci mal par a 7 Segment os
switch ( i )
{
case 0: / / Escr eve 0 no di spl ay
I OSET1 = ( 1<<25) | ( 1<<26) | ( 1<<27) | ( 1<<28) | ( 1<<29) | ( 1<<30) ;
break;
case 1: / / Escr eve 1 no di spl ay
I OSET1 = ( 1<<26) | ( 1<<27) ;
break;
case 2: / / Escr eve 2 no di spl ay
I OSET1 = ( 1<<25) | ( 1<<26) | ( 1<<28) | ( 1<<29) | ( 1<<31) ;
break;
case 3: / / Escr eve 3 no di spl ay
I OSET1 = ( 1<<25) | ( 1<<26) | ( 1<<27) | ( 1<<28) | ( 1<<31) ;
break;
case 4: / / Escr eve 4 no di spl ay
I OSET1 = ( 1<<26) | ( 1<<27) | ( 1<<30) | ( 1<<31) ;
break;
case 5: / / Escr eve 5 no di spl ay
I OSET1 = ( 1<<25) | ( 1<<27) | ( 1<<28) | ( 1<<30) | ( 1<<31) ;
break;
case 6: / / Escr eve 6 no di spl ay
I OSET1 = ( 1<<25) | ( 1<<27) | ( 1<<28) | ( 1<<30) | ( 1<<29) | ( 1<<31) ;
break;
case 7: / / Escr eve 7 no di spl ay
I OSET1 = ( 1<<25) | ( 1<<26) | ( 1<<27) ;
break;
case 8: / / Escr eve 8 no di spl ay
I OSET1 = ( 1<<25) | ( 1<<26) | ( 1<<27) | ( 1<<28) | ( 1<<29) | ( 1<<30) | ( 1<<31) ;
break;
case 9: / / Escr eve 9 no di spl ay
I OSET1 = ( 1<<25) | ( 1<<26) | ( 1<<27) | ( 1<<30) | ( 1<<31) ;
break;
default: / / O def aul t escr eve 0 no di spl ay
I OSET1 = ( 1<<25) | ( 1<<26) | ( 1<<27) | ( 1<<28) | ( 1<<29) | ( 1<<30) ;
}
/ / O Whi l e esper a enquant o o Bot o est i ver pr essi nado
while ( ! ( I OPI N0 & ( 1<<15) ) ) { asm volatile ( " NOP" ) ; }
i ++; / / I ncr ement a i
if ( i >= 10) { / / Ver i f i ca se i mai or ou i gual a 10
i = 0;
}
}
}
return( 0) ;
}
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 21
XTAL1
62
XTAL2
61
P0.0/TxD0/PWM1
19
P0.1/RxD0/PWM3/EINT0
21
P0.2/SCL0/CAP0.0
22
P0.3/SDA0/MAT0..0/EINT1
26
P0.4/SCK0/CAP0.1/AD0.6
27
P0.5/MISO0/MAT0.1/AD0.7
29
P0.6/MOSI0/CAP0.2/AD1.0
30
P0.7/SSEL0/PWM2/EINT2
31
P0.8/TxD1/PWM4/AD1.1
33
P0.9/RxD1/PWM6/EINT3
34
P0.10/RTS1/CAP1.0/AD1.2
35
P0.11/CTS1/CAP1.1/SCL1
37
P0.12/DSR1/MAT1.0/AD1.3
38
P0.13/DTR1/MAT1.1/AD1.4
39
P0.14/DCD1/EINT1/SDA1
41
P0.15/RI1/EINT2/AD1.5
45
P0.16/EINT0/MAT0.2/CAP0.2
46
P0.17/CAP1.2/SCK1/MAT1.2
47
P0.18/CAP1.3/MISO1/MAT1.3
53
P0.19/MAT1.2/MOSI1/CAP1.2
54
P0.20/MAT1.3/SSEL1/EINT3
55
P0.21/PWM5/AD1.6/CAP1.3
1
P0.22/AD1.7/CAP0.0/MAT0.0
2
P0.23
58
P0.25/AD0.4/AOUT
9
P0.27/AD0.0/CAP0.1/MAT0.1
11
P0.28/AD0.1/CAP0.2/MAT0.2
13
P0.29/AD0.2/CAP0.3/MAT0.3
14
P0.30/AD0.3/EINT3/CAP0.0
15
V3
23
RST
57
VREF
63
VSS
6
VSSA
59
P1.16/TRACEPKT0
16
P1.17/TRACEPKT1
12
P1.18/TRACEPKT2
8
P1.19/TRACEPKT3
4
P1.20/TRACESYNC
48
P1.21/PIPESTAT0
44
P1.22/PIPESTAT1
40
P1.23/PIPESTAT2
36
P1.24/TRACECLK
32
P1.25/EXTIN0
28
P1.26/RTCK
24
P1.27/TDO
64
P1.28/TDI
60
P1.29/TCK
56
P1.30/TMS
52
P1.31/TRST
20
V3
43
V3
51
VSS
18
VSS
25
VSS
42
VSS
50
RTXC1
3
RTXC2
5
V3A
7
VBAT
49
P0.31
17
P0.26/AD0.5
10
U1
LPC2138
3.3V
R7
300
3 4
U2:B
74HCT04
3.3V
C1
22pF
C2
22pF
X1
CRYSTAL
FREQ=12MHz
D1
DIODE
R1
47k
C3
100pF
R2
2k2
3
.3
V
R3
300
1 2
U2:A
74HCT04
R4
300
5 6
U2:C
74HCT04
R5
300
13 12
U2:D
74HCT04
R6
300
11 10
U2:E
74HCT04
R8
300
9 8
U2:F
74HCT04
R9
300
1 2
U3:A
74HCT04
3.3V
R10
300
3 4
U3:B
74HCT04
R11
300
5 6
U3:C
74HCT04
R12
300
13 12
U3:D
74HCT04
R13
300
11 10
U3:E
74HCT04
R14
300
9 8
U3:F
74HCT04
R15
300
1 2
U4:A
74HCT04
R16
300
3 4
U4:B
74HCT04
(COM)
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/ * DEFI NI TI ONS AND MACROS */
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#define seg_a ( 1<<18) / / Pi no 18 do PORT1
#define seg_b ( 1<<19) / / Pi no 19 do PORT1
#define seg_c ( 1<<20) / / Pi no 20 do PORT1
#define seg_d ( 1<<21) / / Pi no 21 do PORT1
#define seg_e ( 1<<22) / / Pi no 22 do PORT1
#define seg_f ( 1<<23) / / Pi no 23 do PORT1
#define seg_g ( 1<<24) / / Pi no 24 do PORT1
#define t r an_dez ( 1<<25) / / Pi no 25 do PORT1
#define t r an_uni ( 1<<26) / / Pi no 26 do PORT1
#define bot t on ( 1<<15) / / Bot o
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/ * FUNCTI ON I MPLEMENTATI ON */
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / - - - Rot i na que conver t e umnmer o deci mal par a 7 Segment os - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Decimal_to_7Segment( ui nt 8_t i ) {
const ui nt 32_t t abel a[ 10] = {
seg_a| seg_b| seg_c| seg_d| seg_e| seg_f , / / Escr eve 0 no di spl ay
seg_b| seg_c, / / Escr eve 1 no di spl ay
seg_a| seg_b| seg_d| seg_e| seg_g, / / Escr eve 2 no di spl ay
seg_a| seg_b| seg_c| seg_d| seg_g, / / Escr eve 3 no di spl ay
seg_b| seg_c| seg_f | seg_g, / / Escr eve 4 no di spl ay
seg_a| seg_c| seg_d| seg_f | seg_g, / / Escr eve 5 no di spl ay
seg_a| seg_c| seg_d| seg_f | seg_e| seg_g, / / Escr eve 6 no di spl ay
seg_a| seg_b| seg_c, / / Escr eve 7 no di spl ay
seg_a| seg_b| seg_c| seg_d| seg_e| seg_f | seg_g, / / Escr eve 8 no di spl ay
seg_a| seg_b| seg_c| seg_f | seg_g / / Escr eve 9 no di spl ay
};
if ( i > 9) {
i = 0;
}
I OCLR1 = t abel a[ i ] ;
}
/ / - - - Rot i na Pr i nci pal - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int main ( void)
{
cpu_i ni t ( ) ; / / Chama a r ot i na de i ni ci al i zao da CPU
int j = 0; / / Decl ar a umi nt ei r o de 32bi t ( - 2. 147. 483. 648 a +2. 147. 483. 647)
int uni = 0; / / Decl ar a umi nt ei r o de 32bi t ( - 2. 147. 483. 648 a +2. 147. 483. 647)
int dez = 0; / / Decl ar a umi nt ei r o de 32bi t ( - 2. 147. 483. 648 a +2. 147. 483. 647)
int cont = 0; / / Decl ar a umi nt ei r o de 32bi t ( - 2. 147. 483. 648 a +2. 147. 483. 647)
/ / O r egi st r ador PI NSEL2 cont r ol a a f uno dos pi nos do PORT1. Se o bi t 2 do
r egi st r ador PI NSEL2 f or i gual a 0 ( zer o) , os pi nos P1. 36- 26 so conf i gur ados como
ent r ada/ sa da e se o bi t 3 dest e r egi st r ador f or i gual a 0 ( zer o) , os pi nos P1. 25- 16 so
conf i gur ados como ent r ada/ sa da. Por padr o, os bi t s 2 e 3 so i ni ci al i zados comval or 0
( zer o) - Ver Tabl e 62: Pi n f unct i on Sel ect r egi st er 2 no document o LPC214X User
Manual . pdf
I ODI R1 | = seg_a| seg_b| seg_c| seg_d| seg_e| seg_f | seg_g| t r an_dez| t r an_uni ; / / Pi nos como
sa da
I OCLR1 = t r an_dez| t r an_uni ; / / N vel bai xo nos pi nos que aci onamos t r ansi st or es
I OSET1 = seg_a| seg_b| seg_c| seg_d| seg_e| seg_f | seg_g; / / N vel bai xo nos segment os
while( 1) {
I OSET1 = t r an_dez; / / Faz o Tr ansi st or da dezena ent r ar na sat ur ao
Deci mal _t o_7Segment ( dez) ;
for ( j = 0; j < 5000; j ++ ) asm volatile ( " NOP" ) ; / / Esper a at os segment os
assumi r embr i l ho mxi mo. Est e t empo deve ser conf i gur ado na pr t i ca
I OCLR1 = t r an_dez; / / Faz o Tr ansi st or da dezena ent r ar emcor t e
I OSET1 = seg_a| seg_b| seg_c| seg_d| seg_e| seg_f | seg_g; / / N vel bai xo nos segment os
I OSET1 = t r an_uni ; / / Faz o Tr ansi st or da uni dade ent r ar emsat ur ao
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 27
Deci mal _t o_7Segment ( uni ) ; / / Chama Deci mal _t o_7Segment ( ) par a exi bi r uni dade
for ( j = 0; j < 5000; j ++ ) asm volatile ( " NOP" ) ; / / Esper a
I OCLR1 = t r an_uni ; / / Faz o Tr ansi st or da uni dade ent r ar emcor t e
I OSET1 = seg_a| seg_b| seg_c| seg_d| seg_e| seg_f | seg_g; / / N vel bai xo nos segment os
if ( ! ( I OPI N0 & bot t on) ) / / Ver i f i ca se o Bot o f oi pr essi onado
{
while ( ! ( I OPI N0 & bot t on) ) ; / / Esper a enquant o o Bot o est i ver pr essi nado
cont ++; / / I ncr ement a a var i vel cont
if ( cont >= 16) {
cont = 0;
}
uni = cont %10; / / uni = r est o da di vi so de cont por 10
dez = cont / 10; / / dez = cont di vi di do por 10
}
}
return( 0) ;
}
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 28
Portabilidade e o Pr-processador C
Um cdigo portvel possui mdulos que so reutilizados quando se migra
de uma plataforma de desenvolvimento para outra ou de um modelo de
microcontrolador para outro.
Ao se modularizar um cdigo, tomando-se os cuidados para torn-lo
portvel, a maior parte dos mdulos so reutilizados exigindo do programador o
trabalho de reajustar somente os mdulos que comandam os dispositivos
perifricos que so particulares a um determinado modelo de microcontrolador.
Deste modo, "Portabilidade" significa escrever o seu programa (cdigo), de
tal forma que o cdigo funcione mesmo em ambientes diferentes, isto , em
vrios processadores, sistemas operacionais, verses de bibliotecas, etc.
Se o programa for portvel, basta recompilar o cdigo em um sistema novo
e ele dever rodar sem problemas.
Por outro lado, os cdigos no portteis geram muitos problemas de
manuteno, controle de verses, possuem legibilidade ruim e so de difcil
compreenso.
O uso criterioso das diretivas do pr-processador auxiliam a tornar o
cdigo portvel.
Um pr-processador um programa que recebe texto e efetua converses
lxicas nele. As converses podem incluir substituio de macros, incluso
condicional e incluso de outros arquivos.
A linguagem de programao C possui um pr-processador que efetua as
seguintes transformaes:
Substitui trgrafos por equivalentes;
Concatena arquivos de cdigo-fonte;
Substitui comentrios por espaos em branco;
Reage a linhas iniciadas com um caractere de cardinal (#),
efetuando substituio de macros, incluso de arquivos, incluso
condicional e outras operaes.
Segue dois exemplos de uso do pr-processador:
Exemplo 1: O CRC de um Frame MODBUS pode ser calculado de duas
maneiras. A primeira utilizando tabelas e a segunda por meio de expresso
aritmtica que realiza o clculo do CRC bit a bit.
Utilizar tabela consome mais memria enquanto calcular bit a bit requer
maior processamento. Deste modo, o melhor mtodo a ser utilizado depende
dos recursos de processamento disponveis no C utilizado.
A Figura 13 mostra o uso do pr-processador para facilitar a escolha do
mtodo de clculo do CRC-16. Caso a macro USE_CRC_TABLE for igual a 1
o CRC-16 ser calculado por meio de tabela que exigir mais memria, mas
em contrapartida ser mais rpido. Por outro lado, quando a macro
USE_CRC_TABLE for igual a 0, o clculo do CRC ser realizado por meio de
expresso aritmtica que calcula o CRC bit a bit, o que exigir maior
processamento.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 29
Figura 13 Uso do pr-processador no clculo do CRC-16.
Exemplo 2: Diz respeito a configurao de registradores que controlam os
perifricos de um microcontrolador que realizada por meio de registradores
especiais onde cada bit ou um conjunto de bits ajustam ou habilitam uma
determinada funo.
A multiplexao de funes em pinos de microcontroladores prtica
comum. Por esse motivo, a funo desejada deve ser escolhida por meio de
registradores de configurao.
A Figura 14 mostra as funes dos pinos P0.4, P0.5 e P0.6. Supondo que
um dispositivo com interface SPI esta conectado neles, o pino P0.4 deve ser
configurado com a funo SCK0, o pino P05 com a funo MISO0 e o pino
P0.6 com a funo MOSI0.
Figura 14 - Configurao de Registrador.
O registrador que configura as funes dos pinos o PINSEL0 e, de
acordo com as instrues contidas na figura, o bit 8, 10, e 12 devem ser igual a
1 para que a interface SPI seja habilitada. Neste caso, o pr-processador pode
ser utilizado para facilitar a configurao e deixar claro os bits que assumiram
valor igual a 1 ( PINSEL0 |= (1<<8)|(1<<10)|(1<<12); ). Por outro lado, a
abordagem que utiliza um nmero hexadecimal para configurar os pinos, deixa
o cdigo de difcil compreenso ( PINSEL0 |= 0x00001500; ).
Vale salientar que o uso do pr-processador no afeta o desempenho do
firmware porque executado antes da compilao. Ele executado
automaticamente todas as vezes que o programa compilado e os comandos
a serem executados so dados atravs de diretivas do pr-processador.
As linhas que comeam com um # so comandos para o pr-processador.
A linha inteira reservada para este comando (nenhum cdigo C pode
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 30
bit n
byte Escala de Valores
8 bit int 8 1 -127 a 128
16 bit int 16 2 -32.768 a 32.767
32 bit int 32 4 2.147.483.648 a 2.147.438.647
8 bit unsigned int 8 1 0 a 255
16 bit unsigned int 16 2 0 a 65.535
32 bit unsigned int 32 4 0 a 4.294.967.295
Observa-se que quando a palavra aumenta um byte o valor de mximo e
mnimo varia drasticamente. Um inteiro de 8 bit varia de -127 a 128 enquanto
um inteiro de 16 bit varia de -32.768 a 32.768 e um de 32 bit de -2.147.483.648
(Dois bilhes cento e quarenta e sete milhes quatrocentos e oitenta e trs mil
seiscentos e quarenta e oito)
Deste modo, de acordo com a Tabela 07, se o cdigo for implementado
para um microcontrolador de 32 bit ter problemas de incompatibilidade do tipo
inteiro se for utilizado em um microcontrolador de 16 ou 8 bit. Do mesmo modo,
um firmware criado para um microcontrolador de 16 bit ter problemas de
incompatibilidade do tipo inteiro se for usado em um microcontrolador de 8 bit.
Tabela 07 Mudana de Plataforma
MUDANA DE PLATAFORMA
DE PARA
32 bit 16 ou 8 bit
16 bit 8 bit
Tentando resolver problemas de portabilidade, em 1989, a comunidade
ANSI/ISSO criou o C89 Standart Data Types.
Depois de uma dcada de testes, o Padro C89 foi revisado dando origem
ao C99 Standart Data Types, como mostrado na Tabela 08.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 32
Esse padro criou o int8_t que especifica o tamanho do inteiro que est
sendo utilizado permitindo que o programador tome providncias quando a
operao no for atmica.
Tabela 08 C99 Standart Data Types
TIPO DESCRIO
int8_t Inteiro de 8 bit com sinal
uint8_t Inteiro de 8 bit sem sinal
int16_t Inteiro de 16 bit com sinal
uint16_t Inteiro de 16 bit sem sinal
int32_t Inteiro de 32 bit com sinal
uint32_t Inteiro de 32 bit sem sinal
int64_t Inteiro de 64 bit com sinal
uint64_t Inteiro de 64 bit sem sinal
1) int8_t especifica um inteiro com sinal de 8 bit
2) uint8_t especifica um inteiro sem sinal de 8 bit
3) int16_t especifica um inteiro com sinal de 16 bit
4) uint16_t especifica um inteiro sem sinal de 16 bit
5) int32_t especifica um inteiro com sinal de 32 bit
6) uint32_t especifica um inteiro sem sinal de 32 bit
7) int64_t especifica um inteiro com sinal de 64 bit
8) uint64_t especifica um inteiro sem sinal de 64 bit
O exemplo a seguir elucida alguns inconvenientes que surgem quando se
muda de uma plataforma para outra que possui a palavra menor.
Exemplo: Uma indstria possui um equipamento que utiliza um
microcontrolador de 16 bit modelo ST7F269 e decide refazer o projeto e utilizar
a verso de 8 bit ST72264, como mostrado na Figura 11. Tanto um quando o
outro possuem um A/D de 10 bit o que mantm a preciso na leitura do sinal do
sensor.
A empresa pretende fabricar 1.000.000 unidades do equipamento e a
diferena de preo entre o modelo de 16 bit para o de 8 bit de US$ 2,00.
Portanto a empresa ir economizar 2.000.000,00 (dois milhes de dlares).
Figura 15 Mudana de plataforma de microcontrolador de 16 bit para
microcontrolador de 8 bit.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 33
Teclado Matricial
Crie uma rotina para varrer o teclado matricial 4x4 apresentado na Figura
11. Toda vez que uma tecla numrica do teclado for pressionada, o nmero
correspondente deve ser exibido no display.
Os diodos D2, D3, D4 e D5 so utilizados em srie com as linhas do
teclado para proporcionar proteo para os pinos do microcontrolador,
impedindo que qualquer falha de configurao nos pinos venha a danific-los.
Por exemplo, se os pinos P1.16 e P1.28 forem configurados como sada e um
deles assumir o nvel lgico alto e o outro baixo, quando a tecla 7 for
pressionada, ocorrer um curto circuito nos pinos que poder resultar em
danos permanentes de hardware. Os diodos utilizados neste tipo de aplicao
so, em geral, diodos de sinal do tipo 1N914 ou 1N4148.
XTAL1
62
XTAL2
61
P0.0/TxD0/PWM1
19
P0.1/RxD0/PWM3/EINT0
21
P0.2/SCL0/CAP0.0
22
P0.3/SDA0/MAT0..0/EINT1
26
P0.4/SCK0/CAP0.1/AD0.6
27
P0.5/MISO0/MAT0.1/AD0.7
29
P0.6/MOSI0/CAP0.2/AD1.0
30
P0.7/SSEL0/PWM2/EINT2
31
P0.8/TxD1/PWM4/AD1.1
33
P0.9/RxD1/PWM6/EINT3
34
P0.10/RTS1/CAP1.0/AD1.2
35
P0.11/CTS1/CAP1.1/SCL1
37
P0.12/DSR1/MAT1.0/AD1.3
38
P0.13/DTR1/MAT1.1/AD1.4
39
P0.14/DCD1/EINT1/SDA1
41
P0.15/RI1/EINT2/AD1.5
45
P0.16/EINT0/MAT0.2/CAP0.2
46
P0.17/CAP1.2/SCK1/MAT1.2
47
P0.18/CAP1.3/MISO1/MAT1.3
53
P0.19/MAT1.2/MOSI1/CAP1.2
54
P0.20/MAT1.3/SSEL1/EINT3
55
P0.21/PWM5/AD1.6/CAP1.3
1
P0.22/AD1.7/CAP0.0/MAT0.0
2
P0.23
58
P0.25/AD0.4/AOUT
9
P0.27/AD0.0/CAP0.1/MAT0.1
11
P0.28/AD0.1/CAP0.2/MAT0.2
13
P0.29/AD0.2/CAP0.3/MAT0.3
14
P0.30/AD0.3/EINT3/CAP0.0
15
V3
23
RST
57
VREF
63
VSS
6
VSSA
59
P1.16/TRACEPKT0
16
P1.17/TRACEPKT1
12
P1.18/TRACEPKT2
8
P1.19/TRACEPKT3
4
P1.20/TRACESYNC
48
P1.21/PIPESTAT0
44
P1.22/PIPESTAT1
40
P1.23/PIPESTAT2
36
P1.24/TRACECLK
32
P1.25/EXTIN0
28
P1.26/RTCK
24
P1.27/TDO
64
P1.28/TDI
60
P1.29/TCK
56
P1.30/TMS
52
P1.31/TRST
20
V3
43
V3
51
VSS
18
VSS
25
VSS
42
VSS
50
RTXC1
3
RTXC2
5
V3A
7
VBAT
49
P0.31
17
P0.26/AD0.5
10
U1
LPC2138
3.3V
R7
300
3 4
U2:B
74HCT04
3.3V
C1
22pF
C2
22pF
X1
CRYSTAL
FREQ=12MHz
D1
DIODE
R1
47k
C3
100pF
R2
2k2
3.3V
R3
300
1 2
U2:A
74HCT04
R4
300
5 6
U2:C
74HCT04
R5
300
13 12
U2:D
74HCT04
R6
300
11 10
U2:E
74HCT04
R8
300
9 8
U2:F
74HCT04
R9
300
1 2
U3:A
74HCT04
3.3V
1 2 3
6 5 4
8 9 7
++
0 =
A
B
C
D
124 3
D2
D3
D4
D5
R10
10k
R11
10k
R12
10k
R13
10k
3.3V
Figura 18 Teclado Matricial
Resoluo: Os pinos P1.16, P1.17, P1.18 e P1.19 devem ser configurados
como sada e os pinos P1.28, P1.29, P1.30 e P1.31 como entrada. Toda vez
que o pino P1.16 assumir nvel lgico baixo e a tecla 7 for pressionada, o pino
P1.28 tambm assumir nvel lgico baixo, pois o pino P1.16, configurado
como sada, ir drenar toda corrente fornecida pelo resistor de pull-up R10.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 38
Programa
#include " LPC214x. h"
#include " cpu_i ni t . h"
#include <st di nt . h> / / Bi bl i ot eca que def i ne o t amanho exat o do t i po pr i mi t i vo
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/ * DEFI NI TI ONS AND MACROS */
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#define LI NHA_A ( 1<<16)
#define LI NHA_B ( 1<<17)
#define LI NHA_C ( 1<<18)
#define LI NHA_D ( 1<<19)
#define COLUNA_1 ( 1<<28)
#define COLUNA_2 ( 1<<29)
#define COLUNA_3 ( 1<<30)
#define seg_a ( 1<<0) / / Segment o a
#define seg_b ( 1<<1) / / Segment o b
#define seg_c ( 1<<2) / / Segment o c
#define seg_d ( 1<<3) / / Segment o d
#define seg_e ( 1<<4) / / Segment o e
#define seg_f ( 1<<5) / / Segment o f
#define seg_g ( 1<<6) / / Segment o g
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / - - - Rot i na que conver t e umnmer o deci mal par a 7 Segment os - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Decimal_to_7Segment( ui nt 8_t i ) {
I OCLR0 | = 0xFFFFFFFF; / / For a n vel bai xo emt odos os pi nos do PORT0
switch ( i )
{
case 0: I OSET0 | = seg_a| seg_b| seg_c| seg_d| seg_e| seg_f ; break; / / 0 no di spl ay
case 1: I OSET0 | = seg_b| seg_c; break; / / 1 no di spl ay
case 2: I OSET0 | = seg_a| seg_b| seg_d| seg_e| seg_g; break; / / 2 no di spl ay
case 3: I OSET0 | = seg_a| seg_b| seg_c| seg_d| seg_g; break; / / 3 no di spl ay
case 4: I OSET0 | = seg_b| seg_c| seg_f | seg_g; break; / / 4 no di spl ay
case 5: I OSET0 | = seg_a| seg_c| seg_d| seg_f | seg_g; break; / / 5 no di spl ay
case 6: I OSET0 | = seg_a| seg_c| seg_d| seg_f | seg_e| seg_g; break; / / 6 no di spl ay
case 7: I OSET0 | = seg_a| seg_b| seg_c; break; / / 7 no di spl ay
case 8: I OSET0 | = seg_a| seg_b| seg_c| seg_d| seg_e| seg_f | seg_g; break; / / 8 no di spl ay
case 9: I OSET0 | = seg_a| seg_b| seg_c| seg_f | seg_g; break; / / Escr eve 9 no di spl ay
default: break; / / Escr eve 0 no di spl ay
}
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / - - - Rot i na que var r e o t ecl ado - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ui nt 8_t Varre_Teclado( void) {
ui nt 8_t i = 10; / / Se i per manecer i gual a 10 si gni f i ca que nenhuma t ecl a f oi
pr essi onada
I OCLR1 | = LI NHA_A; / / N vel bai xo na Li nha A
if ( ! ( I OPI N1 & COLUNA_1) ) {
i = 7;
while ( ! ( I OPI N1 & COLUNA_1) ) ; / / Aguar da sol t ar bot o
}
if ( ! ( I OPI N1 & COLUNA_2) ) {
i = 8;
while ( ! ( I OPI N1 & COLUNA_2) ) ; / / Aguar da sol t ar bot o
}
if ( ! ( I OPI N1 & COLUNA_3) ) {
i = 9;
while ( ! ( I OPI N1 & COLUNA_3) ) ; / / Aguar da sol t ar bot o
}
I OSET1 | = LI NHA_A; / / N vel al t o na Li nha A
I OCLR1 | = LI NHA_B; / / N vel bai xo na Li nha B
if ( ! ( I OPI N1 & COLUNA_1) ) {
i = 4;
while ( ! ( I OPI N1 & COLUNA_1) ) ; / / Aguar da sol t ar bot o
}
if ( ! ( I OPI N1 & COLUNA_2) ) {
i = 5;
while ( ! ( I OPI N1 & COLUNA_2) ) ; / / Aguar da sol t ar bot o
}
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 39
XTAL1
62
XTAL2
61
P0.0/TxD0/PWM1
19
P0.1/RxD0/PWM3/EINT0
21
P0.2/SCL0/CAP0.0
22
P0.3/SDA0/MAT0..0/EINT1
26
P0.4/SCK0/CAP0.1/AD0.6
27
P0.5/MISO0/MAT0.1/AD0.7
29
P0.6/MOSI0/CAP0.2/AD1.0
30
P0.7/SSEL0/PWM2/EINT2
31
P0.8/TxD1/PWM4/AD1.1
33
P0.9/RxD1/PWM6/EINT3
34
P0.10/RTS1/CAP1.0/AD1.2
35
P0.11/CTS1/CAP1.1/SCL1
37
P0.12/DSR1/MAT1.0/AD1.3
38
P0.13/DTR1/MAT1.1/AD1.4
39
P0.14/DCD1/EINT1/SDA1
41
P0.15/RI1/EINT2/AD1.5
45
P0.16/EINT0/MAT0.2/CAP0.2
46
P0.17/CAP1.2/SCK1/MAT1.2
47
P0.18/CAP1.3/MISO1/MAT1.3
53
P0.19/MAT1.2/MOSI1/CAP1.2
54
P0.20/MAT1.3/SSEL1/EINT3
55
P0.21/PWM5/AD1.6/CAP1.3
1
P0.22/AD1.7/CAP0.0/MAT0.0
2
P0.23
58
P0.25/AD0.4/AOUT
9
P0.27/AD0.0/CAP0.1/MAT0.1
11
P0.28/AD0.1/CAP0.2/MAT0.2
13
P0.29/AD0.2/CAP0.3/MAT0.3
14
P0.30/AD0.3/EINT3/CAP0.0
15
V3
23
RST
57
VREF
63
VSS
6
VSSA
59
P1.16/TRACEPKT0
16
P1.17/TRACEPKT1
12
P1.18/TRACEPKT2
8
P1.19/TRACEPKT3
4
P1.20/TRACESYNC
48
P1.21/PIPESTAT0
44
P1.22/PIPESTAT1
40
P1.23/PIPESTAT2
36
P1.24/TRACECLK
32
P1.25/EXTIN0
28
P1.26/RTCK
24
P1.27/TDO
64
P1.28/TDI
60
P1.29/TCK
56
P1.30/TMS
52
P1.31/TRST
20
V3
43
V3
51
VSS
18
VSS
25
VSS
42
VSS
50
RTXC1
3
RTXC2
5
V3A
7
VBAT
49
P0.31
17
P0.26/AD0.5
10
U1
LPC2138
3.3V
X1
CRYSTAL
REQ=12MHz
C3
100pF
1 2 3
6 5 4
8 9 7
++ 0 =
A
B
C
D
124 3
D2
D3
D4
D5
R2
10k
R3
10k
R4
10k
R5
10k
3.3V
300
300
300
300
300
300
S
R
G
8
R
C
1
/->
&
1
D
1
3
2
4561
0
8
1
1
1
2
9
1
3
U2
74HCT164
3.3V
330
3.3V
300
300
300
300
300
300
S
R
G
8
R
C
1
/->
&
1
D
1
3
2
4561
0
8
1
1
1
2
9
1
3
U3
74HCT164
3.3V
330
U3(MR)
300
300
300
300
300
300
S
R
G
8
R
C
1
/->
&
1
D
1
3
2
4561
0
8
1
1
1
2
9
1
3
U4
74HCT
3.3V
330
U4(MR)
Figura 19 Teclado Matricial e trs displays acionados por shift register.
Display de Cristal Lquido
Utilize o mdulo LCD para acionar um display de cristal lquido
alfanumrico de 2x16 de acordo com as especificaes da Tabela 09 e do
diagrama esquemtico mostrado na Figura 13. A primeira linha do display
dever exibir SIST. EMBARCADOS e a segunda linha a palavra
Contador: seguida de uma varivel decimal que ser incrementada toda vez
que o push botton conectado ao pino P1.31 do LPC2148 for pressionado.
Tabela 09 Conexo dos pinos do LPC2148 com os pinos do LCD
Pino do
LPC2148
Pino do LCD
P0.10 D4
P0.11 D5
P0.12 D6
P0.13 D7
P0.22 RS
P0.28 RW
P0.29 F
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 41
XTAL1
62
XTAL2
61
P0.0/TxD0/PWM1
19
P0.1/RxD0/PWM3/EINT0
21
P0.2/SCL0/CAP0.0
22
P0.3/SDA0/MAT0..0/EINT1
26
P0.4/SCK0/CAP0.1/AD0.6
27
P0.5/MISO0/MAT0.1/AD0.7
29
P0.6/MOSI0/CAP0.2/AD1.0
30
P0.7/SSEL0/PWM2/EINT2
31
P0.8/TxD1/PWM4/AD1.1
33
P0.9/RxD1/PWM6/EINT3
34
P0.10/RTS1/CAP1.0/AD1.2
35
P0.11/CTS1/CAP1.1/SCL1
37
P0.12/DSR1/MAT1.0/AD1.3
38
P0.13/DTR1/MAT1.1/AD1.4
39
P0.14/DCD1/EINT1/SDA1
41
P0.15/RI1/EINT2/AD1.5
45
P0.16/EINT0/MAT0.2/CAP0.2
46
P0.17/CAP1.2/SCK1/MAT1.2
47
P0.18/CAP1.3/MISO1/MAT1.3
53
P0.19/MAT1.2/MOSI1/CAP1.2
54
P0.20/MAT1.3/SSEL1/EINT3
55
P0.21/PWM5/AD1.6/CAP1.3
1
P0.22/AD1.7/CAP0.0/MAT0.0
2
P0.23
58
P0.25/AD0.4/AOUT
9
P0.27/AD0.0/CAP0.1/MAT0.1
11
P0.28/AD0.1/CAP0.2/MAT0.2
13
P0.29/AD0.2/CAP0.3/MAT0.3
14
P0.30/AD0.3/EINT3/CAP0.0
15
V3
23
RST
57
VREF
63
VSS
6
VSSA
59
P1.16/TRACEPKT0
16
P1.17/TRACEPKT1
12
P1.18/TRACEPKT2
8
P1.19/TRACEPKT3
4
P1.20/TRACESYNC
48
P1.21/PIPESTAT0
44
P1.22/PIPESTAT1
40
P1.23/PIPESTAT2
36
P1.24/TRACECLK
32
P1.25/EXTIN0
28
P1.26/RTCK
24
P1.27/TDO
64
P1.28/TDI
60
P1.29/TCK
56
P1.30/TMS
52
P1.31/TRST
20
V3
43
V3
51
VSS
18
VSS
25
VSS
42
VSS
50
RTXC1
3
RTXC2
5
V3A
7
VBAT
49
P0.31
17
P0.26/AD0.5
10
U1
LPC2138
3.3V
3.3V
C1
22pF
C2
22pF
X1
CRYSTAL
FREQ=12MHz
D1
DIODE
R1
47k
C3
100pF
R25
2k2
3
.
3
V
D
7
1
4
D
6
1
3
D
5
1
2
D
4
1
1
D
3
1
0
D
2
9
D
1
8
D
0
7
E
6
R
W
5
R
S
4
V
S
S
1
V
D
D
2
V
E
E
3
LCD
LM016L
Figura 20 Acionando um display de cristal lquido alfanumrico de 2x16.
Resoluo:
Passo 1: Crie um novo projeto denominado LCD.
Passo 2: Copiar o contedo do arquivo LCD.txt, localizado em
...\Aulas\LCD\Programas, e colar no arquivo main.c criado no projeto LCD.
Passo 3: Importar para o projeto LCD os arquivos delay_loop.c,
delay_loop.h, iprintf.c, iprintf.h, lcd.c e lcd.h, localizados na pasta
_Mdulos do ARM LPC2148 em C:\ARM\PROGRAMAS\LPC2148\
As instrues sobre como importar arquivos esto no Tutorial - Como
Criar um Projeto em C para ARM.pdf, disponvel no arquivo Aulas.zip
Passo 4: Compilar o programa.
Passo 5: Transferir o arquivo binrio gerado para o microcontrolador ARM.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 42
Programa
#include " LPC214x. h"
#include " cpu_i ni t . h"
#include " i pr i nt f . h" / / Separ a uma st r i ng emcar act er es par a poder envi - l os ser i al ment e
#include " l cd. h" / / Mdul o comr ot i nas de i ni ci al i zao e oper ao do LCD
#include " st di nt . h" / / St andar d C dat a t ypes
#define but t on ( 1<<31) / / Bot o
int main( void)
{
cpu_i ni t ( ) ; / / Chama a r ot i na de i ni ci al i zao da CPU
uint16_t i =0;
l cd_i ni t ( ) ; / / Rot i na de i ni ci al i zao do di spl ay
l cd_l i ne1( ) ; / / Leva o cur sor do di spl ay par a o i n ci o da l i nha 1
l cd_st r i ng( " SI ST. EMBARCADOS" ) ; / / Escr eve st r i ng na l i nha
l cd_l i ne2( ) ; / / Leva o cur sor do di spl ay par a o i n ci o da l i nha 2
i pr i nt f ( " Cont ador : %d" , i ) ; / / Escr eve st r i ng na l i nha
while( 1) {
if ( ! ( I OPI N1 & but t on) ) / / Ver i f i ca se o Bot o f oi pr essi onado
{
i ++;
while ( ! ( I OPI N1 & but t on) ) ; / / Esper a sol t ar bot o
l cd_l i ne2( ) ; / / Leva o cur sor do di spl ay par a o i n ci o da l i nha 2
i pr i nt f ( " Cont ador : %d" , i ) ; / / Escr eve st r i ng na l i nha
}
}
return 0;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / EOF
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Comentrio sobre o Mdulo LCD
A configurao dos pinos do microcontrolador utilizados para acionar as
linhas de controle e dados do LCD 2x16 realizada na rotina lcd_init() que se
encontra no arquivo lcd.c.
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void lcd_init( void)
{
/ / P0. 10, P0. 11, P0. 12 e P0. 13 como ent r ada/ sa da ( 2 bi t s de conf i gur ao cada pi no)
PI NSEL0 &= ~( ( 1<<20) | ( 1<<21) | ( 1<<22) | ( 1<<23) | ( 1<<24) | ( 1<<25) | ( 1<<26) | ( 1<<27) ) ;
/ / P0. 21, P0. 22, P0. 28 e P0. 29 como ent r ada/ sa da ( 2 bi t s de conf i gur ao cada pi no)
PI NSEL1 &= ~( ( 1<<10) | ( 1<<11) | ( 1<<12) | ( 1<<13) | ( 1<<24) | ( 1<<25) | ( 1<<26) | ( 1<<27) ) ;
/ / Conf i gur a E, RS, RW, D7, D6, D5 e D4 como sa da
I ODI R0 | = LCD_DATA_MASK| LCD_CONTROL_MASK| LUZ;
/ / For a n vel l gi co bai xo nos pi nos E, RS, RW, D7, D6, D5 e D4
I OCLR0 = LCD_DATA_MASK| LCD_CONTROL_MASK;
Os registradores PINSEL0 e PINSEL1 utilizam dois bits para configurar a
funo de cada pino do microcontrolador, por isso, o nmero de cada pino no
coincide com a posio dos bits no registrador como ocorre com os
registradores IODIR, IOCLR e IOSET.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 43
Operaes ATOMIC
Uma operao ATOMIC quando o processador utiliza apenas um ciclo
de instruo para execut-la. Deste modo, uma operao que ATOMIC em
um microcontrolador com arquitetura de 16 bit no ATOMIC em um
microcontrolador de 8 bit.
A operao no ATOMIC ocorre quando o processador tenta atualizar
uma varivel maior do que o tamanho da palavra da arquitetura. Por exemplo,
durante a atualizao de uma varivel de 16 bit em um microcontrolador que
possui arquitetura de 8 bit, pode ocorrer perda de dados ou dados corrompidos
se o processador for interrompido durante o processo de atualizao.
A Tabela 10 mostra um resumo das operaes, de acordo com a
arquitetura, para o tipo inteiro definido pelo C99 Standard Data Types.
Tabela 10 Operaes Atmicas e No Atmicas
OPERAES ATOMIC
TIPO C de 8bit C de 16bit C de 32bit
int8_t
uint8_t
int16_t
uint16_t
int32_t
uint32_t
int64_t
uint64_t
Um operao int8_t em uma arquitetura de 8 bit, ou 16 bit ou 32 bit
ou 64 bit atmica e o mesmo ocorre com o uint8_t
Um operao com um int16_t em uma arquitetura de 8 bit no
atmica, porm em uma arquitetura de 16 bit ou 32 bit ou 64 bit ela
atmica, o mesmo ocorre com o uint16_t
Um operao com um int32_t em uma arquitetura de 8 bit ou 16 bit
no atmica, porm em uma arquitetura de 32 bit ou 64 bit ela
atmica, o mesmo ocorre com o uint64_t
Um operao com um int64_t somente atmica em uma
arquitetura de 64 bit e o mesmo ocorre com o tipo uint64_t
Exemplo 01: Vamos analisar o que ocorre ao se tentar atualizar uma
varivel de 32 bit em um C que possui arquitetura de 8 bit, como apresentado
na Figura 22.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 46
Figura 25 - Atualizao da varivel de 32 bit no atmica, utilizada na temporizao de
frames MODBUS, conhecida como tick counter .
Em aplicaes que necessitam temporizar vrias tarefas e que utilizam C
que possuem pouco recurso de hardware um contador de tempo denominado
TickCounter muito utilizado. Ele atualizado toda vez que uma rotina de
interrupo de timer chamada.
Supondo que a varivel TickCounter do tipo uint32_t, como mostra a
Figura 26, toda vez que a interrupo do timer ocorrer o valor desta varivel
ser incrementada.
Em outro trecho do cdigo ocorre a verificao do time out efetuado pelo
clculo do tempo decorrido entre o tempo atual e o de transmisso do ltimo
byte.
No exemplo da Figura 26, o valor do TickCounter no instante de tempo em
que o ltimo byte foi transmitido era de 0x000000AB e, depois de algum tempo,
durante a verificao de time out, exatamente no instante de atualizao da
varivel TempoAtual, ocorreu uma interrupo.
Durante a atualizao da varivel TempoAtual, a instruo assembly
MOVF 29, W move o valor do byte mais significativo da varivel TickCounter
para o registrador de trabalho e a instruo MOVWF 31 move o valor do
registrador de trabalho W para a posio de memria do byte mais significativo
da varivel TempoAtual.
Na sequncia, a instruo assembly MOVF 28, W move o valor do
segundo byte mais significativo da varivel TickCounter para o registrador de
trabalho e a instruo MOVWF 30 move o valor do registrador de trabalho W
para a posio de memria do segundo byte mais significativo da varivel
TempoAtual.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 48
STRUCTURE PADDING
E
SERIALIZAO
Structure Padding est relacionado com alinhamento de memria,
portanto, entender o que alinhamento de memria o primeiro passo.
A maior parte dos processadores prefere, ou at mesmo necessita, que o
acesso a memria seja alinhado. Isso significa que quando o processador
acessa um bloco de n bytes na memria, o endereo inicial deve ser um
mltiplo de n.
Por exemplo, uma varivel de quatro bytes deve estar limitada em uma
fronteira de quatro bytes (o endereo deve ser mltiplo de 4); uma varivel de
dois bytes deve estar limitada em dois bytes (o endereo deve ser mltiplo de
2); e assim sucessivamente.
O alinhamento importante porque permite a utilizao do tipo int com o
mximo de eficincia.
Entretanto, os processadores frequentemente possuem diferentes
requerimentos para o acesso a memria. Por exemplo, a arquitetura Intel x86
permite o acesso desalinhado de memria, mas, neste caso, impe uma queda
significativa no desempenho.
Um acesso desalinhado em um processador RISC resultar em uma falta
no processador causando uma falha. Se a falha for tratada por uma interrupo
sncrona trap, o acesso desalinhado dever ocorrer via software e ser lento.
Em um microcontrolador ARM um acesso de memria desalinhado
resultar em um dado incorreto e, provavelmente, indesejvel. Algumas
verses de ARM com unidades de gerenciamento de memria podem realizar
verificao de alinhamento, mas essa caracterstica no padronizada em
todas as famlias.
A Figura 28 mostra uma palavra de 4 Bytes e seus submltiplos: meia
palavra e byte.
Figura 28 Palavra de 4 Bytes e seus submltiplos: meia palavra e byte.
A Figura 29 mostra o diagrama esquemtico da memria do C ARM de 32
bit modelo LPC 2148.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 51
Figura 30 Uma Palavra, Meia Meia Palavra e Um Byte alinhados.
A Figura 30 mostra como ficou o mapa de memria, aps a inicializao
das variveis em uma sequncia diferente da apresentada no exemplo anterior.
Os dados que percorrem o meio fsico RS485 so organizados em frames
MODBUS, como mostra a Figura 34. Eles possuem um campo de endereo,
que especifica a operao a ser realizada function code, um campo de dados
e um para o CRC.
Figura 34 Frame MODBUS.
De acordo com as especificaes MODBUS, o frame que realiza uma
requisio formado por 1 byte que define o function code, dois bytes que
especificam o endereo do primeiro registrador de 16 bit a ser lido e, por fim, a
quantidade de registradores a ser lido.
De modo semelhante, o frame da resposta composto por um byte que
contm o function code, um byte que especifica o nmero de registradores
lidos e em seguida os valores dos registradores lidos.
A Figura 35 apresenta um exemplo de frame MODBUS que realiza a
requisio da leitura de um sensor e outro frame que fornece a resposta.
boolean
FALSE e TRUE
b
void
---
v
Deste modo, se for necessrio declarar uma varivel do tipo uint8_t,
chamada VelocidadeDoCarro, a varivel dever ser declarada da seguinte
maneira:
uint8_t u8_VelocidadeDoCarro = 0;
Uma varivel chamada TemperaturaDoAr do tipo int16_t ser declarada
do seguinte modo:
uint16_t u16_AirTemperature = 0;
OBS: muito importante ao se declarar uma varivel inicializ-la com
algum valor.
Seguindo a mesma linha de raciocnio, as variveis do tipo ponteiro, os
vetores, as estruturas e os enum tambm devem ser especificados quando
forem declarados. A Tabela 12 apresenta os identificadores sugeridos.
Tabela 12 Identificadores sugeridos para os modificadores de tipo
Modificador de Tipo
Identificador
Sugerido
Arrays a
Enumerao ( enum ) en
Pointers p
Structures ( struct ) st
Exemplo:
uint16_t VelocidadeDoMercedes = 258;
uint16_t VelocidadeDaFerrari = 350;
uint16_t VelocidadeDoBugatti = 407;
uint16_t *p_VelocidadeDoCarro;
p_VelocidadeDoCarro =&VelocidadeDoMercedes;
Comentrios
Evitar o uso de comentrios do tipo /* xxx */ dentro do corpo de funes.
Exemplo:
Correto
if (u8_Variavel1 != u8_Variavel2)
{
u16_pressao = 10000; // valor mximo
..
}
/*******************************
* Inicializar_CPU
********************************/
void Inicializar_CPU(void)
{
..
}
Evitar
if (u8_Variavel1 != u8_Variavel2)
{
u16_pressao = 10000; /* valor mximo */
..
}
void Inicializar_CPU(void)
{
/* Inicializar CPU */
..
}
Constantes
Aconselha-se a no utilizar zero antes de constantes do tipo inteiro, porque
ela ser tratada pelo compilador C como um nmero octal.
Por exemplo:
ToneladasDeLaranja = 120;
ToneladasDePera = 071;
Neste exemplo, observa-se que a varivel ToneladasDeLaranja assumiu
o valor 120 em decimal, contudo, a varivel ToneladasDePera assumiu o valor
57 em decimal e no 71 como se pretendia.
Chaves
Chaves no podem ser evitadas, elas devem ser alocadas em uma linha
prpria, exceto na inicializao de array, quando vier aps while em laos do
tipo do-while ou aps definio de nomes de tipos - Typedef.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 61
Exemplo:
Correto
do
{
Cdigo;
}while( b_Fim == False);
if (u8_Largura != 10)
{
CalculaVolume( );
}
Evitar
if (u16_Largura < 1000)
u32_Area = u16_Altura * u16_Largura;
if (u16_Largura < 1000){
u32_Area = u16_Altura * u16_Largura;}
if (u16_Largura < 1000)
{
u32_Area = u16_Altura * u16_Largura;
}
if (u16_Largura < 1000)
{
u32_Area = u16_Altura * u16_Largura;
}
Unions: A declarao union aloca uma nica posio de memria onde
podem ser armazenadas vrias variveis diferentes sendo que toda vez que se
armazena um valor, o valor anterior perdido. As declaraes unions devem
ser evitadas na programao de sistemas embarcados.
Goto: O comando goto realiza um salto para um local especificado por um
label. Este comando no deve ser utilizado na programao de sistemas
embarcados.
Exerccio Proposto
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 62
Referncias
Universidade Federal de Uberlndia
Faculdade de Engenharia Eltrica FEELT
Ernane Antnio Alves Coelho (Professor da FEELT - UFU)
Felipe Adriano da Silva Gonalves (Aluno da FEELT - UFU)
Igor Borges Tavares (Aluno da FEELT - UFU)
Joo Batista Vieira Jnior (Professor da FEELT - UFU)
Leandro dos Santos Martins (Aluno de Mestrado da FEELT - UFU)
Raony Barrios (Aluno da FEELT UFU)