Você está na página 1de 96

Sistemas de MicroControladores

CET em Automao, Robtica e Controlo Industrial, 4 Edio.

Bernardino Neves Coimbra 2011

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

ndice
Introduo................................................................................................................................1 Arquitectura PIC18. ..................................................................................................................3 O PIC18F4620........................................................................................................................ 3 Identificao e nomenclatura dos pinos. ............................................................................... 5 Estrutura interna. .................................................................................................................. 7 Configurao do oscilador. .................................................................................................... 9 Configurao do hardware. ................................................................................................. 13 Sistema de reset.................................................................................................................. 14 Ambiente de programao MPLAB IDE. ................................................................................. 17 Introduo ao sistema integrado MPLAB. ............................................................................ 17 Instalao do MPLAB. .......................................................................................................... 17 Compilador C18. ..................................................................................................................... 21 Instalao do compilador C18. ............................................................................................ 21 Especificaes do compilador C18. ...................................................................................... 23
Tipo e tamanho de variveis. ........................................................................................................ 23 Armazenamento por tipo de dados............................................................................................... 23 Armazenamento por classes - Overlay. ......................................................................................... 24 Armazenamento por qualificadores. ............................................................................................. 24 Incluir ficheiros - #INCLUDE .......................................................................................................... 25 Macros predefinidas do compilador C18. ...................................................................................... 25 A directiva #PRAGMA. .................................................................................................................. 26

Directivas do compilador C18. ............................................................................................. 27 Livrarias de funes do compilador C18. ............................................................................. 27 Primeiros passos com o MPLAB IDE. ...................................................................................... 29 Criar e configurar um projecto no MPLAB IDE. .................................................................... 29 Primeiro programa. ............................................................................................................. 32
Modificar o contedo de registos e variveis. ............................................................................... 34 Parar o programa num determinado sitio especifico Breakpoint................................................. 35 Tempo de execuo...................................................................................................................... 35

O simulador STIMULUS. ...................................................................................................... 37 O logic analyzer. .................................................................................................................. 39 Depurador/Gravador PICKIT 3. ............................................................................................ 40 Bernardino Neves - 2011 Pgina i

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011 Integrao do PICKIT 3 com o MPLAB IDE. ........................................................................... 41 Programao em C, para microcontroladores. ....................................................................... 43 Princpios de programao. ................................................................................................. 43
Fluxogramas. ................................................................................................................................ 43 lgebra de booleana..................................................................................................................... 44 Variveis e dados.......................................................................................................................... 45 Operadores. ................................................................................................................................. 45

Introduo a linguagem C.................................................................................................... 45


Palavras reservadas. ..................................................................................................................... 45 Identificadores. ............................................................................................................................ 45

Variveis e tipos de dados. .................................................................................................. 46


Declarao de variveis. ............................................................................................................... 46 Declarao de constantes. ............................................................................................................ 46

Operadores. ........................................................................................................................ 47
Aritmticos................................................................................................................................... 47 Relacionais. .................................................................................................................................. 47 Lgicos. ........................................................................................................................................ 48 Memoria. ..................................................................................................................................... 50 Associao de operadores. ........................................................................................................... 50

Declaraes de controlo. ..................................................................................................... 51


Comando IF. ................................................................................................................................. 51 Comando SWITCH. ....................................................................................................................... 52 Comando FOR. ............................................................................................................................. 53 Comando WHILE........................................................................................................................... 53 Comando DO-WHILE..................................................................................................................... 54 Comando GOTO. .......................................................................................................................... 54

Tipos e dados avanados. .................................................................................................... 55


Ponteiros...................................................................................................................................... 55 Matrizes de dados. ....................................................................................................................... 56 Estruturas..................................................................................................................................... 58 Unies.......................................................................................................................................... 60

Funes. ............................................................................................................................. 61 Programao dos microcontroladores PIC18. ......................................................................... 63 Portos I/O............................................................................................................................... 69 Leitura do estado de um pino. ............................................................................................. 70 Escrita em um pino. ............................................................................................................ 70 Pgina ii

Bernardino Neves 2011

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Exemplos de aplicao. ....................................................................................................... 71


Exemplo 1 Led a piscar com frequncia igual a 1Hz. ................................................................... 71 Exemplo 2 Sequncia de Leds. .................................................................................................. 72 Exemplo 3 Variao da frequncia. ............................................................................................ 75 Exemplo 4 Activar uma sada atravs de uma entrada. ............................................................... 77 Exemplo 5 Mudana de estado (Toggle). .................................................................................... 78 Exemplo 6 Atraso a operao..................................................................................................... 79 Exemplo 7 Avano a operao. .................................................................................................. 80 Exemplo 8 Arranque estrela - tringulo. ..................................................................................... 82 Exemplo 9 Display de 7 segmentos. ........................................................................................... 83 Exemplo 10 Leitura e escrita em um pino (maximizao do pino). .............................................. 86

Bernardino Neves - 2011

Pgina iii

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

ndice de figuras
Fig 1 - Arquitectura de um sistema constitudo por um P. ....................................................... 1 Fig 2 - Arquitectura de um C, com os mesmos perifricos. ...................................................... 1 Fig 3 - Pinout do microcontrolador PIC18F4620 verso DIP 40 pinos [1]. ................................... 5 Fig 4 - Diagrama de blocos da estrutura interna do microcontrolador PIC 18LF4620 [1]............. 8 Fig 5 - Implementao do oscilador de cristal. ........................................................................... 9 Fig 6 - Implementao do oscilador por fonte de relgio externo. ........................................... 10 Fig 7 - Implementao do oscilador RC. ................................................................................... 11 Fig 8 - Diagrama de blocos do mdulo de configurao do oscilador [1]. ................................. 12 Fig 9 - Reset por alimentao inicial do C............................................................................... 14 Fig 10 - Reset devido a alimentao inicial do C. .................................................................... 15 Fig 11 - Reset devido a estabilizao do oscilador. ................................................................... 15 Fig 12 - Reset gerado por queda de tenso. ............................................................................. 15 Fig 13 - Diagrama de blocos do circuito de reset [1]................................................................. 16 Fig 14 - Origem do evento de reset. ......................................................................................... 16 Fig 15 - Ficheiros descompactados. ......................................................................................... 17 Fig 16 Seleco da instalao completa. ............................................................................... 18 Fig 17 - Localizao do ficheiro de instalao. .......................................................................... 18 Fig 18 - Janela de progresso da instalao. .............................................................................. 19 Fig 19 - Localizao da instalao do compilador C18. ............................................................. 21 Fig 20 - Seleco dos componentes do compilador C18. .......................................................... 21 Fig 21 - Configurao das variveis. ......................................................................................... 22 Fig 22 - Ligao do MPLAB IDE ao compilador C18................................................................... 22 Fig 23 - Criar uma novo projecto. ............................................................................................ 29 Fig 24 - Seleco do compilador C18. ...................................................................................... 29 Fig 25 Concluso da configurao do projecto. ..................................................................... 30 Fig 26 - Pasta Source Files. ....................................................................................................... 30 Fig 27 - Janela para adicionar ficheiros ao projecto. ................................................................ 31 Fig 28 - Ambiente de trabalho. ................................................................................................ 31 Fig 29 - Localizao do icon Make............................................................................................ 32 Fig 30 - Seleccionar o simulador MPALB SIM. .......................................................................... 33 Fig 31 - Comandos do simulador MPLAB SIM. ......................................................................... 33 Fig 32 Seleco da janela File Registers e Special Function Registers. .................................... 34 Fig 33 - Inserir uma varivel para se ter acesso aos seus parmetros. ...................................... 34 Fig 34 - Janela Watch. ............................................................................................................. 35 Fig 35 - Definio da frequncia de clock, base de tempo do simulador MPLAB SIM. ............... 35 Fig 36 Exemplo, determinao do tempo de execuo. ........................................................ 36 Fig 37 - Resultado do tempo de execuo do exemplo proposto. ............................................ 36 Fig 38 - Janela de configurao do simulador Stimulus. ........................................................... 38 Fig 39 Localizao do Fire Button. ......................................................................................... 38

Pgina iv

Bernardino Neves 2011

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Fig 40 Resultado da simulao Stimulus. .............................................................................. 38 Fig 41 - Seleco do canal a analisar. ....................................................................................... 39 Fig 42 - Resultado obtido pelo analisador lgico. ..................................................................... 39 Fig 43 - Depurador/Programador PICKIT 3. .............................................................................. 40 Fig 44 - Descrio dos pinos do conector ICSP. ........................................................................ 40 Fig 45 Ligao entre PICKIT 3 e o microcontrolador. ............................................................. 41 Fig 46 - Verificao da integrao do programador PICKIT 3 com o MPLAB IDE. ....................... 41 Fig 47 Fluxograma do exemplo proposto. ............................................................................. 44 Fig 48 - Ficheiro de instalao do bootloader AN1310. ............................................................ 63 Fig 49 - Primeira janela de instalao do software PC do bootloader AN1310. ......................... 64 Fig 50 - Segunda janela de instalao do software PC do bootloader AN1310.......................... 64 Fig 51 Localizao da instalao do software PC AN1310. ..................................................... 64 Fig 52 Finalizao da instalao do software PC AN1310. ..................................................... 65 Fig 53 - Fonte de alimentao. ................................................................................................ 65 Fig 54 - Microcontrolador PIC18F4620 e transceiver RS232. .................................................... 65 Fig 55 - Programao em circuito ICSP..................................................................................... 66 Fig 56 Imagem do hardware desenvolvido, o kit DevBoard PIC. ............................................ 66 Fig 57 - Localizao do bootloader PIC18. ................................................................................ 66 Fig 58 - Setup experimental para testar o hardware e o software PC. ...................................... 67 Fig 59 - Localizao do software PC AN1310. ........................................................................... 67 Fig 60 - Software PC para carregar o programa no microcontrolador....................................... 67 Fig 61 - Configurao do Baud Rate. ........................................................................................ 68 Fig 62 Comunicao entre o software PC e o microcontrolador. ........................................... 68 Fig 63 - Modelo simplificado do porto I/O [1]. ......................................................................... 69 Fig 64 - Layout do circuito do exemplo 1. ................................................................................ 71 Fig 65 - Layout do circuito do exemplo 2. ................................................................................ 72 Fig 66 - Layout do circuito do exemplo 3. ................................................................................ 75 Fig 67 - Layout do circuito do exemplo 4. ................................................................................ 77 Fig 68 - Layout do circuito do exemplo 5. ................................................................................ 78 Fig 69 - Layout do circuito do exemplo 6. ................................................................................ 79 Fig 70 - Layout do circuito do exemplo 7. ................................................................................ 80 Fig 71 - Layout do circuito do exemplo 8. ................................................................................ 82 Fig 72 - Layout do circuito do exemplo 9. ................................................................................ 83 Fig 73 - Diagrama temporal, da tcnica para maximizar um pino I/O. ...................................... 87 Fig 74 - Layout do circuito do exemplo 10. .............................................................................. 87

Bernardino Neves - 2011

Pgina v

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

ndice de tabelas
Tabela 1 - Modos de gesto de energia. .................................................................................... 3 Tabela 2 - Memoria de programa e dados disponvel. ............................................................... 4 Tabela 3 - Perifricos internos. .................................................................................................. 4 Tabela 4 - Nomenclatura do pinout do microcontrolador. ......................................................... 7 Tabela 5 - Valor dos condensadores para os diferentes tipos de cristais. ................................. 10 Tabela 6 - Registos da palavra de configurao do microcontrolador. ..................................... 13 Tabela 7 - Tipo de variveis, o seu tamanho e limites. ............................................................. 23 Tabela 8 - Localizao das variveis em funo dos qualificadores. ......................................... 25 Tabela 9 - Tamanho dos ponteiros. ......................................................................................... 25 Tabela 10 - Directivas do compilador C18. ............................................................................... 27 Tabela 11 Livraria de funes de matemtica. ...................................................................... 28 Tabela 12 - Livrarias de funes gerais. ................................................................................... 28 Tabela 13 - Livrarias de funes de software. .......................................................................... 28 Tabela 14 - Livrarias de funes de hardware. ......................................................................... 28 Tabela 15 - Cdigo do ficheiro do exemplo. ............................................................................. 32 Tabela 16 - Cdigo do segundo exemplo proposto. ................................................................. 37 Tabela 17 Smbolos de fluxograma. ...................................................................................... 43 Tabela 18- Operadores lgicos. ............................................................................................... 44 Tabela 19 Palavras reservadas em programao em C. ......................................................... 45

Referncias
[1] Datasheet PIC18F4620 (Microchip). [2] MPLAB C18 C Compiler User Guide (Microchip). [3] MPLAB C18 C Compiler Library (Microchip). [4] AN1310, Serial Bootloader for PIC16 and PIC18 (Microchip). [5] Fbio Pereira, PIC Programao em C rica, 2007. [6] Fbio Pereira, Microcontrolador PIC18 Detalhado rica, 2010.

Pgina vi

Bernardino Neves 2011

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Introduo.
Pretende-se nesta unidade de formao, denominada de Sistemas de MicroControladores, adquirir competncias para o desenvolvimento de sistemas electrnicos com microcontroladores. O microcontrolador que ser usado como base de estudo, o PIC18F4620, desenvolvido e produzido pela empresa Microchip Techonology. Trata-se de um microcontrolador para aplicaes de complexidade intermdia. Os microcontroladores tm ocupado bem o seu lugar no nosso dia-a-dia, podemos facilmente verificar que, em mdia recorremos ao uso de cerca de 10 dispositivos controlados por microcontroladores, tais como um simples relgio, o comando da TV, o circuito electrnico do nosso carro, o telemvel, etc. O nascimento do microcontrolador, surge pela necessidade de integrar no mesmo componente, o hardware necessrio, para que tenha um comportamento e performances de um micro computador, permitindo assim poupar tempo e espao na construo de novas aplicaes. Repare-se que o uso de microprocessadores ou microcontroladores, depende do fim ou aplicao a que se destina, tendo em considerao capacidade de processamento, memria, hardware disponvel e custos. As figuras 1 e 2 mostram dois sistemas, um constitudo por um microprocessador e outro por um microcontrolador equivalente em termos de perifricos.
Bus de dados

P
8085

EPROM 2532

RAM 62256

Timer 8155

USART 8251

IO 8255

Bus de controlo

Fig 1 - Arquitectura de um sistema constitudo por um P.

IO RAM

USART

P
EPROM

Timers

PIC18
Fig 2 - Arquitectura de um C, com os mesmos perifricos.

Bernardino Neves - 2011 Introduo

Pgina 1

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Durante a unidade de formao sero abordados os seguintes temas: Diferenas entre microprocessadores e microcontroladores; Arquitectura dos microcontroladores PIC18; Configurao dos microcontroladores PIC18; Ambiente de desenvolvimento e concepo de programas para microcontroladores PIC18; Compilador C para microcontroladores PIC18; Programao em C, o essencial para microcontroladores; Programao dos microcontroladores PIC18; Configurao e aplicao dos perifricos; Electrnica aplicada a sistemas de microcontroladores; Desenvolvimento de aplicaes com microcontroladores PIC18.

Pgina 2

Bernardino Neves 2011 Introduo

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Arquitectura PIC18.
O PIC18F4620.
O microcontrolador em estudo o PIC18F4620. A escolha deste microcontrolador, deve-se ao facto, do docente de ter mais experincia com esta famlia de microcontroladores. O PIC18F4620 um microcontrolador avanado de 8 bits com memria de programa flash, caracterizado pelo conversor analgico/digital de 10 bits e por utilizar a tecnologia nano watt. A verso F caracterizada por operar com tenses de alimentao na ordem dos 5V. Este microcontrolador tal como a sua famlia, tem a particularidade de ser possvel gerir os seus recursos de energia, isto , como o microcontrolador est dividido em duas partes, o processador e os controladores (perifricos internos), possvel definir por questes energticas que partes devem estar activas. Para gesto de energia possvel definir 3 estados como demonstra a tabela seguinte. Modo Executar (Run) Espera (Idle) Adormecido (Sleep) Estado do processador Activo Desactivo Desactivo Estado dos controladores Activo Activo Desactivo

Tabela 1 - Modos de gesto de energia.

Em termos de flexibilidade e estrutura do oscilador, o PIC 18F4620 permite a configurao do oscilador em quatro modos distintos de cristal, sendo possvel utilizar cristais at 25 Mhz e recorrendo ao Phase Lock Loop (PLL) possvel multiplicar por 4 a frequncia de oscilao do cristal ou do oscilador interno. A frequncia mxima de oscilao est limitada a 40 MHz incluindo com o uso do PLL, possui ainda um oscilador interno que pode operar desde 31Khz at 32Mhz. O microcontrolador tambm permite o uso de um oscilador secundrio de 32Khz, que poder ser usado para gerar um relgio em tempo real independente do oscilador principal. Sobre os perifricos internos, podemos destacar as seguintes caractersticas: Possui 36 pinos I/O distribudos por 5 portos, podendo cada pino I/O suportar uma corrente at 25 mA. Apesar de um pino I/O suportar uma corrente de 25 mA, o microcontrolador apenas suporta uma corrente total de 200 mA; Possui trs modos de interrupo externos com quatro entradas destinadas a gerar interrupo por mudana de estado; Possui um mdulo avanado de captura, comparao e modulao por largura de pulso (PWM), sendo possvel definir at 4 sadas PWM, com seleco de polaridade, programao do tempo no activo e com reinicializao e desligamento automtico; Possui um mdulo de comunicao SPI (suporta os 4 modos) e I2C; Possui um mdulo avanado de comunicao USART, que permite a comunicao segundo os protocolos RS232, RS485 e LIN/J2602, sendo possvel utilizar o protocolo RS232 com

Bernardino Neves - 2011 Arquitectura PIC18

Pgina 3

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011


recurso ao oscilador interno, dispensando assim o cristal externo, sendo tambm possvel detectar a taxa de transmisso automaticamente; Possui 13 canais analgicos/digitais de 10 bits, atravs do mdulo ADC, sendo que este mdulo ADC permite a capacidade de aquisio automtica e a converso durante o modo adormecido; Possui um temporizador/contador de 8 bits e 3 temporizadores/contadores de 16 bits.

Alm das caractersticas acima mencionadas, o microcontrolador possui ainda as seguintes caractersticas: Permite a escrita de cem mil vezes na memoria flash de programa; Permite a escrita de um milho de vezes na memria EEPROM; Permite a reteno dos dados tanto na memria de programa como na memria EEPROM por um perodo de cem anos; Possui um multiplicador por hardware de 8 bits por 8 bits; Possui um temporizador WatchDog (WDT) prolongado, permitindo a configurao de 4ms ate 131s; Permite o download de programas atravs da programao em circuito (ICSP).

As tabelas seguintes mostram de um modo geral e simplificado as caractersticas do microcontrolador PIC 18F4620.

Memria de programa Flash (bytes) Instrues 64K 32768

Memria de dados RAM (bytes) EEPROM (bytes) 3968 1024

Tabela 2 - Memoria de programa e dados disponvel.

I/O 36

Canais ADC 13

CCP/PWM 1/1

SPI S

I2C S

USART 1

COMP 2

Timers (8/16 bits) 1/3

Tabela 3 - Perifricos internos.

Em termos de encapsulamento, existem no mercado trs tipos distintos, a verso DIP de 40 pinos, a verso TQFP de 44 pinos e a verso QFN tambm de 44 pinos, neste documento apenas se far referncia verso DIP de 40 pinos visto que ser o encapsulamento usado no hardware proposto. No datasheet do fabricante poder encontrar o pinout das outras verses de encapsulamento.

Pgina 4

Bernardino Neves 2011 Arquitectura PIC18

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Identificao e nomenclatura dos pinos.


A figura 3 mostra o pinout do microcontrolador PIC 18F4620, na verso de encapsulamento DIP 40 pinos.

Fig 3 - Pinout do microcontrolador PIC18F4620 verso DIP 40 pinos [1].

Na tabela seguinte descrimina-se detalhadamente, a identificao e funo de cada um dos pinos do microcontrolador, de modo a perceber-se melhor o significado de cada nomenclatura utilizada.

Nome do pino

Nmero do pino

Tipo de pino
I PWR I I/O I I/O I I/O I I O I/O I I I/O I O

Tipo de sinal
ST ST TTL Analgico TTL Analgico TTL Analgico Analgico Analgico TTL Analgico Analgico ST ST

Designao

MCLR VPP RE3 RA0 AN0 RA1 AN1 RA2 AN2 VrefCVref RA3 AN3 VrefRA4 T0CKI C1OUT

2 3

Reset externo quando colocado a 0. Entrada para programao (13 V). Entrada digital. Pino 0 do porto A. Entrada analgica 0. Pino 1 do porto A. Entrada analgica 1. Pino 2 do porto A. Entrada analgica 2. Tenso negativa de referncia para o ADC. Tenso de sada de referncia do comparador. Pino 3 do porto A. Entrada analgica 3. Tenso positiva de referncia para o ADC. Pino 4 do porto A. Entrada externa de relgio para o Timer0. Sada do comparador 1.

Bernardino Neves - 2011 Arquitectura PIC18

Pgina 5

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011


RA5 AN4 SS HLVDIN C2OUT RE0 RD AN5 RE1 WR AN6 RE2 CS AN7 VDD VSS OSC1 CLKI RA7 OSC2 CLKO RA6 RC0 T1OSO T13CKI RC1 T1OSI CCP2 RC2 CCP1 P1A RC3 SCK SCL RD0 PSP0 RD1 PSP1 RD2 PSP2 RD3 PSP3 RC4 SDI SDA RC5 SDO RC6 TX CK RC7 RX DT RD4 PSP4 RD5 PSP5 P1B I/O I I I O I/0 I I I/0 I I I/0 I I P P I I I/O O O I/O I/O O I I/O I I/O I/O I/O O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I I/O I/O O I/O O I/O I/O I I/O I/O I/O I/O I/O O TTL Analgico TTL Analgico ST TTL Analgico ST TTL Analgico ST TTL Analgico Pino 5 do porto A. Entrada analgica 4. Pino de seleco de dispositivo em comunicao no modo SPI. Pino de deteco de tenso. Sada do comparador 2. Pino 1 do porto E. Pino RD de controlo do porto paralelo de comunicaes. Entrada analgica 5. Pino 2 do porto E. Pino WR de controlo do porto paralelo de comunicaes. Entrada analgica 6. Pino 2 do porto E. Pino CS de controlo do porto paralelo de comunicaes. Entrada analgica 7. Pino de alimentao do microcontrolador. Pino de massa do microcontrolador. Pino 1 do cristal de oscilao. Entrada de uma fonte de relgio externo. Pino 7 do porto A. Pino 2 do cristal de oscilao. Sada de uma fonte de relgio. Pino 6 do porto A. Pino 0 do porto C Pino 1 do cristal de oscilao do Timer1. Entrada externa de relgio para Timer1 e Timer3. Pino 1 do porto C. Pino 2 do cristal de oscilao do Timer1. Entrada/Sada do mdulo CCP2. Pino 2 do porto C. Entrada/Sada do mdulo CCP1. Sada dedicada do mdulo CCP1. Pino 3 do porto C. Relgio de sincronismo para comunicaes SPI. Relgio de sincronismo para comunicaes I2C. Pino 0 do porto D. Bit 0 de dados do porto paralelo. Pino 1 do porto D. Bit 1 de dados do porto paralelo. Pino 2 do porto D. Bit 2 de dados do porto paralelo. Pino 3 do porto D. Bit 3 de dados do porto paralelo. Pino 4 do porto C. Entrada de dados na comunicao SPI. Linha de dados na comunicao I2C. Pino 5 do porto C. Sada de dados na comunicao SPI. Pino 6 do porto C. Linha de transmisso na comunicao USART. Relgio de sincronismo na comunicao USART. Pino 7 do porto C. Linha de recepo na comunicao USART. Linha de sincronismo de dados em comunicao USART. Pino 4 do porto D. Bit 4 de dados do porto paralelo. Pino 5 do porto D. Bit 5 de dados do porto paralelo. Sada dedicada do mdulo CCP1.

10 11 12 13

ST CMOS TTL

14

TTL ST ST ST CMOS ST ST ST ST ST ST ST TTL ST TTL ST TTL ST TTL ST ST ST ST ST ST ST ST ST ST TTL ST TTL

15

16

17

18

19 20 21 22

23

24

25

26

27

28

Pgina 6

Bernardino Neves 2011 Arquitectura PIC18

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

RD6 PSP6 P1C RD7 PSP7 P1D VSS VDD RB0 INT0 FLT0 AN12 RB1 INT1 AN10 RB2 INT2 AN8 RB3 AN9 CCP2 RB4 KBI0 AN11 RB5 KBI1 PGM RB6 KBI2 PGC RB7 KBI3 PGD

29

30 31 32

33

34

35

36

37

38

39

40

I/O I/O O I/O I/O O P P I/O I I I I/O I I I/O I I I/O I I/O I/O I I I/O I I/O I/O I I/O I/O I I/O

ST TTL ST TTL

TTL ST ST Analgico TTL Analgico ST TTL Analgico ST TTL Analgico ST TTL TTL Analgico TTL TTL ST TTL TTL ST TTL TTL ST

Pino 6 do porto D. Bit 6 de dados do porto paralelo. Sada dedicada do mdulo CCP1. Pino 7 do porto D. Bit 7 de dados do porto paralelo. Sada dedicada do mdulo CCP1. Pino de massa do microcontrolador. Pino de alimentao do microcontrolador. Pino 0 do porto B. Pino 0 de interrupo externa. Pino dedicado ao CCP1. Entrada analgica 12. Pino 1 do porto B. Pino 1 de interrupo externa. Entrada analgica 10. Pino 2 do porto B. Pino 2 de interrupo externa. Entrada analgica 8. Pino 3 do porto B. Entrada analgica 9. Entrada/Sada do mdulo CCP2. Pino 4 do porto B. Pino 0 de interrupo por mudana de estado. Entrada analgica 11. Pino 5 do porto B. Pino 1 de interrupo por mudana de estado. Pino de seleco do ICSP. Pino 6 do porto B. Pino 2 de interrupo por mudana de estado. Pino de sincronismo do ICSP. Pino 7 do porto B. Pino 3 de interrupo por mudana de estado. Pino de dados do ICSP.

Tabela 4 - Nomenclatura do pinout do microcontrolador.

Legenda: I O I/O ST TTL PWR Entrada (Input). Sada (Output). Entrada ou sada. Sinal do tipo Schmitt Trigger. Sinal do tipo TTL. Alimentao.

Estrutura interna.
Como foi descrito nas linhas acima, neste captulo pretende-se conhecer as caractersticas do microcontrolador. A estrutura interna d-nos uma ideia de como o microcontrolador no seu interior, o microcontrolador PIC 18F4620 foi optimizado para poder executar um conjunto de instrues em velocidade muito alta, de facto possvel obter uma velocidade de 10 MIPS (MIPS Milhes de instrues por segundo) para uma frequncia de oscilao de 40 Mhz, o que se pode considerar um bom desempenho mesmo para aplicaes exigentes.

Bernardino Neves - 2011 Arquitectura PIC18

Pgina 7

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011


Algumas das caractersticas importantes da estrutura interna so: Capacidade de pipeline, isto , enquanto executa uma instruo, o processador procura a prxima instruo a ser executada, de forma a acelerar a execuo do programa; Cada instruo apenas ocupa uma posio de memria de programa; Permite a execuo de uma instruo num ciclo de mquina; Capacidade de manter um tempo fixo para a execuo de todas as instrues; Semelhana e compatibilidade entre as diversas famlias de microcontrolador, o que facilita a migrao de uma aplicao de um microcontrolador para outro. A estrutura interna do microcontrolador pode ser vista como um conjunto de blocos funcionais. Estes blocos funcionais permitem uma maior facilidade em perceber como constitudo internamente o microcontrolador. No datasheet do fabricante podemos visualizar um diagrama de blocos que define a estrutura interna do microcontrolador. Tal como se ilustra na figura 4.

Fig 4 - Diagrama de blocos da estrutura interna do microcontrolador PIC 18LF4620 [1].

Pgina 8

Bernardino Neves 2011 Arquitectura PIC18

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

A partir do diagrama de blocos da estrutura interna do microcontrolador, podemos obter todas as informaes relevantes sobre o microcontrolador. No canto superior esquerdo podemos verificar qual a estrutura e registos associados a memoria de programa FLASH. Do lado direito temos definido os PORTOS. No centro superior temos a estrutura e registos associados a memoria RAM. No centro temos a unidade lgica e aritmtica (ULA). No lado centro esquerdo temos os registos associados a configurao de hardware do microcontrolador e por fim no canto inferior esquerdo temos os perifricos disponveis no microcontrolador. Por exemplo em relao aos PORTOS, podemos verificar que existem 5 PORTOS designados de A a E, quais os seus pinos e funes associados a cada PORTO e tambm podemos verificar que o bus de dados para os PORTOS um bus de 8 bits.

Configurao do oscilador.
O microcontrolador PIC 18F4620 pode utilizar 10 tipos diferentes de osciladores, conforme a lista seguinte: LP Oscilador de cristal de baixa potncia; XT Oscilador de cristal de quartz; HS Oscilador de cristal de quartz de alta velocidade; HSPLL - Oscilador de cristal de quartz de alta velocidade com multiplicador de frequncia; RC Oscilador formado pelo conjunto resistncia e condensador, com sada de relgio no pino RA6; RCIO - Oscilador de formado pelo conjunto resistncia e condensador; INTIO1 Oscilador interno com sada de relgio no pino RA6; INTIO2 Oscilador interno; EC Fonte de relgio externo com sada de relgio no pino RA6; ECIO Fonte de relgio externo.

O tipo de oscilador usado deve ser de acordo com a aplicao que se pretende. Por exemplo uma aplicao simples, como o controlo automtico de um porto, o oscilador interno responde bem as necessidades pretendidas, mas se for necessria uma base de tempo mais precisa a uma grande velocidade o mais correcto escolher um cristal de quartz de alta velocidade. Para aplicaes cuja base de tempo indispensvel, podemos colocar externamente um relgio de tempo real (RTC). Para implementar um oscilador de cristal, basta ligar os terminais do cristal aos pinos OSC1 e OSC2 juntamente com um par de condensadores conforme a figura seguinte.

C OSC1 Cristal C OSC2

Fig 5 - Implementao do oscilador de cristal.

Bernardino Neves - 2011 Arquitectura PIC18

Pgina 9

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011


O valor dos condensadores depende do valor e tipo de cristal escolhido. A tabela seguinte mostra os valores recomendados pelo fabricante do microcontrolador.

Tipo de oscilador LP XT

HS

Frequncia 32 Khz 1 Mhz 4 Mhz 4 Mhz 10 Mhz 20 Mhz 25 Mhz

Valor de C em pF 30 15 15 15 15 15 15

Tabela 5 - Valor dos condensadores para os diferentes tipos de cristais.

Os osciladores EC e ECIO requerem uma fonte de relgio externo ligado no pino OSC1. Reparese que no modo EC obtemos uma fonte de relgio no pino OSC2, cuja frequncia um quarto do da fonte. Este pino OSC2 pode ser usado para sincronizar perifricos externos. A figura 6 mostra a ligao tpica da fonte de relgio ao microcontrolador.

Clock

OSC1 / CLKI

Clock / 4

OSC2 / CLKO

Fig 6 - Implementao do oscilador por fonte de relgio externo.

O oscilador RC usado para aplicaes em que a base de tempo no relevante, sendo a sua implementao feita a partir de um circuito simples constitudo por uma resistncia e um condensador. Neste oscilador a frequncia de oscilao depende da tenso de alimentao, dos valores da resistncia, do condensador, e da temperatura de funcionamento. Pode acontecer tambm que para os mesmos componentes, dois dispositivos diferentes tenham frequncias de oscilao diferentes. Esta situao acontece devido s variaes de fabrico dos componentes, quer do microcontrolador ou da resistncia e do condensador.

Pgina 10

Bernardino Neves 2011 Arquitectura PIC18

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Tambm neste tipo de oscilador possvel obter uma sada de relgio, cuja frequncia um quarto da frequncia gerada pelo oscilador RC. A figura 7 mostra o circuito tpico para a implementao do oscilador RC.
VCC

R OSC1 C

Clock / 4

OSC2

Fig 7 - Implementao do oscilador RC.

Os valores recomendados para a resistncia e o condensador so e a frequncia de oscilao pode ser calculada pela expresso f = 1 / RC.

O uso do multiplicador de frequncia apenas pode ser usado quando o tipo de oscilador de cristal de alta velocidade ou ento com o oscilador interno. Com esta opo possvel utilizar um cristal de frequncia mais baixo e colocar o microcontrolador a funcionar a uma frequncia muito mais alta, repare que a frequncia mxima permitida pelo microcontrolador de 40 Mhz, por essa razo quando pensar em utilizar esta opo, o cristal de alta velocidade no deve ultrapassar os 10 Mhz. Um exemplo tpico pode ser a necessidade de utilizar uma fonte de relgio proveniente do microcontrolador, para sincronismo de perifricos externos. Nesse caso para no limitar a frequncia de oscilao do microcontrolador podemos usar o multiplicador de frequncia para obter uma maior frequncia de oscilao no microcontrolador e uma frequncia mais baixa para o sincronismo. Uma das vantagens que o microcontrolador escolhido nos apresenta, o facto de incorporar um oscilador interno, com capacidade de gerar uma frequncia de oscilao at aos 32 Mhz. O gerador de relgio interno, pode ser uma ideia interessante quando se pretende reduzir custos com cristais ou outras fontes relgio externas. Existem duas fontes de relgio do oscilador interno, a primeira uma fonte relgio de 8 Mhz com capacidade de gerar frequncias de 31 Khz at 4 Mhz, a segunda uma fonte de relgio proveniente de um oscilador RC interno configurado para gerar uma frequncia de 31Khz. Apesar do oscilador interno ser um pormenor a considerar, no nos podemos esquecer da influncia da temperatura na frequncia gerada. O prprio microcontrolador incorpora um registo o OSCTUNE onde uma possvel funo calibrar a frequncia de oscilao em funo da temperatura. Esta calibrao no automtica, sendo necessrio criar um programa e inserir um sensor de temperatura no nosso hardware para ser possvel calibrar a frequncia de oscilao em funo da temperatura.

Bernardino Neves - 2011 Arquitectura PIC18

Pgina 11

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011


A figura 8 mostra o diagrama de blocos do mdulo de configurao do oscilador, em que facilmente podemos verificar os componentes que integram o mdulo de configurao do oscilador.

Fig 8 - Diagrama de blocos do mdulo de configurao do oscilador [1].

Pelo diagrama de blocos, podemos verificar no canto superior esquerdo os pinos das fontes externas de relgio, tanto do oscilador principal como do oscilador secundrio, no centro superior podemos verificar o multiplicador de frequncia e o seu registo associado. Repare que no diagrama de blocos possvel verificar que tipos de oscilador permitido usar com o multiplicador de frequncia. Na parte inferior podemos visualizar os componentes do oscilador interno e o seu registo de configurao, outra informao que podemos obter pela anlise do diagrama de blocos os registos associados ao controlo da configurao do oscilador. Repare que possvel internamente, pela manipulao de registos de configurao do sistema do oscilador, alterar a frequncia de clock a meio de um programa de acordo com as especificaes da aplicao, mas esta possibilidade apenas possvel a quando do uso do oscilador interno.

Os registos associados ao controlo da configurao oscilador so: OSCCON Registo de controlo do oscilador; OSCTUNE Registo de calibrao do oscilador.

Pgina 12

Bernardino Neves 2011 Arquitectura PIC18

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Configurao do hardware.
Os microcontroladores PIC, possuem uma posio de memria, situada aps o final da memria de programa, que serve para armazenar as configuraes de hardware interno do microcontrolador. Nesta zona encontram-se registos, cuja funo configurar o hardware de acordo com a aplicao pretendida. A tabela 6, mostra os registos e a sua funo. As diferentes famlias de microcontroladores PIC, possuem distintas palavras de configurao, isto , para cada microcontrolador, convm consultar o seu respectivo datasheet para confirmar os registos e funes, para posteriormente serem configurados.

Endereo 0x300001 0x300002 0x300003 0x300005 0x300006 0x300008 0x300009 0x30000A 0x30000B 0x30000C 0x30000D 0x3FFFFE 0x3FFFFF

Nome CONFIG1H CONFIG2L CONFIG2H CONFIG3H CONFIG4L CONFIG5L CONFIG5H CONFIG6L CONFIG6H CONFIG7L CONFIG7H DEVID1 DEVID3

Funo Configurao do oscilador. Configuraes de reset e alimentao. Configurao do Watchdog (WDT) Configurao da funo de pinos IO. Configurao da programao por ICSP. Proteco de dados na memria FLASH. Proteco de dados na memria EEPROM. Proteco de escrita na memria FLASH. Proteco de escrita na memria EEPROM. Proteco de dados. Proteco de dados. Identificao do dispositivo. Identificao do dispositivo.

Tabela 6 - Registos da palavra de configurao do microcontrolador.

CONFIG1H

0 Seleco do oscilador Activa a monitorizao do relogio Activa a transio do oscilador interno para externo

CONFIG2L

0 Habilita o reset por PWRT Habilita o reset por BOR Seleco da tenso de referencia para BOR

CONFIG2H

0 Habilita o WDT Postscale WDT

CONFIG3H

0 Selecciona o CCP2 no pino RC1 ou RB3 Selecciona o PortoB como IO ou ADC Configurao do oscilador do Timer1 Habilita o pino 1 como MCLR

Bernardino Neves - 2011 Arquitectura PIC18

Pgina 13

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

CONFIG4L

0 Reset causado pela Stack Habilita a alimentao por ICSP Habilita a instruo extensa Habilita a programao por ICSP, pinos RB6 e RB7 dedicados ao ICSP

CONFIG5L

0 Habilita a proteco de leitura do cdigo de programa

CONFIG5H

0 Habilita a proteco de leitura da EEPROM Habilita a proteco de leitura do cdigo BOOT

CONFIG6L

0 Habilita a proteco de escrita no cdigo de programa

CONFIG6H

0 Habilita a proteco de escrita na palavra de configurao Habilita a proteco de escrita na EEPROM Habilita a proteco de escrita no cdigo BOOT

CONFIG7L

0 Habilita a proteco de leitura feita a partir de outros blocos

CONFIG7H

0 Habilita a proteco de leitura do BOOT, a partir de outros blocos

Sistema de reset.
O sistema de reset do microcontrolador PIC, responsvel por iniciar a CPU e perifricos, aps um dos seguintes eventos: Alimentao inicial do C (POR), um circuito detecta a subida de tenso de alimentao e mantm o reset at esse valor atingir o valor nominal;

VCCn

VCC

RESET

Fig 9 - Reset por alimentao inicial do C.

Pgina 14

Bernardino Neves 2011 Arquitectura PIC18

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Temporizador de inicializao (PWRT), um circuito mantm o reset durante um perodo de tempo, cerca de 66ms aps a alimentao inicial do C, para activar o PWRT necessrio activar o bit PWRT da palavra de configurao, registo CONFIG2L;

VCCn

VCC

RESET

TPWRT

Fig 10 - Reset devido a alimentao inicial do C.

Arranque do oscilador (OST), um determinado tempo anexo ao tempo total de reset do C, para a estabilizao do oscilador externo.

VCCn

VCC

RESET

TPWRT

TOST

Fig 11 - Reset devido a estabilizao do oscilador.

Queda de alimentao (BOR), quando o circuito detecta um valor abaixo de um determinado valor de referncia, especificado pelos bits BORV0 e BORV1, no registo CONFIG2L, gera um reset ao C.

VCC

Vref

RESET

Fig 12 - Reset gerado por queda de tenso.

Bernardino Neves - 2011 Arquitectura PIC18

Pgina 15

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Reset provocado pelo watchdog (WDT). O watchdog um temporizador, cuja funo gerar um reset, para que o programa no entre num ciclo infinito e bloqueie o sistema. A figura seguinte mostra, o diagrama de blocos do circuito de reset.

Fig 13 - Diagrama de blocos do circuito de reset [1].

Pelo diagrama de blocos, podemos verificar que, alm dos eventos acima referidos, possvel tambm por software atravs da instruo RESET, gerar reset ao C. Repare ainda que, ocorre um reset, quando ocorre um overflow da pilha de desvio de programa (Stack Pointer). A verificao da origem do reset, pode ser efectuada atravs do registo RCON, pois a origem do evento apaga a sua respectiva flag no registo, devendo o utilizador voltar a colocar a 1 por software.

RCON

0 Reset por queda de tenso Reset causado pela inicializao Reset por WDT Reset causado pela instruo RESET

Fig 14 - Origem do evento de reset.

Pgina 16

Bernardino Neves 2011 Arquitectura PIC18

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Ambiente de programao MPLAB IDE.

Introduo ao sistema integrado MPLAB.


A Microchip possibilita a utilizao de diferentes sistemas de desenvolvimento, desde compiladores, programadores, etc., todos eles controlados por uma nica ferramenta de desenvolvimento, o sistema integrado MPLAB. Este sistema inclui todos os utilitrios necessrios para desenvolver qualquer projecto, assim sem sair da janela principal, tem-se acesso a qualquer utilitrio quer de hardware ou software de um modo simples e rpido. Depois de se criar um programa possvel execut-lo atravs do simulador. A simulao feita passo a passo de um modo animado ou de forma contnua, sendo possvel parar o seu funcionamento em qualquer momento, tanto para verificar o estado de registos ou mesmo para os alterar para de seguida voltar a executar a simulao com as modificaes efectuadas.

Instalao do MPLAB.
Para instalar o MPLAB IDE, necessrio descarregar atravs da internet, na pgina da Microchip (www.microchip.com) o software de desenvolvimento MPLAB IDE. Ao entrar na pagina Web da Microchip, na sua pagina principal encontra-se um link com o nome de MPLAB IDE. Nessa pgina a Microchip faz uma apresentao do MPLAB IDE e no final possvel descarregar o software. Aps descarregar o software MPLAB IDE, passamos etapa seguinte que a instalao. Numa primeira fase necessrio descompactar o ficheiro recebido, e aps este passos encontramos os ficheiros que se mostra na figura 15.

Fig 15 - Ficheiros descompactados.

Para instalar a aplicao necessrio executar o ficheiro SETUP.exe, nas trs janelas seguintes dever seleccionar o boto NEXT. A primeira janela uma janela de boas vindas, a segunda a aceitao dos termos da licena de instalao e a terceira a seleco por defeito de instalao completa, como mostra a figura 16.

Bernardino Neves - 2011 Ambiente de programao MPLAB IDE

Pgina 17

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Fig 16 Seleco da instalao completa.

Aps a seleco de instalao completa, chega o momento de indicar o local onde se deve instalar o software MPLAB IDE, pode aceitar a sugesto por defeito ou ento seleccionar outra directoria para a instalao, no final deve pressionar o boto NEXT, para executar a instalao.

Fig 17 - Localizao do ficheiro de instalao.

Volte a pressionar o boto NEXT at aparecer a janela de progresso da instalao.

Pgina 18

Bernardino Neves 2011 Ambiente de programao MPLAB IDE

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Fig 18 - Janela de progresso da instalao.

No final da instalao ir aparecer uma janela a perguntar se pretende instalar o software HITECH Software, fica ao vosso critrio a sua instalao. No final da instalao necessrio reiniciar o computador para finalizar a instalao.

Bernardino Neves - 2011 Ambiente de programao MPLAB IDE

Pgina 19

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Pgina 20

Bernardino Neves 2011 Ambiente de programao MPLAB IDE

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Compilador C18.
Instalao do compilador C18.
Neste momento, j tem instalado o MPLAB IDE. O prximo passo instalar o compilador C18 da Microchip, que ir permitir compilar os programas desenvolvidos em linguagem C. Existe uma verso para estudantes do compilador C18, o qual deve descarregar da pagina Web da Microchip, que s permite a optimizao de cdigo at um limite de 30 dias, e neste caso para os programas propostos a optimizao de cdigo no ser um factor relevante. A instalao do compilador C18 requer alguma ateno, para o efeito detalha-se de seguida todos os passos requeridos na instalao. Numa primeira fase devesse seleccionar o directrio onde deve ficar o compilador, devendo-se aceitar a sugesto que aparece na janela, porque mais tarde ser necessrio referenciar alguns ficheiros desse directrio e assim torna-se mais simples.

Fig 19 - Localizao da instalao do compilador C18.

Na prxima janela, a figura 20 aparecem os componentes que se pretende instalar, devendo-se instalar todos os componentes, como mostra a figura seguinte.

Fig 20 - Seleco dos componentes do compilador C18.

Bernardino Neves - 2011 Compilador C18

Pgina 21

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Na prxima janela, a figura 21 deve seleccionar os trs primeiros itens da configurao das variveis de ambiente.

Fig 21 - Configurao das variveis.

A janela seguinte, a figura 22 diz respeito a ligao do MPLAB IDE ao compilador C18, devendo seleccionar todos os itens.

Fig 22 - Ligao do MPLAB IDE ao compilador C18.

Nas prximas janelas que visualizar durante a instalao pressione o boto NEXT at concluir a instalao. Aps a instalao do compilador C18, j se encontra com as ferramentas necessrias para o desenvolvimento de programas para os microcontroladores da Microchip. Mas ainda necessria a integrao do compilador com o MPLAB IDE.

Pgina 22

Bernardino Neves 2011 Compilador C18

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Especificaes do compilador C18.


Tal como qualquer compilador, o compilador C18 tem as suas especificaes.

Tipo e tamanho de variveis.


O compilador C18 suporta o standard ANSI na definio de tipos de inteiros, a tabela 7 mostra o tipo de variveis, o seu tamanho e limites. Tipo char unsigned char int unsigned int short unsigned short short long unsigned short long long unsigned long Tamanho 8 8 16 16 16 16 24 24 32 32 Mnimo -128 0 -32.768 0 -32.768 0 -8.388.608 0 -2.147.483.648 0 Mximo 127 255 32.768 65.535 32.768 65.535 8.388.607 16.777.215 2.147.483.648 4.294.967.295

Tabela 7 - Tipo de variveis, o seu tamanho e limites.

Quanto ao tipo de armazenamento de dados, o compilador C18 permite trs tipos diferentes de armazenamento de dados: Armazenamento por tipo de dados; Armazenamento por classes; Armazenamento por qualificadores. De seguida detalha-se pormenores referentes a estes trs tipos.

Armazenamento por tipo de dados.


Numa varivel com vrios bytes o byte menos significativo esta alocado no endereo menos significativo, por exemplo, se definirmos uma posio de memria do microcontrolador e queremos escrever o contedo de uma varivel do tipo long, o compilador aloca o byte menos significativo no primeiro endereo e os restantes nas posies seguintes at atingir o byte mais significativo. Exemplo:

#pragma idata teste=0x0200 long i=0xAABBCCDD;


Endereo Contedo 0x0200 0xDD 0x0201 0xCC 0x0202 0xBB 0x0203 0xAA

Bernardino Neves - 2011 Compilador C18

Pgina 23

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Armazenamento por classes - Overlay.


A classe de armazenamento por sobreposio overlay apenas permitida quando o compilador est a operar no modo Non-Extended, pode ser aplicado a variveis locais, mas no a parmetros, a definies de funes e a variveis globais. A classe de armazenamento por sobreposio associa smbolos dentro de funes especficas, isto , uma varivel definida dentro de uma funo apenas valida dentro dessa funo. Exemplo:

void e (void) { overlay int X = 5; X++; }

void f (void) { overlay int Y = 2; Y++; }

Neste exemplo, se o compilador ao compilar o programa detectar que no executa estas duas funes em simultneo, a classe de armazenamento por sobreposio aloca a mesma posio de memria para as duas variveis definidas. Outros tipos de armazenamento por classes so: Auto Define a varivel como local, por defeito todas as variveis so locais; Extern Define variveis externas ao programa; Register Indica ao compilador que a varivel um registo do CPU; Static Define uma varivel que ocupa uma posio permanente na memoria.

Armazenamento por qualificadores.


O compilador C18 tem como qualificadores de armazenamento de dados o far, near, rom e ram, estes qualificadores tem a mesma funo que const e volatile em ANSI C, isto , possvel definir o tipo de varivel e o seu acesso.

Pgina 24

Bernardino Neves 2011 Compilador C18

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

A tabela seguinte mostra a localizao das variveis em funo dos qualificadores. Qualificador far near rom Em qualquer lugar na memria de programa. Em memria de programas inferiores a 64KBytes. ram Em qualquer lugar na memria de dados. No acesso memria.

Tabela 8 - Localizao das variveis em funo dos qualificadores.

Em variveis tipo ponteiros, os mesmos podem apontar tanto para posies de memria ram ou rom. O tamanho do ponteiro depende do tipo de varivel para qual aponta, isto se apontar para memoria de dados tem o tamanho de 16 bits, se apontar para memria de programa ter 24 bits. Por defeito quando se define uma varivel tipo ponteiro esta aponta para memria de dados, se quisermos apontar para memria de programa temo de colocar o qualificador rom. Tipo de ponteiro Memria de dados near Memria de programa far Memria de programa Exemplo char *a; rom near char *a; rom near char *a; Tamanho 16 bits 16 bits 24 bits

Tabela 9 - Tamanho dos ponteiros.

Incluir ficheiros - #INCLUDE


A incluso de ficheiros no nosso cdigo fonte feita a partir do uso da directiva do compilador #Include, quando queremos incluir um ficheiro de sistema (System Header File) devemos usar a directiva do seguinte modo #Include <Nome _do_ficheiro>, porque como se trata de um ficheiro de sistema o compilador vai procurar na pasta INCLUDES do compilador, entretanto se for um ficheiro de cabealho criado pelo usurio devemos usar a directiva do seguinte modo #Include Nome _do_ficheiro, porque neste caso o compilador vai procurar o ficheiro dentro da pasta do projecto.

Macros predefinidas do compilador C18.


O compilador C18 tem predefinido as seguintes macros. _18CXX Indica que o compilador o MPLAB C18; _18F4620 Indica ao compilador qual o microcontrolador a ser utilizado; _TRADITIONAL18_ Modo Non-extended; _EXTENDED18_ Modo Extended.

Bernardino Neves - 2011 Compilador C18

Pgina 25

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

A directiva #PRAGMA.
Esta directiva serve para indicar ao compilador C18 que um determinado cdigo se encontra alocado numa especifica posio de memoria, essas seces de memoria tanto podem ser de dados como de programa. Existem dois tipos de seces dependendo do tipo de memria.

Memria de programa: code contem instrues de execuo. romdata contem variveis e constantes.

Memria de dados: udata contem variveis estticas no inicializadas. idata contem variveis estticas inicializadas.

Exemplo:

#pragma code hight_vector = 0x08 #pragma code

A primeira linha de cdigo faz o compilador desviar o programa para o endereo 0x08, a segunda linha de cdigo faz o compilador voltar a posio de endereo de memria de programa onde estava antes do desvio.

Pgina 26

Bernardino Neves 2011 Compilador C18

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Directivas do compilador C18.


As directivas so instrues de como deve ser compilado o cdigo fonte. O compilador C18 tem as seguintes directivas disponveis (Tabela 10): Directiva Descrio Define uma constante que ser substituda dentro do cdigo fonte pelo seu valor, quando for compilado. Exemplo #define Maximo 100 #define Nome Jose #define Area(x,y) x*y #define Max 10 #define T 3 #if defined(Max) && defined(T) #if (Max * T) > 50 #error error #else #define Novo Max*T #endif #endif #ifdef MAX Contador = MAX; #ifndef MAX #define MAX 100 #include main.h #pragma code #pragma config OCS = HS #define Maximo 10 . #undef Maximo #define Maximo 20

#define

#if
#elif #endif

Executa uma condio se for verdadeira.


Directiva associada a directiva #if e #else. Directiva associada a directiva #if. Directiva que gera uma mensagem de erro definida pelo usurio, a mensagem aparece no output do compilador. Directiva associada a directiva #if . Executa se uma expresso estiver definida. Executa se uma expresso no estiver definida. Directiva para incluir ficheiros no cdigo fonte Esta directiva desvia o programa para um endereo especificado Configura a palavra de configurao. Esta directiva serve para que uma constante deixe de estar definida.

#error

#else #ifdef #ifndef #include #pragma #pragma config

#undef

Tabela 10 - Directivas do compilador C18.

Livrarias de funes do compilador C18.


O compilador C18 disponibiliza quatro tipos de livrarias de funes. Nas tabelas seguintes (12, 13 e 14) mostra-se a descrio dos quatro tipos de livrarias e assim como tambm a sua respectiva descrio. Num dos captulos mais adiante sero detalhados as livrarias das funes de software e hardware de um modo mais aplicado, pretendendo-se que neste momento o leitor tenha apenas uma ideia abrangente sobre as funes disponibilizadas pelo compilador C18.

Bernardino Neves - 2011 Compilador C18

Pgina 27

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Nome math.h

Descrio Funes matemticas.


Tabela 11 Livraria de funes de matemtica.

Nome ctype.h stdlib.h string.h delays.h reset.h stdio.h

Descrio Classificao do tipo de caracteres. Converso de dados. Manipulao de memria e strings. Funes para gerar atrasos. Funes de reset. Funes de output de caracteres.
Tabela 12 - Livrarias de funes gerais.

Nome xlcd.h can2510.h sw_i2c.h sw_uart.h sw-spi.h

Descrio Funes de controlo de LCD Funes de controlo do controlador CAN2510. Funes de controlo e comunicaes por I2C. Funes de controlo e comunicaes por UART. Funes de controlo e comunicaes por SPI.
Tabela 13 - Livrarias de funes de software.

Nome adc.h capture.h i2c.h portb.h mwire.h pwm.h spi timers.h usart.h

Descrio Funes de suporte ao perifrico ADC. Funes de suporte ao perifrico captura. Funes de suporte ao perifrico I2C. Funes de suporte ao perifrico PORTB. Funes de suporte ao perifrico Microwire. Funes de suporte ao perifrico PWM. Funes de suporte ao perifrico SPI Funes de suporte ao perifrico TIMERS Funes de suporte ao perifrico UART

Tabela 14 - Livrarias de funes de hardware.

Pgina 28

Bernardino Neves 2011 Compilador C18

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Primeiros passos com o MPLAB IDE.


Criar e configurar um projecto no MPLAB IDE.
Agora que j tem instalado o MPLAB IDE e o compilador C18, chega o momento de dar os primeiros passos, para comear execute a aplicao MPLAB IDE. Crie um novo projecto seleccionando Project -> Project Wizard, como mostra a figura 23.

Fig 23 - Criar uma novo projecto.

O Project Wizard ajuda-nos a criar e a configurar um novo projecto, seleccione seguinte aps a janela de boas vindas e seleccione o microcontrolador PIC18F4620 que ser o microcontrolador, que iremos usar em todos os exemplos, repare que em futuros projectos pode escolher o microcontrolador que desejar. Aps seleccionar o microcontrolador chega o momento de seleccionar o compilador C18, para a nossa linguagem de programao, neste caso seleccionamos o Microchip C18 ToolSuite, como mostra a figura 24.

Fig 24 - Seleco do compilador C18.

Bernardino Neves - 2011 Primeiros passos com o MPLAB IDE

Pgina 29

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Se por acaso, quando chega a esta janela e no aparece o compilador C18, ou porque no foi instalado correctamente ou o MPLAB IDE no o encontra, nesse caso deve indicar a localizao atravs do boto Browse , tendo em ateno que necessrio indicar a localizao dos quatro executveis MPASM, MPLINK, MPLAB C18 e o MPLIB. O passo seguinte criar e escolher uma localizao para o ficheiro do novo projecto, vamos escolher o nome de Exemplo1 para o nosso projecto, no final seleccione o boto seguinte, a prxima janela pergunta se temos ficheiros para adicionar ao nosso projecto, como no temos passamos para a janela seguinte que nos indica a concluso da configurao do nosso projecto, indicando os parmetros do projecto (Figura 25).

Fig 25 Concluso da configurao do projecto.

Por fim seleccionamos o boto Concluir e teremos o nosso primeiro projecto criado, de seguida necessario inserir o ficheiro para editarmos o cdigo em linguagem C. Para o efeito crie um novo ficheiro em New File. Para gravar o ficheiro seleccione a pgina fazendo um click sobre a mesma e de seguida no menu File seleccione a opo Save As , escolha a localizao do projecto e um nome para o ficheiro e no se esquea de o terminar com o .C. Agora que tem o ficheiro gravado necessrio inseri-lo no projecto, deve seleccionar a pasta Source Files com o boto direito do rato e seleccionar o item Add Files, procure a pasta que contem o projecto e seleccione o ficheiro *.C, as figuras 26 e 27 mostram os passos a seguir.

Fig 26 - Pasta Source Files.

Pgina 30

Bernardino Neves 2011 Primeiros passos com o MPLAB IDE

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Fig 27 - Janela para adicionar ficheiros ao projecto.

O MPLAB IDE permite guardar o ltimo ambiente de trabalho, para o efeito quando fecha o aplicativo MPLAB IDE recebe uma mensagem a perguntar se pretende guardar o ambiente de trabalho, o qual deve responder que sim. A figura 8 mostra o ambiente de trabalho pretendido, repare que conforme o desenrolar do desenvolvimento do projecto, mais janelas tero de ser adicionadas ao nosso ambiente de trabalho.

Fig 28 - Ambiente de trabalho.

Bernardino Neves - 2011 Primeiros passos com o MPLAB IDE

Pgina 31

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Primeiro programa.
J criamos um projecto, agora vamos criar um pequeno programa com o objectivo de mostrar como deve ser o corpo do cdigo no editor de texto antes de ser compilado. Pretende-se tambm dar a conhecer as ferramentas de simulao que o MPLAB disponibiliza, e ainda a manipulao de registos e a simulao de sinais nos pinos do microcontrolador. Abra o projecto do exemplo anterior e copie o cdigo que se encontra na tabela 15, para o editor de texto.

#include <p18f4620.h> //Declarao de definies #define SaidaTRIS #define SaidaIO //Declarao de variaveis int i=0; void main (void) { SaidaTRIS = 0; SaidaIO = 0; while(1) { SaidaIO ^= 1; i++; } }

(TRISBbits.TRISB7) (LATBbits.LATB7)

Tabela 15 - Cdigo do ficheiro do exemplo.

Depois de escrito o programa necessrio compilar, para o fazer basta pressionar a tecla de acesso rpido F10 ou no icon MAKE, como mostra a figura 29.

Fig 29 - Localizao do icon Make.

Ao compilar verificamos que no existem erros, caso existissem os mesmos apareciam na janela OUTPUT, chega o momento de testar o nosso primeiro programa, para isso devemos activar o simulador. O simulador encontra-se no menu Debugger -> Select tool -> 5 MPLAB SIM , como mostra a figura 30.

Pgina 32

Bernardino Neves 2011 Primeiros passos com o MPLAB IDE

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Fig 30 - Seleccionar o simulador MPALB SIM.

Com o simulador activado, j podemos testar o nosso primeiro programa, mas antes disso convm explicar como funciona o simulador MPLAB SIM, j deve ter verificado que quando activou o simulador, que apareceram no ambiente de trabalho uns novos icons, so os botes de controlo do simulador, a figura 31 mostra o significado de cada um deles.

Coloca breakpoints no programa. Faz reset ao programa. Executa ate ao fim da funo. Executa o contedo da funo. Executa passo a passo o programa. Inicia a simulao no modo animado do programa. Pausa da simulao do programa. Inicia a simulao do programa.

Fig 31 - Comandos do simulador MPLAB SIM.

O que o programa exemplo faz mudar o estado do pino 7 do porto B e incrementar o contedo da varivel i em cada ciclo do while, o mesmo pode ser verificado quando se pressiona o icon de simulao no modo animado. Abra a janela File Registers e Special Function Registers, no menu View e seleccione o endereo 0xF8A da janela Special Function Registers e o endereo 0x084 da janela File Registers. No modo de simulao animado possvel verificar o estado do bit 7 do porto B a comutar de estado e o incremento da varivel i em cada ciclo do while, ver figura 34.

Bernardino Neves - 2011 Primeiros passos com o MPLAB IDE

Pgina 33

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Fig 32 Seleco da janela File Registers e Special Function Registers.

Modificar o contedo de registos e variveis.


Agora vamos alterar o valor da varivel i, para o efeito coloque o simulador em pausa, click em cima do contedo da varivel, neste caso na coluna decimal e altere o valor para um a sua escolha, de seguida volta a colocar o simulador no modo animado, pode reparar que a varivel i incrementou uma unidade. Uma outra janela que nos permite ter acesso e alterar o contedo de variveis e registos a janela Watch. Nesta janela possvel visualizar mais dados sobre as variveis, tal como o endereo em que est alocado, para podermos visualizar uma varivel necessrio inseri-la como mostra a figura 33.

Fig 33 - Inserir uma varivel para se ter acesso aos seus parmetros.

Repare que a janela Watch tem dois botes de adio de registo, o Add SFR para adicionar registos especiais e o boto Add Symbol para adicionar variveis, a janela 34 mostra os dados que pretendemos observar.

Pgina 34

Bernardino Neves 2011 Primeiros passos com o MPLAB IDE

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Fig 34 - Janela Watch.

Parar o programa num determinado sitio especifico Breakpoint.


O simulador MPLAB SIM permite a insero de breakpoints, j deve ter reparado que quando inicia o programa no modo animado, ele primeiro executa um cdigo e s passado algumas linhas de cdigo que executa o nosso cdigo do programa exemplo, podemos passar essas linhas de cdigo rapidamente inserindo um breakpoint no inicio do nosso programa e iniciando a simulao no modo continuo. Quando o simulador encontrar o breakpoint pra a simulao, e nesse caso, retiramos o breakpoint e passamos para a simulao no modo animado. Repare que se pode colocar um breakpoint em qualquer lugar do nosso programa, onde pretendemos que o simular pare para podermos analisar registos e variveis.

Tempo de execuo.
s vezes necessrio saber o tempo exacto que demora umas linhas de cdigo a correr, o simulador permite atravs da janela StopWatch determinar esse tempo de modo exacto, antes de utilizarmos a janela StopWatch necessrio definir a frequncia de clock do microcontrolador que servir de base de tempo para o simulador, o mesmo pode ser definido na janela Settings cujo caminho Debugger -> Settings no item Osc/Trace.

Fig 35 - Definio da frequncia de clock, base de tempo do simulador MPLAB SIM.

Agora que j temos definido a base de tempo para o simulador, podemos verificar o tempo que demora a executar um determinado conjunto de linhas de cdigo. Como exemplo vamos verificar o tempo que demora a executar 25 ciclos de while no nosso programa. Abra a janela StopWatch, cujo caminho Debugger -> StopWatch e reinicie o contador pressionando o boto Zero.

Bernardino Neves - 2011 Primeiros passos com o MPLAB IDE

Pgina 35

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Fig 36 Exemplo, determinao do tempo de execuo.

Este exemplo no permite determinar o tempo exacto, pois seria necessrio colocar dentro do while cdigo que verificasse o contedo da varivel i em cada ciclo, mas no entanto podemos obter uma boa aproximao do tempo de execuo. Para executar o nosso exemplo coloque um breakpoint como mostra a figura e simule no modo contnuo, quando o simulador parar no breakpoint, reinicie o simulador no modo animado e espere at que o contedo da varivel i seja igual a 25 decimal. Nesse momento faa pausa no simulador e verifique o tempo que demorou a executar os 25 ciclos de while na janela StopWatch. A figura 37 mostra o resultado do tempo obtido.

Fig 37 - Resultado do tempo de execuo do exemplo proposto.

Pgina 36

Bernardino Neves 2011 Primeiros passos com o MPLAB IDE

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

O simulador STIMULUS.
Outra ferramenta que o MPLAB IDE nos disponibiliza para simulao o simulador STIMULUS, trata-se de um simulador que permite gerar estmulos em pinos do microcontrolador, isto , geramos um estmulo num pino do microcontrolador e verificamos o efeito no nosso programa. Para verificar esta funcionalidade precisamos de um novo exemplo, nomeadamente, vamos desenvolver um programa que leia o estado do pino 7 do porto B, se for zero incrementa uma varivel, se for um incrementa outra varivel. A tabela 16 mostra o cdigo do nosso segundo exemplo.
#include <p18f4620.h>

//Declarao de definies #define SaidaTRIS #define SaidaIO (TRISBbits.TRISB7) (PORTBbits.RB7)

//Declarao de variaveis int a=0; int b=0;

void main (void) { SaidaTRIS = 1;

while(1) { if ( SaidaIO == 0) { a++; } else { b++; } } }

Tabela 16 - Cdigo do segundo exemplo proposto.

Criamos um novo projecto com o nome de Exemplo2 seguindo os passos em cima descritos para o exemplo 1, colocamos o cdigo da tabela acima no editor de texto e compilamos o nosso segundo exemplo. Neste momento s falta configurar o simulador Stimulus. Para o efeito aceda ao simulador pelo caminho Debugger -> Stimulus -> New Workbook, na janela Stimulus no separador Asynch seleccione na coluna Pin/SFR o pino RB7, como mostra a figura 38 e selecciona o pino como um lgico Set High.

Bernardino Neves - 2011 Primeiros passos com o MPLAB IDE

Pgina 37

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Fig 38 - Janela de configurao do simulador Stimulus.

Salvamos o nosso ficheiro de simulao na pasta do projecto, e j podemos testar esta nova funcionalidade. Coloque um breakpoint na linha de cdigo SaidaTRIS = 1;, execute a simulao no modo contnuo, quando o simulador parar no breakpoint, nesta altura j possvel verificar que o pino 7 do porto B se encontra no estado lgico um. Reinicie o simulador no modo animado e pode verificar que o programa executa as instrues indicadas para quando o estado lgico um, isto , incrementa o contedo da varivel b, para verificar, abra a janela Watch e insira as variveis a e b para as poder monitorizar. Para mudar o estado do pino RB7 coloque em pausa o simulador e seleccione o pino como zero lgico Set low, click no fire button que se localiza no lado esquerdo da caixa de texto que indica RB7 e grave o ficheiro, neste momento o pino RB7 esta ser estimulado com o zero lgico, volte a reiniciar a simulao animada e verifique que agora o programa executa as instrues indicadas para quando o estado lgico zero, as figuras seguintes mostram a localizao do fire button e o resultado da simulao.

Fig 39 Localizao do Fire Button.

Fig 40 Resultado da simulao Stimulus.

Esta simulao podia ser feita de um modo contnuo se a seleco do estado do pino na coluna action fosse Toggle, nesse caso basta pressionar o fire button que o estado do pino comutava de estado.

Pgina 38

Bernardino Neves 2011 Primeiros passos com o MPLAB IDE

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

O logic analyzer.
Esta ferramenta de simulao permite analisar o estado dos pinos do microcontrolador em funo do tempo, para testar esta funcionalidade vamos voltar ao nosso primeiro programa, guarde o projecto do exemplo 2 e volte a abrir o projecto do exemplo 1. Volte a colocar um breakpoint na linha de cdigo SaidaTRIS = 0; e simule no modo contnuo, quando o simulador parar no breakpoint, seleccione o logic analyser atravs do caminho View -> Simulator Logic Analyser, aps pressionar o boto channel seleccione o canal RB7 como mostra a figura seguinte.

Fig 41 - Seleco do canal a analisar.

Pressione o boto OK, e neste momento j tem o analisador lgico configurado, reinicie o simulador no modo animado e verifique o estado do pino 7 do porto B em funo do tempo, a figura seguinte mostra o resultado.

Fig 42 - Resultado obtido pelo analisador lgico.

Bernardino Neves - 2011 Primeiros passos com o MPLAB IDE

Pgina 39

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Depurador/Gravador PICKIT 3.
O PICKIT 3 um simples depurador e programador de microcontroladores da Microchip, tratase de uma ferramenta de baixo custo, baseado na programao serie em circuito (ICSP), isto , permite a gravao do microcontrolador inserido no seu prprio circuito. O depurador (Debugger) permite executar o cdigo como um dispositivo real, porque usa um dispositivo de emulao de circuito, todos os recursos disponveis de um determinado microcontrolador esto acessveis de forma interactiva e pode ser definida e modificada pela interface MPLAB IDE. O Depurador/Programador PICKIT 3 tem como caractersticas principais, a execuo de instrues em tempo real, permitir que o microcontrolador trabalhe frequncia mxima e fornecer alimentao ao circuito que se pretende programar ou testar. A figura seguinte mostra o Depurador/Programador PICKIT 3.

1 Boto de presso (para uso futuro). 2 Conector USB.


1

3 Pino 1 do conector ICSP. 4 Conector ICSP. 5 Leds indicadores de estado.

Fig 43 - Depurador/Programador PICKIT 3.

Fig 44 - Descrio dos pinos do conector ICSP.

Pgina 40

Bernardino Neves 2011 Primeiros passos com o MPLAB IDE

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Microcontrolador VPP/MCLR VCC GND PGD PCG

Fig 45 Ligao entre PICKIT 3 e o microcontrolador.

Integrao do PICKIT 3 com o MPLAB IDE.


A integrao do Depurador/Programador PICKIT 3 com o MPLAB IDE muito simples, ao conectar o PICKIT 3 ao PC por uma porta USB, o sistema operativo Windows reconhece logo o dispositivo porque utiliza drivers standard do Windows. No entanto no MPLAB IDE necessrio activar o PICKIT 3, dependendo da sua utilizao de programador ou depurador. Para activar o modo programador aceda ao caminho Programmer -> Select Programmer -> 4 PICkit 3 e active o programador, o modo depurador activado pelo caminho Debugger -> Select Tool -> 3 PICkit 3, para verificar a integrao do PICKIT 3 com o MPLAB IDE vamos abrir o projecto do exemplo 1, no menu File no item Open WorkSpace abra o ficheiro Exemplo1.mcw, antes de iniciar qualquer passo necessrio desactivar o simulador MPLAB SIM, o mesmo pode ser feito acedendo pelo caminho Debugger -> Select Tool -> None, agora j possvel activar o programador PICKIT 3, active o programador e verifique na janela OUTPUT que o MPLAB reconheceu o programador PICKIT 3, aparece uma mensagem de erro porque o PICKIT 3 no se encontra conectado a nenhum microcontrolador, a figura seguinte mostra a janela OUTPUT.

Fig 46 - Verificao da integrao do programador PICKIT 3 com o MPLAB IDE.

O mesmo procedimento deve ser feito para activar o modo depurador, repare que para activar o modo depurador necessrio desactivar o programador.

Bernardino Neves - 2011 Primeiros passos com o MPLAB IDE

Pgina 41

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Pgina 42

Bernardino Neves 2011 Primeiros passos com o MPLAB IDE

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Programao em C, para microcontroladores.


Princpios de programao.
Antes de iniciar o estudo da linguagem C, necessrio relembrar conceitos bsicos de programao de sistemas, tais como a lgebra booleana, algoritmos e princpios de programao de sistemas. A programao consiste na traduo do pensamento lgico necessrio para o cumprimento de uma determinada tarefa, isto , numa sequncia de comandos que podem ser interpretados e executados por uma mquina, neste caso um microcontrolador. A programao constitui-se num processo de identificao e soluo de problemas, para o efeito, o programador recorre a um conjunto de procedimentos genricos: Exposio do problema. Anlise da soluo. Codificao da soluo. Traduo do cdigo. Verificao e teste.

Fluxogramas.
Os fluxogramas so ferramentas que nos ajudam a codificar um programa, so elementos grficos utilizados para estabelecer a sequncia de operaes necessrias para a execuo de uma tarefa. A tabela seguinte mostra os smbolos mais utilizados na construo de fluxogramas.

Inicio ou terminao

Processo

Dados

Tomada de deciso

Tabela 17 Smbolos de fluxograma.

Bernardino Neves - 2011 Programao em C para microcontroladores

Pgina 43

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Agora que j se conhecem os smbolos para construir um fluxograma, o passo seguinte construir um simples exemplo de aplicao com fluxogramas, o exemplo consiste em somar dois nmeros e verificar se o resultado positivo, se sim activa uma sada, caso contrario activa outra sada.

Inicio

Carrega A

Carrega B

Soma A + B

Resultado positivo ?

Activa sada 1

Activa sada 2

Fim

Fig 47 Fluxograma do exemplo proposto.

lgebra de booleana.
A lgebra booleana um ramo da matemtica, que tem como funo a resoluo de problemas lgicos, baseado em regras e conceitos lgicos simples, proposies e operadores lgicos relacionais. Uma proposio uma afirmao que pode ser classificada como sendo verdadeira ou falsa, duas ou mais proposies podem ser relacionadas com o uso de operadores lgicos E, OU e NO. A tabela seguinte mostra a tabela de verdade para os diferentes operadores lgicos: A 0 0 1 1 B 0 1 0 1 E 0 0 0 1 A 0 0 1 1 B 0 1 0 1 OU 0 1 1 1

A 0 1

NO 1 0

Tabela 18- Operadores lgicos.

Pgina 44

Bernardino Neves 2011 Programao em C para microcontroladores

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Variveis e dados.
Uma varivel uma representao simblica para elementos pertencentes a um conjunto, as variveis so armazenadas na memria do microcontrolador e pode assumir qualquer valor dentro dos valores possveis, repare que os valores possveis esto definidos nas especificaes do compilador. As variveis so classificadas segundo o tipo de contedo que armazena, podendo ser numricas, caracteres, alfanumricas e lgicas.

Operadores.
Os operadores so elementos, para relacionar ou modificar dados ou variveis, podemos classificar os operadores em cinco categorias: Matemticos. Relacionais. Lgicos. Lgicos bit a bit. Memoria.

Introduo a linguagem C.
Palavras reservadas.
A linguagem C possui um conjunto de palavras reservadas ou comandos para os quais j existe interpretao prvia pelo compilador, estas palavras no podem ser usadas, a tabela seguinte mostra as palavras reservadas. Auto Continue Enum If Short Switch Volatile Break Default Extern Int Signed Typedef While Case Do Float Long Sizeof Union Char Double For Register Static Unsigned Const Else Goto Return Struck Void

Tabela 19 Palavras reservadas em programao em C.

Identificadores.
Um identificador o nome dado s variveis, funes e outros elementos da linguagem C, pode ser composto por caracteres e letras, o nico carcter permitido na construo de identificadores o sublinhado _, alem disso um identificador s pode ser iniciado por uma letra ou sublinhado, iniciar com um nmero torna invalido o identificador.

Bernardino Neves - 2011 Programao em C para microcontroladores

Pgina 45

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Variveis e tipos de dados.


Declarao de variveis.
Na linguagem C, necessrio declarar as variveis antes de as utilizar, declarar uma varivel informar o compilador, que a varivel chamada X do tipo Y, na declarao de variveis importante saber o local onde estamos a declarar a varivel, pois a varivel relaciona-se directamente acessibilidade ou no de outras partes do programa a essa varivel. As variveis podem ser declaradas, em trs pontos distintos do programa: No corpo principal do programa, as variveis so declaradas como globais, isto , tem se acesso ao seu contedo em qualquer parte do programa. No corpo de uma funo, as variveis declaradas no corpo de uma funo apenas so validas dentro da mesma, tem o nome de varivel local. As variveis podem ainda ser declaradas como um parmetro formal de uma funo, trata-se de uma varivel local especial. Ainda existe outra forma de declarar variveis, as variveis externas, so utilizadas para declarar variveis que possam ser acedidas em todo o projecto, quando o mesmo constitudo por vrios ficheiros.

Exemplo:
unsigned char aux = 0x41; unsigned int aux1 = 0x1234; unsigned int aux2; aux2 = 0x4321; O cdigo acima descrito, declara trs variveis, uma do tipo char e duas do tipo inteiro, reparese que as variveis podem ou no ser inicializadas.

Declarao de constantes.
As constantes so valores fixos e que no podem ser alterados pelo programa, normalmente usado para definir valores fixos. Exemplo: #define FREQ_CRISTAL unsigned long Clock; Clock = FREQ_CRISTAL / 4; O cdigo acima descrito, define uma constante cujo valor 20000000, que corresponde a frequncia do oscilador, esta constante pode ser utilizado para calcular a frequncia de instrues do C. (20000000) //20Mhz

Pgina 46

Bernardino Neves 2011 Programao em C para microcontroladores

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Operadores.
Aritmticos.
Os operadores aritmticos so utilizados para efectuarem determinadas operaes matemticas em relao a um ou mais dados, as linhas seguintes mostram alguns dos operadores disponveis na linguagem C para operaes aritmticas. a = 7; b = 2; Operador de adio. c = a + b; Operador de subtraco. c = a b; Operador de multiplicao. c = a * b; Operador de diviso. c = a / b; Na diviso existe o operador resto %, que utilizado para retornar o resto de uma operao de diviso inteira. c = a / b; c = a % b; c = 7 / 2 = 3 (Resultado para uma diviso inteira). c = 7 % 2 = 1 (Resto da diviso inteira).

Operador incremento e decremento. a++; (Incrementa o contedo da varivel a uma unidade). a -- ; (Decrementa o contedo da varivel a uma unidade). b = a++; b = ++ a; (O valor de a armazenado em b, e de seguida o valor de a incrementado). (O valor de a incrementado, e de seguida o valor de a armazenado em b).

Relacionais.
Os operadores relacionais so usados para testes condicionais, para determinar a relao existente entre dados, as linhas seguintes mostram os operadores relacionais e a sua aco. Operador > >= < Aco Maior que Maior ou igual Menor que Operador <= == != Aco Menor ou igual a Igual a Diferente de

Bernardino Neves - 2011 Programao em C para microcontroladores

Pgina 47

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Lgicos.
Os operadores lgicos so utilizados para realizar conjunes, disjunes ou negaes entre elementos num teste condicional, dos operadores lgicos apenas podem resultar um de dois valores, verdadeiro ou falso. Operador && || ! x = 10; If (x > 5 && x < 20) { y= x; } Dentro dos operadores lgicos, ainda existem os operadores lgicos bit a bit, que so utilizados para realizar operaes entre elementos ou variveis, o resultado de uma operao lgico bit a bit, pode resultar em um valor do mesmo tamanho dos elementos operados. Operador & | ^ ~ >> << Aco AND OR XOR NOT Deslocamento a direita Deslocamento a esquerda Aco AND OR NOT

Operador AND (&) AND lgico entre dois nmeros. x1 = 100; x2 = X1 & 20; Decimal Binrio 100 01100100 AND 15 00001111 Resultado 4 00000100 Desligar o bit0 de um porto sem interferir com os outros bits. PORTB = PORTB & b11111110; Que equivalente a: PORTB &= b11111110;

Com esta operao os restantes bits do porto no sero afectados.

Pgina 48

Bernardino Neves 2011 Programao em C para microcontroladores

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Operador OR (I) OR lgico entre dois nmeros. x1 = 100; x2 = X1 I 20; Decimal 100 OR 00001111 Resultado 111 01101111 Activar o bit0 de um porto sem interferir com os outros bits. PORTB = PORTB & b00000001; Que equivalente a: PORTB |= b00000001; 15 Binrio 01100100

Com esta operao os restantes bits do porto no sero afectados.


Operador XOR (^) XOR lgico entre dois nmeros. x1 = 100; x2 = X1 ^ 20; Decimal 100 Binrio 01100100 XOR 15 00001111 Resultado 107 01101011

Operador NOT (~) NOT lgico de um nmero. x1 = 100; x2 = ~x1; Decimal Binrio 100 01100100 Resultado da operao NOT 155 10011011 Operadores de deslocamento << e >> x1 = 100; x2 = x1 << 4; x3 = x1 >> 4; Varivel x2 x3 Decimal 100 100 Binrio 01100100 01100100 Deslocamento << 4 >> 4 Resultado 01000000 00000110

Bernardino Neves - 2011 Programao em C para microcontroladores

Pgina 49

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Memoria.
Os operadores de memria, chamados de operadores de ponteiros, permitem o acesso directo a qualquer endereo de memria do sistema, existem dois tipos de operadores, que so tambm complementares. O operador &, que retorna o endereo de memoria do seu operando. O operador *, que retorna o contedo da posio de memoria endereada, pelo operando que o segue. Exemplo: unsigned int *endereo, x, y; x = 5; endereco = &x; y = *endereco; Neste exemplo podemos verificar, que o endereo da varivel x foi copiado para a varivel endereo, que por sua vez na linha de cdigo seguinte, copiou o seu contedo para a varivel y, o resultado y = 5.

Associao de operadores.
A linguagem C, permite a associao de operadores, permitindo assim reduzir cdigo, as linhas seguintes mostram a forma expandida e a reduzida. Em termos de operaes de atribuio temos, no caso da forma expandida: varivel = varivel (operando) valor (ou varivel) A forma reduzida reduz o comando a seguinte forma: varivel (operando) = valor (ou varivel) Forma expandida x=x+y x=x-y x=x*y x=x/y x=x%y x=x&y x=x|y x = x ^y x = x << y x = x >> y Forma reduzida x += y x -= y x *= y x /= y x %= y x &= y x |= y x ^= y x <<= y x >>= y

Pgina 50

Bernardino Neves 2011 Programao em C para microcontroladores

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Declaraes de controlo.
As declaraes de controlo, so ferramentas importantes nas linguagens de programao, pois permitem testar condies e executar um cdigo em funo do resultado do teste da condio, tambm permite a repetio de comandos enquanto uma condio se verificar verdadeira.

Comando IF.
O comando IF, utilizado para executar um comando ou um bloco de comandos se uma determinada condio for verdadeira. Normalmente acompanhada pelo comando ELSE, que tem a funo de executar outro comando ou bloco de comandos caso a condio no seja verdadeira. A forma geral : IF (condio) { Comando1; Comando2; Comando3; } ELSE { Comando3; Comando4; Comando5; } Exemplo: int x = 5; if ( x == 5) { Led0 = 1; } else { Led0 = 0; } O comando IF, no necessita de operador relacional ou lgico, porque apenas testa se a condio verdadeira ou falsa, em termos prticos se zero ou diferente de zero. int x = 5; if ( x) Led0 = 1; Como o valor de x diferente de zero executa o comando Led0 = 1.

Bernardino Neves - 2011 Programao em C para microcontroladores

Pgina 51

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Comando SWITCH.
O comando SWITCH, utilizado para comparaes sucessivas, em termos prticos este comando uma espcie de comando IF mas para mltiplas comparaes, sendo possvel executar este comando com comandos IF. int x = 5; switch (x) { case 1: Comando 1; break; . . case 5: Comando 5; break; . . case n: Comando n; break; default: Comando m; break; } No comando SWITCH o valor da varivel testada com a constante especificada pela clusula case, no caso da varivel e a constante terem o mesmo valor, os comandos da clusula so executados, caso no exista correspondncia entre a varivel e as constantes, ento os comandos especificados pela clusula default sero executados, repare que possvel utilizar o comando SWITCH sem recorrer a clusula default, veja o exemplo seguinte. A clusula break possui a funo de terminar a sequncia de comandos de uma clusula case. switch (x) { case 0: Led0 = 0; break; case 1: Led0 = 1; break; }

Pgina 52

Bernardino Neves 2011 Programao em C para microcontroladores

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Comando FOR.
O comando FOR um dos comandos mais utilizados em estruturas de repetio, a forma geral em linguagem C a seguinte: for ( inicializao ; condio ; incremento ) { comando; } O que o comando FOR faz , inicializar uma varivel e executa tantas vezes um comando at que a condio seja verdadeira, o incremento serve para incrementar a varivel. unsigned char a; unsigned char b = 0; for ( a = 0; a < 10 ; a++) { b++; } Dentro de um ciclo for possvel utilizar a clusula break, que tem a funo de quebrar o ciclo FOR, repare ainda que possvel utilizar mais que uma varivel de controlo dentro do ciclo for, exemplo seguinte mostra como quebrar um ciclo for e o uso de vrias varveis de controlo do ciclo FOR. unsigned char a, b ; unsigned char c = 0 ; for ( a = 0 , b = 0 ; a < 10 ; a++ , b ++) { if ( Led0 == 1 ) { break; } c++; }

Comando WHILE.
O comando WHILE, tem a funo de executar o comando associado tantas vezes at que a condio seja verdadeira ou tenha o valor lgico um. Tambm no comando WHILE possvel quebrar o ciclo usando a clusula break. while ( condio ) { comando; }

Bernardino Neves - 2011 Programao em C para microcontroladores

Pgina 53

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011


Exemplo: unsigned char a = 5; while ( a != 0) { a--; } O teste a condio efectuado considerando o seu resultado como verdadeiro ou falso, isto , se o resultado zero ou diferente de zero, com este principio podemos verificar que, se o resultado da condio for sempre um lgico, estamos perante um ciclo WHILE infinito. while ( 1) { a--; } Neste exemplo em cima descrito, encontramos um ciclo infinito, provocado pelo comando WHILE .

Comando DO-WHILE.
A diferena entre este comando e o comando WHILE, que o comando WHILE verifica a condio no inicio do ciclo e o comando DO WHILE verifica a condio no fim do ciclo. Tal como no comando WHILE possvel utilizar a clusula break para quebrar o ciclo. A forma geral e a seguinte: do { comando; } while ( condio );

Comando GOTO.
Por ltimo temos o comando GOTO, este comando tem a funo de desvio incondicional do programa, apesar de ser um comando pouco usado em linguagem C, as vezes utilizado para aumentar a velocidade e eficincia do programa, repare que o comando GOTO tem a mesma funo que a instruo GOTO, disponvel no conjunto de instrues dos microcontroladores PIC. unsigned char a = 0;

loop: a++; if ( a < 10 ) { goto loop; } Pgina 54 Bernardino Neves 2011 Programao em C para microcontroladores

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Tipos e dados avanados.


Ponteiros.
Um ponteiro uma varivel que guarda um endereo de outra varivel, isto , um ponteiro um apontador para outra varivel. Para explicar melhor este conceito de ponteiros vejamos o seguinte exemplo. Endereo Identificador Contedo 0xA000 X1 5 Pela tabela em cima representada, podemos verificar quais o endereos utilizados e o contedo das variveis alocadas nesses endereos. Por exemplo para obter o endereo da varivel X1 usamos a declarao seguinte: Endereo = &X1; Neste contexto o operador & retorna o endereo de memria da varivel X1, que neste caso a varivel Endereo toma o valor de 0xA000, a varivel Endereo um ponteiro que aponta para a varivel X1. No caso de ser necessrio modificar o contedo da varivel X1, atravs do ponteiro possvel faze-lo usando a seguinte declarao: *Endereo = 50; Esta declarao far com que o valor 50 seja atribudo posio de memria apontada pelo ponteiro Endereo. Com esta declarao a varivel X1 passa a tomar o valor 50. Como as variveis tipo ponteiro, formam um novo tipo de dado, necessrio declar-las explicitamente da seguinte forma: Unsigned char *Endereo; A declarao em cima descrita, cria uma varivel tipo ponteiro com o nome Endereo, que aponta para variveis do tipo char sem sinal. A necessidade de indicar o tipo de varivel, para o qual o ponteiro aponta tem a ver com o facto de a linguagem C, permitir operaes matemticas envolvendo ponteiros e essas operaes so directamente influenciadas pelo tamanho do dado apontado pelo ponteiro. Exemplo: unsigned char *Endereco, X1, X2; X1 = 10; Endereco = &X2; *Endereco = X1 + 10; Neste exemplo a varivel X2 passou a ser apontada pelo ponteiro Endereo, todas as operaes efectuadas com o ponteiro *Endereco produz o mesmo efeito, se fosse utilizada a varivel X2, o resultado final ser X2 = 20.

Bernardino Neves - 2011 Programao em C para microcontroladores

Pgina 55

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Matrizes de dados.
Uma matriz de dados um conjunto de dados homogneo referenciado por um identificador nico, entende-se por dados homogneos variveis ou dados do mesmo tipo, assim uma matriz um conjunto de variveis do mesmo tipo e referenciadas pelo mesmo identificador. A declarao de uma matriz em linguagem C feita utilizando os colchetes [ ], em que o seu contedo o tamanho ou dimenso da matriz, repare que existem matriz de uma nica dimenso e matrizes de varias dimenses. unsigned char a [5]; Esta declarao cria uma matriz do tipo char sem sinal, de dimenso 5, isto , uma tabela de 5 elementos, em que cada elemento indexado por um ndice, iniciado pelo ndice zero. Identificador a[ 0 ] a[ 1 ] a[ 2 ] a[ 3 ] a[ 4 ] Exemplo: unsigned char a [5]; unsigned char b; for ( b = 0; b < 5; b++) { a[b] = b; } O exemplo acima descrito inicializa a matriz, fazendo corresponder o seu contedo ao seu ndice, o resultado final : a[0] = 0 a[1] = 4 a[2] = 4 a[3] = 4 a[4] = 4 No entanto possvel, iniciar o contedo da matriz na declarao da mesma, usando a declarao seguinte: unsigned char a [] = { 2 , 4 , 6 , 8 , 10 }; Para as matrizes de vrias dimenses, o conceito similar ao de uma nica dimenso, podemos ver as matrizes multidimensionais como a associao de vrias matrizes unidimensionais. unsigned char a [2] [3]; Endereo 0x0A00 0x0A01 0x0A02 0x0A03 0x0A04 Contedo 2 4 6 8 10

Pgina 56

Bernardino Neves 2011 Programao em C para microcontroladores

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

A declarao em cima descrita, cria uma matriz multidimensional de duas linhas e 3 colunas, a representao grfica para essa matriz : a [ 0 ][ 0 ] a [ 1 ][ 0 ] Exemplo: unsigned char a [2] [3]; unsigned char b; unsigned char c; unsigned char d = 0; for ( b = 0; b < 2; b++) { for ( c = 0; c < 3; c++) { a[b] [c] = d++; } } O resultado final : a [ 0 ][ 0 ] 0 a [ 1 ][ 0 ] 3 a [ 0 ][ 1] 1 a [ 1 ][ 1 ] 4 a [ 0 ][ 2 ] 2 a [ 1 ][ 2 ] 5 a [ 0 ][ 1] a [ 1 ][ 1 ] a [ 0 ][ 2 ] a [ 1 ][ 2 ]

Para matrizes com mais de duas dimenses, o procedimento igual ao da matriz com duas dimenses, vejamos o seguinte exemplo, uma matriz de trs dimenses. unsigned char a [2] [3] [2]; a[0][0][0] = 1; a[0][0][1] = 2; a[0][1][0] = 3; a[0][1][1] = 4; a[0][2][0] = 5; a[0][2][1] = 6; a[1][0][0] = 7; a[1][0][1] = 8; a[1][1][0] = 9; a[1][1][1] = 10; a[1][2][0] = 11; a[1][2][1] = 12;

Bernardino Neves - 2011 Programao em C para microcontroladores

Pgina 57

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Existe uma relao entre as matrizes e os ponteiros, a simples referencia ao nome da matriz, sem qualquer especificao de ndice, retorna o endereo do primeiro elemento da matriz, outro aspecto que os ponteiros podem ser indexados como as matrizes, vejamos o seguinte exemplo: unsigned char *ponteiro, matriz[5]; ponteiro = matriz; matriz[0] = 50; ponteiro[1] = 60; No exemplo em cima descrito, podemos verificar que o ponteiro aponta para o endereo do primeiro elemento da matriz, o primeiro elemento da matriz foi carregado com o valor 50 e o segundo elemento com o valor 60. Existe ainda um tipo de dado especial, que se enquadra dentro das matrizes, que so as STRING de caracteres, trata-se de uma matriz unidimensional de caracteres, com caractersticas que a diferem das matrizes normais, por exemplo o nmero total da matriz deve ser sempre 1 carcter maior que a quantidade de caracteres a ser armazenada na matriz, visto que as strings de caracteres so terminadas por um carcter nulo. Exemplo: char palavra*11+ = Exemplo;

Estruturas.
Uma estrutura um agrupamento de variveis individuais, referenciadas por um nome comum, para criar uma estrutura necessrio passar por duas etapas, a primeira definida pela estrutura de dados qual se atribui um identificador, a segunda etapa criar as varveis de estrutura, vejamos o exemplo seguinte. struct Tempo { int Horas; int Minutos; int Segundos; }; struct Tempo Horario; No exemplo em cima descrito definimos como identificador da estrutura o nome Tempo e como variveis da estrutura as variveis inteiras Hora, Minutos e Segundos. No final criada uma nova varivel do tipo Tempo, com o nome de Horario. A forma geral de acesso a um elemento de uma estrutura do exemplo acima descrito : Horario.Hora = 0;

Pgina 58

Bernardino Neves 2011 Programao em C para microcontroladores

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

A linguagem C tambm permite a criao de ponteiros para as estruturas de dados, uma das principais aplicaes deste tipo de ponteiro a passagem de estruturas por referncia na chamada de funes. Para declarar um ponteiro para uma estrutura, vamos usar como exemplo o exemplo anterior, criando assim um ponteiro para a varivel de estrutura Tempo. void main (void) { struct Tempo { int Horas; int Minutos; int Segundos; }; struct Tempo Horario; struct Tempo *Ponteiro; while (1) { Horario.Horas = 17; Horario.Minutos = 20; Horario.Segundos = 53; Ponteiro = &Horario; (*Ponteiro).Horas = 18; (*Ponteiro).Minutos = 15; (*Ponteiro).Segundos = 23; } } Pelo exemplo em cima descrito, podemos verificar que temos duas variveis de estrutura, das quais uma definida por ponteiros, isto , temos um ponteiro que aponta para uma varivel de estrutura, ao correr este programa no modo simulao podemos verificar que o ponteiro aponta para o varivel de estrutura Horario, visto que o ponteiro carregado com o valor do endereo da estrutura Horario, que seguidamente carregando essa varivel com outros valores distintos. Outro conceito interessante, ainda no campo das estruturas, o acesso a bits individuais numa varivel. Na verdade podemos dizer que os campos de bits so uma extenso das estruturas de dados, uma vez que apenas se podem definir dentro de uma estrutura de dados, vejamos o seguinte exemplo: struct Estado { int Flag1 : 1; int Flag2 : 1; int Flag3 : 1; }Flag; //Ciclo infinito

Bernardino Neves - 2011 Programao em C para microcontroladores

Pgina 59

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011


No exemplo em cima descrito, foi definido uma estrutura do tipo Estado, chamada de Flag, este tipo de estrutura permite o acesso a bits, isto , podemos modificar apenas um bit, sem alterar os restantes numa dada varivel. Numa estrutura, possvel definir campos de bits, bytes ou variveis de vrios comprimentos, o seguinte exemplo mostra uma estrutura de com vrios tipos de dados, repare que o comprimento em bits da varivel definido aps o simblo :. void main (void) { struct Estado { int Flag1 : 1; int Flag2 : 1; int Flag3 : 2; int Flag4 : 3; int Flag5 : 1; int Config; }Flag; while (1) { Flag.Flag1 = 1; Flag.Flag2 = 0; Flag.Flag3 = 3; Flag.Flag4 = 5; Flag.Flag5 = 0; Flag.Config = 68; } } //Ciclo infinito

Unies.
Uma unio um elemento que permite que uma posio de memria RAM seja compartilhada por diversos tipos de variveis, o formato geral muito parecido com o das estruturas de dados, vejamos o seguinte exemplo: union { Teste int variavel_1; unsigned int variavel_2; struct Tempo Horario; struct Estado Flag; char variavel_3; long variavel_4; }

Pgina 60

Bernardino Neves 2011 Programao em C para microcontroladores

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Funes.
A linguagem C, permite modularizar uma sequncia de comandos, para que possamos executala sempre que necessrio, sem a necessidade de repetir em termos de cdigo esses comandos. O formato geral de uma funo me linguagem C : Tipo_da_funo Nome_da_Funo (Parematros _da_Funo) { Comando_1; Comando_2; Comando_n; } O tipo da funo, usado para especificar o tipo de dado que a funo vai devolver, o nome da funo o identificador utilizado para especificar o nome para o qual ser conhecida a funo pelo programa, os parmetros da funo so utilizados para passar o contedo de variveis para dentro da funo, para que a funo os possa utilizar para efectuar procedimentos. Em regra, na elaborao do programa, a incluso de funes faz-se no decorrer do desenvolvimento do programa, nesse sentido as funes devem ser criadas no fim do programa, adoptando este principio necessrio no inicio do programa informar o compilador que existem funes no fim do programa, esta informao indicada pelo prottipo da funo, isto , o prottipo de uma funo uma declarao previa com o intuito de informar o compilador o formato da declarao da funo, incluindo o tipo de dado de retorno e os tipos e quantidades de parmetros, normalmente so declarados no inicio do programa, sempre antes do programa fazer referencia a funo. Exemplo: unsigned char Soma (unsigned char b, unsigned char c); void main (void) { unsigned char a; a = Soma (3,2); } unsigned char Soma (unsigned char b, unsigned char c) { unsigned char soma; soma = b + c; return soma; }

Bernardino Neves - 2011 Programao em C para microcontroladores

Pgina 61

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011


Existem duas formas bsicas, de uma funo retornar um valor ao local onde foi chamada, pelo trmino da execuo da funo de todos os comandos ou pela execuo da declarao return, como mostrar o exemplo em cima descrito. A passagem de parmetros para dentro de uma funo, pode ser feita de duas formas distintas: Por valor, o prprio valor transferido para dentro da funo. Por referncia, o endereo da varivel transferido para dentro da funo, como ponteiro. Exemplo de passagem de parmetros por referencia: unsigned char Soma (unsigned char *b, unsigned char *c); void main (void) { unsigned char a; unsigned char a1; unsigned char a2; a1 = 5; a2 = 15; a = Soma ( &a1 , &a2); } unsigned char Soma (unsigned char *b, unsigned char *c) { unsigned char soma; soma = *b + *c; return soma; } A linguagem C permite a utilizao de matrizes como argumentos de uma funo, visto que o nome da matriz sem indicao dos elementos, um ponteiro que aponta para o primeiro elemento da matriz, vejamos o seguinte exemplo: void Soma (unsigned char M[10] , unsigned char Tamanho); void main (void) { unsigned char M[10]; Soma (M,10); } void Soma (unsigned char M[10] , unsigned char Tamanho) { unsigned char a; for ( a = 0 ; a < Tamanho ; a++) M[a] = a; }

Pgina 62

Bernardino Neves 2011 Programao em C para microcontroladores

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Programao dos microcontroladores PIC18.


Uma vez feito o programa correctamente e compilado, o compilador gera um ficheiro Hexadecimal, o qual usado para programar o microcontrolador. Apesar de existirem diversos programadores, foi escolhido a utilizao de um bootloader como recurso de programao, as razes que levaram a essa escolha dizem respeito a custos, o bootloader permite a gravao do programa no microcontrolador sem recurso a um programador fsico. Um bootloader um pequeno programa especial, cuja funo ser capaz de carregar um outro programa por um dos perifricos de comunicao, neste caso a UART, repare que o bootloader um programa e nesse sentido ter de ser previamente programado com um programador. O bootloader que iremos utilizar o AN1310, desenvolvido pela Microchip Techonology, tratase de um bootloader de alta velocidade para microcontroladores PIC16 e PIC18. Tem como caractersticas principais: Possuir um tamanho pequeno de cdigo, inferior a 450 instrues. Sincronizao automtica da taxa de transmisso. Suporta uma ampla variedade de microcontroladores PIC16 e PIC18. No utiliza pinos IO opcionais. Reset do microcontrolador via software PC. Possui um terminal RS232.

Para usar o bootloader em questo necessrio ter presente os seguintes requisitos: Ter uma porta serie ou um conversor USB/RS232, no computador. Hardware de desenvolvimento. A ferramenta de programao para carregar o bootloader no C. Instalao do software PC AN1310.exe.

A primeira etapa instalar o software PC microchip_serial_bootloader_an1310.exe. A instalao do software requer uma ligao ao servidor da Microchip.

Fig 48 - Ficheiro de instalao do bootloader AN1310.

Aps o aparecimento da primeira janela de instalao clique em seguinte.

Bernardino Neves - 2011 Programao dos microcontroladores PIC18

Pgina 63

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Fig 49 - Primeira janela de instalao do software PC do bootloader AN1310.

Na segunda janela desactive o item Install Babylon Toolbar , e clique em seguida em seguinte.

Fig 50 - Segunda janela de instalao do software PC do bootloader AN1310.

Pressione o boto seguinte ate a janela que indica localizao da instalao, mude a localizao ou deixe a localizao por defeito.

Fig 51 Localizao da instalao do software PC AN1310.

Termine a instalao pressionando o boto close.

Pgina 64

Bernardino Neves 2011 Programao dos microcontroladores PIC18

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Fig 52 Finalizao da instalao do software PC AN1310.

Aps a instalao do software PC AN1310, chega a altura de o testar, mas antes de o fazer necessrio conhecer o hardware de desenvolvimento, como hardware de desenvolvimento foi desenvolvido um circuito com o microcontrolador PIC18F4620, que permita gravao dos programas desenvolvidos por RS232, as figuras seguintes mostram os circuitos implementados.

Fig 53 - Fonte de alimentao.

Fig 54 - Microcontrolador PIC18F4620 e transceiver RS232.

Bernardino Neves - 2011 Programao dos microcontroladores PIC18

Pgina 65

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Fig 55 - Programao em circuito ICSP.

Fig 56 Imagem do hardware desenvolvido, o kit DevBoard PIC.

A segunda etapa gravar no microcontrolador o seu respectivo bootloader, o mesmo pode ser encontrado na pasta que foi instalado pelo software de instalao.

Fig 57 - Localizao do bootloader PIC18.

Aps gravar o bootloader, atravs de um programador, j nos encontramos, com tudo o que necessrio para testar todas as ferramentas, vamos comear por testar o software PC AN1310, a figura seguinte mostra o setup experimental para um primeiro teste, que consiste em ligar o software PC ao hardware proposto.

Pgina 66

Bernardino Neves 2011 Programao dos microcontroladores PIC18

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

DevBoarb PIC

RS232

Fig 58 - Setup experimental para testar o hardware e o software PC.

Na terceira etapa, ligue o interruptor do kit Devboard PIC, para alimentar o kit e execute o software PC AN1310, que se encontra na pasta que foi instalado pelo software de instalao.

Fig 59 - Localizao do software PC AN1310.

Fig 60 - Software PC para carregar o programa no microcontrolador.

Aps executar os passos anteriores com sucesso, chega a altura de configurar as comunicao por RS232, apesar de o bootloader instalado no microcontrolador, reconhecer automaticamente o baud rate, o mesmo poder ser configurado no software PC, atravs do item Settings, como mostra as figuras seguintes, o qual poderemos deixar nos 19200 bps e seleccionar a porta COM respectiva.

Bernardino Neves - 2011 Programao dos microcontroladores PIC18

Pgina 67

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Fig 61 - Configurao do Baud Rate.

Por ltimo, para testar o software PC pressione o boto bootloader mode, como resposta possvel visualizar o mapa de memria do microcontrolador e o microcontrolador utilizado.

Fig 62 Comunicao entre o software PC e o microcontrolador.

Pgina 68

Bernardino Neves 2011 Programao dos microcontroladores PIC18

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Portos I/O.
Os portos I/O, so perifricos que nos permitem comunicar com o mundo exterior, podem ser configurados como entradas ou como sadas, quando configurado como entradas o nvel lgico presente num determinado pino pode ser lido pelo programa, quando configurado como sada, podemos alterar o nvel lgico de um determinado pino atravs do nosso programa. Durante a execuo de um programa podemos alterar o sentido dos dados nos pinos de acordo com as necessidades, isto , num determinado momento o pino pode estar configurado como entrada e no instante seguinte pode ser configurado como sada. O microcontrolador em estudo, possui 5 portos I/O, que se encontram multiplexados com outros perifricos disponveis pelo microcontrolador. Cada pino do microcontrolador apenas pode ter uma nica funo, para o mesmo instante de tempo, ou seja, ou funciona como pino I/O ou tem a funo associada a um determinado perifrico. O controlo dos portos I/O feito essencialmente atravs de 3 registos: Registo TRISx Defini a direco dos dados no porto x, se o bit for 0 o pino esta configurado como sada, se for 1 o bit esta configurado como entrada; Registo PORTx Registo para leitura do estado lgico dos pinos associados ao porto x; Registo LATx Registo para escrita no porto x. A figura 63 mostra o modelo simplificado de uma porta I/O do microcontrolador PIC18F4620.

Fig 63 - Modelo simplificado do porto I/O [1].

Um ponto importante a salientar que ambos os registos TRISx, PORTx e LATx, so registos de 8 bits, e que a posio de cada bit corresponde a posio de cada pino do respectivo porto. Por exemplo o bit 0 do registo TRISD, configura a direco dos dados do pino 0 do porto D, e a escrita e leitura nesse pino feito a partir do bit 0 do registo PORTD para leitura do estado ou o bit 0 do registo LATD para mudana do estado lgico do pino 0 do porto D.

Bernardino Neves - 2011 Portos I/O

Pgina 69

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Leitura do estado de um pino.


A leitura do estado lgico presente em um pino, depende essencialmente do modo como foi configurado a direco dos dados, isto , como foi configurado o registo TRISx. Quando se pretende efectuar leituras de pinos, os bits correspondentes no registo TRISx devem ser configurados com o valor lgico 1. A leitura do estado lgico do pino ou conjunto de pinos, feito pela leitura do registo PORTx, em que o valor x corresponde ao identificador do porto. O compilador C18, permite operaes bit a bit com os portos I/O, o que permite operar apenas com um bit, para o efeito recorremos as estruturas TRISxbits.TRISy e PORTxbits.Rxy, em que x corresponde ao identificador do porto e y ao pino que pretendemos ler. Exemplo: Pretende-se configurar os pinos 2, 3 e 4 do porto D como entradas. unsigned char a,b,c; TRISDbits.TRISD2 = 1; TRISDbits.TRISD3 = 1; TRISDbits.TRISD4 = 1; a = PORTDbits.RD2; b = PORTDbits.RD3; c = PORTDbits.RD4; No exemplo em cima descrito, configuramos os pinos 2, 3 e 4 do porto D como entradas, e de seguida lemos o estado dos pinos 2, 3 e 4 e guardamos o seu estado lgico nas variveis a, b e c.

Escrita em um pino.
A escrita em um pino, depende tambm do modo como foi configurado o registo TRISx, ou seja, para operaes de escrita em pinos I/O, o bit do registo TRISx correspondente ao pino que pretendemos escrever, deve ser configurado com o valor lgico 0. Existem dois registos que permitem a escrita de um estado lgico em um pino I/O, o registo LATx e o registo PORTx. Tal como acontece na leitura de um pino, o compilador C18 permite operaes de escrita bit a bit, para o efeito usamos as estruturas TRISxbits.TRISy, PORTxbits.Rxy e LATxbits.LATxy, em que x corresponde ao identificador do porto e y ao pino que pretendemos ler. Exemplo: Pretende-se configurar os pinos 0 e 1 do porto D como sadas. TRISDbits.TRISD0 = 0; TRISDbits.TRISD1 = 0; LATDbits.LATD0 = 1; LATDbits.LATD1 = 0; //Coloca o pino 0 do porto D com o nvel lgico 1. //Coloca o pino 1 do porto D com o nvel lgico 0.

Pgina 70

Bernardino Neves 2011 Portos I/O

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Exemplos de aplicao.
Exemplo 1 Led a piscar com frequncia igual a 1Hz.
O exemplo consiste em criar uma funo, que gera um atraso, onde o argumento o tempo em milissegundos que se pretendo do atraso, para colocar um led a piscar com uma frequncia de 1 HZ. Layout do circuito:
Led R 270
18 RC3 RC4 23

19

RD0

RD3

22

20

RD1

RD2

21

Fig 64 - Layout do circuito do exemplo 1.

Funo Delay_ms():
void Delay_ms ( int Delay) { unsigned int aux1; for ( aux1 = 0 ; aux1 < Delay ; aux1++) { Delay1KTCYx(CLOCK); } }

//Gera um atraso de 1 ms. //1000 ciclos de relgio.

A funo em cima descrita gera um atraso de 1ms vezes o numero do argumento da funo, isto , se pretendermos um atraso de 1 segundo, o argumento da funo deve ser igual a 1000. Programa:
//Incluso do microcontrolador a utilizar #include <p18cxxx.h> //Definio de variaveis #define FREQ_CRISTAL #define CLOCK #define Pino //Prototipos de funes do programa void Delay_ms ( int a); //Programa principal void main (void) { TRISD &= 0xFE; while (1) { Delay_ms(500); Pino = ~Pino; } }

(20000000) (5) (PORTDbits.RD0)

//20Mhz //((Fosc/4) / 1000000) //Pino 19 do microcontrolador

//Configura pino RD0 como sada //Ciclo infinito //Gera um delay de 500ms por polling //Comuta o estado do pino RD0

Bernardino Neves - 2011 Portos I/O

Pgina 71

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Exemplo 2 Sequncia de Leds.


O exemplo consiste em criar 4 sequncias de leds de acordo com as seguintes condies: 1 Sequencia Varrimento num sentido. 2 Sequencia Varrimento em sentido contrrio ao anterior. 3 Sequencia Varrimento das pontas para o centro. 4 Sequencia Varrimento de um lado para o outro. Cada estado tem a durao de 100ms. No final volta a primeira sequncia, e faz esse ciclo contnuo. Layout do circuito:
R 270
18 RC3 RC4 23

Led 0

R 270
19 RD0 RD3 22

R 270 R 270
20 RD1 RD2 21

Led 4

Led 1

R 270

Led 3

Led 2

Fig 65 - Layout do circuito do exemplo 2.

Funo Inicia_Hardware():
void Inicia_Hardware (void) { TRISD &= 0xF0; TRISC &= 0xEF;

//Configura pino RD0, RD1, RD2 e RD3 como saida //Configura pino RC4 como saida //No interfere com os outros pinos //Inicia o Led0 a zero. //Inicia o Led1 a zero. //Inicia o Led2 a zero. //Inicia o Led3 a zero. //Inicia o Led4 a zero.

LED0 = 0; LED1 = 0; LED2 = 0; LED3 = 0; LED4 = 0; }

Programa:
//Incluso do microcontrolador a utilizar #include <p18cxxx.h> //Definio de variveis #define FREQ_CRISTAL #define CLOCK #define LED0 #define LED1 #define LED2 #define LED3 #define LED4 //Prototipos de funes do programa void Inicia_Hardware (void); void Delay_ms ( int a);

(20000000) (5) (LATDbits.LATD0) (LATDbits.LATD1) (LATDbits.LATD2) (LATDbits.LATD3) (LATCbits.LATC4)

//20Mhz //((Fosc/4) / 1000000)

Pgina 72

Bernardino Neves 2011 Portos I/O

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

//Programa principal void main (void) { unsigned char aux1; Inicia_Hardware(); while (1) { //Primeira sequncia for ( aux1 = 0 ; aux1 < 4 ; aux1++) { if( aux1 == 0) { Delay_ms(100); LED0 = ~LED0; } else { Delay_ms(100); LED0 = ~LED0; LED4 = ~LED4; } Delay_ms(100); LED1 = ~LED1; LED0 = ~LED0; Delay_ms(100); LED2 = ~LED2; LED1 = ~LED1; Delay_ms(100); LED3 = ~LED3; LED2 = ~LED2; Delay_ms(100); LED4 = ~LED4; LED3 = ~LED3; } //Segunda sequencia LED4 = ~LED4; for ( aux1 = 0 ; aux1 < 4 ; aux1++) { if( aux1 == 0) { Delay_ms(100); LED4 = ~LED4; } else { Delay_ms(100); LED4 = ~LED4; LED0 = ~LED0; } Delay_ms(100); LED3 = ~LED3; LED4 = ~LED4; Delay_ms(100); LED2 = ~LED2; LED3 = ~LED3; Delay_ms(100); LED1 = ~LED1; LED2 = ~LED2;

//Ciclo infinito

Bernardino Neves - 2011 Portos I/O

Pgina 73

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011


Delay_ms(100); LED0 = ~LED0; LED1 = ~LED1; } //Terceira sequencia LED0 = ~LED0; for ( aux1 = 0 ; aux1 < 4 ; aux1++) { if( aux1 == 0) { Delay_ms(100); LED0 = ~LED0; LED4 = ~LED4; } else { Delay_ms(100); LED4 = ~LED4; LED0 = ~LED0; LED2 = ~LED2; } Delay_ms(100); LED0 = ~LED0; LED4 = ~LED4; LED1 = ~LED1; LED3 = ~LED3; Delay_ms(100); LED1 = ~LED1; LED3 = ~LED3; LED2 = ~LED2; } //Quarta sequencia LED2 = ~LED2; for ( aux1 = 0 ; aux1 < 4 ; aux1++) { if( aux1 == 0) { Delay_ms(100); LED0 = ~LED0; } else { Delay_ms(100); LED0 = ~LED0; LED1 = ~LED1; } Delay_ms(100); LED0 = ~LED0; LED1 = ~LED1; Delay_ms(100); LED2 = ~LED2; LED1 = ~LED1; Delay_ms(100); LED3 = ~LED3; LED2 = ~LED2;

Pgina 74

Bernardino Neves 2011 Portos I/O

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Delay_ms(100); LED4 = ~LED4; LED3 = ~LED3; Delay_ms(100); LED3 = ~LED3; LED4 = ~LED4; Delay_ms(100); LED2 = ~LED2; LED3 = ~LED3; Delay_ms(100); LED1 = ~LED1; LED2 = ~LED2; } LED1 = ~LED1; } } //Fim do ciclo infinito //Fim do programa principal

Exemplo 3 Variao da frequncia.


O exemplo consiste em fazer um led piscar com uma frequncia progressiva, o decremento da frequncia de 1Hz, inicia a 10Hz e termina a 1Hz, com saltos de 1Hz.

Layout do circuito:
18 RC3 RC4 23

Led

R 270

19

RD0

RD3

22

20

RD1

RD2

21

Fig 66 - Layout do circuito do exemplo 3.

Funo Inicia_Hardware():
void Inicia_Hardware (void) { TRISD &= 0xFD; LED0 = 0; }

//Configura pino RD1 como saida //Inicia o Led0 a zero.

Programa:
//Incluso do microcontrolador a utilizar #include <p18cxxx.h> //Definio de variveis #define FREQ_CRISTAL #define CLOCK #define LED0 //Prottipos de funes do programa void Inicia_Hardware (void); void Delay_ms ( int a);

(20000000) (5) (PORTDbits.RD1)

//20Mhz //((Fosc/4) / 1000000)

Bernardino Neves - 2011 Portos I/O

Pgina 75

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011


//Programa principal void main (void) { unsigned char a,b; Inicia_Hardware(); while (1) { for( a = 0 ; a < 20 ; a++ ) { Delay_ms(50); LED0 = ~LED0; } for( a = 0 ; a < 18 ; a++ ) { Delay_ms(55); LED0 = ~LED0; } for( a = 0 ; a < 16 ; a++ ) { Delay_ms(63); LED0 = ~LED0; } for( a = 0 ; a < 14 ; a++ ) { Delay_ms(71); LED0 = ~LED0; } for( a = 0 ; a < 12 ; a++ ) { Delay_ms(83); LED0 = ~LED0; } for( a = 0 ; a < 10 ; a++ ) { Delay_ms(100); LED0 = ~LED0; } for( a = 0 ; a < 8 ; a++ ) { Delay_ms(125); LED0 = ~LED0; } for( a = 0 ; a < 6 ; a++ ) { Delay_ms(166); LED0 = ~LED0; } for( a = 0 ; a < 4 ; a++ ) { Delay_ms(250); LED0 = ~LED0; } for( a = 0 ; a < 2 ; a++ ) { Delay_ms(500); LED0 = ~LED0; } Delay_ms(1000); LED0 = ~LED0; } } //Fim do ciclo infinito //Fim do programa principal //Ciclo infinito

Pgina 76

Bernardino Neves 2011 Portos I/O

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Exemplo 4 Activar uma sada atravs de uma entrada.


O exemplo consiste em activar uma sada, em funo do nvel lgico que se encontra numa entrada. Layout do circuito:
VCC

R 10K

RB0

33

R 470

19

RD0

Led 1

R 270
20 RD1

Fig 67 - Layout do circuito do exemplo 4.

Funo Inicia_Hardware():
void Inicia_Hardware (void) { TRISD &= 0xFD; TRISB |= 0x01; LED0 = 0; }

//Configura pino RD1 como sada //Configura Pino RB0 como entrada

Programa:
//Incluso do microcontrolador a utilizar #include <p18cxxx.h> //Definio de variveis #define FREQ_CRISTAL #define CLOCK #define LED0 #define IN0 //Prototipos de funes do programa void Inicia_Hardware (void); //Programa principal void main (void) { Inicia_Hardware(); while (1) { if ( IN0 == 0) { LED0 = 1; }

(20000000) (5) (PORTDbits.RD1) (PORTBbits.RB0)

//20Mhz //((Fosc/4) / 1000000)

//Ciclo infinito

Bernardino Neves - 2011 Portos I/O

Pgina 77

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011


else { LED0 = 0; } } } //Fim do ciclo infinito //Fim do programa principal

Exemplo 5 Mudana de estado (Toggle).


O exemplo consiste em activar uma sada por mudana de estado de uma entrada, isto , cada presso no boto, muda o estado do led. Layout do circuito:
VCC

R 10K

RB0

33

R 470

19

RD0

Led 1

R 270
20 RD1

Fig 68 - Layout do circuito do exemplo 5.

Funo Inicia_Hardware():
void Inicia_Hardware (void) { TRISD &= 0xFD; TRISB |= 0x01; LED0 = 0; }

//Configura pino RD1 como sada //Configura Pino RB0 como entrada

Programa:
//Incluso do microcontrolador a utilizar #include <p18cxxx.h> //Definio de variveis #define FREQ_CRISTAL #define CLOCK #define LED0 #define IN0 //Prototipos de funes do programa void Inicia_Hardware (void);

(20000000) (5) (PORTDbits.RD1) (PORTBbits.RB0)

//20Mhz //((Fosc/4) / 1000000)

Pgina 78

Bernardino Neves 2011 Portos I/O

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

//Programa principal void main (void) { unsigned char aux1=0; Inicia_Hardware(); while (1) { if ( IN0 == 0) { while(IN0 == 0); LED0 = ~LED0; } } } //Fim do ciclo infinito //Fim do programa principal //Ciclo infinito

Exemplo 6 Atraso a operao.


O exemplo consiste em criar um atraso a operao, isto , quando o boto IN0 pressionado, s passado 5 segundos que o led activa, outra entrada IN1 usada para desligar o led. Layout do circuito:
VCC

R 10K IN0
RB1 34

VCC

R 10K R 470 IN1

RB0

33

R 470

19

RD0

Led 1

R 270
20 RD1

Fig 69 - Layout do circuito do exemplo 6.

Funo Inicia_Hardware():
void Inicia_Hardware (void) { TRISD &= 0xFD; TRISB |= 0x03; LED0 = 0; }

//Configura pino RD1 como sada //Configura Pino RB0 como entrada

Bernardino Neves - 2011 Portos I/O

Pgina 79

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011


Programa:
//Incluso do microcontrolador a utilizar #include <p18cxxx.h> //Definio de variveis #define FREQ_CRISTAL #define CLOCK #define LED0 #define IN0 #define IN1 //Prototipos de funes do programa void Inicia_Hardware (void); void Delay_ms ( int a); //Programa principal void main (void) { Inicia_Hardware(); while (1) { if ( IN0 == 0 ) { Delay_ms(5000); LED0 = 1; } if ( IN1 == 0 ) { LED0 = 0; } } }

(20000000) (5) (PORTDbits.RD1) (PORTBbits.RB0) (PORTBbits.RB1)

//20Mhz //((Fosc/4) / 1000000)

//Ciclo infinito

//Atraso de 5 segundos //Activa a saida

//Desactiva a saida

//Fim do ciclo infinito //Fim do programa principal

Exemplo 7 Avano a operao.


O exemplo consiste em criar um avano a operao, isto , quando o boto pressionado, activa o led e s depois de deixar de ser pressionado e passado 5 segundos que o led desactiva. Layout do circuito:
VCC

R 10K

RB0

33

R 470

19

RD0

Led 1

R 270
20 RD1

Fig 70 - Layout do circuito do exemplo 7.

Pgina 80

Bernardino Neves 2011 Portos I/O

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Funo Inicia_Hardware():
void Inicia_Hardware (void) { TRISD &= 0xFD; TRISB |= 0x01; LED0 = 0; }

//Configura pino RD1 como sada //Configura Pino RB0 como entrada

Programa:
//Incluso do microcontrolador a utilizar #include <p18cxxx.h> //Definio de variveis #define FREQ_CRISTAL #define CLOCK #define LED0 #define IN0 //Prototipos de funes do programa void Inicia_Hardware (void); void Delay_ms ( int a); //Programa principal void main (void) { Inicia_Hardware(); while (1) { if ( IN0 == 0 ) { LED0 = 1; while(IN0 == 0); Delay_ms(5000); LED0 = 0; } } } //Ciclo infinito

(20000000) (5) (PORTDbits.RD1) (PORTBbits.RB0)

//20Mhz //((Fosc/4) / 1000000)

//Activa a sada //Aguarda que o boto deixe de ser pressionado //Aguarda de 5 segundos //Desactiva a sada //Fim do ciclo infinito //Fim do programa principal

Bernardino Neves - 2011 Portos I/O

Pgina 81

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Exemplo 8 Arranque estrela - tringulo.


O exemplo consiste em criar o controlo para o arranque estrela tringulo de motores de induo trifsicos, o boto IN0 inicia o arranque e o boto IN1 executa a paragem. Layout do circuito:
VCC

R 10K IN0
RB1 34

VCC

R 10K R 470 IN1

RB0

33

R 470

OUT0

R 270
19 RD0

R 270
20 RD1 RD2 21

R 270

OUT2 OUT1

Fig 71 - Layout do circuito do exemplo 8.

Funo Inicia_Hardware():
void Inicia_Hardware (void) { TRISD &= 0xF8; TRISB |= 0x03; OUT0 = 0; OUT1 = 0; OUT2 = 0; }

//Configura pino RD0, RD1 e RD2 como sadas //Configura pino RB0 e RB1 como entradas //Inicializa as sadas a zero

Programa: //Incluso do microcontrolador a utilizar #include <p18cxxx.h> //Definio de variveis #define FREQ_CRISTAL #define CLOCK #define OUT0 #define OUT1 #define OUT2 #define IN0 #define IN1

(20000000) (5) (PORTDbits.RD1) (PORTDbits.RD4) (PORTDbits.RD5) (PORTBbits.RB0) (PORTBbits.RB1)

//20Mhz //((Fosc/4) / 1000000) //Linha //Estrela //Tringulo //Arranque //Paragem

Pgina 82

Bernardino Neves 2011 Portos I/O

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

//Prototipos de funes do programa void Inicia_Hardware (void); void Delay_ms ( int a); //Programa principal void main (void) { Inicia_Hardware(); while (1) { if ( IN0 == 0 ) { OUT0 = 1; OUT2 = 1; Delay_ms(5000); OUT2 = 0; OUT1 = 1; while(IN1 == 0); OUT0 = 0; OUT1 = 0; OUT2 = 0; } } } //Fim do ciclo infinito //Fim do programa principal

//Ciclo infinito //Verifica se o boto de arranque est pressionado //Activa a configurao estrela //Aguarda de 5 segundos //Comuta para a configurao tringulo

//Aguarda que o boto de paragem seja pressionado //Desactiva as sadas

Exemplo 9 Display de 7 segmentos.


O exemplo consiste em criar um contador, cada presso no boto de presso incrementa o contador, o resultado visvel num display de 7 segmentos. Layout do circuito:
VCC

R 10K IN0
RB0 33

R 470

SEG A

R 270
17 RC2

SEG B

R 270
18 Rc3 RC4 21

R 270 R 270
19 RD0 RD3 21

SEG G

R 270 SEG C R 270


20 RD1 RD2 21

SEG F

SEG D

R 270

SEG E

Fig 72 - Layout do circuito do exemplo 9.

Bernardino Neves - 2011 Portos I/O

Pgina 83

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Funo Inicia_Hardware():
void Inicia_Hardware (void) { TRISC &= 0xE3; TRISD &= 0xF0; TRISB |= 0x01; SegA = 0; SegB = 0; SegC = 0; SegD = 0; SegE = 0; SegF = 0; SegG = 0; }

//RC2, RC3 e RC4 como sadas //RD0, RD1, RD2 e RD3 como sadas //Configura Pino RB0 como entrada //Inicializa as sadas a zero

Funo Escreve_Digito():
void Escreve_Digito( unsigned char a) { switch (a) { case 0: SegA = 1; SegB = 1; SegC = 1; SegD = 1; SegE = 1; SegF = 1; SegG = 0; break; case 1: SegA = 0; SegB = 1; SegC = 1; SegD = 0; SegE = 0; SegF = 0; SegG = 0; break; case 2: SegA = 1; SegB = 1; SegC = 0; SegD = 1; SegE = 1; SegF = 0; SegG = 1; break; case 3: SegA = 1; SegB = 1; SegC = 1; SegD = 1; SegE = 0; SegF = 0; SegG = 1; break;

Pgina 84

Bernardino Neves 2011 Portos I/O

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

case 4: SegA = 0; SegB = 1; SegC = 1; SegD = 0; SegE = 0; SegF = 1; SegG = 1; break; case 5: SegA = 1; SegB = 0; SegC = 1; SegD = 1; SegE = 0; SegF = 1; SegG = 1; break; case 6: SegA = 1; SegB = 0; SegC = 1; SegD = 1; SegE = 1; SegF = 1; SegG = 1; break; case 7: SegA = 1; SegB = 1; SegC = 1; SegD = 0; SegE = 0; SegF = 0; SegG = 0; break; case 8: SegA = 1; SegB = 1; SegC = 1; SegD = 1; SegE = 1; SegF = 1; SegG = 1; break; case 9: SegA = 1; SegB = 1; SegC = 1; SegD = 1; SegE = 0; SegF = 1; SegG = 1; break; default: break; } }

Bernardino Neves - 2011 Portos I/O

Pgina 85

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011


Programa: //Incluso do microcontrolador a utilizar #include <p18cxxx.h> //Definio de variveis #define FREQ_CRISTAL #define CLOCK #define SegA #define SegB #define SegC #define SegD #define SegE #define SegF #define SegG #define IN0 //Prototipos de funes do programa void Inicia_Hardware (void); void Delay_ms ( int a); void Escreve_Digito( unsigned char a); //Programa principal void main (void) { unsigned char aux1 = 0; Inicia_Hardware(); while (1) { if ( IN0 == 0) { while(IN0 == 0); Escreve_Digito( aux1 ); aux1++; if( aux1 == 10 ) aux1 = 0; } } } //Fim do ciclo infinito //Fim do programa principal //Ciclo infinito

(20000000) (5) (PORTCbits.RC2) (PORTCbits.RC3) (PORTDbits.RD0) (PORTDbits.RD1) (PORTDbits.RD2) (PORTDbits.RD3) (PORTCbits.RC4) (PORTBbits.RB0)

//20Mhz //((Fosc/4) / 1000000)

Exemplo 10 Leitura e escrita em um pino (maximizao do pino).


O exemplo consiste em maximizar um pino, isto , o reaproveitamento de um mesmo pino I/O para mais que uma funo, neste caso a leitura e escrita em um pino. Existem varias tcnicas para maximizar um pino I/O, uma forma de o fazer configurar num instante de tempo como entrada e no instante de tempo seguinte como sada, isto de uma forma peridica. Mas para esta tcnica funcionar correctamente, o tempo dedicado a sada tem de ser bastante superior (maior que 20 vezes), que o tempo dedicado a entrada, caso contrrio, corremos o risco de verificarmos na sada o efeito de intermitncia. Vejamos a seguinte figura, a figura 73, que representa o diagrama temporal desta tcnica para maximizar um pino I/O.

Pgina 86

Bernardino Neves 2011 Portos I/O

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011

Sada

Entrada

Sada

Entrada

VCC Led desligado GND VCC Led ligado GND Led ligado Led desligado

O tempo dedicado a entrada deve ser de modo a que o efeito de intermitncia seja minimizado.

Fig 73 - Diagrama temporal, da tcnica para maximizar um pino I/O.

Para utilizar esta tcnica, podemos recorrer a uma base de tempo de 20ms, onde 19ms so dedicados a sada e 1ms so dedicados a entrada. No exemplo o boto IN0 liga o led e o boto IN1 desliga o led.

Layout do circuito:
VCC

R 10K IN1
RB1 34

VCC

R 470

R 10K IN0

RB0

33

R 10K

R 330

Led

Fig 74 - Layout do circuito do exemplo 10.

Funo Inicia_Hardware():
void Inicia_Hardware (void) { TRISB |= 0x02; OUT0 = 0; }

//Configura RB1 como entrada.

Bernardino Neves - 2011 Portos I/O

Pgina 87

CET Automao, Robtica e Controlo Industrial Sistemas de MicroControladores - 2011


Programa: //Incluso do microcontrolador a utilizar #include <p18cxxx.h> //Definio de variaveis #define FREQ_CRISTAL #define CLOCK #define OUT0 #define IN0 #define IN1 #define DIR

(20000000) (5) (LATBbits.LATB0) (PORTBbits.RB0) (PORTBbits.RB1) (TRISBbits.TRISB0)

//20Mhz //((Fosc/4) / 1000000)

//Prototipos de funes do programa void Inicia_Hardware (void); void Delay_ms ( int a); //Programa principal void main (void) { unsigned char aux = 0; Inicia_Hardware(); while (1) { if ( IN1 == 0) { aux = 0; OUT0 = 0; } DIR = 1; if (IN0 == 0) { aux = 1; } DIR = 0; if( aux == 1) { OUT0 = 1; Delay_ms(19); } } } //Configura RB0 como sada //Se IN0 foi pressionado //Liga o led e aguarda 19ms. //Ciclo infinito //Verifica se o boto IN1 foi pressionado

//Desliga o Led

//Configura RB0 como entrada //Verifica se o boto IN0 foi pressionado

//Fim do ciclo infinito //Fim do programa principal

Pgina 88

Bernardino Neves 2011 Portos I/O

Você também pode gostar