Você está na página 1de 63

ltimaAtualizao23/07/2011

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

O primeiro sistema embarcado de produo em massa foi o computador


guia do mssil nuclear LGM-30 Mssil Minuteman, lanado em 1961. Ele
possua um disco rgido para a memria principal. Quando a segunda verso
do mssil entrou em produo em 1966, o computador guia foi substitudo por
um novo, que constituiu o primeiro uso em larga escala de circuitos integrados.
A tecnologia desse projeto reduziu o preo de circuitos integrados como a
porta lgica NAND de mil para trs dlares americanos cada, permitindo seu
uso em sistemas comerciais.


A coisa mais indispensvel a um homem
reconhecer o uso que deve fazer do seu prprio
conhecimento. Plato (428 a 348 a.C)


Um dos primeiros minuteman

Figura 3 - O LGM-30 Minuteman um projeto de mssil balstico intercontinental (ICBM)
nuclear dos Estados Unidos.
Desde suas primeiras aplicaes na dcada de 1960, os sistemas
embarcados vm reduzindo seu preo. Tambm tem havido um aumento no
poder de processamento e funcionalidade. Em 1978 foi lanada pela National
Engineering Manufacturers Association a norma para microcontroladores
programveis.
Em meados da dcada de 1980, vrios componentes externos foram
integrados no mesmo chip do processador, o que resultou em circuitos
integrados chamados microcontroladores e na difuso dos sistemas
embarcados.
Com o custo de microcontroladores menor que um dlar americano,
tornou-se vivel substituir componentes analgicos caros como potencimetros
e capacitores por eletrnica digital controlada por pequenos
microcontroladores. No final da dcada de 1980, os sistemas embarcados j
eram a norma ao invs da exceo em dispositivos eletrnicos (URL 1).
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 6

Um sistema embarcado (ou sistema embutido) um sistema no qual o


circuito que processa os dados dedicado ao dispositivo ou sistema que ele
controla. Diferente de computadores de propsito geral, como o computador
pessoal, um sistema embarcado realiza um conjunto de tarefas predefinidas,
geralmente com requisitos especficos. J que o sistema dedicado a tarefas
especficas pode-se otimizar o projeto reduzindo-se tamanho, recursos
computacionais e custo do produto.
Em geral os sistemas embarcados possuem uma capacidade de
processamento reduzida em comparao com computadores desktops. Ao
invs de utilizar microprocessadores, os desenvolvedores preferem utilizar
microcontroladores, pois estes j possuem diversos perifricos integrados no
mesmo chip.
Outra diferena a variedade de arquiteturas disponveis tais como ARM,
MIPS, Coldfire/68k, PowerPC, x86, PIC, 8051, Atmel AVR, Renesas H8, SH,
V850, FR-V, M32R, Z80 e Z8. Isso contrasta com o mercado de computadores
pessoais, limitados somente algumas arquiteturas.
A rea de sistemas embarcados uma das reas com crescimento mais
dinmico e rpido no setor industrial. Sistemas embarcados so aplicados em
diversas reas como automotiva/transporte, governo/militar, equipamentos
hospitalares, telecomunicaes, aeronutica, aeroespacial, eletrodomsticos,
automao residencial, automao industrial, automao agrcola, automao
de indstrias petroqumicas. Estima-se que as casas nos Estados Unidos da
Amrica possuem em mdia de 30 a 40 aparelhos que utilizam dispositivos
dedicados e que aproximadamente 98% de todos os microprocessadores em
uso no mundo so usados em sistemas embarcados.
A programao de sistemas embarcados j vem ocorrendo a mais de trinta
anos, porm, devido o crescimento da capacidade computacional e o aumento
da complexidade dos circuitos dedicados, as disciplinas que tratam da
programao desses circuitos no meio acadmico um assunto relativamente
novo. Alm disso, disciplinas relacionadas a esse assunto so consideradas
interdisciplinares, pois combinam reas como cincia da computao,
engenharia eltrica, matemtica aplicada e teoria de controle.
Com o tremendo crescimento na computao embarcada aumentou-se a
demanda de engenheiros e cientistas da computao, contudo, a maioria dos
programas acadmicos desenvolvem habilidades de programao e projeto de
hardware para computao de propsito geral que operam sobre aplicaes
comerciais e, portanto, no desenvolvem habilidades que so adequadas a
programao e desenvolvimento de hardware para sistemas embarcados. O
resultado disso que as indstrias, nos Estados Unidos, por exemplo, esto
tendo dificuldade em encontrar profissionais com habilidades adequadas para
trabalhar com esses sistemas, o que compromete o desenvolvimento de
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 7

indstrias de base tecnolgica. Isso ocorre porque uma empresa de base


tecnolgica est fundamentada em seu capital humano e social.
Os pases europeus desenvolveram uma comunidade cientfica chamada
ARTIST. O objetivo do Grupo de Excelncia ARTIST fortificar as pesquisas
de sistemas embarcados na Europa e promover o desenvolvimento desta nova
rea multidisciplinar. A ambio desta organizao a produo e
transferncia de conhecimento que promovam a inovao industrial (URL 2).
Para atingir esta meta, o Grupo ARTIST j desenvolveu diretrizes curriculares
de graduao em sistemas embarcados.
No Japo e em muitos outros pases orientais disciplinas sobre sistemas
embarcados so oferecidas nos cursos de Cincia da Computao e de
Engenharia. A maior parte das universidades da China oferece curso de
graduao em engenharia de software embarcada. Na Coria 19 universidades
possuem curso de programao de sistemas dedicados.
Vrias universidades no Brasil oferecem disciplinas intituladas Computao
Mveis ou Sistemas Mveis que utilizam J2ME, porm, este ambiente
(mquina virtual e subconjunto do sistema JAVA) est disponvel apenas em
PDAs, smart phones, algumas IHMs e outros dispositivos com maiores
recursos de memria no hardware. A implementao J2ME CLDC mais
limitada requer de 160KB a 512KB de ROM apenas para a VM e as bibliotecas,
alm de 192KB de RAM sem considerar qualquer subsistema de apoio (URL 3,
URL 4). Do ponto de vista comercial existe ainda o custo de licena relacionado
a uma implementao J2ME.
Os sistemas embarcados tratados nesta apostila possuem limitaes muito
maiores no hardware como memria reduzida (de 1KB a 64KB de RAM),
baixssimo consumo, alta integrao e capacidade limitada de processamento.
So em sua grande maioria destinados a algum controle/monitorao e
programados utilizando a linguagem C, que, ao contrrio do Assembly, permite
portabilidade e certificao SIL (Safety Integrity Level) (URL 5).

Microcontrolador ARM

Todos os exemplos apresentados nesta apostila foram implementados
para o microcontrolador LPC2148 fabricado pela NXP. Ele baseado no
ncleo ARM7 que possui uma arquitetura RISC e pode operar com instrues
de 16 ou 32 bits.
Arquitetura de microprocessador RISC utilizada principalmente em
sistemas embarcados como PDAs, telefones celulares, calculadoras,
perifricos do computador, equipamentos POS (Point-Of-Sale). Tambm
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 8

utilizadas na indstria automotiva, mdica e em aplicaes de controle


industrial.
Primeiro prottipo do processador, o ARM1, surgiu em 1995 e desde ento
mais de um bilho desses dispositivos j foram construdos e essa tecnologia
no parou de evoluir.
A arquitetura ARM foi desenvolvida com o intuito de se obter o melhor
desempenho possvel respeitando as seguintes caractersticas:
Ser simples: tem um conjunto de instrues reduzido, pois sua
arquitetura baseada na filosofia de projeto RISC (Reduced Instruction
Set Computer);
Ocupar pouca rea: otimizao de rea feita atravs de vrias
simplificaes como, por exemplo, deixar tarefas secundrias ou
especficas (I/O, operaes de ponto flutuante, etc) a cargo dos co-
processadores;
Ter baixo consumo de energia: reduo obtida atravs da simplicidade
do circuito, pipeline curto (operando a baixas frequncias) e um projeto
que privilegia o mnimo consumo de energia sempre que o processador
no estiver em operao;
Possui 16 registradores de uso geral;
As instrues so de trs endereos e o conjunto de instrues
extensvel com o uso de at 16 co-processadores;
Capacidade de executar instrues de 16 bits utilizando a arquitetura
Thumb codificao de instrues ARM que permite performance de
32bit a um custo de sistema de 8/16bit;
Arquitetura ARM licenciada, de maneira que diversos fabricantes
produzam chips semelhantes.

A famlia ARM7 um conjunto de microprocessadores RISC de 32 bits de
baixa tenso otimizados para uso comercial. Oferece at 130MIPs e incorpora
o conjunto de instrues Thumb de 16bits. A famlia divide-se em:

ARM7TDMI: Ncleo que processa nmeros inteiros com pipeline de trs
estgios que oferece alta performance com um baixssimo consumo de
energia;
ARM7TDMI-S: Verso sintetizada do ncleo ARM7TDMI, ideal para
projetos onde portabilidade e flexibilidade so caractersticas imprescindveis;
ARM7EJ-S: Ncleo otimizado e sintetizado com extenses na arquitetura e
no conjunto de instrues para suportar operaes DSP e acelerao nas
aplicaes Java utilizando tecnologia ARM Jazelle DBX;
ARM720T: Ncleo que processa nmeros inteiros, com MMU (unidade de
gerenciamento de memria) e cach unificada de 8KB para plataformas de
aplicao abertas tais como Windows CE, Linux, Palm CS e Symbian OS.


1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 9

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

em 64bits), instruo de multiplicar e acumular usada para


implementao de filtros digitais, etc;
Memria flash interna de 512 kB;
Configurao da frequncia de operao dos perifricos;
Perifricos podem ser habilitados e desabilitados individualmente;
Possui USB 2.0 fullspeed com RAM para o endpoint de 2kB;
Duas unidades UART (Universal Asynchronous Receiver/Transmitter);
Duas interfaces com o padro I2C (Inter-Intergrated Circuit);
Uma interface com o padro SPI (Serial Peripheral Interface);
Uma interface com o padro SSP (Synchronous Serial Port);
Interfaces seriais mltiplas incluindo duas UARTs, sendo que uma
possui controle de fluxo implementado em hardware, I2C e SPI;
Dois conversores A/D de aproximao sucessiva de 10 bits com at 8
entradas analgicas multiplexadas cada que podem realizar at 400.000
converses por segundo;
Conversor D/A de 10 bits;
Controlador de interrupes com prioridade programvel;
etc.

Softwares para Programar ARM

Os softwares utilizados na disciplina de Sistemas Embarcados para
programar ARM esto disponveis na rea de DOWNLOAD do site
www.lasec.feelt.ufu.br
Descrio dos softwares utilizados:
1) Java SE Runtime Enviroment
2) Eclipse
1.1) Plug-In do Elipse: CDT GNU Cross Development Tools
1.2) Plug-In do Elipse: Zylin Embedded CDT
3) YAGARTO GNU ARM toolchain
4) YAGARTO Tools
O instalador ir acrescentar no Path do Windows os caminhos:
C:\ARM\yagarto\bin e C:\ARM\yagartotools\bin
OBS1: O arquivo Tutorial - Instalando os Softwares para Programar
ARM.pdf contm instrues detalhadas de todos os passos necessrios para
realizar a instalao dos softwares.
OBS2: Todos os softwares utilizados so distribudos gratuitamente pelos seus
respectivos fornecedores.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 11

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

Programa LED_Blink Comentado


/ * =============================== C/ C++ SOURCE FI LE ================================ */
/ **
\ f i l e
\ descr i pt i on Escr ever o que a r ot i na f az
\ aut hor Nome do aut or
*/
/ * ================================================================================== */
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/ * I NCLUDES */
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

#include " LPC214x. h" / / A di r et i va #include i nf or ma ao compi l ador que el e deve i ncl ui r
o ar qui vo LPC214x. h, poi s est e ar qui vo cont m ender eos de memr i a e de r egi st r ador es
que ser o ut i l i zados no pr ogr ama.

#include " cpu_i ni t . h" / / A di r et i va #include i nf or ma ao compi l ador par a i ncl ui r o mdul o
cpu_i ni t . h, poi s est e ar qui vo cont mas r ot i nas de i ni ci al i zao da CPU do ARM LPC2148.

/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/ * FUNCTI ON I MPLEMENTATI ON */
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
int main ( void) / / A f uno mai n( ) a pr i mei r a f uno a ser execut ada, t odo pr ogr ama
deve possui r uma.
{
int j = 0; / / Decl ar a a var i vel j como i nt ei r o de 32bi t , por que a ar qui t et ur a do ARM
de 32bi t , por i sso, a f ai xa de val or es de j de - 2. 147. 483. 648 a +2. 147. 483. 647

cpu_i ni t ( ) ; / / Chama a r ot i na que i ni ci al i za a CPU do ARM LPC2148

PI NSEL1 &= ~( ( 1<<30) | ( 1<<31) ) ; / / O PI NSEL1 um r egi st r ador que sel eci ona a f uno
dos pi nos ( P0. 16- 31) do PORT0 e ut i l i za 2 bi t s de conf i gur ao par a cada pi no. Nest e
caso, quando o bi t 30 e 31 do r egi st r ador i gual a 0 ( zer o) , o pi no P0. 31 conf i gur ado
como ent r ada/ sa da ( I / O) - Ver i t em 7. 4. 1, denomi nado Pin Function Select Register no
document o LPC214X User Manual.pdf

I ODI R0 | = ( 1<<31) ; / / O r egi st r ador I ODI R0 ut i l i zado par a def i ni r se um det er mi nado
pi no ser ut i l i zado como ent r ada ou sa da. Se um det er mi nado Bi t dest e r egi st r ador f or
conf i gur ado com o val or 1, o pi no do mi cr ocont r ol ador cor r espondent e a est e bi t ser
conf i gur ado como sa da, por out r o l ado, se um det er mi nado Bi t do r egi st r ador I ODI R0 f or
conf i gur ado com o val or 0, o pi no do mi cr ocont r ol ador cor r espondent e a est e bi t ser
conf i gur ado como ent r ada.


while( 1) {

I OSET0 = ( 1<<31) ; / / O r egi st r ador I OSET0 ut i l i zado par a pr oduzi r n vel l gi co
al t o ( 1) em um pi no conf i gur ado como sa da. Toda vez que um bi t dest e r egi st r ador f or
escr i t o com o val or 1, o pi no cor r espondent e a est e bi t ser f or ado a assumi r n vel
l gi co al t o ( 1) . Escr ever 0 emum bi t dest e r egi st r ador no pr oduz ef ei t o. ) - Ver Table
65: GPIO register map (legacy VPB accessible registers) no document o LPC214X User
Manual.pdf. Dest e modo, no se deve ut i l i zar I OSET ou I OCLR como oper ador ( | = ) ou com
o oper ador ( &= ) , poi s o compi l ador i r ger ar cdi go i nt i l .

for ( j = 0; j < 1000000; j ++ ) asm volatile ( " NOP" ) ; / / Esper a
/ / asm( " assembl y code" ) ; Est e o f or mat o de uma i nst r uo assembl y bsi ca
acr escent ada em um cdi go C. A i nst r uo assembl y NOP (No Operation Performed) f az com
que a CPU per manea emesper a dur ant e o t empo que l eva par a uma i nst r uo ser execut ada.
A pal avr a r eser vada volatile i mpede que o compi l ador ot i mi ze est a l i nha de cdi go,
f or ando el e a acr escent ar no cdi go a i nst r uo NOP, mesmo que el a no r eal i ze uma
oper ao.

I OCLR0 = ( 1<<31) ; / / / / O r egi st r ador I OCLR0 ut i l i zado par a pr oduzi r n vel
l gi co bai xo ( 0) em um pi no conf i gur ado como sa da. Toda vez que um bi t dest e
r egi st r ador f or escr i t o com o val or 1, o pi no cor r espondent e a est e bi t ser f or ado a
assumi r n vel l gi co bai xo ( 0) . Escr ever 0 em um bi t dest e r egi st r ador no pr oduz
ef ei t o. Dest e modo, no se deve ut i l i zar I OSET ou I OCLR com o oper ador ( | = ) ou com o
oper ador ( &= ) , poi s o compi l ador i r ger ar cdi go i nt i l .

for ( j = 0; j < 1000000; j ++ ) asm volatile ( " NOP" ) ; / / Esper a
}
return( 0) ; / / boa pr t i ca ut i l i zar r et ur n na f uno mai n( ) par a i nf or mar ao
si st ema oper aci onal quando a execuo do pr ogr ama f oi f i nal i zada.
}
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/ * EOF */
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 14


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

Configurando o Clock da CPU



O clock da cpu configurado no arquivo cpu_init.h. Este arquivo contm
vrios defines que facilitam o ajuste do clock desejado como mostrado a seguir.

/ / Consi der ando umcr i st al de 12 MHz, o val or do Mut i pl i cador e Di vi sor so:
#define cr i st al _12MHz_cpu_60MHz 0x24 / / 0x24 - Cl ock do pr ocessador ( ccl k) conf i gur ado par a 60MHz
#define cr i st al _12MHz_cpu_48MHz 0x23 / / 0x23 - Cl ock do pr ocessador ( ccl k) conf i gur ado par a 48MHz
#define cr i st al _12MHz_cpu_36MHz 0x42 / / 0x42 - Cl ock do pr ocessador ( ccl k) conf i gur ado par a 36MHz
#define cr i st al _12MHz_cpu_24MHz 0x41 / / 0x41 - Cl ock do pr ocessador ( ccl k) conf i gur ado par a 24MHz
#define cr i st al _12MHz_cpu_12MHz 0x60 / / 0x60 - Cl ock do pr ocessador ( ccl k) conf i gur ado par a 12MHz

/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / - - - A f r equnci a da CPU deve ser conf i gur ada aqui ! ! ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

#define cpuMHz cr i st al _12MHz_cpu_60MHz / / Def i ne o cl ock da CPU do ARM


#define bus_di v0 0x01 / / Bar r ament o coma mesma f r equnci a da CPU
#define bus_di v2 0x10 / / Bar r ament o commet ade ( 1/ 2) da f r equnci a da CPU
#define bus_di v4 0x00 / / Bar r ament o comumquar t o ( 1/ 4) da f r equnci a da CPU


/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / - - - A f r equnci a do bar r ament o dos per i f r i cos deve ser conf i gur ada aqui ! ! ! - - - - - - - - - -

#define bus_f r eq bus_di v0 / / Def i ne a f r equnci a do bar r ament o dos per i f r i cos


Se for necessrio criar outros defines, para atender as especificaes de
cristais de outras frequncias, de acordo com o UM10139 Volume 1: LPC214x
User Manual, a configurao da frequncia do CLOCK fornecida por (CCLK =
M FOSC).

Onde:
CCLK: valor da freqncia do CLOCK do processador;
M: valor do multiplicador do PLL que controla a da freqncia do CLOCK do processador;
Fosc: frequncia do oscilador a cristal/oscilador externo.

Supondo que Fosc = 12MHz e CCLK = 60 MHz:

M = CCLK / Fosc
M = 60 MHz / 12 MHz
M= 5

Consequentemente M - 1 = 4 dever ser escrito no registrador
PLLCFG[4:0] que possui a funo de configurar o valor do multiplicador e
divisor do PLL.
O valor do divisor ( P ) do PLL dever ser configurado de tal forma que a
frequncia do PLL (FCCO) fique entre 156 MHz e 320 MHz. Deste modo, para
Fcco = 156 MHz, P = 156 MHz / (2 x 60 MHz) = 1.3 e para Fcco = 320 MHz, P
= 320 MHz / (2 x 60 MHz) = 2.67.
Portanto, o nico valor inteiro para P que satisfaz ambas as condies de
acordo com a Tabela 22 do UM10139 Volume 1: LPC214x User Manual
P = 2. Logo, de acordo com a Tabela 22, o valor 1 dever ser escrito em
PLLCFG[6:5].

1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 16

Operadores Lgicos Bit a Bit



Os operadores lgicos Bit a Bit so muito teis na configurao de
registradores.
A linguagem de programao C possui operadores que realizam
operaes lgicas "bit a bit" em nmeros do tipo inteiro. Uma operao bit a bit
pode ser utilizada para testar, atribuir, ou deslocar bits. No entanto, as
operaes bit a bit no podem ser usadas em float, double, long double, void
ou outros tipos mais complexos.
A Tabela 01 mostra os operadores lgicos bit a bit da linguagem de
programao C.
Tabela01OperadoresLgicosBitaBit.
Operador Ao
& E (AND)
| OU (OR)
^ XOR (OU Exclusivo)
~ NO (NOT)
>> Deslocamento de bits direita
>> Deslocamento de bits esquerda

Para que apenas um BIT seja forado a assumir nvel lgico alto ( 1 ), em
um determinado registrador, necessrio utilizar o operador lgico OU e uma
mscara que possua apenas o bit desejado em nvel lgico alto ( 1 ).
A Figura 6 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 0 0 0 0 0 0 1 1 1 1 0 1 1 0
Operador OU ou ou ou ou ou ou ou ou ou ou ou ou ou ou ou ou
Mscara: 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
Registrador_X: 1 0 0 0 0 1 0 0 1 1 1 1 0 1 1 0
Figura 6 Operador Lgico OU

Na linguagem C esta operao pode ser realizada da seguinte maneira:
uint16_t Registrador_X = 0b1000000011110110; // cria uma varivel de 16 bits chamada
Registrador_X e a inicializa com o nmero do tipo binrio 0b1000000011110110
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 OU 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 17

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

O display utilizado no circuito da Figura 05 do tipo anodo comum e


possui a configurao interna mostrada na Figura 06 (b).
Os pinos do microcontrolador que acionam os segmentos esto ligados
aos segmentos de acordo com as informaes apresentadas na Tabela 01,
coluna intitulada Pino Ex.01.

a
b
f
g
c
e
d
Anodo
Comum
(a) (b)
Figura 10 (a) Display de 7 seguimentos catodo comum (b) display de 7 seguimentos
anodo comum.

Tabela 01 Pinos e Segmentos
Pino Ex.01 Pino Ex. 02 Segmento
P1.25 P1.18 a
P1.26 P1.19 b
P1.27 P1.20 c
P1.28 P1.21 d
P1.29 P1.22 e
P1.30 P1.23 f
P1.31 P1.24 g


Exerccio Proposto

Exerccio 01: Crie um programa para acionar dois displays de 7 segmentos,
conforme mostrado na Figura 07. Toda vez que um push botton for
pressionado, o display ser incrementado de uma unidade. Faa os displays
contarem de 0 a 15 e aps exibir o nmero 15, na prxima vez que o boto for
pressionado, o display dever exibir o nmero 0.
Os pinos do microcontrolador esto ligados aos segmentos especificados
na Tabela 01.

1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 20

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)

Figura 11 Display de 7 Segmentos de dezena e unidade.



Nmeros mgicos em programao

Em programao o termo nmero mgico dado para nmeros que
aparecem no cdigo, geralmente sem explicao. So chamados de mgicos
por ironia; o seu uso no considerado uma boa prtica de programao.
A maior parte das linguagens de programao permite que criem nomes
descritivos para representar estes nmeros. Estes nomes so chamados
constantes. Seu uso facilita a leitura e a manuteno do cdigo. O uso de
constantes prefervel ao de nmeros mgicos.
Exemplo: Suponha que um programa de clculo trigonomtrico faa uso do
nmero em diversos lugares. A princpio o programador usou a aproximao
3.14 e a colocou numericamente em todos os lugares que ela era necessria.
O nmero 3.14 a princpio facilmente reconhecvel como por qualquer
pessoa com algum conhecimento de matemtica. Porm nos testes o
programador descobriu que precisaria de uma aproximao melhor, como
3.1415926. Agora ele tem que procurar todas as ocorrncias de 3.14 no
programa e substitu-la pela nova aproximao. Este procedimento
trabalhoso e sujeito a erros. Se o programador tivesse usado uma constante
com o nome PI, em vez do nmero mgico 3.14, bastaria mudar a aproximao
na definio da constante (URL 6).
Isto posto, para evitar a presena de nmeros mgicos no programa do
exemplo anterior, a diretiva #define pode ser utilizada para especificar o
segmento do display que est sendo acionado por um determinado pino do
microcontrolador, como mostrado a seguir:
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 22

Programa com #define:


#include " LPC214x. h"
#include " cpu_i ni t . h"

/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/ * DEFI NI TI ONS AND MACROS */
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#define seg_a ( 1<<25) / / Pi no 25 do PORT1
#define seg_b ( 1<<26) / / Pi no 26 do PORT1
#define seg_c ( 1<<27) / / Pi no 27 do PORT1
#define seg_d ( 1<<28) / / Pi no 28 do PORT1
#define seg_e ( 1<<29) / / Pi no 29 do PORT1
#define seg_f ( 1<<30) / / Pi no 30 do PORT1
#define seg_g ( 1<<31) / / Pi no 31 do PORT1

#define but t on ( 1<<15) / / Bot o

/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/ * FUNCTI ON I MPLEMENTATI ON */
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

int main ( void) / / Pr i mei r a f uno a ser execut ada, t odo pr ogr ama deve possui r uma.

{
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 ( - 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; / / 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 = seg_a| seg_b| seg_c| seg_d| seg_e| seg_f ; / / N vel al t o nos pi nos P1. 25 a P1. 30

while( 1) {

if ( ! ( I OPI N0 & but t on) ) / / 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

switch ( i ) / / Conver sor Deci mal par a 7 Segment os
{
case 0: I OSET1 = seg_a| seg_b| seg_c| seg_d| seg_e| seg_f ; break; / / 0 no di spl ay
case 1: I OSET1 = seg_b| seg_c; break; / / 1 no di spl ay
case 2: I OSET1 = seg_a| seg_b| seg_d| seg_e| seg_g; break; / / 2 no di spl ay
case 3: I OSET1 = seg_a| seg_b| seg_c| seg_d| seg_g; break; / / 3 no di spl ay
case 4: I OSET1 = seg_b| seg_c| seg_f | seg_g; break; / / 4 no di spl ay
case 5: I OSET1 = seg_a| seg_c| seg_d| seg_f | seg_g; break; / / 5 no di spl ay
case 6: I OSET1 = seg_a| seg_c| seg_d| seg_f | seg_e| seg_g; break; / / 6 no di spl ay
case 7: I OSET1 = seg_a| seg_b| seg_c; break; / / 7 no di spl ay
case 8: I OSET1 = seg_a| seg_b| seg_c| seg_d| seg_e| seg_f | seg_g; break; / / 8
case 9: I OSET1 = seg_a| seg_b| seg_c| seg_f | seg_g; break; / / 9 no di spl ay
default: I OSET1 = seg_a| seg_b| seg_c| seg_d| seg_e| seg_f ; / / 0 no di spl ay
}

while ( ! ( I OPI N0 & but t on) ) ; / / Esper a enquant o o Bot o est i ver pr essi nado

i ++; / / I ncr ement a i

if ( i >= 10) {
i = 0;
}
}
}
return( 0) ;
}
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/ * EOF */
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 23

Exerccio Resolvido 01: Crie um programa para acionar dois displays de 7


segmentos, conforme mostrado na Figura 08. Toda vez que um push botton for
pressionado, o display ser incrementado de uma unidade. Faa os displays
contarem de 0 a 15 e aps exibir o nmero 15, na prxima vez que o boto for
pressionado, o display dever exibir o nmero 0. Observe que o segmento (a)
de ambos os displays so acionados pelo mesmo pino do microcontrolador. O
mesmo ocorre com os segmentos (b), (c), (d), (e), (f) e (g) de ambos os
displays, como especificado na Tabela 02.
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
R2
2k2
3
.3
V
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
Q1
BC337
R3
2.2k
Q2
BC337
R4
2.2k

Figura 12 Display de 7 Segmentos de dezena e unidade.

Tabela 02 Segmentos de dois displays diferentes acionados pelo mesmo pino do


microcontrolador.
Pino
Segmento
dos
Displays
P1.18 A
P1.19 B
P1.20 C
P1.21 D
P1.22 E
P1.23 F
P1.24 G
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 24

Resoluo: Para que o observador tenha a impresso que os nmeros,


exibidos em ambos os displays, estejam sendo mostrados simultaneamente,
necessrio que os displays sejam acionados alternadamente em uma
frequncia maior ou igual a 24 vezes por segundo cada um.
Em 1826 o mdico e fillogo ingls Peter Mark Roget publicou um estudo
informando que o olho humano retm a imagem que se forma na retina por
alguns dcimos de segundo a mais (aproximadamente 1/24 de segundo),
mesmo aps o claro que a provocou haver desaparecido. Portanto, como a
imagem na retina persiste no intervalo de tempo compreendido entre duas
imagens sucessivas, o nmero em um determinado display dever ser
mostrado no exato instante em que o nmero exibido anteriormente estiver
desaparecendo de nossa "memria visual", o que ir produzir a sensao de
que o nmero est sendo exibido continuamente.
OBS1: Em softwares de simulao como o PROTEUS, por exemplo, a
sensao de que o nmero est sendo exibido continuamente pode no ser
obtida.
OBS2: Observe que os displays so do tipo catodo comum e o buffer 74HCT04
que aciona cada segmento inversor, logo, os segmentos sero ligados
quando os pinos do microcontrolador estiverem em nvel lgico baixo.
O arquivo intitulado Exerccio Resolvido01.txt, localizado em
...\Aulas\Display_7Seg01\Exerccio Resolvido01\Programas, contm o
programa do Exerccio Resolvido01 digitado.

Programa do Exerccio Resolvido 01
#include " LPC214x. h"
#include " cpu_i ni t . h"
#include " st di nt . h"

/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/ * DEFI NI TI ONS AND MACROS */
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#define seg_a ( 1<<18) / / Segment o a do di spl ay
#define seg_b ( 1<<19) / / Segment o a do di spl ay
#define seg_c ( 1<<20) / / Segment o a do di spl ay
#define seg_d ( 1<<21) / / Segment o a do di spl ay
#define seg_e ( 1<<22) / / Segment o a do di spl ay
#define seg_f ( 1<<23) / / Segment o a do di spl ay
#define seg_g ( 1<<24) / / Segment o a do di spl ay

#define t r an_dez ( 1<<25) / / Tr ansi st or da Uni dade
#define t r an_uni ( 1<<26) / / Tr ansi st or da Dezena
#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( int i ) {

switch ( i )
{
case 0: I OCLR1 = seg_a| seg_b| seg_c| seg_d| seg_e| seg_f ; break; / / 0 no di spl ay
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 25

case 1: I OCLR1 = seg_b| seg_c; break; / / 1 no di spl ay


case 2: I OCLR1 = seg_a| seg_b| seg_d| seg_e| seg_g; break; / / 2 no di spl ay
case 3: I OCLR1 = seg_a| seg_b| seg_c| seg_d| seg_g; break; / / 3 no di spl ay
case 4: I OCLR1 = seg_b| seg_c| seg_f | seg_g; break; / / 4 no di spl ay
case 5: I OCLR1 = seg_a| seg_c| seg_d| seg_f | seg_g; break; / / 5 no di spl ay
case 6: I OCLR1 = seg_a| seg_c| seg_d| seg_f | seg_e| seg_g; break; / / 6 no di spl ay
case 7: I OCLR1 = seg_a| seg_b| seg_c; break; / / 7 no di spl ay
case 8: I OCLR1 = seg_a| seg_b| seg_c| seg_d| seg_e| seg_f | seg_g; break; / / 8 no di spl ay
case 9: I OCLR1 = seg_a| seg_b| seg_c| seg_f | seg_g; break; / / 9 no di spl ay
default: I OCLR1 = seg_a| seg_b| seg_c| seg_f | seg_g; / / 0 no di spl ay
}
}

/ / - - - 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
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) ;
}




Implementando a rotina Decimal_to_7Segment( ) usando tabela:
#include " LPC214x. h"
#include " cpu_i ni t . h"
#include " st di nt . h"

1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 26

/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/ * 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

aparecer nesta linha e comandos do pr-processador no podem estar


separados em diversas linhas).
O uso do pr-processador recomendvel no sentido de elevar a
portabilidade do cdigo e facilitar a compreenso do mesmo.
Ademais, a utilizao de compiladores, RTOS e bibliotecas que possuem
cdigos abertos consistem em boa prtica no desenvolvimento de sistemas
embarcados.
Toda vez que se acrescenta em um projeto bibliotecas com cdigo
fechado, haver o risco da m operao do cdigo fechado que no poder ser
solucionado sem o auxlio do fornecedor. Alm disso, existe o risco da
repentina descontinuidade do fornecedor/suporte das bibliotecas utilizadas.
Tipos Primitivos em C

As variveis numricas em C possuem duas categorias: tipo inteiro ( int ) e
ponto flutuante ( float ).
O hardware que realiza a aritmtica de ponto flutuante mais complexo e,
consequentemente, mais caro do que o hardware utilizado em operaes
aritmticas com nmeros inteiros. Assim, para se reduzir custos de produo
em larga escala, a maior parte dos microcontroladores no possuem
hardware dedicado para executar operaes matemticas de dados
representados em ponto flutuante. Por isso, em sistemas embarcados, evita-se
o uso de variveis do tipo ponto flutuante.
Porm, cada processador possui um
tamanho de palavra definido pelas
caractersticas intrnsecas de hardware.
Deste modo, existe uma expectativa que
os compiladores C implementariam o tipo
int correspondente ao tamanho da palavra
definida pelo hardware, permitindo aos
programadores utilizarem o inteiro (int)
com o mximo de eficincia.
Considerando que existem microcontroladores de 8, 16 e 32 bits e que o
compilador C utilizado ir implementar o inteiro de acordo com as
caractersticas de hardware, o valor mnimo e mximo do inteiro ir mudar de
acordo com a arquitetura do microcontrolador utilizado. Ao se migrar de um
microcontrolador de 16 bits para um de 8 ocorreria uma reduo drstica nos
valores de mximos e mnimos do tipo inteiro e de todos os tipos primitivos
definidos na linguagem C. Portanto, a portabilidade do cdigo fica prejudicada
exigindo do programador alteraes no cdigo para que se adque a nova
arquitetura.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 31

Com o objetivo de minimizar este problema, a biblioteca stdint.h foi criada.


Ela define o tamanho exato do tipo primitivo de acordo com a norma C99
Standart Data Types criado pela comunidade ANSI/ISSO.
Portanto, em se tratando de programao para microcontroladores, devido
as diferentes arquiteturas existentes, uma boa prtica de programao se
utilizar o C99 Standart Data Types criado pela comunidade ANSI/ISO que
define o tamanho exato do tipo primitivo.
A Tabela 06 mostra os valores de mnimo e mximo do tipo inteiro (int) e
inteiro sem sinal (unsigned int) para arquiteturas de 8, 16 e 32 bit.

Tabela 06 Tipo inteiro de 8, 16 e 32bit
MICROCONTROLADORES 8, 16 e 32 bit
Arquitetura Tipo n

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

Alm disso, vale salientar que a operao de leitura/escrita de um inteiro


de 16 bit em uma arquitetura de 8 bit uma operao no atmica, portanto, o
trecho da atualizao dever ser protegido.

Exerccio Resolvido 02: Quando se deseja acionar um ou mais displays de 7
segmentos utilizando-se um nmero reduzido de pinos de um determinado
microcontrolador, utiliza-se shift register para acionar os segmentos do display,
como mostrado na Figura 09.
Sabendo que o pino P1.30 do microcontrolador est conectado ao clock
do shift register e o pino P1.31 do microcontrolador conectado ao pino de
dados do shift register, crie um programa para acionar um display de 7
segmentos, conforme mostrado na Figura 09. Toda vez que um push botton for
pressionado, o display ser incrementado de uma unidade. Faa o display
contar de 0 a 9 e aps exibir o nmero 9, na prxima vez que o boto for
pressionado, o display dever exibir o nmero 0.
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
R2
2k2
3
.
3
V
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

Figura 16 Acionamento de display de 7 Segmentos com shift register.


Tabela 03 Conexo dos pinos do shift register 74HCT164 com os segmentos do display
Pino do Shift
Register
Pino do Shift
Register
Segmento do
Display
3 Q0
4 Q1 A
5 Q2 B
6 Q3 C
10 Q4 D
11 Q5 E
12 Q6 F
13 Q7 G
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 34

Resoluo: A Tabela 04 mostra a operao do circuito integrado 74HCT164.


De acordo com esta tabela, o pino
____
MR deve permanecer em nvel lgico alto
para que o shift register opere normalmente. Nesta situao, quando os pinos
DSA e DSB assumirem nvel lgico alto e ocorrer uma borda de subida de
clock, todos os bits do shift register sero deslocados
( 0 1 2 3 4 5 6 7 Q Q Q Q Q Q Q Q ) e Q0 assumir nvel lgico
alto. Por outro lado, quando DSA e DSB estiverem em nvel lgico baixo e
ocorrer uma borda de subida de clock, todos os bits do shift register sero
deslocados ( 0 1 2 3 4 5 6 7 Q Q Q Q Q Q Q Q ) e Q0 assumir
nvel lgico baixo.

Tabela 04 Tabela de operao do circuito integrado 74HCT164

De acordo com a Figura 09, um segmento do display somente ligado


quando o pino utilizado para acion-lo assumir nvel lgico baixo. Deste modo,
os nveis de tenso em cada pino do shift register para que o display mostre os
nmeros decimais de 0 a 9 so apresentados na Tabela 05.
Tabela 05 Tenso em cada pino do shift register para que o dispay mostre
os nmeros decimais de 0 a 9
DECIMAL
Pinos do Shift Register 74HCT164
3 4 5 6 10 11 12 13
Segmentos
( NC ) ( a ) ( b ) ( c ) ( d ) ( e ) ( f ) ( g )
0 X 0 0 0 0 0 0 1
1 X 1 0 0 1 1 1 1
2 X 0 0 1 0 0 1 0
3 X 0 0 0 0 1 1 0
4 X 1 0 0 1 1 0 0
5 X 0 1 0 0 1 0 0
6 X 1 1 0 0 0 0 0
7 X 0 0 0 1 1 1 1
8 X 0 0 0 0 0 0 0
9 X 0 0 0 0 1 0 0
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 35

Programa do Exerccio Resolvido 02


#include " LPC214x. h"
#include " cpu_i ni t . h"
#include <st di nt . h>

#define cl k ( 1<<30) / / Cl ock ut i l i zado no shi f t r egi st er
#define dat a ( 1<<31) / / Dados envi ados par a o shi f t r egi st er
#define but t on ( 1<<15) / / Def i ne o pi no do bot o

/ / - - - Rot i na que Ser i al i za umNmer o Deci mal par a o Di spl ay - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Ser i al i ze_t o_Di spl ay( ui nt 8_t i ) {

ui nt 8_t num= 0;
ui nt 8_t j = 0;

switch ( i )
{
case 0: num= 0b00000001; break; / / Escr eve 0 no di spl ay
case 1: num= 0b01001111; break; / / Escr eve 1 no di spl ay
case 2: num= 0b00010010; break; / / Escr eve 2 no di spl ay
case 3: num= 0b00000110; break; / / Escr eve 3 no di spl ay
case 4: num= 0b01001100; break; / / Escr eve 4 no di spl ay
case 5: num= 0b00100100; break; / / Escr eve 5 no di spl ay
case 6: num= 0b01100000; break; / / Escr eve 6 no di spl ay
case 7: num= 0b00001111; break; / / Escr eve 7 no di spl ay
case 8: num= 0b00000000; break; / / Escr eve 8 no di spl ay
case 9: num= 0b00000100; break; / / Escr eve 9 no di spl ay
default: num= 0b00000001; / / Escr eve 0 no di spl ay
}


for ( j = 0; j <= 7; j ++ ) {
if ( num& 1) {
I OSET1 = dat a; / / Pi no de dados emn vel al t o
I OCLR1 = cl k; / / Pi no de cl ock emn vel bai xo
I OSET1 = cl k; / / Pi no de cl ock emn vel al t o
}
else{
I OCLR1 = dat a; / / Pi no de dados emn vel bai xo
I OCLR1 = cl k; / / Pi no de cl ock emn vel bai xo
I OSET1 = cl k; / / Pi no de cl ock emn vel al t o
}
num= num>> 1;
}
}

/ / - - - 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

ui nt 8_t cont = 0; / / Decl ar a umi nt ei r o de 32bi t

PI NSEL1 | = 0x00000000; / / Conf i gur a t odos os pi nos como ent r ada/ sa da ( I / O)

I ODI R1 | = cl k| dat a; / / Conf i gur a os pi nos de cl k e dat a como sa da


while( 1) {

if ( ! ( I OPI N0 & but t on) ) / / Ver i f i ca se o Bot o f oi pr essi onado
{
while ( ! ( I OPI N0 & but t on) ) ; / / Esper a enquant o o Bot o est i ver pr essi nado

Ser i al i ze_t o_Di spl ay( cont ) ;

cont ++; / / I ncr ement a a var i vel cont

if ( cont >= 10) {
cont = 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 36

O arquivo intitulado Exerccio Resolvido02.txt, localizado em


...\Aulas\Display_7Seg01\Exerccio Resolvido02\Programas, contm o
programa do Exerccio Resolvido02 digitado.

Exerccio Proposto

Exerccio 02: Crie um programa para acionar trs displays de 7 segmentos,
conforme mostrado na Figura 10. Considerando que o push botton conectado
no pino P0.15 incrementa a unidade, o que est conectado ao pino P0.8
incrementa a dezena e o que est ligado ao pino P0.0 a centena, toda vez que
um push botton for pressionado, o display correspondente a unidade, dezena
ou centena ser incrementado de uma unidade. Faa os displays contarem de
0 a 9 e aps exibirem o nmero 9, na prxima vez que o boto correspondente
for pressionado, o display dever exibir o nmero 0.
Os nveis de tenso em cada pino do shift register para que o display
mostre os nmeros decimais de 0 a 9 so apresentados na Tabela 05.
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
R2
2k2
3
.3
V
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)
R24
2k2
3
.3
V
R25
2k2
3
.3
V

Figura 17 Acionamento de trs displays de 7 segmentos com shift register.


Exerccio 03: Comente sobre as vantagens e desvantagens de se utilizar o
circuito exibido na Figura 10.






1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 37

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

if ( ! ( I OPI N1 & COLUNA_3) ) {


i = 6;
while ( ! ( I OPI N1 & COLUNA_3) ) { asm volatile ( " NOP" ) ; } / / Aguar da sol t ar bot o
}
I OSET1 | = LI NHA_B; / / N vel al t o na Li nha B
I OCLR1 | = LI NHA_C; / / N vel bai xo na Li nha C
if ( ! ( I OPI N1 & COLUNA_1) ) {
i = 1;
while ( ! ( I OPI N1 & COLUNA_1) ) ; / / Aguar da sol t ar bot o
}
if ( ! ( I OPI N1 & COLUNA_2) ) {
i = 2;
while ( ! ( I OPI N1 & COLUNA_2) ) ; / / Aguar da sol t ar bot o
}
if ( ! ( I OPI N1 & COLUNA_3) ) {
i = 3;
while ( ! ( I OPI N1 & COLUNA_3) ) ; / / Aguar da sol t ar bot o
}
I OSET1 | = LI NHA_C; / / N vel bai xo na Li nha A
I OCLR1 | = LI NHA_D; / / N vel bai xo na Li nha A
if ( ! ( I OPI N1 & COLUNA_2) ) {
i = 0;
while ( ! ( I OPI N1 & COLUNA_2) ) ; / / Aguar da sol t ar bot o
}
I OSET1 | = LI NHA_D; / / N vel al t o na Li nha D

return( 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

PI NSEL0 | = 0x00000000; / / Conf i gur a PORT0 como ent r ada/ sa da ( I / O) .
PI NSEL1 | = 0x00000000; / / Conf i gur a PORT0 como ent r ada/ sa da ( I / O) .

I ODI R0 | = seg_a| seg_b| seg_c| seg_d| seg_e| seg_f | seg_g; / / Conf i gur a os pi nos que
aci onamos segment os como sa da
I ODI R1 | = LI NHA_A| LI NHA_B| LI NHA_C| LI NHA_D; / / Conf i gur a os pi nos que aci onamas
l i nhas como sa da

I OCLR0 | = 0xFFFFFFFF; / / For a t odos os pi nos do PORT0 par a n vel bai xo
I OSET0 | = seg_g; / / Li ga o segment o g

ui nt 8_t k = 10; / / Cr i a uma var i vel de 8bi t semsi nal ( 0 a 255)

while( 1) {
k = Var r e_Tecl ado( ) ; / / Var r e o t ecl ado
if ( k ! = 10) {
Deci mal _t o_7Segment ( k) ;
}
}
return( 0) ;
}


Exerccio Proposto

Exerccio 01: Crie um programa para varrer o teclado e acionar trs displays
de 7 segmentos, conforme mostrado na Figura 12. Quando uma tecla for
pressionada, o nmero, correspondente a tecla pressionada, dever ser exibido
no display da unidade e o nmero que estava sendo exibido na unidade dever
ser deslocado para o display da dezena. Do mesmo modo, o nmero que
estava sendo exibido no display da dezena dever ser deslocado para o
display da centena.

1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 40


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

As mscaras LCD_DATA_MASK, LCD_CONTROL_MASK e LUZ foram


definidas no trecho de cdigo DEFINITIONS AND MACROS, como
apresentado a seguir:

/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/ * DEFI NI TI ONS AND MACROS */
/ *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

#define E ( 1<<28) / / ! < Pi no que l i ga/ desl i ga o LCD, conect ado no pi no P0. 20 do LPC2148
#define RS ( 1<<22) / / ! < I nf or ma ao LCD se a i nf or mao umcomando ou dado, conect ado
no pi no P0. 22 do LPC2148
#define RW( 1<<29) / / ! < Pi no que i nf or ma se a oper ao de l ei t ur a ou escr i t a,
conect ado no pi no P0. 29 do LPC2148 ( 0 = wr i t e t o LCD modul e, 1 = r ead f r omLCD modul e)
#define busyf l ag ( 1<<13) / / ! < Ver i f i ca se o LCD est ocupado, i st o pr ont o par a r eceber
o pr xi mo comando.

#define DB4 ( 1<<10) / / ! < Pi no de dado DB4 ( LSB) , conect ado ao pi no P0. 10 do LPC2148
#define DB5 ( 1<<11) / / ! < Pi no de dado DB5, conect ado ao pi no P0. 11 do LPC2148
#define DB6 ( 1<<12) / / ! < Pi no de dado DB6, conect ado ao pi no P0. 12 do LPC2148
#define DB7 ( 1<<13) / / ! < Pi no de dado DB4 ( MSB) , conect ado ao pi no P0. 13 do LPC2148
#define LUZ ( 1<<21) / / ! < Li ga/ desl i ga a backl i ght do LCD, conect ado no pi no P0. 21 do
LPC2148

#define LCD_DATA_MASK ( DB4 | DB5 | DB6 | DB7)
#define LCD_CONTROL_MASK ( E | RW| RS)


Exerccio Proposto

Exerccio 01: Faa um programa para somar, subtrair, multiplicar ou dividir
dois nmeros decimais de apenas um dgito cada. O diagrama esquemtico
que dever ser utilizado mostrado na Figura 16.

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
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
1 2 3
6 5 4
8 9 7
++
0 =
A
B
C
D
124 3
D2
D3
D4
D5
R12
10k
R13
10k
R14
10k
R15
10k
3.3V

Figura 21 Teclado e display.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 44

Interface de Comunicao SPI



O SPI uma interface de comunicao sncrona que opera no modo full-
duplex. Esta interface composta por 4 sinais, como descriminado abaixo:
Sinais de dados: MOSI (Master data Output, Slave data Input) e MISO
(Master data Input, Slave data Output) so responsveis pela
transferncia de dados entre o master e o slave;
Sinais de controle: SCLK (Serial Clock) e /SS (Slave Select).
Em modo escravo, o microcontrolador comporta-se como um
componente da rede, recebendo o sinal de relgio. Em modo mestre, o
microcontrolador gera um sinal de relgio e deve ter um pino de I/O para
habilitao de cada perifrico.
A interface SPI muito utilizada em conversor digital analgico, relgio de
tempo real, DIGIPOTs, mmorias flash, cartes SD/MMC, dentre outros
circuitos integrados.
A Figura 17 mostra o diagrama esquemtico da ligao entre dois
dispositivos que utilizam a interface de comunicao SPI e a Figura 18 exibe o
diagrama esquemtico de um dispositivo mestre comunicando com trs
escravos. Os pinos SS1, SS2 e SS3 so utilizados para selecionar o dispositivo
escravo que se deseja comunicar.

Master
Slave
SCLK
MOSI
MISO
SCLK

Figura 22 - Comunicao entre o dispositivo mestre (mster) e o escravo (slave)
utilizando o protocolo SPI.
SPI Master
Slave 01
SCLK
MOSI
MISO
Slave 02
Slave 03
SS
SCLK
MOSI
MISO
SS
SCLK
MOSI
MISO
SS
SCLK
MOSI
MISO
SS
1
SS2
SS3

Figura 23 - Comunicao entre um dispositivo mestre e trs escravos utilizando a
interface de comunicao SPI.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 45

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

A Figura 24 ( a ) mostra o cdigo assembly, correspondente a atualizao


da varivel NoAtomicOperation de 32 bit, realizada em um microcontrolador
PIC, modelo 16F877A, que possui arquitetura de 8 bit.

Figura 24 - Atualizao da varivel NoAtomicOperation de 32 bit.
A primeira instruo move o valor 0xAB para o registrador de trabalho W e
a segunda armazena o valor no endereo de memria 0x29
A terceira instruo move o valor 0xCD para o registrador de trabalho W e
a quarta armazena o valor no endereo de memria 0x28.
A quinta instruo move o valor 0xEF para o registrador de trabalho W e a
sexta armazena o valor no endereo de memria 0x27.
E, por fim, a stima instruo move o valor 0x01 para o registrador de
trabalho W e a oitava armazena o valor no endereo de memria 0x26.
Portando, 8 instrues foram necessrias para atualizar o valor da varivel
NoATomicOperation, o que caracteriza esta operao como sendo no
atmica.
Por outro lado, a Figura 22 (b) exibe o cdigo assembly correspondente a
atualizao da varivel AtomicOperation de 32 bit, realizada em um uC ARM,
modelo LPC2148, que possui arquitetura de 32 bit.
A primeira instruo carrega o valor ABCDEF01 do endereo de memria
flash 340 no registrador r3 e a segunda instruo move o valor do registrador r3
para a posio de memria indicada pelo ponteiro de pilha sp.
Apenas uma instruo (str) foi necessria para atualizar a varivel, o que
caracteriza esta operao como sendo atmica.

Exemplo 02: As informaes em um protocolo MODBUS RTU so
transmitidas em frames que possuem um campo de endereo, um campo com
a funo a ser executada, um campo de dados e, por fim, o do CRC.
Entre os frames acrescentado um silncio na linha maior ou igual a 3,5
vezes o tempo de transmisso de um caractere utilizado para indicar o fim ou
incio de um frame.
Este exemplo analisa uma operao no atmica de uma varivel
conhecida como tick conter, utilizada na temporizao time out dos frames
em um protocolo MODBUS.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 47


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

Neste instante, ocorre uma interrupo que atualiza o valor da varivel


TickCounter fazendo que o valor seja atualizado para 0x00010000. Retornando
da interrupo a atualizao da varivel TempoAtual prossegue.
A prxima instruo assembly MOVF 27, W move o valor do segundo byte
menos significativo da varivel TickCounter para o registrador de trabalho e a
instruo MOVWF 2F move o valor do registrador de trabalho W para a posio
de memria do segundo byte menos significativo da varivel TempoAtual.
A prxima instruo assembly MOVF 26, W move o valor do byte menos
significativo da varivel TickCounter para o registrador de trabalho e a instruo
MOVWF 2E move o valor do registrador de trabalho W para a posio de
memria do byte menos significativo da varivel TempoAtual.
O valor esperado para a varivel TempoAtual 0x0000FFFF, contudo, foi
atualizada com o valor 0x00000000. Aps o calculo do tempo decorrido o valor
obtido 0xFFFFFF55 sendo que o valor esperado 0x000000AB. O valor
0xFFFFFF55 indica um fim de frame enquanto o valor correto 0x0000FF54
indica que ele ainda no terminou.


Figura 26 - Operao no atmica de uma varivel conhecida como tick conter,
utilizada na temporizao time out dos frames em um protocolo MODBUS.
A Figura 27 apresenta a mesma situao realizada em um C de 32 bit.
Supondo que a varivel TickCounter do tipo uint32_t, toda vez que a
interrupo do timer ocorrer o valor da varivel TickCounter ser incrementada.

1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 49

No exemplo mostrado na Figura 27, 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 ldr r3, [sp]
carrega o valor da varivel TickCounter no registrador r3.
Neste instante, ocorre uma interrupo que atualiza o valor da varivel
TickCounter, fazendo com que o valor seja atualizado para 0x00010000 e,
aps o retorno da interrupo, a atualizao da varivel TempoAtual prossegue
com a instruo assembly str r3,[sp, #4] que move o valor do registrador r3
para a posio de memria da varivel TempoAtual.
Neste exemplo, o valor da varivel foi atualizada com apenas uma
instruo (str), o que caracteriza uma operao atmica.
O valor esperado para a varivel TempoAtual era 0x0000FFFF e foi
atualizado com esse valor.
Aps o calculo do tempo decorrido, o valor obtido 0x0000FF54 que
corresponde ao valor esperado.


Figura 27 - Operao atmica de uma varivel conhecida como tick conter, utilizada na
temporizao time out dos frames em um protocolo MODBUS.

1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 50

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

Neste exemplo, o endereo de Uma Palavra deve possuir o final 0, 4, 8 ou


C. Isto , deve ser mltiplo de 4 bytes. Consequentemente, o endereo de
uma Meia Palavra deve terminar com 0, 2, 4, 6, 8, A, C ou E. Isto , deve ser
mltiplo de 2 bytes. Por fim, o endereo de Byte pode assumir qualquer
valor.

Figura 29 Uma Palavra, Meia Palavra e Um Byte.
A Figura 30 mostra no diagrama esquemtico da memria de um ARM o
alinhamento do tipo inteiro.
A varivel Alinhado1 do tipo inteiro sem sinal de 32 bit, foi inicializada e
declarada com o valor 0xABCEDF01, est representada em verde no diagrama
de memria e possui endereo com final 8, o que indica que est alinhada.
O ARM7 little endian, por isso, o byte menos significativo da varivel
est alocado nos endereos menos significativo da memria.
As variveis Alinhado2 e 3 so do tipo inteiro sem sinal de 16 bit, foram
declaradas e inicializadas com os valores 0x2345 e 0x6789, respectivamente.
Elas esto representadas em amarelo no diagrama da memria, possuem o
endereo com final 4 e 6 (valores mltiplo de 2), o que indica que esto
alinhadas.
As variveis Alinhado 5, 6, 7 e 8 so do tipo inteiro sem sinal de 8 bit,
foram declaradas e inicializadas com os valores 0x12, 0x34, 0x56, 0x78 e
0x9A, respectivamente, esto representadas em laranja e o endereo delas
pode assumir qualquer valor.
As variveis foram declaradas e inicializadas na seguinte ordem: primeiro a
varivel de 32bit, depois as duas de 16 bit e, por fim, as 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 52


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.

Figura 31 Exemplo de Structure Padding .


1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 53

Neste exemplo, para alinhar a memria, o compilador acrescentou bytes


sem propsito de modo a manter o endereo das variveis de 16 bit mltiplos
de 2, esse processo conhecido como structure padding.
Nota-se que o compilador no utilizou a memria de modo eficiente, pois
poderia ter alocado duas variveis de 8 bit nos endereos com final 452 e 456.
A Figura 32 mostra um exemplo de variveis desalinhadas na memria. A
varivel do tipo inteiro de 32 bit encontra-se desalinhada, pois possui endereo
com final D que no um mltiplo de 4. O mesmo est ocorrendo com as
variveis de 16 bit, pois possuem endereo com final 1 e 7, que no so
mltiplos 2.
A escrita e acesso desalinhado de memria geram operaes no
atmicas que diminuem o desempenho da CPU e reduzem o espao de
memria de programa. Este tipo de operao de acesso e escrita de memria
podem ocasionar o travamento ou interrupo da CPU se no for tratado
corretamente.


Figura 32 Exemplo de variveis desalinhadas na memria.

O exemplo a seguir mostra como o Padding pode afetar a comunicao
MODBUS.
Exemplo: Uma rede MODBUS composta por um dispositivo Mestre, um meio
fsico e um ou mais escravos. A Figura 33 mostra uma rede composta por um
Mestre (CLP), um escreva (o adaptador) e um meio fsico RS485.

Figura 33 Rede MODBUS.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 54


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.

Figura 35 Exemplo de Requisio e Resposta de Frame MODBUS.


Observa-se que o frame MODBUS estruturado em vrios campos, e,
portanto, poderia ser implementado na forma de estrutura na Linguagem de
Programao C.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 55

A estrutura facilitaria a manipulao dos campos, a compreenso do


cdigo e a serializao do frame. Para se serializar o frame, bastaria fornecer
para a rotina de serializao o endereo do primeiro elemento da estrutura,
enviar para a serial o primeiro byte, incrementar o endereo, enviar para a
porta serial o segundo elemento e assim sucessivamente at o ltimo byte do
frame.
Neste exemplo, o valor do registrador, no campo de dados da resposta,
no pode ser estimado porque depende do valor do nvel de tenso na entrada
do A/D, da resoluo do A/D e da tenso de referncia no A/D.
O cdigo C que implementa a estrutura do frame, de acordo com a Figura
36, pode ser dividido em:

1) Estrutura do cabealho, contendo o endereo do escravo e o
function code;
2) Estrutura do function code que l registradores: de acordo com
especificaes MODBUS, a estrutura do function code para que o
Mestre solicite a leitura de registradores para o Escravo composta
pelo endereo do primeiro registrador a ser lido seguido do nmero
de registradores a serem lidos. Por outro lado, a estrutura do
function code para que o Escravo responda solicitao de leitura
do Mestre composta pelo nmero de registradores lidos seguido
dos valores dos registradores lidos;
3) Declarao da estrutura do Frame MODBUS com acrscimo do
campo CRC.


Figura 36 Exemplo de Requisio e Resposta de Frame MODBUS.
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 56

Por fim, a funo utilizada na serializao do frame recebe como


parmetro o endereo do frame e o tamanho dele e envia os bytes para a porta
serial.
A Figura 37 mostra o trecho da memria de um microcontrolador LPC2148
utilizado para armazenar os valores de um frame MODBUS.
Em roxo, no endereo com final 658 est o endereo do escravo. Em
verde, no endereo com final 659 est o function code. Em amarelo, no
endereo com final 65C est o endereo do primeiro registrador a ser lido.
Novamente, em amarelo, no endereo com final 65E est o nmero de
registradores. Em ciano, no endereo com final 660 est armazenado o CRC.
Em vermelho, dentro da estrutura, temos um elemento estranho. O famoso
PADDING , cujo valor no pode ser previsto, porque um valor qualquer
presente na memria.
Conforme j comentado anteriormente, o PADDING ocorre porque a
maior parte dos processadores prefere, ou at mesmo necessita, que o acesso
a memria seja alinhado.


Figura 37 - Trecho de memria que armazena um Frame MODBUS em um LPC2148.

A Figura 38 mostra uma rede MODBUS RTU que utiliza o meio fsico
RS485. Esta figura tambm mostra o cdigo da estrutura do ModFrame e o
cdigo da rotina que envia os bytes do Frame MODBUS pela interface serial.
A presena do Padding, neste exemplo, traz as seguintes desvantagens:

Diminui a portabilidade;
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 57

eleva custo de desenvolvimento de novos produtos (plataformas


diferentes);
gasto maior com manuteno de cdigo (plataformas diferentes);
Diminui o desempenho da rede;
Necessita de microcontroladores mais caros (+memria);
Localizao e posio do padding depende do grau de otimizao e do
compilador (GCC, Workbench, Vision...).


Figura 38 Desvantagens do Structure Padding na transmisso serial.
Uma soluo para o problema copiar o contedo dos campos do frame
para um buffer e em seguida enviar para a porta serial.










1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 58

BOAS PRTICAS EM PROGRAMAO



Boas prticas em programao visam tornar o cdigo mais legvel, facilitar
a operao de debug e favorecer a reutilizao do cdigo em outras
aplicaes.
Vale salientar que se o cdigo for gerado para fins comerciais, os nomes
de variveis, funes, modificadores de tipo e comentrios devem ser em
ingls.
Na sequncia so apresentadas algumas das prticas de programao
mais comuns:

Escolher Bons Nomes

Quando estiver escolhendo um nome para uma varivel ou funo, evite
nomes ambguos, porque melhor escolher nomes que descrevam o propsito
da varivel ou da funo.
Nomes abreviados tambm devem ser evitados, pois outros
programadores podem no entender o que a abreviao significa.
Um bom nome aquele que descreve da melhor maneira possvel, em
apenas algumas palavras, a inteno da varivel ou da funo.
Por fim, os nomes das funes devem comear com letra maiscula.

Variveis e Modificadores de Tipo

Consiste em boa prtica em programao especificar o tipo da varivel no
inicio do nome de cada varivel, como sugerido na Tabela 11.

Tabela 11 Identificadores sugeridos para especificar o tipo de varivel
Tipo de
Dados
Escala de Valores
Identificador
Sugerido
char
Especificao do Compilador
c
char8
uint8_t
c8
int8_t
-128 a 127
i8
uint8_t
0 a 255
u8
int16_t
-32768 a 32767
i16
uint16_t
0 a 65535
u16
int32_t
2.147.483.648 a 2.147.438.647
i32
uint32_t
0 a 4.294.967.295
u32
int64_t
-9.223.372.036.854.775.808 a
+9.223.372.036.854.775.807
i64
uint64_t
0 a +18.446.744.073.709.551.615
u64
float32
ver IEEE 754 (float)
f32
float64
ver IEEE 754 (double)
f64
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 59

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;

A linha de cdigo ( uint16_t *p_CarSpeed; ) declara um ponteiro do tipo


inteiro 16 bits cujo nome inicia com ( p ) conforme sugerido na Tabela 12. Este
procedimento facilita o reconhecimento de uma varivel do tipo ponteiro em um
programa que possua muitas linhas de cdigo, facilita a compreenso do
cdigo por outros programadores, favorece a reutilizao de cdigo, dentre
outras vantagens.

1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 60

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

Aplicar as prticas de programao propostas nos programas


apresentados como exemplo e nos programas propostos.

PROGRAMAO EM LINGUAGEM C USANDO


MQUINA DE ESTADO

1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 62

Referncias

URL1: Pgina oficial da Network of Excellence on Embedded Systems Design.


Disponvel em:<http://pt.wikipedia.org/wiki/Sistema_embarcado>. Acesso em: maro
de 2011.
URL2: Pgina oficial da Network of Excellence on Embedded Systems Design.
Disponvel em:< http://www.artist-embedded.org/artist/>. Acesso em: junho de 2010.
URL3: Pgina oficial da SUN. Disponvel em: <
http://java.sun.com/products/cldc/overview.html#6>. Acesso em: julho de 2010.
URL4: Pgina oficial da Java Community Process. Disponvel em:
<http://jcp.org/en/jsr/detail?id=139>. Acesso em: julho 2010.
URL5: Pgina oficial da International Electrotechnical Commission. Disponvel em:
<http://www.iec.ch/zone/fsafety/pdf_safe/hld.pdf>. Acesso em julho 2010.
URL 6: Pgina oficial da Wikipedia, a encyclopdia livre. Disponvel em:
<http://pt.wikipedia.org/wiki/N%C3%BAmero_m%C3%A1gico_(inform%C3%A1tica)>.
Acesso em abril 2011.

Edio e Reviso:
Universidade Federal de Uberlndia
Faculdade de Engenharia Eltrica
LASEC Laboratrio de Automao,
Servomecanismos e Controle
www.lasec.feelt.ufu.br
STHS Tecnologia

http://www.sths.com.br
Prof. Fbio Vincenzi R. da Silva
Eng. Gilson Fonseca Peres Filho
solucoes@sths.com.br


Agradecimentos

Antes de comear a citar nomes, gostaramos de agradecer a todos de


modo geral, pois temos falado com muitas pessoas tanto no meio acadmico
quanto no comrcio, indstria e servios sobre os benefcios de se criar
material didtico para esta rea de Sistemas Embarcados. A resposta de todos
tm sido muito encorajamento e entusiasmo. Obrigado, vocs ajudaram muito.
Agradecemos a todos aqueles que contriburam e que ainda contribuiro
com exemplos e sugestes para melhorar este material didtico e com apoio
financeiro para a construo de kits didticos utilizados nas aulas e laboratrios
de pesquisa. Neste sentido, em nome de todos aqueles que j se beneficiaram
e daqueles que iro se beneficiar com este material, nossos mais sinceros
agradecimentos aos amigos:
1Edio03/2011
Prof. Fbio V.R.S. www.lasec.feelt.ufu.br & Eng. Gilson F.P.F. www.sths.com.br Pgina 63


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)

Você também pode gostar