apostila de sistemas embarcados

Upload: guilherme-ferreira

Post on 13-Oct-2015

64 views

Category:

Documents


2 download

TRANSCRIPT

  • ltimaAtualizao23/07/2011

    LASECFEELT APOSTILADESISTEMASEMBARCADOS1

    UNIVERSIDADEFEDERALDEUBERLNDIA

    FACULDADEDEENGENHARIAELTRICAFEELT

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina2

    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.......................................................................................................................2Introduo.....................................................................................................................................4MicrocontroladorARM.................................................................................................................7SoftwaresparaProgramarARM.................................................................................................10LED_Blink.....................................................................................................................................11ExerccioProposto...................................................................................................................11ProgramaLED_BlinkComentado............................................................................................13

    ConfigurandooClockdaCPU......................................................................................................15OperadoresLgicosBitaBit.......................................................................................................16Displayde7Segmentos..............................................................................................................18ExerccioProposto...................................................................................................................19

    Nmerosmgicosemprogramao...........................................................................................21PortabilidadeeoPrprocessadorC...........................................................................................28TiposPrimitivosemC..................................................................................................................30ExerccioProposto...................................................................................................................36

    TecladoMatricial.........................................................................................................................37ExerccioProposto...................................................................................................................39

    DisplaydeCristalLquido............................................................................................................40ExerccioProposto...................................................................................................................43

    InterfacedeComunicaoSPI.....................................................................................................44OperaesATOMIC..................................................................................................................45STRUCTUREPADDINGESERIALIZAO...............................................................................50Referncias..................................................................................................................................61

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina3

    EdioeReviso:.....................................................................................................................62Agradecimentos......................................................................................................................62

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina4

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina5

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina6

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina7

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina8

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina9

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina10

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina11

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina12

    XTAL162XTAL261

    P0.0/TxD0/PWM1 19P0.1/RxD0/PWM3/EINT0 21

    P0.2/SCL0/CAP0.0 22P0.3/SDA0/MAT0..0/EINT1 26P0.4/SCK0/CAP0.1/AD0.6 27

    P0.5/MISO0/MAT0.1/AD0.7 29P0.6/MOSI0/CAP0.2/AD1.0 30P0.7/SSEL0/PWM2/EINT2 31

    P0.8/TxD1/PWM4/AD1.1 33P0.9/RxD1/PWM6/EINT3 34

    P0.10/RTS1/CAP1.0/AD1.2 35P0.11/CTS1/CAP1.1/SCL1 37

    P0.12/DSR1/MAT1.0/AD1.3 38P0.13/DTR1/MAT1.1/AD1.4 39

    P0.14/DCD1/EINT1/SDA1 41P0.15/RI1/EINT2/AD1.5 45

    P0.16/EINT0/MAT0.2/CAP0.2 46P0.17/CAP1.2/SCK1/MAT1.2 47

    P0.18/CAP1.3/MISO1/MAT1.3 53P0.19/MAT1.2/MOSI1/CAP1.2 54

    P0.20/MAT1.3/SSEL1/EINT3 55P0.21/PWM5/AD1.6/CAP1.3 1

    P0.22/AD1.7/CAP0.0/MAT0.0 2P0.23 58

    P0.25/AD0.4/AOUT 9

    P0.27/AD0.0/CAP0.1/MAT0.1 11P0.28/AD0.1/CAP0.2/MAT0.2 13P0.29/AD0.2/CAP0.3/MAT0.3 14

    P0.30/AD0.3/EINT3/CAP0.0 15

    V323

    RST57

    VREF63

    VSS6

    VSSA59

    P1.16/TRACEPKT0 16P1.17/TRACEPKT1 12P1.18/TRACEPKT2 8P1.19/TRACEPKT3 4

    P1.20/TRACESYNC 48P1.21/PIPESTAT0 44P1.22/PIPESTAT1 40P1.23/PIPESTAT2 36P1.24/TRACECLK 32

    P1.25/EXTIN0 28P1.26/RTCK 24

    P1.27/TDO 64P1.28/TDI 60

    P1.29/TCK 56P1.30/TMS 52

    P1.31/TRST 20

    V343V351

    VSS18VSS25VSS42VSS50

    RTXC13RTXC25

    V3A7

    VBAT49

    P0.31 17

    P0.26/AD0.5 10

    U1

    LPC2138

    3.3V

    D3

    LED-GREEN

    R7300

    3.3V

    3 4U2:B

    74HCT04

    3.3V

    C1

    22pF

    C2

    22pF

    X1CRYSTAL

    FREQ=12MHz

    D1

    DIODE

    R147k

    C3

    100pF

    Figura 4 LED acionado pelo pino P0.31

    XTAL162XTAL261

    P0.0/TxD0/PWM1 19P0.1/RxD0/PWM3/EINT0 21

    P0.2/SCL0/CAP0.0 22P0.3/SDA0/MAT0..0/EINT1 26P0.4/SCK0/CAP0.1/AD0.6 27

    P0.5/MISO0/MAT0.1/AD0.7 29P0.6/MOSI0/CAP0.2/AD1.0 30P0.7/SSEL0/PWM2/EINT2 31

    P0.8/TxD1/PWM4/AD1.1 33P0.9/RxD1/PWM6/EINT3 34

    P0.10/RTS1/CAP1.0/AD1.2 35P0.11/CTS1/CAP1.1/SCL1 37

    P0.12/DSR1/MAT1.0/AD1.3 38P0.13/DTR1/MAT1.1/AD1.4 39

    P0.14/DCD1/EINT1/SDA1 41P0.15/RI1/EINT2/AD1.5 45

    P0.16/EINT0/MAT0.2/CAP0.2 46P0.17/CAP1.2/SCK1/MAT1.2 47

    P0.18/CAP1.3/MISO1/MAT1.3 53P0.19/MAT1.2/MOSI1/CAP1.2 54

    P0.20/MAT1.3/SSEL1/EINT3 55P0.21/PWM5/AD1.6/CAP1.3 1

    P0.22/AD1.7/CAP0.0/MAT0.0 2P0.23 58

    P0.25/AD0.4/AOUT 9

    P0.27/AD0.0/CAP0.1/MAT0.1 11P0.28/AD0.1/CAP0.2/MAT0.2 13P0.29/AD0.2/CAP0.3/MAT0.3 14

    P0.30/AD0.3/EINT3/CAP0.0 15

    V323

    RST57

    VREF63

    VSS6

    VSSA59

    P1.16/TRACEPKT0 16P1.17/TRACEPKT1 12P1.18/TRACEPKT2 8P1.19/TRACEPKT3 4P1.20/TRACESYNC 48

    P1.21/PIPESTAT0 44P1.22/PIPESTAT1 40P1.23/PIPESTAT2 36P1.24/TRACECLK 32

    P1.25/EXTIN0 28P1.26/RTCK 24

    P1.27/TDO 64P1.28/TDI 60

    P1.29/TCK 56P1.30/TMS 52

    P1.31/TRST 20

    V343V351

    VSS18VSS25VSS42VSS50

    RTXC13RTXC25

    V3A7

    VBAT49

    P0.31 17

    P0.26/AD0.5 10

    U1

    LPC2138

    3.3V

    LED 1

    LED-GREEN

    R7300

    3.3V

    1 2U2:A

    74HCT04

    3.3V

    C1

    22pF

    C2

    22pF

    X1CRYSTAL

    FREQ=12MHz

    D1

    DIODE

    R147k

    C3

    100pF

    LED 2

    LED-GREEN

    R2300

    3.3V

    3 4U2:B

    74HCT04

    LED 3

    LED-GREEN

    R3300

    3.3V

    5 6U2:C

    74HCT04

    LED 4

    LED-GREEN

    R4300

    3.3V

    13 12U2:D

    74HCT04

    Figura 5 LEDs acionados pelos pinos P0.31, P0.25, P0.19 e P0.14

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina13

    Programa LED_Blink Comentado /* =============================== C/C++ SOURCE FILE ================================ */ /** \file \description Escrever o que a rotina faz \author Nome do autor */ /* ================================================================================== */ /*------------------------------------------------------------------------------------*/ /* INCLUDES */ /*------------------------------------------------------------------------------------*/ #include "LPC214x.h" // A diretiva #include informa ao compilador que ele deve incluir o arquivo LPC214x.h, pois este arquivo contm endereos de memria e de registradores que sero utilizados no programa. #include "cpu_init.h" // A diretiva #include informa ao compilador para incluir o mdulo cpu_init.h, pois este arquivo contm as rotinas de inicializao da CPU do ARM LPC2148. /*------------------------------------------------------------------------------------*/ /* FUNCTION IMPLEMENTATION */ /*------------------------------------------------------------------------------------*/ int main (void) // A funo main() a primeira funo a ser executada, todo programa deve possuir uma. { int j = 0; // Declara a varivel j como inteiro de 32bit, porque a arquitetura do ARM de 32bit, por isso, a faixa de valores de j de -2.147.483.648 a +2.147.483.647 cpu_init(); // Chama a rotina que inicializa a CPU do ARM LPC2148 PINSEL1 &= ~((1

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina14

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina15

    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.

    // Considerando um cristal de 12 MHz, o valor do Mutiplicador e Divisor so: #define cristal_12MHz_cpu_60MHz 0x24 // 0x24 - Clock do processador (cclk) configurado para 60MHz #define cristal_12MHz_cpu_48MHz 0x23 // 0x23 - Clock do processador (cclk) configurado para 48MHz #define cristal_12MHz_cpu_36MHz 0x42 // 0x42 - Clock do processador (cclk) configurado para 36MHz #define cristal_12MHz_cpu_24MHz 0x41 // 0x41 - Clock do processador (cclk) configurado para 24MHz #define cristal_12MHz_cpu_12MHz 0x60 // 0x60 - Clock do processador (cclk) configurado para 12MHz //-------------------------------------------------------------------------------------- //--- A frequncia da CPU deve ser configurada aqui!!! --------------------------------- #define cpuMHz cristal_12MHz_cpu_60MHz // Define o clock da CPU do ARM #define bus_div0 0x01 // Barramento com a mesma frequncia da CPU #define bus_div2 0x10 // Barramento com metade (1/2) da frequncia da CPU #define bus_div4 0x00 // Barramento com um quarto (1/4) da frequncia da CPU //-------------------------------------------------------------------------------------- //--- A frequncia do barramento dos perifricos deve ser configurada aqui!!! ---------- #define bus_freq bus_div0 // Define a frequncia do barramento dos perifricos

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina16

    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 0Registrador_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 ouMscara: 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 0Figura 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

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina17

    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 0Registrador_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 EMscara: 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 0Figura 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

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina18

    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.

    XTAL162XTAL261

    P0.0/TxD0/PWM1 19P0.1/RxD0/PWM3/EINT0 21

    P0.2/SCL0/CAP0.0 22P0.3/SDA0/MAT0..0/EINT1 26P0.4/SCK0/CAP0.1/AD0.6 27

    P0.5/MISO0/MAT0.1/AD0.7 29P0.6/MOSI0/CAP0.2/AD1.0 30P0.7/SSEL0/PWM2/EINT2 31

    P0.8/TxD1/PWM4/AD1.1 33P0.9/RxD1/PWM6/EINT3 34

    P0.10/RTS1/CAP1.0/AD1.2 35P0.11/CTS1/CAP1.1/SCL1 37

    P0.12/DSR1/MAT1.0/AD1.3 38P0.13/DTR1/MAT1.1/AD1.4 39

    P0.14/DCD1/EINT1/SDA1 41P0.15/RI1/EINT2/AD1.5 45

    P0.16/EINT0/MAT0.2/CAP0.2 46P0.17/CAP1.2/SCK1/MAT1.2 47

    P0.18/CAP1.3/MISO1/MAT1.3 53P0.19/MAT1.2/MOSI1/CAP1.2 54

    P0.20/MAT1.3/SSEL1/EINT3 55P0.21/PWM5/AD1.6/CAP1.3 1

    P0.22/AD1.7/CAP0.0/MAT0.0 2P0.23 58

    P0.25/AD0.4/AOUT 9

    P0.27/AD0.0/CAP0.1/MAT0.1 11P0.28/AD0.1/CAP0.2/MAT0.2 13P0.29/AD0.2/CAP0.3/MAT0.3 14

    P0.30/AD0.3/EINT3/CAP0.0 15

    V323

    RST57

    VREF63

    VSS6

    VSSA59

    P1.16/TRACEPKT0 16P1.17/TRACEPKT1 12P1.18/TRACEPKT2 8P1.19/TRACEPKT3 4

    P1.20/TRACESYNC 48P1.21/PIPESTAT0 44P1.22/PIPESTAT1 40P1.23/PIPESTAT2 36P1.24/TRACECLK 32

    P1.25/EXTIN0 28P1.26/RTCK 24

    P1.27/TDO 64P1.28/TDI 60

    P1.29/TCK 56P1.30/TMS 52

    P1.31/TRST 20

    V343V351

    VSS18VSS25VSS42VSS50

    RTXC13RTXC25

    V3A7

    VBAT49

    P0.31 17

    P0.26/AD0.5 10

    U1

    LPC2138

    3.3V

    R7300

    3 4U2:B

    74HCT04

    3.3V

    C1

    22pF

    C2

    22pF

    X1CRYSTAL

    FREQ=12MHz

    D1

    DIODE

    R147k

    C3

    100pFR22k2

    3.3V

    R3300

    1 2U2:A

    74HCT04R4300

    5 6U2:C

    74HCT04 R5300

    13 12U2:D

    74HCT04R6300

    11 10U2:E

    74HCT04 R8300

    9 8U2:F

    74HCT04R9300

    1 2U3: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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina19

    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.

    abf

    gce

    d

    AnodoComum

    (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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina20

    Programa: #include "LPC214x.h" // Informa ao compilador que ele deve incluir o arquivo LPC214x.h. #include "cpu_init.h" // Informa ao compilador para incluir o arquivo cpu_init.h int main (void) { cpu_init(); // Chama a rotina de inicializao da CPU int i = 0; // Declara um inteiro de 32bit e inicializa com o valor zero // O registrador PINSEL2 controla a funo dos pinos do PORT1. Se o bit 2 do registrador PINSEL2 for igual a 0 (zero), os pinos P1.36-26 so configurados como entrada/sada e se o bit 3 deste registrador for igual a 0 (zero), os pinos P1.25-16 so configurados como entrada/sada. Por padro, os bits 2 e 3 so inicializados com valor 0 (zero)- Ver Table 62: Pin function Select register 2 no documento LPC214X User Manual.pdf IODIR1 |= (1

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina21

    XTAL162XTAL261

    P0.0/TxD0/PWM1 19P0.1/RxD0/PWM3/EINT0 21

    P0.2/SCL0/CAP0.0 22P0.3/SDA0/MAT0..0/EINT1 26P0.4/SCK0/CAP0.1/AD0.6 27

    P0.5/MISO0/MAT0.1/AD0.7 29P0.6/MOSI0/CAP0.2/AD1.0 30P0.7/SSEL0/PWM2/EINT2 31

    P0.8/TxD1/PWM4/AD1.1 33P0.9/RxD1/PWM6/EINT3 34

    P0.10/RTS1/CAP1.0/AD1.2 35P0.11/CTS1/CAP1.1/SCL1 37

    P0.12/DSR1/MAT1.0/AD1.3 38P0.13/DTR1/MAT1.1/AD1.4 39

    P0.14/DCD1/EINT1/SDA1 41P0.15/RI1/EINT2/AD1.5 45

    P0.16/EINT0/MAT0.2/CAP0.2 46P0.17/CAP1.2/SCK1/MAT1.2 47

    P0.18/CAP1.3/MISO1/MAT1.3 53P0.19/MAT1.2/MOSI1/CAP1.2 54

    P0.20/MAT1.3/SSEL1/EINT3 55P0.21/PWM5/AD1.6/CAP1.3 1

    P0.22/AD1.7/CAP0.0/MAT0.0 2P0.23 58

    P0.25/AD0.4/AOUT 9

    P0.27/AD0.0/CAP0.1/MAT0.1 11P0.28/AD0.1/CAP0.2/MAT0.2 13P0.29/AD0.2/CAP0.3/MAT0.3 14

    P0.30/AD0.3/EINT3/CAP0.0 15

    V323

    RST57

    VREF63

    VSS6

    VSSA59

    P1.16/TRACEPKT0 16P1.17/TRACEPKT1 12P1.18/TRACEPKT2 8P1.19/TRACEPKT3 4

    P1.20/TRACESYNC 48P1.21/PIPESTAT0 44P1.22/PIPESTAT1 40P1.23/PIPESTAT2 36P1.24/TRACECLK 32

    P1.25/EXTIN0 28P1.26/RTCK 24

    P1.27/TDO 64P1.28/TDI 60

    P1.29/TCK 56P1.30/TMS 52

    P1.31/TRST 20

    V343V351

    VSS18VSS25VSS42VSS50

    RTXC13RTXC25

    V3A7

    VBAT49

    P0.31 17

    P0.26/AD0.5 10

    U1

    LPC2138

    3.3V

    R7300

    3 4U2:B

    74HCT04

    3.3V

    C1

    22pF

    C2

    22pF

    X1CRYSTAL

    FREQ=12MHz

    D1

    DIODE

    R147k

    C3

    100pFR22k2

    3.3V

    R3300

    1 2U2:A

    74HCT04R4300

    5 6U2:C

    74HCT04 R5300

    13 12U2:D

    74HCT04R6300

    11 10U2:E

    74HCT04 R8300

    9 8U2:F

    74HCT04R9300

    1 2U3:A

    74HCT04

    3.3V

    R10300

    3 4U3:B

    74HCT04R11300

    5 6U3:C

    74HCT04R12300

    13 12U3:D

    74HCT04 R13300

    11 10U3:E

    74HCT04R14300

    9 8U3:F

    74HCT04 R15300

    1 2U4:A

    74HCT04R16300

    3 4U4: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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina22

    Programa com #define: #include "LPC214x.h" #include "cpu_init.h" /*------------------------------------------------------------------------------------*/ /* DEFINITIONS AND MACROS */ /*------------------------------------------------------------------------------------*/ #define seg_a (1

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina23

    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.

    XTAL162XTAL261

    P0.0/TxD0/PWM1 19P0.1/RxD0/PWM3/EINT0 21

    P0.2/SCL0/CAP0.0 22P0.3/SDA0/MAT0..0/EINT1 26P0.4/SCK0/CAP0.1/AD0.6 27

    P0.5/MISO0/MAT0.1/AD0.7 29P0.6/MOSI0/CAP0.2/AD1.0 30P0.7/SSEL0/PWM2/EINT2 31

    P0.8/TxD1/PWM4/AD1.1 33P0.9/RxD1/PWM6/EINT3 34

    P0.10/RTS1/CAP1.0/AD1.2 35P0.11/CTS1/CAP1.1/SCL1 37

    P0.12/DSR1/MAT1.0/AD1.3 38P0.13/DTR1/MAT1.1/AD1.4 39

    P0.14/DCD1/EINT1/SDA1 41P0.15/RI1/EINT2/AD1.5 45

    P0.16/EINT0/MAT0.2/CAP0.2 46P0.17/CAP1.2/SCK1/MAT1.2 47

    P0.18/CAP1.3/MISO1/MAT1.3 53P0.19/MAT1.2/MOSI1/CAP1.2 54

    P0.20/MAT1.3/SSEL1/EINT3 55P0.21/PWM5/AD1.6/CAP1.3 1

    P0.22/AD1.7/CAP0.0/MAT0.0 2P0.23 58

    P0.25/AD0.4/AOUT 9

    P0.27/AD0.0/CAP0.1/MAT0.1 11P0.28/AD0.1/CAP0.2/MAT0.2 13P0.29/AD0.2/CAP0.3/MAT0.3 14

    P0.30/AD0.3/EINT3/CAP0.0 15

    V323

    RST57

    VREF63

    VSS6

    VSSA59

    P1.16/TRACEPKT0 16P1.17/TRACEPKT1 12P1.18/TRACEPKT2 8P1.19/TRACEPKT3 4

    P1.20/TRACESYNC 48P1.21/PIPESTAT0 44P1.22/PIPESTAT1 40P1.23/PIPESTAT2 36P1.24/TRACECLK 32

    P1.25/EXTIN0 28P1.26/RTCK 24

    P1.27/TDO 64P1.28/TDI 60

    P1.29/TCK 56P1.30/TMS 52

    P1.31/TRST 20

    V343V351

    VSS18VSS25VSS42VSS50

    RTXC13RTXC25

    V3A7

    VBAT49

    P0.31 17

    P0.26/AD0.5 10

    U1

    LPC2138

    3.3V

    3.3V

    C1

    22pF

    C2

    22pF

    X1CRYSTAL

    FREQ=12MHz

    D1

    DIODE

    R147k

    C3

    100pFR22k2

    3.3V

    R10300

    3 4U3:B

    74HCT04R11300

    5 6U3:C

    74HCT04R12300

    13 12U3:D

    74HCT04 R13300

    11 10U3:E

    74HCT04R14300

    9 8U3:F

    74HCT04 R15300

    1 2U4:A

    74HCT04R16300

    3 4U4:B

    74HCT04 Q1BC337

    R32.2k

    Q2BC337

    R42.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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina24

    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_init.h" #include "stdint.h" /*------------------------------------------------------------------------------------*/ /* DEFINITIONS AND MACROS */ /*------------------------------------------------------------------------------------*/ #define seg_a (1

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina25

    case 1: IOCLR1 = seg_b|seg_c; break; // 1 no display case 2: IOCLR1 = seg_a|seg_b|seg_d|seg_e|seg_g; break; // 2 no display case 3: IOCLR1 = seg_a|seg_b|seg_c|seg_d|seg_g; break; // 3 no display case 4: IOCLR1 = seg_b|seg_c|seg_f|seg_g; break; // 4 no display case 5: IOCLR1 = seg_a|seg_c|seg_d|seg_f|seg_g; break; // 5 no display case 6: IOCLR1 = seg_a|seg_c|seg_d|seg_f|seg_e|seg_g; break; // 6 no display case 7: IOCLR1 = seg_a|seg_b|seg_c; break; // 7 no display case 8: IOCLR1 = seg_a|seg_b|seg_c|seg_d|seg_e|seg_f|seg_g; break; // 8 no display case 9: IOCLR1 = seg_a|seg_b|seg_c|seg_f|seg_g; break; // 9 no display default: IOCLR1 = seg_a|seg_b|seg_c|seg_f|seg_g; // 0 no display } } //--- Rotina Principal ----------------------------------------------------------------- int main (void) { cpu_init(); // Chama a rotina de inicializao da CPU int j = 0; // Declara um inteiro de 32bit (-2.147.483.648 a +2.147.483.647) int uni = 0; // Declara um inteiro de 32bit (-2.147.483.648 a +2.147.483.647) int dez = 0; // Declara um inteiro de 32bit (-2.147.483.648 a +2.147.483.647) int cont = 0; // Declara um inteiro de 32bit (-2.147.483.648 a +2.147.483.647) // O registrador PINSEL2 controla a funo dos pinos do PORT1. Se o bit 2 do registrador PINSEL2 for igual a 0 (zero), os pinos P1.36-26 so configurados como entrada/sada e se o bit 3 deste registrador for igual a 0 (zero), os pinos P1.25-16 so configurados como entrada/sada. Por padro, os bits 2 e 3 so inicializados com valor 0 (zero)- Ver Table 62: Pin function Select register 2 no documento LPC214X User Manual.pdf IODIR1 |= seg_a|seg_b|seg_c|seg_d|seg_e|seg_f|seg_g|tran_dez|tran_uni; // Pinos como sada IOCLR1 = tran_dez|tran_uni; // Nvel baixo nos pinos que acionam os transistores IOSET1 = seg_a|seg_b|seg_c|seg_d|seg_e|seg_f|seg_g; // Nvel baixo nos segmentos while(1){ IOSET1 = tran_dez; // Faz o Transistor da dezena entrar na saturao Decimal_to_7Segment(dez); for (j = 0; j < 5000; j++ ) asm volatile ("NOP"); // Espera at os segmentos assumirem brilho mximo. Este tempo deve ser configurado na prtica IOCLR1 = tran_dez; // Faz o Transistor da dezena entrar em corte IOSET1 = seg_a|seg_b|seg_c|seg_d|seg_e|seg_f|seg_g; // Nvel baixo nos segmentos IOSET1 = tran_uni; // Faz o Transistor da unidade entrar em saturao Decimal_to_7Segment(uni); // Chama Decimal_to_7Segment() para exibir unidade for (j = 0; j < 5000; j++ ) asm volatile ("NOP"); // Espera IOCLR1 = tran_uni; // Faz o Transistor da unidade entrar em corte IOSET1 = seg_a|seg_b|seg_c|seg_d|seg_e|seg_f|seg_g; // Nvel baixo nos segmentos if (!(IOPIN0 & botton)) // Verifica se o Boto foi pressionado { while (!(IOPIN0 & botton)); // Espera enquanto o Boto estiver pressinado cont++; // Incrementa a varivel cont if (cont >= 16){ cont = 0; } uni = cont % 10; // uni = resto da diviso de cont por 10 dez = cont / 10; // dez = cont dividido por 10 } } return(0); } Implementando a rotina Decimal_to_7Segment( ) usando tabela: #include "LPC214x.h" #include "cpu_init.h" #include "stdint.h"

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina26

    /*------------------------------------------------------------------------------------*/ /* DEFINITIONS AND MACROS */ /*------------------------------------------------------------------------------------*/ #define seg_a (1

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina27

    Decimal_to_7Segment(uni); // Chama Decimal_to_7Segment() para exibir unidade for (j = 0; j < 5000; j++ ) asm volatile ("NOP"); // Espera IOCLR1 = tran_uni; // Faz o Transistor da unidade entrar em corte IOSET1 = seg_a|seg_b|seg_c|seg_d|seg_e|seg_f|seg_g; // Nvel baixo nos segmentos if (!(IOPIN0 & botton)) // Verifica se o Boto foi pressionado { while (!(IOPIN0 & botton)); // Espera enquanto o Boto estiver pressinado cont++; // Incrementa a varivel cont if (cont >= 16){ cont = 0; } uni = cont % 10; // uni = resto da diviso de cont por 10 dez = cont / 10; // dez = cont dividido por 10 } } return(0); }

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina28

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina29

    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

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina30

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina31

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina32

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina33

    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.

    XTAL162XTAL261

    P0.0/TxD0/PWM1 19P0.1/RxD0/PWM3/EINT0 21

    P0.2/SCL0/CAP0.0 22P0.3/SDA0/MAT0..0/EINT1 26P0.4/SCK0/CAP0.1/AD0.6 27

    P0.5/MISO0/MAT0.1/AD0.7 29P0.6/MOSI0/CAP0.2/AD1.0 30P0.7/SSEL0/PWM2/EINT2 31

    P0.8/TxD1/PWM4/AD1.1 33P0.9/RxD1/PWM6/EINT3 34

    P0.10/RTS1/CAP1.0/AD1.2 35P0.11/CTS1/CAP1.1/SCL1 37

    P0.12/DSR1/MAT1.0/AD1.3 38P0.13/DTR1/MAT1.1/AD1.4 39

    P0.14/DCD1/EINT1/SDA1 41P0.15/RI1/EINT2/AD1.5 45

    P0.16/EINT0/MAT0.2/CAP0.2 46P0.17/CAP1.2/SCK1/MAT1.2 47

    P0.18/CAP1.3/MISO1/MAT1.3 53P0.19/MAT1.2/MOSI1/CAP1.2 54

    P0.20/MAT1.3/SSEL1/EINT3 55P0.21/PWM5/AD1.6/CAP1.3 1

    P0.22/AD1.7/CAP0.0/MAT0.0 2P0.23 58

    P0.25/AD0.4/AOUT 9

    P0.27/AD0.0/CAP0.1/MAT0.1 11P0.28/AD0.1/CAP0.2/MAT0.2 13P0.29/AD0.2/CAP0.3/MAT0.3 14

    P0.30/AD0.3/EINT3/CAP0.0 15

    V323

    RST57

    VREF63

    VSS6

    VSSA59

    P1.16/TRACEPKT0 16P1.17/TRACEPKT1 12P1.18/TRACEPKT2 8P1.19/TRACEPKT3 4P1.20/TRACESYNC 48

    P1.21/PIPESTAT0 44P1.22/PIPESTAT1 40P1.23/PIPESTAT2 36P1.24/TRACECLK 32

    P1.25/EXTIN0 28P1.26/RTCK 24

    P1.27/TDO 64P1.28/TDI 60

    P1.29/TCK 56P1.30/TMS 52

    P1.31/TRST 20

    V343V351

    VSS18VSS25VSS42VSS50

    RTXC13RTXC25

    V3A7

    VBAT49

    P0.31 17

    P0.26/AD0.5 10

    U1

    LPC2138

    3.3V

    3.3V

    C1

    22pF

    C2

    22pF

    X1CRYSTAL

    FREQ=12MHz

    D1

    DIODE

    R147k

    C3

    100pFR22k2

    3.3V

    300300300300300300

    SRG8

    R C1/-

    >

    &1D

    13

    24 5 6 10

    8

    11 12

    9

    13

    U274HCT164

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina34

    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 7Q 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 7Q 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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina35

    Programa do Exerccio Resolvido 02 #include "LPC214x.h" #include "cpu_init.h" #include #define clk (1

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina36

    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.

    XTAL162XTAL261

    P0.0/TxD0/PWM1 19P0.1/RxD0/PWM3/EINT0 21

    P0.2/SCL0/CAP0.0 22P0.3/SDA0/MAT0..0/EINT1 26P0.4/SCK0/CAP0.1/AD0.6 27

    P0.5/MISO0/MAT0.1/AD0.7 29P0.6/MOSI0/CAP0.2/AD1.0 30P0.7/SSEL0/PWM2/EINT2 31

    P0.8/TxD1/PWM4/AD1.1 33P0.9/RxD1/PWM6/EINT3 34

    P0.10/RTS1/CAP1.0/AD1.2 35P0.11/CTS1/CAP1.1/SCL1 37

    P0.12/DSR1/MAT1.0/AD1.3 38P0.13/DTR1/MAT1.1/AD1.4 39

    P0.14/DCD1/EINT1/SDA1 41P0.15/RI1/EINT2/AD1.5 45

    P0.16/EINT0/MAT0.2/CAP0.2 46P0.17/CAP1.2/SCK1/MAT1.2 47

    P0.18/CAP1.3/MISO1/MAT1.3 53P0.19/MAT1.2/MOSI1/CAP1.2 54

    P0.20/MAT1.3/SSEL1/EINT3 55P0.21/PWM5/AD1.6/CAP1.3 1

    P0.22/AD1.7/CAP0.0/MAT0.0 2P0.23 58

    P0.25/AD0.4/AOUT 9

    P0.27/AD0.0/CAP0.1/MAT0.1 11P0.28/AD0.1/CAP0.2/MAT0.2 13P0.29/AD0.2/CAP0.3/MAT0.3 14

    P0.30/AD0.3/EINT3/CAP0.0 15

    V323

    RST57

    VREF63

    VSS6

    VSSA59

    P1.16/TRACEPKT0 16P1.17/TRACEPKT1 12P1.18/TRACEPKT2 8P1.19/TRACEPKT3 4

    P1.20/TRACESYNC 48P1.21/PIPESTAT0 44P1.22/PIPESTAT1 40P1.23/PIPESTAT2 36P1.24/TRACECLK 32

    P1.25/EXTIN0 28P1.26/RTCK 24

    P1.27/TDO 64P1.28/TDI 60

    P1.29/TCK 56P1.30/TMS 52

    P1.31/TRST 20

    V343V351

    VSS18VSS25VSS42VSS50

    RTXC13RTXC25

    V3A7

    VBAT49

    P0.31 17

    P0.26/AD0.5 10

    U1

    LPC2138

    3.3V

    3.3V

    C1

    22pF

    C2

    22pF

    X1CRYSTAL

    FREQ=12MHz

    D1

    DIODE

    R147k

    C3

    100pF

    R22k2

    3.3V

    300300300300300300

    SRG8

    R C1/-

    >

    &1D

    13

    24 5 6 10

    8

    11 12

    9

    13

    U274HCT164

    3.3V

    330

    3.3V

    300300300300300300

    SRG8

    R C1/-

    >

    &1D

    13

    24 5 6 10

    8

    11 12

    9

    13

    U374HCT164

    3.3V

    330

    U3(MR)

    300300300300300300

    SRG8

    R C1/-

    >

    &1D

    13

    24 5 6 10

    8

    11 12

    9

    13

    U474HCT

    3.3V

    330

    U4(MR)

    R242k2

    3.3V

    R252k2

    3.3V

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina37

    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.

    XTAL162XTAL261

    P0.0/TxD0/PWM1 19P0.1/RxD0/PWM3/EINT0 21

    P0.2/SCL0/CAP0.0 22P0.3/SDA0/MAT0..0/EINT1 26P0.4/SCK0/CAP0.1/AD0.6 27

    P0.5/MISO0/MAT0.1/AD0.7 29P0.6/MOSI0/CAP0.2/AD1.0 30P0.7/SSEL0/PWM2/EINT2 31

    P0.8/TxD1/PWM4/AD1.1 33P0.9/RxD1/PWM6/EINT3 34

    P0.10/RTS1/CAP1.0/AD1.2 35P0.11/CTS1/CAP1.1/SCL1 37

    P0.12/DSR1/MAT1.0/AD1.3 38P0.13/DTR1/MAT1.1/AD1.4 39

    P0.14/DCD1/EINT1/SDA1 41P0.15/RI1/EINT2/AD1.5 45

    P0.16/EINT0/MAT0.2/CAP0.2 46P0.17/CAP1.2/SCK1/MAT1.2 47

    P0.18/CAP1.3/MISO1/MAT1.3 53P0.19/MAT1.2/MOSI1/CAP1.2 54

    P0.20/MAT1.3/SSEL1/EINT3 55P0.21/PWM5/AD1.6/CAP1.3 1

    P0.22/AD1.7/CAP0.0/MAT0.0 2P0.23 58

    P0.25/AD0.4/AOUT 9

    P0.27/AD0.0/CAP0.1/MAT0.1 11P0.28/AD0.1/CAP0.2/MAT0.2 13P0.29/AD0.2/CAP0.3/MAT0.3 14

    P0.30/AD0.3/EINT3/CAP0.0 15

    V323

    RST57

    VREF63

    VSS6

    VSSA59

    P1.16/TRACEPKT0 16P1.17/TRACEPKT1 12P1.18/TRACEPKT2 8P1.19/TRACEPKT3 4

    P1.20/TRACESYNC 48P1.21/PIPESTAT0 44P1.22/PIPESTAT1 40P1.23/PIPESTAT2 36P1.24/TRACECLK 32

    P1.25/EXTIN0 28P1.26/RTCK 24

    P1.27/TDO 64P1.28/TDI 60

    P1.29/TCK 56P1.30/TMS 52

    P1.31/TRST 20

    V343V351

    VSS18VSS25VSS42VSS50

    RTXC13RTXC25

    V3A7

    VBAT49

    P0.31 17

    P0.26/AD0.5 10

    U1

    LPC2138

    3.3V

    R7300

    3 4U2:B

    74HCT04

    3.3V

    C1

    22pF

    C2

    22pF

    X1CRYSTAL

    FREQ=12MHz

    D1

    DIODE

    R147k

    C3

    100pF

    R22k2 3.3V

    R3300

    1 2U2:A

    74HCT04R4300

    5 6U2:C

    74HCT04 R5300

    13 12U2:D

    74HCT04R6300

    11 10U2:E

    74HCT04 R8300

    9 8U2:F

    74HCT04R9300

    1 2U3:A

    74HCT04

    3.3V

    1 2 3654

    8 97

    ++0 =

    A

    B

    C

    D

    1 2 43D2

    D3

    D4

    D5R1010k

    R1110k

    R1210k

    R1310k

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina38

    Programa #include "LPC214x.h" #include "cpu_init.h" #include // Biblioteca que define o tamanho exato do tipo primitivo /*------------------------------------------------------------------------------------*/ /* DEFINITIONS AND MACROS */ /*------------------------------------------------------------------------------------*/ #define LINHA_A (1

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina39

    if (!(IOPIN1 & COLUNA_3)){ i = 6; while (!(IOPIN1 & COLUNA_3)){ asm volatile ("NOP");} // Aguarda soltar boto } IOSET1 |= LINHA_B; // Nvel alto na Linha B IOCLR1 |= LINHA_C; // Nvel baixo na Linha C if (!(IOPIN1 & COLUNA_1)){ i = 1; while (!(IOPIN1 & COLUNA_1)); // Aguarda soltar boto } if (!(IOPIN1 & COLUNA_2)){ i = 2; while (!(IOPIN1 & COLUNA_2)); // Aguarda soltar boto } if (!(IOPIN1 & COLUNA_3)){ i = 3; while (!(IOPIN1 & COLUNA_3)); // Aguarda soltar boto } IOSET1 |= LINHA_C; // Nvel baixo na Linha A IOCLR1 |= LINHA_D; // Nvel baixo na Linha A if (!(IOPIN1 & COLUNA_2)){ i = 0; while (!(IOPIN1 & COLUNA_2)); // Aguarda soltar boto } IOSET1 |= LINHA_D; // Nvel alto na Linha D return(i); } //-------------------------------------------------------------------------------------- //--- Rotina Principal ----------------------------------------------------------------- int main (void) { cpu_init(); // Chama a rotina de inicializao da CPU PINSEL0 |= 0x00000000; // Configura PORT0 como entrada/sada (I/O). PINSEL1 |= 0x00000000; // Configura PORT0 como entrada/sada (I/O). IODIR0 |= seg_a|seg_b|seg_c|seg_d|seg_e|seg_f|seg_g; // Configura os pinos que acionam os segmentos como sada IODIR1 |= LINHA_A|LINHA_B|LINHA_C|LINHA_D; // Configura os pinos que acionam as linhas como sada IOCLR0 |= 0xFFFFFFFF; // Fora todos os pinos do PORT0 para nvel baixo IOSET0 |= seg_g; // Liga o segmento g uint8_t k = 10; // Cria uma varivel de 8bit sem sinal (0 a 255) while(1){ k = Varre_Teclado(); // Varre o teclado if (k != 10){ Decimal_to_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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina40

    XTAL162XTAL261

    P0.0/TxD0/PWM1 19P0.1/RxD0/PWM3/EINT0 21

    P0.2/SCL0/CAP0.0 22P0.3/SDA0/MAT0..0/EINT1 26P0.4/SCK0/CAP0.1/AD0.6 27

    P0.5/MISO0/MAT0.1/AD0.7 29P0.6/MOSI0/CAP0.2/AD1.0 30P0.7/SSEL0/PWM2/EINT2 31

    P0.8/TxD1/PWM4/AD1.1 33P0.9/RxD1/PWM6/EINT3 34

    P0.10/RTS1/CAP1.0/AD1.2 35P0.11/CTS1/CAP1.1/SCL1 37

    P0.12/DSR1/MAT1.0/AD1.3 38P0.13/DTR1/MAT1.1/AD1.4 39

    P0.14/DCD1/EINT1/SDA1 41P0.15/RI1/EINT2/AD1.5 45

    P0.16/EINT0/MAT0.2/CAP0.2 46P0.17/CAP1.2/SCK1/MAT1.2 47

    P0.18/CAP1.3/MISO1/MAT1.3 53P0.19/MAT1.2/MOSI1/CAP1.2 54

    P0.20/MAT1.3/SSEL1/EINT3 55P0.21/PWM5/AD1.6/CAP1.3 1

    P0.22/AD1.7/CAP0.0/MAT0.0 2P0.23 58

    P0.25/AD0.4/AOUT 9

    P0.27/AD0.0/CAP0.1/MAT0.1 11P0.28/AD0.1/CAP0.2/MAT0.2 13P0.29/AD0.2/CAP0.3/MAT0.3 14

    P0.30/AD0.3/EINT3/CAP0.0 15

    V323

    RST57

    VREF63

    VSS6

    VSSA59

    P1.16/TRACEPKT0 16P1.17/TRACEPKT1 12P1.18/TRACEPKT2 8P1.19/TRACEPKT3 4

    P1.20/TRACESYNC 48P1.21/PIPESTAT0 44P1.22/PIPESTAT1 40P1.23/PIPESTAT2 36P1.24/TRACECLK 32

    P1.25/EXTIN0 28P1.26/RTCK 24

    P1.27/TDO 64P1.28/TDI 60

    P1.29/TCK 56P1.30/TMS 52

    P1.31/TRST 20

    V343V351

    VSS18VSS25VSS42VSS50

    RTXC13RTXC25

    V3A7

    VBAT49

    P0.31 17

    P0.26/AD0.5 10

    U1

    LPC2138

    3.3V

    X1CRYSTAL

    REQ=12MHz

    C3

    100pF

    1 2 3654

    8 97

    ++0 =

    A

    B

    C

    D

    1 2 43

    D2

    D3

    D4

    D5R210k

    R310k

    R410k

    R510k

    3.3V

    300300300300300300

    SRG8

    R C1/-

    >

    &1D

    13

    24 5 6 10

    8

    11 12

    9

    13

    U274HCT164

    3.3V

    330

    3.3V

    300300300300300300

    SRG8

    R C1/-

    >

    &1D

    13

    24 5 6 10

    8

    11 12

    9

    13

    U374HCT164

    3.3V

    330

    U3(MR)

    300300300300300300

    SRG8

    R C1/-

    >

    &1D

    13

    24 5 6 10

    8

    11 12

    9

    13

    U474HCT

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina41

    XTAL162XTAL261

    P0.0/TxD0/PWM1 19P0.1/RxD0/PWM3/EINT0 21

    P0.2/SCL0/CAP0.0 22P0.3/SDA0/MAT0..0/EINT1 26P0.4/SCK0/CAP0.1/AD0.6 27

    P0.5/MISO0/MAT0.1/AD0.7 29P0.6/MOSI0/CAP0.2/AD1.0 30P0.7/SSEL0/PWM2/EINT2 31

    P0.8/TxD1/PWM4/AD1.1 33P0.9/RxD1/PWM6/EINT3 34

    P0.10/RTS1/CAP1.0/AD1.2 35P0.11/CTS1/CAP1.1/SCL1 37

    P0.12/DSR1/MAT1.0/AD1.3 38P0.13/DTR1/MAT1.1/AD1.4 39

    P0.14/DCD1/EINT1/SDA1 41P0.15/RI1/EINT2/AD1.5 45

    P0.16/EINT0/MAT0.2/CAP0.2 46P0.17/CAP1.2/SCK1/MAT1.2 47

    P0.18/CAP1.3/MISO1/MAT1.3 53P0.19/MAT1.2/MOSI1/CAP1.2 54

    P0.20/MAT1.3/SSEL1/EINT3 55P0.21/PWM5/AD1.6/CAP1.3 1

    P0.22/AD1.7/CAP0.0/MAT0.0 2P0.23 58

    P0.25/AD0.4/AOUT 9

    P0.27/AD0.0/CAP0.1/MAT0.1 11P0.28/AD0.1/CAP0.2/MAT0.2 13P0.29/AD0.2/CAP0.3/MAT0.3 14

    P0.30/AD0.3/EINT3/CAP0.0 15

    V323

    RST57

    VREF63

    VSS6

    VSSA59

    P1.16/TRACEPKT0 16P1.17/TRACEPKT1 12P1.18/TRACEPKT2 8P1.19/TRACEPKT3 4

    P1.20/TRACESYNC 48P1.21/PIPESTAT0 44P1.22/PIPESTAT1 40P1.23/PIPESTAT2 36P1.24/TRACECLK 32

    P1.25/EXTIN0 28P1.26/RTCK 24

    P1.27/TDO 64P1.28/TDI 60

    P1.29/TCK 56P1.30/TMS 52

    P1.31/TRST 20

    V343V351

    VSS18VSS25VSS42VSS50

    RTXC13RTXC25

    V3A7

    VBAT49

    P0.31 17

    P0.26/AD0.5 10

    U1

    LPC2138

    3.3V

    3.3V

    C1

    22pF

    C2

    22pF

    X1CRYSTAL

    FREQ=12MHz

    D1

    DIODE

    R147k

    C3

    100pF

    R252k2

    3.3V

    D714

    D613

    D512

    D411

    D310

    D29

    D18

    D07

    E6

    RW5

    RS4

    VSS

    1VD

    D2

    VEE

    3

    LCDLM016L

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina42

    Programa #include "LPC214x.h" #include "cpu_init.h" #include "iprintf.h" // Separa uma string em caracteres para poder envi-los serialmente #include "lcd.h" // Mdulo com rotinas de inicializao e operao do LCD #include "stdint.h" // Standard C data types #define button (1

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina43

    As mscaras LCD_DATA_MASK, LCD_CONTROL_MASK e LUZ foram definidas no trecho de cdigo DEFINITIONS AND MACROS, como apresentado a seguir: /*------------------------------------------------------------------------------------*/ /* DEFINITIONS AND MACROS */ /*------------------------------------------------------------------------------------*/ #define E (1

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina44

    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

    SCLKMOSIMISOSCLK

    Figura 22 - Comunicao entre o dispositivo mestre (mster) e o escravo (slave)

    utilizando o protocolo SPI.

    SPI Master Slave 01SCLKMOSIMISO

    Slave 02

    Slave 03

    SS

    SCLKMOSIMISO

    SS

    SCLKMOSIMISO

    SS

    SCLKMOSIMISO

    SS

    1SS2SS3

    Figura 23 - Comunicao entre um dispositivo mestre e trs escravos utilizando a

    interface de comunicao SPI.

  • 1Edio03/2011

    Prof.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina45

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina46

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina47

    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.FbioV.R.S.www.lasec.feelt.ufu.br&Eng.GilsonF.P.F.www.sths.com.br Pgina48

    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 Tem