Você está na página 1de 81

Programao de Microcontroladores PIC Mdulo I

3
SUMRIO

INTRODUO AOS MICROCONTROLADORES 04
CARACTERSTICAS DO PIC 16F877A 06
AMBIENTE INTEGRADO DE DESENVOLVIMENTO (IDE) 14
PROGRAMANDO EM LINGUAGEM C 26
LEITURA DE ENTRADAS DIGITAL 29
DISPLAY DE 7 SEGMENTOS 32
DISPLAY LCD ALFANUMRICO 38
INTERRUPES 48
TIMERS 57
EEPROM INTERNA 66
CONVERSOR ANALGICO DIGITAL (A/D) 69
MDULO CCP 76












Programao de Microcontroladores PIC Mdulo I

4
INTRODUO AOS MICROCONTROLADORES
O QUE UM MICROCONTROLADOR?
Podemos definir um microcontrolador como um pequeno computador. Isso mesmo,
ele um componente eletrnico (chip) que possui todos os hardwares e ferramentas que
um computador possui. Este dotado de uma inteligncia programvel capaz de interagir
com o meio externo, tais como: leds, botes, reles, lcds, sensores diversos (presso,
temperatura, luminosidade, etc...), e at mesmo interagir com outros microcontroladores
realizando operaes lgicas e aritmticas conforme o cdigo inserido nele.

MICROCONTROLADOR X MICROPROCESSADOR
Um microcontrolador diferente de um microprocessador em diversos aspectos. O
principal e mais importante, a sua funcionalidade. Para se utilizar um microprocessador,
voc necessita de memrias RAM e ROM, componentes para enviar e receber dados,
monitor, entre outros. Ou seja, o microprocessador o componente do computador que faz
apenas os clculos em alta velocidade (o corao do computado). Um microcontrolador j
possui dentro de um mesmo encapsulamento, componente como: CPU, memrias,
conversores a/d, etc.



Programao de Microcontroladores PIC Mdulo I

5
ONDE SO UTILIZADOS?
Microcontroladores so geralmente utilizados em automao e controle de produtos e
perifricos, como sistemas de controle de motores automotivos, controles remotos,
mquinas de escritrio e residenciais, brinquedos, sistemas de superviso, etc.
Por reduzir o tamanho, custo e consumo de energia, e se comparados forma de
utilizao de microprocessadores convencionais, aliado a facilidade de desempenho de
aplicaes juntamente com seu baixo custo, os microcontroladores so uma alternativa
eficiente para controlar muitos processos e aplicaes.

Figura 3: Exemplos de utilizao de microcontroladores.
FABRICANTES:
ALTERA, AMD (ADVANCED MICRO DEVICE), DS (DALLAS SEMICONDUTOR), FAIRCHILD,
FREESCALE, INTEL, RENESAS ( UM EMPREENDIMENTO DA HITACHI E MITSUBISHI),
MOTOROLA, NATIONAL, NXP (ANTIGA PHILIPS SEMICONDUCTORS), SANSUNG, SIEMENS,
ZETEX.
DESTAQUE:
Microchip (PIC), ATMEL (8051), PARALAX (basic stamp), ZILOG (z80), TEXAS (msp430),
FREESCALE (68hc05).












Programao de Microcontroladores PIC Mdulo I

6
O PIC 16F877A
O que PIC ?
Os PICs so uma famlia de Microcontroladores fabricados pela empresa microchip
technology. A sigla PIC significa controlador integrado de perifricos.
So circuitos integrados que internamente dispe de CPU, memria RAM, memria
EEPROM e uma serie de linhas de i/o para controlar dispositivos externos ou receber
informaes, entre outros perifricos internos. A famlia PIC tem chips que processam dados
de 8 bits, de 16 bits e mais recentemente de 32 bits, tendo uma extensa variedade de
modelos e perifricos internos. Sendo assim, d ao projetista uma ampla gama de trabalho,
adaptando-se as exigncias de projetos especficos.
Caractersticas do PIC 16F877A
Microcontrolador de 8 bits;
33 portas de i/o configurveis como
entrada ou sada;
15 interrupes disponveis;
Memria EEPROM interna de 256 bytes;
Memria RAM interna de 368 bytes;
Memria flash de 8192 works;
8 canais A/D de 10 bits.
2 modulo de CCP (capture, compare,
pwm);
2 comparadores analgicos;
2 timer de 8-bit e 1 timer de 16-bit;
Comunicao serial USART, SPI e IC;
Oscilador externo de at 20mhz;

Caractersticas eltricas
Os principais fatores que deve se tomar cuidado em relao de limites eltricos do PIC,
so:
A tenso de alimentao, onde no se deve ter variao de 500mV;
Corrente mxima fornecida por um pino, que est estabelecida em 25mA;
Corrente mxima drenada por um pino, especificada em 25mA;
Corrente mxima fornecida pelo PIC, onde a soma da corrente fornecida pelo port A,B e E
no deve ultrapassar 200mV e a soma da corrente fornecida pelo port C e D no deve
ultrapassar 200mA ;
Corrente mxima drenada pelo PIC, onde a soma da corrente drenada pelo port A,B e E
no deve ultrapassar 200mV e a soma da corrente drenada pelo port C e D no deve
ultrapassar 200mA;
A figura, a seguir, mostra as caractersticas eltricas determinadas pelo fabricante do
componente.


Programao de Microcontroladores PIC Mdulo I

7

Especificaes eltricas (datasheet do PIC 16F877A).

Arquitetura de construo
No diagrama de blocos do PIC 16f877A, retirado do datasheet da microchip, podem ser
visualizadas as diversas partes que compem o microcontrolador 16F877A. O mesmo
composto pela ULA (unidade lgica aritmtica - do ingls ALU), que est diretamente ligado
ao registrador W (work). No canto superior esquerdo temos a memria de programa e
saindo desse bloco temos um barramento de 14 bits (program bus 14). Mais ao centro est a
memria de dados (RAM). Ela j possui o barramento de 8 bits (data bus 8). Do lado direito
podemos visualizar as portas com todos os seus pinos de i/o. Na parte inferior se encontram
os perifricos, tais como a EEPROM, os TIMERs, o comparador interno, o mdulo CCP e a
porta serial USART. Um pouco mais ao centro temos o registrador status. Na parte superior
temos ainda o contador de linha de programa (program counter) e a pilha de oito nveis
(stack). Temos ainda os circuitos internos de reset, osciladores, watchdog timer (WDT),
power-up e brown-out internos.

Programao de Microcontroladores PIC Mdulo I

8

Diagrama em blocos (datasheet PIC 16F877A).
Nomenclatura dos pinos
O PIC 16F877A possui 40 pinos (package PDPI), tendo 33 I/O, quatro pinos para
alimentao (2 VDD e 2 VSS), dois pinos para o oscilador (OSC1 e OSC2) e o pino de reset
(MCLR). Veja a seguir a distribuio dos pinos e suas funes:

Programao de Microcontroladores PIC Mdulo I

9

Pinagem do chip (datasheet PIC 16F877A).
Pino 1: MCLR/VPP = Reset / tenso de programao;
Pino 2: RA0/AN0 = I/O digital / Entrada analgica 0;
Pino 3: RA1/AN1 = I/O digital / Entrada analgica 1;
Pino 4: RA2/AN2/Vref-/CVref = I/O digital / Entrada analgica 2 / Entrada (low) de
referncia A/D / Sada de referncia do comparador;
Pino 5: RA3/AN3/Vref+ = I/O digital / Entrada analgica 3 / Entrada (high) de referncia
A/D;
Pino 6: RA4/T0CKI/C1OUT = I/O digital / Entrada de clock externo do Timer0 / Sada do
comparador 1;
Pino 7: RA5/AN4/SS/C2OUT = I/O digital / Entrada analgica 4 / Entrada de seleo SPI
Slave / Sada do comparador 2;
Pino 8: RE0/RD/AN5 = I/O digital / Controle de leitura para a porta paralela / Entrada
analgica 5;
Pino 9: RE1/WR/AN6 = I/O digital / Controle de escrita para a porta paralela / Entrada
analgica 6;
Pino 10: RE2/CS/AN7 = I/O digital / Controle de chip select para a porta paralela /
Entrada analgica 7;
Pino 11: VDD/VCC = Alimentao positiva (5V);

Programao de Microcontroladores PIC Mdulo I

10
Pino 12: VSS/GND = Alimentao negativa (0V);
Pino 13: OSC1/CLKI = Entrada para cristal oscilador / Entrada para oscilador externo;
Pino 14: OSC2/CLKO = Sada para cristal oscilador / Sada de do oscilador externo;
Pino 15: RC0/T1OSO/T1CKI = I/O digital / Sada de oscilador do TIMER1 / Entrada de clock
externo para TIMER1;
Pino 16: RC1/T1OSI/CCP2 = I/O digital / Entrada de oscilado do TIMER1 / Mdulo CCP2;
Pino 17: RC2/CCP1 = I/O digital / mdulo CCP1;
Pino 18: RC3/SCK/SCL = I/O digital / Entrada ou sada de clock para SPI / Entrada ou sada
de clock para IC;
Pino 19: RD0/PSP0 = I/O digital / Bit0 de dados da porta paralela;
Pino 20: RD1/PSP1 = I/O digital / Bit1 de dados da porta paralela;
Pino 21: RD2/PSP2 = I/O digital / Bit2 de dados da porta paralela;
Pino 22: RD3/PSP3 = I/O digital / Bit3 de dados da porta paralela;
Pino 23: RC4/SDI/SDA = I/O digital / Entrada de dados para SPI / I/O de dados para IC;
Pino 24: RC5/SDO = I/O digital / Sada de dados para SPI;
Pino 25: RC6/TX/CK = I/O digital / Transmissor USART assncrono / Clock USART sncrono;
Pino 26: RC7/RX/DT = I/O digital / Receptor USART assncrono / Dados USART sncrono;
Pino 27: RD4/PSP4 = I/O digital / Bit4 de dados da porta paralela;
Pino 28: RD5/PSP5 = I/O digital / Bit5 de dados da porta paralela;
Pino 29: RD6/PSP6 = I/O digital / Bit6 de dados da porta paralela;
Pino 30: RD7/PSP7 = I/O digital / Bit7 de dados da porta paralela;
Pino 31: VSS/GND = Alimentao negativa (0V);
Pino 32: VDD/VCC = Alimentao positiva (5V);
Pino 33: RB0/INT = I/O digital / interrupo externa;
Pino 34: RB1 = I/O digital;
Pino 35: RB2 = I/O digital;
Pino 36: RB3/PGM = I/O digital / Low-voltage ICSP programing pin.
Pino 37: RB4 = I/O digital;
Pino 38: RB5 = I/O digital;
Pino 39: RB6/PGC = I/O digital / In-circuit debugger e ICSP programing clock;
Pino 40: RB7/PGD = I/O digital / In-circuit debugger e ICSP programing data;
Oscilador do PIC 16F877A:
O oscilador ou clock do PIC pode ser configura de quatro maneiras distintas
dependendo do uso. Esta configurao feita via software e aceita pelo microcontrolador
durante a sua gravao. O clock determinar a velocidade de operao do microcontrolador.
Na grande maioria dos projetos a verso de 4mhz mais que suficiente. A figura
abaixo mostra os possveis modos de oscilao externa ao PIC.

Programao de Microcontroladores PIC Mdulo I

11

Oscilador RC: o microcontrolador PIC pode oscilar com o uso de uma rede RC. Nesta
configurao a velocidade de operao do PIC no grande e tambm no muito
precisa, mas para executar tarefas que no necessitem de preciso no clock e de grande
velocidade de operao, esta opo a mais simples e pode ser utilizada.
Oscilador externo: tambm podemos utilizar um oscilador externo. Neste caso o sinal
de clock inserido no pino OSC1/CLKIN. O pino OSC2/CLKOUT deve ficar aberto (sem
conexo), ou se configurado via software, ele pode ser usado como i/o digital.
Cristal ou ressonador: quando se utiliza um desses tipos de oscilador, temos que usar os
dois pinos OSC do PIC conseguindo trabalhar com uma faixa de frequncia muito ampla,
desde 32khz at 20mhz. Existe 3 tipos de configuraes via software, para cristais ou
ressonadores, dependendo da frequncia a ser utilizada, sendo que nos trs tipos a
configurao hardware sempre a mesma. As configuraes via software so: LP, XT e
HS.
Configurao LP: esta opo permite ao PIC utilizar um cristal de baixa potncia,
com velocidade de 32khz at 200khz.
Configurao XT: nesta opo temos uma faixa de frequncia que varia de 200khz
at 4mhz. Esta a configurao mais utilizada, visto que a velocidade de 4mhz
facilita o calculo de tempo das instrues.
Configurao HS: a configurao HS deve ser utilizada com cristais ou ressonadores

Programao de Microcontroladores PIC Mdulo I

12
de alta frequncia, sua faixa varia de 4mhz at 20mhz. Geralmente clocks maiores
que 8mhz utilizam esta configurao j que se pode utilizar a configurao XT para
4mhz. Lembre-se... Quanto maior a velocidade do clock mais preciso ter, mas o
consumo aumentar proporcionalmente!
Como visto a cima, a configurao de hardware, para oscilador com cristal ou
ressonador, igual independente da frequncia utilizada, porem os valos dos capacitores
mudam de acordo com a velocidade, cristal ou ressonador. As tabelas abaixo mostram essa
variao de valores dos capacitores.

Ressonador (datasheet PIC 16F877A). Cristal (datasheet PIC 16F877A).
Vale salientar que o PIC divide o clock internamente por 4. Por exemplo, com um
cristal de 4mhz o PIC ter um tempo de 1 micro segundo para cada ciclo de mquina (tempo
para realizar uma instruo).
O master clear (MCLR)
O pino MCLR o reset externo do PIC, ou seja, o PIC s passa a funcionar normalmente
quando este pino estiver em nvel logico alto (5v). Sendo assim, quando o PIC j estiver
funcionando e voc tiver a necessidade de dar um reset nele, basta jogar nvel logico baixo
(0v) no pino MCLR. A figura abaixa mostra uma configurao bsica de reset por meio do
MCLR.

Hardware para MCLR


Programao de Microcontroladores PIC Mdulo I

13
Alimentao para o PIC
A alimentao do PIC pode feita, geralmente, com uma tenso de 5v. Para a
tolerncia, devemos adotar o padro TTL com a alimentao variando +/- 10% mximos.
Uma forma fcil de chegar ao valor correto de alimentao utilizando um regulador
de tenso LM7805, como no circuito abaixo.


No circuito acima foi utilizado 4 capacitores para ajudar na estabilidade da tenso de
entrada no LM7805 e na sada dele tambm, com detalhe aos capacitores C1 e C2 que
devem ficar prximos ao regulador de tenso e o capacitor C4 que deve estar prximo aos
pinos de alimentao do PIC.
Tambm possvel utilizar tenses de 2.7 v a 3.3 v para alimentar um PIC. Porm isto
deve estar previsto para o modelo do PIC alvo, a mesma geralmente utilizada em
equipamentos portteis de baixo consumo.









Programao de Microcontroladores PIC Mdulo I

14
AMBIENTE INTEGRADO DE DESENVOLVIMENTO (IDE)
O que MPLAB?
O software MPLAB um ambiente de desenvolvimento de projetos (firmware) da
prpria MICROCHIP. Este IDE tem por finalidade auxiliar no desenvolvimento dos seus
programas, oferecendo um ambiente com ferramentas de fcil acesso e com um extremo
poder para DEBUGGAR seu cdigo, quando necessrio. O MPLAB um software 100%
gratuito, podendo ser adquirido no site da MICROCHIP por meio de download.
O que o CCS-C?
O software CCS-C um compilador da linguagem C. Este transforma seu cdigo escrito
em linguagem C e transforma em linguagem de mquina (.HEX), pois essa linguagem que o
seu PIC vai interpretar na hora da gravao. O CCS-C tambm pode ser adquirido atravs do
site da CCS por meio de download.
Abaixo, segue uma tabela com as principais funes embutidas no compilador CCS-C.
Vale lembrar que essas funes foram desenvolvidas a partir das 35 instrues que o PIC
aceita.
ENTRADA E SADA DIGITAL
OUTPUT_LOW (); Coloca uma sada em nvel baixo. (0v)
OUTPUT_HIGH (); Coloca uma sada em nvel alto. (5v)
OUTPUT_BIT (); Envia o valor de um bit do byte alvo para um pino.
OUTPUT_A (); Envia um byte para o PORTA.
OUTPUT_B (); Envia um byte para o PORTB.
OUTPUT_C (); Envia um byte para o PORTC.
OUTPUT_D (); Envia um byte para o PORTD.
OUTPUT_E ();
IN
Envia um byte para o PORTE.
INPUT (); L o valor de um pino.
INPUT_A (); L o valor do PORTA.
INPUT_B (); L o valor do PORTB.
INPUT_C (); L o valor do PORTC.
INPUT_D (); L o valor do PORTD.
INPUT_E (); L o valor do PORTE.
SET_TRIS_A (); Configura a direo de dados (in/out) dos pinos do PORTA.
SET_TRIS_B (); Configura a direo de dados (in/out) dos pinos do PORTB.
SET_TRIS_C (); Configura a direo de dados (in/out) dos pinos do PORTC.
SET_TRIS_D (); Configura a direo de dados (in/out) dos pinos do PORTD.
SET_TRIS_E (); Configura a direo de dados (in/out) dos pinos do PORTE.
PORT_B_PULLUPS (); Configura os PULL-UPs de entrada do PORTB.

Programao de Microcontroladores PIC Mdulo I

15
PWM
SETUP_CCPX (); Define o modo de operao dos pinos de PWM.
SET_PWMX_DUTY (); Determina o valor do PWM, de 0 a 1023.

BIT / BYTE
SHIFT_RIGHT (); Rola os dados para direita.
SHIFT_LEFT (); Rola os dados para esquerda.
ROTATE_RIGHT (); Rotaciona dados para a direita.
ROTATE_LEFT (); Rotaciona dados para a esquerda.
BIT_CLEAR (); Limpa um BIT de uma varivel.
BIT_SET (); Ativa um BIT de uma varivel.
BTI_TEST (); Testa um bit de uma varivel.
SWAP (); Troca os nibbles de uma varivel de 8 bits.
MAKE8 (); Extrai um byte de uma varivel.
MAKE16 (); Extrai uma Word de uma varivel.
MAKE32 (); Extrai um valor de 32 bits de uma varivel.

TIMERS
SETUP_TIMER_X (); Configura o funcionamento do TIMER alvo (X).
SET_TIMER_X (); Inicializa o TIMER alvo (X).
GET_TIMER_X (); Busca o valor do TIMER alvo (X).
SETUP_COUNTERS (); Configura contador.
SETUP_WDT (); Configura o WATCH DOG TIMER.
RESTART_WDT (); Reinicia o WATCH DOG TIMER.

EEPROM
READ_EEPROM (); Ler um byte da EEPROM.
WRITE_EEPROM (); Gravar um byte na EEPROM.
READ_PROGRAM_EEPROM (); Ler rea da ROM de programa (flash).
WRITE_PROGRAM_EEPROM (); Gravar algo na rea da ROM de programa (flash).
WRITE_PROGRAM_MEMORY (); Grava uma sequencia de byte na memria de programa (flash).
READ_PROGRAM_MEMORY (); L uma sequncia de bytes na memria de programa (flash).
ERASE_PROGRAM_MEMORY (); Apaga uma rea da memria de programa (flash).
WRITE_EXTERNAL_MEMORY (); Grava em uma memria externa.
SETUP_EXTERNAL_MEMORY (); Configura a forma de utilizao de uma memria externa.


Programao de Microcontroladores PIC Mdulo I

16
ANALGICAS
SETUP_COMPARATOR (); Configura o comparador.
SETUP_ADC_PORTS (); Configura portas utilizadas pelo conversor AD.
SETUP_ADC (); Configura o AD.
SET_ADC_CHANNEL (); Determinas o canal AD a ser utilizado.
READ_ADC (); L o valor do canal AD ativado.
VOLTAGE REF
SETUP_VREF (); Estabelece tenso de referncia dos comparadores.

FUNES DE I/O VIA RS232
GETC (); OU GETCHAR (); Busca um caractere via porta serial.
PUTC (); OU PUTCHAR (); Envia um caractere via porta serial.
FGETC (); Busca caractere em um dispositivo.
GETS (); Busca uma string pela porta serial.
PUTS (); Envia sequncia de caracteres via porta serial.
FGETS (); Busca uma sequncia de caracteres via porta serial.
FPUTC (); Envia um caractere a um dispositivo.
FPUTS (); Envia uma sequncia de caracteres a um dispositivo.
KBHIT (); Verifica se h caractere disponvel na entrada serial.
PRINTF (); Imprime uma sequncia formatada de texto em um dispositivo.
FPRINTF (); Sada formatada para um dispositivo.
SET_UART_SPEED (); Determina velocidade da porta serial.
PERROR (); Imprime uma mensagem de erro no dispositivo padro de sada.
ASSERT (); Usado para depurao.

SPI (I/O 2 FIOS)
SETUP_SPI (); Inicializa SPI.
SPI_READ (); L da interface serial.
SPI_WRITE (); Grava na interface serial.
SPI_DATA_IS_IN (); Retona verdadeiro se existem dados recebidos pela SPI.

I2C
I2C_START (); Inicia interface I2C.
I2C_STOP (); Para interface I2C.
I2C_READ (); L byte da interface I2C.

Programao de Microcontroladores PIC Mdulo I

17
I2C_WRITE (); Grava byte na interface I2C.
I2C_POLL (); Verifica buffer da interface.

PROCESSADOR
SLEEP (); Entra em modo SLEEP.
RESET_CPU (); Reinicia o microcontrolador.
RESTART_CAUSE (); Retorna a causa do ultimo reset.
DISABLE_INTERRUPTS (); Desativa interrupes.
ENABLE_INTERRUPTS (); Ativa as interrupes.
EXT_INT_EDGE (); Configura o comportamento da interrupo por borda.
READ_BANK (); L o valor de um registrador em um determinado banco.
WRITE_BANK (); Grava uma informao em uma posio de memria.
LABEL_ADDRESS (); Endereo RM representado por um rtulo.
GOTO_ADDRESS (); Desvia a execuo para um endereo ROM.
GETENV (); Retorna o valor de uma varivel de ambiente.

DELAYS
DELAY_US (); Causa um atraso (tempo) em milionsimos de segundos.
DELAY_MS (); Causa um atraso (tempo) em milsimos de segundos.
DELAY_CYCLES (); Causa um atraso em nmeros de ciclos de maquina (FOSC/4).


MATEMICAS
ABS (); Retorna valor absoluto.
ACOS (); Arco cosseno.
ASIN (); Arco seno.
ATAN (); Arco tangente.
CEIL (); Arredonda acima um float para nmero inteiro.
COS (); Cosseno.
EXP (); Calcula funo AND (E) de um nmero.
FLOOR (); Arredonda abaixo um float para nmero inteiro.
LABS (); Calcula o valor absoluto de um long.
SINH (); Seno hiperblico.
LOG (); Logaritmo natural.
LOG10 (); Logaritmo base 10.
POW (); Potncia.

Programao de Microcontroladores PIC Mdulo I

18
SNI (); Seno.
COSH (); Cosseno hiperblico.
TANH (); Tangente hiperblico.
FABS (); Valor absoluto para um float.
FMOD (); Resto da diviso de ponto flutuante.
ATAN2 (); Arco tangente.
FREXP (); Quebra um float.
MODF (); Quebra um float em inteiro decimal.
SQRT (); Raiz quadrada.
TAN (); Tangente.
DIV (); Diviso retornando quociente e resto.
LDIV (); Diviso de um long retornando quociente e resto.

STANDARD
ATOI (); Transforma ASCII em int.
ATOI32 (); Transforma ASCII em int32.
ATOL (); Transforma ASCII em long.
ATOF (); Transforma ASCII em float.
TOLOWER (); Transforma letras maisculas em minsculas.
TOUPPER (); Transforma letras em minsculas em maisculas.
ISALNUM (); Verifica se uma string numrica.
ISALPHA (); Verifica se uma string alfabtica.
ISAMOUNG (); Verifica se um caractere pertence a uma string.
ISDIGIT (); Verifica se nmero.
ISLOWER (); Verifica se a letra minscula.
ISSPACE (); Verifica se espao.
ISUPPER (); Verifica se letra maiscula.
ISXDIGIT (); Verifica se digito hexadecimal.
STRLEN (); Retorna comprimento de uma string.
STRCPY (); Copia uma string.
STRNCPY (); Copia com limite de caracteres.
STRCMP (); Compara strings.
STRICMP (); Compara strings ignorando maisculo-minscula.
STRNCMP (); Compara com limites de caracteres.
STRCAT (); Concatena strings.
STRSTR (); Procura por uma string dentro de outra.

Programao de Microcontroladores PIC Mdulo I

19
STRCHR (); Procura caracteres em uma string.
STRRCHR (); Procura caracteres em uma string, de traz para frente.
STRTOK (); Aponta para prximo caractere aps separador em uma string.
STRSPN (); Conta caracteres iniciais em strings.
STRCSPN (); Conta caracteres iniciais em strings.
STRPBRK (); Procura primeiro caractere comum em strings.
STRLWR (); Converte uma string em minsculas.
SPRINTF (); Imprime em uma string.
ISGRAPH (); Testa se caractere grfico.
ISCNTRL (); Testa se caractere de controle.
ISPRINT (); Testa se imprimvel.
STRTOD (); Extrai um float de uma string.
STRTOL (); Extrai um inteiro de uma string.
STRTOUL (); Idem.
STRNCAT (); Concatena com limite de caracteres.
STRCOLL (); Compara caracteres em uma string.
STRXFRM (); Compara caracteres em uma string.

STANDARD C
MEMSET (); Copiar um conjunto de dados na memria.
MEMCPY (); Copiar um conjunto de dados na memria.
OFFSETTOF (); Retorna valor de deslocamento de dados na memria.
OFFSETTOFBIT (); Retorna valor de deslocamento de dados na memria.
MALLOC (); Aloca dinamicamente uma rea de memria.
CALLOC (); Aloca dinamicamente uma rea de memria.
REALLOC (); Realoca memria.
MEMMOVE (); Copiar um conjunto de dados na memria.
FREE (); Libera memria alocada por malloc ou calloc.

Criando um projeto no MPLAB com o compilador CCS
Os estudos desenvolvidos nessa apostila foram desenvolvidos com base na verso 8.56
do MPLAB e verso 3.203 do CCS_C_PCWM. Ser necessrio tambm ter o plugin
CCS/MPLAB que pode ser adquirido no site da CCS.
Aps ter o MPLAB, CCS e plugin devidamente instalados em seu PC, abra o MPLAB,
nele abrir a seguinte janela:

Programao de Microcontroladores PIC Mdulo I

20

A seguir, na barra de ferramentas, clique em project>project wizard, aparecer uma
nova janela, este um assiste para criao do projeto. Clique em avanar nesta nova janela.
Em seguida aparecera a opo para escolher o PIC que deseja utilizar em seu projeto. No
nosso caso utilizaremos o PIC 16F877A, aps escolher clique em avanar.

Agora apareceu a janela onde voc escolhe o a linguagem que pretende utilizar no seu
programa. No nosso caso utilizaremos a linguagem c e compilador CCS, sendo assim onde
est escrito tollsuites contentes, clique na seta de seleo e escolha a opo CCS C
COMPILER FOR pic10/12/14/16/18/24/dspic32, como mostra a imagem a seguir:

Programao de Microcontroladores PIC Mdulo I

21

Em seguida clique em browse... E direcione o arquivo ccsc.exe, este arquivo esta
localizado na pasta de instalao do CCS, a PICC, normalmente localizada na pasta de
arquivos de programas do windows. Feito isso clique em avanar.


Programao de Microcontroladores PIC Mdulo I

22
A janela que apareceu onde voc vai escolher onde salvar os arquivos do seu projeto.
Ento clique em browse... E escolha o diretrio onde deseja salvar o projeto, escolha
tambm o nome do seu projeto. Lembrando que sempre importante voc criar uma pasta
para cada projeto que criar, conseguindo assim manter uma organizao.
Aps escolher o local onde deseja salvar seu projeto, clique em avanar duas vezes e
conclua o assistente. Feito isso, na barra de ferramentas superior, clique em file>new file.
Aparecer uma janela com uma folha em branco, est janela onde voc vai escrever seu
cdigo em c.

Escreva qualquer coisa na janela do cdigo e em seguida clique em salvar. Escolha a
mesma pasta que voc tinha salvado o projeto para salvar este novo arquivo.
Agora ateno!! Escolha o nome do seu arquivo e logo em seguida dele coloque o .C
, igual mostra a imagem anterior. Agora no quadro tipo clique na seta de seleo e
escolha a opo c source files.... Feito isso, podemos salvar nosso arquivo, que agora
assumiu a extenso .c.
Obs: se houver algum erro nessa ultima etapa explicada, o cdigo que voc escrever
no vai ser compilado!

Programao de Microcontroladores PIC Mdulo I

23

Aps salvar corretamente seu arquivo .C , vamos aprender a incluir ele no projeto.
Seu MPLAB neste momento mostra apenas 3 janelas e em uma delas podemos ver uma
indicao de pastas. Clique com o boto direito do mouse em cima da pasta source files e
escolha a opo add files, voc vai buscar o arquivo .C que acabou de salvar e clique em
abrir.

Programao de Microcontroladores PIC Mdulo I

24


Programao de Microcontroladores PIC Mdulo I

25
Veja, na prxima imagem, que agora o seu arquivo .C esta adicionado ao projeto, e
agora seu projeto esta pronto para receber um cdigo.











Programao de Microcontroladores PIC Mdulo I

26
PROGRAMANDO O PIC EM LINGUAGEM C
O primeiro cdigo em C


O que achou do primeiro cdigo em C para PIC? Fcil, fcil !!
Podemos visualizar que um cdigo escrito em linguagem C para PIC no muito
diferente de um cdigo de linguagem C para qualquer outro sistema, porm existem alguns
detalhes (ferramentas) que so exclusivas para auxiliar a programao de um
microcontrolador PIC, neste exemplo temos a utilizao de diretivas e funes exclusivas
para utilizar com os PICs.
Conforme vamos avanando nos estudos dos perifricos de um PIC e sua utilizao,
veremos muitas funes e diretivas para tratar cada um deles, mas segue abaixo uma
explicao bsica de algumas diretivas e funes que com certeza sero muito utilizadas
para programar qualquer modelo de PIC e seus perifricos.
#include <16F877A.h>
O #include<> uma diretiva do compilador CCS, neste caso estamos determinando
que o compilador busque o arquivo 16F877A.h no seu banco de arquivos. O arquivo
16F877A.h um arquivo que contm definies sobre o PIC alvo, essas servem como base
para compilar o cdigo e normalmente est localizado na pasta de instalao do CCS.
#use delay (clock = 4000000)

Programao de Microcontroladores PIC Mdulo I

27
A diretiva #use determina que vamos utilizar uma funo do compilador. No nosso
caso usaremos a funo de delay, que uma funo pronta de retardo de tempo, entre
parentes estou atribuindo o valor de 4000000 para o clock, ou seja, estou avisando o
compilado que a base de tempo da funo delay vai ser na frequncia de 4mhz.
#fuses xt, nowdt, noprotect
Como o prprio nome sugere, esta uma diretiva do compilador para configurao
dos fusveis do PIC. Vale lembrar que os fusveis variam dependendo do modelo do PIC,
portanto sempre verifique o datasheet do PIC alvo.
Abaixo veremos uma explicao das funes de alguns fusveis do PIC 16F877A.
XT Fusvel que se refere ao tipo de oscilador que esta utilizando. Como vimos
anteriormente, o XT significa que usaremos oscilador externo do tipo cristal ou ressonador
que tenha frequncia de no mximo 4mhz.
NOWDT O watchdog timer uma poderosa ferramenta. um contador automtico
incrementado por meio de um oscilador prprio, independente do oscilador principal. Caso
o WDT estoure, um reset do sistema ir ocorrer imediatamente. A principal aplicao do
WDT a proteo de processos em casos crticos em que se deve evitar ao mximo a parada
ou travamento do programa em execuo.
NOPROTECT - Eventualmente interessante inibir que outros consigam o seu cdigo
gravado no PIC. Usando a diretiva PROTECT o programa do PIC somente poder ser
sobreposto ou apagado, mas no lido. No nosso caso ele o cdigo no ser protegido contra
leituras.
#Define
A diretiva DEFINE serve para definirmos nomes a algo, como no exemplo acima, foi
definido o nome LED para o pino B0 (Pin_B0).
Set_tris_X (0bxxxxxxxx);
Este comando prprio do compilador e tem a funo de facilitar a manipulao dos
TRIS de cada PORT alvo do PIC (portA, portB, portC, portD, portE), uma vez que o valor de
parmetro ser sempre um BYTE e cada bit representa um pino do PORT alvo, sendo que o
Bit=1 representa o pino configurado como entrada e o Bit=0 representa o pino configurado
como sada.
Output_high (pin_b0);
O comando output_high uma funo do compilador e faz exatamente o que o nome
sugere, ou seja, colocar o pino alvo em nvel lgico alto (5v).
Output_low (pin_b0);

Programao de Microcontroladores PIC Mdulo I

28
Este comando exatamente o inverso do comando anterior. O output_low coloca em
nvel lgico baixo (0v) o pino alvo.
Delay_ms (500);
Vimos anteriormente que o delay uma funo do compilador, que utilizada para
fazer retardo de tempo. Neste caso foi utilizado o delay_ms(), ou seja, temos uma funo
que causa um retardo de tempo, especificado entre parnteses (), em milissegundos.
Tambm temos o comando delay_us() que causa retardos em microssegundos.
Bom, agora que vimos qual a funo de cada linha desse programa...
O que esse cdigo faz?
Esse cdigo faz com que enquanto o pino B0 estiver em nvel lgico alto o pino B1 (led)
ficar ligando e desligando com intervalos de 0,5 segundos. Quando o pino B0 estiver em
nvel baixo, nada acontecer.
EXERCCIOS DE FIXAO
1. Elaborar um programa utilizando uma chave que:
- Com a chave acionada, acenda dois leds (D1 E D2) que fiquem piscando
alternadamente com intervalos de 300 ms;
- Com a chave desligada, acenda 4 leds (D3 D6) sequencialmente em loop infinito
(um led aceso por vez durante 200 ms);
Obs: siga o diagrama abaixo como auxilio, e insira o circuito do oscilador (4mhz) e
boto de reset.





Programao de Microcontroladores PIC Mdulo I

29
LEITURA DE TECLAS
Para realizar a leitura de uma tecla necessrio criar um circuito que realize a leitura
de um sinal eltrico.
Uma maneira de se obter este funcionamento com o uso de uma chave ligada ao
VCC e um PULL-DOWN ou uma chave ligada ao terra (GND) e um PULL-UP.

Apesar do funcionamento aparentemente simples, este tipo de circuito apresenta um
problema de oscilao do sinal no momento em que a tecla pressionada. Esta oscilao
conhecida como bouncing, que nada mais do que um exemplo prtico da 3 lei de
NEWTON (Se um corpo A exerce uma fora em um corpo B, o corpo B simultaneamente exerce
uma fora de mesma magnitude no corpo A, ambas as foras possuindo mesma direo, contudo
sentidos contrrios.), ou seja, como se soltarmos uma caneta em uma mesa, no primeiro contato a
caneta exerce uma fora na mesa e a mesa devolve a fora na caneta fazendo com que a
caneta quique e exera outra fora, s que menor magnitude, quando houver um novo
contato. Portanto o mesmo acontece com os dois metais da chave mecnica, causando
assim uma oscilao de liga e desliga muito rpida. Veja abaixo a oscilao do sinal no
momento do chaveamento:


Programao de Microcontroladores PIC Mdulo I

30
Estas oscilaes indevidas podem gerar acionamentos acidentais, causando mau
funcionamento do programa. Para evitar isso podemos utilizar tcnicas de debounce, por
hardware ou software.
DEBOUNCE POR HARDWARE:

No debouncing por hardware utilizado um circuito RC entre a chave mecnica e o
pino do PIC, fazendo com que, quando a tecla for pressionada, a tenso suba (no caso de
pull-down) ou caia (no caso de pull-up) de acordo com a constante do circuito RC.
DEBOUNCE POR SOFTWARE:
O debounce por software em geral utilizado em situaes onde se deseja aumentar a
robustez de uma entrada que j possua um debounce por hardware ou reduzir o custo da
placa utilizando apenas a soluo por software. A grande desvantagem deste tipo de sistema
inserir um atraso na deteco da informao.
Neste caso, vamos ler uma entrada, entrar em um lao de tempo e realizar uma leitura
inversa da anterior, se a o resultado for verdadeiro vamos abandonar o lao do contrario
continuamos at o fim do lao. Assim detectamos se aquela primeira leitura era apenas um
rudo ou se era o pressionamento da tecla. Veja, a seguir, o exemplo de cdigo:


Programao de Microcontroladores PIC Mdulo I

31
EXERCICIOS DE FIXAO
De acordo com os conhecimentos adquiridos nesse capitulo e com as explicaes do
professor, resolva os seguintes exerccios:
1. Desenvolva um cdigo que faa com que cada vez que o boto_1 for pressionado uma
varivel ser incrementada. Quando essa varivel tiver valor superior a 20 um led deve
ser aceso.
OBS: Faa primeiramente um cdigo sem utilizar a tcnica de deboucing e depois faa
um cdigo utilizando o deboucing. Realize testes e comente a diferencia.
2. Situao problema: Desenvolva um cdigo e o hardware para controlar uma linha de
separao logstica, como na imagem a seguir:

A esteira1 (E1) fica ligada aguardando que seja colocada uma caixa nela. Aps a caixa
ser colocada os sensores 1 e 2 (S1 e S2) vo identificar o tamanho da caixa para serem
separadas nas prximas esteiras. Esteira 2 fica com as caixas grandes e a esteira3 fica com as
caixas pequenas, sendo que aps a esteira 1 levar a caixa at o sensor 3 (S3) os pistes 1 e 2
(P1 e P2) vo ser responsveis pela separao das caixas. O sistema ainda faz a contagem de
quantas caixas de cada tipo ele separou.


Programao de Microcontroladores PIC Mdulo I

32
DISPLAY DE 7 SEGMENTOS
O display de sete segmentos um invlucro com sete leds com formato de segmento,
posicionados de modo a possibilitar a formao de nmeros decimais e algumas letras
utilizadas no cdigo hexadecimal. Vastamente utilizada para realizar uma interface entre
homem e maquina em que a maior necessidade mostrar nmeros.

Produtos da empresa full gauge
Os Displays de 7 segmentos podem ser fabricados de 2 formas diferentes. Na verdade,
a diferena em como os leds internos (que formam o display) so conectados. Assim,
temos dois tipos de displays de 7 segmentos, chamados de: CATODO COMUM e ANODO
COMUM.

O display do tipo ANODO COMUM, tem os terminais anodos de todos os segmentos
interligados internamente e para o display funcionar, este terminal (que passa a ser
chamado de comum, pois um ponto em comum entre todos os leds dos segmentos do
display), dever ser ligado em Vcc, enquanto que, para o acionamento, os demais segmentos
devero receber em seus terminais GND. Um display anodo comum. J o display ctodo
comum, o contrrio, ou seja, o terminal comum, dever ser ligado ao GND e para ligar o
segmento necessrio aplicar Vcc ao terminal que se pretende acionar. O que significa que
o ponto comum deve ser aterrado, e cada segmento do display deve receber um nvel lgico
alto para acender. Veja as imagens a seguir:

Programao de Microcontroladores PIC Mdulo I

33

O display de 7 segmentos, formado por sete leds, dispostos em forma de oito.
Quando quisermos, por exemplo, acender o nmero 0, ligaremos os leds correspondentes
ao digito 0. Neste caso, os segmentos a, b, c, d, e, f. Como pode ser observado na tabela
abaixo, de acordo com uma determinada sequncia de acionamentos nos pinos do display
catodo comum, possvel se obter qualquer valor numrico (de 0 9).

OBSERVAO IMPORTANTE:

Programao de Microcontroladores PIC Mdulo I

34
Como os segmentos so leds, precisamos limitar a corrente que ir passar por eles,
para isso, devemos utilizar um resistor em cada segmento.
A corrente utilizada, depende do brilho que queremos do display, normalmente
utilizamos resistores entre 220 e 560 ohms, para uma fonte de 5Volt, o que equivale a uma
corrente entre 9mA a 20mA.
No devemos omitir esses resistores ou usar valores de resistncia muito baixos, pois
estaremos reduzindo a vida til do display, inclusive podemos queimar o segmento e/ou o
PIC. Segue abaixo um exemplo de ligao do display catodo comum no PIC:

Pode-se notar que devemos saber exatamente a qual segmento se refere cada pino
para possibilitar a escrita de um determinado algarismo, o que pode ser incmodo, j que a
sada escrita na porta, no corresponde ao valor decimal escrito no display, lembrando que
os pinos so nomeados de a,b,c,d,e,f,g, de cima para baixo. Por exemplo:

Exercicio:
1. Crie um cdigo que efetue a leitura de 3 botes. Cada boto pressionado dever escrever
um valor no display de 7 segmentos, conforme abaixo:
- Boto 1 Escreve 1 no display;
- Boto 2 Escreve 2 no display;
- Boto 3 Escreve 3 no display;
- Boto 4 Escreve 4 no display;
- Boto 5 Escreve 5 no display;
- Boto 6 Escreve 6 no display;
- Boto 7 Escreve 7 no display;
- Boto 8 Escreve 8 no display;
- Boto 9 Escreve 9 no display;
2. Crie um cdigo que efetue uma contagem de 0 a 9.

Programao de Microcontroladores PIC Mdulo I

35
Multiplexao de display
Muitas aplicaes que utilizam displays de 7 segmentos, necessitam de vrios displays.
Isto implica um consumo grande de energia e, a principio, uma maior necessidade de pinos
do microcontrolador seria utilizada. Uma soluo adaptada e muito simples multiplexar os
displays.
Multiplexar significa utilizar um mesmo canal de comunicaes para transmitir
informaes de diversas fontes ao mesmo tempo.
No nosso caso, utilizaremos a tcnica de multiplexao para ativar um display de cada
vez, alternar o funcionamento dos displays.
Portanto, cada display ficar ligado por um espao de tempo e depois apagar, mas
isto feito a uma frequncia que a viso humana no consegue perceber, ou seja, se os
displays forem multiplexados com uma frequncia de 50 Hz ou maior, a viso humana ter a
impresso que todos os displays esto ligados, mas na realidade, quando um liga os outros
esto desligados.
Vejamos um exemplo de hardware para multiplexar displays:

Analisando o circuito, vemos que o primeiro segmento de cada display (a) est ligado
ao mesmo pino do PIC, assim como todos os outros segmentos dos displays, logo se
enviarmos um sinal nvel alto do PIC para o segmento de um display enviaremos para o
outro tambm, no entanto, somente ascender o segmento do display que estiver com seu
CATODO ligado ao negativo (GND), no circuito interrompemos o CATODO e o GND com um
transistor, ou seja, temos duas chaves eletrnicas para controlar qual display vai ligar e
essas chaves podem ser acionadas pelo PIC.
Sendo assim, para visualizar o nmero 10 nos displays basta enviar o valor

Programao de Microcontroladores PIC Mdulo I

36
0b00000110 para o portb, em seguida saturar o transistor 1 e esperar um tempinho, logo em
seguida cortamos o transistor 1, enviamos o valor 0b00111111 para o portb e saturamos o
transistor 2, esperamos um tempinho e cotamos o transistor 2. Deve ser feito esse processo
mais de 50 vez por segundo (50Hz) para que o olho humano tenha a sensao de que os
displays nunca apaguem.
Em cdigo, ficar assim:

Reparem que no cdigo eu preciso enviar os dgitos separadamente, pois os dgitos so
ligados separadamente, mas se por acaso eu desejar visualizar nos displays o valor de uma
varivel cujo valor 35 e enviar para o display ? Como deveria ser ? Temos que enviar
primeiro o 3 e depois o 5 para os displays... Mas como fazer isso de forma otimizada ?
Primeiramente temos que pegar o valor da varivel e separa-la entre valor de dezena e
valor de unidade... Nmeros inteiros em C sero sempre inteiros, ou seja, ao dividirmos o
nmero 35 por 10 (35/10) temos como resultado 3,5, porm o valor til ser o 3 apenas.
Logo conseguimos separar o valor de dezena de nossa varivel.
Portanto, basta uma funo matemtica para que possamos separar os valores de
dezena e unidade de um valor inteiro. Veja o cdigo exemplo:

Agora que conseguimos desmembrar o valor da varivel vamos partir para o prximo
passo da otimizao do nosso cdigo. Utilizando os conceitos de MATRIZ da linguagem C,
faremos uma tabela de uma linha e 10 colunas onde cada posio guardar o valor para
escrever um nmero no display, ou seja, na posio 0 (zero) vamos guardar o valor
0b00111111, na posio 1 guardamos o valor 0b00000110, e assim at a posio 9.
Logo temos uma Matriz que fornece os valores em byte para ligar os dgitos nos

Programao de Microcontroladores PIC Mdulo I

37
displays, veja a matriz:

Com esses trs conceitos juntos podemos desenvolver uma funo bem otimizada
para se escrever em displays de 7 segmentos multiplexando eles.
SITUAO PROBLEMA
Faa um cdigo para controlar o seguinte um estacionamento, como na imagem a
seguir:

Os sensores 1 e 2 (S1 e S2) fazem funcionar as respectivas cancelas 1 e 2 (C1 e C2).
Lembrando que a cancela deve ficar aberta at que o carro passe por ela, ou seja, fica ligada
durante certo tempo para oferecer a passagem para o carro. Este estacionamento tem a
funo de informar a quantidade de vagas disponveis para quem esta fora do mesmo, faa
uma contagem de entradas e sadas para fornecer o nmero de vagas Se no houver mais
vagas a cancela de entrada no deve funcionar mesmo que o sensor 1 acione. A capacidade
total do estacionamento de 27 vagas.

Programao de Microcontroladores PIC Mdulo I

38
DISPLAY LCD ALFANUMRICO 16X2
O display de LCD uma interface de sada muito utilizada em sistemas micro-
controlados. Eles podem ser GRFICOS ou ALFANUMRICOS, sendo que os displays grficos
so encontrados nos tamanhos 122x32, 128x64, 240x64 e 240x128 pixel, j os alfanumricos
tem opes de 8x1, 16x1, 16x2, 20x2, 20x4, 24x1, 24x2, 32x1 at 32x4 e 40x1 at 40x4
caracteres, sendo que sua especificao dada pelo nmero de caracteres por linha e a
quantidade de linhas.

O display alfanumrico, basicamente, tem cada clula de caractere composto por 8
pixels na horizontal e 5 pixel na vertical, como mostra a figura a seguir:

Reparem na figura acima, que os dois caracteres foram feitos utilizando 5x7 pixels uma
vez que a 8 linha reservada para o cursor. Tambm existe no mercado displays com
clulas de caracteres de 5x11 pixels, sendo que nesse modelo o tamanho do caractere de
5x10.
Cada caractere disponvel no display possui um valor em BYTE de acordo com a tabela
ASCII. A maior parte dos displays LCD do mercado possui uma DATA-BASE de 187 caracteres
tendo tambm 16 locais vazios para criao de caractere especial (pessoal), porem existem
modelos mais recentes que possuem uma DATA-BASE de 240 caracteres possuindo tambm
16 locais vazios para criao de caractere especial. Segue, abaixo, a primeira tabela citada,
que tem o nome de ROM CODE 001:

Programao de Microcontroladores PIC Mdulo I

39

Em nosso caso vamos estudar o modulo de LCD 16x2 caracteres. Estes Displays
possuem controlador prprio, o que permite uma interligao com outras placas por meio

Programao de Microcontroladores PIC Mdulo I

40
do seu barramento de dado e controle, alimentao e backlight (iluminao de fundo).
Vejamos a seguir a descrio dos pinos:
Pino Nome Funo
1 VSS / GND Alimentao (0v)
2 VDD / VCC Alimentao (5v / 3,3v)
3 VEE / VO Ajuste de contraste (> brilho=5v) (< Brilho=0v)
4 RS Seleo: 1 = CARACTERE; 0 = COMANDO;
5 R/W Seleo: 1 = LEITURA; 0 = ESCRITA;
6 E / EN (ENABLE) Clock: 1 -> 0 HABILITA (borda de descida)
7 D0
Barramento de dados
D0 Bit menos significativo (LSB)
D7 Bit mais significativo (MSB)
8 D1
9 D2
10 D3
11 D4
12 D5
13 D6
14 D7
15 ANODO LED do Backlight (quando existir)
16 CATODO LED do Backlight (quando existir)
Vale lembrar que independente do nmero de caracteres que o display alfanumrico
possuir a sua pinagem sempre ser a mesma, tendo uma variante apenas quando possui ou
no backlight, onde os pinos 15 e 16 no tero funo caso no tenha o backlight. Caso
possua, o mesmo deve possuir na sua ligao um resistor para limitar a corrente, do
contrario o mesmo queimar.
Os mdulos de LCD mais comum trabalham com tenso de 5V, porm existem
mdulos, mais especficos, que operam na tenso de 3,3V. Deve-se sempre consulta o
datasheet do mesmo.
O contraste dos caracteres feito por meio do pino 3 (Vo/VEE), sendo que o maior
nvel de contraste se da quando o pino tem 5V nele, assim, consequentemente o menos
nvel de contraste se da quando temos 0V no pino. Geralmente utilizado um trimpot ligado
ao 5V e 0V com a sua derivao indo ao VEE, possibilitando uma regulagem do contraste.
O restante dos pinos (RS, R/W, E, D0 D7) podem ser ligados diretamente ao PIC, sem
o auxilio de resistores de pull-up/pull-down ou limitadores de corrente. Apensar do pino 5
(R/W) nos dar a opo da funo de leitura, a mesma raramente utilizada, tornando mais
conveniente o aterramento do pino.

Programao de Microcontroladores PIC Mdulo I

41
Temos, a seguir, um exemplo de ligao do display com o PIC 16F877A:

O funcionamento do display basicamente controlado pelo pino 6 (E), j que ele que
decide se os valores que esto no barramento de dado sero utilizados pelo seu controlador
interno. O pino 5 (R/W) indica para o processador se vamos escrever (enviar um dado) no
mdulo ou ler (receber um dado) o mesmo. J o pino 4 (RS) indica se, no caso de uma
escrita, queremos enviar um caractere a ser fixado no visor ou um comando de configurao
de modo de trabalho do display.
Portanto, por exemplo, se quisermos enviar um caractere para ser fixado no visor do
display temos que fazer o seguinte: Colocar o pino RS=1, o R/W=0, enviar o byte referente
ao caractere (de acordo com a tabela ASCII) para o barramento de dado e dar um pulso no
ENABLE (E=1; espera 1us; E=0;). Para enviar um comando, basta colocar o pino RS=0 e
repetir o restante do processo.
Todos os mdulos de LCD devem ser inicializados antes de propriamente utiliza-los
no sistema, ou seja, toda vez em que o mdulo energizado ele no sabe como vai
trabalhar, por isso devemos enviar uma serie de comando para configurar o modo de
operao do mesmo.
Vale salientar que todo tipo de instruo dada para o mdulo LCD tem um tempo
padro para ser executada, at porque, quando enviamos uma instruo para ele, na
verdade estamos enviando uma tarefa para outro controlador executar.
A tabela, abaixo, mostra as possveis configuraes do modulo e o tempo necessrio

Programao de Microcontroladores PIC Mdulo I

42
para a mesma ser executada.

Reparem que a grande maioria dos comandos necessita de um tempo de 40us (micro-
segundos) para serem executadas, porm existe duas funes, limpar LCD e home cursor,
cujo o tempo de ambas de 1,6 ms (mili-segundos) para serem executadas. No entanto
esses valores podem varia de acordo com o fabricante do modulo, chegando a tempos de
ate 3,6 ms para execuo de tarefa.

Programao de Microcontroladores PIC Mdulo I

43
Para iniciarmos cdigo da biblioteca .C do display LCD, vamos tomar como base de
hardware o exemplo da figura XXXX e realizar algumas definies de pinos:

O segundo passo criar uma funo para a rotina de enviar um comando para o LCD,
pois como ela pode ser muito utilizada durante qualquer programa que utilize um display
LCD. Vale lembrar que para enviar um comando devemos colocar o RS=0, enviar o BYTE no
barramento de dados e dar um pulso no ENABLE para o modulo comear a executar a tarefa
e aguardar o tempo necessrio para o mdulo executa-la, veja a seguir:

Agora vamos desenvolver uma funo para inicializar nosso display LCD.
Primeiramente devemos zerar todo o barramento de dados e aguardar um tempo para
estabiliza-lo. Os mdulos de LCD, na grande maioria, necessita que se envie 3 vezes o
comando 0x30 tendo um tempo de 5ms entre cada envio, esses comando vo propriamente
iniciar o mdulo para que s assim receber instrues de configurao. A seguir, iremos
comear a enviar comandos de configurao de trabalho, as possveis configuraes esto
na tabela XXX. Nessa parte, primeiro devemos fixar o modo de trabalho, ou seja, em
comunicao com barramento de 8 ou 4 vias, quantidade de linhas do display e formatao
do caractere em sua clula, em nosso caso utilizamos 8 vias, 2 linhas e caractere 5x7. Veja
como ficou o cdigo:

Programao de Microcontroladores PIC Mdulo I

44

Por fim, vamos repetir mais uma vez o segundo processo, e criar mais uma funo que
muito utilizada, mas dessa vez a funo de enviar um caractere para o display LCD. As
principais alteraes sero em relao ao estado do RS, que agora deve estar em nvel alto, e
o tipo de dado que a funo recebe como parmetro, dados do tipo CHAR, acompanhe:

Portanto, essas trs funes formam o bsico da biblioteca para o LCD, porm

Programao de Microcontroladores PIC Mdulo I

45
podemos ainda completar com algumas funes que, apesar de simples, tambm so muito
utilizadas. So elas: Limpa_LCD, Linha_1 e Linha_2, veja...



Pronto, com essas funes podemos construir uma biblioteca .C completa para
utilizao do mdulo LCD e pronta para ser utilizada em um cdigo para enviar um caractere
por vez. Mas utilizando a funo printf, conseguimos enviar caracteres serialmente para a
sada padro, ou para uma funo, como ser o nosso caso. Exemplo:

Programao de Microcontroladores PIC Mdulo I

46

Temos, a seguir, um exemplo completo de como utilizar a biblioteca:

EXERCCIOS DE FIXAO
1. Desenvolver um sistema de navegao utilizando o display LCD 16x2 e botes.
Siga as instrues a seguir para realizar o sistema:
1 PASSO: Ao ligar o sistema, surge a mensagem INICIANDO SISTEMA por 3 segundos;
Logo aps, aparecer mensagem SELECIONE SUA BEBIDA;
2 PASSO: Ao clicar no boto SELEO (Boto 1), surge um menu com o nome do
primeiro produto e tipo de bebida.
EX. REFRIGERANTE: COCA-COLA;
Refrigerantes disponveis: COCA-COLA, FANTA LARANJA, FANTA UVA, KUAIT, SPRIT;
3 PASSO: Ao clicar no boto CONFIRMAR (Boto 2), surge a mensagem: RETIRE SEU
PORDUTO;
Aps 3 segundos, o sistema vai Reiniciar, ou seja, vota na mensagem SELECIONE SUA
BEBIDA, possibilitando um novo processo! Nenhum boto deve funcionar durante
esse processo;
4 PASSO: Enquanto estiver no 2 PASSO, se o boto CANCELAR (Boto 3) for
pressionado, surge a mensagem: COMPRA CANCELADA;
Aps 3 segundos, o sistema vai Reiniciar, ou seja, vota na mensagem SELECIONE SUA

Programao de Microcontroladores PIC Mdulo I

47
BEBIDA, possibilitando um novo processo! Nenhum boto deve funcionar durante
esse processo;
5 PASSO: Enquanto estiver no 2 PASSO, se no houver nenhum pressionamento de boto
durante 20 segundos, o sistema vai Reiniciar, ou seja, vota na mensagem SELECIONE SUA
BEBIDA, possibilitando um novo processo! Nenhum boto deve funcionar durante esse
processo;





















Programao de Microcontroladores PIC Mdulo I

48
INTERRUPO
CONCEITO:
Interrupo quer dizer que voc ir parar uma situao que ocorre normalmente para
realizar outra de maior urgncia e assim que terminar esta ltima ao retorna para o que
estava fazendo anteriormente.
As interrupes so um mecanismo que o microcontrolador possui e que o faz
responder a alguns acontecimentos no momento em que eles ocorrem, qualquer que seja a
tarefa que o microcontrolador esteja executando no momento.
Geralmente, cada interrupo muda direo de execuo do programa, suspendendo
a sua execuo, enquanto o microcontrolador executa um subprograma que a rotina de
atendimento de interrupo.
Depois que este subprograma tiver sido executado, o microcontrolador continua com
o programa principal, a partir do local em que o tinha abandonado.

No PIC o vetor de interrupo fixo (endereo 0x0004 na memria de programa).
Existem vrios tipos de interrupes (dependendo do modelo do PIC utilizado), as
principais so: interrupo externa, mudana de estado, timer, EEPROM, A/D, CCP, USART.
O PIC 16F877A possui 15 tipos de interrupo, so elas:
Estouro do Timer 0;
Estouro do Timer 1;
Estouro do Timer 2;

Programao de Microcontroladores PIC Mdulo I

49
Mudana de estado no PORTB;
Interrupo externa;
Escrita na EEPROM;
CCP1;
CCP2;
Recepo na USART;
Transmisso na USART;
Porta Serial (SPI e I2C);
Porta paralela;
Converso AD;
Coliso de dados;
Comparador analgico;
Desde arquiteturas passadas da MICROCHIP, quem controla as interrupes um
registrador chamado INTCON.
Como atualmente existem muitos tipos de interrupes elas foram divididas. As trs
principais interrupes, controladas pelo INTCON, so, TMR0, mudana no PORTB e INTEXT.
Optou-se por criar as chamadas interrupes perifricas, que so acessadas por meio de
registradores independentes, mas esto subordinadas ao INTCON.
Assim, utilizamos 3 registradores para o controle das interrupes, so eles:
INTCON: para controle e sinalizao das interrupes do timer0, mudana no PORTB,
interrupo externa e interrupo de perifricos.
PIR1: para sinalizao de interrupes perifricas.
PIE1: para controle das interrupes perifricas.

O REGISTRADOR INTCON
Podemos dividir o registrador INTCON em trs blocos bsico:
Controle geral de interrupes (GIE);
Controles individuais de interrupes (PEIE, TMR0IE, INTE, RBIE);
Sinalizadores da ocorrncia da interrupo (TMR0IF, INTF e RBIF);
Segue, abaixo, uma explicao sobre a funo de cada bit desse registrador.
GIE PEIE TMR0IE INTE RBIE TMR0IF INTF RBIF
Bit 7 Endereo 0x0B, 0x8B, 0x10B, 0x18B Bit 0

Programao de Microcontroladores PIC Mdulo I

50
GIE Global interrupts enable / habilitao global de interrupes.
O bit GIE o controle geral de interrupes no PIC. Ele funciona como uma chave
principal de controle habilitando ou no a ao das interrupes.
0 Se estiver desligado, no poder ocorrer nenhuma interrupo (mesmo que
alguma interrupo individual esteja habilitada).
1 Se estiver ligado poder ocorrer interrupes (ao menos que alguma das
interrupes individuais esteja habilitada, claro!)
PEIE Habilitao das interrupes perifricas.
0 Interrupes perifricas desligadas.
1 Interrupes perifricas habilitadas.
T0IE Habilitao de interrupo de transbordo (estouro) do timer 0.
0 Interrupo desligada.
1 Interrupo habilitada.
INTE Habilitao de interrupo externa.
0 Interrupo desligada.
1 Interrupo habilitada.
RBIE Habilitao de interrupo por mudana de estado (nvel lgico) do POTB (pinos
rb4 a rb7).
0 Interrupo desligada.
1 Interrupo habilitada.
T0IF Sinalizador de transbordamento do timer 0.
0 No houve transbordamento (a contagem dele no ultrapassou 255).
1 Houve transbordamento (a contagem dele superou 255) e se o GIE estiver ligado,
assim como o T0IF, ser gerada uma interrupo.
INTF Sinalizador de interrupo externa (RB0/INT).
0 No houve interrupo externa no pino rb0/int.
1 Houve uma interrupo externa pelo pino RB0/INT (dependendo da borda
selecionada pelo bit INTEDG do registrador OPTION). Se o GIE estiver habilitado, assim
como o INTE, ser gerada uma interrupo neste caso.
RBIF Sinalizador de mudana de estado nos pinos (rb4 a rb7).
0 No houve alterao nos nveis lgicos dos pinos rb4 a rb7.
1 Houve alterao em algum dos pinos rb4 a rb7. Se o GIE estiver ligado e o RBIE
tambm, ser gerada uma interrupo por mudana de estado em algum desses pinos.


Programao de Microcontroladores PIC Mdulo I

51
OS REGISTRADORES PIE1 E PIE2
Como j foi dito antes, o registrador PIE1 e PIE2 possuem a funo de habilitao /
desabilitao das chamadas interrupes perifricas.
Segue abaixo uma explicao da funo de cada bit desses registradores:
- PIE1
PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
Bit 7 Endereo 0x8C Bit 0
PSPIE Habilitao de interrupo de escrita/leitura da porta paralela.
0 Interrupo desabilitada.
1 Interrupo habilitada.
ADIE Habilitao de interrupo de converso AD finalizada.
0 Interrupo desabilitada.
1 Interrupo habilitada.
RCIE Habilitao de interrupo de recepo de dados na USART.
0 interrupo desabilitada.
1 Interrupo habilitada.
TXIE Habilitao de interrupo de transmisso de dados na USART.
0 Interrupo desabilitada.
1 Interrupo habilitada.
SSPIE Habilitao de interrupo da porta serial (SPI e I2C).
0 Interrupo desabilitada.
1 Interrupo habilitada.
CCP1IE Habilitao de interrupo do mdulo CCP1.
0 Interrupo desabilitada.
1 Interrupo habilitada.
TMR2IE Habilitao de interrupo do timer2.
0 Interrupo desabilitada.
1 Interrupo habilitada.
TMR1IE Habilitao de interrupo do timer1.
0 Interrupo desabilitada.
1 Interrupo habilitada.

Programao de Microcontroladores PIC Mdulo I

52
- PIE2
- CMIE - EEIE BCLIE - - CCP2IE
Bit 7 Endereo 0x8D Bit 0
CMIE Habilitao de interrupo de mudana de estado dos comparadores
analgicos.
0 Interrupo desabilitada.
1 Interrupo habilitada.
EEIE Habilitao de interrupo por trmino de escrita em EEPROM interna.
0 Interrupo desabilitada.
1 Interrupo habilitada.
BCLIE Habilitao de interrupo por coliso de dados.
0 Interrupo desabilitada.
1 Interrupo habilitada.
CCP2IE Habilitao de interrupo do mdulo CCP2.
0 Interrupo desabilitada.
1 Interrupo habilitada.

OS REGISTRADORES PIR1 E PIR2
O registradores PIR1 e PIR2 localizado no banco de memria 0, abriga os sinalizadores
de interrupes perifricas. Isto significa que cada vez que um dos eventos de interrupo
ocorrer, o respectivo sinalizador ser setado.
Abaixo veremos o que cada bit desse registrador sinaliza.
- PIR1
PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
Bit 7 Endereo 0x0C Bit 0
PSPIF Sinalizador de leitura/escrita na porta paralela.
0 No houve leitura/escrita.
1 Operao de leitura/escrita realizada.
ADIF Sinalizador de converso A/D.
0 No houve converso A/D.
1 Converso A/D finalizada.

Programao de Microcontroladores PIC Mdulo I

53
RCIF Sinalizador de recepo de caractere na USART.
0 No houve recepo de novos caracteres.
1 Um novo caractere foi recebido.
TXIF Sinalizador de transmisso de caractere na USART.
0 No houve transmisso na USART.
1 Houve transmisso.
SSPIF Sinalizador da porta serial (SPI e IC).
SPI
0 No ocorreu transmisso/recepo.
1 Ocorreu transmisso/recepo.
IC Slave
0 No ocorreu transmisso/recepo.
1 Ocorreu transmisso/recepo.
IC Master
0 No ocorreram tarefas.
1 Ocorreu transmisso/recepo.
1 A condio INICIAR foi concluda pelo mdulo SSP.
1 A condio PARAR foi concluda pelo mdulo SSP.
1 A condio REINICIAR foi concluda pelo mdulo SSP.
1 A condio RECONHECER foi concluda pelo mdulo SSP.
CCP1IF Sinalizador de comparao/captura no mdulo CCP1.
0 No houve comparao/captura vlida.
1 Houve comparao/captura no mdulo CCP1.
TMR2IF Sinalizador de transbordo do timer 2.
0 No houve transbordo de contagem no timer 2.
1 Houve transbordo de contagem no timer 2.
TMR1IF Sinalizador de transbordo do timer 1.
0 No houve transbordo de contagem no timer 1.
1 Houve transbordo de contagem no timer 1.
- PIR2
- CMIF - EEIF BCLIF - - CCP2IF
Bit 7 Endereo 0x0D Bit 0
CMIF Sinalizador de comparador.
0 A comparao ainda no terminou ou no foi iniciada.

Programao de Microcontroladores PIC Mdulo I

54
1 A comparao terminou.
EEIF Sinalizador de trmino de escrita em EEPROM.
0 A escrita ainda no terminou ou no foi iniciada.
1 A escrita terminou.
BCLIF Sinalizador de interrupo por coliso de dados.
0 No ocorreu coliso.
1 Coliso no DATABUS do mdulo SSP quando configurado para IC mster.
CCP2IF Sinalizador de comparao/captura no mdulo CCP2.
0 No houve comparao/captura vlida.
1 Houve comparao/captura no mdulo CCP2.

INTERRUPO EXTERNA
O primeiro tipo de interrupo que iremos estudar a interrupo externa!
Certamente uma das mais usuais, tanto que em PIC mais avanados, como o 18f452,
temos 3 pinos de interrupo externa.
A interrupo externa controlada pelo registrador INTCON, porm, existem funes
onde o compilador j configura o registrador para uso, sem a necessidade de voc acess-lo
e modificar seus bits.
A interrupo externa ativada quando um pulso enviado a um pino determinado do
microcontrolador. Este pulso geralmente gerado a partir de um boto que ligado a uma
fonte de tenso (5v) e ligado ao pino do PIC, como mostra a figura.

Note que quando se trata de um boto temos duas possibilidades de envio do pulso,
uma quando pressionamos o boto e outra quando o soltamos. Chamamos estas situaes

Programao de Microcontroladores PIC Mdulo I

55
de borda de subida e borda de descida respectivamente e podemos escolher em qual
momento a interrupo externa ser ativada. A figura abaixo mostra como o pulso
interpretado:

Vamos ao cdigo!
A primeira coisa que devemos fazer, quando trabalhamos com interrupes, ligar a
chave geral, o bit GIE do registrador INTCON.
Isso possvel de ser feito de 2 formas. Uma acessando o registrador e modificando
o bit, e a outra, mais simples, utilizando uma funo do compilador que j modifica o bit
automaticamente. Neste momento, iremos utilizar segunda opo.
Dentro de sua funo principal, voc dever habilitar as interrupes, setar o bit GIE,
com a seguinte diretiva:

A prxima coisa a se fazer selecionar o tipo de interrupo que ser habilitada
(continuaremos utilizando funes do prprio compilador).

J que selecionamos a interrupo externa, precisamos informar se a mesma ocorrer
na borda de subida ou descida da seguinte forma:

Pronto, tudo configurado!!!
Agora chegou a hora de definir o que voc quer que o seu programa realize quando
ocorrer a interrupo. Lembrando que quando ocorre uma interrupo a CPU deixar de
fazer as tarefas que estava fazendo e passara a executar a funo da interrupo, quando ela
terminar, voltar a realizar o trabalho que fazia anteriomente.
Para isso, preciso criar uma funo fora do main, utilizando a diretiva #INT_EXT, que

Programao de Microcontroladores PIC Mdulo I

56
sinaliza qual funo vai ser executada no momento da interrupo. Veja a seguir:


SITUAO PROBLEMA
Com os conhecimentos adquiridos nesse capitulo e nas explicaes do professor,
projete:
Um alarme que ser armado/desarmado por um boto (chave) e manter dois leds
indicativos, um verde (alarme armado) e outro vermelho (alarme desarmado). O sensor de
presena (boto) estar conectado ao pino de interrupo externa e caso este seja
disparado uma sirene (buzzer ou led) ir disparar, sendo desarmado apenas se a chave de
arme/desarme for acionada. Obs: O alarme s poder ser disparado se estiver no estado
armado.








Programao de Microcontroladores PIC Mdulo I

57
TIMERS
O TIMER 0
Para trabalhar com o TIMER 0 no PIC 16F877A devemos conhecer 3 registradores SFRs
que fazem seu controle, so eles:
OPTION_REG
INTCON
TMR0
Por serem registradores SFR's, ou seja, registradores de funes especiais, estes
podem controlar os perifricos internos do PIC e encontram-se mapeados em uma rea da
memria RAM. Para acess-los, precisamos de seu endereo de localizao na memria.
Esse endereo facilmente encontrado nos datasheets dos PICs, basta procurarmos
no captulo "memory organization ou at mesmo na prpria IDE, abrindo o MPLAB, aps
criar um projeto (preferencialmente com o assistente project wizard), basta clicar na aba
"view" e selecionar "special function registers", uma nova janela se abrir e nela poder
visualizar, na coluna a esquerda, chamada address, o endereo de localizao de cada
registrador SFR do PIC selecionado em seu projeto.
J sabendo como encontr-los, basta agora saber acess-los, e isso simples. Usando a
diretiva #byte e #bit ou at mesmo funes do prprio compilador como, por exemplo:
SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_256);
As duas formas de acesso sero detalhadas adiante, no momento em que se exigir
essa ao.
Embora sucintamente estudados, j sabemos quem so, onde esto e quais meios
utilizados para acessar esses registradores, abaixo uma descrio detalhada sobre cada um
deles:
REGISTRADOR TMR0
TMR0 - o registrador que armazena o valor do TIMER0. Este valor varia entre 0 e 255,
pois um registrador de 8 bits
Endereo Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor no reset
0x01 Registrador de acesso ao contedo do timer 0 X X X X X X X X
O programador tem a opo de setar um valor inicial no TMR0, para que desta forma,
o seu timer j inicie com algum valor (diferente de 0).

Programao de Microcontroladores PIC Mdulo I

58
Por exemplo, se voc quer contar at 255, dever iniciar o timer com 0 e aguardar a
contagem atingir seu limite (que de 255).
Agora, se voc pretende fazer uma contagem de 10, no poder comear com 0 e ir
at 10, por que o timer precisa estourar, ou seja, ele precisa passar pela transio de 255
para 0 e neste momento que ele seta um FLAG informando que terminou a contagem
Desta forma, se sabemos que ele vai at 255 e queremos que conte apenas 10
incrementos at seu estouro, basta fazer uma subtrao simples, 255 - 10 = 245, ou seja,
setamos nosso timer com 245 para que ele conte at 255 e estoure.
Quando ele reiniciar sua contagem no ir comear do zero e sim do valor setado, ou
seja, do valor 245.
Desta maneira, a transio do estouro ser do valor 255 para o 245 e no do 255 para
o zero, pois fora setado um valor no seu timer 0.
Em resumo, neste registrador que se executa essa contagem, do valor setado, seja
este 0 ou no at o valor de estouro que 255.
O REGISTRADOR INTCON
INTCON - Esse registrador, tambm de 8 bits, contm um Bit chamado TMR0IF, ser
ele que ir ser setado quando ocorrer o estouro do TIMER0.
Endereo Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor no reset
0x01 GIE PEIE TMR0IE INTE RBIE TMR0IF INTF RBIF 0 0 0 0 0 0 0 X
Habilitao:
PEIE = Perifricas / TMR0IE = Timer 0 / INTE = Interrupo externa / RBIE = Mudana
de estado no PORTB.
Sinalizao:
TMR0IF = Estouro timer 0 / INTF = Interrupo externa / RBIF = Mudana de estados.
Como foi dito anteriormente, o Bit2 do INTCON se refere ao TMR0IF que tem a funo
de sinalizar se houve ou no o estouro do timer0.
Por exemplo, se nosso timer estiver setado com 155, o timer ir contar de 155 at 255,
ou seja, contar 100 incrementos, (255 - 155 = 100), a cada 100 pulsos o t0if ser setado e
desta forma voc ser avisado de que sua contagem de tempo fora executada.
Observao importante:

Programao de Microcontroladores PIC Mdulo I

59
responsabilidade do programador "limpar" o TMR0IF a cada estouro, pois o PIC no
far isso para voc. Ou seja, aps o TIMER0 realizar sua contagem e estourar, o T0IF setado
(para 1) e continuar valendo 1 at que voc o faa voltar para zero, caso contrrio, voc
no ser mais avisado quando ocorrer um estouro de timer pois o TMR0IF no ir mudar e
desta forma, no iro haver sinalizaes (seria como se, a cada incremento, ocorresse um
novo estouro).
Para compreender essa situao, imagine que o TMR0IF seja um homenzinho com
uma bandeira na mo, responsvel por erguer a bandeira toda vez que nosso timer estourar.
Desta forma ficou fcil, seu cdigo pode ir executando outras tarefas a vontade que o T0IF,
ou o "homenzinho com a bandeira na mo, estar de olho na contagem do timer para a
gente.
Assim, quando o timer estourar o homenzinho levanta a bandeira sacudindo-a para
chamar a ateno de nosso processador, que por sua vez pode perceber que ocorreu um
estouro do timer e toma as decises desenvolvidas no cdigo pelo programador.
E imagine agora se o homenzinho no baixar a bandeira e ficar de olho novamente na
contagem do timer para levant-la assim que ocorrer novo estouro. O que o homenzinho
faria?
Ele poderia levantar uma 2 bandeira para sinalizar que houve o 2 estouro do
TIMER0... Mas o seu registrador INTCON s tem o TMR0IF para sinalizar esse estouro. Ento
sabe o que acontecer? Seu cdigo no mais ser avisado do verdadeiro estouro do timer e
desta forma passar a ignorar tal evento.
Portanto, para que isso no ocorra, assim que o homenzinho levantar a bandeira e seu
cdigo perceber que houve um estouro e ele precisa executar uma tarefa, pea, antes de
tudo, para o homenzinho abaixar a bandeira para que possa voltar a observar a contagem do
timer e nos avisar assim que ocorrer novo estouro...
Concluso, assim que o bit do TMR0IF for setado para 1 sabemos que nossa
contagem foi concluda e ocorreu um estouro do nosso TIMER0, mas para que essa situao
possa se repetir e seu processador ser informado novamente dos outros estouros, ser
preciso que, logo aps que o TMR0IF for setado para 1 voc o desligue novamente,
mantendo-o em 0 para realizar novos avisos de estouro.
Lembre-se, TMR0IF um bit do registrador que sinaliza o estouro do TIMER0. Pode ser
feita a analogia com o homenzinho com a bandeira e por fim, esse ou qualquer outro bit
de sinalizao so tecnicamente chamados de: FLAGs.


Programao de Microcontroladores PIC Mdulo I

60
O REGISTRADOR OPTION_REG
OPTION_REG - Tambm um registrador de 8 bits, porm este pouco mais complexo
que os outros 2 apresentados anteriormente.
De seus 8 bits, 6 deles so para configurao do timer. So eles, os bits 0, 1, 2, 3, 4 e 5.
Cada um destes bits recebe um nome, como mostro abaixo:
BIT 0 = PS0 (primeiro bit de configurao do prescaler)
BIT 1 = PS1 (segundo bit de configurao do prescaler)
BIT 2 = PS2 (terceiro e ltimo bit de configurao do prescaler)
BIT 3 = PSA (bit de seleo do prescaler para timer0 ou wdt)
BIT 4 = T0SE (bit de seleo de nvel de borda por clock externo)
BIT 5 = T0CS (timer_0_clock_source, bit de seleo de clock. Ir determinar o modo de
funcionamento do timer (como temporizador ou contador).
Endereo Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor no reset
0x01 RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1 1 1 1 1 1 1 1
PS0, PS1 e PS2 - Configurao do prescaler.
PSA - Seleciona se o prescaler est conectado ao watchdog ou ao timer0.
INTEDG - Seleo da ativao da borda (subida ou descida) na interrupo externa (0
descida, 1 subida).
RBPU / - Ativao dos resistores de PULL-UPS internos no PORTB (0 = resistores
ativados apenas os pinos definidos como entrada; 1 = resistores de PULL-UP
desativados).
PSA - Informa ao PIC se utilizaremos o prescaler para o timer ou para o WDT.
Se PSA = 0 - est ligando o prescaler ao TIMER0.
Se PSA = 1 - est ligando o prescaler ao WDT.
Agora chegou a vez de falarmos do bit 4, o t0se.
T0SE - Determina se o incremento do pulso ocorrer na transio da subida ou de
descida. Normalmente configurado quando se utiliza o timer como contador e no
como temporizador como vimos at ento.
O timer pode ser um temporizador quando conta tempo a partir de uma base de
tempo bem definida, gerada por um cristal oscilador externo, por exemplo.
O timer tambm pode ser um contador, que conta pulsos externos a partir do pino
RA4/T0CKL.

Programao de Microcontroladores PIC Mdulo I

61
0 - O TIMER0 ser incrementado na borda de subida do sinal externo aplicado ao pino
RA4/T0CKL.
1 - O TIMER0 ser incrementado na borda de descida do sinal externo aplicado ao pino
RA4/T0CKL.
Para concluirmos a aula de TIMER0 e seus registradores de controle, trataremos agora
do bit5, o T0CS, chamado de timer0 clock source.
T0SC - Esse bit seleciona a entrada do clock que pode ser externo (vindo do pino
ra4/t0ckl), para o timer funcionar como contador ou interno (utilizando a frequncia
interna do PIC FOSC/4), para funcionar como temporizador.
0 - O clock vir do clock interno (FOSC/4) fazendo o timer 0 funcionar como um
temporizador.
1 - O clock vir do pino RA4/T0CKL, contando seus pulsos o timer 0 passar a funcionar
como um contador de eventos.

PRESCALER NO TIMER 0
Abaixo descrevemos um pouco mais sobre a funo e utilizao do prescaler na
contagem do TIMER0.
PS0, PS1 e PS2: juntos podem armazenar 8 valores binrios (3 variveis oferecem 8
combinaes binrias como j foi estudado em eletrnica digital).
Para o PIC, cada uma destas 8 combinaes equivale a um valor especfico do prescaler
(divisor de frequncias interno do PIC), abaixo demonstramos os valores para cada
combinao:
1 - 000 = 2 no prescaler;
2 - 001 = 4 no prescaler;
3 - 010 = 8 no prescaler;
4 - 011 = 16 no prescaler;
5 - 100 = 32 no prescaler;
6 - 101 = 64 no prescaler;
7 - 110 = 128 no prescaler;
8 - 111 = 255 no prescaler;
Como podemos perceber, o prescaler pode armazenar os valores 2, 4, 8, 16, 32, 64,
128 ou 256.
Mas o que isso quer dizer e o que esse tal de prescaler???

Programao de Microcontroladores PIC Mdulo I

62
Bom, o prescaler nada mais do que um divisor de frequncias que utilizamos para
diminuir a frequncia do clock do TIMER0.
Como normalmente trabalhamos com frequncias altas (de 4 a 20mhz de cristais ou
ressonadores externos) nossos pulsos de clock acabam sendo incrementado muito
rapidamente, o que na maioria das vezes, nos leva ao estouro do timer em intervalos de
tempo muito baixos.
Sabemos que a frequncia de nosso oscilador ser internamente dividida por 4 (como
j foi estudado), porm, esses valores continuam altssimos para bases de tempo do timer.
E ento, o que faremos para aumentar esses valores??
Resposta: setaremos o prescaler!!!
Vejamos um exemplo, para encontrarmos a resoluo do timer utilizaremos a frmula:

)

Onde:
R = Resoluo do timer
1 = Constante
Fosc = Frequncia do oscilador (cristal ou ressonador)
4 = Fator de diviso interno do PIC.
Se, por exemplo, estivermos utilizando um cristal de 4mhz, nossa resoluo seria:

-->

-->
Concluso, cada incremento de nosso timer tem durao de 1us e isso muito pouco...
Claro que 1us no o tempo de estouro do timer e sim de apenas um incremento, pois
o tempo de estouro do timer vai depender de quantos incrementos o mesmo ir fazer at
ocorrer. Vale lembrar que o timer conta de um valor setado, de no mnimo 0, at 255.
Para gerarmos um maior tempo de estouro, podemos setar o timer para iniciar sua
contagem em 0 e ir at 255, para isso iremos incrementar um pouco a frmula anterior e
teremos a seguinte:


Programao de Microcontroladores PIC Mdulo I

63
Onde:
R = Resoluo
1 = Constante
Fosc = Frequncia do oscilador (cristal ou ressonador)
4 = fator de diviso interno do pic.
256 = valor mximo que o timer 0 pode atingir (8 bits)
TMR0 = valor setado no timer 0 para iniciar a contagem.
Se setarmos TMR0 com 0, nosso tempo passa a ser de: t = 1/(1000000)*(256 - 0) =
256us.
Conseguimos aumentar o valor, porm, continua baixo. E agora que entra o
prescaler.
Utilizaremos a mesma frmula estudada passo a passo at aqui e incrementaremos o
valor de prescaler:
R = 1/(Fosc/4)*(256 - TMR0)*prescaler
Como foi visto na tabela anterior, o prescaler pode assumir alguns valores (2, 4, 8, 16,
32, 64, 128 ou 256), de acordo com a configurao dos bits ps0, ps1 e ps2.
Utilizando a frmula descrita no slide anterior, com o maior valor de prescaler(256),
com um oscilador externo de 4mhz e setando o timer com 0 teremos o seguinte valor de
estouro:
R = 1/(4000000/4)*(256 - 0)*256 = 0,065s ou 65ms.
Agora sim, conseguimos aumentar razoavelmente nosso valor.
Sim, ele ainda baixo, mas o mximo que podemos fazer utilizando apenas suas
configuraes. Mas isso no quer dizer que no podemos aumentar esse valor, muito pelo
contrrio, podemos e bem simples, basta que para isso o programador crie um contador
no seu cdigo utilizando uma varivel para armazenar os estouros do timer (no nosso caso a
cada 65ms).
Para nos auxiliar, utilizamos uma formulinha bem simples, que determina qual ser o
valor setado na rotina da varivel para que nosso timer atinja o tempo desejado.
TET = R*N
Onde:
TET = Tempo de estouro do timer (desejado)
R = Resoluo (tempo de estouro calculado com a frmula anterior).

Programao de Microcontroladores PIC Mdulo I

64
N = Nmero de repeties de estouros para se atinja o valor desejado no timer.
Exemplo:
Se precisarmos de um tempo de aproximadamente 2 segundos, faremos o seguinte:
TET = R*N
2 = 0,065*N
N = 2/0,065
N = 30,8.
Ou seja, basta criarmos um contador que conte aproximadamente 31 estouros do
timer e com isso teremos nossa base de tempo em 2 segundos!
Segue, abaixo, um trecho de cdigo implementando uma rotina de temporizao de 2
segundos, utilizando funes do compilador que manipulam os bits dos registradores
automaticamente.

O cdigo acima inverte o estado do pino RB1 a cada 2 segundos.
Uma breve observao a respeito do prescaler. O prescaler tanto pode ser utilizado em
TIMERs, como acabamos de ver, como pode ser utilizado para o watch dog timer (WDT),
sendo esta aplicao vista em outra aula. No momento, precisamos saber que o prescaler
deve ser selecionado para trabalhar ou no timer ou no WDT, no podendo trabalhar com os

Programao de Microcontroladores PIC Mdulo I

65
dois ao mesmo tempo.

SITUAO PROBLEMA
Desenvolva um programa que realize contagens de 1 a 32 (decimal), em intervalos de
100ms e apresente de forma binria no PORTB com os leds indicando a contagem. Deve
existir uma tecla para play (incio da contagem) e outra para pause (parar a contagem).
Ambas podero ser pressionadas a qualquer momento e no devero resetar a contagem,
apenas pausar (quando pressionar a tecla de pause) e continuar de onde parou quando
pressionar a tecla (play).
Obs: Ao pressionar a tecla de play durante a contagem do programa em execuo,
nada dever acontecer.
Obs2: Utilize INT_EXT para pausar a contagem.















Programao de Microcontroladores PIC Mdulo I

66
EEPROM INTERNA
O PIC 16F877A possui 256 BYTES de memria EEPROM que podem ser utilizados como
memria de dados. Sua principal vantagem em relao memria RAM esta no fato de que
a EEPROM no perde as informaes com desenergizao do PIC. E, em contrapartida, o
tempo de escrita pode passar dos 10 ms.
A principal utilizao da EEPROM est em sistemas em que se devem memorizar dados
como o ltimo nmero discado em telefones, ajuste de som, cor, brilho, ou seja, salvar
informaes que os usurios do sistema utilizaram no mesmo.
Os 256 BYTES da EEPROM no so diretamente acessados, como os endereos da
RAM, portanto para fazer tal tarefa utilizamos 4 registradores como auxlio, so eles:
EEADR: Endereo desejado para leitura/escrita na EEPROM;
Este um registrador de 8 bits e esta localizado no endereo 0X10D da RAM. O EEADR
recebe o endereo referente posio da EEPROM que se deseja realizar a leitura ou
escrita.
EEDATA: Dado que deseja ler/escrever na EEPROM;
Localizado no endereo 0X10C da RAM, o EEDATA possui 8 bits que onde escrevemos
o dado a ser GRAVADO no endereo especificado no EEADR, assim como no EEDATA
que teremos o dado LIDO de alguma posio da EEPROM.
EECON1: Registro de controle 1;
Registrador que controla as operaes com a EEPROM. Apenas 5 bits so podem ser
utilizados.
EEPGD - - - WRERR WREN WR RD
Bit 7 Endereo 0X18C Bit 0
EEPGD Bit de seleo da EEPROM de dados ou de programa (FLASH);
1 Acesso memria de programa.
0 Acesso memria de dados.
WRERR Sinalizador de ERRO na operao com a EEPROM;
1 A escrita no foi finalizada por motivos de reset (MCLR ou WDT).
0 A operao de escrita esta completa.
WERN habilitao de escrita na EEPROM;
1 Permitido escrever na EEPROM.
0 No permitido a escrita.
WR Bit para iniciar uma escrita;

Programao de Microcontroladores PIC Mdulo I

67
1 Inicia o ciclo de escrita.
0 Operao de escrita completa ( zerado por hardware).
RD Bit para iniciar uma leitura;
1 Inicia o ciclo de leitura.
0 Operao de leitura completa ( zerado por hardware).
EECON2: Registro de controle 2;
Este no um registrador fsico, ele utilizado exclusivamente na sequncia de
gravao da EEPROM.
Visto, acima, as funes dos registradores, para iniciar uma operao de leitura ou
escrita, basta definir os valores em EEADR (para leitura ou escrita) e EEDATA (para escrita) e
setar os bits RD ou WR de acordo com a operao desejada. Para proteo contra escritas
indesejveis, WREN deve ficar em 1 somente no momento em que se deseja realizar uma
escrita, aps isso ele dever ser zerado novamente.
Porm como estamos programando em linguagem C, o compilador separou duas
funes que fazem todo esse trabalho citado acima, so elas:
WRITE_EEPROM ();
Escreve um valor em um determinado endereo da memria EEPROM de dados.
Sintaxe WRITE_EEPROM (ENDEREO, DADO);
Endereo uma varivel ou constante inteira de 8 bits.
Dado uma varivel ou constante de 8 bits.
READ_EEPROM ();
L o valor de um determinado endereo da memria EEPROM de dados.
Sintaxe VALOR = READ_EEPROM (ENDEREO);
Endereo uma varivel ou constante inteira de 8 bits.
Valor uma varivel para guardar o valor lido na EEPROM.
Veja alguns exemplos:

Dessa forma fica muito simples escrever ou ler na EEMPROM, Porm vamos ter mais
trabalhos se quisermos realizar operaes com valores maiores que 8 bits, visto que cada
posio da EEPROM tem capacidade de guardar os exatos 8 bits.

Programao de Microcontroladores PIC Mdulo I

68
Portanto, para que seja possvel realizar operao com valores maior, como 16 bits,
basta separa-los em dois BYTES, o mais significativo (MS_BYTE) e menos significativo
(LS_BYTE), e gravar cada um em um endereo da EEPROM, posteriormente podemos ler os
valores das duas posies normalmente e depois junta-los em uma varivel LONG. Para isso
o compilador tambm nos fornece duas funes muito simples de utilizar, so elas:
MAKE8 ();
Separa um BYTE de uma WORD.
Sintaxe A = MAKE8 (AB, BYTE);
A uma varivel inteira de 8 bits.
AB uma varivel ou constante de 16 bits.
BYTE=1 Est especificando que vai pegar o BYTE mais significativo.
BYTE=0 Est especificando que vai pegar o BYTE menos significativo.

MAKE16 ();
Realiza a unio de dois BYTEs.
Sintaxe AB = MAKE16 (A, B);
AB uma varivel inteira de 16 bits.
A uma varivel ou constante inteira de 8 bits (MS_BYTE).
B uma varivel ou constante inteira de 8 bits (LS_BYTE).
Veja os exemplos a seguir:






Programao de Microcontroladores PIC Mdulo I

69
CONVERSOR ANALGICO-DIGTAL (A/D)
Um conversor A/D nos permite transformar um sinal analgico em uma representao
digital, ou seja, representao binria, para que sistemas microprocessados possam utilizar
para realizar trabalhos, como amostragem e controle.
Conversores A/D sempre so utilizados quando existe a necessidade de processar
grandezas fsicas (temperatura, umidade, velocidade, etc...). Para isso se tem a necessidade
de utilizar um transdutor, que nada mais que um circuito eletrnico capas de capitar
alguma grandeza fsica e transformar em um sinal eltrico analgico, utiliza-se tambm um
condicionamento de sinal, que consiste em adequar o sinal eltrico do transdutor para os
limites de conversor A/D.
No PIC 16F877A temos um conversor A/D com 8 canais, tenso de referencia superior
e inferior e resoluo de 8 ou 10 bits, ou seja, capaz de representar o sinal analgico com
valores ente 0 e 255 ou 0 e 1023 em binrio. Apesar deste conversor A/D possuir 8 canais de
converso, o mesmo s consegue realizar uma converso por vez. Veja, a seguir, o diagrama
em blocos do mesmo:


Programao de Microcontroladores PIC Mdulo I

70
Para utilizar o conversor A/D do PIC, precisamos conhecer os quatro registradores que
auxilia a aquisio do valor convertido, so eles:
ADCON0: Registrador que controla a operao do conversor A/D, neste registrador
utilizado apenas 7 dos 8 bits disponveis;
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE - ADON
Bit 7 Endereo 0x1F Bit 0
ADCS1:ADCS0 Seleo do clock de converso. Trabalha em conjunto com o Bit ADCS2
do registrador ADCON1, sendo o ADCS o MSB;
000 FOSC/2.
001 FOSC/8.
010 FOSC/32.
011 FRC (clock do RC interno).
100 FOSC/4.
101 FOSC/16.
110 FOSC/64.
111 FRC (clock do RC interno).
CHS2:CHS0 Seleo do canal analgico a ser utilizado;
000 Canal 0 (AN0).
001 Canal 1 (AN1).
010 Canal 2 (AN2).
011 Canal 3 (AN3).
000 Canal 4 (AN4).
001 Canal 5 (AN5).
010 Canal 6 (AN6).
011 Canal 7 (AN7).
GO/DONE Bit de status da converso A/D;
0 Converso em espera.
1 Converso em progresso (setar esse bit para iniciar a converso).
ADON Bit para ligar o mdulo de converso A/D;
0 Conversor A/D desligado.
1 Conversor A/D ligado.



Programao de Microcontroladores PIC Mdulo I

71
ADCON1: Registrador de configurao do A/D;
ADFM ADCS2 - - PCFG3 PCFG2 PCFG1 PCFG0
Bit 7 Endereo 0x9F Bit 0
ADFM Seleo do formato do resultado A/D;
0 Resultado justificado a esquerda.
1 Resultado justificado a direita.

ADCS2 Seleo do clock, juntamente com os bits ADCS1:ADCS0 do registrador ADCON0;
PCFG3:PCFG0 Define a configurao do PORTA e PORTE;


Programao de Microcontroladores PIC Mdulo I

72
ADRESH: Recebe o resultado (MS_BYTE) da converso;
ADRESL: Recebe o resultado (LS_BYTE) da converso;
A primeira coisa que se deve fazer para configurar o trabalho do conversor A/D
definir a resoluo de sua converso. Como o PIC 16F877A possui duas possveis
configuraes para este parmetro, sendo 8 ou 10 bits de resoluo, temos de decidir qual
delas usar e para isso utiliza-se como auxilio a diretiva #DEVICE, Veja a seguir:

Vale lembrar que quanto maior a quantidade de bits maior ser a resoluo e preciso
do conversor.
Por exemplo, supondo que a tenso aplicada ao pino A/D varia entre 0 e 5V e o
conversor possui 8 bits, a resoluo dada pela seguinte funo:



Mudando a resoluo do conversor para 10 bits, temos:



Logo vemos que quando configuramos o A/D com resoluo de 8 bits, com Vref 0V e
+Vref 5V, temos uma resoluo de 19,61mV/Bit. E para um A/d configurado com resoluo
de 10 bits, Vref 0V e +Vref 5V, temos uma resoluo de 4,88mV/Bit.
Nosso prximo passo a configurao do PORTA e PORTE, j que os dois possuem
canais analgicos. Essa configurao deve ser feita de acordo com a tabela da PAGINA
XXXXXXX, onde so informadas as possveis configuraes. No arquivo de cabealho do PIC
16F877A (16f877a.h) tambm existe informaes sobre as possveis configuraes dos
PORTs para a utilizao do conversor A/D.
Como estamos programando em C, existe um comando prprio para realizar a
configuraes dos PORTs, sendo ele o SETUP_ADC_PORTS ( CONFIGURAO );. Veja um

Programao de Microcontroladores PIC Mdulo I

73
exemplo a seguir:

No exemplo acima, possvel observar que alm do comando SETUP_ADC_PORTS
(AN0_AN1_AN3); temos o comando SETUP_ADC (ADC_CLOCK_INTERNAL). Este comando
configura a velocidade do clock base que o conversor A/D utiliza para realizar sua converso,
sendo que o clock dado pelo oscilador externo e as possveis configuraes dependem da
velocidade do mesmo.
Na tabela, a seguir, podemos visualizar qual a diviso do clock que o conversor deve
possuir de acordo com a velocidade do oscilador externo.

Feito essas configuraes o conversor A/D est pronto para trabalhar, bastando
apenas ligar o CANAL que deseja realizar a converso. Vale lembrar que apesar de possuir
vrios canais de converso, estamos limitados a efetuar uma converso por vez por isso
devemos LIGAR O CANAL alvo, no esquecendo tambm que o canal s pode ser utilizado se
o mesmo estiver configurado para tal tarefa.
Com o comando SET_ADC_CHANNEL (N DO CANAL); conseguimos ligar o canal que
precisamos realizar a converso, sendo que a passagem de parmetros da funo deve estar
o numero do canal alvo. Veja no exemplo a seguir:

Programao de Microcontroladores PIC Mdulo I

74

Aps SETAR o canal, basta ler o resultado da converso com o comando
READ_ADC();. Esse comando vai buscar o valor convertido em binrio que est nos
registradores ADRESH e ADRESL. Vale lembrar que sempre que o comando READ_ADC(); for
utilizado, ele buscar o valor da converso do ultimo CANAL SETADO pelo
SET_ADC_CHANNEL.
No exemplo acima estamos atribuindo o valor capturado pelo comando READ_ADC();
para a varivel ANL_0. Na maioria das vezes se faz necessrio a atribuio do valor
capturado na converso para uma varivel, visto que, assim podemos efetuar uma nova
leitura sem perder o valor anterior. Aps atribuir o valor da converso para uma varivel, foi
feita uma equao para que o valor da converso seja transformado no valor de grandesa
fsica que a principio estamos lendo atravs do conversor A/D.
Veja, a seguir, um exemplo completo de cdigo para ler uma tenso no canal AN0. Est
tenso se refere a uma leitura de tenso AC.


Programao de Microcontroladores PIC Mdulo I

75


EXERCICIO DE FIXAO
1. Realize a leitura de temperatura utilizando o transdutor de temperatura LM35.
2. A partir do exerccio anterior, desenvolva um termostato digital mostrando seus
valores em displays de 7 segmentos. O mesmo deve possuir a funo de
resfriamento e/ou aquecimento, sendo que o set point deve ser configurado pelo
usurio. O termostato no deve perder suas informaes quando sujeito a
desenergizao e sua alimentao deve ser feita em 12VDC. DESENVOLVA O
SOFTWARE O HARDWARE COMPLETO PARA O TERMOSTATO.



Programao de Microcontroladores PIC Mdulo I

76
MDULO CCP CAPTURE / COMPARE / PWM
O Mdulo CCP um perifrico que permite, ao programador, controlar e medir o
tempo de diversos eventos. O PIC 16F877A possui dois mdulos CCP, veremos, abaixo, algumas
caractersticas do mdulo:
2 mdulos CAPTURE / COMPARE / PWM:
CCP1;
CCP2;
Capture:
Registro de 16 bits;
Resoluo mxima de 12,5 ns;
Compare:
Registro de 16 bits;
Resoluo mxima de 200 ns;
PWM:
Modulao por largura de pulso;
Resoluo mxima de 10 bits;
Modo de Captura Permite a medio do tempo de durao de um evento.
Monitoriza o estado do TMR1;
Modo de Comparao Compara valores entre os registros do TMR1 e CCPR.
Modo de PWM Gera sinais de frequncia e Duty-Cycle variveis.
MODO DE PWM
Os controles de potncia, inversores de frequncia, conversores DC/DC, DC/AC, fontes
chaveadas utilizam circuitos com a tecnologia PWM. Neste capitulo vamos estudar
especificamente o modo de PWM do PIC 16F877A. Mas antes de entrarmos em detalhes
sobre a implementao do controle pelo microcontrolador, vamos falar um pouco sobre a
teoria de PWM.
PWM a sigla em ingls de Pulse-Width Modulation que significa Modulao por
largura de pulso. Para entendermos como o PWM funciona, vamos nos basear na imagem
abaixo:


Programao de Microcontroladores PIC Mdulo I

77
Quando o interruptor est aberto, no temos tenso no motor, por consequncia, o
motor ficar parado. E quando o interruptor est fechado, temos a mxima tenso, limitada
pela fonte geradora, que ser fornecida ao motor, fazendo com que o motor gire na sua
mxima velocidade.
Com o exemplo acima, podemos tratar o interruptor como um sinal digital, j que ou
temos toda a potncia aplicada a carga, ou nenhuma potncia aplicada.
Agora utilizando a mesma imagem, vamos imaginar que o interruptor seja ligado e
desligado com uma frequncia alta, e que o tempo que o interruptor fica ligado o mesmo
tempo que fica desligado. Desta forma teremos uma tenso mdia na carga.
Para exemplificar melhor o que falamos, vamos observar o grfico abaixo.

T1 = Perodo o tempo necessrio para concluir um ciclo completo da onda. Este
tempo determinado pela frequncia de operao do sistema em questo.
Para o nosso exemplo vamos utilizar uma frequncia de 20KHz. Portanto:


T2 = Ton o tempo em que o sinal ficar ligado. Como no nosso caso temos 50% do
tempo ligado:


T3 = Toff o tempo em que o sinal ficar desligado. Como no nosso caso temos 50% do
tempo desligado:

s
V1 = Vmd a tenso mdia que o sinal estar fornecendo a carga. Para o nosso
exemplos estaremos utilizando uma fonte de alimentao de 12V.
Portanto para uma fonte de alimentao de 12V e uma porcentagem de 50% para o
tempo ligado, teremos:

Programao de Microcontroladores PIC Mdulo I

78


Com isso conclumos que se aumentarmos o tempo de T2 estaremos tambm
aumentando a tenso de alimentao do motor e por consequncia, aumentando a
velocidade.
Para T2 igual a 75%:


Para T2 igual a 35%:


Observa-se ento, que o valor mdio pode ser alterado atuando-se em T2, em T1 ou
em ambos. Atuando-se sobre T1 , com T2 fixo, tem-se a estratgia de controle de VM
designada por modulao de frequncia dos pulsos (do ingls, PFM).
Porm, atuando-se sobre T2 com T1 fixo (frequncia fixa), tem-se a estratgia
designada modulao por largura de pulso (do ingls, PWM), onde surge o Duty Cycle que
a razo de T2 (tempo de pulso ligado) e o T1 (tempo do perodo da frequncia).

CONFIGURANDO O PWM NO PIC

Programao de Microcontroladores PIC Mdulo I

79
Como vimos acima o PWM basicamente manter uma frequncia fixa de pulsos onde
quando variamos a largura do pulso temos uma variao de tenso na carga.
No PIC 16F877A essa frequncia configurada no TIMER 2, por meio do registrador
T2CON, veja mais detalhes desse registrador:
- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
Bit 7 Endereo 0x12 Bit 0
TOUTPS3:TOUTPS0: Configurao do POSTSCALE do Timer 2;
0000 = 1:1
...
1111= 1:16
TMR2ON: Bit para ligar o Timer 2;
0 = Timer 2 desligado.
1 = Timer 2 ligado.
T2CKPS1:T2CKPS0: Configurao do PRESCALER do Timer 2;
00 = 1:1
01 = 1:4
1X = 1:16
Como vimos anteriormente, no capitulo sobre o Timer0, o PRESCALER define quantos
pulsos o mesmo deve receber do oscilador para realizar um incremento, por exemplo, se o
prescaler estiver configurado como 1:16 o TMR2 deve receber 16 pulsos do oscilador para
que possa efetuar um incremento em seu registro.
J o POSTSCALER, que no havia sido estudado ainda, define quantos estouros o TMR2
deve ter para que o bit TMR2IF (FLAG de interrupo do Timer2) seja setado, visto que se for
configurado como 1:1 a FLAG setada a cada estouro do TMR2 e se estiver configurado
como 1:4 a FLAG ser setada apenas quando houver 4 estouros do TMR2.
Para realizar essas configuraes, podemos manipular diretamente os bits do
registrador T2CON ou podemos configurar atravs do comando SETUP_TIMER2 (MODO,
PER, POS); , onde:
MODO: a configurao de modo de trabalho do TMR2;
T2_DISABLE: desliga o TMR2;
T2_DIV_BY_1: TMR2 ligado e utilizando o PRESCALER dividindo o clock por 1;
T2_DIV_BY_4: TMR2 ligado e utilizando o PRESCALER dividindo o clock por 4;
T2_DIV_BY_16: TMR2 ligado e utilizando o PRESCALER dividindo o clock por 16;
POS: utilizado para especificar o valor do POSTSCALER, ou seja, especifica o nmero de
estouros que o TMR2 deve ter para que gere uma interrupo. Este valor deve ser um

Programao de Microcontroladores PIC Mdulo I

80
inteiro entre 1 e 16;
PER: um parmetro utilizado para especificar um perodo de contagem para o TMR2. A
contagem inicia em 0 e cada vez que chegar a uma contagem igual ao valor de PER, o
TMR2 reinicia (estoura). Esse parmetro recebe valores inteiros de 8 BITs.
Onde PER pode ser calculado pela seguinte equao:

Ajustando a equao, ficar assim:
(


)
Vale salientar que o valor de POSTCALER do Timer2 no interfere na formao do
perodo da onda de PWM.
Como exemplo, vamos calcular o perodo de contagem do TMR2 com os seguintes
parmetros:
Frequncia de PWM = 10 KHz (Perodo PWM = 100s);
Frequncia do cristal oscilador = 4 MHz (Tosc = 250ns);
Prescaler TMR2 = 1:1;

(


)
Assim teremos a seguinte configurao para o Timer 2:

Aps configurar o Timer 2, iremos configurar o registrador do CCP alvo, no nosso caso
como utilizaremos o CCP1 devemos efetuar as configuraes no registro CCP1CON. Nele
determinamos o modo de trabalho do CCP1, como vimos no inicio do capitulo temos trs
modos, o de COMPARAO, o de CAPTURA e o de PWM. Veja abaixo os detalhes do
registrador.
- - CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0
Bit 7 Endereo 0x17 Bit 0
CCP1X:CCP1Y: Bits LSB do PWM;
Utilizado somente no modo PWM para especificar o duty cycle.
CCP1M3:CCP1M0: Seleo do modo de trabalho do CCP1;
0000 CCP desabilitado.

Programao de Microcontroladores PIC Mdulo I

81
0100 Capture a cada borda de descida.
0101 Capture a cada borda de subida.
0110 Capture a cada 4 bordas de subida.
0111 Capture a cada 16 bordas de subida.
1000 Compare seta sada.
1001 Compare reseta sada.
1010 Compare gera interrupo sem afetar o pino.
1011 Compare trigger de evento especial (A/D).
11XX Modo de PWM.
Como foi visto mais acima, para efetuar tal configurao, vamos utilizar o comando
SETUP_CCP1 (CCP_PWM);
Com tudo devidamente configurado, podemos agora simplesmente setar os valores de
DUTY CYCLE para efetuar a nossa modulao por largura de pulso. Para isso utilizamos o
comando SET_PWM1_CYCLE ( VALOR );, onde o valor deve um nmero inteiro e NO DEVE
ultrapassar o valor de PER (99) calculado anteriormente, pois se ultrapassar a sada
RC2/CCP1 nunca ir para nvel baixo.
Veja a seguir um exemplo completo de utilizao do PWM com o PIC16F877A.


Programao de Microcontroladores PIC Mdulo I

82