Sei sulla pagina 1di 149

PONTIFCIA UNIVERSIDADE CATLICA DE MINAS GERAIS

Departamento de Cincia da Computao - Campus Poos de Caldas

DESENVOLVIMENTO DE UM KIT DIDTICO UTILIZANDO MICROCONTROLADORES PIC

RENATO VASQUES BERALDO

Poos de Caldas 2006

RENATO VASQUES BERALDO

DESENVOLVIMENTO DE UM KIT DIDTICO UTILIZANDO MICROCONTROLADORES PIC

Trabalho apresentado disciplina de Trabalho de Diplomao do Departamento de Cincia da Computao da Pontifcia Universidade Catlica de Minas Gerais - Campus Poos de Caldas.

Poos de Caldas 2006

B482d

Beraldo, Renato Vasques Desenvolvimento de um kit didtico utilizando microcontroladores PIC. Poos de Caldas, 2006. 152f. Orientador: Prof. M.Sc. Eduardo Barrre CDU 681.31

Renato Vasques Beraldo Desenvolvimento de um kit didtico utilizando microcontroladores PIC

Trabalho apresentado disciplina de Trabalho de Diplomao da Pontifcia Universidade Catlica de Minas Gerais, Poos de Caldas, 2006.

___________________________________________________ Prof. M.Sc. Eduardo Barrre (Orientador) PUC Minas

___________________________________________________ Prof. Dr. Cludio Faria PUC Minas

___________________________________________________ Prof. Dr. Udo Fritzke Junior PUC Minas

Agradecimentos
Primeiramente agradeo a Deus por me iluminar nesta longa caminhada; aos meus pais que nunca deixaram de me apoiar e no mediram esforos durante todo o tempo; a minha namorada Gisele que sempre esteve presente em todos os momentos; homenageio aqui tambm todos que ao longo desta caminhada de alguma forma me ajudaram com ensinamentos, experincias ou at mesmo com a simples amizade; e por ltimo e no menos importante o meu grande e querido amigo orientador prof. M.Sc. Eduardo Barrre, agradeo pela amizade, ateno e dedicao para a concretizao deste trabalho.

Resumo
Neste trabalho esto demonstrados os dados de pesquisa e resultados obtidos para o desenvolvimento de um kit didtico utilizando microcontroladores PIC para ser aplicado em aulas de laboratrio e para projetos isolados dentro de disciplinas do curso de Cincia da Computao. Aps a analise dos resultados obtidos ficou definido que o desenvolvimento do kit vivel, portanto neste trabalho tambm sero abordados assuntos como a montagem do kit e seus elementos, a montagem de um mdulo perifrico bsico que ser utilizado para testar os exemplos contidos neste trabalho, a montagem de um mdulo perifrico de comunicao entre o kit e um microcomputador atravs da porta serial e tambm so sugeridas aplicaes que podem vir a ser desenvolvidas em outros trabalhos. Esto disponibilizados em anexos diversos cdigos-fonte e bibliotecas para testes, alm disso, tambm est em anexo um tutorial explicando como utilizar os softwares abordados neste trabalho.

Abstract
In this work the research data are demonstrated and results gotten for the development of a didactic kit using microcontrollers PIC to be applied in laboratory lessons and for isolated projects inside of you discipline of the course of Computer science. After it analyzes it of the gotten results was definite that the development of the kit is viable, therefore in this work also they will be boarded subjects as the assembly of the kit and its elements, the assembly of basic a peripheral module that will be used to test the examples contained in this work, the assembly of a peripheral module of communication between the kit and a microcomputer through the serial door and also is suggested applications that can come to be developed in other works. Code-source and libraries for tests are disponibilizados in diverse annexes, moreover, also it is in annex a tutorial one explaining as to use softwares boarded in this work.

Sumrio
1 Introduo ...........................................................................................................................15 2 Microcontroladores da Famlia PIC ................................................................................17 2.1 Definio.....................................................................................................................17 2.2 Arquitetura ..................................................................................................................17 2.3 Caractersticas.............................................................................................................20 2.4 Modo de Funcionamento.............................................................................................22 2.5 Aplicaes...................................................................................................................24 3 Mdulo Educacional...........................................................................................................25 3.1 Aplicaes nas Disciplinas..........................................................................................25 3.2 Funcionalidades...........................................................................................................26 3.3 Seleo do Microcontrolador PIC...............................................................................27 4 Kit Microcontrolado...........................................................................................................30 4.1 Arquitetura...................................................................................................................30 4.1.1 O Circuito Gravador........................................................................................31 4.1.2 O Circuito de Clock.........................................................................................31 4.1.3 O Circuito de Alimentao..............................................................................32 4.1.4 O Circuito de Alimentao de Externa............................................................32 4.1.5 O Circuito de Controle de LEDs....................................................................32 4.1.6 O Microcontrolador e suas Portas....................................................................32 4.2 O Circuito do Kit.........................................................................................................33 4.3 Testes...........................................................................................................................35 4.3.1 O Circuito Gravador........................................................................................35 4.3.2 O Circuito de Testes.........................................................................................36 5 Mdulos Perifricos de Interface.......................................................................................38 5.1 Pinos do Microcontrolador..........................................................................................38 5.2 Mdulo Perifrico Bsico............................................................................................42 5.3 Comunicao Serial entre o Kit e o Microcomputador...............................................47

5.4 Memria EEPROM Interna.........................................................................................50 6 Trabalhos Futuros...............................................................................................................51 6.1 Mdulo LCD...............................................................................................................51 6.2 Comunicao entre Kits .............................................................................................53 6.3 Armazenamento de Dados em Memrias...................................................................55 6.3.1 O SPI................................................................................................................55 6.3.2 Memrias EEPROM Serial..............................................................................57 6.3.3 MMC (MultMediaCard) .................................................................................60 7 Concluso.............................................................................................................................61 Referncia Bibliogrfica.......................................................................................................62 A.1 Tabela com Conjunto de Instrues em Linguagem Assembler................................64 B.1 Cdigo utilizado para teste com display de sete segmentos em Linguagem Assembly 66 B.2 Cdigo utilizado para teste com display de sete segmentos em linguagem C............69 C.1 Layout da Placa de Construo do Kit Sem Componentes (vista de trs) e no Tamanho Real...........................................................................................................................71 C.2 Layout da Placa de Construo do Kit Com Componentes e Pontes (vista de frente) 72 D.1 Layout da Placa de Construo do Mdulo Bsico Sem Componentes (vista de trs) e no Tamanho Real ..................................................................................................................73 D.2 Layout da Placa de Construo do Mdulo Bsico Com Componentes e Pontes (vista de frente)...................................................................................................................................73 D.3 Cdigo de exemplo utilizando um display de 7 segmentos anodo comum e o teclado 74 D.4 portas D.5 PWM Cdigo de exemplo utilizando os leds vermelhos para testar o funcionamento das 80 Cdigo de exemplo utilizando o led verde para demonstrar o funcionamento do 82 D.6.1 Cdigo de exemplo para displays de 7 segmentos anodo comum..................83 D.6.2 Cdigo de exemplo para displays de 7 segmentos catodo comum ................87

D.6 Cdigos de exemplo utilizando dois ou mais displays de 7 segmentos.....................83

D.7

Cdigo de exemplo utilizando o led verde para demonstrar o funcionamento do

PWM, o teclado para ajustes no nvel do PWM e displays anodo comum para mostrar o nvel do PWM 91 E.1 Cdigo exemplificando a Transmisso e Recepo de Dados via Comunicao Serial Padro RS-232..........................................................................................................................99 F.1 Cdigo exemplificando a Gravao e Leitura de Dados na Memria EEPROM Interna, Mostrando os Dados Correntes em Displays de 7 Segmentos..................................100 G.1 Conjunto de Comandos para Programar o Mdulo LCD.........................................105 G.2 Biblioteca em C para Manipulao e Programa Fonte para Testes com Mdulo LCD utilizando 4 bits.......................................................................................................................106 H.1 Biblioteca I2C ..........................................................................................................110 I.1 Biblioteca 25640.c.....................................................................................................113 I.2 Exemplo utilizando comunicao serial com microcomputador e leitura / escrita em memria EEPROM 25640......................................................................................................115 J.1 Biblioteca mmc.c.......................................................................................................117 K.1 Variveis de Configurao do Microcontrolador PIC 16F877-A............................122 K.2 Tabela com os Tipos de Dados suportados pelos compiladores CCS......................124 K.3 Tabela com as Principais Funes em Linguagem C para compiladores CCS........125 L.1 Planilha de Microcontroladores Selecionados..........................................................131 M.1 Tutorial.....................................................................................................................132

Lista de Tabelas
Tabela 1: Exemplo de caractersticas de microcontroladores............................................21 Tabela 2: Caractersticas do microcontrolador PIC 16F877-A .........................................28 Tabela 3: Componentes para a construo do kit................................................................34 Tabela 4: Caractersticas dos pinos do PIC16F877-A ........................................................39 Tabela 5: Componentes para a construo do kit................................................................44 Tabela 6: Comandos de 8 bits para SPI................................................................................57 Tabela 7: Funcionalidades dos Pinos da Memria EEPROM 25LC640...........................58

Lista de Figuras
Figura 1: Diagrama de Organizao das Arquiteturas.......................................................18 Figura 2: Diagrama da Arquitetura Interna do PIC 16F877-A.........................................19 Figura 3: Diagrama da Arquitetura do kit...........................................................................30 Figura 4: Modos de Funcionamento do kit...........................................................................31 Figura 5: Foto do kit...............................................................................................................33 Figura 6: Circuito de construo do kit................................................................................33 Figura 7: Circuito de construo do gravador.....................................................................35 Figura 8: Circuito para execuo de testes com display......................................................36 Figura 9: Foto do kit executando cdigo de testes...............................................................37 Figura 10: Pinos do microcontrolador PIC16F877-A........................................................38 Figura 11: Circuito do Mdulo Perifrico de Interface Bsico..........................................44 Figura 12: Diagrama de blocos kit e mdulo perifrico bsico..........................................46 Figura 13: Kit e mdulo bsico trabalhando em conjunto..................................................47 Figura 14: Pinagem porta serial...........................................................................................48 Figura 15: Circuito de Comunicao com Porta Serial utilizando C.I. MAX232...........49 Figura 16: Circuito de Comunicao com Porta Serial utilizando Transistores..............49 Figura 17: Circuito de execuo de testes com mdulo LCD............................................52

Figura 18: Exemplo de barramento para comunicao entre kits.....................................54 Figura 19: Diagrama de Comunicao entre dois Dispositivos utilizando SPI. ..............56 Figura 20: Diagrama de Comunicao entre um mestre e diversos dispositivos escravos utilizando SPI. .......................................................................................................................56 Figura 21: Pinos da memria EEPROM 24LC16B. ..........................................................57 Figura 22: Conexo de um MMC ao microcontrolador. ...................................................60

Lista de Abreviaturas
ALU BCD C.I. CPU CS EEPROM ENIAC I/D I/O I2C ICSP LCD MMC OTP PIC PWM R/W RAM RISC ROM RS SI SO SPI SPI USART USB Arithmetic Logic Unit Binary Coded Decimal Circuitos Integrados Unidade Central de Processamento Chip Select Electrically Erasable Programmable Read-Only Memory Electronic Numerical Integrator and Computer Instruction / Data Input / Output Inter Integrated Comunication In-Circuit Serial Programming Liquid Crystal Display Mult Media Card One Time Programmable Peripherals Interface Controller Pulse Width Modulation Read / Write Random Access Memory Reduced Instruction Set Computer Read Only Memory Register Selector Serial In Serial Out Serial Port Interface Serial Peripheral Interface Universal Synchronous Asynchronous Receiver Transmitter Universal Serial Bus

15

Introduo
Os sistemas computacionais passaram por uma grande evoluo desde a dcada de 40,

onde foram desenvolvidas as primeiras mquinas de calcular, como por exemplo, o Electronic Numerical Integrator and Computer (ENIAC). Essas mquinas foram construdas a partir de vlvulas que eram ativadas e desativadas conforme a necessidade. Devido ao seu grande porte as mquinas ocupavam muito espao, tinham alto custo e eram de difcil operao. Na dcada de 50 um novo tipo de componente eletrnico foi desenvolvido, o transistor, cujo custo de produo era baixo e seu porte bem menor do que o das vlvulas, ocasionando consequentemente substituio destas pelos transistores. Em meados da dcada de 60 surgiram os circuitos integrados (C.I.s), chips que tinham como base para sua fabricao os transistores. Estes chips possuam vrias funes embutidas e podem ser considerados os pais dos microcontroladores e dos microprocessadores. Em 1970 a Intel recebeu a encomenda de alguns C.I.s para calculadoras e um de seus engenheiros props a fabricao de um C.I. que contivesse um programa armazenado e este determinaria as suas funes, surgindo assim os microprocessadores. A partir desta descoberta, a Intel lanou em 1974 um microprocessador que poderia executar diversas funes. Desde ento, a evoluo no parou e hoje temos microprocessadores com ncleo duplo ou mais. Por volta de 1974, alm dos microprocessadores, foram desenvolvidos os microcontroladores, que nada mais so do que microprocessadores com vrios perifricos integrados em um nico chip, como por exemplo, random access memory (memria de acesso randmico memria RAM), contadores, interface para dispositivos de Input / Output (entrada / sada, I / O), etc. (MATIC, 2003). Com o avano dos sistemas computacionais (hardware e software) um novo conceito chamado de Computao Embarcada ou Computao Invisvel vem sendo desenvolvido junto com a crescente disponibilidade de aparelhos e dispositivos que no efetuam uma computao convencional, citando como exemplo sistemas que controlam computadores de

16

bordo, sensores, painis de equipamentos eletrnicos, controle de trao em carros, celulares, robs, pen-drives e palms. O conceito de sistemas embarcados se aplica aos sistemas onde um microprocessador e toda a sua estrutura tornariam invivel a sua implantao. (BASSO, 2004). Alm dos sistemas embarcados, os microcontroladores tem sua importncia para o aprendizado sendo empregados na construo de kits didticos para alunos de diversos cursos. Este trabalho tem como objetivo o desenvolvimento de um kit didtico de baixo custo e com uma vasta gama de aplicaes. Antes de ser escolhida a famlia de microcontroladores a serem empregados no kit, foram realizadas pesquisas analisando os vrios tipos de microcontroladores e suas respectivas famlias. Aps estes estudos, a famlia de microcontroladores escolhida para utilizao no kit foi famlia PIC ou Peripherals Interface Controller (Interface Controladora de Perifricos) da Microchip Technology Inc. O captulo 2 destaca os conceitos bsicos sobre os microcontroladores PIC e seu modo de operao. O captulo 3 traz informaes sobre o mdulo educacional ou kit didtico como comumente chamado neste trabalho. O captulo 4 dedicado construo e testes dos circuitos que compem o kit didtico microcontrolado. O captulo 5 apresenta a descrio dos pinos do microcontrolador alm de trazer a implementao de um mdulo bsico de interface e um mdulo de comunicao serial. O captulo 6 demonstra possveis mdulos que podem ser construdos para serem utilizados com o kit. Treze anexos fecham este trabalho com informaes complementares, como as instrues para programao do microcontrolador, diversas bibliotecas de software, o layout das placas do kit e dos mdulos e cdigos fonte para testes.

17

2 Microcontroladores da Famlia PIC


Os microcontroladores PIC so fabricados pela Microchip Technology Inc (MICROCHIP, 2006), empresa norte-americana fundada em 1989, que alm de microcontroladores tambm fabrica memrias seriais (I2C e SPI), produtos para segurana (Keeloq), identificadores por RF (RFID), conversores Analgico/Digitais, circuito integrado de superviso de funcionamento(Brown out) e amplificadores operacionais.

2.1 Definio
O nome PIC vem de Peripherals Interface Controller (interface controladora de perifricos), tendo como principais caractersticas incorporarem internamente a unidade central de processamento (CPU), memrias de programa e dados e vrios perifricos como timers, watchdog timers, comunicao serial, conversores analgicos digitais, geradores de Pulse Width Modulation (modulao por largura de pulso PWM), etc. Suas instrues so do tipo Reduced Instruction Set Computer (computador com nmero de instrues reduzidas RISC) e sua arquitetura do tipo Harvard.

2.2 Arquitetura
A grande maioria dos computadores atuais utiliza a arquitetura de Von Neumann, onde o programa (instrues) e dados so armazenados em uma mesma memria. Nos microcontroladores PIC a arquitetura utilizada a de Harvard, que utiliza memrias separadas (memria de dados e memria de programa) e barramento distinto para acesso as mesmas. O diagrama da figura 1 ilustra a organizao das duas arquiteturas.

18

Memria de Programa e Dados

CPU

Arquitetura Von Neumann

Memria de Programa

CPU

Memria de Dados

Arquitetura Harvard
Figura 1: Diagrama de Organizao das Arquiteturas. FONTE: (MATIC, 2003).

A arquitetura de Harvard proporciona ganho de desempenho devido possibilidade de ler/escrever instrues e dados concorrentemente, mas em contrapartida isto torna sua utilizao mais cara e complexa, por isso ela geralmente utilizada em microcontroladores e processadores de sinais. (MARKS, 2006). Os microcontroladores que possuem arquitetura Harvard tm seu conjunto de instrues reduzido (instrues do tipo RISC) proporcionando ganho de desempenho, uma vez que cada instruo leva apenas um ciclo de clock para ser executada (exceto no caso de instrues de salto e ramificaes). A utilizao deste tipo de instrues torna possvel o paralelismo na execuo de instrues devido ao uso de pipelining. Os microcontroladores PIC, como anteriormente mencionado, possuem internamente vrias estruturas podendo ser citadas entre estas a CPU tambm conhecida como Arithmetic Logic Unit (Unidade Lgico Aritmtica ULA em portugus ou ALU em ingls), conversor analgico/digital e timers. A figura 2 ilustra a organizao interna do microcontrolador PIC 16F877-A.

19

Figura 2: Diagrama da Arquitetura Interna do PIC 16F877-A. FONTE: (MICROCHIP, 2006).

Entre as diferenas bsicas das arquiteturas de Von Neumann e de Harvard (vide figura 1), nota-se que nos microcontroladores (arquitetura de Harvard) as memrias so separadas em memria de dados e memria de programa. A memria de dados dividida em mltiplos bancos e contm registradores de funes especiais e registradores de uso geral. Entre os registradores de funes especiais esto o registrador TMR0, o contador de programa (PC), o registrador de status, os registradores de I/O e o registrador de seleo (FSR). Alm disso, os registradores de funes especiais so utilizados para controlar as configuraes das portas de I/O. J os registradores de uso geral so utilizados para dados e controle de informaes sob comandos das instrues.

20

A memria de programa, alm de armazenar a aplicao que ser executada pelo microcontrolador, tambm armazena o vetor de interrupes e o vetor de reset, sendo importante salientar que a memria de programa no pode ser acessada diretamente. (MICROCHIP, 2006).

2.3 Caractersticas
A famlia de microcontroladores PIC muito extensa para ser abordada em sua totalidade, podendo ser dividida em subgrupos cada qual com suas particularidades. As principais caractersticas so: Arquitetura do barramento de dados: 8 bits e 16 bits; Tipo da Memria o Flash: Tipo de memria que pode ser apagada e/ou escrita ilimitadas vezes; o OTP (One Time Programmable, programvel uma nica vez): Tipo de memria que s pode ser programada/escrita uma nica vez; o ROM (Read only memory, memria de somente leitura): Tipo de memria utilizada quando o microcontrolador somente ir executar uma funo no circuito, portanto no necessidade de reprogramao. Memria RAM (medida em bytes); Memria de Programas (espao destinado gravao do programa, medido

em Kwords); Velocidade de Clock: variando de 4MHz a 64MHz de clock mximo; Quantidade de Pinos: variando entre 6 e 100 pinos; Quantidade de Pinos de I/O: variando de 0 a 70 pinos configurveis como I/O;

21

Protocolo de Comunicao com o microcomputador: USB, Serial e Ethernet.

A prpria fabricante dos microcontroladores PIC possui uma diviso que consiste em agrupar os PICs em subfamlias de acordo com suas caractersticas principais. Estas subfamlias so: PIC 10, PIC 12, PIC 14, PIC 16, PIC 17, PIC 18 e PIC 24. A tabela 1 exibe as caractersticas de dois microcontroladores da famlia PIC. Tabela 1: Exemplo de caractersticas de microcontroladores MODELO Arquitetura Tipo da Memria de Programa Tamanho da Memria de Programa Tamanho da Memria de Dados Tamanho da Memria Ram Quantidade de Pinos de I / O Quantidade Total de Pinos Velocidade de Clock Mximo Protocolo de Comunicao com Microcomputador
FONTE: (MICROCHIP, 2006)

PIC 16F877-A 8 bits Flash 14 Kbytes / 8 Kwords 256 bytes 368 bytes 33 pinos 40 pinos 20 MHz AUSART MIC Compatible/SPI

PIC 18F2455 8 bits Flash 24 Kbytes / 12 Kwords 256 bytes 2048 bytes 23 pinos 28 pinos 48 MHz EUSART MIC Compatible/SPI USB 2.0

Alm das caractersticas descritas acima, temos outras que so comuns em todas as subfamlias de microcontroladores PIC, como exemplo: Tipo de oscilador externo: RC (baixo custo), XT (cristal padro), HS (cristal de

alta velocidade) e LP (cristal de baixa freqncia); Proteo de Cdigo Programvel; Modo de baixo consumo de energia (SLEEP); 4 bytes para identificao do microcontrolador programveis;

22

Temporizador e Contadores Internos.

Algumas destas caractersticas so habilitadas por linhas de comando no cdigo fonte da aplicao ou at mesmo no software de transferncia.

2.4 Modo de Funcionamento


De um modo geral, os microcontroladores necessitam de um hardware especial para fazer a transferncia do programa a ser executado para a sua memria de programa. No caso dos microcontroladores PIC este hardware chamado de gravador. Existem vrios gravadores para microcontroladores PIC, alguns so produzidos pela prpria fabricante do microcontrolador e h tambm disponveis em livros e na internet gravadores similares (PABLIN, 2005; JDM,2000; INSTRUCTABLES, 2006; MARKS, 2006), com custo relativamente baixo em relao aos gravadores da Microchip Technology Inc. O objetivo deste trabalho foi desenvolver um kit de baixo custo e para tal foram realizadas vrias pesquisas e testes com os gravadores disponveis em livros e na internet. O resultado obtido com os testes levou a escolha de um gravador cuja interface com o computador feita via porta serial, mas h tambm gravadores de interface paralela e USB. Os gravadores paralelos utilizam fonte de energia externa, pois a porta paralela no consegue fornecer tenses apropriadas para a gravao, elevando o custo e inviabilizando assim a sua construo. J os gravadores USB so mais complexos de serem desenvolvidos uma vez que a gravao dos microcontroladores PIC feita serialmente. Portanto, para se desenvolver um gravador USB seria necessrio conhecer como feita a converso dos dados USB para serial. Antes de ser desenvolvido o gravador que ser utilizado no kit, foram pesquisados, descarregados e testados a maioria dos softwares livres utilizados para a transferncia da aplicao desenvolvida para o microcontrolador, pois era necessrio saber se estes softwares suportavam o gravador. O software que se adequou melhor s necessidades foi o IC-PROG que no precisa ser instalado, deve apenas ser descarregado e descompactado. (IC-PROG, 2005).

23

Para o desenvolvimento da aplicao necessrio que se tenha um software que possibilite ao desenvolvedor escrever o cdigo fonte e compil-lo. Como este kit ser utilizado para fins didticos desejvel tambm que este software oferea ferramentas que possibilitem a simulao da aplicao antes mesmo de ser gravada no microcontrolador. A prpria Microchip coloca a disposio em seu sitio um software para desenvolvimento das aplicaes, o MPLAB-IDE (MICROCHIP, 2006) que possui boas ferramentas para suporte ao desenvolvedor, este deve ser descarregado do stio e instalado. Abaixo esto descritos os passos que devem ser seguidos para colocar o microcontrolador em operao: 1 2 3 Ter todos os softwares necessrios para o desenvolvimento j operando; Ter os circuitos de gravao e de clock j montados; Definida a aplicao que o microcontrolador ir executar, esta dever ter seu

cdigo escrito e compilado; 4 Se no houver erros de compilao, o cdigo hexadecimal ser gerado e estar

pronto para ser gravado no microcontrolador; 5 Com o cdigo hexadecimal gerado, o gravador poder ser conectado ao

microcomputador e tambm ao microcontrolador; 6 Carrega-se o cdigo hexadecimal no software de transferncia e se necessrio

podem ser feitos ajustes em algumas configuraes no software; 7 Com o cdigo hexadecimal carregado, j possvel executar a gravao no

microcontrolador; 8 Se no houver erros de gravao o microcontrolador j estar com a aplicao

armazenada em sua memria de programa; 9 Agora o microcontrolador j pode ser conectado no circuito de clock e tambm

ao circuito da aplicao;

24

10

Finalmente poder ser ligada fonte de energia que alimentar o circuito

possibilitando a visualizao da aplicao em execuo. Caso os resultados obtidos tenham sido os esperados, isso comprova que todos os passos foram executados de forma correta.

2.5 Aplicaes
Aps serem realizadas vrias pesquisas para identificar as possveis aplicaes para microcontroladores, descobriu-se a existncia de inmeras utilidades para eles. Os microcontroladores PIC (MICROCHIP, 2006) so utilizados nas indstrias automobilsticas (controle de freios, controle de trao, etc.), em eletrodomsticos (controlando os displays que mostram informaes, processando comandos de controle remoto, etc.) e em robtica, por exemplo. Isto comprova que os microcontroladores esto em todos os lugares onde necessrio processamento de dados e que seria invivel a utilizao de um microcomputador.

25

3 Mdulo Educacional
O principal objetivo deste projeto a construo de um kit didtico, para ser utilizado em aulas de laboratrio das disciplinas de Organizao de Computadores e Arquitetura de Computadores da PUC MINAS campus de Poos de Caldas.

3.1 Aplicaes nas Disciplinas


As disciplinas de Organizao de Computadores e Arquitetura de Computadores j possuem em suas aulas de laboratrio um kit, porm este apresenta restries, alm de ser de difcil manuteno e usabilidade. Este foi um dos principais motivos para o desenvolvimento deste kit didtico. O kit desenvolvido ser mais prtico de ser utilizado e proporcionar melhor rendimento e aprendizado nas aulas. A disciplina de Organizao de Computadores tem como objetivo expor aos alunos o funcionamento da programao de microprocessadores em sua linguagem nativa (assembly) e tambm apresentar sua organizao interna. Nesta disciplina o kit ser empregado para o aprendizado da linguagem nativa (nvel bsico), onde o aluno poder programar o kit com aplicaes definidas pelo professor e realizar simulaes para verificao de resultados. Tambm dentro desta mesma disciplina o aluno poder desenvolver projetos isolados, como por exemplo, controle de dispositivos e implementao de perifricos. A disciplina de Arquitetura de Computadores uma continuao da disciplina de Organizao de Computadores, tendo os mesmos objetivos, porm com nvel de conhecimento mais aprofundado. O kit tambm ser utilizado para simulaes e desenvolvimento de aplicaes definidas pelo professor, porm proporcionando ao aluno o nvel de aprendizado intermedirio da linguagem nativa. Fora da disciplina o aluno poder desenvolver projetos avanados como, por exemplo, a comunicao entre dispositivos microcontrolados, troca de dados entre o kit e um computador (compartilhamento de recursos) e aplicaes no convencionais. O kit tambm poder ser programado em linguagem C, ficando a cargo do(s) professor(es) escolher(em) se ser abordado ou no este tipo de programao.

26

No anexo A est disponibilizada uma tabela contendo o conjunto de instrues em linguagem Assembler. As funes utilizadas para programao em linguagem C no sero abordadas em sua totalidade, pois variam de compilador para compilador (anexo K).

3.2Funcionalidades
Os laboratrios, como j citados, possuem kits que so de difcil usabilidade. O aluno tem que desenvolver o cdigo (linguagem nativa) da sua aplicao e depois consultar datasheets (manuais) para fazer a converso deste para a linguagem aceita pelo kit (codificao em cdigos hexadecimais). Toda essa converso feita manualmente gerando o cdigo hexadecimal da aplicao, que inserido no kit atravs de um teclado j acoplado. Neste processo erros so inadmissveis, pois, se um cdigo for convertido erroneamente toda a sua aplicao estar comprometida fazendo com que o desenvolvedor (aluno) tenha o trabalho de verificar linha por linha de cdigo a fim de detectar o erro. J se o erro ocorreu na insero dos cdigos hexadecimais no kit todo o seu cdigo ter que ser inserido novamente. O kit desenvolvido neste projeto no funciona desta maneira o que melhora muito o rendimento da sua aplicao. Quando em modo de operao o processo de codificao da aplicao e transferncia deve ocorrer da seguinte forma: O aluno poder desenvolver o cdigo da sua aplicao, em linguagem nativa

(assembly) ou em linguagem C no microcomputador, ficando a cargo do professor a definio de qual linguagem ser utilizada; O microcomputador ter um software compilador, que por sua vez, fica

encarregado de converter o cdigo da aplicao em cdigo hexadecimal prprio para o microcontrolador do kit; Gerado o arquivo com o cdigo hexadecimal da aplicao, este isento de erros

de converso, estando pronto para ser transferido para o microcontrolador presente no kit; A transferncia do cdigo hexadecimal armazenado no microcomputador para o

microcontrolador do kit feito atravs de um software de transferncia que deve estar previamente instalado e de um gravador que j vem embutido no kit;

27

O software de transferncia fica encarregado de transformar o cdigo hexadecimal

em sinais eltricos que ativam o circuito de gravao, que por fim ativa determinados pinos do microcontrolador, que entende estes sinais e os guardam em sua memria de programa ficando assim disponvel para execuo e testes. As vantagens do kit desenvolvido para o kit j utilizado nas aulas de laboratrio so as seguintes: A aplicao desenvolvida para o kit poder ser programada tanto em assembly ou

linguagem C; Oferece um software onde podem ser simulados os cdigos da aplicao antes de

serem transferidos para o microcontrolador do kit; O kit prover interface para mdulos de perifricos variados, abrangendo

displays, teclados, motores de passo, etc., alm de poder ser utilizado com mdulos implementados pelos prprios alunos como, por exemplo, um testador de cabos de rede; Por ser um kit de baixo custo, proporcionar aos alunos a oportunidade de

adquirirem ou at mesmo a universidade disponibiliz-los para emprstimo, permitindo aos alunos colocarem seus conhecimentos em prtica fora do ambiente de laboratrio.

3.3

Seleo do Microcontrolador PIC


Existem em fabricao mais de 150 (cento e cinqenta) modelos de

microcontroladores da famlia PIC. Visto que o projeto tem como meta desenvolver um kit didtico com baixo custo de produo, importante que os softwares utilizados para gravao e para codificao da aplicao sejam livres ou sem custo de licenas. Os principais critrios de seleo em ordem de anlise foram: disponibilidade em mercado, custo, compatibilidade com softwares livres ou sem custo de licena, quantidades de pinos de I/O, quantidade de memria (RAM e para programas) e velocidade de clock.

28

Foram montadas planilhas (anexo L) seguindo os critrios acima, selecionamos os microcontroladores que apareceram mais vezes em destaque sendo estes separados e possibilitando assim, o descarte de boa parte dos modelos. Com uma gama j reduzida de modelos, foi possvel analisar melhor as caractersticas de cada um. Alguns microcontroladores, por serem mais avanados, ainda no so suportados pelo software de gravao escolhido (o ICPROG), sendo descartada a possibilidade de utilizao destes no kit, pois o software de gravao escolhido funcionou perfeitamente com o gravador desenvolvido. Comparando os modelos pr-selecionados com os utilizados em livros, tutoriais e artigos constatou-se que os mesmos eram utilizados como base em muitos destes. Entramos em contato com um dos autores citado na referncia bibliogrfica (ZANCO, 2006) pedindo ajuda na escolha do modelo e ele nos atendeu prontamente indicando o mesmo microcontrolador que ele utilizou como base para escrever o livro. Acatando a sugesto do autor foi definido que o modelo utilizado para os primeiros testes seria o PIC 16F877-A I/P que tem suas caractersticas principais citadas na tabela 2. importante ressaltar que este constava como um dos modelos pr-selecionados. Tabela 2: Caractersticas do microcontrolador PIC 16F877-A MODELO Arquitetura Tipo da Memria de Programa Tamanho da Memria de Programa Tamanho da Memria de Dados Tamanho da Memria Ram Quantidade de Pinos de I / O Quantidade Total de Pinos Velocidade de Clock Mximo Protocolo de Comunicao com Microcomputador Conversor Analgico / Digital PIC 16F877-A 8 bits Flash 14 Kbytes / 8 Kwords 256 bytes 368 bytes 33 pinos 40 pinos 20 MHz AUSART MIC Compatible/SPI 10 bits

29

MODELO Nmero de Timers Nmero de Portas de I/O


FONTE: (MICROCHIP, 2006)

PIC 16F877-A 3 5

30

4 Kit Microcontrolado
Este captulo aborda as principais caractersticas sobre o kit desenvolvido e expem os circuitos e testes que foram efetuados.

4.1Arquitetura
A arquitetura proposta para este kit consiste em um circuito que pode ser dividido em circuitos menores que so: o circuito gravador, o circuito de clock, o circuito de alimentao, o circuito de alimentao externa, o circuito de controle de leds e o microcontrolador com suas portas separadas. Com o circuito do kit montado a conexo com os perifricos ser feita atravs de cabos, pois os perifricos sero modulares tendo assim a possibilidade de vrias configuraes. O diagrama da figura 3 ilustra a arquitetura do kit.

Gravador Seleo de Entrad as Microcontrolador

Alimentao

Clock

Habilita ou Desabilit a Controle de Leds Portas de I/O

Alimentao Externa

Figura 3: Diagrama da Arquitetura do kit.

31

O diagrama da figura 4 ilustra os modos de funcionamento (gravao e execuo) do kit.

Figura 4: Modos de Funcionamento do kit.

Cada parte da arquitetura tem uma determinada funcionalidade para o kit e sero detalhadas a seguir.

4.1.1 O Circuito Gravador


O circuito gravador o meio de ligao entre o microcomputador e o microcontrolador sendo responsvel pela gravao da aplicao desenvolvida na memria de programa do microcontrolador. O circuito de gravao fica encarregado de ativar as portas do microcontrolador para recepo do programa.

4.1.2 O Circuito de Clock

32

O circuito de execuo responsvel pela ativao do microcontrolador para execuo do programa armazenado na memria ficando encarregado de definir a velocidade (clock, em MHz) em que o microcontrolador ir operar.

4.1.3 O Circuito de Alimentao


O circuito de alimentao possui uma entrada de energia (cinco volts e terra). Este serve para a alimentao do circuito de clock e do microcontrolador (enquanto estiver sendo executada uma aplicao).

4.1.4 O Circuito de Alimentao de Externa


O circuito de alimentao externa formado por uma ponte entre o circuito de alimentao e algum circuito externo que necessite de alimentao (cinco volts e terra) para operar, no necessitando da utilizao de outra fonte.

4.1.5 O Circuito de Controle de LEDs


O circuito de controle de leds composto por trs leds que servem para indicar o estado em que o kit se encontra: Led amarelo aceso: indica que a fonte de alimentao est conectada ao kit; Led vermelho aceso: indica que o kit est operando em modo de gravao; Led verde aceso: indica que o kit est operando em modo de execuo.

4.1.6 O Microcontrolador e suas Portas


O microcontrolador a ser utilizado no kit possui 33 pinos de I/O que so divididos em cinco portas (A, B, C, D, E), cada qual com um nmero determinado de pinos: A, seis pinos; B, C e D, oito pinos e a porta E com trs pinos. Estas portas na sua maioria no tm a sua distribuio de pinos em seqncia no microcontrolador. A porta C, por exemplo, est distribuda entre os pinos de 15 a 18 e de 23 a 26 do microcontrolador. Por isso foi definido que no circuito do kit seria utilizada uma interface distinta para cada porta. Essa medida facilitar a manuteno e a usabilidade do kit.

33

4.2 O Circuito do Kit


O circuito do kit ser montado sobre uma placa de cobre nica, contendo todos os itens que compem a arquitetura do kit discutidos na seo 4.1.. A seguir na figura 5 est uma foto do kit aps a sua construo com base no circuito ilustrado na figura 6, que contm as ligaes e o posicionamento dos componentes do kit.

Figura 5: Foto do kit. Figura 6: Circuito de construo do kit.

34

Os componentes utilizados para a construo do kit esto listados na tabela 3. Tabela 3: Componentes para a construo do kit NOME DO COMPONENTE Cabo flat IDE Capacitor cermico 22pF Capacitor eletroltico 100F-40V Capacitor eletroltico 22F-40V Conector DB9 fmea para cabo Conector DB9 macho para cabo Conector DB9 macho para placa Jack para fonte Led Amarelo Led Verde Led Vermelho Microcontrolador PIC 16F877A I/P Oscilador de 4MHz Placa de Cobre 10 x 15 cm Resistor 10K Resistor 1K5 Resistor 200 Resistor 560 Socket para CI de 40 pinos Socket torneado para CI de 14 pinos Socket torneado para CI de 8 pinos Transistor 1N4148 Transistor 5V1 Transistor 8V2 Transistor BC547 ID NA PLACA MICRO C4, C5 C1 C2 MICRO GRAV, EXEC DB9_GRAVACAO COM_FONTE L2 L3 L1 PLUGADO NO SOCKET_40PIN O1 R4 R1 R5, R6, R7 R2, R3 SOCKET_40PIN
PORTA_A, PORTA_E PORTA_B, PORTA_C, PORTA_D

QUANTIDADE 1 2 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3 2 1 1 3 5 1 1 2

D1, D2, D5, D6 D7 D3 D4 T1, T2

35

4.3 Testes
Para comprovar o funcionamento dos circuitos que iro compor o kit foram realizados vrios testes at se chegar ao circuito considerado ideal. A seguir sero descritos estes testes.

4.3.1 O Circuito Gravador


O circuito gravador uma pea chave do kit, pois sem ele no podemos transferir a aplicao para o microcontrolador, sendo assim, dever receber ateno especial. Antes da construo do gravador que foi utilizado na fase de testes, estudaram-se vrios tipos: com fonte de alimentao externa, com interface com o microcomputador via porta paralela, com interface com o microcomputador via porta serial, etc. Alguns at chegaram a ser montados no protoboard (matriz de contatos) e testados, mas no apresentaram resultados satisfatrios. Continuando as pesquisas foi descoberto um gravador que se tivesse seu circuito adaptado s exigncias do projeto seria ideal, pois era de fcil construo e de baixo custo, alm de gravar vrios modelos de microcontroladores da famlia PIC. O circuito escolhido derivado de um famoso gravador disponvel na internet (JDM, 2000), o JDM PROGRAMMER, que pode ser modificado livremente desde que no tenha suas caractersticas funcionais alteradas. Em um dos livros citados na bibliografia (ZANCO, 2006) h o esquema de um gravador que baseado no JDM PROGRAMMER e a partir deste foram feitas adaptaes de acordo com as necessidades do projeto chegando ao circuito gravador apresentado na figura 7.

Figura 7: Circuito de construo do gravador.

36

Com o circuito do gravador da figura 6 montado no protoboard foi possvel testar seu efetivo funcionamento. Utilizando um exemplo de cdigo fonte de um livro (ZANCO, 2006), foi feito todo o processo at se obter o cdigo hexadecimal e de posse deste efetuaram-se testes de gravao no microcontrolador. O circuito gravador funcionou, porm o cdigo no estava de acordo com os resultados esperados. Passamos agora a fase de teste de execuo no microcontrolador.

4.3.2 O Circuito de Testes


O circuito utilizado para testes era composto pelo circuito de clock, um display de sete segmentos e o microcontrolador j com a aplicao provavelmente gravada. A figura 8 ilustra o circuito utilizado para testes. No tnhamos como testar antes o funcionamento do gravador, pois somente com o teste completo que poderia ser comprovado o seu funcionamento.

Figura 8: Circuito para execuo de testes com display. FONTE: (ZANCO, 2006)

A aplicao escolhida para o teste tinha como objetivo efetuar a contagem de 0 a 9 mostrando os nmeros correntes no display. O resultado obtido neste primeiro teste indicou que o circuito de gravao e de clock funcionaram perfeitamente. O nico problema foram os nmeros apresentados no display que no estavam corretos, porm este era um problema no cdigo da aplicao, que posteriormente seria resolvido.

37

O software utilizado no desenvolvimento da aplicao, o MPLAB-IDE (MICROCHIP, 2006), possui acoplado em sua interface uma ferramenta poderosa para debugger, que permite a simulao do cdigo da aplicao podendo acompanhar passo a passo a sua execuo. Esta ferramenta foi utilizada para simular e detectar os problemas no cdigo (anexo B) que foram corrigidos e gravados no microcontrolador. No segundo teste os resultados de execuo da aplicao foram os esperados, o microcontrolador efetuou a contagem e mostrou corretamente os dgitos no display. A figura 9 mostra o kit em funcionamento com o cdigo utilizado para testes.

Figura 9: Foto do kit executando cdigo de testes.

Com os testes realizados podemos concluir que os circuitos funcionam e que o microcontrolador pode ser utilizado juntamente com estes para compor o kit. O layout da placa para construo do kit est disponvel em tamanho real no anexo C.

38

5 Mdulos Perifricos de Interface


Aps a realizao dos testes que comprovaram o funcionamento do kit, so abordados neste captulo, os principais mdulos perifricos de interface que iro compor o conjunto de experincias ilustradas na apostila que ser disponibilizada juntamente com o kit e a metodologia para desenvolvimento de novos mdulos.

5.1

Pinos do Microcontrolador
Antes de iniciar o desenvolvimento dos mdulos perifricos de interface necessrio o

conhecimento detalhado de cada pino do microcontrolador, pois s assim ser obtido xito na construo do mdulo. A figura 10 mostra o diagrama com os pinos do microcontrolador PIC16F877-A os quais sero detalhados a seguir. Lembrando que o microcontrolador PIC16F877-A o microcontrolador utilizado no kit.

Figura 10: Pinos do microcontrolador PIC16F877-A FONTE: (ZANCO, 2006)

Os pinos e as suas respectivas caractersticas so descritas na tabela 4.

39

Tabela 4: Caractersticas dos pinos do PIC16F877-A NMER O DO PINO 1 1 2

PORTA

MODO DE CARACTERSTICAS OPERAO MCLR (Master Clear Reset ) / Vpp: Entrada de tenso de programao. Entrada de tenso de alimentao. RA0: I/O digital. AN0: Entrada analgica. RA1: I/O digital. AN1: Entrada analgica. RA2: I/O digital. AN2: Entrada analgica. Vref-: Entrada de tenso baixa para o conversor analgico/digital. CVref: Sada do comparador Vref. RA3: I/O digital. AN3: Entrada analgica. Vref+: -: Entrada de tenso alta para o conversor analgico/digital. RA4: I/O digital. T0CKI: Entrada de clock externo para o Timer0. C1OUT: Sada do comparador 1. RA5: I/O digital. AN4: Entrada analgica. SS: Seletora de entrada escrava (SPI). C2OUT: Sada do comparador 2. RE0: I/O digital. RD: Controle de leitura para porta paralela escrava. AN5: Entrada analgica. RE1: I/O digital. WR: Controle de escrita para porta paralela escrava. AN6: Entrada analgica.

Gravao Execuo Execuo

Execuo

Execuo

Execuo

Execuo

Execuo

Execuo

Execuo

40

NMER O DO PINO

PORTA

MODO DE CARACTERSTICAS OPERAO RE2: I/O digital. CS: Controle de seleo de chip para porta paralela escrava. AN7: Entrada analgica. Vdd: Entrada de tenso alta para alimentao das portas lgicas e pinos de I/O. Vss: Entrada de tenso baixa para alimentao das portas lgicas e pinos de I/O. OSC1: Entrada do oscilador de cristal. CLKIN: Entrada externa da fonte de clock. Lembrando que este pino est sempre associado ao pino 14 (OSC2 / CLKOUT). OSC1: Sada do oscilador de cristal. CLKOUT: Sada externa da fonte de clock. RC0: I/O digital. T1OSO: Sada do oscilador do Timer1. T1CLKI: Entrada de clock externo para Timer1. RC1: I/O digital. T1OSI: Entrada do oscilador do Timer1. CCP2: Entrada do capturador2 / Sada do comparador2 / Sada do PWM2. RC2: I/O digital. CCP1: Entrada do capturador1 / Sada do comparador1 / Sada do PWM1. RC3: I/O digital. SCK: I/O de clock serial sncrono para modo SPI. SCL: I/O de clock serial sncrono para I2C. RD0: I/O digital. PSP0: Dados da porta paralela escrava. RD1: I/O digital. PSP1: Dados da porta paralela escrava.

10

Execuo

11

Execuo

12

Execuo

13

Execuo

14

Execuo

15

Execuo

16

Execuo

17

Execuo

18

Execuo

19

Execuo

20

Execuo

41

NMER O DO PINO 21

PORTA

MODO DE CARACTERSTICAS OPERAO RD2: I/O digital. PSP2: Dados da porta paralela escrava. RD3: I/O digital. PSP3: Dados da porta paralela escrava. RC4: I/O digital. SDI: Sada de dados da SPI. SDA: I/O de dados do I2C. RC5: I/O digital. SDO: Entrada de dados da SPI. RC6: I/O digital. TX: Transmisso assncrona USART. CK: Clock sncrono USART1. RC7: I/O digital. RX: Recepo assncrona USART. DT: Dado sncrono USART. RD4: I/O digital. PSP4: Dados da porta paralela escrava. RD5: I/O digital. PSP5: Dados da porta paralela escrava. RD6: I/O digital. PSP6: Dados da porta paralela escrava. RD7: I/O digital. PSP7: Dados da porta paralela escrava. Vss: Entrada de tenso baixa para alimentao das portas lgicas e pinos de I/O. Vdd: Entrada de tenso alta para alimentao das portas lgicas e pinos de I/O. RB0: I/O digital.

Execuo

22

Execuo

23

Execuo

24

Execuo

25

Execuo

26

Execuo

27

Execuo

28

Execuo

29

Execuo

30

Execuo Execuo / Gravao Execuo / Gravao Execuo

31

32 33

42

NMER O DO PINO

PORTA

MODO DE CARACTERSTICAS OPERAO INT: Interrupo externa.

34 35 36 36 37 38 39 39 40 40

B B B B B B B B B B

Execuo Execuo Gravao Execuo Execuo Execuo Gravao Execuo Gravao Execuo

RB1: I/O digital. RB2: I/O digital. PGM: Tenso baixa para ICSP. RB3: I/O digital. RB4: I/O digital. RB5: I/O digital. PGC: In-circuit debugger e clock para ICSP. RB6: I/O digital. PGD: In-circuit debugger e dados para ICSP. RB7: I/O digital.

FONTE: (MICROCHIP, 2006)

De posse das possveis configuraes de cada pino do microcontrolador, foi desenvolvido um mdulo perifrico bsico composto por displays de sete segmentos, teclado matricial e leds, sendo detalhado no item 5.2..

5.2Mdulo Perifrico Bsico


Conforme descrito anteriormente, o mdulo perifrico bsico abordado neste item suporta at 4 displays de sete segmentos, possui teclado matricial 4X4 com teclas do tipo click (totalizando 16 teclas configurveis) e 9 leds (8 vermelhos e 1 verde). Todos os exemplos desenvolvidos neste trabalho podero ser testados no mdulo bsico, exceto os descritos no tpico 5.3 e no captulo 6, pois estes necessitam de hardware adicional.

43

Para cada conjunto de componentes que integram o mdulo bsico existe uma biblioteca, que faz a comunicao entre o kit (microcontrolador) e o dispositivo. Com o mdulo bsico o desenvolvedor poder programar desde calculadoras e relgios at mesmo aplicaes mais avanadas, integrando-o com outros mdulos desenvolvidos conforme necessrio. A figura 11 mostra o circuito do mdulo bsico. Nesta figura pode ser notado dois C.I. s, o SN74LS47 e o CD4511, os dois so decodificadores BCD (codificao de binrio para decimal ou vice-versa) para 7 segmentos. O primeiro utilizado juntamente com displays do tipo anodo comum e o segundo serve para displays catodo comum, lembrando que os C.Is acima no podem ser utilizados ao mesmo tempo na placa.

44

Figura 11: Circuito do Mdulo Perifrico de Interface Bsico

Este mdulo bsico foi criado a partir de um exemplo mais complexo abordado em uma das bibliografias consultadas. (ZANCO, 2006). Os componentes utilizados para a construo do kit esto listados na tabela 5. Tabela 5: Componentes para a construo do kit NOME DO COMPONENTE Botes tipo click CD 4511 ID NA PLACA B1 a B16 CD QUANTIDADE 16 1

45

CI 74LS47 Display de 7 segmentos (tipo anodo ou catodo) Led Verde Led Vermelho Placa de Cobre 10 x 15 cm Resistor 100K Resistor 20K Resistor 270 Socket para CI de 16 pinos Socket para CI de 18 pinos Socket para CI de 20 pinos Socket torneado para CI de 8 pinos Transistor BC547 Transistor BC557

CI D1, D2, D3, D4 L1 L2 a L9 R13 a R16 R20 a R23 R1 a R12 e R17 a R19
CD e CI Displays Displays Teclado, Displays e Leds

1 1 at 4 1 1 1 4 4 8 2 1 1 4 4 4

T2, T4, T6 e T8 T1, T3, T5 e T7

A fileira de 8 leds vermelhos pode ser utilizada para fazer testes com as portas do microcontrolador ou mesmo sinalizar algum evento como por exemplo, o click de uma tecla. J o led verde, ser a princpio, utilizado para demonstrar o funcionamento do controle de PWM incorporado ao microcontrolador e posteriormente poder ser utilizado em outras funes. A placa do mdulo bsico foi projetada para no mximo 4 displays de sete segmentos ficando a cargo do desenvolvedor constru-la com 1 ou at 4 displays. Os displays servem para mostrar informaes como, por exemplo, resultados de somas, se for uma calculadora, mostrar as horas, se a aplicao for um relgio, etc. O teclado tambm uma pea que pode variar neste mdulo, pois so disponibilizadas 16 teclas que podem ser configuradas de acordo com a necessidade da aplicao. Como por exemplo, podemos utiliz-lo como teclado numrico e mais algumas teclas especiais que

46

podem ser as operaes matemticas no caso de uma calculadora ou teclas de configurao de hora e minutos para um relgio. Para facilitar a programao esto disponibilizados no anexo D exemplos com funes genricas para serem utilizadas com o mdulo bsico, estes foram escritos em linguagem C e esto arquivos separados, ou seja, um para o teclado, um para os leds, um para os displays e um para o led verde com a finalidade de exemplificar o funcionamento do PWM. No anexo K esto disponibilizadas uma lista com as variveis de configurao e duas tabelas uma com os tipos de dados e outra com as principais funes em linguagem C dos compiladores CCS e no anexo M temos um tutorial passo-a-passo de como escrever e gravar um programa no kit. A figura 12 mostra o digrama de blocos representando a ligao do kit com o mdulo bsico.

Figura 12: Diagrama de blocos kit e mdulo perifrico bsico.

A figura 13 mostra o kit e o mdulo bsico sendo utilizados para testar o cdigo de exemplo contido no anexo B.

47

Figura 13: Kit e mdulo bsico trabalhando em conjunto.

5.3Comunicao Serial entre o Kit e o Microcomputador


Atualmente encontramos a venda microcontroladores que possuem porta USB para comunicao com o microcomputador, porm estes so caros e ainda no temos hardware e software livres compatvel com os mesmos. O microcontrolador utilizado no kit, descrito neste trabalho, conta com um mdulo de transmisso e recepo de dados serial chamado de USART. Embora a USART possa transmitir e receber dados tanto da forma assncrona quanto da forma sncrona, este tpico abordar somente a forma assncrona de funcionamento. Na comunicao serial, a informao a ser transmitida fracionada em pequenas partes (bits) que so enviadas ao equipamento receptor uma aps a outra, em srie, da a denominao de comunicao serial. (PEREIRA, 2003, p.262). Como o kit (microcontrolador) j possui incorporado em hardware o protocolo de comunicao, temos apenas que entender como funciona o padro RS-232 ou tambm chamado de EIA-232.

48

O padro RS-232 ou EIA-232 define uma faixa de tenso que deve ser identificada pelos terminais como nveis lgicos 0 e 1. O nvel lgico 1 representado pela faixa de valores de -3V a -15V. (ZANCO, 2006, p.266). Respectivamente temos os para o nvel 0 a faixa de valores +3V e +15V. Levando em considerao a faixa de valores do padro RS-232 no podemos ligar diretamente o kit ao microcomputador, pois as tenses fornecidas pelo kit, <= 0,6V para nvel lgico 0 e >= 5V 0,6V para nvel lgico 1, no so compatveis com as tenses do padro RS-232. Existe atualmente no mercado um C.I., o MAX232, que faz a converso dos nveis de tenso permitindo assim a conexo entre o kit e dispositivos que utilizam o padro RS-232. A figura 14 apresenta a descrio de cada pino da porta serial.

Figura 14: Pinagem porta serial. FONTE: (PABLIN, 2005)

A figura 15 apresenta o circuito de ligao entre o microcontrolador e o C.I. MAX232.

49

Figura 15: Circuito de Comunicao com Porta Serial utilizando C.I. MAX232. FONTE: (PEREIRA, 2003)

Alm do C.I. MAX232 uma alternativa vivel para a interface de dispositivos com a porta serial pode ser construda utilizando transistores, o que a torna em alguns lugares mais barata e fcil de encontrar. O circuito mostrado na figura 16 substitui o C.I. MAX232, ele foi encontrado em um stio (PABLIN, 2005), mas apresentou problemas tendo que ser modificado.

Figura 16: Circuito de Comunicao com Porta Serial utilizando Transistores.

A utilizao da porta serial para comunicao entre o kit e o microcomputador codificada de maneira muito simples em linguagem C, utilizando-se apenas printfs e gets o desenvolvedor consegue enviar e receber dados. No anexo E est disponibilizado um

50

cdigo que efetua o envio de uma string teste para o microcomputador e aguarda o recebimento de uma tecla qualquer pelo kit, esta tecla ser retransmitida ao microcomputador dando a certeza ao desenvolvedor que a aplicao recebe e envia dados. Para usurios que no dispem de comunicao serial no microcomputador onde haver troca de informaes, aconselhado utilizao de um cabo USB Serial para conectar o kit ao microcomputador, lembrando que esta prtica do cabo no serve para fazer gravaes de programas na memria do microcontrolador.

5.4Memria EEPROM Interna


O microcontrolador utilizado no kit possui memria EEPROM interna de 256 bytes podendo ser utilizada para salvar dados que no so volteis, como por exemplo, se a aplicao medir temperaturas, estas podem ser armazenadas de tempos em tempos para uma futura anlise. No anexo F est disponibilizado um exemplo onde so gravados os nmeros de 1 a 10 e depois feita a leitura destes, lembrando que tanto na gravao como na leitura os dados gravados ou lidos so apresentados em displays de 7 segmentos.

51

6 Trabalhos Futuros
A partir do desenvolvimento de aplicaes utilizando o kit e o mdulo perifrico de interface bsico, o aluno ter os conhecimentos essenciais para desenvolver novos mdulos perifricos de interface, que podero ser utilizados em aulas ou at mesmo em projetos de iniciao cientfica. Alm dos novos mdulos e de projetos de iniciao cientfica os alunos podero desenvolver bibliotecas para facilitar a implementao de novos programas de exemplo, utilizando os novos mdulos perifricos, mantendo as apostilas e tutoriais sempre atualizados. Neste captulo sero propostos trs novos mdulos perifricos de interface envolvendo displays de cristal lquido, comunicao entre kits e armazenamento de dados em bancos de memria. Todo o material disponibilizado neste captulo no foi testado, pois no faz parte do escopo global deste trabalho.

6.1Mdulo LCD
Atualmente a forma mais simples e barata de apresentao de grande quantidade de dados feita atravs de mdulos LCD. Um mdulo de display LCD formado basicamente por um display de cristal lquido e um controlador de display. Basicamente os displays so classificados em dois tipos: os de caracteres e os grficos. Neste trabalho abordaremos os displays de caracteres, pois so mais baratos e possuem menor grau de complexidade de programao. Alm do tipo do display utilizado, tambm devemos prestar muita ateno em qual controlador ser empregado no mdulo. Os mais populares so o KS0066, fabricado pela Samsung Eletronics e o HD44780, fabricado pela Hitachi. (ZANCO, 2006, p.78). O controlador LCD vital para o mdulo LCD, pois permite uma interface simples com sistemas microcontrolados e microprocessados funcionando como um padro para acesso ao display. Esses controladores possuem barramento de dados selecionvel para 4 ou 8 bits, requerendo ainda mais trs linhas de sinalizao: ENABLE, RS (I/D) e R/W. Cada controlador tem suas particularidades que podem ser encontradas em seus datasheets.

52

Para exemplificar este tpico ser utilizado um display de caracteres com duas linhas controlado por um chip HD44780 conectado ao microcontrolador atravs de um barramento de dados de 4 bits, o que permite a otimizao do nmero de pinos do microcontrolador, pois somente sero utilizados 7 pinos (3 para controle e 4 para dados) do mesmo. A comunicao feita por apenas 4 bits realizada utilizando quatro linhas mais significativas de dados. Para este exemplo, utilizaremos os pinos D7 a D4 para dados e os pinos D2 a D0 para controle, dividindo o byte em dois nveis que sero transmitidos sempre do mais para o menos significativo. Esses controladores possuem memria que pode ser utilizada pelo programador para definir ou criar novos caracteres e armazen-los, mas este tipo de implementao foge ao escopo genrico deste trabalho. No anexo G est disponibilizada a tabela com o conjunto de comandos utilizados para programar um mdulo LCD com controlador HD44780. Abaixo na figura 17 podemos visualizar o esquema de ligao entre o microcontrolador e o mdulo LCD.

Figura 17: Circuito de execuo de testes com mdulo LCD FONTE: (ZANCO, 2006)

53

Aps a implementao do hardware o aluno poder utilizar a biblioteca e o cdigofonte, disponibilizados no anexo G, para realizar testes de comunicao entre o mdulo LCD e o kit.

6.2Comunicao entre Kits


Antes de ser proposta alguma implementao para a comunicao entre dois ou mais kits devemos conhecer bem o protocolo que ser utilizado para a troca de informaes. Existe um protocolo desenvolvido pela Philips chamado de I 2C (Comunicao entre Integrados) (ZANCO, 2006), que um dos mais utilizados na comunicao de dispositivos dentro de um mesmo circuito ou equipamento eletrnico. Esse protocolo do tipo sncrono do tipo mestre-escravo e possui barramento de duas linhas, uma para clock e outra para dados, alm disso, ele tambm suporta o chamado multimastering que nada mais do que a presena de diversos dispositivos mestres no barramento. O I 2C suporta velocidades de at 3.4 Megabits por segundo, porm a maioria dos dispositivos opera entre 100 e 400 Kilobits por segundo. O modo de funcionamento do protocolo baseia-se nos seguintes princpios: 1. Somente a leitura de informaes das linhas de dados quando a linha de clock estiver em sua fase alta; 2. O nvel da linha de dados s pode ser alterado na fase baixa da linha de clock; 3. Quando o barramento estiver ocioso, as duas linhas devem estar em nvel baixo. Esta breve introduo sobre o protocolo I 2C se faz necessria, pois este ser base da comunicao entre os kits. Para o desenvolvimento e implementao da comunicao entre kits ser necessria uma memria, a qual ser compartilhada tanto para escrita como para leitura. O barramento ser composto, por exemplo, de dois kits e uma memria (figura 18).

54

Figura 18: Exemplo de barramento para comunicao entre kits.

A troca de informaes onde o kit 1 envia dados para o kit 2, que por sua vez recebe os dados e envia uma reposta para o kit 1, ser realizada da seguinte forma: 1. Define-se neste caso um endereo de memria para cada kit, este servir para armazenar as informaes a serem trocadas e para armazenar flags de controle; o tamanho dos dados a serem trocados depende diretamente do tamanho da memria utilizada; 2. Primeiramente o kit1 verifica se no h ningum utilizando as linhas do barramento; 3. Verificadas as linhas, se estas estiverem liberadas, o kit 1 envia os dados para a memria salvando primeiro o flag, que indica que existe dados para leitura, depois o endereo da posio inicial dos dados e por ltimo os dados; 4. Enquanto as linhas estiverem ociosas, os kits iro de tempos em tempos checar o flag para ver se tem dado aguardando leitura; 5. Realizando esta checagem o kit 2 descobrir que existe dados prontos para serem lidos por ele, assim ele tentar ocupar o barramento; 6. Se a ocupao for possvel, o kit 2 poder ler os dados gravados pelo kit 1 e logo em seguida gravar dados para o kit 1 ler. Esta uma forma simples de entender como pode ser implementada a comunicao entre kits. No anexo H est disponibilizada uma biblioteca com funes relacionadas ao I2C.

55

6.3Armazenamento de Dados em Memrias


Quando falamos sobre armazenamento de dados em memria temos que analisar previamente os tipos dos dados e a quantidade de informaes que sero armazenadas. A maioria dos microcontroladores possui uma pequena quantidade de memria no voltil, vale observar que esta memria tem como principal funo armazenar dados que no podem ser perdidos mesmo se houver interrupo na energia de alimentao do kit (microcontrolador). Existem no mercado memrias que podem ser adquiridas para aumentar a capacidade ou at mesmo serem adicionadas a projetos onde o microcontrolador no dispe da mesma. Essas memrias geralmente so do tipo EEPROM, trata-se de memrias que podem ser escritas e apagadas diversas vezes. Alm do tipo citado anteriormente, tambm sero abortadas memrias do tipo MMC (Carto de Memria Multimdia), trata-se de memrias EEPROM modernas e com grande capacidade de armazenamento. A comunicao entre o microcontrolador e memrias externas realizada utilizandose de protocolos de comunicao como, por exemplo, o SPI (Interface Serial de Perifricos), o I2C (Comunicao entre Integrados), ente outros. Os protocolos citados anteriormente tambm so utilizados para a construo de barramentos de comunicao entre outros dispositivos como, por exemplo, conversores A/D, potencimetros digitais, entre outros. Para este tpico abordaremos o protocolo SPI como exemplo.

6.3.1 O SPI
O SPI foi desenvolvido originalmente pela Motorola para a linha de processadores da famlia MC68K e adotado por diversos fabricantes ao longo do tempo (o microcontrolador PIC16F877-A possui suporte). O SPI conta com uma interface fsica implementada pelas seguintes linhas: CS (Seleo de Dispositivo) ou SS: utilizada para habilitar o dispositivo com o qual se deseja comunicar e tambm para encerrar a execuo dos comandos transmitidos pelo dispositivo mestre;

56

Clock ou SCLK: utilizado para sincronizar o dispositivo mestre e o dispositivo escravo;

SI ou MOSI (Entrada Serial): serve para recepo de dados; SO ou MISO(Sada Serial): serve para enviar dados.

Abaixo na figura 19 mostrado o diagrama de comunicao entre dois dispositivos utilizando SPI.

Figura 19: Diagrama de Comunicao entre dois Dispositivos utilizando SPI.

Na figura 20 podemos observar a comunicao entre o dispositivo mestre e vrios dispositivos escravos utilizando o protocolo SPI. Note que a seleo feita pelo pino SS, no caso da comunicao de um mestre com diversos dispositivos escravos, requerem do microcontrolador um nmero grande de pinos de seleo.

Figura 20: Diagrama de Comunicao entre um mestre e diversos dispositivos escravos utilizando SPI.

57

O SPI um protocolo de comunicao sncrono e opera no modo full-duplex. Outra caracterstica do protocolo que todas as operaes so sempre precedidas por comandos de 8 bits (tabela 6) utilizados para descrever o tipo de operao que ser executada. Tabela 6: Comandos de 8 bits para SPI COMANDO READ WRITE WREN WRDI RDSR WRSR
FONTE: (PEREIRA, 2003)

BINRIO 0000 0011 0000 0010 0000 0110 0000 0100 0000 0101 0000 0001

DESCRIO L o dado da posio atual de memria Escreve um dado na posio atual de memria Habilita escrita na memria Desabilita escrita na memria L o registrador de estado da memria Escreve no registrador de estado da memria

Para exemplificar a troca de informaes entre o kit e memrias ser abordada nos prximos tpicos a comunicao utilizando SPI e memrias EEPROM, e tambm SPI e MMC.

6.3.2 Memrias EEPROM Serial


Neste tpico iremos abordar as operaes de leitura e de escrita em memrias EEPROM. Antes de comearmos, precisamos entender a figura 21, que identifica os pinos de uma memria EEPROM, neste caso o modelo utilizado o 25LC640 que tem capacidade de armazenamento de 64Kbits (8K * 8).

Figura 21: Pinos da memria EEPROM 24LC16B. FONTE: (PEREIRA, 2003)

58

Na tabela 7 esto descritas as funcionalidades de cada pino da memria ilustrada na figura 21. Tabela 7: Funcionalidades dos Pinos da Memria EEPROM 25LC640 PINO 1 2 3 4 5 6 7 8
FONTE: (MICROCHIP, 2006)

NOME CS SO WP VSS SI SCK Hold VCC

FUNO Habilita ou desabilita a memria Sada de dados Entrada de proteo de escrita Terra Entrada de dados Sincronizao da comunicao Suspender a transmisso de um dado Alimentao da memria

Agora que j conhecemos os pinos vamos entender como funcionam as operaes de leitura e escrita. Antes de efetuar uma leitura ou escrita devemos verificar se a linha CS est em nvel lgico 0, pois se ela estiver em nvel lgico 1 significa que j existe um comando sendo executado (os comandos esto descritos na tabela 5). Operaes de leitura seguem os seguintes passos nesta ordem (supondo que a linha CS esteja em nvel lgico 0): Envio do comando READ, seguindo pelos 16 bits do endereo da memria (do mais significativo para o menos significativo); Depois de enviado o ltimo bit do endereo, a memria passa a transmitir o dado contido naquele endereo (iniciando pelo mais significativo); Caso somente seja necessria a leitura de uma posio de memria, aps a recepo do ultimo bit do dado, devemos colocar nvel lgico 0 na linha CS para permitir o recebimento de novos comandos pela memria;

59

Tambm possvel continuar a leitura, pois as memrias SPI possuem um registrador de endereos interno que incrementado automaticamente aps cada byte enviado e para continuar a leitura basta continuar o envio de pulsos de clock (oito para cada novo byte a ser lido);

Para terminar uma operao de leitura, basta colocar a linha CS em nvel lgico 0 aps o ultimo bit de dado ter sido recebido.

Operaes de escrita seguem os seguintes passos nesta ordem (supondo que a linha CS esteja em nvel lgico 0): Envio do comando WRITE, seguindo pelos 16 bits do endereo da memria (do mais significativo para o menos significativo); Depois de enviado o ltimo bit do endereo, o dispositivo mestre (microcontrolador) passa a transmitir o dado a ser escrito naquele endereo (iniciando pelo mais significativo); Estas memrias suportam um modo chamado de Page-Write (escrita de pgina ou bloco) que permite gravar simultaneamente at 32 bytes, reduzindo o tempo necessrio para gravao da memria. Neste modo, aps o envio do primeiro byte, enviam-se os bytes seguintes, um aps o outro, at um mximo de 32; A operao de gravao chega ao fim quando a linha CS colocada em nvel lgico 1 em ambos os casos (escrita de byte simples ou blocos), lembrando que esta operao s deve ser realizada aps o envio do ltimo bit (menos significativo) para a memria. No anexo I fornecida uma biblioteca de comunicao SPI que pode ser encontrada no arquivo 25640.c da pasta drivers disponibilizada na instalao do Compilador CCS verso 3. (CCS, 2006). Tambm est disponibilizado no anexo I um cdigo fonte exemplo para leitura e escrita de dados enviados/recebidos do microcomputador para a memria via porta serial.

60

6.3.3 MMC (MultMediaCard)


As memrias do tipo MMC so muito utilizadas hoje em dia tendo como principais aplicabilidades s cmeras digitais, palms e celulares. Neste tpico abordaremos a utilizao deste tipo de memria para armazenamento de dados gerados por aplicaes que necessitem de grande quantidade de memria no voltil. A figura 22 ilustra a conexo de um MMC ao microcontrolador.

Figura 22: Conexo de um MMC ao microcontrolador.

Existem alguns compiladores C que fornecem bibliotecas prontas para trabalhar com cartes de memria, o caso do mikroC (MIKROE, 2006) e do PIC C Compiler (CCS, 2006), mas tambm existem outras formas, por exemplo, utilizando comunicao SPI. No anexo J est disponibilizada uma biblioteca implementada utilizando SPI para comunicao entre o microcontrolador e a MMC, est pode ser encontrada no stio (MICROCHIPC, 2005), s lembrando que a comunicao entre o kit e memrias MMC no foi testada, pois no faz parte do escopo global deste trabalho.

61

7 Concluso
Atravs do estudo realizado sobre os principais componentes envolvidos neste trabalho, pode-se concluir que todos os fatores analisados indicaram que a implementao do kit utilizando microcontroladores da famlia PIC seria vivel, o que nos motivou ainda mais para projetar e constru-lo. Devido a grande quantidade de pinos de I/O do microcontrolador escolhido, h a possibilidade de implementao de perifricos variados alm dos descritos neste trabalho, pois o kit possui comunicao para com estes dispositivos atravs de interfaces padronizadas. O circuito de construo do kit, apresentado na figura 5, foi desenvolvido para se obter melhor aproveitamento de espao e seguindo as especificaes dos componentes, o que o torna de fcil construo e manuteno, alm de ter seu custo reduzido proporcionando benefcios aos interessados em obt-lo ou at mesmo constru-lo. O mdulo perifrico bsico, descrito no captulo 5, foi projetado para atender as necessidades de um desenvolvedor iniciando seus estudos, podendo tambm ser utilizado com outros mdulos adicionais, pois possui conectores padronizados. O captulo 6 mostra mais algumas das inmeras aplicaes onde podemos utilizar microcontroladores PIC, ficando as aplicaes mostradas como sugestes para futuras implementaes. De forma geral o kit mostrou-se vivel quanto a sua implementao e utilizao, o que permite concluir que o trabalho de concluso de curso alcanou os seus objetivos e abriu novas oportunidades para a utilizao deste nas disciplinas do curso de Cincia da Computao. No que diz respeito ao aspecto pessoal e intelectual, o desenvolvimento deste trabalho me proporcionou conhecimento em uma nova rea que vem crescendo muito, a dos microcontroladores. Alm do conhecimento adquirido, foi possvel entender o funcionamento de vrios dispositivos utilizados no dia-a-dia, os quais eu no conhecia os aspectos tcnicos de suas implementaes.

62

Referncia Bibliogrfica
(BASSO, 2004) BASSO, Fabio Paulo. A MDA Como um Auxlio no Desenvolvimento de Sistemas Embarcados. 2004. 100f. Trabalho de Ps Graduao em Cincia da Computao. Pontifcia Universidade Catlica do Rio Grande do Sul, Porto Alegre. ESTADOS UNIDOS DA AMRICA. Custom Computer Services, Inc. CCS, Inc. Home. 2006. Disponvel em <http://www. ccsinfo.com/>. Acessado em: 02 mar. 2006. ESTADOS UNIDOS DA AMRICA. IC-Prog. IC-Prog Prototype Programmer. 2005. Disponvel em <http://www.ic-prog.com /index1.htm>. Acessado em: 10 abr. 2006.

(CCS, 2006)

(IC-PROG, 2005)

(INSTRUCTABLES, ESTADOS UNIDOS DA AMRICA. Instructables. JDM2 based 2006) PIC Programmer. 2006. Disponvel em <http://www.instructables.com/ex/i /6D80A0F6DA311028931A001143E7E506/?ALLSTEPS>. Acessado em: 05 abr. 2006. (IOVINE, 2000) (JDM, 2000) IOVINE, John. PIC Microcontroller: Project Book. 1. ed. Tab Books, 2000. DINAMARCA. Jens Dyekjr Madsen. Pic Programmer 2. 2000. Disponvel em <http://www.jdm.homepage.dk/newpic.htm>. Acessado em: 03 abr. 2006. REINO UNIDO. Marks Project Pages. PIC Programming. 2006. Disponvel em <http://www.mhennessy.f9.co.uk/pic.htm>. Acessado em: 06 mai. 2006. MATIC, Nebojsa. MikroElektronika-Romanian. Livro on-line Microcontroladores PIC. 2003. Disponvel em <http://www.mikroelektronika.co.yu/portuguese/product/books /picbook/00.htm>. Acesso em: 04 jun. 2006. ESTADOS UNIDOS DA AMRICA. Microchip Technology Inc. Microchip Technology Inc. 2006. Disponvel em <http://www.microchip.com>. Acessado em: 09 fev. 2006. ESTADOS UNIDOS DA AMRICA. Shane Tolmie. Program Microchip PIC micros with C. 2005. Disponvel em <http://www.microchipc.com/>. Acessado em: 25 out. 2006.

(MARKS, 2006)

(MATIC, 2003)

(MICROCHIP, 2006) (MICROCHIPC, 2005)

63

(MIKROE, 2006)

BELGRADE. mikroElektronika. mikroElektronika. 2006. Disponvel em <http://www.mikroe.com/en/>. Acessado em: 25 out. 2006 ARGENTINA. Pablin. Pablin. 2005. Disponvel em <http://www.pablin.com.ar/main.htm>. Acessado em 24 abr. 2006. PEREIRA, Fbio. Microcontroladores PIC: Programao em C. 5. ed. So Paulo: rica, 2003. ZANCO, Wagner da Silva. Microcontroladores PIC: Tcnicas de Software e Hardware para Projetos de Circuitos Eletrnicos com Base no PIC16F877A. 1. ed. So Paulo: rica, 2006.

(PABLIN, 2005) (PEREIRA, 2003)

(ZANCO, 2006)

64

Anexo A
A.1 Tabela com Conjunto de Instrues em Linguagem Assembler
Mnemnicos Operandos ou Argumentos Descrio

Operaes com Registradores


ADDWF ANDWF CLRF COMF DECF DECFSZ INCF INCFSZ IORWF MOVF MOVWF RLF RRF SUBWF SWAPF XORWF f, d f, d F f, d f, d f, d f, d f, d f, d f, d F f, d f, d f, d f, d f, d d (W + f) d (W and f) Limpa f d complemento de f d (f 1) d (f 1) e salta prxima linha se resultado for 0 d (f + 1) d (f + 1) e salta prxima linha se resultado for 0 d (W ou f) d cpia de F f cpia de W Rotaciona f um bit para a esquerda Rotaciona f um bit para a direita d (f W) Inverte nvel alto com nvel baixo e guarda o resultado em d d (W xor f)

Operaes com Bits


BCF BSF BTFSC BTFSS f, b f, b f, b f, b Clear (0) bit b do registrador f Set (1) bit b do registrador f Testa bit b do registrador f e salta a prxima linha se ele for 0 Testa bit b do registrador f e salta a prxima linha se ele for 1

65

Mnemnicos

Operandos ou Argumentos

Descrio

Operaes com Literais (valores numricos)


ADDLW ANDLW IORLW MOVLW SUBLW XORLW K K K K K K W (W + K) W (W and K) W (W ou K) WK W (K W) W (W xor K)

Operaes de Controle
CLRW NOP CALL CLRWDT GOTO RETFIE RETLW RETURN SLEEP K K K Limpa Work No faz nada, apenas gasta tempo Chamada sub-rotina Limpa WDT Desvio para endereo Retorno de Interrupo Retorno de sub-rotina com K em W Retorno de sub-rotina Coloca PIC em modo Sleep para economia de energia

66

Anexo B
B.1 Cdigo utilizado para teste com display de sete segmentos em Linguagem Assembly
;/*********************************************************************** ; TESTA_DISPLAY7SEG.ASM ; Cdigo utilizado para teste com display de 7 segmentos ; Autor: Renato Vasques Beraldo ;***********************************************************************/ ;Biblioteca Padro do PIC 16F877A #include<p16f877a.inc> ;Configuraes __CONFIG _CP_OFF&_WRT_OFF&_DEBUG_OFF&_CPD_OFF&_LVP_OFF&_WDT_OFF&_BOD EN_ON&_PWRTE_ON&_XT_OSC ;Variveis Dado EQU Cont EQU Zera EQU 0x73 0x74 0x75

;Variveis de tempo Delayl EQU 0x70 Delaym EQU 0x71 Delayh EQU 0x72 ;Constantes Num EQU Inc EQU Vezes EQU Max EQU BANK0 MACRO bcf bcf ENDM BANK1 MACRO bsf bcf ENDM .0 .1 .50 .11 STATUS,RP0 STATUS,RP1

STATUS,RP0 STATUS,RP1

67

ORG Goto Main ORG RETFIE ;main Main

0x00 0x04

BANK1 movlw B'00000000' movwf TRISB movlw B'10000100' movwf OPTION_REG ;INTERRUPCOES DESABILITADAS movlw B'00000000' movwf INTCON movlw B'00000110' movwf ADCON1 BANK0 clrf PORTB movlw Vezes movwf Cont Goto inicio inicio ;inicialiazao das variveis movlw Num movwf Dado movlw Max movwf Zera ;inicializando o contador de execuo decfsz Cont,W Goto atualiza_cont Goto Fim ;chama as principais funes teste Call Acende Call Incrementa Call Conta movwf Zera Call Delay Call Delay Goto teste ;atualiza o nmero de execues do programa atualiza_cont movwf Cont Goto teste

68

;acende display Acende movf Dado,W call Tabela movwf PORTB return

;Dado para decodificar ;Decodificao do dado ;Coloca os dados na porta

;incrementa o valor de dado Incrementa movf Dado,W addlw Inc movwf Dado return ;rotina que conta at nove e zera tudo Conta decfsz Zera,W return Goto inicio ;rotina que d um delay Delay clrf Delayl clrf Delaym movlw 3h movwf Delayh Wait decfsz Delayl goto Wait decfsz Delaym goto Wait decfsz Delayh goto Wait return ;decodifica o dado (esta tabela para display anodo comum, para utilizar catodo ;troque os nmeros 0s por 1s e os 1s por 0s => B'11000000' => B'11111100' Tabela addwf PCL,F ;display pgfedcba RETLW B'11000000' ;0 RETLW B'11111001' ;1 RETLW B'10100100' ;2 RETLW B'10110000' ;3 RETLW B'10011001' ;4 RETLW B'10010010' ;5 RETLW B'10000010' ;6 RETLW B'11111000' ;7 RETLW B'10000000' ;8

69

RETLW RETLW Fim End

B'10011000' B'01111111'

;9 ;Acende o ponto

B.2 Cdigo utilizado para teste com display de sete segmentos em linguagem C
/*********************************************************************** TESTA_DISPLAY7SEG.C Cdigo utilizado para teste com display de 7 segmentos Autor: Renato Vasques Beraldo ***********************************************************************/ // Biblioteca e variveis de configurao #include <16F877A.h> #device adc=8 #use delay(clock=4000000) #fuses NOWDT,XT, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT //varivel global que indica o digito que estar sendo //mostrado no display int posicao = 0; //tabela de converso de digitos para binario byte const tabela[]={ 0b11000000, // - 0 0b11111001, // - 1 0b10100100, // - 2 0b10110000, // - 3 0b10011001, // - 4 0b10010010, // - 5 0b10000010, // - 6 0b11111000, // - 7 0b10000000, // - 8 0b10011000, // - 9 0b01111111, // - ponto 0b00000000, // - acende tudo }; //funo que trata a interrupo do timer #int_timer0 void trata_t0 () { static int conta;

70

set_timer0(131+get_timer0()); conta++; if(conta==125) { conta = 0; if(posicao==0) { output_b(tabela[posicao]); posicao = posicao +1; } else if((posicao>0)&&(posicao<11)) { output_b(tabela[posicao]); posicao = posicao +1; } else { output_b(tabela[11]); posicao = 0; } } } void main() { //variaveis de configurao setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); //teste de display output_b(tabela[11]); delay_ms(2000); //seta o timer para provocar um atraso de 1 seg set_timer0(131); enable_interrupts(global | int_timer0); while(true); }

Anexo C

71

C.1 Layout da Placa de Construo do Kit Sem Componentes (vista de trs) e no Tamanho Real

72

C.2 Layout da Placa de Construo do Kit Com Componentes e Pontes (vista de frente)

73

Anexo D
D.1 Layout da Placa de Construo do Mdulo Bsico Sem Componentes (vista de trs) e no Tamanho Real

D.2 Layout da Placa de Construo do Mdulo Bsico Com Componentes e Pontes (vista de frente)

74

As marcas azuis so jumpers de seleo (displays catodo ou anodo), as roxas so os terminais de 5v, as amarelas so GND e a verde positivo do controle PWM.

D.3 Cdigo de exemplo utilizando um display de 7 segmentos anodo comum e o teclado


/***********************************************************************

75

Teclado+DisplayAnodo.C Cdigo que mostra no display de 7 segmentos anodo comum o valor de um boto pressionado no teclado. Autor: Renato Vasques Beraldo ***********************************************************************/ //Bibliotecas e Configuraes do kit #include <16F877A.h> #device adc=8 #use delay(clock=4000000) #fuses NOWDT,XT, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT /* Definies do Teclado utilizando a porta B O teclado ficara como seguinte layout l1 l2 l3 l4 c1 c2 1 2 4 5 7 8 * 0 c3 3 6 9 # c4 -

*/ //Colunas #define c1 pin_b4 #define c2 pin_b5 #define c3 pin_b6 //Descomente a linha abaixo para utilizar a coluna 4 do teclado // e tambm descomente as linhas respectivas a c4 dentro das funes //#define c4 pin_b7 //Linhas #define l1 pin_b0 #define l2 pin_b1 #define l3 pin_b2 #define l4 pin_b3 /* Definies do Display de 7seg utilizando a porta D */ //Display7 linhas de Dados #define a pin_d0 #define b pin_d1 #define c pin_d2 #define d pin_d3 //Display7 linha de Seleo #define ca pin_d4

76

#define ponto pin_e0 //Variaveis Globais char tecla= 'n'; //Funes //Funo que identifica a tecla pressionada void varretecla(); //Funo que acende o display void acendedisp(); //Funo que zera o display void zeratudo(); void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); //Coloca as colunas em nivel lgico 0 output_low(c1); output_low(c2); output_low(c3); //output_low(c4); while(true) { zeratudo(); acendedisp(); delay_ms(10); } } void varretecla() { //varre a coluna 1 output_low(c1); output_high(c2);

77

output_high(c3); //output_high(c4); if(input(l1)==0) tecla = '1'; else if(input(l2)==0) tecla = '4'; else if(input(l3)==0) tecla = '7'; else if(input(l4)==0) tecla = '*'; //varre a coluna 2 output_low(c2); output_high(c1); output_high(c3); //output_high(c4); if(input(l1)==0) tecla = '2'; else if(input(l2)==0) tecla = '5'; else if(input(l3)==0) tecla = '8'; else if(input(l4)==0) tecla = '0'; //varre a coluna 3 output_low(c3); output_high(c1); output_high(c2); //output_high(c4); if(input(l1)==0) tecla = '3'; else if(input(l2)==0) tecla = '6'; else if(input(l3)==0) tecla = '9'; else if(input(l4)==0) tecla = '#'; /* No utilizada neste programa para utilizar retire os comentrios */ /* //varre a coluna 4 output_low(c4);

78

output_high(c1); output_high(c2); output_high(c3); if(input(l1)==0) tecla = 13; else if(input(l2)==0) tecla = 14; else if(input(l3)==0) tecla = 15; else if(input(l4)==0) tecla = 12; */ } void zeratudo() { output_low(a); output_high(b); output_low(c); output_high(d); output_low(ponto); output_low(ca); } void acendedisp() { varretecla(); switch(tecla) { case '0': output_low(a); output_low(b); output_low(c); output_low(d); output_low(ca); break; case '1': output_high(a); output_low(b); output_low(c); output_low(d); output_low(ca); break; case '2': output_low(a); output_high(b); output_low(c); output_low(d); output_low(ca);

79

break; case '3': output_high(a); output_high(b); output_low(c); output_low(d); output_low(ca); break; case '4': output_low(a); output_low(b); output_high(c); output_low(d); output_low(ca); break; case '5': output_high(a); output_low(b); output_high(c); output_low(d); output_low(ca); break; case '6': output_low(a); output_high(b); output_high(c); output_low(d); output_low(ca); break; case '7': output_high(a); output_high(b); output_high(c); output_low(d); output_low(ca); break; case '8': output_low(a); output_low(b); output_low(c); output_high(d); output_low(ca); break; case '9': output_high(a); output_low(b); output_low(c); output_high(d); output_low(ca);

80

break; default: output_high(ponto); output_low(ca); break; } delay_ms(400); zeratudo(); }

D.4 Cdigo de exemplo utilizando os leds vermelhos para testar o funcionamento das portas
/*********************************************************************** Leds.C Cdigo exemplifica como acender e apagar o conjunto de leds vermelhos utilizando qualquer porta, servindo tambm para testar se as portas esto funcionando. Autor: Renato Vasques Beraldo ***********************************************************************/ //Bibliotecas e Configuraes do kit #include <16F877A.h> #device adc=8 #use delay(clock=4000000) #fuses NOWDT,XT, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT /* Funo para teste de funcionamento de porta atravs da sinalizao de todos os leds */ void acendetudo(char porta); /* Funo para teste de funcionamento de porta atravs do desligamento de todos os leds */ void apagatudo(char porta); void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF);

81

setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); //Testando a porta B acendetudo('b'); delay_ms(5000); apagatudo('b'); while(true); } void acendetudo(char porta) { switch(porta) { case 'a': output_a(0b111111); break; case 'b': output_b(0b11111111); break; case 'c': output_c(0b11111111); break; case 'd': output_d(0b11111111); break; case 'e': output_e(0b111); break; default: break; } } void apagatudo(char porta) { switch(porta) { case 'a': output_a(0b000000); break; case 'b': output_b(0b00000000); break;

82

case 'c': output_c(0b00000000); break; case 'd': output_d(0b00000000); break; case 'e': output_e(0b000); break; default: break; } }

D.5 Cdigo de exemplo utilizando o led verde para demonstrar o funcionamento do PWM
/*********************************************************************** PWM.C Cdigo exemplifica como utilizar PWM para controlar a intensidade de um led atravs da tenso aplicada. Autor: Renato Vasques Beraldo ***********************************************************************/ //Bibliotecas e Configuraes do kit #include <16F877A.h> #device adc=8 #use delay(clock=4000000) #fuses NOWDT,XT, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT //tabela de valores do pwm /* 0 corresponde a 0 volts 5 corresponde a aproximadamente 0,09 volts 10 corresponde a aproximadamente 0,19 volts 20 corresponde a aproximadamente 0,38 volts 30 corresponde a aproximadamente 0,57 volts 40 corresponde a aproximadamente 0,72 volts 50 corresponde a aproximadamente 0,95 volts 70 corresponde a aproximadamente 1,33 volts 100 corresponde a aproximadamente 1,9 volts Esses valores foram obtidos pela formula Considerando uma sada de 5v e 256bits Temos o seguinte: 5 / 256 = 0,01953125 volts por bits Levando em conta que o led tem como voltagem mxima o valor 2 ento temos:

83

256 / 5 = 51,2 => 51,2 * 2 = 102,4 Que nos d um valor correspondente a 5 / 256 = 2 / 102,4 = 0,01953125 volts por bits. Apartir da calculamos os valores demonstrados acima onde para um pwm igual a 10 obtemos aproximadamente uma voltagem de 0,19 como sada. */ byte const tabela[]={ 0, 5, 10, 20, 30, 40, 50, 70, 100 }; void main() { long int ciclo =0; setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); setup_timer_1(T1_DISABLED); //Define a freqncia do pulso para 1,004kHz setup_timer_2(T2_DIV_BY_4,248,1); //Variveis de configurao do PWM no pino 17 = c2, setup_ccp1 (ccp_pwm); set_pwm1_duty(0); delay_ms(1000); while(true) { for(ciclo = 0; ciclo <= 8; ciclo++) { set_pwm1_duty (tabela[ciclo]); delay_ms(2000); } } }

D.6 Cdigos de exemplo utilizando dois ou mais displays de 7 segmentos


D.6.1 Cdigo de exemplo para displays de 7 segmentos anodo comum

84

/*********************************************************************** 2ouMaisDisplaysAnodoComum.C Cdigo exemplifica como utilizar 2 ou mais displays de 7 segmentos anodo comum. Autor: Renato Vasques Beraldo ***********************************************************************/ //Bibliotecas e Configuraes do kit #include <16F877A.h> #device adc=8 #use delay(clock=4000000) #fuses NOWDT,XT, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT //Pinos //Pinos de Liga e Desliga #define da pin_b4 #define db pin_b5 //Descomente as linhas abaixo caso esteja utilizando mais de dois displays //#define dc pin_b6 //#define dd pin_b7 //Pinos de dados #define ca pin_b0 #define cb pin_b1 #define cc pin_b2 #define cd pin_b3 /* Tabela de dados 0 => ca=0, cb=0, cc=0 e cd=0 1 => ca=1, cb=0, cc=0 e cd=0 2 => ca=0, cb=1, cc=0 e cd=0 3 => ca=1, cb=1, cc=0 e cd=0 4 => ca=0, cb=0, cc=1 e cd=0 5 => ca=1, cb=0, cc=1 e cd=0 6 => ca=0, cb=1, cc=1 e cd=0 7 => ca=1, cb=1, cc=1 e cd=0 8 => ca=0, cb=0, cc=0 e cd=1 9 => ca=1, cb=0, cc=0 e cd=1 */ //Funes //funo que desliga os displays void desligaDisplays(); //funo que liga todos os displays void ligaDisplays();

85

//funo para acender digito no display void acendeDigitoDisplay(int a, int b, int c, int d, int display); void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); //Desliga os displays desligaDisplays(); delay_ms(1000); while(true) { //Escreve o digito 0 no display A acendeDigitoDisplay(0,0,0,0,1); //Escreve o digito 1 no display B acendeDigitoDisplay(1,0,0,0,2); } } //Funes void desligaDisplays() { output_bit(da,1); output_bit(db,1); //Descomente as linhas abaixo para mais de dois displays //output_bit(dc,1); //output_bit(dd,1); } void ligaDisplays() { output_bit(da,0); output_bit(db,0); //Descomente as linhas abaixo para mais de dois displays

86

//output_bit(dc,0); //output_bit(dd,0); } void acendeDigitoDisplay(int a, int b, int c, int d, int display) { switch(display) { case 1: //Desliga os displays para atualizao desligaDisplays(); //escreve o dado no display output_bit(ca,a); output_bit(cb,b); output_bit(cc,c); output_bit(cd,d); //habilita display A output_low(da); output_high(db); //Descomente as linhas abaixo para mais de dois displays //output_high(dc); //output_high(dd); //Atraso de Atualizao delay_ms(1); break; case 2: //Desliga os displays para atualizao desligaDisplays(); //escreve o dado no display output_bit(ca,a); output_bit(cb,b); output_bit(cc,c); output_bit(cd,d); //habilita display B output_low(db); output_high(da); //Descomente as linhas abaixo para mais de dois displays //output_high(dc); //output_high(dd); //Atraso de Atualizao delay_ms(1); break; //Descomente as linhas abaixo para mais de dois displays /* case 3: //Desliga os displays para atualizao desligaDisplays(); //escreve o dado no display output_bit(ca,a); output_bit(cb,b);

87

output_bit(cc,c); output_bit(cd,d); //habilita display C output_low(dc); output_high(da); output_high(db); output_high(dc); //Atraso de Atualizao delay_ms(1); break; case 4: //Desliga os displays para atualizao desligaDisplays(); //escreve o dado no display output_bit(ca,a); output_bit(cb,b); output_bit(cc,c); output_bit(cd,d); //habilita display C output_low(dd); output_high(da); output_high(db); output_high(dd); //Atraso de Atualizao delay_ms(1); break; */ default: desligaDisplays(); break; } }

D.6.2 Cdigo de exemplo para displays de 7 segmentos catodo comum


/*********************************************************************** 2ouMaisDisplaysCatodoComum.C Cdigo exemplifica como utilizar 2 ou mais displays de 7 segmentos catodo comum. Autor: Renato Vasques Beraldo ***********************************************************************/ //Bibliotecas e Configuraes do kit #include <16F877A.h>

88

#device adc=8 #use delay(clock=4000000) #fuses NOWDT,XT, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT //Pinos //Pinos de Liga e Desliga #define da pin_b4 #define db pin_b5 //Descomente as linhas abaixo caso esteja utilizando mais de dois displays //#define dc pin_b6 //#define dd pin_b7 //Pinos de dados #define ca pin_b0 #define cb pin_b1 #define cc pin_b2 #define cd pin_b3 /* Tabela de dados 0 => ca=0, cb=0, cc=0 e cd=0 1 => ca=1, cb=0, cc=0 e cd=0 2 => ca=0, cb=1, cc=0 e cd=0 3 => ca=1, cb=1, cc=0 e cd=0 4 => ca=0, cb=0, cc=1 e cd=0 5 => ca=1, cb=0, cc=1 e cd=0 6 => ca=0, cb=1, cc=1 e cd=0 7 => ca=1, cb=1, cc=1 e cd=0 8 => ca=0, cb=0, cc=0 e cd=1 9 => ca=1, cb=0, cc=0 e cd=1 */ //Funes //funo que desliga os displays void desligaDisplays(); //funo que liga todos os displays void ligaDisplays(); //funo para acender digito no display void acendeDigitoDisplay(int a, int b, int c, int d, int display); void main() { setup_adc_ports(NO_ANALOGS);

89

setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); //Desliga os displays desligaDisplays(); delay_ms(1000); while(true) { //Escreve o digito 0 no display A acendeDigitoDisplay(0,0,0,0,1); //Escreve o digito 1 no display B acendeDigitoDisplay(1,0,0,0,2); } } //Funes void desligaDisplays() { output_bit(da,0); output_bit(db,0); //Descomente as linhas abaixo para mais de dois displays //output_bit(dc,0); //output_bit(dd,0); } void ligaDisplays() { output_bit(da,1); output_bit(db,1); //Descomente as linhas abaixo para mais de dois displays //output_bit(dc,1); //output_bit(dd,1); } void acendeDigitoDisplay(int a, int b, int c, int d, int display) { switch(display) {

90

case 1: //Desliga os displays para atualizao desligaDisplays(); //escreve o dado no display output_bit(ca,a); output_bit(cb,b); output_bit(cc,c); output_bit(cd,d); //habilita display A output_high(da); output_low(db); //Descomente as linhas abaixo para mais de dois displays //output_low(dc); //output_low(dd); //Atraso de Atualizao delay_ms(1); break; case 2: //Desliga os displays para atualizao desligaDisplays(); //escreve o dado no display output_bit(ca,a); output_bit(cb,b); output_bit(cc,c); output_bit(cd,d); //habilita display B output_high(db); output_low(da); //Descomente as linhas abaixo para mais de dois displays //output_low(dc); //output_low(dd); //Atraso de Atualizao delay_ms(1); break; //Descomente as linhas abaixo para mais de dois displays /* case 3: //Desliga os displays para atualizao desligaDisplays(); //escreve o dado no display output_bit(ca,a); output_bit(cb,b); output_bit(cc,c); output_bit(cd,d); //habilita display C output_high(dc); output_low(da); output_low(db); output_low(dc); //Atraso de Atualizao

91

delay_ms(1); break; case 4: //Desliga os displays para atualizao desligaDisplays(); //escreve o dado no display output_bit(ca,a); output_bit(cb,b); output_bit(cc,c); output_bit(cd,d); //habilita display C output_high(dd); output_low(da); output_low(db); output_low(dd); //Atraso de Atualizao delay_ms(1); break; */ default: desligaDisplays(); break; } }

D.7 Cdigo de exemplo utilizando o led verde para demonstrar o funcionamento do PWM, o teclado para ajustes no nvel do PWM e displays anodo comum para mostrar o nvel do PWM
/*********************************************************************** Teclado+DisplayAnodo+PWM.C Cdigo mostra no led verde o funcionamento do PWM, o teclado para ajustes no nvel do PWM e displays anodo comum para mostrar o nvel do PWM Autor: Renato Vasques Beraldo ***********************************************************************/ //Bibliotecas e Configuraes do kit #include <16F877A.h> #device adc=8 #use delay(clock=4000000) #fuses NOWDT,XT, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT

92

/* Definies do Teclado utilizando a porta B O teclado ficara como seguinte layout l1 l2 l3 l4 c1 c2 c3 c4 05 10 20 +5 30 40 50 -5 60 70 80 90 99 00 -

*/ //Colunas #define c1 pin_b4 #define c2 pin_b5 #define c3 pin_b6 #define c4 pin_b7 //Linhas #define l1 pin_b0 #define l2 pin_b1 #define l3 pin_b2 #define l4 pin_b3 /* Definies do Display de 7seg utilizando a porta D */ /* Tabela de dados 0 => ca=0, cb=0, cc=0 e cd=0 1 => ca=1, cb=0, cc=0 e cd=0 2 => ca=0, cb=1, cc=0 e cd=0 3 => ca=1, cb=1, cc=0 e cd=0 4 => ca=0, cb=0, cc=1 e cd=0 5 => ca=1, cb=0, cc=1 e cd=0 6 => ca=0, cb=1, cc=1 e cd=0 7 => ca=1, cb=1, cc=1 e cd=0 8 => ca=0, cb=0, cc=0 e cd=1 9 => ca=1, cb=0, cc=0 e cd=1 */ //Display7 linhas de Dados #define ca pin_d0 #define cb pin_d1 #define cc pin_d2 #define cd pin_d3 //Display7 linha de Seleo #define da pin_d4

93

#define db pin_d5 /* Definies do PWM */ //Variavel de Nivel long int ciclo =0; //Variaveis Globais int tecla=0; //Funes //Funo que identifica a tecla pressionada void varretecla(); //funo que desliga os displays void desligaDisplays(); //funo que liga todos os displays void ligaDisplays(); //funo para acender digito no display void acendeDigitoDisplay(int a, int b, int c, int d, int display); //funo que limpa as variaveis void zeraTudo(); //funo que calcula o valor e envia para o display void setaDigitos(); //Trata a interrupa do timer0 e faz a varredura do teclado #int_timer0 void trata_t0() { static int conta; set_timer0(131+get_timer0()); conta++; if(conta==125) { //varre a coluna 1 output_low(c1); output_high(c2); output_high(c3); output_high(c4); if(input(l1)==0)

94

tecla = 05; else if(input(l2)==0) tecla = 30; else if(input(l3)==0) tecla = 60; else if(input(l4)==0) tecla = 90; //varre a coluna 2 output_low(c2); output_high(c1); output_high(c3); output_high(c4); if(input(l1)==0) tecla = 10; else if(input(l2)==0) tecla = 40; else if(input(l3)==0) tecla = 70; else if(input(l4)==0) tecla = 99; //varre a coluna 3 output_low(c3); output_high(c1); output_high(c2); output_high(c4); if(input(l1)==0) tecla = 20; else if(input(l2)==0) tecla = 50; else if(input(l3)==0) tecla = 80; else if(input(l4)==0) tecla = 00; //varre a coluna 4 output_low(c4); output_high(c1); output_high(c2); output_high(c3); if(input(l1)==0) { tecla = tecla + 5; if(tecla >= 100) tecla = 99;

95

} else if(input(l2)==0) { tecla = tecla - 5; if(tecla < 0) tecla = 0; } /* else if(input(l3)==0) tecla = 00; else if(input(l4)==0) tecla = 00; */ } } void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); setup_timer_1(T1_DISABLED); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); //Frequencia de pulso do PWM setup_timer_2(T2_DIV_BY_4,248,1); //Variveis de configurao do PWM no pino 17 = c2, setup_ccp1 (ccp_pwm); set_pwm1_duty(0); //Testa displays 1 e 2 acendeDigitoDisplay(0, 0, 0, 0, 1); acendeDigitoDisplay(0, 0, 0, 0, 2); desligaDisplays(); //Zera Variaveis zeraTudo(); delay_ms(1000); //Coloca as colunas em nivel lgico 0 output_low(c1); output_low(c2);

96

//Seta timer 0 set_timer0(131); enable_interrupts(global | int_timer0); while(true) { setaDigitos(); set_pwm1_duty(tecla); } } void desligaDisplays() { output_bit(da,1); output_bit(db,1); //Descomente as linhas abaixo para mais de dois displays //output_bit(dc,1); //output_bit(dd,1); } void ligaDisplays() { output_bit(da,0); output_bit(db,0); //Descomente as linhas abaixo para mais de dois displays //output_bit(dc,0); //output_bit(dd,0); } void acendeDigitoDisplay(int a, int b, int c, int d, int display) { switch(display) { case 1: //Desliga os displays para atualizao desligaDisplays(); //escreve o dado no display output_bit(ca,a); output_bit(cb,b); output_bit(cc,c); output_bit(cd,d); //habilita display A output_low(da); output_high(db); //Atraso de Atualizao delay_ms(1); break;

97

case 2: //Desliga os displays para atualizao desligaDisplays(); //escreve o dado no display output_bit(ca,a); output_bit(cb,b); output_bit(cc,c); output_bit(cd,d); //habilita display B output_low(db); output_high(da); //Atraso de Atualizao delay_ms(1); break; default: desligaDisplays(); break; } } void zeraTudo() { tecla=0; } void setaDigitos() { int resto=0, resul=0; resto = tecla%10; resul = tecla/10; if(resto==0) acendeDigitoDisplay(0, 0, 0, 0, 1); else if(resto==1) acendeDigitoDisplay(1, 0, 0, 0, 1); else if(resto==2) acendeDigitoDisplay(0, 1, 0, 0, 1); else if(resto==3) acendeDigitoDisplay(1, 1, 0, 0, 1); else if(resto==4) acendeDigitoDisplay(0, 0, 1, 0, 1); else if(resto==5) acendeDigitoDisplay(1, 0, 1, 0, 1); else if(resto==6) acendeDigitoDisplay(0, 1, 1, 0, 1); else if(resto==7) acendeDigitoDisplay(1, 1, 1, 0, 1); else if(resto==8) acendeDigitoDisplay(0, 0, 0, 1, 1);

98

else acendeDigitoDisplay(1, 0, 0, 1, 1); if(resul==0) acendeDigitoDisplay(0, 0, 0, 0, 2); else if(resul==1) acendeDigitoDisplay(1, 0, 0, 0, 2); else if(resul==2) acendeDigitoDisplay(0, 1, 0, 0, 2); else if(resul==3) acendeDigitoDisplay(1, 1, 0, 0, 2); else if(resul==4) acendeDigitoDisplay(0, 0, 1, 0, 2); else if(resul==5) acendeDigitoDisplay(1, 0, 1, 0, 2); else if(resul==6) acendeDigitoDisplay(0, 1, 1, 0, 2); else if(resul==7) acendeDigitoDisplay(1, 1, 1, 0, 2); else if(resul==8) acendeDigitoDisplay(0, 0, 0, 1, 2); else acendeDigitoDisplay(1, 0, 0, 1, 2); }

99

Anexo E
E.1 Cdigo exemplificando a Transmisso e Recepo de Dados via Comunicao Serial Padro RS232
/*********************************************************************** TESTA_COM_SERIAL.C Testa Comunicao Serial Padro RS-232 entre o kit e o microcomputador Autor: Renato Vasques Beraldo ***********************************************************************/ //Bibliotecas e Configuraes do kit #include <16F877A.h> #device adc=8 #use delay(clock=4000000) #fuses NOWDT,XT, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT //Definio da comunicao serial #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) main() { //Declarao de Variavis char dado[100]; //Envia dado do kit para o pc printf(Testando Comunicao Serial \n); while(true) { //Pega dado enviado do pc para o kit gets(dado); //Reenvia o dado do kit para o pc para ter certeza do recebimento printf(%s \n,dado); } }

100

Anexo F
F.1 Cdigo exemplificando a Gravao e Leitura de Dados na Memria EEPROM Interna, Mostrando os Dados Correntes em Displays de 7 Segmentos
/*********************************************************************** MemoriaInternaEEPROM.C Cdigo exemplifica como grava e ler dados de um determinado endereo da memria interna do microcontrolador, mostrando o valor a ser gravado e depois o valor lido. Autor: Renato Vasques Beraldo ***********************************************************************/ //Bibliotecas e Configuraes do kit #include <16F877A.h> #device adc=8 #use delay(clock=4000000) #fuses NOWDT,XT, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT /* Definies do Display de 7seg utilizando a porta D */ /* Tabela de dados 0 => ca=0, cb=0, cc=0 e cd=0 1 => ca=1, cb=0, cc=0 e cd=0 2 => ca=0, cb=1, cc=0 e cd=0 3 => ca=1, cb=1, cc=0 e cd=0 4 => ca=0, cb=0, cc=1 e cd=0 5 => ca=1, cb=0, cc=1 e cd=0 6 => ca=0, cb=1, cc=1 e cd=0 7 => ca=1, cb=1, cc=1 e cd=0 8 => ca=0, cb=0, cc=0 e cd=1 9 => ca=1, cb=0, cc=0 e cd=1 */ //Display7 linhas de Dados #define ca pin_d0 #define cb pin_d1

101

#define cc pin_d2 #define cd pin_d3 //Display7 linha de Seleo #define da pin_d4 #define db pin_d5 //Funes //funo que liga todos os displays void ligaDisplays(); //funo que desliga os displays void desligaDisplays(); //funo para acender digito no display void acendeDigitoDisplay(int a, int b, int c, int d, int display); //funo que calcula o valor e envia para o display void setaDigitos(); //Variveis Globais int valor=0; void main() { long int i = 0, cont = 0; setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); //testa os displays ligaDisplays(); //for que grava o valor da varivel valor no endereo de memria i //mostrando no display o valor gravado for(i=1; i<11; i++) { valor = i; write_eeprom(i, valor); //gera um atraso de 1 segundo e mantem os displays acesos com o valor escrito

102

for(cont=0; cont<400; cont++) setaDigitos(); } //Mostra o fim da operao de escrita desligaDisplays(); //Atraso para realizar a leitura dos dados gravados delay_ms(2000); //for que le o valor contido no endereo de memria i //mostrando no display o valor lido for(i=1; i<11; i++) { valor = read_eeprom(i); //gera um atraso de 1 segundo e mantem os displays acesos com o valor lido for(cont=0; cont<400; cont++) setaDigitos(); } //Mostra o fim da operao de leitura desligaDisplays(); } void desligaDisplays() { output_bit(da,1); output_bit(db,1); } void ligaDisplays() { output_bit(da,0); output_bit(db,0); } void acendeDigitoDisplay(int a, int b, int c, int d, int display) { switch(display) { case 1: //Desliga os displays para atualizao desligaDisplays(); //escreve o dado no display output_bit(ca,a); output_bit(cb,b); output_bit(cc,c); output_bit(cd,d); //habilita display A output_low(da);

103

output_high(db); //Atraso de Atualizao delay_ms(1); break; case 2: //Desliga os displays para atualizao desligaDisplays(); //escreve o dado no display output_bit(ca,a); output_bit(cb,b); output_bit(cc,c); output_bit(cd,d); //habilita display B output_low(db); output_high(da); //Atraso de Atualizao delay_ms(1); break; default: desligaDisplays(); break; } } void setaDigitos() { int resto=0, resul=0; resto = valor%10; resul = valor/10; if(resto==0) acendeDigitoDisplay(0, 0, 0, 0, 1); else if(resto==1) acendeDigitoDisplay(1, 0, 0, 0, 1); else if(resto==2) acendeDigitoDisplay(0, 1, 0, 0, 1); else if(resto==3) acendeDigitoDisplay(1, 1, 0, 0, 1); else if(resto==4) acendeDigitoDisplay(0, 0, 1, 0, 1); else if(resto==5) acendeDigitoDisplay(1, 0, 1, 0, 1); else if(resto==6) acendeDigitoDisplay(0, 1, 1, 0, 1); else if(resto==7) acendeDigitoDisplay(1, 1, 1, 0, 1); else if(resto==8) acendeDigitoDisplay(0, 0, 0, 1, 1);

104

else acendeDigitoDisplay(1, 0, 0, 1, 1); if(resul==0) acendeDigitoDisplay(0, 0, 0, 0, 2); else if(resul==1) acendeDigitoDisplay(1, 0, 0, 0, 2); else if(resul==2) acendeDigitoDisplay(0, 1, 0, 0, 2); else if(resul==3) acendeDigitoDisplay(1, 1, 0, 0, 2); else if(resul==4) acendeDigitoDisplay(0, 0, 1, 0, 2); else if(resul==5) acendeDigitoDisplay(1, 0, 1, 0, 2); else if(resul==6) acendeDigitoDisplay(0, 1, 1, 0, 2); else if(resul==7) acendeDigitoDisplay(1, 1, 1, 0, 2); else if(resul==8) acendeDigitoDisplay(0, 0, 0, 1, 2); else acendeDigitoDisplay(1, 0, 0, 1, 2); }

105

Anexo G
G.1 Conjunto de Comandos para Programar o Mdulo LCD

106

G.2 Biblioteca em C para Manipulao e Programa Fonte para Testes com Mdulo LCD utilizando 4 bits
/******************************************************************** BIB_MOD_LCD.C Biblioteca em C para Manipulao de Mdulo LCD utilizando 4 bits e os pinos D0, D1 e D2 => para controle e D4, D5, D6 e D7 => para dados ********************************************************************/ // As definies a seguir so utilizadas para acesso aos pinos do display // caso o pino RW no seja utilizado, comente a definio lcd_rw #ifndef lcd_enable #define lcd_enable pin_d0 // pino enable do LCD #define lcd_rs pin_d1 // pino rs do LCD // #define lcd_rw pin_d2 // pino rw do LCD #define lcd_d4 pin_d4 // pino de dados d4 do LCD #define lcd_d5 pin_d5 // pino de dados d5 do LCD #define lcd_d6 pin_d6 // pino de dados d6 do LCD #define lcd_d7 pin_d7 // pino de dados d7 do LCD #endif #define lcd_type 2 #define lcd_seg_lin 0x40 // 0=5x7, 1=5x10, 2=2 linhas do display LCD // Endereo da segunda linha na RAM do LCD

// a constante abaixo define a seqncia de inicializao do mdulo LCD byte CONST INI_LCD[4] = {0x20 | (lcd_type << 2), 0xf, 1, 6}; // l um byte do LCD (somente com pino RW ativo) byte lcd_le_byte() { byte dado; // configura os pinos de dados como entradas input(lcd_d4); input(lcd_d5); input(lcd_d6); input(lcd_d7); // se o pino rw for utilizado, coloca em 1 #ifdef lcd_rw output_high(lcd_rw); #endif output_high(lcd_enable); // habilita display dado = 0; // zera a varivel de leitura // l os quatro bits mais significativos

107

if (input(lcd_d7)) bit_set(dado,7); if (input(lcd_d6)) bit_set(dado,6); if (input(lcd_d5)) bit_set(dado,5); if (input(lcd_d4)) bit_set(dado,4); // d um pulso na linha enable output_low(lcd_enable); output_high(lcd_enable); // l os quatro bits menos significativos if (input(lcd_d7)) bit_set(dado,3); if (input(lcd_d6)) bit_set(dado,2); if (input(lcd_d5)) bit_set(dado,1); if (input(lcd_d4)) bit_set(dado,0); output_low(lcd_enable); // desabilita o display return dado; // retorna o byte lido } // envia um dado de quatro bits para o display void lcd_envia_nibble( byte dado ) { // coloca os quatro bits nas saidas output_bit(lcd_d4,bit_test(dado,0)); output_bit(lcd_d5,bit_test(dado,1)); output_bit(lcd_d6,bit_test(dado,2)); output_bit(lcd_d7,bit_test(dado,3)); // d um pulso na linha enable output_high(lcd_enable); output_low(lcd_enable); } void lcd_envia_byte( boolean endereco, byte dado ) { // coloca a linha rs em 0 output_low(lcd_rs); // aguarda o display ficar desocupado //while ( bit_test(lcd_le_byte(),7) ) ; // configura a linha rs dependendo do modo selecionado output_bit(lcd_rs,endereco); delay_us(100); // aguarda 100 us // caso a linha rw esteja definida, coloca em 0 #ifdef lcd_rw output_low(lcd_rw); #endif // desativa linha enable output_low(lcd_enable); // envia a primeira parte do byte lcd_envia_nibble(dado >> 4); // envia a segunda parte do byte lcd_envia_nibble(dado & 0x0f);

108

} void lcd_ini() // rotina de inicializao do display { byte conta; output_low(lcd_d4); output_low(lcd_d5); output_low(lcd_d6); output_low(lcd_d7); output_low(lcd_rs); #ifdef lcd_rw output_high(lcd_rw); #endif output_low(lcd_enable); delay_ms(15); // envia uma seqncia de 3 vezes 0x03 // e depois 0x02 para configurar o mdulo // para modo de 4 bits for(conta=1;conta<=3;++conta) { lcd_envia_nibble(3); delay_ms(5); } lcd_envia_nibble(2); // envia string de inicializao do display for(conta=0;conta<=3;++conta) lcd_envia_byte(0,INI_LCD[conta]); } void lcd_pos_xy( byte x, byte y) { byte endereco; if(y!=1) endereco = lcd_seg_lin; else endereco = 0; endereco += x-1; lcd_envia_byte(0,0x80|endereco); } void lcd_escreve( char c) // envia caractere para o display { switch (c) { case '\f': lcd_envia_byte(0,1); delay_ms(2); break;

109

case '\n': case '\r' : case '\b': default : } }

lcd_pos_xy(1,2); break; lcd_envia_byte(0,0x10); break; lcd_envia_byte(1,c); break;

// le caractere do display char lcd_le( byte x, byte y) { char valor; // seleciona a posio do caractere lcd_pos_xy(x,y); // ativa rs output_high(lcd_rs); // l o caractere valor = lcd_le_byte(); // desativa rs output_low(lcd_rs); // retorna o valor do caractere return valor; } /******************************************************************** TESTA_MOD_LCD.C Programa que testa o mdulo LCD imprimindo um caractere no display Autor: Renato Vasques Beraldo ********************************************************************/ //Bibliotecas #include <16f877a.h> #include <BIB_MOD_LCD.C> #use delay(clock=4000000) #fuses HS, NOWDT, PUT, NOBROWNOUT, NOLVP main() { char dado[6] = {t, e, s, t, e}; int cont = 0; setup_adc_ports(no_analogs); lcd_ini(); for(cont = 0; cont < 6; cont++) lcd_escreve( dado[cont] ); }

Anexo H

110

H.1 Biblioteca I2C


/*****************************************************************/ /* I2C.C */ /* Biblioteca I2C - Comunicao I2C por software com suporte */ /* a memrias EEPROM (modo mestre) */ /* */ /* Autor: Fbio Pereira */ /* */ /*****************************************************************/ #ifndef scl // Definies dos pinos de comunicao #define scl pin_b1 // pino de clock #define sda pin_b0 // pino de dados #define EEPROM_SIZE 32768 // tamanho em bytes da memria EEPROM #endif #define seta_scl output_float(scl) #define apaga_scl output_low(scl) #define seta_sda output_float(sda) #define apaga_sda output_low(sda) // seta o pino scl // apaga o pino scl // seta o pino sda // apaga o pino sda

void I2C_start(void) // coloca o barramento na condio de start { apaga_scl; // coloca a linha de clock em nvel 0 seta_sda; // coloca a linha de dados em alta impedncia (1) seta_scl; // coloca a linha de clock em alta impedncia (1) apaga_sda; // coloca a linha de dados em nvel 0 apaga_scl; // coloca a linha de clock em nvel 0 } void I2C_stop(void) // coloca o barramento na condio de stop { apaga_scl; // coloca a linha de clock em nvel 0 apaga_sda; // coloca a linha de dados em nvel 0 seta_scl; // coloca a linha de clock em alta impedncia (1) seta_sda; // coloca a linha de dados em alta impedncia (1) } void i2c_ack() // coloca sinal de reconhecimento (ack) no barramento { apaga_sda; // coloca a linha de dados em nvel 0 seta_scl; // coloca a linha de clock em alta impedncia (1) apaga_scl; // coloca a linha de clock em nvel 0 seta_sda; // coloca a linha de dados em alta impedncia (1) }

111

void i2c_nack() // coloca sinal de no reconhecimento (nack) no barramento { seta_sda; // coloca a linha de dados em alta impedncia (1) seta_scl; // coloca a linha de clock em alta impedncia (1) apaga_scl; // coloca a linha de clock em nvel 0 } boolean i2c_le_ack() // efetua a leitura do sinal de ack/nack { boolean estado; seta_sda; // coloca a linha de dados em alta impedncia (1) seta_scl; // coloca a linha de clock em alta impedncia (1) estado = input(sda); // l o bit (ack/nack) apaga_scl; // coloca a linha de clock em nvel 0 return estado; } void I2C_escreve_byte(unsigned char dado) { // envia um byte pelo barramento I2C int conta=8; apaga_scl; // coloca SCL em 0 while (conta) { // envia primeiro o MSB if (shift_left(&dado,1,0)) seta_sda; else apaga_sda; // d um pulso em scl seta_scl; conta--; apaga_scl; } // ativa sda seta_sda; } unsigned char I2C_le_byte() // recebe um byte pelo barramento I2C { unsigned char bytelido, conta = 8; bytelido = 0; apaga_scl; seta_sda; while (conta) { // ativa scl seta_scl; // l o bit em sda, deslocando em bytelido shift_left(&bytelido,1,input(sda)); conta--; // desativa scl

112

apaga_scl; } return bytelido; } void escreve_eeprom(byte dispositivo, long endereco, byte dado) // Escreve um dado em um endereo do dispositivo // dispositivo - o endereo do dispositivo escravo (0 - 7) // endereco - o endereo da memria a ser escrito // dado - a informao a ser armazenada { if (dispositivo>7) dispositivo = 7; i2c_start(); i2c_escreve_byte(0xa0 | (dispositivo << 1)); // enderea o dispositivo i2c_le_ack(); i2c_escreve_byte(endereco >> 8); // parte alta do endereo i2c_le_ack(); i2c_escreve_byte(endereco); // parte baixa do endereo i2c_le_ack(); i2c_escreve_byte(dado); // dado a ser escrito i2c_le_ack(); i2c_stop(); delay_ms(10); // aguarda a programao da memria } byte le_eeprom(byte dispositivo, long int endereco) // L um dado de um endereo especificado no dispositivo // dispositivo - o endereo do dispositivo escravo (0 - 7) // endereco - o endereo da memria a ser escrito { byte dado; if (dispositivo>7) dispositivo = 7; i2c_start(); i2c_escreve_byte(0xa0 | (dispositivo << 1)); // enderea o dispositivo i2c_le_ack(); i2c_escreve_byte((endereco >> 8)); // envia a parte alta do endereo i2c_le_ack(); i2c_escreve_byte(endereco); // envia a parte baixa do endereo i2c_le_ack(); i2c_start(); // envia comando de leitura i2c_escreve_byte(0xa1 | (dispositivo << 1)); i2c_le_ack(); dado = i2c_le_byte(); // l o dado i2c_nack(); i2c_stop(); return dado; }

113

Anexo I
I.1 Biblioteca 25640.c
/////////////////////////////////////////////////////////////////////////// //// Library for a MicroChip 25C640 //// //// //// //// init_ext_eeprom(); Call before the other functions are used //// //// write_ext_eeprom(a, d); Write the byte d to the address a //// //// d = read_ext_eeprom(a); Read the byte d from the address a //// //// b = ext_eeprom_ready(); Returns TRUE if the eeprom is ready //// //// to receive opcodes //// //// //// //// The main program may define EEPROM_SELECT, EEPROM_DI, EEPROM_DO //// //// and EEPROM_CLK to override the defaults below. //// //// //// //// //// //// Pin Layout //// //// ----------------------------------------------//// //// | __ | //// //// | 1: CS EEPROM_SELECT | 8: VCC +5V | //// //// | | ____ | //// //// | 2: SO EEPROM_DO | 7: HOLD +5V | //// //// | __ | | //// //// | 3: WP +5V | 6: SCK EEPROM_CLK | //// //// | | | //// //// | 4: VSS GND | 5: SI EEPROM_DI | //// //// ----------------------------------------------//// //// //// /////////////////////////////////////////////////////////////////////////// //// (C) Copyright 1996, 2003 Custom Computer Services //// //// This source code may only be used by licensed users of the CCS C //// //// compiler. This source code may only be distributed to other //// //// licensed users of the CCS C compiler. No other use, reproduction //// //// or distribution is permitted without written permission. //// //// Derivative programs created using this software in object code //// //// form are not restricted in any way. //// /////////////////////////////////////////////////////////////////////////// #ifndef EEPROM_SELECT #define EEPROM_SELECT PIN_B0 #define EEPROM_CLK PIN_B1 #define EEPROM_DI PIN_B2 #define EEPROM_DO PIN_B4

114

#endif #define EEPROM_ADDRESS long int #define EEPROM_SIZE 8192 void init_ext_eeprom() { output_high(EEPROM_SELECT); output_low(EEPROM_DI); output_low(EEPROM_CLK); } BOOLEAN ext_eeprom_ready() { BYTE cmd[1], i, data; cmd[0] = 0x05; output_low(EEPROM_SELECT); for(i=1; i<=8; ++i) { output_bit(EEPROM_DI, shift_left(cmd,1,0)); output_high(EEPROM_CLK); //data latches output_low(EEPROM_CLK); //back to idle } for(i=1; i<=8; ++i) { output_high(EEPROM_CLK); //data latches shift_left(&data,1,input(EEPROM_DO)); output_low(EEPROM_CLK); //back to idle } output_high(EEPROM_SELECT); return !bit_test(data, 0); } void write_ext_eeprom(EEPROM_ADDRESS address, BYTE data) { BYTE cmd[4]; BYTE i; BYTE wren; wren=0x06; cmd[0]=data; cmd[1]=address; cmd[2]=(address>>8); cmd[3]=0x02; // Wait until the eeprom is done with a previous write while(!ext_eeprom_ready()); output_low(EEPROM_SELECT); for(i=0; i<8; ++i) { //rdsr opcode

115

output_bit(EEPROM_DI, shift_left(&wren,1,0)); output_high(EEPROM_CLK); output_low(EEPROM_CLK); } output_high(EEPROM_SELECT); output_low(EEPROM_SELECT); for(i=0; i<32; ++i) { output_bit(EEPROM_DI, shift_left(cmd,4,0)); output_high(EEPROM_CLK); output_low(EEPROM_CLK); } output_high(EEPROM_SELECT); } BYTE read_ext_eeprom(EEPROM_ADDRESS address) { BYTE cmd[3]; BYTE i,data; cmd[0]=address; cmd[1]=(address>>8); cmd[2]=0x03; // Wait until the eeprom is done with a previous write while(!ext_eeprom_ready()); output_low(EEPROM_SELECT); for(i=0; i<24; ++i) { output_bit(EEPROM_DI, shift_left(cmd,3,0)); output_high(EEPROM_CLK); output_low(EEPROM_CLK); } for(i=0; i<8; ++i) { shift_left(&data,1,input(EEPROM_DO)); output_high(EEPROM_CLK); output_low(EEPROM_CLK); } output_high(EEPROM_SELECT); return(data); }

I.2 Exemplo

utilizando

comunicao

serial

com

microcomputador e leitura / escrita em memria EEPROM 25640

116

/******************************************************************** TESTA_MEM_25640.C Programa que efetua leitura e escrita em memria 25640 utilizando envio e recebimento de dados atravs de comunicao serial com o microcomp. Autor: Renato Vasques Beraldo ********************************************************************/ //Bibliotecas #include <16F877a.h> #include <input.c> #include <25640.c> //Variveis de Configurao #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=4000000) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) void main() { byte value,cmd; EEPROM_ADDRESS address; init_ext_eeprom(); do { do { printf("\r\nRead or Write: "); cmd=getc(); cmd=toupper(cmd); putc(cmd); } while ( (cmd!='R') && (cmd!='W') ); printf("\n\rLocation: "); address = gethex(); if(cmd=='R') printf("\r\nValue: %X\r\n",READ_EXT_EEPROM( address ) ); if(cmd=='W') { printf("\r\nNew value: "); value = gethex(); printf("\n\r"); WRITE_EXT_EEPROM( address, value ); } } while (TRUE); }

117

Anexo J

J.1 Biblioteca mmc.c


// Written by Ed Waugh 2004, www.edwaugh.co.uk // for the original source, and hundreds more examples of PIC C code, see: // http://www.microchipc.com/sourcecode/#mmc int mmc_init(); int mmc_response(unsigned char response); int mmc_read_block(unsigned long block_number); int mmc_write_block(unsigned long block_number); int mmc_get_status(); /************************** MMC Init **************************************/ /* Initialises the MMC into SPI mode and sets block size, returns 0 on success */ int mmc_init() { int i; SETUP_SPI(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_4 | SPI_SS_DISABLED); *0x94 |= 0x40; *0x14 &= 0xEF; OUTPUT_HIGH(PIN_C2); for(i=0;i<10;i++) { SPI_WRITE(0xFF); } OUTPUT_LOW(PIN_C2); receives reset SPI_WRITE(0x40); SPI_WRITE(0x00); SPI_WRITE(0x00); SPI_WRITE(0x00); SPI_WRITE(0x00); SPI_WRITE(0x95); puts("Sent go to SPI\n\r"); // set CKE = 1 - clock idle low // set CKP = 0 - data valid on rising edge // set SS = 1 (off) // initialise the MMC card into SPI mode by sending clks on

// set SS = 0 (on) tells card to go to spi mode when it // send reset command // all the arguments are 0x00 for the reset command

// precalculated checksum as we are still in MMC mode

118

if(mmc_response(0x01)==1) return 1; from the mmc puts("Got response from MMC\n\r"); i = 0;

// if = 1 then there was a timeout waiting for 0x01

while((i < 255) && (mmc_response(0x00)==1)) // must keep sending command if response { SPI_WRITE(0x41); // send mmc command one to bring out of idle state SPI_WRITE(0x00); // all the arguments are 0x00 for command one SPI_WRITE(0x00); SPI_WRITE(0x00); SPI_WRITE(0x00); SPI_WRITE(0xFF); // checksum is no longer required but we always send 0xFF i++; } if(i >= 254) return 1; // if >= 254 then there was a timeout waiting for 0x00 from the mmc puts("Got out of idle response from MMC\n\r"); OUTPUT_HIGH(PIN_C2); SPI_WRITE(0xFF); OUTPUT_LOW(PIN_C2); SPI_WRITE(0x50); SPI_WRITE(0x00); SPI_WRITE(0x00); SPI_WRITE(0x02); SPI_WRITE(0x00); SPI_WRITE(0xFF); 0xFF // set SS = 1 (off) // extra clocks to allow mmc to finish off what it is doing // set SS = 0 (on) // send mmc command one to bring out of idle state // high block length bits - 512 bytes // low block length bits // checksum is no longer required but we always send

if((mmc_response(0x00))==1) return 1; OUTPUT_HIGH(PIN_C2); // set SS = 1 (off) puts("Got set block length response from MMC\n\r"); return 0; } /************************** MMC Get Status**********************************/ /* Get the status register of the MMC, for debugging purposes */ int mmc_get_status() {

119

OUTPUT_LOW(PIN_C2); SPI_WRITE(0x58); SPI_WRITE(0x00); SPI_WRITE(0x00); SPI_WRITE(0x00); SPI_WRITE(0x00); SPI_WRITE(0xFF); 0xFF OUTPUT_HIGH(PIN_C2); return 0; }

// set SS = 0 (on) // send mmc command one to bring out of idle state // // always zero as mulitples of 512 // checksum is no longer required but we always send // set SS = 1 (off)

/************************** MMC Write Block********************************/ int mmc_write_block(unsigned long block_number) { unsigned long i; unsigned long varh,varl; varl=((block_number&0x003F)<<9); varh=((block_number&0xFFC0)>>7); puts("Write block\n\r"); OUTPUT_LOW(PIN_C2); SPI_WRITE(0x58); SPI_WRITE(HIGH(varh)); SPI_WRITE(LOW(varh)); SPI_WRITE(HIGH(varl)); SPI_WRITE(0x00); SPI_WRITE(0xFF); 0xFF // block size has been set in mmc_init() // set SS = 0 (on) // send mmc write block

// always zero as mulitples of 512 // checksum is no longer required but we always send

if((mmc_response(0x00))==1) return 1; puts("Got response to write block\n\r"); SPI_WRITE(0xFE); for(i=0;i<512;i++) { SPI_WRITE(i2c_eeprom_read(HIGH(i),LOW(i))); } SPI_WRITE(0xFF); // dummy CRC // send data // send data token

120

SPI_WRITE(0xFF); if((SPI_READ(0xFF)&0x0F)!=0x05) return 1; puts("Got data response to write block\n\r"); OUTPUT_HIGH(PIN_C2); return 0; } // set SS = 1 (off)

/************************** MMC Read Block*********************************/ /**** Reads a 512 Byte block from the MMC and outputs each byte to RS232 ****/ int mmc_read_block(unsigned long block_number) { unsigned long i; unsigned long varh,varl; varl=((block_number&0x003F)<<9); varh=((block_number&0xFFC0)>>7); OUTPUT_LOW(PIN_C2); SPI_WRITE(0x51); SPI_WRITE(HIGH(varh)); SPI_WRITE(LOW(varh)); SPI_WRITE(HIGH(varl)); SPI_WRITE(0x00); SPI_WRITE(0xFF); 0xFF // set SS = 0 (on) // send mmc read single block command // arguments are address

// checksum is no longer required but we always send

if((mmc_response(0x00))==1) return 1; // if mmc_response returns 1 then we failed to get a 0x00 response (affirmative) puts("Got response to read block command\n\r"); if((mmc_response(0xFE))==1) return 1; // wait for data token puts("Got data token\n\r"); for(i=0;i<512;i++) { putc(SPI_READ(0xFF)); } SPI_READ(0xFF); SPI_READ(0xFF);

// we should now receive 512 bytes

// CRC bytes that are not needed

121

OUTPUT_HIGH(PIN_C2); SPI_WRITE(0xFF);

// set SS = 1 (off) // give mmc the clocks it needs to finish off

puts("\n\rEnd of read block\n\r"); return 0; } /************************** MMC get response****************************/ /**** Repeatedly reads the MMC until we get the response we want or timeout ****/ int mmc_response(unsigned char response) { unsigned long count = 0xFFFF; // 16bit repeat, it may be possible to shrink this to 8 bit but there is not much point while(SPI_READ(0xFF) != response && --count > 0); if(count==0) return 1; else return 0; } // loop was exited due to timeout // loop was exited before timeout

122

Anexo K
K.1 Variveis de Configurao do Microcontrolador PIC 16F877-A
Diretivas do Compilador o #FUSES Oscilador LP => Oscilador LP (Cristal de Baixa Potncia at 200kHz); RC => Oscilador RC (RC externo com sada de clock); XT => Oscilador XT (Cristal / Ressonador at 4MHz) HS => Oscilador HS (Cristal / Ressonador cermico de alta freqncia at 20MHz); INTRC => Oscilador Interno

Watchdog => Circuito temporizador que provocar um reset no programa sempre que ele produzir um timeout. Sua utilizao indicada a locais onde o programa no pode parar de funcionar. WDT => Watchdog habilitado NOWDT => Watchdog desabilitado

Code Protect => Proteo do Cdigo de Programa, habilitada esta opo ningum conseguir ler o cdigo do programa gravado na memria do microcontrolador.

123

PROTECT => Proteo de cdigo habilitada; PROTECT_75% => Proteo ligada para 75% da memria;

PROTECT_50% => Proteo ligada para 50% da memria;

NOPROTECT => Proteo desabilitada

Power Up Timer => quando ativada, far com que o microcontrolador s comece a funcionar cerca de 72ms depois que a fonte de alimentao for ligada. Isso garante que o oscilador j estar estabilizado, evitando travamento do microcontrolador. PUT => Temporizador de Power-Up ligado; NOPUT => Temporizador de Power-Up desligado;

Brown Out Detect => quando essa opo ativada, o microcontrolador ir resetar caso a tenso de alimentao caia abaixo de aproximadamente 4V. Caso no esteja ativada, o microcontrolador poder travar com a queda de tenso. BROWNOUT => Reset por queda de tenso ligado; NOBROWNOUT => Reset por queda de tenso desligado;

Low Voltage Program => Essa opo ativa a programao em baixa voltagem. A menos que voc saiba o que est fazendo, deixe-a desabilitada. necessrio que essa opo esteja desabilitada para que o pino RB3/PGM seja configurado como I/O.

124

NOLVP => Programao em baixa tenso desabilitada; LVP => Programao em baixa tenso habilitada;

K.2 Tabela com os Tipos de Dados suportados pelos compiladores CCS


TIPO void short int, int1, boolean char int, int8, byte signed char signed int, signed byte unsigned char unsigned int, unsigned long int, int16 signed long int unsigned long int float int32 signed int32 unsigned int32
FONTE: (PEREIRA, 2003)

TAMANHO em BITS 0 1 8 8 8 8 8 8 16 16 16 32 32 32 32

INTERVALO nenhum 0 ou 1 0 a 255 0 a 255 -128 a 127 -128 a 127 0 a 255 0 a 255 0 a 65.535 -32.768 a 32.767 -32.768 a 32.767 3.4E-38 a 3.4E+38 0 a 4.294.967.295 -2.147.483.648 a 2.147.483.647 0 a 4.294.967.295

125

K.3 Tabela com as Principais Funes em Linguagem C para compiladores CCS


FUNO
abs (int8 x) acos (float x) asin (float x) assert (cond) atan (float x) atan2 (float x, float y) atof (char x[]) atoi (char x[]) atol (char x[]) atoi32 (char x[]) bit_clear (varivel, bit) bit_set (varivel, bit) bit_test (varivel, bit) ceil (float x) cos (float x) cosh (float x) delay_cicles (const int8 x) delay_ms (const long int8 x) delay_us (const long int8 x) disable_interrupts (inter) enable_interrupts (inter) exp (float x) ext_int_edge (fonte, borda) fabs (float x) floor (float x)

RETORNO
int8 float float float float float int8 int16 int32 int1 float float float float float float

DESCRIO
Retorna o valor absoluto de x Calcula o arco cosseno de x Calcula o arco seno de x Emite mensagem caso a condio (cond) seja verdadeira Calcula o arco tangente de x Calcula o arco tangente de y/x Converte a string x em um nmero float Converte a string x em um nmero inteiro Converte a string x em um inteiro de 16 bits Converte a string x em um inteiro de 32 bits Apaga o bit (bit) da varivel (varivel) Ativa o bit (bit) da varivel (varivel) Retorna o valor do bit (bit) da varivel (varivel) Retorna o menor inteiro acima de x Calcula o cosseno de x radianos Calcula o cosseno hiperblico de x radianos Aguarda x ciclos de mquina Aguarda x milissegundos Aguarda x microssegundos Desliga a interrupo especificada Habilita a interrupo especificada Calcula e elevado a x Configura a borda de sensibilidade da interrupo externa Retorna o valor absoluto de x Retorna o menor valor inteiro abaixo de x

126

FUNO
fmod (float x, float y) frexp (float x, signed int8 *y) get_timerx ( ) getc ( ) fgetc ( stream ) gets ( ) fgets ( ) goto_address (int16 ou int32 x) i2c_poll ( ) i2c_read (int1 ack) i2c_start ( ) i2c_stop ( ) i2c_write (int8 x) input (int8 pino) input_x ( ) isamoung (char carac, const char[] x isalnum (char carac) isalpha (char carac) isdigit (char carac) islower (char carac) isspace (char carac) isupper (char carac) isxdigit (int8 carac) iscntrl (char carac) isgraph (char carac) isprint (char carac) ispunct (char carac)

RETORNO
float float int8 ou int16 char char &char &char int1 int8 int1 int1 int8 int1 int1 int1 int1 int1 int1 int1 int1 int1 int1 int1 int1

DESCRIO
Retorna o resto da diviso float de x por y Retorna o componente exponencial e fracionrio de x L o contedo do timer x L um caractere do dispositivo de entrada padro L um caractere da stream (stream) L uma string do dispositivo de entrada padro L uma string da stream (stream) Desvia para o endereo x Verifica se houve recepo na i2c L um dado da i2c Inicia uma condio de start na i2c Insere uma condio stop na i2c Escreve um dado (x) na i2c e retorna um ack ou nack L o estado de um pino do dispositivo L o estado de uma porta do dispositivo Retorna 1 caso o caractere pertena ao conjunto x Testa se o argumento uma letra ou nmero Testa se o argumento uma letra Testa se o argumento um nmero Testa se o argumento uma letra minscula Testa se o argumento um espao Testa se o argumento uma letra maiscula Testa se o argumento um digito hexadecimal Testa se o argumento um caractere de controle Testa se o argumento um caractere grfico Testa se o argumento imprimvel Testa se o argumento um caractere de pontuao

127

FUNO
kbhit ( ) label_address (rtulo) labs (int16 x) ldexp (float x, signed int8 y) log (float x) log10 (float x) make8 (int16 ou int32 val, desloc) make16 (int8 var1, int8 var2) make32 (int8 ou int16 a, b, c, d) memcpy (dest, fonte, num) memset (dest, valor, n) modf (float x, float *y) offsetof (estrutura, campo) offsetofbit (estrutura, campo) output_bit (int8 pino, int1 valor) output_float (int8 pino) output_high (int8 pino) output_low (int8 pino) output_x (int8 valor) perror (string) port_b_pulls (int1 valor) pow (float x, float y) printf ( [func,] string [, valores] fprintf( string [, valores], stream)

RETORNO
int1 int16 ou int32 int16 float float float int8 int16 int32 float int8 int8 float -

DESCRIO
Retorna se h caractere recebido na serial Retorna o endereo fsico do rtulo especificado Retorna o valor absoluto de x Retorna x vezes 2 elevado a y Calcula o logaritmo natural de x Calcula o logaritmo base 10 de x L um byte especificado por (desloc) valor (val) Gera um nmero de 16 bits a partir de dois de 8 Gera um nmero de 32 bits a partit de 2 ou mais de 8 ou 16 bits Copia n bytes do ponteiro (fonte) para o ponteiro (dest) Seta n bytes do ponteiro (dest) com valor (valor) Retorna a parte inteira e fracionria de x Retorna o deslocamento em bytes do campo na estrutura especificada Retorna o deslocamento em bits do campo na estrutura especificada Coloca o pino especificado no nvel lgico (valor) Coloca o pino em estado de alta impedncia Coloca o pino especificado em nvel lgico 1 Coloca o pino especificado em nvel lgico 0 Coloca o (valor) na porta especificada por x Imprime a string erro no dispositivo STDERR Configura os resistores de pull-up internos da porta b Retorna x elevado a y Imprime dados Imprime dados na stream especificada

128

FUNO
psp_output_full ( ) psp_input_full ( ) psp_overflow ( ) putc (int8 dado) fputc (int8 dado, stream) puts (string) fputs (string, stream) read_adc ( ) read_bank (banco, desloc) read_calibration (int8 n) read_eeprom (int8 end) read_program_eeprom (int16 ou int32 end) reset_cpu ( ) restart_cause ( ) restart_wdt ( ) rotate_left (var, bytes) rotate_right (var, bytes) set_adc_channel (canal) set_pwmx_duty (int8 ou int16 valor) set_timerx (int8 ou int16 valor) set_tris_x (int8 valor) set_uart_speed (valor) setup_adc (int8 modo) setup_adc_ports (valor) setup_ccpx (modo) setup_comparator (modo) setup_counters (modo, presc)

RETORNO
int1 int1 int1 int8 ou int16 int8 int8 int8 int8 ou int16 int8 -

DESCRIO
Testa se a porta paralela escrava j foi lida Testa se foi escrito um dado na porta paralela escrava Testa se foi sobrescrito o caractere na porta paralela escrava Escreve o dado na sada padro Escreve o dado na stream especificada Escreve a string na sada padro Escreve a string na stream especificada L o resultado da converso AD L um registrador GPR do banco especificado L um valor de calibrao do PIC 14000 L um endereo da memria EEPROM L um endereo da memria de programa Reinicia o processador Retorna a causa do reset do processador Reinicia a contagem do watchdog Rotaciona 1 bit esquerda a varivel (var) Rotaciona 1 bit direita a varivel (var) Seleciona um canal do AD Configura o ciclo ativo do pwm especificado por x Carrega um valor no timer especificado Configura o registrador tris especificado Configura a velocidade da USART Configura o mdulo ADC interno Configura os pinos de entrada analgicos Configura o mdulo CCP especificado Configura o mdulo comparador analgico interno Configura o timer 0 e o prescaler

129

FUNO
setup_psp (modo) setup_spi (modo) setup_timer_x (modo) setup_vref (modo | valor) setup_wdt (modo) shift_left (vari, int8 bytes, int1 valor) shift_right (vari int8 bytes, int1 valor) sin (float x) sinh (float x) sleep ( ) spi_data_is_in ( ) spi_read (int8 valor) spi_write (int8 dado) sprintf (string, constante, valores) sqrt (float x) strcat (s1, s2) strchr (s1, char c)

RETORNO
int1 int1 float float int1 int8 float pointer pointer

DESCRIO
Configurra a porta paralela escrava Configura o SSP ou MSSP para um modo SPI Configura o timer especificado Configura o mdulo de referncia interna de tenso Configura o watchdog Desloca a varivel (vari) esquerda inserindo o bit (valor) Desloca a varivel (vari) direita inserindo o bit (valor) Retorna o seno de um ngulo de x radianos

Coloca o PIC em modo SLEEP Retorna se h dado disponvel na interface SPI L um dado na interface SPI Escreve um dado na interface SPI Imprime dados para uma string Retorna a raiz quadrada de x Concatena a string s2 em s1 Retorna um ponteiro para a ocorrncia do caractere c na string s1 Retorna um ponteiro para a ocorrncia do caractere c na string s1, iniciando a procura pelo final da string Compara a s1 com s2 Compara os n primeiros caracteres de s1 com s2 Compara a string s1 com s2 ignorando maiculas e minsculas Copia n caracteres de s2 para s1 Conta os caracteres iniciais de s1 que no pertencem a s2 Conta os caracteres iniciais de s1 presentes em s2

strrchr (s1, char c) strcmp (s1, s2) strncmp (s1, s2, int n) stricmp (s1, s2) strncpy (s1, s2, int n) strcspn (s1, s2) strspn (s1, s2)

pointer int8 int8 int8 pointer int8 int8

130

FUNO
strlen (s1) strlwr (s1) strpbkr (s1, s2) strstr (s1, s2) strtok (s1, s2) strcpy (s1, s2) swap (int8 x) tan (float x) tanh (float x) tolower (char x) toupper (char x) write_bank (banco, desloc, valor) write_eeprom (end, valor)
FONTE: (PEREIRA, 2003)

RETORNO
int8 pointer pointer pointer pointer float float char char -

DESCRIO
Conta o nmero de caracteres em s1 Converte a string s1 em minsculas Procura na string s1 pelo primeiro caractere tambm presente em s2 Procura a string s2 na string s1 Procura a prxima ocorrncia de um sinal definido em s2 na string s1 Copia a string s2 na string s1 Inverte os nibbles da varivel x Calcula a tangente de x em radianos Calcula a tangente hiperblica de x em radianos Converte o caractere x em minsculo Converte o caractere x em maisculo Escreve um dado num endereo de memria RAM Escreve um valor na memria EEPROM

131

Anexo L
L.1 Planilha de Microcontroladores Selecionados

132

Anexo M
M.1 Tutorial
1. Processo de Gravao de Um Microcontrolador PIC

Para escrever e gravar programas em um microcontrolador necessrio se ter um gravador, um software gravador, um compilador e um programa. O programa pode ser escrito em linguagem assembler ou linguagem C e conter as informaes de configurao do microcontrolador e a lgica do dispositivo. Normalmente usa-se o MPLAB IDE (editor, compilador assembler e simulador), o PCW C Compiler IDE (editor, compilador C e simulador) ou mikroC (que no ser abordado neste tutorial) para desenvolver programas para os microcontroladores. Caso o programador assembler preferir ele poder escrever seus programas em qualquer editor de texto e depois compil-lo utilizando o MPASMWIN que pode ser encontrado separado ou juntamente com o MPLAB IDE que podem ser descarregados no stio da Microchip Technology Inc. (MICROCHIP, 2006), j o PCW pode ser adquirido no stio da Custom Computer Services, Inc. (CCS, 2006). O software de gravao IC-PROG pode ser obtido gratuitamente no stio (IC-PROG, 2005), este tem como principal funo transmitir as informaes hexadecimais geradas pelo compilador de forma correta para o gravador. O gravador recebe os sinais gerados pelo computador transmitindo-os para o microcontrolador de forma que seja possvel o seu armazenamento. O diagrama 1 ilustra a seqncia de passos necessrios para a programao de microcontrolador.

133

Diagrama 1: Esquema de Gravao de Microcontroladores PIC.

utilizao

de

softwares

prprios

para

edio

de programas

para os

microcontroladores bem interessante, pois eles so projetados para proporcionar ao programador um melhor aproveitamento dos recursos do microcontrolador, deixando a disposio do programador ferramentas como, por exemplo, o debugger para simulao e correo de erros no programa, analisador de quantidade aproximada de memria que ser utilizada para armazenamento do programa e durante a sua execuo, etc.

2.

Escrevendo um programa

Neste captulo sero apresentados de forma breve dois modos de programao (assembler e C) e suas respectivas interfaces o MPLAB IDE (verso 7.31) e o PCW C Compiler IDE (verso 3.203). No final deste tutorial sero mostrados os dois cdigos fontes, um em assembler e um em C, estes apenas realizam uma contagem de 0 a 9 e mostram os dgitos em um display de 7 segmentos.

2.1

Assembler e o MPLAB IDE

Antes de comear a escrever o cdigo do programa ser preciso criar um novo projeto e definir algumas configuraes iniciais. Para criar um projeto, compilar e simular siga os seguintes passos:

134

1. Abra o MPLAB IDE (tela 1);

Tela 1: Tela inicial do MPLAB IDE

2. Clique no menu Project e depois em Project Wizard (tela 2);

Tela 2: Menu Project -> Project Wizard

135

3. Aparecer primeira tela do assistente de criao de projeto, clique em Avanar ou Next, com isso ser apresentada a tela de escolha de modelo de microcontrolador (tela 3) a ser utilizado neste projeto.

Tela 3: Segunda tela do assistente de criao de projeto

4. Neste

tutorial

ser

utilizado

microcontrolador

PIC

16F877A

para

desenvolvimento das aplicaes de exemplo, feita a escolha do modelo, novamente clicaremos em Avanar ou Next; 5. Na prxima tela solicitada escolha do compilador e linker que ser utilizado no projeto, como j foi descrito anteriormente o MPLAB IDE ser utilizado para desenvolvimento de aplicaes em assembler, ento dever ser selecionada na primeira caixa de seleo (Active Toolsuite) a opo Microchip MPASM Toolsuite (tela 4) feita esta seleo, novamente clicaremos em Avanar ou Next;

136

Tela 4: Seleo da ferramenta a ser utilizada na aplicao.

6. Nesta tela (tela 5) daremos um nome ao projeto e escolheremos onde sero guardados os arquivos referentes ao mesmo, no caso do projeto ser chamado de display e ser armazenado no diretrio C:\display7, feito novamente clicaremos em Avanar ou Next e depois em OK;

Tela 5: Escolha do nome e diretrio de projeto.

7. Depois de concludas as seis etapas anteriores vamos clicar em Avanar ou Next at ser apresentada a tela com um resumo das opes selecionadas (tela 6) anteriormente e confirmando que o projeto foi criado com xito, clique no boto de Concluir para finalizar a criao do projeto.

137

Tela 6: Concluso de criao de projeto.

8. Depois de ser concluda a criao do projeto, criaremos um novo arquivo que conter o nosso programa, clique no menu File e depois em New (tela 7).

Tela 7: Criao de um novo arquivo.

9. A seguir ser mostrada uma nova janela onde o programador poder escrever o seu programa (tela 8).

138

Tela 8: Janela de criao de programa.

10. Depois de escrito e salvo na pasta do projeto (C:\display7) temos que adicionlo ao projeto, clique com o boto direito sobre a pasta Source File e depois em Add files..., uma nova tela se abrir onde s escolher o arquivo salvo anteriormente. Chegou hora de compilarmos para ver se h ou no erros, se no houver erros, automaticamente ser criado um arquivo .hex, que posteriormente ser utilizado para exemplificar o uso do software gravador. Para compilar o programa clique no menu Project e depois em Build All (tela 9).

Tela 9: Compilao do projeto.

11. Aps o termino ser exibida uma janela contendo informaes sobre o processo de compilao (tela 10), caso houver erros de compilao estes estaro listados junto com suas respectivas informaes e caso no houver

139

erros voltar para o cdigo do programa e a mensagem BUILD SUCCEEDED constar na lista de informaes da compilao.

Tela 10: Janela com informaes sobre a compilao do projeto.

12. Agora vamos dar uma olhada na ferramenta de debug do MPLAB IDE, para habilit-la clique no menu Debugger, depois em Select Tool marque a opo MPLAB SIM, feito isto voc poder notar que foi acrescentada um conjunto de botes abaixo da barra de menu (tela 11), estas so as ferramentas de execuo passo a passo do programa.

Tela 11: Conjunto de botes do debugger.

140

13. O primeiro boto da barra de ferramentas do debug denominado de run serve para simular a execuo do programa no microcontrolador; o segundo o boto de pause e serve para paralisar a execuo da simulao; o terceiro denominado de animate tem como funo ir executando cada instruo aportando a mesma no cdigo do programa (facilita a visualizao da execuo); o quarto, o quinto e o sexto so para fazer a simulao manualmente; e o stimo o boto reset que serve para reiniciar a execuo do programa. Toda vez que estivermos realizando uma simulao e quisermos saber o valor de uma varivel do programa naquele momento s colocar o mouse sobre a varivel e esperar, pois o seu valor ser apresentado (tela 12).

Tela 12: Apresentao de valor de varivel.

14. Alm da ferramenta de debug temos tambm no menu view mais algumas ferramentas interessantes como a Memory Usage Gauge (tela 13) que analisa o uso de memria de programa e memria de dados.

141

Tela 13: Janela que mostra a ferramenta Memory Usage Gauge.

Finalizamos aqui a breve apresentao da interface de programao da Microchip Technology Inc.

2.2

C e o PCW C Compiler IDE

A interface do PCW C Compiler IDE bem amigvel e os passos para o desenvolvimento de um programa em linguagem C para microcontroladores bem parecido com os passos apresentados acima para o MPLAB IDE. Vamos criar um novo projeto e compil-lo seguindo os seguintes passos: 1. Abra o PCW C Compiler IDE (tela 14);

Tela 14: Tela inicial do PCW C Compiler IDE.

2. Clique no menu Project depois em New e em seguida em PIC Wizard (tela 15);

142

Tela 15: Menu Project -> PIC Wizard.

3. Feito isto, aparecer uma tela pedindo para voc escolher o diretrio ou criar uma pasta para salvar seus arquivos; 4. Criada a pasta e salvo o arquivo ser mostrada uma nova tela (tela 16) aonde o programador ir escolher e definir o modelo do microcontrolador e tambm ter acesso a vrias configuraes do mesmo. A princpio devem ser mudadas apenas a freqncia do oscilador para 4.000.000 HZ e desmarcar a opo Low Voltage Programming on B3(PIC16) or B5(PIC18);

Tela 16: Definio de modelo e configuraes do microcontrolador.

143

5. Depois de definidas todas as configuraes e clicarmos no boto de OK sero criados dois arquivos um .c e um .h, o .c o arquivo que contm o cdigo do programa que est sendo desenvolvido e o arquivo .h contm as configuraes que foram definidas na tela anterior. Acabado este processo ser exibido um arquivo com algumas definies (tela 17) e neste dever ser escrito o cdigo do programa;

Tela 17: Janela com o arquivo que foi criado.

6. Depois de escrito o programa iremos compil-lo, clique no boto Compile no menu e logo em seguida clique em Compile novamente, aps a compilao se no houver erros no programa ser exibida uma janela com demonstrativos do possvel uso de memria do microcontrolador em relao ao programa compilado (tela 18), caso haja erros uma mensagem ser exibida na parte inferior da interface e a linha seguinte ao erro no cdigo ser colocada em evidencia;

144

Tela 18: Demonstrativo da utilizao de memria relativo ao projeto.

7. Depois de compilado, o arquivo .hex j estar criado e pronto para ser gravado no microcontrolador; 8. Esta interface de programao tambm oferece boas ferramentas, mas uma que chama a ateno possui a funo de mostrar o cdigo assembler gerado a partir do cdigo em C, esta est disponvel no menu View depois clique em C/ASM List (tela 19).

145

Tela 19: Exemplo de cdigo assembler gerado a partir de um cdigo C.

Finalizamos aqui a breve apresentao da interface de programao da Custom Computer Services, Inc.

3.

Gravando um programa

Neste captulo ser apresentado o software de gravao, IC-PROG (verso 1.05D), com as suas funcionalidades. A seguir temos os passos para configurar o software e para gravar um arquivo .hex em um microcontrolador. 1. Abra o IC-Prog (tela 20);

146

Tela 20: Janela inicial do IC-Prog

2. O IC-Prog possue interface em portugus, para habilit-la, clique em Settings no menu e depois clique em Options, na prxima janela clique na aba Language e escolha Portuguese. Clique em no boto de OK e pronto; 3. Para usurios de Windows XP/2000/NT que querem utilizar o IC-Prog ser necessrio baixar no stio do mesmo um arquivo chamado de icprog.sys que possue definies para estes sistemas operacionais. Para instalar este arquivo basta clicar em Configurao no menu, depois clique em Opes e em seguida clique na aba Diversos, marque a opo Ativar Driver NT/2000/XP. Clique em no boto de OK e pronto (tela 21);

147

Tela 21: Janela de configurao do driver para Windows NT/2000/XP.

4. Agora iremos selecionar o tipo de gravador que ser utilizado. Clique em Configurao e depois em Hardware, na nova janela escolha o programador JDM Programmer e marque em qual porta ele est instalado (tela 22).

Tela 22: Janela de configurao do hardware gravador.

5. Esta a ltima parte das configuraes clique em Configurao depois em opes, na aba Programando desmarque as duas opes, pronto agora est tudo configurado.

148

6. Vamos carregar o arquivo .hex que foi gerado em qualquer um dos softwares de compilao. Clique em Arquivo no menu e depois em abrir. Procure o diretrio onde foi salvo o seu projeto e clique em cima do arquivo .hex depois clique em no boto de abrir (tela 23);

Tela 23: Janela de procura e carregamento do arquivo .hex.

7. Depois de carregar o arquivo que vai ser transferido para o microcontrolador, agora iremos efetuar a transferncia, clique em Comando no menu e depois em Limpar tudo. Feita a limpeza agora iremos clicar novamente no menu Comando e depois em Programar tudo, clique em yes na janela de mensagem que ira aparecer. Aguarde o trmino da gravao (vide tela 24) e pronto, seu microcontrolador agora j est com o programa armazenado em sua memria.

149

Tela 24: Janela que mostra o processo de gravao.

Finalizamos aqui a breve apresentao da interface para gravao IC-Prog.

4.

Concluses

Este breve tutorial apresentou duas das principais ferramentas para desenvolvimento de programas para microcontroladores pic e tambm abordou a principal ferramenta de transferncia do programa para o microcontrolador.

Potrebbero piacerti anche