Вы находитесь на странице: 1из 201

Aplicaes prticas de Eletrnica e

Microcontroladores em Sistemas
Computacionais
Aprenda de forma simples a gravao wireless, via USB e
Multiplataforma de Microcontroladores PIC 18 com a
Ferramenta SanUSB
(MPLABX C18)

Sandro Juc
Renata Pereira

INTRODUO ................................................................................................................................................................ 6
ASSEMBLY X LINGUAGEM C ................................................................................................................................................... 6
VANTAGENS X DESVANTAGENS DA LINGUAGEM C PARA MICROCONTROLADORES ........... 8
ARQUITETURAS DOS MICROCONTROLADORES ................................................................................................... 8
O CONTADOR DE PROGRAMA (PC) .................................................................................................................................. 9
BARRAMENTOS ................................................................................................................................................................................. 9
A PILHA (STACK) ............................................................................................................................................................................ 10
CICLO DE MQUINA .................................................................................................................................................................... 10
MATRIZ DE CONTATOS OU PROTOBOARD ............................................................................................................. 11
RESISTORES..................................................................................................................................................................................... 12
CAPACITORES ................................................................................................................................................................................. 13
FONTES DE ALIMENTAO .................................................................................................................................................. 14
PROTOCOLO DE COMUNICAO USB ........................................................................................................................ 15
MTODOS DE COMUNICAO USB ............................................................................................................................... 15
UTILIZANDO O COMPILADOR C18 E A IDE MPLABX MULTIPLATAFORMA COM FUNES
EM PORTUGUS ....................................................................................................................................................... 17
FUNES EM PORTUGUS .................................................................................................................................................. 18
FUNES BSICAS DA APLICAO DO USURIO ............................................................................................ 18
FUNES DO CONVERSOR ANALGICO DIGITAL (A/D) ............................................................................... 23
FUNES DA COMUNICAO SERIAL RS-232...................................................................................................... 24
FERRAMENTA DE GRAVAO VIA USB ....................................................................................................... 25
2.1
GRAVAO DE MICROCONTROLADORES............................................................................................... 26
PRTICA 1 PISCA LED ............................................................................................................................................. 31
PRTICA 2 PISCA 3 LEDS ...................................................................................................................................... 33
2.2
GRAVANDO O MICROCONTROLADOR VIA USB NO WINDOWS .............................................. 40
2.3
GRAVAO WIRELESS DE MICROCONTROLADORES ................................................................... 43
2.4
SISTEMA DUAL CLOCK ............................................................................................................................................ 55
2.5
COMUNICAO SERIAL VIA BLUETOOTH OU ZIGBEE ................................................................... 56
2.6
GRAVANDO O MICROCONTROLADOR VIA USB NO LINUX ......................................................... 58
2.7
GRAVANDO O PIC VIA USB PELO TERMINAL DO LINUX OU MAC OSX ............................. 59
2.8
SISTEMA DUAL CLOCK ............................................................................................................................................ 61
2.9
EMULAO DE COMUNICAO SERIAL NO LINUX .......................................................................... 61
2.10 PROGRAMA COM INTERRUPO EXTERNA POR BOTO E DO TIMER 1....................... 63
2.11 OBTENO DE UM VOLTMETRO ATRAVS DO CONVERSOR AD COM A
VARIAO DE UM POTENCIMETRO ........................................................................................................................... 64
2.12 CIRCUITO COM84 PARA GRAVAO DO gerenciador.hex............................................................. 65
PERIFRICOS INTERNOS DO MICROCONTROLADOR ........................................................................... 67
3.1
CONVERSOR A/D .......................................................................................................................................................... 67
3.1.1 AJUSTE DE RESOLUO DO SENSOR E DO CONVERSOR AD DE 8 BITS ..................... 68
3.1.2 AJUSTE DA TENSO DE FUNDO DE ESCALA COM AMPOP ....................................................... 68
3.1.3 AJUSTE DA TENSO DE REFERNCIA COM POTENCIMETRO ............................................ 69
3.1.4 CONVERSOR AD DE 10 BITS ............................................................................................................................... 69
3.1.5 OBTENO DE UM VOLTMETRO ATRAVS DO CONVERSOR AD COM A
VARIAO DE UM POTENCIMETRO ........................................................................................................................... 70
3.1.6 LEITURA DE TEMPERATURA COM O LM35 ATRAVS DO CONVERSOR AD ................. 70
3.1.7 TERMISTOR ....................................................................................................................................................................... 72
3.2
MEMRIAS DO MICROCONTROLADOR ...................................................................................................... 74
3.2.1 MEMRIA DE PROGRAMA ..................................................................................................................................... 74
3.2.2 MEMRIA DE INSTRUES ................................................................................................................................. 74
3.2.3 MEMRIA EEPROM INTERNA ............................................................................................................................. 74
3.2.4 MEMRIA DE DADOS (RAM) ................................................................................................................................ 74
3.2.5 EXEMPLO DE APLICAO ..................................................................................................................................... 75

[2]

3.2.5.1 CONTROLE DE ACESSO COM TECLADO MATRICIAL ................................................................ 75


3.3
MODULAO POR LARGURA DE PULSO PELO CCP ....................................................................... 79
CONTROLE PWM POR SOFTWARE DE VELOCIDADE DE UM MOTOR CC ....................................... 80
INTERRUPES E TEMPORIZADORES ......................................................................................................... 82
INTERRUPES ............................................................................................................................................................................. 82
INTERRUPES EXTERNAS ................................................................................................................................................ 82
INTERRUPO DOS TEMPORIZADORES................................................................................................................... 88
MULTIPLEXAO POR INTERRUPO DE TEMPORIZADORES .............................................................. 89
EMULAO DE PORTAS LGICAS ................................................................................................................. 90
5.1
INSTRUES LGICAS PARA TESTES CONDICIONAIS DE NMEROS ............................ 90
5.2
INSTRUES LGICAS BOOLANAS BIT A BIT ...................................................................................... 91
5.3
EMULAO DE DECODIFICADOR PARA DISPLAY DE 7 SEGMENTOS............................... 95
5.4
MULTIPLEXAO COM DISPLAYS DE 7 SEGMENTOS................................................................. 100
COMUNICAO SERIAL EIA/RS-232 ............................................................................................................. 103
6.1
CDIGO ASCII .............................................................................................................................................................. 104
6.2
INTERFACE USART DO MICROCONTROLADOR ............................................................................... 105
6.3
COMUNICAO SERIAL EIA/RS-485 ........................................................................................................... 107
ACIONAMENTO DE MOTORES MICROCONTROLADOS ....................................................................... 109
ACIONAMENTO DE MOTORES CC DE BAIXA TENSO ................................................................................. 109
MOTORES ELTRICOS UTILIZADOS EM AUTOMVEIS .............................................................................. 110
COROA E O PARAFUSO COM ROSCA SEM-FIM ................................................................................................ 111
CHAVEAMENTO DE MOTORES CC COM TRANSISTORES MOSFET .................................................. 112
EXEMPLO: SEGUIDOR TICO DE LABIRINTO ..................................................................................................... 113
ESTABILIDADE DO CONTROLE DE MOVIMENTO .............................................................................................. 114
PONTE H ............................................................................................................................................................................................ 116
DRIVER PONTE H L293D....................................................................................................................................................... 117
SOLENIDES E RELS .......................................................................................................................................................... 118
DRIVER DE POTNCIA ULN2803 .................................................................................................................................... 120
PONTE H COM MICRORELS ........................................................................................................................................... 122
ACIONAMENTO DE MOTORES DE PASSO ............................................................................................................. 123
MOTORES DE PASSO UNIPOLARES ........................................................................................................................... 123
MODOS DE OPERAO DE UM MOTOR DE PASSO UNIPOLAR ........................................................... 125
ACIONAMENTO BIDIRECIONAL DE DOIS MOTORES DE PASSO .......................................................... 125
SERVO-MOTORES ..................................................................................................................................................................... 126
FOTOACOPLADORES E SENSORES INFRAVERMELHOS................................................................... 128
TRANSMISSOR E RECEPTOR IR................................................................................................................................... 132
AUTOMAO E DOMTICA COM CONTROLE REMOTO UNIVERSAL ............................................... 134
CODIFICAO DE RECEPTOR INFRAVERMELHO UTILIZANDO A NORMA RC5 ....................... 137
LCD (DISPLAY DE CRISTAL LQUIDO).......................................................................................................... 140
EXEMPLO: CONTROLE DE TENSO DE UMA SOLDA CAPACITIVA COM LCD ........................... 145
LDR ............................................................................................................................................................................... 147
EXEMPLO: MODELAGEM DE UM LUXMETRO MICROCONTROLADO COM LDR...................... 148
SUPERVISRIO............................................................................................................................................................................ 150
INTERFACE I2C ........................................................................................................................................................ 155
REGRAS PARA TRANSFERNCIA DE DADOS ..................................................................................................... 156
MEMRIA EEPROM EXTERNA I2C ................................................................................................................................. 159
RTC (RELGIO EM TEMPO REAL).................................................................................................................. 161
EXEMPLO: PROTTIPO DATALOGGER USB DE BAIXO CUSTO............................................................ 164
TRANSMISSO DE DADOS VIA GSM ............................................................................................................ 169

[3]

COMANDOS AT PARA ENVIAR MENSAGENS SMS DE UM COMPUTADOR PARA UM


CELULAR OU MODEM GSM ................................................................................................................................................ 170
COMANDOS AT PARA RECEBER MENSAGENS SMS EM UM COMPUTADOR ENVIADAS
POR UM CELULAR OU MODEM GSM .......................................................................................................................... 171
O PROTOCOLO MODBUS EMBARCADO ..................................................................................................... 173
MODELO DE COMUNICAO............................................................................................................................................ 173
DETECO DE ERROS .......................................................................................................................................................... 174
MODOS DE TRANSMISSO ................................................................................................................................................ 174
INTRODUO MULTITASKING E SISTEMAS OPERACIONAIS EM TEMPO REAL (RTOS) 178
PREPARAO PARA RTOS MULTITASKING ......................................................................................................... 179
DECLARAO DE UMA TAREFA..................................................................................................................................... 179
MQUINAS DE ESTADO ........................................................................................................................................................ 180
APNDICE I: CABEALHOS DA FERRAMENTA PARA DIVERSOS COMPILADORES ............ 182
CCS C Compiler ............................................................................................................................................................................. 182
C18 compiler .................................................................................................................................................................................... 183
SDCC .................................................................................................................................................................................................... 184
MikroC .................................................................................................................................................................................................. 185
Hi-Tech C Compiler...................................................................................................................................................................... 186
Microchip ASM compiler ........................................................................................................................................................... 186

[4]

Dedico este trabalho


a Deus e s nossas famlias.

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

INTRODUO
Um microcontrolador um sistema computacional completo, no qual esto includos
internamente uma CPU (Central Processor Unit), memrias RAM (dados), flash
(programa) e E2PROM, pinos de I/O (Input/Output), alm de outros perifricos
internos, tais como, osciladores, canal USB, interface serial assncrona USART,
mdulos de temporizao e conversores A/D, entre outros, integrados em um
mesmo componente (chip).
O microcontrolador PIC (Periferal Interface Controler), da Microchip Technology Inc.
(empresa de grande porte, em Arizona, nos Estados Unidos da Amrica), possui uma boa
diversidade de recursos, capacidades de processamento, custo e flexibilidade de
aplicaes.
ASSEMBLY X LINGUAGEM C
A principal diferena entre uma linguagem montada (como assembly) e a linguagem de
programao C est na forma como o programa objeto (HEX) gerado. Em assembly, o
processo usado a montagem, portanto devemos utilizar um MONTADOR (assembler),
enquanto que em linguagem C o programa compilado. A compilao um processo mais
complexo do que a montagem. Na montagem, uma linha de instruo traduzida para
uma instruo em cdigo de mquina. J em uma linguagem de programao, no existem
linhas de instruo, e sim estruturas de linguagem e expresses. Uma estrutura pode ser
condicional, incondicional, de repetio, etc...
As expresses podem envolver operandos e operadores mais complexos. Neste caso,
geralmente, a locao dos registros de dados da RAM feita pelo prprio compilador. Por
isso, existe a preocupao, por paret do compilador, de demonstrar, aps a compilao, o
percentual de memria RAM ocupado, pois neste caso relevante, tendo em vista que
cada varivel pode ocupar at 8 bytes (tipo double).
Para edio e montagem (gerao do cdigo HEX) de um programa em assembly, os
softwares mais utilizados so o MPASMWIN (mais simples) e o MPLABX. Para edio e
compilao em linguagem C (gerao do cdigo HEX), o programa mais utilizado o PIC
C Compiler CCS.
Os microcontroladores PIC possuem apenas 35 instrues em assembly para a famlia
de 12 bits (PIC12) e 14 bits (PIC16), descritas nas tabelas abaixo, e 77 instrues para a
famlia de 16 bits (PIC18). A tabela abaixo mostra algumas instrues em assembly.

[6]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 1. 1: Instrues em assembly.


Como pode ser visto, a famlia PIC16F (14 bits com aproximadamente 35
instrues) no possui uma instruo em assembly que realize multiplicao ou diviso de
dois operandos, o que curiosamente presente na linguagem assembly da famlia MCS51
(256 instrues que satisfazem a maioria das aplicaes industriais). Portanto, para
realizar uma multiplicao, necessrio realizar somas sucessivas, ou seja, em vez de
multiplicar uma varivel por outra, realizar somas de uma varivel em uma terceira rea de
memria, tantas vezes quando for o valor da segunda varivel. (X * 5 = X + X + X + X + X).
Mas em linguagem C possvel se utilizar o operador de multiplicao (*), de
forma simples e prtica. Ao compilar, a linguagem gerada ir converter a multiplicao
em somas sucessivas sem que o programador se preocupe com isso.

[7]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

VANTAGENS
X
DESVANTAGENS
MICROCONTROLADORES

DA

LINGUAGEM

PARA

- O compilador C ir realizar o processo de traduo, permitindo uma programao mais


amigvel e mais fcil para desenvolvimento de aplicaes mais complexas como, por
exemplo, uso do canal USB e aplicaes com o protocolo I2C.
- A linguagem C permite maior portabilidade, uma vez que um mesmo programa pode ser
recompilado para um microcontrolador diferente, com o mnimo de alteraes, ao contrrio
do ASSEMBLY, onde as instrues mudam muito entre os diversos modelos de
microcontroladores existentes como PIC e 8051.
- Em C para microcontroladores PIC, no necessrio se preocupar com a mudana de
banco para acessar os registros especiais da RAM como, por exemplo, as portas de I/O e
os registros TRIS de comando de I/O dos pinos, isto executado pelo prprio compilador
atravs das bibliotecas.
- possvel incluir, de forma simples e padronizada, outro arquivo em C (biblioteca) para
servir como parte do seu programa atual como, por exemplo, incluir o arquivo LCD
(#include <lcd.c>), desenvolvido por voc anteriormente.
- O ponto fraco da compilao em C que o cdigo gerado, muitas vezes, maior do que
um cdigo gerado por um montador (assembler), ocupando uma memria maior de
programa e tambm uma memria maior de dados. No entanto, para a maioria das
aplicaes sugeridas na rea de automao industrial, a linguagem C para PIC se mostra
a mais adequada, tendo em vista que a memria de programa tem espao suficiente para
estas aplicaes.
- Outra desvantagem que o programador no forado a conhecer as caractersticas
internas do hardware, j que o mesmo se acostuma a trabalhar em alto nivel, o que
compromete a eficincia do programa e tambm o uso da capacidade de todos os
perifricos internos do microcontrolador. Isso provoca, em alguns casos, o aumento do
custo do sistema embarcado projetado com a aquisio de novos perifricos externos.
ARQUITETURAS DOS MICROCONTROLADORES
A arquitetura de um sistema digital define quem so e como as partes que compe o
sistema esto interligadas. As duas arquiteturas mais comuns para sistemas
computacionais digitais so as seguintes:
- Arquitetura de Von Neuman: A Unidade Central de Processamento interligada
memria por um nico barramento (bus). O sistema composto por uma nica memria
onde so armazenados dados e instrues;
- Arquitetura de Harvard: A Unidade Central de Processamento interligada a memria
de dados e a memria de programa por barramentos diferentes, de dados e de endereo.
O PIC possui arquitetura Harvard com tecnologia RISC, que significa Reduced Instruction
Set Computer (Computador com Conjunto de Instrues Reduzido). O barramento de
dados de 8 bits e o de endereo pode variar de 13 a 21 bits dependendo do modelo.
Este tipo de arquitetura permite que, enquanto uma instruo executada, uma outra seja

[8]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

buscada na memria, ou seja, um PIPELINE (sobreposio), o que torna o


processamento mais rpido.
O CONTADOR DE PROGRAMA (PC)
O contador de programa responsvel de indicar o endereo da memria de
programa para que seu contedo seja transportado para a CPU para ser executado. Na
famlia PIC16F ele contm normalmente 13 bits, por isso, pode enderear os 8K words de
14 bits (o PIC16F877A possui exatamente 8K words de 14 bits, ou seja, 14 Kbytes de
memria de programa).
A famlia 18F ele possui normalmente 21 bits e capaz e
enderear at 2 Megas words de 16 bits (o PIC18F2550 possui 16K words de 16 bits, ou
seja, 32 Kbytes de memria de programa). Cada Word de 14 ou 16 bits pode conter um
cdigo de operao (opcode) com a instruo e um byte de dado.
BARRAMENTOS
Um barramento um conjunto de fios que transportam informaes com um propsito
comum. A CPU pode acessar trs barramentos: o de endereo, o de dados e o de
controle. Como foi visto, cada instruo possui duas fases distintas: o ciclo de busca,
quando a CPU coloca o contedo do PC no barramento de endereo e o contedo da
posio de memria colocado no Registro de instruo da CPU, e o ciclo de execuo,
quando a CPU executa o contedo colocado no registro de instruo e coloca-o na
memria de dados pelo barramento de dados. Isso significa que quando a operao do
microcontrolador iniciada ou resetada, o PC carregado com o endereo 0000h da
memria de programa.

Figura 1. 2: Memrias.
As instrues de um programa so gravadas em linguagem de mquina
hexadecimal na memria de programa flash (ROM). No incio da operao do
microcontrolador, o contador de programa (PC) indica o endereo da primeira instruo da
memria de programa, esta instruo carregada, atravs do barramento de dados, no
Registro de Instruo da CPU.
Um opcode (cdigo de instruo), gerado na compilao em hexadecimal, contm
uma instruo e um operando. No processamento, a CPU compara o cdigo da instruo
alocada no registro de instruo com o Set de Instrues do modelo fabricado e executa a

[9]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

funo correspondente. Aps o processamento, o operando dessa instruo indica para a


CPU qual a posio da memria de dados que deve ser acessada e, atravs do
barramento de controle, a CPU comanda a leitura ou a escrita nesta posio.
Aps o processamento de uma instruo, o PC incrementado para indicar o
endereo do prximo cdigo de instruo (opcode), da memria de programa, que deve
ser carregado no registro de instruo.
A PILHA (STACK)
A pilha um local da RAM ( no PIC18F2550 localizada no final dos Registros de
Funo Especial entre FFDh e FFFh) onde guardado o endereo da memria de
programa antes de ser executado um pulo ou uma chamada de funo localizada em outra
posio de memria.
CICLO DE MQUINA
O oscilador externo (geralmente um cristal) ou o interno (circuito RC) usado para
fornecer um sinal de clock ao microcontrolador. O clock necessrio para que o
microcontrolador possa executar as instrues de um programa.
Nos microcontroladores PIC, um ciclo de mquina (CM) possui quatro fases de clock que
so Q1, Q2, Q3 e Q4. Dessa forma, para um clock externo de 4MHz, temos um ciclo de
mquina (CM=4 x 1/F) igual a 1s.

Figura 1. 3: Ciclo de mquina.


O Contador de Programa (PC) incrementado automaticamente na fase Q1 do ciclo
de mquina e a instruo seguinte resgatada da memria de programa e armazenada no
registro de instrues da CPU no ciclo Q4. Ela decoficada e executada no prximo ciclo,
no intervalo de Q1 e Q4. Essa caracterstica de buscar a informao em um ciclo de
mquina e execut-la no prximo, ao mesmo tempo em que outra instruo buscada,
chamada de PIPELINE (sobreposio). Ela permite que quase todas as instrues sejam
executadas em apenas um ciclo de mquina, gastando assim 1 s (para um clock de 4
MHz) e tornando o sistema muito mais rpido. As nicas exees referem-se s instrues

[ 10 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

que geram saltos no contador de programa, como chamadas de funes em outro local
da memria de programa e os retornos dessas funes.
MATRIZ DE CONTATOS OU PROTOBOARD
Para desenvolver os projetos e exerccos propostos nessa apostila ser necessrio a
uilizao de uma Matriz de Contatos (ou Protoboard em ingls), mostrada na figura abaixo,
que uma placa com diversos furos e conexes condutoras para montagem de circuitos
eletrnicos. A grande vantagem do Protoboard na montagem de circuitos eletrnicos a
facilidade de insero de componentes (no necessita soldagem).

Figura 1. 4: Protoboard.

Na superfcie de uma matriz de contatos h uma base de plstico em que existem


centenas de orifcios onde so encaixados os componentes ou tambm por ligaes
mediante fios. Em sua parte inferior so instalados contatos metlicos que interliga
eletricamente os componentes inseridos na placa que so organizados em colunas e
canais. De cada lado da placa, ao longo de seu comprimento, h duas colunas completas.
H um espao livre no meio da placa e de cada lado desse espao h vrios grupos de
canais horizontais (pequenas fileiras), cada um com 05 orifcios de acordo como ilustrado
na figura abaixo.

Figura 1. 5: Contatos internos de uma protoboard.

[ 11 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Em alguns pontos do circuito necessrio limitar a intensidade da corrente eltrica.


Para fazer isso utilizamos um componente chamado resistor. Quanto maior a resistncia,
menor a corrente eltrica que passa num condutor.

RESISTORES
Os resistores geralmente so feitos de carbono. Para identificar qual a resistncia
de um resistor especfico, comparamos ele com a seguinte tabela:

Figura 1. 6: Cdigo de cores de resistores.

[ 12 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

CAPACITORES
Capacitor ou condensador um componente que armazena energia num campo
eltrico. consistem em dois eletrodos ou placas que armazenam cargas opostas. Estas
duas placas so condutoras e so separadas por um isolante ou por um dieltrico. Eles
so utilizados desde armazenar bits nas memrias volteis dinmicas (DRAM) dos
computadores, at corrigir o fator de potncia de indstrias fornecendo reatncia capacitiva
para compensar a reatncia indutiva provocada por bobinas e motores eltricos de grande
porte.
A funo mais comum filtrar rudos em circuitor eltricos e estabilizar as fontes,
absorvendo os picos e preenchendo os vales de tenso. Os capacitores descarregados
so um curto e carregados abrem o circuito, por isso so utilizados tambm para isolar
fontes CC.

Figura 1. 7: Forma de onda de capacitor.


Os capacitores podem ser carregados e descarregados muito rapidamente, por isso
so utilzados tambm no flash eletrnico em uma cmera fotogrfica, onde pilhas
carregam o capacitor do flash durante vrios segundos, e ento o capacitor descarrega
toda a carga no bulbo do flash quase que instantaneamente gerando o alto brilho. Isto
pode tornar um capacitor grande e carregado extremamente perigoso. Eles so utilizados
tambm em paralelo com motores eltricos para fornecer energia para que as bobinas
energizadas possam vencer a inrcia quando os motores so ligados.
As Unidades de Medida de capacitncia so Farad (F), Microfarad (F), Nanofarad
(nF) e Picofarad (pF). Os capacitores mais comuns so os eletrolticos, lstrados na figura
abaixo, os cermicos e os de polister.

Figura 1. 8: Exemplos de Capacitores.


A figura abaixo mostra a identificao de capacitores cermicos.

[ 13 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 1. 9: Clculo demonstrativo de capacitncia.


A figura abaixo mostra a identificao de capacitores de polister.

Figura 1. 10: Cdigo de cores Capacitores Polister.

FONTES DE ALIMENTAO
As fontes mais comuns em sistemas embarcados com microcontroladores so
baterias recarregveis ou conversores CA-CC como carregadores de celulares.
As baterias ou pilhas so dispositivos que armazenam energia qumica e a torna disponivel
na forma de energia eltrica.
A capacidade de armazenamento de energia de uma bateria medida atravs da
multiplicao da corrente de descarga pelo tempo de autonomia, sendo dado em amprehora (1 Ah= 3600 Coulombs). Deve-se observar que, ao contrrio das baterias primrias
(no recarregveis), as baterias recarregveis no podem ser descarregadas at 0V pois
isto leva ao final prematuro da vida da bateria. Na verdade elas tm um limite at onde
podem ser descarregadas, chamado de tenso de corte. Descarregar a bateria abaixo
deste limite reduz a vida til da bateria.
As baterias ditas 12V, por exemplo, devem operar de 13,8V (tenso a plena carga),
at 10,5V (tenso de corte), quando 100% de sua capacidade ter sido utilizada, e este o
tempo que deve ser medido como autonomia da bateria.
Como o comportamento das baterias no linear, isto , quando maior a corrente de
descarga menor ser a autonomia e a capacidade, no correto falar em uma bateria de
100Ah. Deve-se falar, por exemplo, em uma bateria 100Ah padro de descarga 20 horas,

[ 14 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

com tenso de corte 10,5V. Esta bateria permitir descarga de 100 / 20 = 5A durante 20
horas, quando a bateria ir atingir 10,5V.
Outro fator importante a temperatura de operao da bateria, pois sua capacidade
e vida til dependem dela. Usualmente as informaes so fornecidas supondo T=25C ou
T=20C, que a temperatura ideal para maximizar a vida til.
1.12. RUDO (BOUNCING) E FILTRO (DEBOUNCING)
Em operaes de Liga/Desliga e mudana de nivel lgico, surge um rudo
(Bouncing) na transio que, caso uma interrupo esteja habilitada ou at mesmo um
contador de evento, pode provocar vrias interrupes ou contagens. As formas mais
comuns de filtro (Debouncing) so via software, programando um tempo (em torno de
100ms, dependendo da chave) aps as transies, de modo a eliminar o rudo antes de
efetuar uma instruo, ou via hardware, utilizando um capacitor de filtro em paralelo com a
chave.

Figura 1. 11: Rudo.

PROTOCOLO DE COMUNICAO USB


A USB, sigla para Universal Serial Bus, o padro de interface para perifricos
externos ao computador provavelmente mais popular dos j criados. Um sistema USB
composto por hardware mestre e escravo. O mestre chamado de host e o escravo
denomina-se dispositivo ou simplesmente perifrico. Todas as transferncias USB so
administradas e iniciadas pelo host. Mesmo que um dispositivo queira enviar dados,
necessrio que o host envie comandos especficos para receb-los.
A fase de preparao, conhecida como enumerao, acontece logo depois de quando
o dispositivo USB fisicamente conectado ao computador. Nesse momento, o sistema
operacional realiza vrios pedidos ao dispositivo para que as caractersticas de
funcionamento sejam reconhecidas. O sistema operacional, com a obtida noo do
perifrico USB, atribui-lhe um endereo e seleciona a configurao mais apropriada de
acordo com certos critrios. Com mensagens de confirmao do dispositivo indicando que
essas duas ltimas operaes foram corretamente aceitas, a enumerao finalizada e o
sistema fica pronto para o uso.
MTODOS DE COMUNICAO USB
Os mtodos mais comuns de comunicao USB, tambm utilizados pela ferramenta
SanUSB, so:

[ 15 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Human Interface Device (HID) - O dispositivo USB reconhecido automaticamente


pelo sistema operacional Windows@ ou linux como um Dispositivo de Interface Humana
(HID), no sendo necessrio a instalao de driver especiais para a aplicao. Este
mtodo apresenta velocidade de comunicao de at 64 kB/s e utilizado pelo
gerenciador de gravao da ferramenta SanUSB no linux. Mais detalhes na video-aula
disponivel em http://www.youtube.com/watch?v=h6Lw2qeWhlM .
Communication Device Class (CDC) Basicamente o driver emula uma porta COM,
fazendo com que a comunicao entre o software e o firmware seja realizada como se
fosse uma porta de comunicao serial padro. o mtodo mais simples de comunicao
bidirecional com velocidade de comunicao de at 115 kbps, ou seja, aproximadamente
14,4 kB/s. Mais detalhes em uma aplicao Windows com protocolo Modbus RTU
http://www.youtube.com/watch?v=KUd1JkwGJNk e em uma aplicao de comunicao
bidirecional no Linux http://www.youtube.com/watch?v=cRW99T_qa7o.
Mass Storage Device (MSD) - Mtodo customizado para
dispositivos de
armazenamento em massa que permite alta velocidade de comunicao USB, limitado
apenas pela prpria velocidade do barramento USB 2.0 (480 Mbps). Este mtodo
utilizado por pen-drives, scanners, cmeras digitais. Foi utilizado juntamente com a
ferramenta SanUSB para comunicao com software de superviso programado em Java.
Mais
detalhes
na
video-aula
disponivel
em
http://www.youtube.com/watch?v=Ak9RAl2YTr4.
Como foi visto, a comunicao USB baseada em uma central (host), onde o
computador enumera os dispositivos USB conectados a ele. Existem trs grandes classes
de dispositivos comumente associados a USB: dispositivos de interface humana (HID),
classe de dispositivos de comunicao (CDC) e dispositivos de armazenamento em massa
(MSD). Cada uma dessas classes j possui um driver implementado na maioria dos
sistemas operacionais. Portanto, se adequarmos o firmware de nosso dispositivo para ser
compatvel com uma dessas classes, no haver necessidade de implementar um driver.

Figura 1. 12: Drivers e comunicao.

[ 16 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Nos sitemas operacionais Windows@ e Linux, o modo mais fcil de comunicar com
o PIC USB o CDC, por uma razo simples, os programas para PCs so baseados na
comunicao via porta serial, o que torna o processo ainda mais simples. O mtodo CDC
no Linux e o HID no Windows@ so nativos, ou seja, no necessrio instalar nenhum
driver no sistema operacional para que o PC reconhea o dispositivo.

UTILIZANDO O COMPILADOR C18


E A IDE MPLABX
MULTIPLATAFORMA COM FUNES EM PORTUGUS
1) Instale o MPLABX e o compilador C18. possvel baixar gratuitamente o MPLABX e
a verso C18 Lite para o sistema operacional desejado nos links abaixo.
Importante enfatizar que estas verses so livres e foram testadas com sucesso.
Outras verses podem apresentar erro na compilao e/ou gravao.
Windows:
http://www.4shared.com/get/bJv3s3yc/mplabx-ide-v100a-windows-insta.html
http://www.4shared.com/get/zNr7oYwX/mplabc18-v340-windows-lite-ins.html
Linux:
http://www.4shared.com/get/eThaIjBM/mplabx-ide-v141-linux-installe.html
http://www.4shared.com/get/DYhGwftJ/mplabc18-v340-linux-full-insta.html
Mac OSX:
http://www.4shared.com/get/XXEP5oc8/mplabx-ide-v141-osx-installer.html
http://www.4shared.com/get/eLoh2Vzl/mplabc18-v340.html

2) Para compilar os programas com o C18 e o SanUSB, basta abrir o Projeto1C18.X


em https://dl.dropbox.com/u/101922388/ProjSanUSB1_MPLABX/Projeto1C18.X.zip.
Todos
esses
programas
esto
disponveis
no
Grupo
SanUSB
(www.tinyurl.com/SanUSB).

Depois de instalado possvel abrir o projeto MPLAX clicando em Open


project e escolher o projeto Projeto1C18.X. possvel visualizar o programa com
um duplo clique sobre pisca.c. Para compilar pressione Build and Clean (cone com
martelo e vassoura). Para compilar outros programas.c basta modifica-los ou cri-los
com a extenso .c dentro da mesma pasta do projeto Projeto1C18.X e adicion-los

em Source Files (somente um firmware por vez).

[ 17 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 16. 1: Projeto pisca LED no compilador C18.


FUNES EM PORTUGUS
Este captulo descreve todas as funes em portugus da biblioteca SanUSB no
C18. importante salientar que alm dessas funes, so vlidas as funes padres
ANSI C e tambm as funes do compilador C18 detalhadas na pasta instalada
C:\MCC18\doc. A fim de facilitar o entendimento, as funes SanUSB foram divididas em
oito grupos, definidos por sua utilizao e os perifricos do hardware que esto
relacionadas.
FUNES BSICAS DA APLICAO DO USURIO
Este grupo de funes define a estrutura do programa uma vez que o usurio deve
escrever o programa.c de sua aplicao.
O microcontrolador possui um recurso chamado watchdog timer (wdt) que nada
mais do que um temporizador co-de-guarda contra travamento do programa. Caso seja
habilitado habilita_wdt() na funo principal main(), este temporizador est configurado
para contar aproximadamente um intervalo de tempo de 16 segundos. Ao final deste
intervalo, se a flag limpa_wdt() no for zerada, ele provoca um reset do microcontrolador e
conseqentemente a reinicializao do programa. A aplicao deve permanentemente
zerar a flag limpa_wdt() dentro do lao infinito (while(1)) na funo principal main() em
intervalos de no mximo 16 segundos. Este recurso uma segurana contra qualquer
possvel falha que venha travar o programa e paralisar a aplicao. Para zerar o wdt, o
usurio pode tambm utilizar a funo ClrWdt() do compilador C18.
A seguir esto as caractersticas detalhadas destas funes.

[ 18 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

clock_int_4MHz()
Funo: Habilita o clock para a processador do oscilador interno de 4MHz.
Argumentos de entrada: No h.
Argumentos de sada: No h.
Observaes: O clock padro proveniente do sistema USB interno do PIC de 48MHz
gerado a partir do cristal de 20 MHz. Isto possvel atravs de um multiplicador interno de
clock do PIC. A funo _int_4MHz() habilita, para o processador do microcontrolador, o
oscilador RC interno em 4 MHz que adqua o perodo de incremento dos temporizadores
em 1us. aconselhvel que seja a primeira declarao da funo principal
main().Exemplo:
#include SanUSB1.h
void main (void) {
clock_int_4MHz();
nivel_alto()
Funo: Fora nivel lgico alto (+5V) em uma sada digital.
Argumentos de entrada: Nome da sada digital que ir para nivel lgico alto. Este nome
construdo pelo inicio pin_ seguido da letra da porta e do nmero do pino. Pode ser
colocado tambm o nome de toda a porta, como por exemplo, portb.
Argumentos de sada: No h.
Observaes: No h.
Exemplo:
nivel_alto(pin_b7); //Fora nivel lgico 1 na sada do pino B7
nivel_alto(portb); //Fora nivel lgico 1 em toda porta b
nivel_baixo()
Funo: Fora nivel lgico baixo (0V) em uma sada digital.
Argumentos de entrada: Nome da sada digital que ir para nivel lgico baixo. Este nome
construdo pelo inicio pin_ seguido da letra da porta e do nmero do pino. Pode ser
colocado tambm o nome de toda a porta, como por exemplo, portc.
Argumentos de sada: No h.
Observaes: No h.
Exemplo:
nivel_baixo(pin_b7); //Fora nivel lgico 0 na sada do pino B7
nivel_baixo(portc); //Fora nivel lgico 0 em toda porta c
sada_pino(pino,booleano)
Funo: Acende um dos leds da placa McData.
Argumentos de entrada: Pino que ir receber na sada o valor booleano, valor booleano 0
ou 1.
Argumentos de sada: No h.

[ 19 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Observaes: No h.
Exemplo:
ledpisca=!ledpisca;
saida_pino(pin_b0,ledpisca);

// ledpisca igual ao inverso de ledpisca


// b0 recebe o valor de ledpisca

tempo_us()
Funo: Tempo em mltiplos de 1us.
Argumentos de entrada: Tempo de tempo que multiplica 1 us.
Argumentos de sada: No h.
Observaes: Esta instruo s finalizada ao final do tempo determinado, ou seja, esta
funo paralisa a leitura do programa durante a execuo. Exemplo:
tempo_us(200); //Tempo de 200 us
tempo_ms()
Funo: Tempo em mltiplos de 1 ms.
Argumentos de entrada: Tempo de tempo que multiplica 1 ms.
Argumentos de sada: No h.
Observaes: Esta instruo s finalizada ao final do tempo determinado, ou seja, esta
funo paralisa a leitura do programa durante a execuo. Exemplo:
tempo_ms(500); //Tempo de 500 ms
entrada_pin_xx
Funo: L nivel lgico de entrada digital de um pino.
Argumentos de entrada: No h.
Observaes: Este nome construdo pelo inicio entrada_pin_ seguido da letra da porta e
do nmero do pino.
Exemplo:
ledXOR = entrada_pin_b1^entrada_pin_b2;
pinos b1 e b2

//OU Exclusivo entre as entradas dos

habilita_interrupcao()
Funo: Habilita as interrupes mais comuns do microcontrolador na funo main().
Argumentos de entrada: Tipo de interrupo: timer0, timer1, timer2, timer3, ext0, ext1, ext2,
ad e recep_serial.
Argumentos de sada: No h.
Observaes: As interrupes externas j esto habilitadas com borda de descida. Caso
se habilite qualquer interruo deve-se inserir o desvio _asm goto interrupcao _endasm
na funo void _high_ISR (void){ } da biblioteca SanUSB.h
Exemplo:
habilita_interrupcao(timer0);

[ 20 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

habilita_interrupcao(ext1);
if(xxx_interrompeu)
Funo: Flag que verifica, dentro da funo de tratamento de interrupes, se uma
interrupo especfica ocorreu.
Complemento: timer0, timer1, timer2, timer3, ext0, ext1, ext2, ad e serial.
Argumentos de sada: No h.
Observaes: A flag deve ser zerada dentro da funo de interrupo.
Exemplo:
#programa interrupt interrupcao
void interrupcao()
{
if (ext1_interrompeu)
{
//espera a interrupo externa 1 (em B1)
ext1_interrompeu = 0;
//limpa a flag de interrupo
PORTBbits.RB0 =! PORTBbits.RB0;} //inverte o LED em B0
if (timer0_interrompeu)
{
//espera o estouro do timer0
timer0_interrompeu = 0;
//limpa a flag de interrupo
PORTBbits.RB0 =! PORTBbits.RB0; //inverte o LED em B7
tempo_timer16bits(0,62500); } }
liga_timer16bits(timer,multiplicador)
Funo: Liga os timers e ajusta o multiplicador de tempo na funo main().
Argumentos de entrada: Timer de 16 bits (0,1ou 3) e multiplica que o valor do prescaler
para multiplicar o tempo.
Argumentos de sada: No h.
Observaes: O timer 0 pode ser multiplicado por 2, 4, 6, 8, 16, 32, 64, 128 ou 256. O
Timer 1 e o Timer 3 podem ser multiplicados por 1, 2, 4 ou 8.
Exemplo:
liga_timer16bits(0,16); //Liga timer 0 e multiplicador de tempo igual a 16
liga_timer16bits(3,8); //Liga timer 0 e multiplicador de tempo igual a 8
tempo_timer16bits(timer,conta_us)
Funo: Define o timer e o tempo que ser contado em us at estourar.
Argumentos de entrada: Timer de 16 bits (0,1ou 3) e tempo que ser contado em us (valor
mximo 65536).
Argumentos de sada: No h.
Observaes: O No h.
Exemplo:
habilita_interrupcao(timer0);
liga_timer16bits(0,16);
//liga timer0 - 16 bits com multiplicador (prescaler) 16
tempo_timer16bits(0,62500);
//Timer 0 estoura a cada 16 x 62500us = 1 seg.
habilita_wdt()

[ 21 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Funo: Habilita o temporizador co-de-guarda contra travamento do programa.


Argumentos de entrada: No h.
Argumentos de sada: No h.
Observaes: O wdt inicia como padro sempre desabilitado. Caso seja habilitado na
funo principal main(), este temporizador est configurado para contar aproximadamente
um intervalo de tempo de 16 segundos. Ao final deste intervalo, se a flag limpa_wdt() no
for zerada, ele provoca um reset do microcontrolador e conseqentemente a reinicializao
do programa. Exemplo:
#include SanUSB1.h
void main (void) {
clock_int_4MHz();
habilita_wdt();
//Habilita o wdt
limpaflag_wdt()
Funo: limpa a flag do wdt
Argumentos de entrada: No h.
Argumentos de sada: No h.
Observaes: Caso o wdt seja habilitado, a flag deve ser limpa em no mximo 16
segundos para que no haja reinicializao do programa. Geralmente esta funo
colocada dentro do lao infinito while(1) da funo principal main(). possvel ver detalhes
no programa exemplowdt.c e utilizar tambm a funo ClrWdt() do compilador C18 .
Exemplo:
#include SanUSB1.h
void main (void) {
clock_int_4MHz();
habilita_wdt();
while(1) {
limpaflag_wdt();
.....
.....
tempo_ms(500);
}

escreve_eeprom(posio,valor)
Funo: Escrita de um byte da memria EEPROM interna de 256 bytes do
microcontrolador.
Argumentos de entrada: Endereo da memria entre 0 a 255 e o valor entra 0 a 255.
Argumentos de sada: No h.
Observaes: O resultado da leitura armazenado no byte EEDATA.
Exemplo:
escreve_eeprom(85,09); //Escreve 09 na posio 85
le_eeprom()

[ 22 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Funo: Leitura de um byte da memria EEPROM interna de 256 bytes do


microcontrolador.
Argumentos de entrada: Endereo da memria entre 0 a 255.
Argumentos de sada: No h.
Observaes: O resultado da leitura armazenado no byte EEDATA.
Exemplo:

dado=le_eeprom(85);

FUNES DO CONVERSOR ANALGICO DIGITAL (A/D)


As funes a seguir so utilizadas para a aquisio de dados utilizando as entradas
analgicas.
habilita_canal_AD()
Funo: Habilita entradas analgicas para converso AD.
Argumentos de entrada: Nmero do canal analgico que ir ser lido. Este dado habilita um
ou vrios canais AD e pode ser AN0, AN0_a_AN1 , AN0_a_AN2 , AN0_a_AN3,
AN0_a_AN4, AN0_a_AN8, AN0_a_AN9, AN0_a_AN10, AN0_a_AN11, ou AN0_a_AN12.
Argumentos de sada: No h.
Observaes: No h.
Exemplo:
habilita_canal_AD(AN0); //Habilita canal 0
le_AD8bits()
Funo: Leitura de uma entrada analgica com 8 bits de resoluo.
Prototipagem: unsigned char analog_in_8bits(unsigned char).
Argumentos de entrada: Nmero do canal analgico que ir ser lido. Este nmero pode ser
0, 1 , 2 , 3, 4, 8, 9, 10, 11 ou 12.
Argumentos de sada: Retorna o valor da converso A/D da entrada analgica com
resoluo de 8 bits.
Observaes: No h.
Exemplo:
PORTB = le_AD8bits(0); //L canal 0 da entrada analgica com resoluo de 8 bits e
coloca na porta B
le_AD10bits()
Funo: Leitura de uma entrada analgica com 8 bits de resoluo.
Prototipagem: unsigned char analog_in_8bits(unsigned char).
Argumentos de entrada: Nmero do canal analgico que ir ser lido. Este nmero pode ser
0, 1 , 2 , 3, 4, 8, 9, 10, 11 ou 12.
Argumentos de sada: Retorna o valor da converso A/D da entrada analgica com
resoluo de 10 bits.

[ 23 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Observaes: No h.
Exemplo:
resultado = le_AD10bits(0);//L canal 0 da entrada analgica com resoluo de 10 bits

FUNES DA COMUNICAO SERIAL RS-232


As funes a seguir so utilizadas na comunicao serial padro RS-232 para
enviar e receber dados, definir a velocidade da comunicao com o oscilador interno
4MHz.
As configuraes da comunicao so: sem paridade, 8 bits de dados e 1 stop bit. Esta
configurao denominada 8N1 e no pode ser alterada pelo usurio.

taxa_serial();
Funo: Configura a taxa de transmisso/recepo (baud rate) da porta RS-232
Argumentos de entrada: Taxa de transmisso/recepo em bits por segundo (bps)
Argumentos de sada: No h.
Observaes: O usurio deve obrigatoriamente configurar taxa_rs232() da comunicao
assncrona antes de utilizar as funes le_serial e escreve_serial. As taxas programveis
so 1200 bps, 2400 bps, 9600 bps, 19200 bps.
Exemplo:
void main() {
clock_int_4MHz();
habilita_interrupcao(recep_serial);
taxa_rs232(2400); // Taxa de 2400 bps
while(1); //programa normal parado aqui

le_serial();
Funo: L o primeiro caractere recebido que est no buffer de recepo RS-232.
Argumentos de entrada: No h.
Argumentos de sada: No h.
Observaes: Quando outro byte recebido, ele armazenado na prxima posio livre
do buffer de recepo, cuja capacidade de 16 bytes. Exemplo:
#pragma interrupt interrupcao
void interrupcao()
{ unsigned char c;
if (serial_interrompeu) {
serial_interrompeu=0;
c = le_serial();
if (c >= '0' && c <= '9')
{ c -= '0';

PORTB = c;} }}

[ 24 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

escreve_serial();
Funo: Transmite um byte pela RS-232.
Argumentos de entrada: O dado a ser transmitido deve ser de 8 bits do tipo char.
Argumentos de sada: No h.
Observaes: A funo escreve_serial no aguarda o fim da transmisso do byte. Como
no existe um buffer de transmisso o usurio deve garantir a transmisso com a funo
envia_byte( ) para enviar o prximo byte.
Exemplo:
escreve_serial('SanUSB'); // escreve SanUSB
while (envia_byte());
Caso ocorra o errosanusb Error: Odd address at beginning of HEX file line error,
compile e grave o firmware bsico pisca.c e tente novamente compilar e gravar o firmware
desejado.

FERRAMENTA DE GRAVAO VIA USB


O sistema de desenvolvimento SanUSB uma ferramenta composta de software e
hardware bsico da famlia PIC18Fxx5x com interface USB. Esta ferramenta livre se
mostra eficiente no desenvolvimento rpido de projetos reais, pois no h necessidade de
remover o microcontrolador para a atualizao do firmware. Alm disso, esta ferramenta se
mostra eficaz no ensino e na difuso de microcontroladores, bem como em projetos de
eletrnica e informtica, pois todos os usurios podem desenvolver projetos reais no
ambiente de ensino ou na prpria residncia sem a necessidade de um equipamento para
gravao de microcontroladores. Alm disso, o software de gravao de
microcontroladores USB multiplataforma, pois executvel no Windows@, Mac OSX e
no Linux e tambm plug and play, ou seja, reconhecido automaticamente pelos sistemas
operacionais sem a necessidade de instalar nenhum driver. Dessa forma, ela capaz de
suprimir:

Um equipamento especfico para gravao de um programa no microcontrolador;


conversor TTL - RS-232 para comunicao serial bidirecional, emulado via USB
pelo protocolo CDC, que permite tambm a depurao do programa atravs da
impresso via USB das variveis do firmware;
fonte de alimentao, j que a alimentao do PIC provm da porta USB do PC.
importante salientar que cargas indutivas como motores de passo ou com corrente
acima de 400mA devem ser alimentadas por uma fonte de alimentao externa.
Conversor analgico-digital (AD) externo, tendo em vista que ele dispe
internamente de 10 ADs de 10 bits;
software de simulao, considerando que a simulao do programa e do hardware
podem ser feitas de forma rpida e eficaz no prprio circuito de desenvolvimento ou
com um protoboard auxiliar.

[ 25 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Alm de todas estas vantagens, os laptops e alguns computadores atuais no


apresentam mais interface de comunicao paralela e nem serial EIA/RS-232, somente
USB.
Como pode ser visto, esta ferramenta possibilita que a compilao, a gravao e a
simulao real de um programa, como tambm a comunicao serial atravs da emulao
de uma porta COM sem fio, possam ser feitos de forma rpida e eficaz a partir do
momento em o microcontrolador esteja conectado diretamente a um computador via USB.

Figura 2. 1: Gravao do PIC via PC.


Utilizando esta ferramenta, estudantes foram trs vezes consecutivas campees da
Competio de Robtica do IFCE (2007, 2008 e 2009) na categoria Localizao,
campees da Feira Brasileira de Cincias e Engenharia (FEBRACE09) da USP em So
Paulo na Categoria Engenharia (2009), como tambm obtiveram Prmio de Inovao em
Aplicao Tecnolgica na Feria Explora 2009 em Medelin na Colmbia e foram Campees
na Categoria Supranivel do Foro Internacional de Ciencia e Ingeniera 2010 no Chile,
terceiro lugar em inovao na Semantec 2011 do IFCE e campees na V Feira Estadual de
Cincias e Cultura do Cear na categoria robtica educacional em 2011.
2.1 GRAVAO DE MICROCONTROLADORES
A transferncia de programas para os microcontroladores normalmente efetuada
atravs de um hardware de gravao especfico. Atravs desta ferramenta, possvel
efetuar a descarga de programas para o microcontrolador diretamente de uma porta USB
de qualquer PC.
Para que todas essas funcionalidades sejam possveis, necessrio gravar, anteriormente
e somente uma vez, com um gravador especfico para PIC, o gerenciador de gravao
pela USB Gerenciador.hex disponivel na pasta completa da ferramenta no link abaixo,
onde tambm possvel baixar periodicamente as atualizaes dessa ferramenta e a
incluso de novos programas: https://dl.dropbox.com/u/101922388/121007SanUSBOrig.zip
Caso o computador ainda no o tenha o aplicativo Java JRE ou SDK instalado para
suporte a programas executveis desenvolvidos em Java, baixe a Verso Windows@

[ 26 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

disponivel em: http://www.4shared.com/file/WKDhQwZK/jre-6u21-Windows@-i586-s.html


ou atravs do link: http://www.java.com/pt_BR/download/manual.jsp.
Para que os programas em C possam ser gravados no microcontrolador via USB,
necessrio compil-los, ou seja, transform-los em linguagem de mquina hexadecimal.
Existem diversos compiladores que podem ser utilizados por esta ferramenta, entre eles o
SDCC, o MPLABXX C18, o Hi-Tech e o CCS. Para compilar com o MPLAX + C18 Lite

e a placa SanUSB em Linux, Windows ou Mac OSX simples. Inicialmente, basta


instalar normalmente o MPLABX e o C18 Lite para o S.O. desejado
(http://www.microchip.com/pagehandler/en-us/family/MPLABXx/#downloads).Depois
de
instalado basta abrir o MPLAX e clicar em Open project e escolher um projeto
descompactado.X, como em
https://dl.dropbox.com/u/101922388/PWM_AD_Serial.zip.Este projeto j pisca um led no
pino B7 e faz a leitura do AD no pino A0 e envia pela serial como no
video:http://www.youtube.com/watch?v=lB21b3zA4Ac.
Para modificar o programa exemplo, altere o PWM_AD_serial.c e clique em
Clean und Build Project (cone que tem um martelo e uma vassoura,)
O arquivo compilado Projeto1C18.hex, para gravao via USB, est sempre dentro
de PWM_AD_Serial/Projeto1C18.X/dist/default/production
Este exemplo, bem como muitos outros, foram compilados em Linux,
Windows e Mac OSX, e funcionou normalmente.
A representao bsica do circuito SanUSB montado em protoboard mostrada a
seguir:

Figura 2. 2: Esquemtico de montagem da Ferramenta para 28 pinos.


Para um microcontrolador de 40 pinos, o circuito mostrado abaixo:

[ 27 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 2. 3: Esquemtico de montagem da ferramenta para 40 pinos.


Os componentes bsicos do circuito so:
1 microcontrolador da famlia PIC USB (18F2550, 18F2455, 18F4550, etc.);
1 cristal de 20MHz;
2 capacitores de 22pF;
2 capacitores de 1uF (um no pino 14 Vusb e outro entre o +5V e o Gnd ) ;
3 leds e 3 resistores de 390 (s necessrio um led com resistor no pino B7);
1 resistor de 2k2 e um boto ou fio para gravao no pino 1;
1 diodo qualquer entre o +5V e o o pino Vdd;
1 Cabo USB qualquer.
Note que, este sistema multiplataforma(Linux, Windows@ e Mac OSX),
compatvel com o software de gravao HID USB da Microchip tambm para Linux e
Mac OSX, pode ser implementado tambm em qualquer placa de desenvolvimento
de microcontroladores PIC com interface USB, pois utiliza o boto de reset, no pino 1,
como boto de gravao via USB. Ao conectar o cabo USB e alimentar o microcontrolador,
com o pino 1 no Gnd (0V), atravs do boto ou de um simples fio, o microcontrolador entra
em Estado para Gravao via USB (led no pino B7 aceso) e que, aps o reset com o pino
1 no Vcc (+5V atravs do resistor fixo de 2K2 sem o jump), entra em Estado para
Operao do programa aplicativo (firmware) que foi compilado.
O cabo USB apresenta normalmente quatro fios, que so conectados ao circuito do
microcontrolador nos pontos mostrados na figura acima, onde normalmente, o fio Vcc
(+5V) do cabo USB vermelho, o Gnd (Vusb-) marrom ou preto, o D+ azul ou verde e
o D- amarelo ou branco. Note que a fonte de alimentao do microcontrolador nos pinos
19 e 20 e dos barramentos vermelho (+5V) e azul (Gnd) do circuito provem da prpria
porta USB do computador. Para ligar o cabo USB no circuito possvel cort-lo e conectlo direto no protoboard, com fios rgidos soldados, como tambm possvel conectar sem
cort-lo, em um protoboard ou numa placa de circuito impresso, utilizando um conector
USB fmea. O diodo de proteo colocado no pino 20 entre o Vcc da USB e a alimentao

[ 28 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

do microcontrolador serve para proteger contra corrente reversa caso a tenso da porta
USB esteja polarizada de forma inversa.
A figura abaixo mostra a ferramenta SanUSB montada em protoboard seguindo o
circuito anterior e a posio do apdaptador USB a ser ligado no PC via cabo. Voc pode
ligar de qualquer um dos lados do conector USB, observando a descrio.

Figura 2. 4: Esquema montado em protoboard e conector USB.


importante salientar que, para o perfeito funcionamento da gravao via USB, o
circuito desta ferramenta deve conter um capacitor de filtro entre 0,1uf e 1uF na
alimentao que vem da USB, ou seja, colocado entre os pinos 20 (+5V) e 19 (Gnd) ou no
barramento + e da protoboard..
Caso o sistema microcontrolado seja embarcado como, por exemplo, um rob, um
sistema de aquisio de dados ou um controle de acesso, ele necessita de uma fonte de
alimentao externa, que pode ser uma bateria comum de 9V ou um carregador de celular.
A figura abaixo mostra o PCB, disponivel nos Arquivos do Grupo SanUSB, e o circuito para
esta ferramenta com entrada para fonte de alimentao externa. Para quem deseja obter
o sistema pronto para um aprendizado mais rpido, possvel tambm encomendar placas
de circuito impresso da ferramenta SanUSB, como a foto da placa abaixo, entrando em
contato com o grupo SanUSB atravs do e-mail: sanusb_laese@yahoo.com.br .

Figura 2. 5: Esquema montado em PCB.

[ 29 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Se preferir confeccionar a placa, possvel tambm imprimir, em folha de


transparncia, o PCB e o silk configurado em tamanho real, como mostra a figura 2.6,
transferir para a placa de cobre, corroer, furar e soldar os componentes. Mais detalhes no
vdeo disponivel em: http://www.youtube.com/watch?v=Xm8YJ_XaGA8.

Figura 2. 6: PCB da Ferramenta SanUSB.


Para obter vrios programas-fonte e vdeos deste sistema livre de gravao,
comunicao e alimentao via USB, basta se cadastrar no grupo de acesso livre
www.tinyurl.com/SanUSB e clicar no item Arquivos.
Durante a programao do microcontrolador basta abrir com o MPLABXX o projeto
Projeto1.C18.X j configurado. A biblioteca SanUSB1.h contm funes bsicas para o
compilador, habilitao do sistema Dual Clock, ou seja, oscilador RC interno de 4 MHz
para CPU e cristal oscilador externo de 20 MHz para gerar a frequncia de 48MHz da
comunicao USB, atravs de prescaler multiplicador de frequncia.
Como a frequncia do oscilador interno de 4 MHz, cada incremento dos
temporizadores corresponde a um microssegundo. O programa exemplo1 abaixo comuta
umled conectado no pino B7 a cada 0,5 segundo.
---------------------------------------------------------------------------------------------------------------

[ 30 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

PRTICA 1 PISCA LED

Aps montar o circuito da Ferramenta SanUSB (ver figura abaixo), deve-se iniciar a
sequncia de prticas.

Figura 2. 7: Circuito bsico da Ferramenta SanUSB.


Neste exemplo o objetivo piscar um LED de forma temporizada a cada 0,5
segundos, sem o auxlio de chaves ou botes. Para isso utiliza-se uma nica sada do
PIC18F2550, que pode ser, por exemplo, o pino 28 (referncia B7). Esta sada por sua vez
est ligada ao Anodo de um LED com um resistor no valor de 100 ohm a 1k em srie,
como mostrado na Figura xx. O catodo do LED deve ser aterrado como na Figura.
Programao em Linguagem C:
#include "SanUSB1.h"
#pragma interrupt interrupcao //Tem que estar declarado no firmware.c
void interrupcao(){
}
void main(){
clock_int_4MHz();

while (1){//lao infinito


nivel_alto(pin_b7); //coloca a sada B7 em nivel lgico alto, ou seja, acende LED
tempo_ms(500);//aguarda 500 milissegundos = 0,5 segundos
nivel_baixo(pin_b7); //coloca a sada B7 em nivel lgico baixo, ou seja, apaga LED
tempo_ms(500); //aguarda 500 milissegundos = 0,5 segundos
} //fim while
} }//fim main

[ 31 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Como a frequncia do oscilador interno de 4 MHz, cada incremento dos temporizadores


corresponde a um microssegundo. O programa exemplo1 abaixo comuta um led conectado
no pino B7 a cada 0,5 segundo com a funo inverte_saida().
#include "SanUSB1.h"
#pragma interrupt interrupcao
void interrupcao(){}
void main(){
clock_int_4MHz();//Funo necessria para habilitar o dual clock (48MHz para USB e 4MHz para
CPU)
while (1) {
inverte_saida(pin_b7); // comuta Led na funo principal
tempo_ms(500);
}}

Figura 5. 1: Prtica 1 - Pisca LED, montada em protoboard.

[ 32 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Para modificar o tempo de pisca do LED necessrio alterar o valor 500 entre
parnteses na funo tempo, como por exemplo para: tempo_ms(1000);
Com esta nova programao, o LED piscar a cada 1 segundo, considerando que o
comando est em milissegundos.

OBS: para inserir comentrios no programa, deve-se inserir antes: //

Pode-se reduzir o programa em linguagem C substituindo as funes:

nivel_alto(pin_b7); //coloca a sada B7 em nivel lgico alto, ou seja, acende LED


tempo_ms(500);//aguarda 500 milissegundos = 0,5 segundos
nivel_baixo(pin_b7); //coloca a sada B7 em nivel lgico baixo, ou seja, apaga LED
tempo_ms(500); //aguarda 500 milissegundos = 0,5 segundos

Pelas funes:

Inverte_saida(pin_b7); //alterna pino B7 entre nivel lgico baixo e alto: pisca o LED
tempo_ms(500); //aguarda 500 milissegundos = 0,5 segundos

PRTICA 2 PISCA 3 LEDS


Considerando o aprendizado das funes da prtica 1, o professor deve solicitar aos
alunos que insiram mais 2 LEDs ao circuito SanUSB (pinos b6 e b5, por exemplo) e
programem o PIC para piscar os 3 LEDs em sequncia.

[ 33 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 5. 2: Esquemtico Prtica 2.

Figura 5. 3: Prtica

[ 34 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 5. 4: Prtica 2 - Pisca 3 LEDs, montada em protoboard.

O cdigo abaixo uma sugesto:


#include "SanUSB1.h"

#pragma interrupt interrupcao //Tem que estar declarado no firmware.c


void interrupcao(){
}
void main(){

clock_int_4MHz();
while (1) { //LAO INFINITO
nivel_alto(pin_b7); //SAIDA ALTA NO PINO B7 - LED ACENDE
tempo_ms(500); //ATRASO 0,5 SEG
nivel_baixo(pin_b7); //SAIDA BAIXA NO PINO B7 - LED APAGA

[ 35 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

tempo_ms(500); //ATRASO 0,5 SEG


nivel_alto(pin_b6); //SAIDA ALTA NO PINO B6 - LED ACENDE
tempo_ms(500); //ATRASO 0,5 SEG
nivel_baixo(pin_b6); //SAIDA BAIXA NO PINO B6 - LED APAGA
tempo_ms(500); //ATRASO 0,5 SEG
nivel_alto(pin_b5); //SAIDA ALTA NO PINO B5 - LED ACENDE
tempo_ms(500); //ATRASO 0,5 SEG
nivel_baixo(pin_b5); //SAIDA BAIXA NO PINO B5 - LED APAGA
tempo_ms(500); //ATRASO 0,5 SEG
}}

O professor deve solicitar aos alunos que alterem a frequncia de pisca do LED.
Como exerccio para avaliar o aprendizado, deve ser solicitado que elaborem um
programa para piscar o LED do pino b7 uma vez a cada 1 segundo, o LED do pino b6 duas
vezes a cada 0,5 segundos e o LED do pino b5 trs vezes a cada 0,1 segundos, utilizando
apenas as funes vistas at o momento.
Aps isto deve ser passado aos alunos o conceito de lao de repetio finito, como o
exemplo a seguir que usa a funo FOR.

#include "SanUSB1.h"

#pragma interrupt interrupcao //Tem que estar declarado no firmware.c


void interrupcao(){
}
void main(){

clock_int_4MHz();
while (1){//LAO INFINITO
nivel_alto(pin_b7); //SAIDA ALTA NO PINO B7 - LED ACENDE
tempo_ms(1000); //ATRASO 0,5 SEG
nivel_baixo(pin_b7); //SAIDA BAIXA NO PINO B7 - LED APAGA
tempo_ms(1000); //ATRASO 0,5 SEG

[ 36 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

for (x=0;x<2;x++) {//LAO DE REPETIO POR 2 VEZES


nivel_alto(pin_b6); //SAIDA ALTA NO PINO B6 - LED ACENDE
tempo_ms(500); //ATRASO 0,5 SEG
nivel_baixo(pin_b6); //SAIDA BAIXA NO PINO B6 - LED APAGA
tempo_ms(500); //ATRASO 0,5 SEG
}
for (x=0;x<3;x++){//LAO DE REPETIO POR 3 VEZES
nivel_alto(pin_b5); //SAIDA ALTA NO PINO B5 - LED ACENDE
tempo_ms(100); //ATRASO 0,5 SEG
nivel_baixo(pin_b5); //SAIDA BAIXA NO PINO B5 - LED APAGA
tempo_ms(100); //ATRASO 0,5 SEG
}

Tambm possvel utilizar a funo WHILE, como no exemplo xx:


#include "SanUSB1.h"
int x=0,y=0;//reseta variveis para iniciar a contagem
#pragma interrupt interrupcao //Tem que estar declarado no firmware.c
void interrupcao(){
}
void main(){

clock_int_4MHz();
int x=0,y=0;// declarao de variveis auxiliares de nome 'x' e y do tipo inteiro
void main(){//PROGRAMA PRINCIPAL
while (1){//LAO INFINITO

[ 37 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

nivel_alto(pin_b7);//SAIDA ALTA NO PINO B7 - LED ACENDE


tempo_ms(1000);//ATRASO 0,5 SEG
nivel_baixo(pin_b7);//SAIDA BAIXA NO PINO B7 - LED APAGA
tempo_ms(1000);//ATRASO 0,5 SEG

while (x<2){//enquanto a varivel x for menor que 2, repete o ciclo


nivel_alto(pin_b6);//SAIDA ALTA NO PINO B6 - LED ACENDE
tempo_ms(500);//ATRASO 0,5 SEG
nivel_baixo(pin_b6);//SAIDA BAIXA NO PINO B6 - LED APAGA
tempo_ms(500);//ATRASO 0,5 SEG
x++;}//INCREMENTA VARIVEL x DE UM EM UM
while (y<3){//enquanto a varivel y for menor que 3, repete o ciclo
nivel_alto(pin_b5);//SAIDA ALTA NO PINO B5 - LED ACENDE
tempo_ms(100);//ATRASO 0,5 SEG
nivel_baixo(pin_b5);//SAIDA BAIXA NO PINO B5 - LED APAGA
tempo_ms(100);//ATRASO 0,5 SEG
y++;//INCREMENTA VARIVEL y DE UM EM UM
} }}
Os arquivos compilados .hex assim como os firmwares esto disponveis em
https://dl.dropbox.com/u/101922388/ProjSanUSB1_MPLABX/Projeto1C18.X.zip.
Abaixo um exemplo de firmware para rotacionar leds na porta B.
#include "SanUSB1.h" //rotacionar leds
unsigned char d=0b10000000; // 8 bits
#pragma interrupt interrupcao //Tem que estar dentro do firmware.c
void interrupcao(){ }
void main(){
clock_int_4MHz();
TRISB=0; // porta B como sada
while(1)
{
if(!entrada_pin_e3){Reset();}//pressionar o boto para gravao via USB
d=d>>1; if (d == 0b00000001) {d=0b10000000;} //0b -> valor binrio
PORTB=d;
tempo_ms(100);

[ 38 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

}}

Figura 1: Esquemtico Sequencial de LEDs usando o Port B.

[ 39 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 2: Botes b0b1 com placa SanUSB.

2.2 GRAVANDO O MICROCONTROLADOR VIA USB NO WINDOWS

Para executar a gravao com a ferramenta SanUSB, importante seguir os


seguintes passos:
1. Baixe o a pasta da ferramenta de desenvolvimento SanUSB, para um diretrio
raiz C ou D, obtida no link
https://dl.dropbox.com/u/101922388/121007SanUSBOrig.zip.
2. Grave no microcontrolador, somente uma vez, com um gravador especfico para
PIC ou com um circuito simples de gravao ICSP mostrado nas prximas
sees, o novo gerenciador de gravao pela USB GerenciadorPlugandPlay.hex
disponivel na pasta Gerenciador, compatvel com os sistemas operacionais
Windows@, Linux e Mac OSX.
3. Pressione o boto ou conecte o jump de gravao do pino 1 no Gnd para a
transferncia de programa do PC para o microcontrolador.
4. Conecte o cabo USB, entre o PIC e o PC, e solte o boto ou retire o jump. Se o
circuito SanUSB estiver correto acender o led do pino B7.
5. Caso o computador ainda no o tenha o aplicativo Java JRE ou SDK instalado
para suporte a programas executveis desenvolvidos em Java, baixe a Verso
Windows@ disponivel em: http://www.4shared.com/file/WKDhQwZK/jre-6u21Windows@-i586-s.html ou atravs do link:
http://www.java.com/pt_BR/download/manual.jsp e execute o aplicativo SanUSB
da pasta SanUSBwinPlugandPlay. Surgir a seguinte tela:

[ 40 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 2. 8: Interface de gravao do microcontrolador via USB.


6.

Clique em Abrir e escolha o programa .hex que deseja gravar, como por exemplo, o
programa compilado exemplo1.hex da pasta ExemploseBibliotecasSanUSB e clique
em Gravar. Este programa pisca o led conectado no pino B7;

7.

Aps a gravao do programa, lembre-se de soltar o boto ou retirar o jump do pino


de gravao e clique em Resetar. Pronto o programa estar em operao. Para
programar novamente, repita os passos anteriores a partir do passo 3.
Para proteger o executvel sanusb de excluso do anti-virus, como por exemplo, o
AVG, basta ir em ProteoResidente do anti-virus AVG:

[ 41 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Clicar em gereciar execesses, como na figura abaixo:

Clicar em Gerenciar Excees e adicionar caminho. Ento inserir o caminho do executvel


que em C:\Program Files\SanUSB ou em C:\Arquivos de Programas\SanUSB e clicar em
OK.

[ 42 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Pronto isso. Para reinstalar o executvel da subpasta SanUSBwinPlugandPlay , basta


instal-lo de dentro do arquivo .zip ou .rar.
2.3 GRAVAO WIRELESS DE MICROCONTROLADORES
A gravao wireless descrita nesta apostila pode ser feita com modems Zigbee ou
Bluetooth. Para a gravao Zigbee so utlizados dois mdulos XBee da Srie 1 (S1). De
um lado, um mdulo conectado a um PC coordenador conectado ao PC via USB do PC
atravs do chip FTDI FT232RL ou atravs de uma porta serial real com o MAX-232 e, do
outro lado da rede, um mdulo Zigbee conectado ao microcontrolador do dispositivo final.
Esta conexo permite a programao sem fio no microcontrolador PIC. Programas
disponveis em: http://www.4shared.com/get/aP17n4FT/sanusbee.html
Abaixo uma ilustrao para realizar gravao de microcontrolador de forma wireless
com tenso de alimentao de 3,3V.

Figura 2. 9: Ilustrao do circuito de gravao wireless Zigbee.

Para mais detalhes basta acompanhar os vdeos Gravao sem fio de microcontroladores
http://www.youtube.com/watch?v=_Pbq2eYha_c
microcontroladores

via

Zigbee:

Gravao

sem

fio

de

http://www.youtube.com/watch?v=BlRjKbXpepg.

Procedimento para gravao wireless:

[ 43 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

1- Circuito bsico: Conecte o mdulo Xbee ao microcontrolador da placa SanUSB


(www.tinyurl.com/SanUSB), com alimentao entre 3V e 3,6V e apenas 4 fios: Vcc (3,3V),
Gnd, Tx e Rx, como mostra a figura abaixo. Na figura, o fio vermelho ligado ao pino 20
(Vcc) do microcontrolador e ao pino 1 (Vcc) do modem Zigbee, o fio azul ligado ao 19
(Gnd) do microcontrolador e ao pino 10 (Gnd) do modem Zigbee, o fio laranja ligado ao
pino 18 (Rx) do microcontrolador e ao pino 2 (DOUT) do modem Zigbee, e o fio amarelo
ligado ao 17 (Tx) do microcontrolador e ao pino 3 (DIN) do modem Zigbee.
2- Configurao dos Mdulos: A gravao wireless s vai acontecer se os mdulos
Xbee da srie 1 (coordenador e dispositivo final) estiverem configurados com o mesmo
baud rate do microcontrolador (19200 bps). Para o coordenador, basta conectar, o mdulo
coordenador ao microcontrolador, ver circuito bsico acima, gravar via USB e examinar em
qual firmware (ConfigCoord9600to19200.hex ou ConfigCoord19200to19200.hex) o led no
pino B7 ir piscar intermitentemente. Se o led no piscar, provavelmente existe um erro na
ligao do circuito. Aps a configurao, coloque o mdulo Coordenador no conversor
USB-serial e conecte ao PC.
Faa posteriormente o mesmo para o mdulo Dispositivo final, gravando o firmware
(ConfigDispFinal9600to19200.hex

ou

ConfigDispFinal19200to19200.hex)

deixe-o

conectado ao microcontrolador. Quando o led do pino B7 estiver piscando, significa que os


mdulos esto conectados corretamente e esto aptos para gravao wireless.

Figura 2. 10: Gravao via USB de Configurao wireless.

[ 44 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

3- Adaptador Wireless: Agora grave, novamente via USB, o firmware AdaptadorSerial.hex


da pasta AdaptadorWireless. Se, aps a gravao do Adaptador, apresentar o erro Odd
address at beginning of HEX file error, como na figura abaixo, necessrio gravar
novamente o gerenciador.hex, com qualquer gravador especifico (ver tutorial), e em
seguida,

realizar

novamente

gravao

via

USB

do

firmware

aplicativo

AdaptadorSerial.hex. Aps a transferncia deste firmware, o microcontrolador est apto


para gravao wireless.

Figura 2. 11: Gravao via USB de Adaptador wireless.


Agora basta acessar a pasta sanusbee pelo Prompt do Windows@ (Iniciar ->
Pesquisar -> Prompt de Comando), como na figura abaixo, e digitar, como mostrado no
vdeo Gravao sem fio de microcontroladores via Zigbee, as linhas de comando, para
transferir os programas aplicativos.hex como o Exemplo1wireless.hex contido na pasta
sanusbee.
Exemplo:
sanusbee Exemplo1Wireless.hex p COM2

[ 45 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 2. 12: Gravao wireless zigbee pelo prompt do Windows.


A gravao wireless Bluetooth pode ser realizada com apenas um mdulo
Bluetooth conectado ao microcontrolador, pois normalmente no PC coordenador, como em
laptops e desktops, j existe um mdulo bluetooth interno. A tenso do mdulo Bluetooth
encapsulado, mostrado na figura abaixo, suporta at 6V, diferentemente do mdulo Xbee
que suporta de 3,3V. Dessa forma, pode-se conectar o mdulo Bluetooth diretamente ao
microcontrolador alimentado pela tenso da porta USB de 5V.
De um lado um PC coordenador e, do outro lado da rede, um mdulo bluetooth
conectado ao microcontrolador do dispositivo final. Esta conexo permite a programao
sem

fio

no

microcontrolador

PIC.

Os

Programas

esto

disponveis

em:

http://www.4shared.com/get/aP17n4FT/sanusbee.html. Neste link em anexo: http://sanusblaese.wix.com/robotica#!produtos/productsstackergalleryv20=1,

pode

ser

adquirido

modem Bluetooth mostrado neste tutorial.


Abaixo uma ilustrao para realizar gravao de microcontrolador de forma wireless
Bluetooth com tenso de alimentao de 5V.

[ 46 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 2. 13: Ilustrao do Circuito de gravao wireless Bluetooth.

Figura 3: Esquema mdulo BLUETOOTH com placa SanUSB 4550.


Deve-se conectar da seguinte forma:

[ 47 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

PLACA SANUSB MDULO BLUETOOTH


VCC (+5V) +
GND (0V) RX
TX

VCC
GND
TX
RX

Como seu mdulo Bluetooth j foi configurado pelo Grupo SanUSB ou pela
RComponentes, ser necessrio apenas plug-lo placa e colocar o cabo USB para
gravao do firmware. O seguinte cdigo em C aciona um LED/rel conectado ao pino B7
via Bluetooth utilizando as Letras L para ligar, D para desligar e P para piscar. Lembre-se
que as letras so maisculas, mas voc pode alterar na programao.
Mas onde digitar? Caso esteja usando smartphone/tablet Android, deve-se instalar o
nosso aplicativo, enviado por e-mail e disponvel no Grupo SanUSB ou algum outro
disponvel na playstore em que seja possvel enviar/receber dados de forma serial. Caso
esteja utilizando Windows, ou seja, queira usar o Bluetooth do PC, tambm possvel,
para isso instale ou TERMINAL ZUCHI, ou algum outro semelhante. Para mais
informaes entre em contato com o grupo sanusb www.tinyurl.com/SanUSB .
CLCULO DE TAXA DE TRANSMISSO SERIAL NO MODO ASSNCRONO
Vamos analisar a tabela abaixo:

Nas frmulas da tabela acima, o valor de n inserido no registro SPBRG. possvel gerar
com 4 MHz na condio (bits BRG16=0 e BRGH=1) tanto 9600 bps como tambm 19200
bps, pois neste caso de 8 bits (bits BRG16=0 e BRGH=1), o valor de n obtido na frmula
pode ser colocado somente em um byte, no SPBRG.
MODO 8 BITS
Para 19200: SPBRG = n= ( 4.000.000 / 19200 / 16 ) - 1 =>SPBRG = 12;
Para 9600: SPBRG = n= ( 4.000.000 / 9600 / 16 ) - 1 =>SPBRG = 25;
Considerando agora uma frequncia de clock de 48 MHz na condio (bits BRG16=0 e
BRGH=1):
Para 19200:SPBRG = n= ( 48.000.000 / 19200 / 16 ) - 1 =>SPBRG = 155;
Para 9600: SPBRG = n= ( 48.000.000 / 9600 / 16 ) - 1 = SPBRG = 311;

[ 48 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

MODO 16 BITS
Como em 9600bps 48MHz, o SPBRGH 311, ou seja, maior que 255, no possvel
utilizar somente um byte. Por isso necessrio habilitar o byte baixo SPBRG, setando o
bit BRG16 em BAUDCON, entrando na condio de 16 bits assncrono (bits BRG16=1 e
BRGH=1). Calculando agora os valores na frmula de 16 bits, tem-se que:
Para 19200 e 48 MHz: n=( 48.000.000 / 19200 / 4 ) - 1 = 624 = 0x270 ->
SPBRGH = 0x02;
SPBRG=0x70;
Para 9600 e 48 MHz: n=( 48.000.000 / 9600 / 4 ) - 1 = 1249 = 0x4E1->
SPBRGH = 0x04;
SPBRG=0xE1;
Para 19200 e 4 MHz: n=( 48.000.000 / 19200 / 4 ) - 1 = 624 = 0x33 ->
SPBRGH = 0x00;
SPBRG=0x33;
Para 9600 e 4 MHz: n=( 48.000.000 / 9600 / 4 ) - 1 = 1249 = 0x67->
SPBRGH = 0x00;
SPBRG=0x67;

Deste modo, possvel utilizar a seguinte funo em C18 para 19200 bps com frequncia
de 4MHz e de 48MHz no modo de 16 bits:
void taxa_serial(unsigned long taxa) { //Modo 16 bits(bits BRG16=1 e BRGH=1)
unsigned long baud_sanusb; //es klappt nut mit long
TRISCbits.TRISC7=1; // RX
TRISCbits.TRISC6=0; // TX
TXSTA = 0x24;
// TX habilitado e BRGH=1
RCSTA = 0x90;
// Porta serial e recepcao habilitada
BAUDCON = 0x08; // BRG16 = 1
baud_sanusb =REG+ ((48000000/4)/ taxa) - 1;
SPBRGH = (unsigned char)(baud_sanusb >> 8);
SPBRG = (unsigned char)baud_sanusb;
}

Cdigo em C para MPLAB X:


//Utiliza interrupcao serial para receber comandos enviados via bluetooth ou zigbee
#include "SanUSB1.h"
short int pisca=0;
unsigned char comando;

[ 49 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

#pragma interrupt interrupcao


void interrupcao()
{
if (serial_interrompeu) {
serial_interrompeu=0;
comando = le_serial();
switch (comando){
case 'L':
pisca=0; nivel_alto(pin_b7); //No imprime (printf) dentro da interrupcao
break;
case 'D':
pisca=0; nivel_baixo(pin_b7);
break;
case 'P':
pisca=1;nivel_alto(pin_b7);
break;
}
}
}
void main(){
clock_int_4MHz();
habilita_interrupcao(recep_serial);
taxa_serial(19200);
while(1){
if (!entrada_pin_e3){Reset();} // pressionar o boto no pino 1 para gravao
while (pisca==1){
inverte_saida(pin_b7);tempo_ms (300);
}//pisca rapido
printf("SanUSB\r\n"); //envia de forma sem fio a palavra para o PC ou Android
tempo_ms (2000);
}
}

Para mais detalhes basta acompanhar os vdeos Gravao sem fio de microcontroladores
http://www.youtube.com/watch?v=_Pbq2eYha_ceGravao

sem

microcontroladoreshttp://www.youtube.com/watch?v=0PcCQtsO1Bwg

fio

(wireless)
via

de

Bluetooth.

Procedimento para gravao wireless:


1- Circuito bsico: Conecte o mdulo bluetooth ao microcontrolador da placa SanUSB
(www.tinyurl.com/SanUSB), com alimentao entre 3V e 6V e apenas 4 fios: Vcc (3,3V),
Gnd, Tx e Rx, como mostra a figura acima do circuito. Na figura, o fio vermelho ligado ao
pino 20 (Vcc) do microcontrolador e ao pino Vcc do modem bluetooth, o fio azul ligado ao
19 (Gnd) do microcontrolador e ao pino Gnd do modem bluetooth, o fio verde ligado ao

[ 50 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

pino 18 (Rx) do microcontrolador e ao pino Tx modem bluetooth, e o fio amarelo ligado


ao 17 (Tx) do microcontrolador e ao pino Rx do modem bluetooth.

2- Parear o modem Bluetooth:Aps alimentar o modem Bluetooth com 3,3V ou 5V,


conectado ao microcontrolador, realizar o pareamento com o PC indo em:
2.1- Iniciar -> Painel de controle -> Adicionar um dispositivo de bluetooth -> linvor -> senha
padro: 1234;
2.2- Aps o pareamento, clique em Iniciar -> Painel de controle -> exibir impressoras e
dispositivos. Ir aparecer o modem pareado, como, por exemplo, o linvor.

Figura 2. 14: Pareamento do modem bluetooth.


1.3- Clicar em cima, por exemplo, do modem de linvor, e verificar qual porta criada pelo
modem Bluetooth, em Hardware, que ser utilizada para a gravao wireless.

Figura 2. 15: Verificao da porta serial criada pelo modem bluetooth.


O nmero da porta Serial Padro por Link Bluetooth (COM37) pode ser modificada,
por exemplo, para COM9 como neste tutorial, atravs do Gerenciador de Dispositivos,
clicando com o boto direito em cima da porta -> propriedades -> Configurao de Porta ->
Avanado -> Nmero da Porta COM.

[ 51 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

3- Configurao do Mdulo bluetooth: A gravao wireless s vai acontecer se o mdulo


Bluetooth estiver configurado com o mesmo baud rate do microcontrolador (19200 bps).
Para isto, basta conectar, o mdulo bluetooth ao microcontrolador, ver circuito bsico
acima, gravar via USB o firmware Configbluetotth9600to19200.hex e verificar seo led no
pino B7 ir piscar intermitentemente. Se o led no piscar, provavelmente existe um erro na
ligao do circuito.
Quando o led do pino B7 estiver piscando, significa que os mdulos esto conectados
corretamente e esto aptos para gravao wireless.

Figura 2. 16: Gravao via USB de Configurao wireless.

4- Adaptador Wireless: Agora grave, novamente via USB, o firmware AdaptadorSerial.hex


da pasta AdaptadorWireless. Se, aps a gravao do Adaptador, apresentar o erro Odd
address at beginning of HEX file error, como na figura abaixo, necessrio gravar
novamente o gerenciador.hex, com qualquer gravador especifico (ver tutorial), e em
seguida,

realizar

novamente

gravao

via

USB

do

firmware

aplicativo

AdaptadorSerial.hex. Aps a transferncia deste firmware, o microcontrolador est apto


para gravao wireless.

[ 52 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 2. 17: Gravao via USB de Adaptador wireless.

Agora basta acessar a pasta sanusbee pelo Prompt do Windows@ (Iniciar ->
Pesquisar -> Prompt de Comando), como na figura abaixo, e digitar, como mostrado no
vdeo PIC wireless Zigbee programming II, as linhas de comando, para transferir os
programas aplicativos.hex como o Exemplo1wireless.hex contido na pasta sanusbee.
Exemplo: sanusbee Exemplo1Wireless.hex p COM9

Figura 2. 18: Gravao wireless bluetooth pelo prompt do Windows.

As vantagens do modem Bluetooth em relao ao Zigbee, so o preo e a disponibilidade


de modems Bluetooth j disponveis em vrios sistemas computacionais como
computadores e celulares. A desvantagem em relao ao Zigbee a distncia para
gravao de microcontroladores mxima de 10 metros.

[ 53 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

PROGRAMA SanUSB PARA MODIFICAR O NOME DO MDULOS BLUETOOTH VIA


ANDROID
Como foi mostrado no vdeo, http://www.youtube.com/watch?v=V65-Vt91rug , aps gravar
o
microcontrolador
com
o
firmware
dispovel
em
https://dl.dropboxusercontent.com/u/101922388/BluetoothSanUSB/FirmwareBT4.zip,
e
abrir os aplicativos BTName.apk, para mdulos Slave JY-MCU e Linvor v1.04 e v1.06, e o
aplicativo BT4 Bluetooth HC05 para mdulos Master/Slave Linvor JY-MCU v1.05,
disponveis em https://play.google.com/store/search?q=sanusb, basta clicar em Cadastar
BT e selecionar o modem bluetooth desejado. Aps cadastrar o modem bluetooth pelo
aplicativo, insira o nome do modem na caixa de texto, com o celular conectado, e apertar o
boto Enviar nome.
O firmware abaixo serve tambm para se comunicar com os outros APKs em
https://play.google.com/store/search?q=sanusb .
FIRMWARE E ESQUEMA DE LIGAO PARA MDULOS MASTER/SLAVE HC-05 E
LINVOR V1.05:

ESQUEMA DE LIGAO PARA MDULOS SLAVE HC-04, HC-06, JY-MCU V1.04 e


V1.06:

[ 54 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

2.4 SISTEMA DUAL CLOCK


Devido incompatibilidade entre as frequncias necessrias para a gravao e
emulao serial via USB e a frequncia padro utilizada pela CPU, temporizadores e
interface I2C, esta ferramenta adota o princpio Dual Clock, ou seja, utiliza duas fontes de
clock, uma para o canal USB de 48MHz, proveniente do cristal oscilador externo de 20MHz
multiplicada por um prescaler interno, e outra para o CPU de 4 MHz, proveniente do
oscilador RC interno de 4 MHz, como ilustrado na figura abaixo.

Figura 2. 19: Comunicao PIC com PC e via I2C.


Esse princpio de clock paralelo, realizado pela instruo clock_int_4MHz(), permite
que um dado digitado no teclado do computador, trafegue para o microcontrolador em 48

[ 55 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

MHz via USB, depois para perifricos como um relgio RTC ou para a memria EEPROM
em 4 MHz via I2C e vice-versa.
2.5 COMUNICAO SERIAL VIA BLUETOOTH OU ZIGBEE

Neste tpico mostrado um mtodo de comunicao serial bidirecional atravs de


mdulos bluetooth ou zigbee nos sitemas operacionais Windows, Linux, mac OSX e
android. A comunicao realizada com envio de caracteres ASCII atravs de qualquer
software monitor serial RS-232 como o Brays Terminal, o Teraterm, Cutecom, etc., e no
S.O. android comoo blueterm, S2 bluetooth Terminal, etc.. O Circuito de comunicao
wireless Bluetooth o mesmo para a gravao wireless e est ilustrado na figura 2.19.

Figura 2. 20: Ilustrao do Circuito de comunicao wireless Bluetooth.


Abaixo um programa exemplo que utiliza interrupo serial para receber comandos
enviados via bluetooth ou zigbee. Os arquivos fontes podem ser obtidos em
https://dl.dropbox.com/u/101922388/ProjSanUSB1_MPLABX/Projeto1C18.X.zip .
#include "SanUSB1.h" // LigaLedBluetooth.c
short int pisca=0;
unsigned char comando;
#pragma interrupt interrupcao
void interrupcao()

[ 56 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

{
if (serial_interrompeu) {
serial_interrompeu=0;
comando = le_serial();
switch (comando){
case 'L':
pisca=0; nivel_alto(pin_b7); //No imprime (printf) dentro da interrupcao
break;
case 'D':
pisca=0; nivel_baixo(pin_b7);
break;
case 'P':
pisca=1;nivel_alto(pin_b7);
break;
} }}
void main(){
clock_int_4MHz();
habilita_interrupcao(recep_serial);
taxa_serial(19200);
while(1){
while (pisca==1){
inverte_saida(pin_b7);tempo_ms (300);
}//pisca rapido
printf("SanUSB\r\n"); //envia de forma sem fio a palavra para o PC ou Android
tempo_ms (2000); }}

O exemplo abaixo mostra a leitura e escrita em um buffer da EEPROM interna do


microcontrolador com emulao da serial via bluetooth:
--------------------------------------------------------------------------------------------------------------Para utilizar o programa de comunicao Java-SanUSB para emulao serial virtual
entre o computador e o microcontrolador, necessrio baix-lo atravs do link disponivel
em http://www.4shared.com/file/1itVIv9s/101009SoftwareComSerial_Window.html .
Aps executar o programa de comunicao serial Java-SanUSB, verifique a porta COM
virtual gerada (COM3,COM4,COM11,etc.) no Windows@, em Painel de Controle\Todos os
Itens do Painel de Controle\Sistema e altere no programa serial Java- SanUSB em
Dispositivos e depois clique em Conectar, como mostra a figura abaixo.

[ 57 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 2. 21: Interface em Java de comunicao serial.


2.6 GRAVANDO O MICROCONTROLADOR VIA USB NO LINUX

Esta aplicao substitui a gravao via USB pelo terminal do Linux, pois uma
forma mais simples e direta de gravao. Com apenas dois cliques no instalador
automtico SanUSB.deb possvel instalar este aplicativo em qualquer mquina com
Linux (Ubuntu 10.04, equivalente ou posterior). Depois de instalado, a interface de
gravao localizada em Aplicativos -> acessrios.
Se voc j tem o Java instalado (JRE ou SDK) baixe o instalador automtico.deb
atualizado disponivel no link: http://www.4shared.com/file/RN4xpF_T/sanusb_Linux.html
contido
tambm
na
pasta
geral
https://dl.dropbox.com/u/101922388/121007SanUSBOrig.zip.
Se ainda no tem o Java (JRE ou SDK) ou ocorreu algum erro na instalao , baixe
o instalador SanUSB, j configurado
com o Java JRE e disponivel em:
https://dl.dropbox.com/u/101922388/sanusb.deb
A figura abaixo mostra a interface grfica desenvolvida para gravao direta de
microcontroladores via USB:

[ 58 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 2. 22: Mensagem de programa gravado.


Neste aplicativo, esto disponveis botes para Abrir o programa em hexadecimal
compilado, para Gravar o programa hexadecimal no microcontrolador via USB e para
Resetar o microcontrolador no intuito de coloc-lo em operao. A interface apresenta
ainda um boto para gravar e resetar automaticamente.
importante salientar que para utilizar esta ferramenta no Linux necessrio estar
logado com permisso para acessar a porta USB como, por exemplo, super-usurio (sudo
su), e que para estabelecer comunicao com o microcontrolador necessrio gravar
anteriormente no microcontrolador, somente uma vez, com qualquer gravador especfico
para PIC, o gerenciador de gravao pela USB GerenciadorLinux.hex, disponivel na pasta
SanUSB ou em http://www.4shared.com/file/HGrf9nDz/Gerenciador.html .
Aps gravar o GerenciadorLinux.hex com um gravador convencional para PIC, coloque o
circuito SanUSB em modo de gravao pela USB (pino 1 ligado ao Gnd (0V) atravs de
boto ou fio) e conecte o cabo USB do circuito no PC. Se o circuito SanUSB estiver
correto, acender o led do pino B7. Pronto, o sistema j est preparado para gravar no
microcontrolador, de forma simples e direta, quantos programas .hex voc desejar
utilizando a interface USB.
Para programar novamente, basta pressionar o boto de gravao no pino 1, desconecte e
conecte o cabo USB de alimentao, selecione o programa.hex desejado em Abrir e
pressione o boto Gravar&Resetar.
2.7 GRAVANDO O PIC VIA USB PELO TERMINAL DO LINUX OU MAC OSX

Esta aplicao realizada de forma simples em linha de comando no terminal do


Mac OSX. Para abrir o terminal necessrio baixar e instalar o software Xcode. No Linux,

[ 59 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

instale
o
sanusb.deb
disponivel
em
http://www.4shared.com/file/sIZwBP4r/100727SanUSB.html .
Para iniciar a gravao com linhas de comando importante seguir os seguintes passos:
1. Grave no microcontrolador, somente uma vez, com um gravador especfico para PIC
com o circuito simples de gravao COM84 descrito nesta apostila ou outro gravador
qualquer, o gerenciador de gravao pela USB Gerenciador.hex, que multiplataforma
(Linux, Mac OSX e Windows@).
2. Pelo Terminal do Linux ou Mac OSX acesse onde est o executvel sanusb, instalado
pelo arquivo sanusb.deb, e no Mac OSX acesse a pasta de arquivos
SanUSBMacPlugandPlay, onde est o executvel sanusb. Mais dealhes em:
http://www.youtube.com/watch?v=rSg_i3gHF3U.
3. Aps entrar na pasta do exectvel sanusb, acesse informaes do contedo deste
arquivo digitando:
. / sanusb-h
A figura abaixo mostra o printscreen de exemplo de um processo de acesso pasta
e tambm do processo de gravao pelo terminal:

Figura 2. 23: Acesso pasta pelo terminal do LINUX.


4. Com o circuito SanUSB montado, coloque-o em modo de gravao (pino 1 ligado ao
Gnd com boto pressionado ou jump ) e conecte o cabo USB do circuito no PC.
5. Para gravar no microcontrolador, o firmware desejado, como o exemplo1.hex, deve
estar mesmo diretrio do executvel sanusb, ento para a gravao via USB, digita-se:
. / sanusb w exemplo1.hex
6. Depois de gravar, remova o boto ou jump de gravao, ento reset digitando:
. / sanusb r

[ 60 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

ou simplemente: . / sanusb w exemplo1 r

Para programar novamente, basta colocar o jump de gravao, desconecte e


conecte o cabo USB de alimentao, e repita os passos anteriores a partir do passo 6. Se
o microcontrolador no for reconecido, feche o terminal, conecte o microcontrolador em
outra porta USB, abra um novo terminal e repita repita os passos anteriores a partir do
passo 3.
2.8 SISTEMA DUAL CLOCK
Devido incompatibilidade entre as frequncias necessrias para a gravao e
emulao serial via USB e a frequncia padro utilizada pela CPU, temporizadores e
interface I2C, esta ferramenta pode adotar o princpio Dual Clock realizado pela instruo
clock_int_4MHz(), ou seja, utiliza duas fontes de clock, uma para o canal USB de 48MHz,
proveniente do cristal oscilador externo de 20MHz multiplicada por um prescaler interno, e
outra para o CPU de 4 MHz, proveniente do oscilador RC interno de 4 MHz, como
ilustrado na figura abaixo.

Figura 2. 24: Comunicao PIC com PC e via I2C.


Esse princpio de clock paralelo,permite que um dado digitado no teclado do
computador, trafegue para o microcontrolador em 48 MHz via USB, depois para perifricos
como um relgio RTC ou para a memria EEPROM em 4 MHz via I2C e vice-versa.
2.9 EMULAO DE COMUNICAO SERIAL NO LINUX

Neste tpico mostrado um mtodo de comunicao serial bidirecional atravs do


canal USB do PIC18F2550. Uma das formas mais simples, atravs do protocolo
Communications Devices Class (CDC), que padro no Linux e que emula uma porta
COM RS-232 virtual com o microcontrolador, atravs do canal USB. Dessa forma,
possvel se comunicar com caracteres ASCII via USB atravs de qualquer software monitor
serial RS-232 como o Cutecom, o minicom ou outros aplicativos com interface serial. A
biblioteca CDC_ACM padro no Linux e o programa aplicativo gravado no PIC com a
biblioteca CDC (#include <usb_san_cdc.h>), so os responsveis por esta emulao da
porta RS-232 virtual atravs da USB. A emulao serial muito utilizada tambm para
debugar, ou seja, depurar as variveis de um programa.c, imprimindo-as pela USB

[ 61 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

durante a execuo real do programa. Dessa forma, o programador pode encontrar


possveis erros na programao do firmware.
Aps gravar o firmware via USB com o executvel linux sanusb, instale o software
de comunicao serial digitando pelo terminal do linux #sudo apt-get install cutecom .
Verifique a porta serial virtual criada digitando dmesg no terminal. Abra o Cutecom,
digitando cutecom no terminal e direcione a porta virtual criada em Device do Cutecom,
geralmente a porta ttyACM0 ou ttyACM1. Mais informaes podem ser obtidas no video:
http://www.youtube.com/watch?v=cRW99T_qa7o .

Figura 2. 25: CuteCOM.


possvel tambm utilizar o programa de comunicao serial Java-SanUSB para
emulao serial virtual entre o computador e o microcontrolador.
possvel baixar esta ferramenta de comunicao serial atravs do link disponivel
em http://www.4shared.com/file/5emc7knO/SerialJava-sanusb_10_all.html . Aps conectar
o microcontrolador e abrir o programa de comunicao serial Java-SanUSB em Aplicativos
-> Outros, aparecer a porta serial virtual gerada no Linux (ttyACM0) em Dispositivos.
Para listar a porta serial virtual gerada, utilizando o Terminal do Linux, basta digitar ls
/dev/ttyACM* . possvel realizar a comunicao depois de clicar em Conectar, como
mostra a figura abaixo.

[ 62 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 2. 26: Interface de comunicao serial em Java para LINUX.


2.10 PROGRAMA COM INTERRUPO EXTERNA POR BOTO E DO TIMER 1
#include SanUSB1.h
CHAR comando;
short int led;
int x;
#int_timer1
void trata_t1 ()
{
led = !led; // inverte o led - pisca a cada 0,5 seg.
output_bit (pin_b7,led);
set_timer1(3036 + get_timer1());}
#int_ext
void bot_ext(){
for(x=0;x<5;x++){ // pisca 5 vezes aps o pino ser aterrado (boto pressionado)
nivel_alto(pin_B5); // Pisca Led em B5
tempo_ms(1000);
nivel_baixo(pin_B5);
tempo_ms(1000);
}}
void main() {
clock_int_4MHz();
enable_interrupts (global); // Possibilita todas interrupcoes
enable_interrupts (int_timer1); // Habilita interrupcao do timer 1
//enable_interrupts (int_ext); // Habilita interrupcao externa 0 no pino B0
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8);// configura o timer 1 em 8 x 62500 = 0,5s
set_timer1(3036);
// Conta 62.500us x 8 para estourar= 0,5s

[ 63 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

while (1){
nivel_alto(pin_B6); // Pisca Led na funo principal
tempo_ms(500);
nivel_baixo(pin_B6);
tempo_ms(500);
}}

2.11 OBTENO DE UM VOLTMETRO ATRAVS DO CONVERSOR AD COM


A VARIAO DE UM POTENCIMETRO
#include SanUSB1.h //Leitura de tenso em mV com variao de um potencimetro
#include <usb_san_cdc.h>// Biblioteca para comunicao serial virtual
int32 tensao;
void main() {
clock_int_4MHz();
setup_adc_ports(AN0); //Habilita entrada analgica - A0
setup_adc(ADC_CLOCK_INTERNAL);
while(1){
//ANALGICO
DIGITAL(10 bits)
set_adc_channel(0);
// 5000 mV
1023
tempo_ms(10);
// tensao
read_adc()
tensao= (5000*(int32)read_adc())/1023;
printf (r\nA tensao e' = %lu mV\r\n",tensao); // Imprime pela serial virtual
nivel_alto(pin_b7);
tempo_ms(500);
nivel_baixo(pin_b7);
tempo_ms(500);

}}

Figura 2. 27: Uso de potencimetro no conversor AD do PIC.


Para obter novos programas e projetos, basta acessar os arquivos do grupo
SanUSB em www.tinyurl.com/SanUSB como tambm baixar a apostila completa disponivel
em TTP://www.4shared.com/document/Qst_pem-/100923Apostila_CPIC.html .

[ 64 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

2.12 CIRCUITO COM84 PARA GRAVAO DO gerenciador.hex

Para este circuito simples de gravao s necessrio 3 resistores de 10k, um cabo


serial DB9 (RS-232) e uma fonte externa de 5V, que pode ser obtida da porta USB. O
circuito e a foto abaixo mostram o esquema simples de ligao dos pinos.

Figura 2. 28: Circuito COM84 para gravao do gerenciador.hex


Este circuito a partir da porta COM DB9 pode ser visualizado na figura abaixo.

Figura 2. 29: Esquema de ligao do conector serial.


Este circuito de gravao funciona com o software PICPgm(detectado como JDM
Programmer) ou com WinPic (detectado como COM84 Programmer). Este ltimo se
mostra mais estvel, pois aps a deteco do microcontrolador, possvel gravar o
microcontrolador, e mesmo indicando ERROR: Programming failed, o arquivo
gerenciador.hex mostrou-se gravado corretamente para gerenciar gravaes no
microcontrolador pela porta USB nos sistemas operacionais Windows@, Linux e Mac
OSX.
O software de gravao do gerenciador.hex pode ser baixado atrvs do link,
disponivel em http://www.4shared.com/get/1uP85Xru/winpicprCOM84.html.

[ 65 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 2. 30: Tela de configurao do software de gravao.


Aps a instalao, execute o programa. Na guia "Device, Config", escolha o
microcontrolador. Uma vez que o microcontrolador conectado porta COM RS-232 de 9
pinos do PC, v para "Interface", selecione " COM84 programmer for serial port", e
pressione "Initialize". Se o software disser que a inicializao foi um xito "Success", ento
o programa est pronto para gravar o gerenciador.hex no microcontrolador. Para a
gravao, selecione em File Load & ProgramDevice e depois selecione o arquivo
gerenciador.hex. Como citado anteriormente, mesmo que, aps a gravao e verificao
aparea Programmed Failed, provvel que o gerenciador.hex tenha sido gravado
corretamente.

Figura 2. 31: Tela de confirmao de reconhecimento do circuito.

[ 66 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

PERIFRICOS INTERNOS DO MICROCONTROLADOR


3.1 CONVERSOR A/D
O objetivo do conversor analgico-digital (AD) converter um sinal analgico,
geralmente de 0 a 5V, em equivalentes digitais. Como pode ser visto, algumas
configuraes permitem ainda que os pinos A3 e A2 sejam usados como referncia
externa positiva e negativa, fazendo com que uma leitura seja feita em uma faixa de tenso
mais restrita como, por exemplo, de 1 a 3 Volts.

Figura 3. 1: Diagrama de blocos interno do conversor A/D.


Em C, o conversor AD pode ser ajustado para resoluo de 8 bits (#device
adc=8 armazenando o resultado somente no registro ADRESH) ou 10 bits (#device
adc=10).
Para um conversor A/D com resoluo de 10 bits e tenso de referncia padro de
5V, o valor de cada bit ser igual a 5/(210 - 1) = 4,8876 mV, ou seja, para um resultado
igual a 100 (decimal), teremos uma tenso de 100* 4,8876 mV = 0,48876 V. Note que a
tenso de referncia padro (Vref) depende da tenso de alimentao do PIC que
normalmente 5V. Se a tenso de alimentao for 4V, logo a tenso de referncia (Vref)
tambm ser 4V.
Para um conversor A/D com resoluo de 10 bits e tenso de referncia de 5V, o
valor de cada bit ser igual a 5/(28 - 1) = 19,6078 mV, ou seja, para um resultado igual a
100 (decimal), necessrio uma tenso de 100 * 19,6078 mV = 1,96078 V, quatro vezes
maior.
comum se utilizar o conversor AD com sensores de temperatura (como o LM35),
luminosidade (como LDRs), presso (STRAIN-GAGE), tenso, corrente, humidade, etc..

[ 67 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 3. 2: Uso de perifricos no conversor A/D.


Para utilizar este perifrico interno, basta:
setup_adc_ports (AN0_TO_AN2); //(Seleo dos pinos analgicos 18F2550)
setup_adc(ADC_CLOCK_INTERNAL ); //(selecionar o clock interno)
Veja a nomenclatura dos canais analgicos de cada modelo, dentro da biblioteca do
CCS na pasta Device. Depois, no lao infinito, basta selecionar o canal para leitura,
esperar um tempo para a seleo fsica e ento ler o canal AD.
set_adc_channel(0);
//Seleciona qual canal vai converter
tempo_ms (1);
// aguarda um milisegundo para comutar para o canal 0
valor = read_adc(); // efetua a leitura da converso A/D e guarda na varivel valor
3.1.1 AJUSTE DE RESOLUO DO SENSOR E DO CONVERSOR AD DE 8 BITS
O ajuste da resoluo do conversor AD se d aproximando a tenso de fundo de escala
do sensor (VFS) tenso de referencia do conversor (VREF). Para isso existem duas
tcnicas de ajuste por Hardware:

Para este tpico utilizado como exemplo de ajuste da resoluo do conversor AD, o
sensor de temperatura LM35 que fornece uma sada de tenso linear e proporcional com
uma resoluo de 10mV a cada C.
3.1.2 AJUSTE DA TENSO DE FUNDO DE ESCALA COM AMPOP

Para conversores AD de 8 bits e VREF de 5V, a resoluo mxima de 19,6mV (R= VREF
/ (2n-1). Dessa forma, como a Resoluo do sensor 10mV/C (RS), necessrio aplicar
um ajuste de resoluo com um ganho na tenso de fundo de escala do sensor para que
cada grau possa ser percebido pelo conversor do microcontrolador. A forma mais comum
de ganho a utilizao de amplificadores operacionais no inversores. Veja mais detalhes
no material de apoio no final dessa apostila. A tenso de fundo de escala (VFS) est

[ 68 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

relacionada Temperatura Mxima desejada de medio (TMAX), onde VFS = RS(10mV/C)*


TMAXe o Ganho (G) de aproximao da tenso de fundo de escala (VFS) tenso de
referencia (VREF) dado por G = VREF / VFS, ou seja, para uma Temperatura Mxima
desejada de 100C, o ganho deve ser aproximadamente 5.

Figura 3. 3: AMP-OP no inversor.


A aproximao da tenso de fundo de escala (VFS) tenso de referencia (VREF)
realizada para diminuir a relevncia de rudos em determinadas faixas de temperatura.
3.1.3 AJUSTE DA TENSO DE REFERNCIA COM POTENCIMETRO

Outra forma mais simples de ajuste por Hardware (aumento da resoluo do


conversor AD) a aproximao da tenso de referencia (VREF) tenso de fundo de
escala (VFS) atravs da diminuio da tenso de referncia (VREF) com o uso de um
potencimetro (divisor de tenso). Por exemplo, um conversor AD de 8 bits com uma
tenso de referncia (VREF) de 2,55V no pino A3, apresenta uma resoluo de 10mV por bit
(2,55/(28-1)), ou seja, a mesma sensibilidade do sensor LM35 de 10mV/C . Percebe
variao de cada C.
3.1.4 CONVERSOR AD DE 10 BITS

Para conversores de 10 bits, com maior resoluo (4,89 mV), o ajuste


(escalonamento) realizado geralmente por software, em linguagem C, que possui um
elevado desempenho em operaes aritmticas.
OBS.: O ganho de tenso de um circuito poderia ser simulado por software com os
comandos: Int32 valorsensor= read_adc();
Int32 VFS = 4 * Valorsensor;
A frmula utilizada pelo programa no PIC para converter o valor de tenso fornecido
pelo sensor LM35 em uma temperatura :
ANALGICO
5V = 5000mV
T(C)* 10mV/C

DIGITAL
1023
(int32)read_adc()

->
->

T (C) = 500 * (int32)read_adc()/1023


onde (int32)read_adc() o valor digital obtido a partir da temperatura (T(C)) analgica
medida. Esta varivel configurada com 32 bits (int32), porque ela recebe os valores dos
clculos intermedirios e pode estourar se tiver menor nmero de bits, pois uma varivel

[ 69 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

de 16 bits s suporta valores de at 65.535. A tenso de referncia do conversor 5V e


como o conversor possui 10 bits de resoluo, ele pode medir 1023 variaes.
3.1.5 OBTENO DE UM VOLTMETRO ATRAVS DO CONVERSOR AD COM A
VARIAO DE UM POTENCIMETRO
#include SanUSB1.h //Leitura de tenso em mV com variao de um potencimetro
#include <usb_san_cdc.h>// Biblioteca para comunicao serial virtual
int32 tensao;
void main() {
clock_int_4MHz();
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com a usb do PC
setup_adc_ports(AN0); //Habilita entrada analgica - A0
setup_adc(ADC_CLOCK_INTERNAL);
while(1){
//ANALGICO
DIGITAL(10 bits)
set_adc_channel(0);
// 5000 mV
1023
tempo_ms(10);
// tensao
read_adc()
tensao= (5000*(int32)read_adc())/1023;
printf ("\r\nA tensao e' = %lu C\r\n",tensao); // Imprime pela serial virtual
nivel_alto(pin_b7);
tempo_ms(500);
nivel_baixo(pin_b7);
tempo_ms(500);

}}

Figura 3. 4: Conexo do potencimetro no conversor A/D.


3.1.6 LEITURA DE TEMPERATURA COM O LM35 ATRAVS DO CONVERSOR AD
#include SanUSB1.h
int16 temperatura;
void main() {

[ 70 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

clock_int_4MHz();
setup_adc_ports(NA0); //Habilita entrada analgica A0
setup_adc(ADC_CLOCK_INTERNAL);
while(1){
set_adc_channel(0);
tempo_ms(10);
temperatura=430*read_adc()/1023; //Vref = 4,3V devido queda no diodo, ento (430*temp)
printf (\r\nTemperatura do LM35 = %lu C\r\n,temperatura);
nivel_alto(pin_b7); // Pisca Led em operao normal
tempo_ms(500);
nivel_baixo(pin_b7);
tempo_ms(500);
}}

Figura 3. 5: Leitura de temperatura via monitor serial.

Figura 3. 6: Conexo do potencimetro no conversor A/D.

[ 71 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 6. 1: Prtica 9 Sensor de temperatura LM35, montada em protoboard.


3.1.7 TERMISTOR
Um termistor uma resistncia varivel com a temperatura. Na realidade todas as
resistncias variam com a temperatura, s que os termistores so feitos para terem uma
grande variao com a temperatura. A ligao do termistor ao microcontolador muito
simples, como mostra a figura baixo.

[ 72 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 3. 7: Conexo do termistor.


Convm lembrar que a resposta de um termistor no linear, como mostra a figura abaixo.

Figura 3. 8: Resposta do termistor.


LINEARIZAO
Um forma muito comum de linearizao do termistor por modalidade da tenso,
onde um termistor NTC conectado em srie com um resistor normal formando um divisor
de tenso. O circuito do divisor contm uma fonte de tenso de referncia (Vref) igual a
2,5V. Isto tem o efeito de produzir uma tenso na sada que seja linear com a temperatura.
Se o valor do resistor R25C escolhida for igual ao da resistncia do termistor na temperatura
ambiente (250 C), ento a regio de tenso linear ser simtrica em torno da temperatura
ambiente (como visto em figura abaixo).

Figura 3. 9: Linearizao do termistor.

[ 73 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

3.2 MEMRIAS DO MICROCONTROLADOR

O microcontrolador apresenta diversos tipos de memria, entre elas:


3.2.1 MEMRIA DE PROGRAMA

A memria de programa flash, o local onde so gravados o cdigohexadecimal do


programa compilado. Essa memria uma espcie de EEPROM (memria programvel e
apagvel eletronicamente), mas s pode ser gravada e apagada completamente e no
byte a byte, o que a torna mais econmica.
3.2.2 MEMRIA DE INSTRUES
A memria de instrues, que uma espcie de BIOS (binary input and output
system), se localiza dentro da CPU para comparao com o cdigo hexadecimal do
programa que est sendo processado e execuo de uma ao correspondente.
3.2.3 MEMRIA EEPROM INTERNA
A maioria dos modelos da famlia PIC apresenta memria EEPROM interna, com
dimenses de 128 ou 256 bytes. Em algumas aplicaes, a EEPROM interna muito til
para guardar parmetros de inicializao ou reter valores medidos durante uma
determinada operao de sensoreamento.
O PIC18F2550 contm 256 bytes (posies 0 a 255) de EEPROM interna, que
podem ser escritas facilmente utilizando a instruo write_eeprom(posicao, valor); e
lidas com a instruo valor2=le_eeprom (posicao);. O projeto de controlde de acesso
com teclado matricial abaixo mostra o uso desta memria.
3.2.4 MEMRIA DE DADOS (RAM)
A memria RAM do microcotrolador 18F2550 possui 2Kbytes disponveis para
propsito geral (entre 000h a 7FFh). No final da RAM (entre F60h e FFFh) esto
localizados os registros de funes especiais (SFR), que servem para configurar os
perifricos internos do microcontrolador.
Esses registros podem ser configurados bit a bit atravs do seu nome de
identificao. Exemplo: PORTB=0B01100110.

[ 74 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 3. 10: Registros de funes especiais.


3.2.5 EXEMPLO DE APLICAO

3.2.5.1

CONTROLE DE ACESSO COM TECLADO MATRICIAL

O teclado matricial geralmente utilizado em telefones e em controle de acesso de


portas com senhas pr-definidas. O controle de acesso feito, na maioria das vezes, com
sistemas microcontrolados por varredura das linhas, aterrando individualmente as colunas
do teclado. Caso alguma tecla seja pressionada, o pino da tecla correspondente tambm
ser aterrado e indicar a tecla digitada.

[ 75 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 3. 11: Teclado Matricial.

Para reconhecer uma senha digitada em um teclado matricial necessrio


armazenar o valor das teclas digitadas em seqncia em alguma memria, como por
exemplo, na memria de dados RAM (pode-se utilizar quaisquer posies dos 2Kbytes
disponveis entre 000h a 7FFh), depois compar-la com uma senha pr-programada
contida na memria de programa flash (ROM) ou na EEPROM interna.

Figura 3. 11: Formas de comparao com a senha pr-programada.

Note que o programa de controle de acesso em anexo utiliza a EEPROM interna


para possibilitar a insero de novas senhas na EEPROM, sem a necessidade de gravar
novamente a memria de programa do microcontrolador.
PONTEIROS
Ponteiros guardam endereos de memria de programa.
Exemplo para declarar um ponteiro:
unsigned int16 p=100;
//ponteiro igual a posio 100
*p='7'; // Contedo endereado por p igual a 7(ASC II) ou 0x37.
++p; //Incrementa a posio para receber prximo dado.
Programa de controle de acesso com armazenamento de senhas na EEPROM interna pelo
prprio teclado atravs de uma senha de administrador (mestre):

[ 76 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

///Teclado Matricial insere novas senhas pelo teclado com a senha mestre//
/////oscilador interno 4 de MHz//////////////////////////////////////////
//Se faltar energia ou existir um reset, as senhas armazenadas no so
//perdidas e possivel armazenar novas senhas aps a ltima senha gravada
// possvel apagar senhas lendo a EEPROM e zerando as posies da senha ex.:write_eeprom(
endereco, 0 );
#include SanUSB1.h
char caract,tecla0,tecla1,tecla2,tecla3;
unsigned int16 p=100,i,j;
unsigned int mult=8,k=0,n=0;
int1 led,flag=0,flag2=0,flag3=0;
//////////////////////////////////////////////////////////////////////////////////
#int_timer1 // Interrupo do timer 1
void trata_t1 () // Conta 62.500us x 8 = 0,5s
{--mult;
if (!mult)
{mult=8; // 8 x0,5s - 4 seg
p=100; tecla0='F';tecla1='F';tecla2='F';tecla3='F'; // volta a posio de origem a cada 4 seg
}}
//////////////////////////////////////////////////////////////////////////////////
void main() {
clock_int_4MHz();
enable_interrupts (global); // Possibilita todas interrupcoes
enable_interrupts (int_timer1); // Habilita interrupcao do timer 1
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8);// inicia o timer 1 em 8 x 62500 = 0,5s
set_timer1(3036);
//write_eeprom( 239, 0);//Pode apagar toda a memria de senhas zerando k
if(le_eeprom(239)>0 &&le_eeprom(239)<40) {k=le_eeprom(239);} // Carrega a tima posio livre
da eeprom (k) antes do reset armazenada em 239
while (1)
{
// Reconhecimento de tecla por varredura
nivel_baixo(pin_b0);nivel_alto(pin_b1);nivel_alto(pin_b2);
if(input(pin_b3)==0) {*p='1'; flag=1; while(input(pin_b3)==0);tempo_ms(200);}
if(input(pin_b4)==0) {*p='4'; flag=1; while(input(pin_b4)==0);tempo_ms(200);}
if(input(pin_b5)==0) {*p='7'; flag=1; while(input(pin_b5)==0);tempo_ms(200);}
if(input(pin_b6)==0) {*p='*'; flag=1; while(input(pin_b6)==0);tempo_ms(200);}
nivel_alto(pin_b0);nivel_baixo(pin_b1);nivel_alto(pin_b2);
if(input(pin_b3)==0) {*p='2'; flag=1; while(input(pin_b3)==0);tempo_ms(200);}
if(input(pin_b4)==0) {*p='5'; flag=1; while(input(pin_b4)==0);tempo_ms(200);}
if(input(pin_b5)==0) {*p='8'; flag=1; while(input(pin_b5)==0);tempo_ms(200);}
if(input(pin_b6)==0) {*p='0'; flag=1; while(input(pin_b6)==0);tempo_ms(200);}
nivel_alto(pin_b0);nivel_alto(pin_b1);nivel_baixo(pin_b2);
if(input(pin_b3)==0) {*p='3'; flag=1; while(input(pin_b3)==0);tempo_ms(200);}
if(input(pin_b4)==0) {*p='6'; flag=1; while(input(pin_b4)==0);tempo_ms(200);}
if(input(pin_b5)==0) {*p='9'; flag=1; while(input(pin_b5)==0);tempo_ms(200);}
if(input(pin_b6)==0) {*p='!'; flag=1; while(input(pin_b6)==0);tempo_ms(200);}

[ 77 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

// Guarda tecla pressionada


if (flag==1) {
if(p==100){tecla0=*p;}
if(p==101){tecla1=*p;}
if(p==102){tecla2=*p;}
if(p==103){tecla3=*p;flag2=1;} //A flag2 avisa que senha foi digitada completamente
mult=4; //cada tecla tem 2 seg para ser pressionada a partir da primeira
printf ("\r\nValor das teclas digitadas: %c %c %c %c\r\n",tecla0,tecla1,tecla2,tecla3);
printf "Endereco para onde o ponteiro p aponta: %lu\r\n",p);
++p; // Incrementa posio para prxima tecla
if(p>103){p=100;}
}
//************************************************************************
if (tecla0=='3' && tecla1=='6'&& tecla2=='9'&& tecla3=='!'&& flag2==1) {
flag3=1; //Indica que a senha mestre autorizou e a nova senha pode ser armazenada
flag2=0; //Garante que somente a prxima senha, diferente da senha mestre, ser armazenada
nivel_alto(pin_c0);printf ("\r\nSenha Mestre!\r\n");tempo_ms(1000); nivel_baixo(pin_c0);}
//************************************************************************
if (flag2==1 && flag3==1) { //Se a senha mestre j foi digitada (flag3) e a nova senha do usurio
tambm foi digitada (flag2)
write_eeprom( 4*k, tecla0 ); //Grave a nova senha
write_eeprom( (4*k)+1, tecla1 );
write_eeprom( (4*k)+2, tecla2 );
write_eeprom( (4*k)+3, tecla3 );
++k; // incremente as posies para armazenar nova senha
printf ("\r\nSenha armazenada\r\n");
write_eeprom( 239, k); printf("proximo k=%u\r\n",k);//Guarda a tima posio livre antes do reset
na posio 239 da EEPROM
flag3=0; //Zera a flag3 da nova senha
//***********************************************************************
for(i=0; i<6; ++i) //L EEPROM
{
for(j=0; j<40; ++j) {printf("%2x ", le_eeprom(i*40+j) );}//Leitura da eeprom interna
printf("\r\n");
}
}
//************************************************************************
// Compara conjunto de teclas pressionadas com senhas armazenadas na eeprom
if (flag2==1) {
for(n=0;n<=k;n++)
{
if (tecla0==le_eeprom(4*n) && tecla1==le_eeprom(4*n+1) && tecla2==le_eeprom(4*n+2)&&
tecla3==le_eeprom(4*n+3))
{ nivel_alto(pin_c0); printf ("\r\nAbre a porta!\r\n");tempo_ms(3000); nivel_baixo(pin_c0);} } }// abre
a porta

[ 78 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

//***********************************************************************
flag=0; flag2=0; //Zera as flags para que novas senhas possam ser digitadas
led = !led; // inverte o led de operao
output_bit (pin_b7,led);
tempo_ms(100);
}}

3.3 MODULAO POR LARGURA DE PULSO PELO CCP


O Perifrico interno independente CCP (Capture/Compare/PWM) responsvel por
comparao de sinais, bem como, gerar um sinal de sida em PWM (CCP1CON=0x0C),
ou seja, modulao por largura de pulso (pulse width modulation). Dessa forma, possvel
realizar o PWM pelo perifrico interno CCP do microcontrolador ou por software atravs de
emulao pelo processador do microcontrolador, como mostrado no item 3.3.1.
A gerao do PWM produzida, geralmente, pelo chaveamento de uma tenso com
amplitude constante (+5V por exemplo), tendo em vista que quanto menor a largura dos
pulsos emitidos na base de uma chave eletrnica, como um transistor, menor a
saturao do transistor e, consequentemente, menor a tenso lado da carga, resultante do
chaveamento.
O perodo T0 o intervalo de tempo que se registra o perodo repetitivo do pulso e o 0
o ciclo de trabalho (duty-cicle), ou seja, o tempo em que o pulso permanece com a
amplitude em nivel lgico alto.

Figura 7. 1: Ciclo de trabalho.


No mdulo CCP, o registro PR2 carregado para servir de referncia de contagem para
o timer 2 de 8 bits com prescaler (multiplicador de tempo de geralmente 4 ou 16). Quando
o timer 2quando chega ao valor de PR2, seta o flip-flop do CCP para gerar o perodo (T0)e
consequentemente a frequncia desejada do PWM (freqPWM).
O valor digital (Vdig) de 10 bits do ciclo de trabalho, obtido do valor percentual (0 a
100)inserido pelo usurio. O Vdig O Vdig carregado em CCPR1L,que guarda os 8 bits
mais significativos do valor digital, e nos bits5 e 4 do CCP1CON so carregados os dois
bits menos significativos do valor digital, e serve de referncia para o timer2 resetar o ciclo
de trabalho.

[ 79 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Mais detalhes no vdeo: http://www.youtube.com/watch?v=lB21b3zA4Ac

CONTROLE PWM POR SOFTWARE DE VELOCIDADE DE UM MOTOR CC


A finalidade deste controle de velocidade com a modulao de tenso por largura de
pulsos (PWM) realizar uma converso digital-analgica que acontece devido
impedncia inerente do circuito em alta frequncia.

Figura 7. 2: PWM.

O programa abaixo mostra o controle de velocidade de um motro CC por PWM com


perodo constante de 20ms, onde cada incremento ou decremento da onda quadrada
corresponde a 1ms, ou seja, ou seja, um acrscimo ou decrscimo de 5% no ciclo de
trabalho.
#include SanUSB1.h
#define motor pin_b7
#define led pin_b0
unsigned int ton,toff,incton,inctoff,guardaton,guardatoff;
int1 flag1, flag2;
void main() {

[ 80 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

clock_int_4MHz();
incton=2; inctoff=18; //Perodo de 20ms - Passo mnimo de tempo = 1ms (5% (1/20) do duty cicle )
guardaton=le_eeprom(10);guardatoff=le_eeprom(11);
if (guardaton>0 && guardaton<=20) {incton=guardaton; inctoff=guardatoff;}
while (1) {
ton=incton; toff=inctoff;
if (!input(pin_b1)) {flag1=1;}
if (incton<20 && flag1==1 && input(pin_b1) ) {flag1=0;++incton;--inctoff;nivel_alto(led);//se no
chegou no mximo (incton<50),
write_eeprom(10,incton);write_eeprom(11,inctoff); //se o boto foi pressionado (flag1==1) e se o
boto j foi solto (input(pin_b1)) incremente
}// a onda quadrada e guarde os valores na eeprom
if (!input(pin_b2)) {flag2=1;}
if (inctoff<20 && flag2==1 && input(pin_b2) ) {flag2=0;++inctoff;--incton;nivel_baixo(led);
write_eeprom(10,incton);write_eeprom(11,inctoff);
}
nivel_alto(motor);
while(ton) {--ton;tempo_ms(1); } //Parte alta da onda quadrada
nivel_baixo(motor);
while(toff) {--toff;tempo_ms(1); } //Parte baixa da onda quadrada
}}

A figura abaixo mostra o circuito montado para com este exemplo. Veja o funcionamento
desse circuito no vdeo http://www.youtube.com/watch?v=6IIH02dbboE .

Figura 7. 3: PWM com Mosfet.

[ 81 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

INTERRUPES E TEMPORIZADORES
INTERRUPES
As interrupes so causadas atravs de eventos assncronos (podem ocorrer a
qualquer momento) causando um desvio no processamento. Este desvio tem como destino
um endereo para tratamento da interrupo. Uma boa analogia para melhor entendermos
o conceito de interrupo a seguinte: voc est trabalhando digitando uma carta no
computador quando o seu telefone toca. Neste momento voc, interrompe o que est
fazendo, para atender ao telefone e verificar o que a pessoa do outro lado da linha est
precisando. Terminada a conversa, voc coloca o telefone no gancho novamente e retoma
o seu trabalho do ponto onde havia parado. Observe que no precisamos verificar a todo
instante, se existe ou no algum na linha, pois somente quando o ramal chamado, o
telefone toca avisando que existe algum querendo falar com voc.
Aps do atendimento das interrupes, o microcontrolador retorna exatamente ao
ponto onde parou no programa antes de atend-la. As interrupes mais comuns na
famlia PIC18F so:
- pela interrupo externa 0 (Pino B0) ->enable_interrupts(int_ext);
- pela interrupo externa 1 (Pino B1) ->enable_interrupts(int_ext1);
- pela interrupo externa 2 (Pino B2) ->enable_interrupts(int_ext2);
- pelo contador/temporizador 0 ->enable_interrupts(int_timer0);
- pelo contador/temporizador 1 ->enable_interrupts(int_timer1);
- pelo contador/temporizador 2 ->enable_interrupts(int_timer2);
- pelo canal de comunicao serial ->enable_interrupts(int_rda); //serial
As interrupes do PIC so vetorizadas, ou seja, tm endereos de incio da
interrupo fixos para a rotina de tratamento. No PIC18F2550 o endereo de tratamento
0x08. No programa em C basta escrever a funo de tratamento da interrupo aps #, e
o compilador far o direcionamento do cdico automaticamente para essa posio.
INTERRUPES EXTERNAS
O modelo PIC18F2550 possui trs interrupes externas, habilitadas nos pinos B0
(ext) , B1 (ext1) e B2 (ext2), que atuam (modo default) quando os pinos so aterrados.
Quandos atuados o processamento desviado para #int_ext, #int_ext1 ou #int_ext2,
respectivamente, para que a interrupo possa ser tratada por uma funo especfica, que
no caso do exemplo void bot_ext().
Dentro da funo principal deve-se habilitar o disjuntor geral das interrupes,
enable_interrupts(global); e depois a interrupo especfica, por exemplo
enable_interrupts(int_ext); como mostra o exemplo com aplicao de interrupo externa e
tambm interruo do temporizador 1.
#include SanUSB1.h
CHAR comando;
short int led;
int x;
#int_timer1
void trata_t1 ()

[ 82 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

{
led = !led; // inverte o led - pisca a cada 0,5 seg.
output_bit (pin_b7,led);
set_timer1(3036 + get_timer1());
}
#int_ext
void bot_ext()
{
for(x=0;x<5;x++) // pisca 5 vezes aps o pino ser aterrado (boto pressionado)
{
nivel_alto (pin_B5); // Pisca Led em B5
tempo_ms(1000);
nivel_baixo(pin_B5);
tempo_ms(1000);
}
}
void main() {
clock_int_4MHz();
enable_interrupts (global); // Possibilita todas interrupcoes
enable_interrupts (int_ext); // Habilita interrupcao externa 0 no pino B0
enable_interrupts (int_timer1); // Habilita interrupcao do timer 1
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8);// configura o timer 1 em 8 x 62500 = 0,5s
set_timer1(3036);
// Conta 62.500us x 8 para estourar= 0,5s
while (1){}; //Loop infinito (parado aqui)
}

[ 83 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 5. 5: Esquemtico Prtica 3.

[ 84 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 5. 6: Prtica 3 Botes, montada em protoboard.

Para habilitar a nomenclatura das as interrupes esto disponveis em view > valid
interrupts.
Quando for utilizada alguma interrupo externa, necessrio inserir um resistor de pull-up
externo de 1K a 10K para elevar o nivel lgico do pino quando o mesmo for liberado
evitando outra interrupo, pois o processador entende tristate e nveis intermedirios de
tenso como nivel lgico baixo.
Segue cdigo exemplo utilizando o comando IF INPUT ao invs da interrupo
externa:
#include SanUSB1.h//BIBLIOTECA DE INSTRUES
main()//PROGRAMA PRINCIPAL
{
while (1)//LAO INFINITO
{

[ 85 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

if (input(pin_b0)==0){// SE BOTO NO PINO B0 FOR ATERRADO


nivel_alto(pin_b7);}// LIGA LED NO PINO B7
if (input(pin_b1)==0){// SE BOTO NO PINO B1 FOR ATERRADO
nivel_baixo(pin_b7);}// APAGA LED NO PINO B7
}}

Aps a prtica ser efetuada com sucesso, o professor deve solicitar aos alunos que
ao pressionar o boto do pino b0, o LED do pino b7 pisque a cada 500 ms e ao pressionar
o boto do pino b1, o mesmo LED pisque a cada 100 ms.
Sugesto de cdigo:
#include <SanUSB.h>//BIBLIOTECA DE INSTRUES
main(){//PROGRAMA PRINCIPAL
clock_int_4MHz();

while (1){//LAO INFINITO


if (input(pin_b0)==0){// SE BOTO NO PINO B0 FOR ATERRADO
while(input(pin_b1)==1){//ENQUANTO O OUTRO NO FOR ATERRADO...
inverte_saida(pin_b7);// LIGA LED NO PINO B7
tempo_ms(500);}}
if (input(pin_b1)==0){// SE BOTO NO PINO B1 FOR ATERRADO
while(input(pin_b0)==1){//ENQUANTO O OUTRO NO FOR ATERRADO...
inverte_saida(pin_b7);
tempo_ms(50);
}

}}}

O professor pode trabalhar tambm com 3 LEDs (pinos b7, b6 e b5) piscando, de
acordo com o programa abaixo:
#include <SanUSB.h>//BIBLIOTECA DE INSTRUES
main(){//PROGRAMA PRINCIPAL
clock_int_4MHz();
while (1)//LAO INFINITO

[ 86 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

{
if (input(pin_b0)==0){// SE BOTO NO PINO B0 FOR ATERRADO
while(input(pin_b1)==1){
nivel_alto(pin_b7);// LIGA LED NO PINO B7
tempo_ms(500);
nivel_baixo(pin_b7);// LIGA LED NO PINO B7
tempo_ms(500);
nivel_alto(pin_b6);// LIGA LED NO PINO B6
tempo_ms(500);
nivel_baixo(pin_b6);// LIGA LED NO PINO B6
tempo_ms(500);

nivel_alto(pin_b5);// LIGA LED NO PINO B5


tempo_ms(500);
nivel_baixo(pin_b5);// LIGA LED NO PINO B5
tempo_ms(500);}}
if (input(pin_b1)==0){// SE BOTO NO PINO B1 FOR ATERRADO
while(input(pin_b0)==1){

nivel_alto(pin_b7);// LIGA LED NO PINO B7


tempo_ms(50);
nivel_baixo(pin_b7);// LIGA LED NO PINO B7
tempo_ms(50);

nivel_alto(pin_b6);// LIGA LED NO PINO B6


tempo_ms(50);
nivel_baixo(pin_b6);// LIGA LED NO PINO B6
tempo_ms(50);
nivel_alto(pin_b5);// LIGA LED NO PINO B5

[ 87 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

tempo_ms(50);
nivel_baixo(pin_b5);// LIGA LED NO PINO B5
tempo_ms(50);
} }

}}

INTERRUPO DOS TEMPORIZADORES


O microcontrolador PIC 18F2550 tem quatro temporizadores, que so os timers 0, 1,
2 e 3. O timer 0 tem 16 bits, ou seja, pode contar at 65535s (216) e um prescaler
(divisor de frequncia ou multiplicador de tempo) de at 256 (RTCC_DIV_256). Os timers
1 e 3 so idnticos com 16 bits e um prescaler de at 8 (RTCC_DIV_8). Por sua vez, O
timer 2 possui 8 bits e um prescaler de at 16 (RTCC_DIV_16).
Os timers incrementam at estourar, quando estouram, processamento desviado para
#int_timer, para que a interrupo possa ser tratada por uma funo especfica, que no
caso do exemplo void trata_t0 () e void trata_t1 ().
O programa a seguir pisca um led em b5 na funo principal main(), outro pela
interrupo do timer 1 em b6 e um terceiro led em b7 pela interrupo do timer0.
#include SanUSB1.h
short int led0, led1;
int vart1=2, vart3=4; // multiplicador de tempo
#int_timer0
void trata_t0 () //Funo de taratamento, o Timer0 configurado com o nome RTCC
{
led0 = !led0; // inverte o led a cada 4 seg pois tem prescaler igual a 64 (RTCC_DIV_64)
output_bit (pin_b7,led0);
set_timer0(3036 + get_timer0()); // get_timer() carrega o timer compensando o tempo //gasto no
tratamento da interrupo
}
#int_timer1 //O timer 1 e o timer 3 so idnticos, s basta modificar 1 por 3 na configurao
void trata_t1 ()
{
--vart1;
if(vart1==0)
{
led1 = !led1; // inverte o led - pisca a cada 1 seg (vart1=2 x 0,5 seg)
output_bit (pin_b6,led1);
vart1=2; // necessita de multiplicador de tempo, pois o prescaler mximo 8 (T1_DIV_BY_8)
set_timer1(3036 + get_timer1()); // get_timer() carrega o timer compensando o tempo //gasto no
tratamento da interrupo
}
}
void main(){
clock_int_4MHz();
enable_interrupts (global); // Possibilita todas interrupcoes

[ 88 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

enable_interrupts (int_timer0); // Habilita interrupcao do timer 0


enable_interrupts (int_timer1); // Habilita interrupcao do timer 1
setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_64);// configura o prescaler do timer 0 em 64,
tem prescaler at 256
set_timer0(3036);
// Conta 62.500us x 64 para estourar= 4 seg
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8); // configura o prescaler do timer 1 em 8 x
62500us = 0,5 seg
set_timer1(3036);
// Conta 62.500us x 8 para estourar= 0,5 seg
while (1){
nivel_alto(pin_b5);
tempo_ms(500);
nivel_baixo(pin_b5);
tempo_ms(500);
}}

//Funo principal pisca led em a5

MULTIPLEXAO POR INTERRUPO DE TEMPORIZADORES


O programa abaixo mostra uma multiplexao de displays de 7 segmentos por
interrupo dos temporizadores 0 e 1. O timer 0 incrmena a varivel a ser multiplexada
pelos displays e o timer 1 multiplexa a porta B dgitos de dezenas e dgitos de unidades at
99.
#include SanUSB1.h
int setseg[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //Vetor com 10 elementos
int flag=0;
int i=0, z, dezena, unidade; //ndice dezena,unidade (ponteiro)
//******************************************
#int_timer0
void trata_t0 () //O Timer0 configurado com o nome RTCC
{
if(i<=99) {++i;}
if(i>99) {i=0;}
set_timer0(3036 + get_timer0()); // get_timer() carrega o timer compensando o tempo gasto na
interrupo
}
//*********************************************
#int_timer1 //O timer 1 e o timer 3 so idnticos, s basta modificar 1 por 3 na configurao
//void trata_t1 (){
dezena=i/10; //dezena recebe o nmero inteiro da diviso por 10
unidade=i%10; //unidade recebe o resto da diviso por 10
switch(flag){
case 0: {
nivel_alto(pin_a0); //pin_a0 aciona transistor do comum das dezenas
nivel_baixo(pin_a1); //pin_a3 aciona transistor do comum das unidades

[ 89 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

PORTB = setseg[dezena]; //A porta B recebe o desenho do nmero das dezenas apontado pela
varivel dezena
flag=1; break;}
case 1: {
nivel_alto(pin_a1); //selecionei a unidade
nivel_baixo(pin_a0);
PORTB = setseg[unidade]; //A porta B recebe o desenho do nmero das unidades apontado pela
varivel unidade
flag=0; break;}}
set_timer1(55536 + get_timer1());}
void main(){
clock_int_4MHz();
PORTB=0;// Define os pinos da porta B como sada
enable_interrupts (global); // Possibilita todas interrupcoes
enable_interrupts (int_timer0); // Habilita interrupcao do timer 0
enable_interrupts (int_timer1); // Habilita interrupcao do timer 1
setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_8);// configura o prescaler do timer 0 em 64,
prescaler at 256
set_timer0(3036);
// Conta 62.500us x 8 para estourar= 0,5
seg
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_1);
set_timer1(55536);
// Conta 10000 us (10ms) para estourar
while (1){
nivel_alto(pin_a5);
tempo_ms(300);
nivel_baixo(pin_a5);
tempo_ms(300);
}
}

//Funo principal

EMULAO DE PORTAS LGICAS


Os operadores lgicos descritos abaixo adotam o padro ANSI C, ou seja, podem
ser utilizados por qualquer compilador em linguagem C direcionado microcontroladores.
5.1 INSTRUES LGICAS PARA TESTES CONDICIONAIS DE NMEROS
Nesse caso, os operadores so utilizados para realizar operaes de testes
condionais geralmente entre nmeros inteiros.

OPERADOR
&&
ll

COMANDO
Operao E (AND)
Operao OU (OR)

[ 90 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Operao NO (NOT)

Exemplos:
if (segundodec==05 &&(minutodec==00|| minutodec==30)) {flagwrite=1;}//Analisando um
relgio para setar a flagwrite
if (x>0 && x<20) (y=x;) // Estabelecendo faixa de valores para y.
5.2 INSTRUES LGICAS BOOLANAS BIT A BIT
Considere as portas lgicas abaixo:

Figura 5. 1: Portas Lgicas.


importante salientar que emulao a reproduo via software das funes de um
determinado sistema real. Atravs do circuito SanUSB, possvel emular as portas lgicas
fsicas e as diversas combinaes das mesmas com apenas uma funo booleana no
programa.
OPERAO

EXPRESSO BOOLEANA EXPRESSO BOOLEANA


LITERAL
EM C
Operao E (AND)
S= A . B
S= A & B
Operao OU (OR)
S= A + B
S= A l B
Operao NO (NO)
S= !A
S=
OU exclusivo (XOR)
S= A B
S= A ^ B
O circuito abaixo mostra as possveis entradas booleanas nos pinos B1, B2 e B3 e a
sada do circuito lgico booleano expressa de forma real atravs do LED no pino B7.

[ 91 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 5. 2: Uso de resistores de pull down para aplicar funo lgica 0/1.
importante salientar que atravs das operaes bsicas E, OU, NO e OUExclusivo possvel construir outras operaes como NAND, NOR e Coincidncia, que o
inverso do OU-Exclusivo. Isto realizado transformando a expresso booleana literal em
uma expresso booleana em C e apresentando o resultado em um LED de sada.

Figura 5. 3: Outras funes lgicas a partir de NOT, OR e AND.


Exemplo 1: Elabore um programa para emular uma porta lgica OU-Exclusivo atravs do
microcontrolador.
#include SanUSB1.h // Emulao de circuitos lgicos booleanos (OU-Exclusivo)
short int A, B, saida, ledpisca;
void main(){
clock_int_4MHz();
while (TRUE)
{
A=input(pin_b1); //entrada com pull-down externo (resistor conectado ao Terra)
B=input(pin_b2); //entrada com pull-down externo (resistor conectado ao Terra)
saida = A^B; //saida igual ao resultado do OU-Exclusivo obtida pelas entradas dos pinos

[ 92 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

AeB
output_bit(pin_b7,saida); //O pino_b7 mostra o resultado do circuito lgico booleano alocado em
saida
ledpisca=!ledpisca; // ledpisca igual ao inverso de ledpisca
output_bit(pin_b0,ledpisca); // b0 recebe o valor de ledpisca
tempo_ms(500);
}}

Exemplo 2: Elabore um programa e a tabela verdade para emular uma o circuito lgico
booleano abaixo.

Figura 5. 4: Exemplo de circuito combinacional (1).


O programa para emular de forma real esse circuito mostrado abaixo:
#include SanUSB1.h // Emulao de circuitos lgicos booleanos
short int A, B, C, saida, ledpisca;
void main(){
clock_int_4MHz();
while (TRUE){
A=input(pin_b1); //entrada com pull-down externo (resistor conectado ao Terra)
B=input(pin_b2); //entrada com pull-down externo (resistor conectado ao Terra)
C=input(pin_b3); //entrada com pull-down externo (resistor conectado ao Terra)
saida = !(!A & B) & !C; //saida do circuito booleano obtida pelas entradas de b1, b2 e b3
output_bit(pin_b7,saida); //O pino_b7 mostra o resultado do circuito lgico booleano
ledpisca=!ledpisca; // ledpisca igual ao inverso de ledpisca
output_bit(pin_b0,ledpisca); // b0 recebe o valor de ledpisca
tempo_ms(500);
}}

Note que para emular qualquer outro circuito booleano com trs entradas, basta
modificar apenas a funo de converso em negrito (saida = !(!A & B) & !C). A tabela
verdade desse circuito booleano mostarada abaixo:

A
0
0
0
0
1
1

ENTRADAS
B
0
0
1
1
0
0

C
0
1
0
1
0
1

[ 93 ]

SAIDA
S
1
0
0
0
1
0

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

1
1

1
1

0
1

1
0

Exemplo 3: Elabore um programa e a tabela verdade para emular uma o circuito lgico
booleano abaixo.

S= (A & B) | !C | !(C & D)


Figura 5. 5: Exemplo de circuito combinacional (2).
#include SanUSB1.h // Emulao de circuitos lgicos booleanos
short int A, B, C, D, saida, ledpisca;
void main(){
clock_int_4MHz();
while (TRUE){
A=input(pin_b1); //entrada com pull-down externo (resistor conectado ao Terra)
B=input(pin_b2); //entrada com pull-down externo (resistor conectado ao Terra)
C=input(pin_b3); //entrada com pull-down externo (resistor conectado ao Terra)
D=input(pin_b3); //entrada com pull-down externo (resistor conectado ao Terra)
saida= (A & B) | !C | !(C & D);
output_bit(pin_b7,saida); //O pino_b7 mostra o resultado do circuito lgico booleano
ledpisca=!ledpisca; // ledpisca igual ao inverso de ledpisca
output_bit(pin_b0,ledpisca); // b0 recebe o valor de ledpisca
tempo_ms(500);}}

A tabela verdade deste circuito lgico mostrada abaixo:


ENTRADAS
A
0
0
0
0
0
0
0
0
1
1

B
0
0
0
0
1
1
1
1
0
0

C
0
0
1
1
0
0
1
1
0
0

D
0
1
0
1
0
1
0
1
0
1

[ 94 ]

SAIDA
S
1
1
1
0
1
1
1
0
1
1

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

1
1
1
1
1
1

0
0
1
1
1
1

1
1
0
0
1
1

0
1
0
1
0
1

1
0
1
1
1
1

A tabela verdade pode ser facilmente comprovada de forma real montando o circuito
proposto.
5.3 EMULAO DE DECODIFICADOR PARA DISPLAY DE 7 SEGMENTOS
Antes de comentar sobre os decodificadores, vamos definir o que um display de
sete segmentos. O display de sete segmentos, formado por sete leds. Quando necessitase acender o nmero 0, liga-se os leds correspondentes ao digito 0, por exemplo, os
segmentos a, b, c, d, e, f. Na figura abaixo, mostrado um display de sete-segmentos e a
respectivos pinos. No lado direito, os dois tipos de displays, anodo comum e catodo
comum. No esquea que no anodo comum o led liga com Gnd e no catodo comum o led
liga com Vcc.

Figura 5. 6: Display de 7 segmentos e conexo interna.


Como os segmentos so leds, ento necessrio limitar a corrente, para isso
devemos usar um resistor em cada segmento (catodo comum), ou apenas um no comum
(anodo comum), seno sero queimados. Normalmente se utilizam resistores entre 220 e
560 ohms para uma fonte de 5Volts. Uma dica, se for usar um display, teste antes cada
segmentos, para ter certeza que no est usando um display com algum segmento
queimado.
Os decodificadores, inverso dos codificadores, tem a funo de converter um cdigo
desconhecido de linguagem de mquina, como o binrio de entrada mostrado neste
exemplo, em um cdigo compreensvel, como o cdigo decimal ou um desenho em um
display de 7 segmentos. Os decodificadores fixos podem ser construdos com portas
lgicas reais ou emulados, ou seja, reproduzidos via software, como o caso proposto.

[ 95 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Os decodificadores de displays de 7 segmentos, como o 9317 (anodo comum) e o


9307 (catodo comum),recebem 4 bits de entrada para a decodificao do nmero a ser
desenhado pelos segmentos dos displays.
CI - 9317
Entradas
Sadas
Desen
ho
/LT /RBI
A0
A1
A2
A3
a b c d e f
g pont
o
L
X
X
X
X
X
L L L L L L L H
teste
H
L
L
L
L
L
H H H H H H H L
apaga
H
H
L
L
L
L
L L L L L L H H
0
H
X
H
L
L
L
H L L H H H H H
1
H
X
L
H
L
L
L L H L L H L H
2
H
X
H
H
L
L
L L L L H H L H
3
H
X
L
L
H
L
H L L H H L L H
4
H
X
H
L
H
L
L H L L H L L H
5
H
X
L
H
H
L
L H L L L L L H
6
H
X
H
H
H
L
L L L H H H H H
7
H
X
L
L
L
H
L L L L L L L H
8
H
X
H
L
L
H
L L L L H L L H
9

Para a emulao, ou seja, reproduo via software, de decodificadores de displays


de sete segmentos, os pinos do microcontrolador devem apresentar os seguintes valores
mostrados na tabela abaixo:
TABELA (Anodo comum zero no pino acende segmento)
NMERO
B6 B5 B4
B3
B2
B1
B0
Porta B
DISPLAY
Hexadecim
g
f
e
d
c
b
a
al
0
1
0
0
0
0
0
0
0x40
1
1
1
1
1
0
0
1
0x79
2
0
1
0
0
1
0
0
0x24
3
0
1
1
0
0
0
0
0x30
4
0
0
1
1
0
0
1
0x19
5
0
0
1
0
0
1
0
0x12
6
0
0
0
0
0
1
0
0x02
7
1
1
1
1
0
0
0
0x78
8
0
0
0
0
0
0
0
0x00
9
0
0
1
0
0
0
0
0x10
Abaixo mostrado um programa exemplo para contar de 0 a 9 com um display de
sete segmentos anodo comum. Dependendo dos display anodo ou catodo comum, como
tambm dos pinos do microcontrolador ligados ao displays, possvel utilizar o mesmo
programa abaixo, alterando apenas os valores dos elementos da matriz setseg[10].
#include "SanUSB1.h"//Display de 7seg conta de 0 a 9
unsigned char set_seg[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
int i;

[ 96 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

void interrupcao(){}
void main(){
clock_int_4MHz();
TRISB = 0b00000000;
nivel_baixo(pin_c0);
while(1){
for(i = 0; i<10; i++){
PORTB = set_seg[i];
tempo_ms(500);
} }}

Exemplo: Construa um decodificador emulado atarvs de diagramas de Karnaugh para


escrever, letra por letra, a cada segundo, a palavra StoP. importante salientar que os
pinos do microcontrolador e os pinos do display em anodo comum devem ser conectados
com um resistor de 220 a 1K para no queimar os segmentos do display. O circuito
abaixo mostra a ligao do display de 7 segmentos.

Figura 5. 7: Conexo do display 7 seg na porta B do PIC.


Os segmentos ascendem com zero no pino do microcontrolador (anodo comum).
Note que como so somente quatro letras s necessrio duas entradas (Xe Y) para a
decodificao.

Entrada
s
X
Y
0
0

Pin_b
0
a
0

Pin_b
1
b
1

Pin_b
2
c
0

[ 97 ]

Pin_b
3
d
0

Pin_b
4
e
1

Pin_b
5
f
0

Pin_b6
g
0

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

t
o
P

0
1
1

1
0
1

1
1
0

1
1
0

1
0
1

0
0
1

0
0
0

0
1
0

0
0
0

Aps a definio de cada segmento do display para representar os caracteres da palavra,


feita a simplicao de cada segmento atravs dos diagramas de Karnaugh abaixo para a
construo da funo de emulao do decodificador fixo.
a

/Y

/Y

/Y

/Y

/X

/X

/X

/X

/Y

/Y

/Y

/X

/X

/X

O programa abaixo mostra as funes de emulao do decodificador fixo para a palavra


StoP obtidas dos diagramas de Karnaugh.
#include "SanUSB1.h" // Emulao de decodificador para display de 7 segmentos - //palavra StoP
#pragma interrupt interrupcao //Tem que estar aqui ou dentro do firmware.c
void interrupcao(){
}
short int X, Y; //Entradas
short int a, b, c, d, e, f, g; //sadas
void decodificador(short int X, short int Y) //Funo auxiliar do decodificador fixo para StoP
{
a=X ^ Y;
saida_pino(pin_b0,a);
//Anodo comum
b=!X | !Y;
saida_pino(pin_b1,b);
c=Y;
saida_pino(pin_b2,c);
d=X & Y;
saida_pino(pin_b3,d);
e=!X & !Y;
saida_pino(pin_b4,e);
f=X & !Y;
saida_pino(pin_b5,f);
g=0 ;
saida_pino(pin_b6,g);
}
void main(){
clock_int_4MHz();
while (1)
{
decodificador(0,0); // Insere as entradas X=0 e Y=0 no decodiicador fixo ? Sada letra S
tempo_ms(1000);
decodificador(0,1); // Sada letra t
tempo_ms(1000);
decodificador(1,0); // Sada letra o
tempo_ms(1000);

[ 98 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

decodificador(1,1); // Sada letra P


tempo_ms(1000);
}}

Exemplo 2: Construa um decodificador emulado para escrever, letra por letra no mesmo
display de 7 segmentos, a cada segundo, a palavra USb2. Como o display anodo
comum (+5V no anodo do display), os segmentos ascendem com zero no pino do
microcontrolador.

Entrada
s
X
Y
0
0
0
1
1
0
1
1

U
S
b
2

Pin_b
0
a
1
0
1
0

Pin_b
1
b
0
1
1
0

Pin_b
2
c
0
0
0
1

Pin_b
3
d
0
0
0
0

Pin_b
4
e
0
1
0
0

Pin_b
5
f
0
0
0
1

Pin_b6
g
1
0
0
0

Aps a definio de cada segmento do display para representar os caracteres da palavra,


feita a simplicao de cada segmento atravs dos diagramas de Karnaugh abaixo para a
construo da funo de emulao do decodificador fixo.
a

/Y

/Y

/Y

/Y

/X

/X

/X

/X

/Y

/Y

/Y

/X

/X

/X

O programa abaixo mostra as funes de emulao do decodificador fixo para a palavra


USb2 obtidas dos diagramas de Karnaugh.
#include "SanUSB1.h" // Emulao de decodificador para display de 7 segmentos - palavra //Usb2
#pragma interrupt interrupcao //Tem que estar aqui ou dentro do firmware.c
void interrupcao(){
}
short int X, Y; //Entradas
short int a, b, c, d, e, f, g; //sadas
void decodificador(short int X, short int Y) //Funo auxiliar do decodificador fixo para USb2

[ 99 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

{
a=!Y;
saida_pino(pin_b0,a); //Anodo comum
b=X^Y;
saida_pino(pin_b1,b);
c=X&Y;
saida_pino(pin_b2,c);
d=0;
saida_pino(pin_b3,d);
e=!X&Y;
saida_pino(pin_b4,e);
f=X&Y;
saida_pino(pin_b5,f);
g=!X&!Y;
saida_pino(pin_b6,g);
}
void main(){
clock_int_4MHz();
while (1)
{
decodificador(0,0); // Insere as entradas X=0 e Y=0 no decodiicador fixo ? Sada letra S
tempo_ms(1000);
decodificador(0,1); // Sada letra t
tempo_ms(1000);
decodificador(1,0); // Sada letra o
tempo_ms(1000);
decodificador(1,1); // Sada letra P
tempo_ms(1000);
}}

5.4 MULTIPLEXAO COM DISPLAYS DE 7 SEGMENTOS

Como a economia de consumo e de componentes so sempre fatores importantes a


serem considerados em projetos de sistemas digitais, uma tcnica bastante utilizada a
multiplexao de displays. Esta tcnica permite que um s decodificador de displays como
o 9317 (anodo comum), o 9307 (catodo comum) ou apenas sete pinos de um
microcontrolador, que emulam as sadas do decodificador, possam controlar uma srie de
displays em paralelo.
Estes so ciclicamente acesos e apagados numa frequncia acima de 20Hz de tal
forma que, para o olho humano, todos os displays estejam acesos permanentemente. Para
isso, so colocados transistores de corte que atuam em sequncia sobre cada terminal
comum dos displays em paralelo.
O programa abaixo mostra um exemplo para contar de 0 a 99 multiplexando dois displays
de sete segmentos anodo comum.
#include SanUSB1.h
int setseg[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
//elementos que desenham de 0 a 9
int i, z, dezena, unidade; //ndice dezena,unidade (ponteiro)
void main (){
clock_int_4MHz();

[ 100 ]

//Vetor

com

10

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

PORTB= 0b00000000;// Define os pinos da porta B como sada


while(1){
for (i=0;i<99;i++){
for(z=0;z<20;z++){
dezena=i/10; //dezena recebe o nmero inteiro da diviso por 10
unidade=i%10; //unidade recebe o resto da diviso por 10
nivel_alto(pin_a0); //pin_a0 aciona transistor do comum das dezenas
nivel_baixo(pin_a1); //pin_a3 aciona transistor do comum das unidades
PORTB = setseg[dezena]; //A porta B recebe o desenho do nmero das dezenas apontado pela
//varivel dezena
tempo_ms(10);
nivel_alto(pin_a1); //selecionei a unidade
nivel_baixo(pin_a0);
PORTB = setseg[unidade]; //A porta B recebe o desenho do nmero das unidades apontado //pela
varivel unidade
tempo_ms(10);
}}}}

Para iniciar, faa jumps entre os pinos:


a1 e a2 --- b1 e b2 --- c1 e c2 --- d1 e d2 --- e1 e e2 --- f1 e f2 --- g1 e g2

Complete a ligao do display 7 segmentos ao PIC conectando da seguinte forma:

B0

B1

B2

B3

B4

B5

B6

B7

Segmento
a

Segmento
b

Segmento
c

Segmento
d

Segmento
e

Segmento
f

Segmento
g

Segmento
ponto

Insira um resistor de 100 R a 1000 R em cada pino comum e conecte: Comum 1 no pino
a0 e Comum 2 no pino a1 de acordo com a programao.

[ 101 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 5. 7: Esquemtico

Figura 5. 8: Esquemtico Prtica 6 Multiplexao display 7 segmentos.

[ 102 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 5. 9: Prtica 6 Multiplexao display 7 segmentos, montada em protoboard.

COMUNICAO SERIAL EIA/RS-232


A comunicao serial teve incio com a inveno do telgrafo. Depois teve um grande
desenvolvimento com a inveno do Teletype (teletipo) pelo Francs Jean Maurice mile
Baudot, em 1871, da o nome Baud Rate. Baudot, alm de criar toda a mecnica e eltrica
do Teletype, criou tambm uma tabela de cdigos (Cdigo de Baudot) com letras,
nmeros, e smbolos para a transferncia serial assncrona digital de informaes. Da
surgiu o Padro de comunicao RS-232, que significa Padro Recomendado verso 232.
Na transmisso dos caracteres atravs da linha telegrfica, o sinal de Marca era
representado pela presena de corrente eltrica, e o Espao pela ausncia desta corrente.
Para que o Teletype conseguisse distinguir o incio e o final de um caractere, o mesmo era
precedido com um sinal Espao (start bit) e finalizado com um sinal de Marca (stop bit).
Entenda que o estado da linha ociosa (sem transmisso de dados) era o sinal de Marca
(presena de corrente eltrica). Foi baseado nesse sistema que o padro de transmisso
RS-232 evoluiu e se tornou um padro muito utilizado nos computadores e equipamentos
digitais.
Algumas
interfaces
EIA/RS-232
nos
computadores
atuais
fornecem
aproximadamente -10v e +10v, mas suportam mnimas de -25v e mximas de +25v.
A Comunicao serial feita pela transmisso de bits em seqncia. um modo de
comunicao muito recomendado para transmisso de dados a longa distncia. Nesse
caso, a comunicao serial apresenta um menor custo pelo nmero reduzido de fios e
conseqentemente menor velocidade em relao comunicao paralela.
Para a transmisso de dados por distncias maiores e com pouca interferncia
pode-se utilizar uma interface com outros padres como o EIA/RS-232 e o EIA/RS-485. A
comunicao serial pode ser sncrona ou assncrona. Na primeira, alm dos bits de dados
so enviados tambm bits de sincronismo, ou seja, o receptor fica em constante
sincronismo com o Transmissor. Na comunicao assncrona, que o modo mais utilizado

[ 103 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

de comunicao entre sistemas de controle e automao por no necessitar de


sincronismo, existe um bit que indica o incio da transmisso, chamado de start bit (nivel
lgico baixo) e um bit que indica o final da transmisso chamado de stop bit (nivel lgico
alto). Nessa transmisso, o Receptor em sincronismo com o Transmissor apenas no incio
da transmisso de dados. Deve-se considerar que o transmissor e o receptor devem estar
na mesma velocidade de transmisso.
Quando o canal serial est em repouso, o sinal correspondente no canal tem um
nivel lgico 1. Um pacote de dados sempre comea com um nivel lgico 0 (start bit) para
sinalizar ao receptor que um transmisso foi iniciada. O start bit inicializa um
temporizador interno no receptor avisando que a transmisso. Seguido do start bit, 8 bits
de dados de mensagem so enviados com a velocidade de transmisso pr-programada
no emissor e no receptor. O pacote concludo com os bits de paridade e de parada (stop
bit).
O bit de paridade usado como nono bit com o propsito de deteco de erro.
Nessa conveno, quando o nmero total de dgitos 1 , o valor do bit de paridade 1 e
quando for mpar 0.

Figura 6. 2: Dado em comunicao serial.


A interrupo do canal serial utilizada quando se espera receber um dado
em tempo aleatrio enquanto se executa outro programa. Quando o dado chega, o start
bit (nivel lgico baixo) aciona a interrupo, previamente habilitada, onde a recepo da
comunicao serial executada. Caso o canal serial seja utilizado somente para
transmisso de dados, no necessrio habilitar a interrupo serial.
6.1 CDIGO ASCII
Um dos formatos mais utilizados em comunicao serial, como no padro EIA/RS-232, o
ASCII (American Standard Code for Information Interchange). Este formato utiliza sete bits
de cada byte (valor mximo 0x7F) e o oitavo bit de paridade que pode ou no ser utilizado.

[ 104 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Se o nmero de 1s for par, o bit de paridade X7 zero e, se for mpar, X7 um. A Tabela
de Caracteres ASCII mostrada abaixo:

Figura 6. 3: Caracteres ASCII.


6.2 INTERFACE USART DO MICROCONTROLADOR
A interface serial USART (transmissor-receptor universal sncrono e assncrono) dos
microcontroladores pode ser sncrona ou assncrona, sendo esta ltima a mais utilizada
para comunicao com o mundo externo utilizando o padro EIA/RS-232, onde cada byte
serial precedido por um start-bit de nivel lgico baixo e encerrado por um stop-bit de nivel
lgico alto. Os conectores utilizados so o DB9 e o DB25, como mostra a figura abaixo:

[ 105 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 6. 4: Conectores USART.


Em suma, os pinos utilizados na comunicao serial entre computadores e
microcontroladores so o TXD, o RXD e o Terra (GND).
O nivel lgico alto no padro RS232 est entre 3 e 25V e o nivel lgico baixo est
entre +3 e +25V. Para a comunicao entre um PC e um PIC so utilizados chips que
convertem os nveis de tenso TTL/RS232.

Figura 6. 5: Sinal eltrico RS-232.


Par converter os padres TTL/RS232, o chip mais utilizado o MAX232, o qual
utiliza quatro inversores para converter entre 10V (RS232) em +5V (TTL), e entre +10V
(RS232) em 0V (TTL). Computadores apresentam cerca de 10V e +10V, mas suportam
mnimas de -25v e mximas de +25v. Assim Como o MAX232 existem outros conversores,
tipo ICL3232, etc. O esquema de ligao do MAX232 mostrado a seguir:

[ 106 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 6. 6: Circuito de conexo MAX 232.


6.3 . CLCULO DE TAXA DE TRANSMISSO SERIAL

Este mtodo interessante para alterar a taxa de transmisso serial durante a operao
do sistema embarcado. Possibilitando que o microcontrolador se comunique ora e 9600bps
e ora em 19200bps ou 38400 bps.
Vamos analisar a tabela abaixo:

Nas frmulas da tabela acima, o valor de n inserido no registro SPBRG. possvel


gerar com 4 MHz na condio (bits BRG16=0 e BRGH=1) tanto 9600 bps como tambm
19200 bps, pois neste caso de 8 bits (bits BRG16=0 e BRGH=1), o valor de n obtido na
frmula pode ser colocado somente em um byte, no SPBRG.
MODO 8 BITS
Para 19200: SPBRG = n= ( 4.000.000 / 19200 / 16 ) - 1 =>SPBRG = 12;
Para 9600: SPBRG = n= ( 4.000.000 / 9600 / 16 ) - 1 =>SPBRG = 25;
Considerando agora uma frequncia de clock de 48 MHz na condio (bits BRG16=0 e
BRGH=1):

[ 107 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Para 19200:SPBRG = n= ( 48.000.000 / 19200 / 16 ) - 1 =>SPBRG = 155;


Para 9600: SPBRG = n= ( 48.000.000 / 9600 / 16 ) - 1 = SPBRG = 311;
MODO 16 BITS
Como em 9600bps 48MHz, o SPBRGH 311, ou seja, maior que 255, no possvel
utilizar somente um byte. Por isso necessrio habilitar o byte baixo SPBRG, setando o
bit BRG16 em BAUDCON, entrando na condio de 16 bits assncrono (bits BRG16=1 e
BRGH=1). Calculando agora os valores na frmula de 16 bits, tem-se que:
Para 19200 e 48 MHz: n=( 48.000.000 / 19200 / 4 ) - 1 = 624 = 0x270 ->
SPBRGH = 0x02;
SPBRG=0x70;
Para 9600 e 48 MHz: n=( 48.000.000 / 9600 / 4 ) - 1 = 1249 = 0x4E1->
SPBRGH = 0x04;
SPBRG=0xE1;
Para 19200 e 4 MHz: n=( 48.000.000 / 19200 / 4 ) - 1 = 624 = 0x33 ->
SPBRGH = 0x00;
SPBRG=0x33;
Para 9600 e 4 MHz: n=( 48.000.000 / 9600 / 4 ) - 1 = 1249 = 0x67->
SPBRGH = 0x00;
SPBRG=0x67;

Deste modo, possvel utilizar a seguinte funo para 19200 bps com frequncia de
4MHz e de 48MHz no modo de 16 bits:
void taxa_serial(unsignedlong taxa) { //Modo 16 bits(bits BRG16=1 e BRGH=1)
unsignedlong baud_sanusb;
TRISCbits.TRISC7=1; // RX
TRISCbits.TRISC6=0; // TX
// TX habilitado e BRGH=1
TXSTA = 0x24;
// Porta serial e recepcao habilitada
RCSTA = 0x90;
BAUDCON = 0x08; // BRG16 = 1
baud_sanusb = REG+((_XTAL_FREQ/4)/ taxa) - 1;
SPBRGH = (unsignedchar)(baud_sanusb >>8);
SPBRG = (unsignedchar)baud_sanusb; }
void serial_putc(char c)
{
while (!TXSTAbits.TRMT);
TXREG=c;
}
#pragma interrupt interrupcao
void interrupcao()
{

[ 108 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

if (serial_interrompeu) {serial_interrompeu=0;
comando[n] = le_serial();}}

6.4 COMUNICAO SERIAL EIA/RS-485


Gnd. H um fio para transmisso, outro para recepo e o fio terra para referncia dos
nveis de tenso. Este tipo de interface til em comunicaes ponto-a-ponto e baixas
velocidades de transmisso. Visto a necessidade de um terra comum entre os dispositivos,
h limitaes do comprimento do cabo a apenas algumas dezenas de metros. Os
principais problemas so a interferncia e a resistncia do cabo. Mais detalhes, bem como
um projeto sobre diagnstico microcontrolado de transceptor no padro EIA/RS-485 podem
ser conferidos no livro disponivel no link: https://www.agbook.com.br/book/140210-Diagnostico_microcontrolado_de_transceptor_no_padrao_EIARS485 .
6.4 APLICAES DE COMUNICAO SERIAL VIA BLUETOOTH OU ZIGBEE
Para a comunicao entre os modem bluetooth ou Zigbee, com um aplicativo serial
instalado no PC ou em algum dispositivo mvel com Android, basta gravar o firmware
abaixo no microcontrolador. Quando o microcontrolador recebe L, liga o led e comunica,
quando recebe D desliga e comunica e quando recebe P, pisca em alta frequncia. Mais
detalhes
podem
ser
vistos
no
vdeo
com
link
descrito
abaixo:
http://www.youtube.com/watch?v=aTe7G__9_us .

ACIONAMENTO DE MOTORES MICROCONTROLADOS


Os motores mais utilizados com sistemas microcontrolados so os motores CC ,
motores de passo e servo-motores.

ACIONAMENTO DE MOTORES CC DE BAIXA TENSO


Os motores CC so abundantes no mercado em funo da ampla gama de
utilizao, consequentemente, existem em vrias dimenses, tenses, pesos,
caractersticas e so fceis de encontrar em sucatas como video-cassete, brinquedos,
impressoras, etc. e geralmente vm associados a uma caixa de engrenagem para aumento
do torque e reduo de velocidade.

[ 109 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 7. 4: Motores CC.


MOTORES ELTRICOS UTILIZADOS EM AUTOMVEIS
Os motores utilizados em automveis so todos com tenso nominal a 12 volts, so
robustos e normalmente projetados para condies extremas, tais como poeira, calor,
variaes de tenso e corrente, entre outros. Algumas opes so ideais para aplicao no
rob por serem compactos, fortes, alta rotao e leves, alm de serem muito fceis de
conseguir em oficinas e empresas do ramo. Os motores mais usados em projetos so de
trava-eltrica das portas, bomba do limpador de para-brisa e de gasolina, bomba de
combustvel, motor do vidro-eltrico, motor da ventonha, motor do ventilador interno,
limpador de para-brisa dianteiro e traseiro, bomba hidrulica do freio ABS.

Figura 7. 5: Motor CC com caixa de reduo.


Alm do acionamento eltrico, os motores CC de baixa potncia utilizados em
automao e robtica, apresentam geralmente uma caixa de reduo, que um
equipamento composto por engrenagens, com o intuito de reduzir a velocidade de rotao
do eixo (ou angular) e aumentar o torque do motor. O torque varia em funo da fora
aplicada (F) e do raio de giro (nas engrenagens a metade do dimetro primitivo),
segundo a equao T = F.r.

[ 110 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Sendo:
F = fora (em Newtons), r = raio de giro (em metros) e T = torque (em N.m).

Figura 7. 6: Relao de transmisso.


J que o motor imprime uma fora constante, a variao do torque entre
engrenagens ocorre devido ao raio de giro. Na prtica em um sistema de engrenagens,
comprovada pelas equaes abaixo, quanto maior o dimetro da engrenagem movida (D2),
maior o torque (T2) proporcional e menor a velocidade de rotao (n2). Considerando a
engrenagem 1 com motora e a engrenagem 2 como movida, tem-se:
Fconst -> T1/r1 = T2/r2 -> T1/D1 = T2/D2
T2 . D1 = T1 .D2
n2. D2 = n1. d1

COROA E O PARAFUSO COM ROSCA SEM-FIM

A coroa e o parafuso com rosca sem-fim compem um sistema de transmisso


muito utilizado principalmente nos casos em que necessria elevada reduo de
velocidade ou um elevado aumento de fora, como nos redutores de velocidade.

Figura 7. 7: Coroa e sem-fim.


O nmero de entradas do parafuso tem influncia no sistema de transmisso. Se um
parafuso com rosca sem-fim tem apenas uma entrada (mais comum) e est acoplado a

[ 111 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

uma coroa de 60 dentes, em cada volta dada no parafuso a coroa vai girar apenas um
dente. Como a coroa tem 60 dentes, ser necessrio dar 60 voltas no parafuso para que a
coroa gire uma volta. Assim, a rpm da coroa 60 vezes menor que a do parafuso. Se, por
exemplo, o parafuso com rosca sem-fim est girando a 1.800 rpm, a coroa girar a 1.800
rpm, divididas por 60, que resultar em 30 rpm.
Suponhamos, agora, que o parafuso com rosca sem-fim tenha duas entradas e a
coroa tenha 60 dentes. Assim, a cada volta dada no parafuso com rosca sem-fim, a coroa
girar dois dentes. Portanto, ser necessrio dar 30 voltas no parafuso para que a coroa
gire uma volta.
Assim, a rpm da coroa 30 vezes menor que a rpm do parafuso com rosca sem-fim. Se,
por exemplo, o parafuso com rosca sem-fim est girando a 1.800 rpm, a coroa girar a
1.800 divididas por 30, que resultar em 60 rpm. A rpm da coroa pode ser expressa pela
equao:
i = Nc . Zc =Np. Zp
Nc=Np. Zp /Zc
onde:
Nc = nmero de rotaes da coroa (rpm)
Zc = nmero de dentes da coroa
Np = nmero de rotaes do parafuso com rosca sem-fim (rpm)
Zp= nmero de entradas do parafuso
As possibilidades mais comuns de controle digital de motores CC so:
CHAVEAMENTO DE MOTORES CC COM TRANSISTORES MOSFET
Os transistores de efeito de campo MOSFET executam o chaveamento por tenso
na base e podem ser utilizados no lugar dos transistores Darlington para acionamento de
dispositivos de mdia potncia, devido principalmente menor queda de tenso e menor
dissipao em forma de calor.
Os MOSFETs apresentam alta taxa de velocidade no chaveamento e uma
resistncia interna muito baixa (dcimos de ohms). Deesa forma, a queda de tenso nesse
transistor muito baixa, o que no acontece com transistores Darlington. A fgura abaixo
mostra a configurao dos pinos de um MOSFET, onde o pino 1 o Gate (base), o pinos 2
o Drain e o pino 3 o Source.

Figura 7. 8: Mosfet IRF540.


O modelo IRF540 suporta tenses de chaveamento entre o drain e o source de
100V e corrente de at 22A. A figura abaixo mostra o circuito com MOSFET para

[ 112 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

acionamento de quatro motores com MOSFETs. A etapa de potncia composta pelos


MOSFETs IRF530 e diodos de roda lvre para proteo de tenso reversa. O
funcionamento simples. Quando o microcontrolador coloca na sada das portas de
controle um 1 lgico, os transistores MOSFET entram em conduo e uma tenso de 12V
aplicada sobre as cargas. Os resistores e LEDs servem somente para visualizao do
chaveamento. Note que o pino Source do MOSFET conectado ao Gnd do
microcontrolador para gerar a tenso de chaveamento no gate (VG).
A figura abaixo mostra o acionamento de um motor CC de 3V utilizado em robtica mvel
atravs de um mosfet IRF540.

Figura 7. 9: Acionamento de motor com Mosfet.


EXEMPLO: SEGUIDOR TICO DE LABIRINTO

Neste caso interessante definir que no princpio seguidor de parede o rob considera o
obstculo como referncia a qual ele vai seguir em movimento de avano normal. Nesse
exemplo ele cola do lado esquerdo, ou seja, o motor direito deve ser mais rpido que o
motor esquerdo, quando os dois estiverem acionados.
Seguindo as paredes do labirinto at final encontram-se quatro situaes:

Figura 7. 10: Situaes encontradas em labirintos.


importante salientar que no princpio de seguir o obstculo, o rob no pode tocar no
outro lado, em vermelho, pois ele pode tom-lo como referncia e voltar, o que far sair por
onde entrou. Mais detalhes: http://www.youtube.com/watch?v=QRDrG2iEFpM .

[ 113 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

ESTABILIDADE DO CONTROLE DE MOVIMENTO

Para garantir estabilidade do controle de movimento, ou seja, garantir que o rob


est seguindo corretamente a referncia (o obstculo), o sensor tico lateral (L), com sinal
analgico, deve ser lido frequentemente e estar com valores que garantam a presena do
obstculo.
Caso seja acusada a ausncia de obstculo, o microcontrolador deve parar o motor
esquerdo e acionar o motor direito, um determinado tempo, suficiente para garantir as
situaes 3 e 4. Note que o tempo de 4 maior que o de 3, mas com o tempo de 4 na
situao 3, o rob vai ser seguro pelo obstculo at acabar o tempo de desvio e seguir em
frente at encontrar obstculo frontal ou lateral.
Caso o sensor frontal verifique obstculo, mostrado na situao 2, o
microcontrolador para o motor direito, aciona o motor esquerdo e segue em frente at
encontrar obstculo lateral, o que garante a estabilidade do movimento. Note que se o
desvio para a direita for pouco, o guia oval frontal do rob conduzir o rob estabilidade
ao tocar no obstculo com o avano frontal. O circuito mostrado abaixo:

Figura 7. 11: Uso de sensores ticos para controlar motores.


Programa:
#include SanUSB1.h
#define esquerdo pin_b6
#define direito pin_b5
int32 tensaofrente, tensaolateral, aproximacao=4790; //int32 devido aos clculos intermedirios
short int ledpisca;
unsigned int flagnaosensor=0, flagfrente=0, flaggiro=1;
void main() {
clock_int_4MHz();

[ 114 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

setup_adc_ports(AN0_TO_AN1); //Habilita entrada analgica - A0


setup_adc(ADC_CLOCK_INTERNAL);
while(1){
nivel_alto(esquerdo);nivel_alto(direito); //Os dois motores em frente
//************************************************************************
set_adc_channel(1);
tempo_ms(10);
tensaolateral= (5000*(int32)read_adc())/1023;
if (tensaolateral<=4790) { flagnaosensor=0; flagfrente=0; flaggiro=0; }
// Estabilizou, Habilita o giro e a virada de //frente para a direita
//************************************************************************
if (flagnaosensor>=3 && flaggiro==0) {flagnaosensor=0; flaggiro=1;
// Sem barreira (flagnaosensor>=3) gire 170 ///graus
nivel_baixo(esquerdo);nivel_baixo(direito); nivel_alto(pin_b7);tempo_ms(500);//pra
nivel_baixo(esquerdo);nivel_alto(direito); nivel_baixo(pin_b7);tempo_ms(2000); //s gira //de novo
se tiver //estabilizado na lateral (flaggiro==0)
nivel_alto(esquerdo);nivel_alto(direito); // Segue em frente
while (tensaofrente>4790 && tensaolateral>4790)
//Espera at encontrar barreira frontal ou //lateral
{set_adc_channel(0);
tempo_ms(10);
tensaofrente= (5000*(int32)read_adc())/1023;
set_adc_channel(1);
tempo_ms(10);
tensaolateral= (5000*(int32)read_adc())/1023;
}}
//************************************************************************
//ANALGICO
DIGITAL(10 bits)
set_adc_channel(0);
// 5000 mV
1023
tempo_ms(10);
// tensao
read_adc()
tensaofrente= (5000*(int32)read_adc())/1023;
//************************************************************************
if (tensaofrente<=4790 && flagfrente==0) { flagnaosensor=0; flagfrente=1; //encontrou barreira
frontal
nivel_baixo(direito);tempo_ms(500);//vira para a direita
nivel_alto(esquerdo);nivel_alto(direito); // Segue em frente at estabilizar
while (tensaolateral>4790) //Espera at estabilizar a lateral
{set_adc_channel(1);
//Colado no canto frontal e lateral tambm estabiliza
tempo_ms(10);
tensaolateral= (5000*(int32)read_adc())/1023;
}}
++flagnaosensor;
nivel_alto(esquerdo);nivel_alto(direito); //Os dois motores em frente
ledpisca=!ledpisca;
output_bit(pin_b7,ledpisca);
tempo_ms(20);
}}

[ 115 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

O fluxograma do programa do microcontrolador mostrado abaixo:

Figura 7. 12: Fluxograma de funcionamento de rob mvel com sensores.

PONTE H
O acionamento da ponte H permite o movimento do motor nos dois sentidos. A ponte
H pode ser feita com transistores MOSFETs, mais aconselhvel devido a baixa queda de
tenso, ou de potncia Darllington TIP ou BD. Mais
detalhes
em
://www.youtube.com/watch?v=6IIH02dbboE .

[ 116 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 7. 13: Motor em Ponte H.


--------------------------------------------------------------------------------------------------------------DRIVER PONTE H L293D
Uma das solues mais simples e barata em atuao de robs mvis consiste
utilizar um integrado motor driver como o L293D. Este integrado possibilita o controle de
dois motores CC, utilizando quatro pinos de sada do microcontrolador.
O circuito integrado L293D deve ter duas alimentaes. Uma para comando (5V) no
pino 16 e outra para potncia (por exemplo 9,6 V ou 5V) no pino 8. Os motores percebem
uma queda de 0,7V em relao tenso da fonte externa.
As entradas nos pinos 2 e 7 so para acionar o motor A e entradas nos pinos 10 e
15 so para acionar o motor B. O pino 8 conectado fonte de alimentao dos motores
que tem o mesmo Gnd do circuito de controle.

Figura 7. 14: CI Ponte H L293D.


A mudana dos sinais nos pinos de entrada tem o efeito de produzir a alterao do
sentido da corrente no enrolamento do motor, logo do seu sentido de rotao. A Tabela
permite programar o movimento em qualquer direo (conjugando 2 motores).

[ 117 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Se a primeira entrada alta, segunda entrada baixa , ento o motor se desloca para
frente, se a primeira entrada baixa e a segunda entrada alta , o motor se movimenta para
trs. Se ambas as entradas baixas ou altas, o motor pra.
SOLENIDES E RELS

Uma solenide consiste num mbolo de ferro colocado no interior de uma bobina
(indutncia) eltrica, enrolada em torno de um tubo. Quando se alimenta eletricamente a
bobina, cria-se um campo magntico que atrai o mbolo (ncleo mvel) para dentro da
bobina como mostrado na figura abaixo. No caso de um rel, fecha um contato para
circulao de outro nivel maior de corrente.

Figura 7. 15: Solenide.


Os rels so dispositivos comutadores eletromecnicos (Figura 2.14). A estrutura
simplificada de um rel mostrada na figura abaixo e a partir dela explicado o seu
princpio de funcionamento.

[ 118 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 7. 16: Rels.


O controle de uma solenide ou rel pode ser feito pelo chaveamento de um
transistor Darlington ou de um MOSFET mostrado abaixo.
O rel um tipo de interruptor acionado eletricamente que permite o isolamento
eltrico de dois circuitos. O rel formado por um eletrom (uma bobina enrolada sobre
um ncleo de material ferromagntico) que quando acionado, atravs da atrao
eletromagntica, fecha os contatos de um interruptor. Normalmente o interruptor de um
rel tem duas posies, com isso existem dois tipos, os NF(normalmente fechado) e NA
(normalmente aberto), como mostra a figura abaixo. A bobina do rel acionada por uma
tenso contnua que especificada de acordo com o fabricante, bobinas de 5, 12 e 24
Volts so as mais comuns.

Figura 7. 17: Acionamento de motor 12V com rel bobina 5V.


Uma das caractersticas do rel que ele pode ser energizado com correntes muito
pequenas em relao corrente que o circuito controlado exige para funcionar. Isso
significa a possibilidade de controlar circuitos de altas correntes como motores, lmpadas e
mquinas industriais, diretamente a partir de microcontroladores.

Figura 7. 18 Aplicao de um rel.

[ 119 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

DRIVER DE POTNCIA ULN2803


Um driver de potncia utilizado sempre quando se necessita acionar um hardware
especifico de maior potncia. Esse driver pode ser usado para controlar motores de
passos, solenides, rels, motores CC e vrios outros dispositivos. Ele contm
internamente 8 transistores Darlington NPN de potncia, oito resistores de base de 2K7 e
oito diodos de roda livre, para descarregar no Vcc (pino 10) a corrente reversa da fora
contra-eletromotriz gerada no chaveamento dos transistores, protegendo os mesmos.
Quando o microcontrolador coloca +5V (nivel lgico 1) no pino 1 do driver ULN2803,
ele conecta o pino 18 do outro lado, onde est liga um plo do motor, ao Gnd (nivel lgico
0, por isso a simbologia de porta inversora na figura abaixo). Como o outro lado da bobina
(o comum) ou do motor deve estar ligado ao Vcc da fonte de at 30V, esse comando ir
energizar a bobina ou o motor.

Figura 7. 19: ULN 2803.


Nesta prtica ser possvel ligar/desligar cargas de tenses mais elevadas que a do circuito,
que 5V da USB. Se estiver sendo utilizado um rel 5Vcc/220Vca, possvel ligar lmpadas e at
eletrodomsticos, como ventiladores, televisores, rdios; sendo necessrio apenas conectar
220Vca ao comum do rel. necessrio apenas acrescentar um driver de potncia, o ULN 2803,
que dispe de 8 transistores internos, ou seja, com ele possvel acionar at 8 rels,
consequentemente, 8 cargas.

[ 120 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 5. 10: Esquemtico Prtica 5.

Inicialmente sero utilizados 2 LEDs conectados aos contatos NA e NF do rel apenas


para testar seu funcionamento. Enquanto um LED acender, o outro estar apagado. Para
alimentar o LED, ser utilizada a tenso de 5V da prpria USB do circuito SanUSB. A
Figura 5.11 mostra detalhes da montagem.

Figura 5. 11: Esquemtico Prtica 5.

[ 121 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 5. 12: Prtica 5 Microrrels, montada em protoboard.

PONTE H COM MICRORELS


Como foi visto, acionamento da ponte H permite o movimento do motor nos dois
sentidos. A ponte H pode ser feita tambm com apenas dois microrels. Neste caso, podese utilizar tambm o driver ULN2803 para a energizao das bobinas, pois j contm
internamente oito transistores com resistores de base e oito diodos de roda livre. Esse tipo
de ponte H, mostrada na figura abaixo, no causa queda de tenso na fonte de
alimentao do motor, porque as fontes de energizao da bobina do microrel e de
alimentao do motor devem ser diferentes, ou seja, isoladas uma da outra, para que seja
possvel o chaveamento do rel.

[ 122 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 7. 20: Acionamento de motor nos 2 sentidos com rels em Ponte H.


Note que inicialmente os dois rels esto conectados ao V-Motor. Ao energizar a
bobina do rel da esquerda, conectando o V+Motor, a corrente da fonte passa pelo motor
no sentido da esquerda para a direita o que determina o sentido de rotao do motor. Ao
desligar o rel da esquerda e acionar o rel da direita ocorre o sentido de rotao inverso
do motor.
Quando se utiliza motor CC em ponte H para atuadores robticos, como rodas de
veculos ou braos mecnicos, o que determina o torque e a velocidade do atuador a
relao de transmisso da caixa de engrenagens conectada ao motor.
ACIONAMENTO DE MOTORES DE PASSO
Motores de passos so dispositivos mecnicos eletromagnticos que podem ser
controlados digitalmente.
A crescente popularidade dos motores de passo se deve total adaptao desses
dispositivos lgica digital. So encontrados no s em aparelhos onde a preciso um
fator muito importante como impressoras, plotters, scanners, drivers de disquetes, discos
rgidos, mas tambm, como interface entre CPUs e movimento mecnico, constituindo, em
suma, a chave para a Robtica.
MOTORES DE PASSO UNIPOLARES
Os motores de passo unipolares so facilmente reconhecidos pela derivao ao
centro das bobinas. O motor de passo tem 4 fases porque o nmero de fases duas vezes
o nmero de bobinas, uma vez que cada bobina se encontra dividida em duas pela
derivao ao centro das bobinas (comum).

[ 123 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Normalmente, a derivao central das bobinas est ligada ao terminal positivo da


fonte de alimentao (Vcc) e os terminais de cada bobina so ligados alternadamente
terra atravs de chaveamento eletrnico produzindo movimento.
As bobinas se localizam no estator e o rotor um im permanente com 6 plos ao
longo da circunferncia. Para que haja uma maior resoluo angular, o rotor dever conter
mais plos.

Figura 7. 21: Motor de passo unipolar.


Os motores de passo unipolares mais encontrados possuem 5 ou 6 fios. Os motores
de passo unipolares de 6 fios possuem dois fios comuns (derivao central). Para o
acionamento do motor de passo, estes fio comuns devem ser ligados fonte de
alimentao (+5V ou +12V) e os terminais da bobina ligados ao controle de chaveamento
do motor de passo.

Motor de 5 fios

Motor de 6 fios

Figura 7. 22: Motores de passo unipolar conexo interna.


Para descobrir os terminais de um motor de passo, deve-se considerar que:
Para motores de 6 fios, a resistncia entre os fios comuns (Fio 1 e Fio 2) infinita por se
tratarem de bobinas diferentes.
A resistncia entre o fio comum (Fio 1) e o terminal de uma bobina a metade da
resistncia entre dois terminais desta bobina.
Para encontrar a seqncia correta dos fios para chaveamento das bobinas, podese ligar manualmente o fio comum ao Vcc, e de forma alternada e seqencial, o GND
(terra) da fonte aos terminais das bobinas, verificando o movimento do motor de passo.

[ 124 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

MODOS DE OPERAO DE UM MOTOR DE PASSO UNIPOLAR

PASSO
COMPLETO
1
(FULL-STEP)
-Somente meia bobina energizada a cada passo a partir
do
comum;
-Menor
torque;
-Pouco
consumo
de
energia.
N do
passo
1-->
2-->
3-->
4-->

1a 2a 1b 2b Decimal
1
0
0
0

0
1
0
0

0
0
1
0

0
0
0
1

8
4
2
1
PASSO
COMPLETO
2
(FULL-STEP
2)
-Duas meia-bobinas so energizadas a cada passo;
-Maior
torque;
-Consome mais energia que o Passo completo 1.

N do
passo
1-->
2-->
3-->
4-->

1a 2a 1b 2b Decimal
1
0
0
1

1
1
0
0

0
1
1
0

0
0
1
1

8
4
2
1

Figura 7. 23: Caractersticas e Lgica de acionamento de motor de passo.


ACIONAMENTO BIDIRECIONAL DE DOIS MOTORES DE PASSO

Como o driver de potncia ULN2803 ou ULN2804 possui internamente 8


transistores de potncia ele capaz de manipular dois motores de passo ao mesmo
tempo. Ele contm internamente oito diodos de roda livre e oito resistores de base dos
transistores, o que possibilita a ligao direta ao microcontrolador e aos motores de passo.

[ 125 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 7. 24: Conexo do motor de passo no PIC.


A bateria para motores de passo deve ter uma corrente suficiente para energizar as
bobinas do motor de passo. Dessa forma, possvel associar baterias 9V em paralelo
para aumentar a corrente de energizao ou utilizar baterias de No-Breaks. O link abaixo
mostra
esse
motor
utilizando
a
ferramenta
SanUSB
http://www.youtube.com/watch?v=vaegfA65Hn8.
SERVO-MOTORES

H dois tipos de servos: os de posio, com giro de 180, e o de rotao, que possui
o giro contnuo. O Servo de Posio utilizado em antenas parablicas, em braos
robticos, na robtica mvel terrestre com o controle de pernas mecnicas e no controle de
cmeras. O Servo de Rotao prioritariamente escolhido para a locomoo por rodas.
Trata-se de dispositivos muito precisos que giram sempre o mesmo ngulo para um
dado sinal. Um servo tpico possui trs fios de ligao, normalmente preto, vermelho e
branco (ou amarelo). O condutor preto a referncia de massa da alimentao (0 volts), o
condutor vermelho a alimentao e o condutor branco (ou amarelo) o sinal de
posicionamento, como mostrado na figura abaixo que um carro para desvio de
obstculos, acionado por dois servo-motores de rotao. O sinal do servo-motor de
posio normalmente um pulso de 1 a 2 milisegundos (ms), repetido depois de um pulso
de 10 a 20ms. Com o pulso de aproximadamente 1 ms o servo move-se para um sentido e
com o impulso de 2 ms para o sentido oposto. Desse modo, com um impulso de 1,5 ms, o
servo roda para a posio central.

[ 126 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 7. 25: Aplicao de servo-motores em rob mvel.


A tenso de alimentao do servomotor tipicamente de 5V, podendo variar entre
4,5V e 6V. Devido alta reduo do jogo de engrenagens, o torque que se obtm de um
servo bastante alto, considerando o seu tamanho reduzido. Lamentavelmente, os servos
consomem correntes elevadas (de 200 mA a 1 A) e introduzem rudo eltrico nos
condutores de alimentao, necessitando a aplicao de capacitores de filtro. O programa
abaixo move um servo-motor de rotao para frente e um outro para trs. Note que essa
operao utilizada por robs mveis que possuem dois motores em anti-paralelo.
#include SanUSB1.h
#define motor1 pin_b5
#define motor2 pin_b6
int16 frente=50;
short int led;
void main(){
clock_int_4MHz();
while (TRUE)
{
while (frente>0)
{ nivel_alto(motor2);
//Inicializa o pulso do motor 1
nivel_alto(motor1);
//Inicializa o pulso do motor 2
tempo_ms(1);
nivel_baixo(motor1); //Termina o pulso de 1ms do motor1 sentido horrio
tempo_ms(1);
nivel_baixo(motor1);
nivel_baixo(motor2);
//Termina o pulso de 2ms do motor2 sentido anti-horrio
tempo_ms(10);
--frente;
}
frente=50;
led=!led; //pica led a cada 50 ciclos do servo-motor, ou seja a cada 12ms*50 = 600ms
output_bit(pin_b7,led);
}}

[ 127 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 7. 26: Visualizao interna de um servo-motor.


O programa abaixo move um servo-motor de posio. Com o pulso de
aproximadamente 1 ms, o servo move-se para 0 graus, e com o pulso de 1,2 ms para 90
graus e com o pulso de 2 ms para 180 graus. Note que este motor utilizado em antenas
parablicas, em sistemas robticos e no controle de cmeras.
#include "SanUSB1.h" //Servo-motor de parablica - 3 posies definidas: 0, 90 e 180 graus.
#pragma interrupt interrupcao //Tem que estar aqui ou dentro do firmware.c
void interrupcao(){
}
Unsigned int FRENTE=200, TRAS=200; //no servo de teste 200 passos corresponderam a aprox.
1 volta
void main(){
clock_int_4MHz();
while (1){
while (FRENTE>0){
FRENTE--;
nivel_alto(pin_b0);
tempo_ms(1);
// tempo de busca de 0 graus
nivel_baixo(pin_b0);
tempo_ms(10);}
FRENTE=200;
while (TRAS>0){
TRAS--;
nivel_alto(pin_b0);
tempo_ms(2);
// tempo de busca de 180 graus
nivel_baixo(pin_b0);
tempo_ms(10);}
TRAS=200;
inverte_saida(pin_b7);}
}

O micro-servomotor da figura a seguir suporta 1,6kg e apresenta apenas 3 fios:


BRANCO
VERMELHO

SINAL(PINO B0)
VCC (5V) +

[ 128 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

PRETO

GND (0V) -

Figura 4: Micro-servomotor 1,6kg com placa SanUSB.


Abaixo, possvel observar a mesma ligao feita para o servo de maior porte, 10kg.

Figura 5: Micro-servomotor 10kg com placa SanUSB.

Cdigo em C para MPLABX Micro-servomotor:


#include "SanUSB1.h"
int x;
#pragma interrupt interrupcao //Tem que estar aqui ou dentro do firmware.c
void interrupcao(){
}
void main(){
clock_int_4MHz();

[ 129 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

while(true){
nivel_alto(pin_b7);
for(x=0;x<40;x++){
nivel_alto(pin_b0);
tempo_ms(2);
nivel_baixo(pin_b0);
tempo_ms(10);
}
for(x=0;x<40;x++){
nivel_alto(pin_b0);
tempo_ms(1);
nivel_baixo(pin_b0);
tempo_ms(11);
}
for(x=0;x<40;x++){
nivel_alto(pin_b0);
tempo_ms(0);
nivel_baixo(pin_b0);
tempo_ms(12);
}
}
}

Cdigo em C para MPLABX Servomotor:


#include "SanUSB1.h"
int x;
#pragma interrupt interrupcao //Tem que estar aqui ou dentro do firmware.c
void interrupcao(){
}
void main(){
clock_int_4MHz();
while(true){
nivel_alto(pin_b7);
for(x=0;x<200;x++){//anti horario
nivel_alto(pin_b0);
tempo_ms(2);
nivel_baixo(pin_b0);
tempo_ms(8);
}
for(x=0;x<40;x++){//parado
nivel_alto(pin_b0);
tempo_ms(0);
nivel_baixo(pin_b0);
tempo_ms(10);
}
for(x=0;x<200;x++){//horario

[ 130 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

nivel_alto(pin_b0);
tempo_ms(1);
nivel_baixo(pin_b0);
tempo_ms(9);
} }}

FOTOACOPLADORES E SENSORES INFRAVERMELHOS


Fotoacopladores ou optoisoladores proporcionam a isolao de sinais em uma grande
variedade de aplicaes. Tambm chamados de acopladores ticos, eles comutam ou
transmitem sinais e informaes ao mesmo tempo que isolam diferentes partes de um
circuito.
Optoisoladores lineares so usados para isolar sinais anlogos at 10MHz, enquanto
optoisoladores digitais so usados para controle, indicao de estados, isolao de sinais
de comando e mudanas de nveis lgicos.
Existem fotoacopladores de diversos tipos e com construes internas diversas, como,
por exemplo, acopladores onde a construo interna baseada em um diodo
infravermelho e um fototransistor. Como exemplo podemos citar o 4N25 e o TIL111:

Figura 8. 1: Visualizao interna de um Fotoacoplador.


Esse dispositivo pode ser utilizado por um microcontrolador para identificar a
presena de tenso 220VAC em um determinado ponto. A potncia mxima dissipada por
esse componente de 250mW em 25 graus Celsius. Dessa forma, deve-se dimensionar
um resistor em srie com o foto-diodo interno para proteg-lo.
Escolhendo resistores so de 333mW, ou seja, a potncia mxima que pode ser
dissipada em cada um deles. interessante que exista um certo intervalo de segurana
entre a potncia mxima do componente e a potncia mxima dissipada. Ento, a potncia
mxima escolhida para os resistores de 200mW. Na Equao (6.1) calculado o resistor
que ser utilizado no circuito, considerando a tenso de pico. Considere 311V como a
tenso de pico.
P=V2/R -> 0,2W = (311)2/R -> R=483 K.
O resistor comercial mais prximo desse valor 470K.

[ 131 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 8. 2: Aplicao de um fotoacoplador.


TRANSMISSOR E RECEPTOR IR
Os transmissores e receptores IR (infrared ou Infravermellhos) so muito utilizados
como sensor tico por reflexo difusa para registro de posio. A figura abaixo mostra o
circuito do sensor e um grfico do sinal de sada (em mV) do receptor IR em funo da
distncia perceptvel pelo receptor IR com resistor de elevao de tenso para 5V (pull-up
2K2). O vdeo http://www.youtube.com/watch?v=18w0Oeaco4U mostra essa variao, com
o acionamento de um led pela queda do sinal analgico atarvs da conduo do receptor
IR.

Figura 8. 3: Conexo do par infravermelho: TIL 32 (emissor) e TIL 78 (receptor).


Para ter um maior alcance e perceber uma maior variao de posio, com esse
sensor, aconselhvel utilizar o conversor AD de 10 bits do microcontrolador para
identificar variaes de at 5mV no sinal do sensor. A distncia tima a distncia em que
incide no receptor a maior parte do feixe de luz emitido pelo transmissor. Nessa distncia
ocorre a maior variao (queda) do sinal de sada analgico do receptor IR.

[ 132 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Utilizando o princpio on/off, s h identificao de posio quando o sinal do


receptor for menor ou igual a 2,5V (nivel lgico baixo), o que torna o sensoreamento muito
limitado.
Durante os testes desse circuito foi verificado que, devido a resistncia de 390 em
paralelo com 2K2, quando o led conectado no circuito, h uma diminuio na variao do
sinal de sada analgico do receptor IR. O programa abaixo mostra a leitura em mV do
sensor tico via emulao serial.
#include "SanUSB1.h" //Leitura de tenso em mV com infrared
#pragma interrupt interrupcao //Tem que estar aqui ou dentro do firmware.c
void interrupcao(){
}
Long int tensao;
void main() {
clock_int_4MHz();
setup_adc_ports(AN0); //Habilita entrada analgica - A0
setup_adc(ADC_CLOCK_INTERNAL);
while(1){
//ANALGICO
DIGITAL(10 bits)
set_adc_channel(0);
// 5000 mV
1023
tempo_ms(10);
// tensao
read_adc()
tensao= (5000*(int32)read_adc())/1023;
printf ("\r\nA tensao e' = %lu mV\r\n",tensao); // Imprime pela serial bluetooth
inverte_saida(pin_b7);
tempo_ms(500);}}

Durante os testes desse circuito foi verificado que, devido a resistncia de 390 em
paralelo com 2K2 , quando o led conectado no circuito, h uma diminuio na variao
do sinal de sada analgico do receptor IR. O programa a seguir mostra a leitura em mV do
sensor tico via emulao serial.
#include <SanUSB.h> //Leitura de tenso em mV com variao de um //potencimetro
#include <usb_san_cdc.h>// Biblioteca para comunicao serial virtual
int32 tensao;
main() {
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com a usb do PC
setup_adc_ports(AN0); //Habilita entrada analgica - A0
setup_adc(ADC_CLOCK_INTERNAL);
while(1){
//ANALGICO
DIGITAL(10 bits)
set_adc_channel(0);
// 5000 mV
1023
delay_ms(10);
// tensao
read_adc()
tensao= (5000*(int32)read_adc())/1023;
printf (usb_cdc_putc,"\r\nA tensao e' = %lu mV\r\n",tensao); // Imprime pela serial //virtual
inverte_saida(pin_b7);

[ 133 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

delay_ms(500); }}

Deve-se atentar que no receptor infravermelho o catodo e o anodo so invertidos, ou


seja, no TIL 78, o terminal que vai para o GND o Anodo.
Se o receptor no for escuro, preto ou azul, mas sim transparente, deve-se
diferenciar como mostra a Figura a seguir. O Emissor visto frontalmente apresenta contato
circular, enquanto o receptor, quadrado.

TIL 78
receptor

TIL 32
emissor

Figura 6. 7: Par infravermelho.

Figura 6. 8: Prtica 8 Sensor Infravermelho, montada em protoboard.


AUTOMAO E DOMTICA COM CONTROLE REMOTO UNIVERSAL
A comunicao entre uma unidade remota e um eletrodomstico, como uma TV, se
d geralmente por emisso de radiao infravermelha modulada por pulsos.

[ 134 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 8. 4: Diagrama de blocos de comunicao infravermelha.


Para tornar o sistema insensvel a interferncias e filtrar os rudos, aceitando apenas
as ordens do controle remoto, o cdigo de pulsos do emissor contm um dado binrio, que
identificado pelo decodificador do receptor.
As interferncias podem se originar de fontes estticas, isto , que no pulsam,
como o sol, lmpadas incandescentes, aquecedores, e de fontes dinmicas que so mais
intensas e geram maior interferncia, como lmpadas fluorescentes, a imagem da TV,
outros transmissores de infravermelho e etc.
O receptor, geralmente contido num nico invlucro montado no painel frontal do
televisor, entrega ao decodificador apenas os pulsos retangulares correspondentes aos
cdigos de identificao e dados, eliminando a maioria das fontes de interferncias, exceto
as que tenham a mesma frequncia de pulsos, cabendo a rejeio destas ao
Decodificador, se no tiverem o mesmo cdigo de pulsos.
Para acionar uma carga distncia basta ter o controle remoto e o receptor
infravermelho, pois ao invs de capturar o cdigo em bits emitidos pelo controle remoto
para decodificao, possvel identificar apenas o start bit desse cdigo que apresenta
nivel lgico baixo (0V) que, conectado ao pino de interrupo externa (B0) do
microcontrolador com um resistor de pull-up de 2K2, executar uma tarefa desejada como,
por exemplo, o chaveamento de um rel para acionamento de uma mquina. Um exemplo
de circuito para acionamento de cargas remotas com controle universal pode ser vista
abaixo e em http://www.youtube.com/watch?v=1l6s9xtrJl0 .

[ 135 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 8. 5: Conexo de receptor infravermelho de TV no PIC.


Note que, se nesse caso no houver um sistema de decodificao, o receptor deve
ter um invlucro para proteo contra interferncias, pois est sujeito s fontes estticas e
dinmicas. Abaixo um programa exemplo de acionamento de um rel atravs de um
controle remoto universal.
#include SanUSB1.h
short int rele;
#int_ext
void bot_ext()
{
rele=!rele;
output_bit(pin_b5,rele);
tempo_ms(1000); //Tempo para deixar o receptor cego por 1 seg aps a 1 atuao da
interrupo
}
void main() {
clock_int_4MHz();
enable_interrupts (global); // Possibilita todas interrupcoes
enable_interrupts (int_ext);//Habilita int. ext. 0 no pino B0 onde est o receptor infravermelho
while (TRUE)
{
inverte_saida(pin_B7);
tempo_ms(500);
}}

Para filtrar as interferncias dinmicas necessrio colocar o receptor em uma


caixa preta com um pequeno orifcio ou em um tubo feito de caneta com cola quente, como
mostra a figura abaixo, para receber somente a luz IR direcional.

[ 136 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 8. 6: Exemplo de proteo do receptor contra emisses externas de raios IR.

CODIFICAO DE RECEPTOR INFRAVERMELHO UTILIZANDO A NORMA RC5


RC5 uma norma universal desenvolvida pela Phillips para comandos a distncia
por infravermelho utilizada principalmente em equipamentos de udio, televisores,
videocassetes e outros aparelhos domsticos, com uma rea de alcance de
aproximadamente 10m.
A norma RC5 usa modulao bifsica, ou seja, cdigo Manchester. Cada bit
separado por dois semi-ciclos; a metade esquerda e direita tm nveis opostos. Se o bit a
ser transmitido for zero (0), o seu lado esquerdo (primeiro semi-ciclo) um e o seu lado
direito zero (segundo semi-ciclo). Se o bit a ser transmitido for um (1), o seu lado
esquerdo zero quando o seu lado direito um.

Figura 8. 7: Modulao Bifsica.


O cdigo transmitido consiste de uma palavra de 14 bits, sendo eles :
- 2 bits para ajuste do nivel (2 start bits). O primeiro e o segundo corresponde a 1;
- 1 bit para controle (toggle bit ou flip) que muda de estado lgico cada vez que um boto
pressionado na unidade de comando a distncia. Isto serve para indicar se o boto foi
pressionado uma vez ou se continua sendo pressionado;
- 5 bits de endereo do sistema para seleo de 1 dos 32 sistemas possveis listados na
tabela 7. Isso define o tipo de aparelho que se pretende controlar;
- 6 bits de comando representando 1 dos 128 comandos possveis. Isso define a ao que
se pretende executar em um determinado aparelho (sistema) selecionado.
Na figura abaixo vemos os bits de 1 a 14 e sua identificao: em azul claro os start
bits 1 e 2 de equalizao; o bit 3, FLIP, em amarelo; bits de 4 a 8 em azul indicando o
endereamento; e os bits de 9 a 14, indicando o comando a executar.

[ 137 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 8. 8: Sinal transmitido.


Na norma RC5, os dados so modulados numa frequncia portadora de 30 a
40KHz, indicados pelos dois ltimos nmeros do receptor TSOP1740, TSOP4836,
TSOP4830. Considerando uma modulao de 36 kHz, o perodo de cada bit corresponde a
64 pulsos de 1/36 kHz, ou seja, 64 vezes 27,7 us (micro segundos), o em que
corresponde a aproximadamente 1772us. O programa abaixo identifica o o endereo do
sistema e o comando das teclas pressionadas por um controle remoto RC5.
#include SanUSB1.h //Programa com protocolo RC5 da Philllips de controle remoto
char chegoupc, comando, sistema, bit_rx;
int32 i;
void identifica_bit(void){
bit_rx=0;
if (input(pin_b0)==1) {bit_rx=1;} //identifica 0 ou 1
tempo_us(860); // //pula para o prximo perodo para outra leitura
}
#int_ext
void san_ext()
{
inverte_saida(pin_b6);
sistema=0;
comando=0;
//*************************************************
tempo_us(750); //Tempo do start bit 1 com a perda do tempo do primeiro semi-ciclo alto pela
interrupo
tempo_us(1720); //Tempo do start bit 2
tempo_us(1720); //Tempo do toogle bit
tempo_us(860); //pula o primeiro semi-ciclo
identifica_bit();
if (bit_rx) sistema|=16; //Bit 5 do byte sistema 0b00010000
tempo_us(860); //pula o primeiro semi-ciclo
identifica_bit();
if (bit_rx) sistema|=8; //Bit 4 do byte sistema 0b00001000
tempo_us(860); //pula o primeiro semi-ciclo
identifica_bit();
if (bit_rx) sistema|=4; //Bit 3 do byte sistema 0b00000100
tempo_us(860); //pula o primeiro semi-ciclo
identifica_bit();
if (bit_rx) sistema|=2; //Bit 2 do byte sistema 0b00000010

[ 138 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

tempo_us(860); //pula o primeiro semi-ciclo


identifica_bit();
if (bit_rx) sistema|=1; //Bit 1 do byte sistema 0b00000001
//*************************************************
tempo_us(860); //pula o primeiro semi-ciclo
identifica_bit();
if (bit_rx) comando|=32; //Bit 4 do byte comando
tempo_us(860); //pula o primeiro semi-ciclo
identifica_bit();
if (bit_rx) comando|=16; //Bit 5 do byte comando
tempo_us(860); //pula o primeiro semi-ciclo
identifica_bit();
if (bit_rx) comando|=8; //Bit 4 do byte comando
tempo_us(860); //pula o primeiro semi-ciclo
identifica_bit();
if (bit_rx) comando|=4; //Bit 3 do byte comando
tempo_us(860); //pula o primeiro semi-ciclo
identifica_bit();
if (bit_rx) comando|=2; //Bit 2 do byte comando
tempo_us(860); //pula o primeiro semi-ciclo
identifica_bit();
if (bit_rx) comando|=1; //Bit 1 do byte comando
//*************************************************
write_eeprom(0x10,sistema); write_eeprom(0x11,comando); ////guarda as variveis decodificadas
while(le_eeprom(0xfd));
printf ("comando: %x\r\n",le_eeprom(0x11));
tempo_ms(500); //Tempo para deixar o receptor cego por um segundo aps a primeira atuao da
interrupo
}
void main() {
clock_int_4MHz();
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com USB do PC //Para depurar o programa em aplicao real
while(!usb_enumerated()); //Aguarda reconhecimento da emulao serial via USB
enable_interrupts (global); // Possibilita todas interrupcoes
enable_interrupts (int_ext); // Habilita interrupcao externa 0 no pino B0 onde est ligado o receptor
infravermelho
while(1)
{
if (kbhit(1)) //avisa se chegou dados do PC
{
chegoupc=getc(); //se chegou, retm o caractere e compara com 'L' ou 'D'

[ 139 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

if (chegoupc=='L') {inverte_saida(pin_b6); printf("\r\nTesta led!\r\n");}


}
++i; if (i>=10000) {i=0; inverte_saida(pin_b7);} //Led de visualizao
}}

O resultado dos comandos gerados que correspondem s teclas pressionadas de um


controle remoto Phillips RC5 mostrado na figura abaixo. Mais detalhes no vdeo:
http://www.youtube.com/watch?v=9VG7RokuDTs.

Figura 8. 9: Leitura da tecla pressionada via monitor serial.

LCD (DISPLAY DE CRISTAL LQUIDO)


O LCD, ou seja, display de cristal lquido, um dos perifricos mais utilizados como
dispositivo de sada em sistemas eletrnicos. Ele contm um microprocessador de
controle, uma RAM interna que mantm escritos no display (DDRAM) os dados enviados
pelo microcontrolador e uma RAM de construo de caracteres especiais (CGRAM). Os
LCDs so encontrados nas configuraes previstas na Tabela abaixo.
Nmero de
Colunas
8
12
16
16

Nmero de
Linhas
2
2
1
2

[ 140 ]

Quantidade
de pinos
14
14/15
14/16
14/16

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

16
20
20
20
24
24
40
40

4
1
2
4
2
4
2
4

14/16
14/16
14/16
14/16
14/16
14/16
16
16

Os displays mais comuns apresentam 16 colunas e duas linhas. Eles tm


normalmente 14 pinos ou 16 pinos. Destes, oito pinos so destinados para dados ou
instruo, seis so para controle e alimentao do perifrico e dois para backlight. O LED
backlight (iluminao de fundo) serve para facilitar as leituras durante a noite. Neste caso,
a alimentao deste led faz-se normalmente pelos pinos 15 e 16, sendo o pino 15 para
ligao ao anodo e o pino 16 para o catodo. A ferramenta SanUSB tem uma biblioteca em
C para este perifrico que utiliza somente o nibble superior do barramento de dados
(D7, D6, D5 e D4), como o caso da biblioteca MOD_LCD_SANUSB.c com a seguinte
configurao:

Figura 9. 1: Conexo do LCD no PIC.


A Tabela abaixo traz um resumo das instrues mais usadas na comunicao com
os mdulos LCD.
Tabela - Instrues mais comuns
DESCRIO
MODO
R
R/W
Cdigo
S
(Hex)
Display
Liga (sem cursor)
0
0
0C
Desliga
0
0
0A/ 08
Limpa Display com Home cursor
0
0
01
Controle do Cursor
Liga
0
0
0E
Desliga
0
0
0C
Desloca
para 0
0
10
Esquerda
Desloca para Direita
0
0
14
Cursor Home
0
0
02

[ 141 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Sentido de deslocamento
cursor ao entrar com caractere
Deslocamento da mensagem
ao entrar com caractere
Deslocamento da mensagem
sem entrada de caractere
End. da primeira posio

Cursor Piscante
0
Cursor
com 0
Alternncia
Para a esquerda
0
Para a direita
0
Para a esquerda
0
Para a direita
0
Para a esquerda
0
Para a direita
0
primeira linha
0
segunda linha
0

0
0

0D
0F

0
0
0
0
0
0
0
0

04
06
07
05
18
1C
80
C0

Utilizando as instrues do LCD:


Para rolar o contedo do LCD um caractere para a direita, utilize o comando
lcd_envia_byte(0, instruo), por exemplo, lcd_envia_byte(0,0x1C) e para rolar o
contedo do LCD um caractere para a esquerda, utilize o comando
lcd_envia_byte(0,0x18).

[ 142 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 5. 13: Prtica 6 Display LCD, montada em

protoboard.
Figura 5. 14: Prtica 6 Display LCD, montada em protoboard.

Exemplo de uso do recurso de rolagem do display.


A seguinte seqncia de comandos, gera o efeito de uma mensagem rolando no
display. Para isso, ser necessrio declarar uma varivel do tipo INT x.
Cdigo em C para MPLABX: Escrever em LCD / Rolar Caracteres
#include "SanUSB1.h"
//Emulao de uma softserial (porta serial) nos pinos B4 e B5 via software
#include "lcd_16x2.h"// RB0-RS, RB1-EN, RB2-D4, RB3-D5, RB4-D6, RB5-D7
#pragma interrupt interrupcao //Tem que estar aqui ou dentro do firmware.c
void interrupcao(){
}
void
main() {
clock_int_4MHz();
lcd_ini(); // Configurao inicial do LCD
lcd_escreve("*FERRAMENTA SanUSB*");
while (1) {

[ 143 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

lcd_pos_yx(2,1); // Posiciona segunda linha


lcd_escreve("

Teste LCD");//temperatura Com LM35

lcd_envia_controle (0,0,0x18,40); // rola display um caractere para esquerda


//Para deixar parado basta retirar a linha acima
lcd_envia_controle (0,0,0x0C,40); //Apaga o cursor
inverte_saida(pin_b7);
tempo_ms(500);
}}

Para ativar o cursor, utilize o comando lcd_envia_byte(0,0x0E). Para ativar o cursor


piscante, utilize o comando lcd_envia_byte(0,0x0F), e para desativar o cursor, use
lcd_envia_byte(0,0x0C);
Posicionando o cursor:
Para posicionar o cursor no LCD, podemos usar a funo lcd_pos_xy(x,y), onde
x e y so, respectivamente, a coluna e a linha onde o cursor deve ser reposicionado.
Desta forma, caso deseje escrever algo na primeira linha do display, sem apagar a
segunda linha, basta inserir o comando lcd_pos_xy(1,1). Isso ir posicionar o cursor na
primeira linha, e primeira coluna. No entanto, tome cuidado, pois uma vez que o display
no foi apagado, as informaes antigas permanecero na primeira linha, a menos que
voc as sobrescreva.
STRING : o trecho de caracteres delimitado por aspas duplas, que ir definir como ser
a seqncia de caracteres a ser gerada. Dentro das aspas, podem ser inseridos caracteres
de texto, caracteres especiais e especificadores de formato.
No caso dos caracteres especiais, por no possurem uma representao impressa, so
compostos por uma barra invertida seguida de um smbolo, geralmente uma letra.
Exemplo de caracteres especiais : \f (limpar display), \n (nova linha), \b (voltar um
caractere), \r (retorno de carro), \g (beep), etc...
Obs: alguns caracteres especiais somente resultaro efeito em terminais seriais.
J os especificadores de formato so os locais, em meio ao texto, onde sero
inseridas as variveis que aparecero aps a STRING. Desta forma, estes especificadores
devem obedecer algumas regras, de acordo com o tipo da varivel a ser impressa.
Observe a seguinte tabela :
Tipo
de Especificador de formato e exemplos de uso
varivel
%u valor decimal (ex: 30)
%x
valor em hexadecimal (ex: 1D)
int
%3u valor decimal alinhado com trs dgitos (ex: _30)
%03u valor decimal alinhado 3 dgitos c/ zero (ex: 030)
%i
valor decimal com sinal. (ex: -2)
signed int
%02i decimal com sinal, 2 casas e zeros a esq. (ex: -02)
long
%lu valor decimal (ex: 32345675);

[ 144 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

int32
signed
long
signed
int32
float
char

%05lu valor decimal 5 casas c/ zeros a esquerda. (ex: 01000)


%li
valor decimal c/ sinal (ex: -500)
%4li valor decimal c/ sinal alinhado a esquerda (ex: -_500)
%f
valor real. Ex: (23.313451)
%2.3f valor real c/ 2 casas inteiras, 3 decimais. Ex: (23.313)
%c
caractere. Ex: (A)

EXEMPLO: CONTROLE DE TENSO DE UMA SOLDA CAPACITIVA COM LCD


O princpio de uma solda capacitiva acontece atravs da descarga instantnea de
capacitores previamente carregados por dois terminais de solda em um ponto especfico.
Este projeto consiste em realizar o controle de tenso de uma solda capacitiva em
baixo custo, atravs de um sistema microcontrolado utilizando o PIC18F2550. Para a
leitura da tenso CC nos terminais da solda capacitiva, na ordem de 300V, necessrio
inicialmente utilizar um divisor de tenso para adequao tenso mxima do conversor
AD do microcontrolador de 5V. Esta relao do divisor compensada via software,
multiplicando o valor de tenso lido pela mesma relao de diviso. Os valores de tenso
real e tenso de referncia na ordem de 270V, que pode ser incrementada ou
decrementada por dois botes de ajuste, so mostrados em um display LCD. A ltima
tenso de referncia ajustada guardada na memria. Dessa forma, quando o sistema
reiniciado a tenso de referncia assume o ltimo valor ajustado.
Quando a tenso real e a de referncia so iguais, a alimentao de 220V do
circuito de potncia cortada pela abertura de um rel NF (normalmente fechado) e um
LED de atuao ascende indicando que a tenso de referncia foi atingida. O LED de
atuao indica a presena ou no de tenso residual nos capacitores de carga e apaga
somente aps a descarga de tenso nos terminais de solda, o que contribui para evitar
descargas de tenso nos operadores durante o manuseio da solda.
Para regular esse sistema embarcado necessrio medir a tenso nos terminais da
solda capacitiva com o multmetro e igualar com o valor atual indicado no LCD atravs do
potencimetro de ajuste do divisor de tenso. O circuito do sistema de controle de tenso e
a foto do LCD aps a montagem em protoboard indicando a tenso de referncia para
desligamento (Vref) e a tenso atual (Vat) podem ser vistos na figura abaixo.

[ 145 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 9. 2: Exemplo de aplicao do LCD.


#include SanUSB1.h
#include "lcd_16x2.h"// RB0-RS, RB1-EN, RB2-D4, RB3-D5, RB4-D6, RB5-D7
#define botaoinc pin_a4
#define botaodec pin_a5
#define rele pin_b7
#define ledrele pin_b6
unsigned int16 vref=270, guardavref, constante=100;
unsigned int32 vatual, valorAD;//Deve ser de 32 bits devido ao clculo do AD que esoura 65536
unsigned int8 baixovref, altovref; // Como vref> 256 guardar o valor em 2 bytes, posies 10 e 11
//da EEPROM interna
int1 flag1, flag2;
void main() {
clock_int_4MHz();
lcd_ini(); // Configurao inicial do LCD
nivel_baixo(rele);
nivel_baixo(ledrele);
guardavref=(256*le_eeprom(10))+le_eeprom(11)+1; //+1 para compensar um bug de //decremento
no reincio
if (guardavref>=100 && guardavref<=500) {vref=guardavref;} // Resgata o ltimo valor de
//referncia adotado
setup_ADC_ports (AN0); //(Selecao_dos_pinos_analogicos)
setup_adc(ADC_CLOCK_INTERNAL ); //(Modo_de_funcionamento)
set_adc_channel(0); //(Qual_canal_vai_converter)
tempo_ms(10);

[ 146 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

printf(lcd_escreve,"SOLDA CAPACITIVA");
while (1) {
//********************************BOTES**********************************
if (!input(botaoinc)) {flag1=1;}
if (flag1==1 && input(botaoinc) ) {flag1=0;++vref; //se o boto foi pressionado (flag1==1) e se o
boto j foi solto (input(botao)) incremente vref
altovref=vref/256; baixovref=vref%256;
write_eeprom(10,altovref); write_eeprom(11,baixovref);
}// Como Vref>256, guarde o valor de
vref nas posices 10 e 11 da eeprom interna
if (!input(botaodec)) {flag2=1;}
if (flag2==1 && input(botaodec) ) {flag2=0;--vref; //se o boto foi pressionado (flag2==1) e se o
boto j foi solto (input(botao)) decremente vref
altovref=vref/256; baixovref=vref%256;
write_eeprom(10,altovref); write_eeprom(11,baixovref); }// guarde o valor na de vref nas posices
10 e 11 da eeprom interna
//************************************************************************
if (vatual>=vref) {nivel_alto(rele); nivel_alto(ledrele); } //Abre o rel, avisa com led
if (vatual<=20) {nivel_baixo(rele); nivel_baixo(ledrele);} //S desliga depois da descarga
//************************************************************************
valorAD = read_adc(); // efetua a converso A/D
vatual=((constante*5*valorAD)/1023); //Regra de trs:
5
//
Tenso real (mV) -------- ValorAD
lcd_pos_xy(1,2);
printf(lcd_escreve,"Vref=%lu Vat=%lu ",vref, vatual);
tempo_ms(300);

------- 1023

}}

LDR
LDR significa LightDependent Resistor, ou seja, Resistor Varivel Conforme Incidncia
de Luz. Esse resistor varia sua resistncia conforme a intensidade de radiao
eletromagntica do espectro visvel que incide sobre ele.
Um LDR um transdutor de entrada (sensor) que converte a (luz) em valores de
resistncia. feito de sulfeto de cdmio (CdS) ou seleneto de cdmio (CdSe). Sua
resistncia diminui quando a luz intensa, e quando a luz baixa, a resistncia no LDR
aumenta.
Um multmetro pode ser usado para encontrar a resistncia na escurido (geralmente
acima de 1M) ou na presena de luz intensa (aproximadamente 100).
O LDR muito frequentemente utilizado nas chamadas fotoclulas que controlam o
acendimento de poste de iluminao e luzes em residncias. Tambm utilizado em
sensores foto-eltricos.

[ 147 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

EXEMPLO: MODELAGEM DE UM LUXMETRO MICROCONTROLADO COM LDR


Este luxmetro tem em seu circuito sensor um LDR, um resistor divisor de tenso e
uma fonte de tenso estabilizada, como mostra a figura abaixo.

Figura 10. 1: Circuito sensor com LDR.


Para obter este circuito e os valores de tenso na sada para as diferentes
luminosidades, forma tidos por ANTONIETI, B. Em que as medies da tenso de sada
foram feitas e colocadas em uma tabela juntamente com as iluminncias medidas por um
luxmetro comercial da marca MINIPA, modelo MLM-1010, de 3 dgitos , com preciso
de 4% da leitura + 0.5% do fundo de escala, na faixa de 1 a 50000 Lux. Os valores
encontrados so vistos na tabela abaixo. Os valores em negrito foram considerados como
limite de cada equao da reta.
Correspondncia entre a tenso da sada e a iluminncia
Lux

12

20

36

60

94

130

180

240

338

430

530

674

827

1000

1183

1404

1651

1923

Volt

4,9

4,9

4,8

4,7

4,5

4,3

4,1

3,8

3,6

3,3

3,1

2,8

2,7

2,5

2,4

2,3

2,1

Com base na tabela, foi construdo o grfico da figura abaixo.


2500

(Lux)

2000
1500
1000
500
0
2

2,3

2,5

2,8

3,1

3,6

4,3

4,7

4,9

(V)

Figura 10. 2: Grfico Lux x Volt.


Para simplificar o programa do PIC, foi modelado a curva do grfico acima, dividindo-a em
trs retas como mostra a figura abaixo.

[ 148 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 10. 3: Modelagem matemtica dos valores obtidos.


O programa funciona da seguinte maneira: l o conversor A/D e multiplica esse valor
por sua resoluo (no caso de um converso AD de 10 bits, a resoluo de
aproximadamente 5 mV), encontrando ento a tenso (V), depois so feitas 3
comparaes (IF) para saber qual das trs equaes acima deve ser utilizada para calcular
a iluminncia (Lux). A figura abaixo mostra o novo grfico lux versus volts, utilizando as
equaes 03, 04 e 05.
Os clculos da equao geral de cada reta so mostrados a seguir:
2500

(Lux)

2000
1500
1000
500
0
2

2,2 2,4 2,6 2,8

3 3,2 3,4 3,6 3,8

4,2 4,4 4,6 4,8

(V)

Figura 10. 4: Grfico lux x tenso utilizando as equaes 3, 4 e 5.

[ 149 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

SUPERVISRIO
Esta interface foi desenvolvida utilizando ambiente de programao Delphi e
atravs da emulao via USB de um canal serial COM virtual. A figura 8 mostra a tela do
supervisrio para iluminncia e temperatura.

[ 150 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 10. 5: Figura da tela do supervisrio para Iluminncia e Temperatura.


Veja abaixo, na figura abaixo, o esquema circuito eletrnico montado e a na figura
10, a foto do circuito montado em operao. No final do trabalho mostrado o programa
completo para ler a iluminncia no canal AD 1 e a temperatura do ambiente com um LM35
no canal AD 0.

Figura 10. 6: Esquema eletrnico do circuito luxmetro.

[ 151 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 10. 7: Foto do circuito montado.


O luxmetro mostrado neste trabalho apresenta como uma soluo de baixo custo
para aplicaes onde no necessrio haver uma grande preciso nas medies. O
mtodo do modelagem de curva pode ser aplicado em vrias ocasies onde no se sabe a
equao que gerou o grfico proposto. Isto ratifica a versatilidade de sistemas
microcontrolados.
// Programa Luxmetro digital + termmetro digital c/ comunicao via USB//
-------------------------------------------------------------------------------------------------------------#include SanUSB1.h
float tens,lux,temp;
void main()
{
clock_int_4MHz();
lcd_ini();
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com a usb do PC
//while(!usb_cdc_connected()) {} // espera o protocolo CDC se conectar com o driver CDC
//usb_wait_for_enumeration(); //espera at que a USB do Pic seja reconhecida pelo PC
setup_adc_ports(AN0_TO_AN1);
setup_adc(ADC_CLOCK_INTERNAL);
nivel_baixo(pin_b6);
printf (lcd_escreve," \f ");
while(1)
{
set_adc_channel(1);
tempo_ms(20);

[ 152 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

tens=5*(float)read_adc()/1023;
if (tens>2 && tens<2.8) {
lux=(3936.4-(1249*tens))/0.8; }
if (tens>=2.8 && tens<=3.8) {
if (tens>3.8) {

lux=2057.2-494*tens; }

lux=(900-180*tens)/1.2; }

if (tens>2) { //Leitura vlida


lcd_pos_xy(1,1);
printf ("%.0f",lux);
tempo_ms(50);
printf ("L");
printf (lcd_escreve,"Iluminancia: %.0f lux ",lux );
lcd_envia_byte(0,0x0C); //Apaga o cursor
}
if (tens<=2) //Leitura no vlida
{
lcd_pos_xy(1,1);
printf ("Erro");
tempo_ms(50);
printf ("L");
printf (lcd_escreve,"valor fora da faixa! ");
lcd_envia_byte(0,0x0C); //Apaga o cursor
}
tempo_ms(30);
set_adc_channel(0);
tempo_ms(20);
temp=500*(float)read_adc()/1023;
lcd_pos_xy(1,2);
printf ("%.1f",temp);
tempo_ms(50);
printf ("T");
printf (lcd_escreve,"Temperatura: %.1f oC ",temp);
lcd_envia_byte(0,0x0C); //Apaga o cursor
tempo_ms(800);
nivel_alto(pin_b6);
tempo_ms(200);
nivel_baixo(pin_b6);
}
}

[ 153 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 6. 9: Esquemtico Prtica 10 - Sensor luminosidade LDR.

Figura 6. 10: Esquemtico

[ 154 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 6. 11: Prtica 10 Sensor de luminosidade LDR, montada em protoboard.

INTERFACE I2C
I2C significa Inter-IC (Integrated Circuit). Este barramento serial foi desenvolvido
pela Philips como o objetivo de conectar CIs e perifricos de diferentes fabricantes em um
mesmo circuito, como microcontroladores, memrias externas e relgio em tempo real,
usando o menor nmero de pinos possvel. Este protocolo serial necessita somente de
duas linhas: uma linha serial de dados (SDA) e uma de clock (SCL). Quando o baramento
no est em uso, as duas linhas ficam em nivel lgico alto foradas pelos resistores de
pull-up.

Figura 11. 1: Barramento I2C.

[ 155 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

O barramento serial, com transferncia de 8 bits por vez, possibilita comunicao


bidirecional com velocidade de 100 Kbps no modo Padro, 400 Kbps no modo Fast, ou at
3,4 Mbits/s no modo High-speed.
Esta interface apresenta a filosofia multi-master onde todo CI da rede pode
transmitir ou receber um dado, e o transmissor gera o seu prprio clock de transmisso. O
nmero mximo de CIs que podem ser conectados limitado apenas pela capacitncia
mxima do barramento de 400pF.
Um exemplo tpico de configurao I2C em TVs mostrado na figura abaixo:

Figura 11. 2: Configurao I2C em TVs.


REGRAS PARA TRANSFERNCIA DE DADOS

Cada bit da linha de dados s lido quando o nivel da linha de clock est em nivel
alto.

Figura 11. 3: Leitura de dados em comunicao.


As condies de partida e parada de transmisso so sempre geradas pelo
MASTER. O barramento considerado como ocupado aps a condio de partida, e livre
um certo perodo de tempo aps a condio de parada.
Uma transio de H para L da linha SDA (start bit) durante o tempo em que a linha
SCL permanece em H, ou seja, um dado vlido, definido como condio de partida e

[ 156 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

uma transio de L para H da linha SDA(stop bit) durante o perodo H da linha SCL,
define uma condio de parada.

Figura 11. 4: Comandos de incio e fim de comunicao.


Cada byte acompanhado de um bit de reconhecimento obrigatrio. O
reconhecimento gerado pelo MASTER no dcimo bit liberando a linha SDA (nivel alto)
durante a ocorrncia do pulso de clock de reconhecimento. Por sua vez, o CI receptor
(SLAVE) obrigado a levar a linha SDA a nivel baixo durante o perodo H do clock de
reconhecimento.

Figura 11. 5: reconhecimento do byte.


Se o SLAVE reconhecer o endereo, mas depois de algum tempo na transferncia
no receber mais nenhum byte de dados, o MASTER dever abortar a transferncia. Esta
condio indicada pelo SLAVE, devido no gerao do reconhecimento logo aps a
recepo do primeiro byte de dados. O SLAVE deixa a linha de dados em nivel H e o
MASTER gera a condio de parada.
Caso haja uma interrupo interna no SLAVE durante a transmisso, ele dever
levar tambm a linha de clock SCL a nivel L, forando o MASTER a entrar em um modo de
espera.
Para escrever um dado nos escravos necessrio enviar um byte de endereo do
escravo, onde os 4 bits mais significativos identificam o tipo de escravo (por exemplo,
memrias EEPROM 1010 ou 0xa0 e RTC 1101 ou 0xd0 (com exceo do RTC
PCF8583 cujo endereo tambm 0xa0). Os 3 bits intermedirios especificam de um at
8 dispositivos, que so discriminados nos pinos de endereo de cada escravo, e o bit
menos significativo R/W indica se a operao de leitura (1) ou escrita (0). Aps isso,
deve-se enviar uma palavra de 8 ou16 bits de endereo onde se quer escrever e depois o
dado. No final do pacote uma condio de parada (i2c_stop).

[ 157 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 11. 6: Escrita de dados.


Funo da biblioteca I2C que descreve essa operao de escrita em memria EEPROM:
--------------------------------------------------------------------------------------------------------------void escreve_eeprom(byte dispositivo, long endereco, byte dado)
// Escreve um dado em um endereo do dispositivo
// dispositivo - o endereo do dispositivo escravo (0 - 7)
// endereco - o endereo da memria a ser escrito
// dado - a informao a ser armazenada
{
if (dispositivo>7) dispositivo = 7;
i2c_start();
i2c_escreve_byte(0xa0 | (dispositivo << 1)); // enderea o dispositivo livrando o LSB que
o R\W
i2c_le_ack();
// L reconhecimento do escravo
i2c_escreve_byte(endereco >> 8);
// parte alta do endereo de 16 bits
i2c_le_ack();
i2c_escreve_byte(endereco);
// parte baixa do endereo de 16 bits
i2c_le_ack();
i2c_escreve_byte(dado);
// dado a ser escrito
i2c_le_ack();
i2c_stop();
tempo_ms(10); // aguarda a programao da memria
Para a operao de leitura de um escravo necessrio um start repetido e no final do
pacote um sinal de no-reconhecimento (nack) e uma condio de parada (i2c_stop).

Figura 11. 7: Recepo e transmisso de dado.


A Funo da biblioteca I2C que descreve este protocolo de operao de leitura de
memria EEPROM a seguinte:
--------------------------------------------------------------------------------------------------------------byte le_eeprom(byte dispositivo, long int endereco)
// L um dado de um endereo especificado no dispositivo
// dispositivo - o endereo do dispositivo escravo (0 - 7)
// endereco - o endereo da memria a ser escrito
{
byte dado;
if (dispositivo>7) dispositivo = 7;

[ 158 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

i2c_start();
i2c_escreve_byte(0xa0 | (dispositivo << 1)); // enderea o dispositivo
i2c_le_ack();
i2c_escreve_byte((endereco >> 8));
// envia a parte alta do endereo de 16 bits
i2c_le_ack();
i2c_escreve_byte(endereco);
// envia a parte baixa do endereo de 16 bits
i2c_le_ack();
i2c_start();
//repetido start
// envia comando para o escravo enviar o dado
i2c_escreve_byte(0xa1 | (dispositivo << 1)); enderea o dispositivo e colocando em leitura
0xa1
i2c_le_ack();
dado = i2c_le_byte()
// l o dado
i2c_nack();
i2c_stop();
return dado;
---------------------------------------------------------------------------------------------------------------

MEMRIA EEPROM EXTERNA I2C


Para sistemas embarcados em que so necessrios a aquisio de dados de mais
de 256 bytes (capacidade da EEPROM interna dos microcontroladores), necessria a
utilizao de memrias EEPROM externals. Os modelos mais comuns so o 24LC e
24C256 (256 Kbits que corresponde a 32Kbytes). Estas memrias possuem oito pinos e
apresentam, entre outras caractersticas, interface de comunicao I2C. A figura abaixo
mostra o circuito simples de uma EEPROM I2C ligada nn ferramenta SanUSB.

Figura 11. 8: Uso de memria EEPROM externa via I2C.

[ 159 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

O programa abaixo mostra o armazenamento de valores digital de tenso de 0 a


5000mV de um potencimetro, a cada segundo, em um buffer (regio de memria circular)
de 150 registros de 16 bits na memria EEPROM externa, ou seja, 300 bytes, que
mostrado via emulao serial somente quando a tecla L pressionada.
#include SanUSB1.h
#include <i2c_sanusb.c>
unsigned int16 i,j,endereco=0, posicao=0, valorgravado;
int32 tensao_lida32; //Varia de 0 a 5000mV (16bits), mas int32 porque o clculo ultrapassa
65536
int8 byte1,byte2,byte3,byte4; // 4 Partes do valor int32 tensao_lida32
char comando;
int conv_dec_4bytes(int32 valor32) //Converte decimal de 32 bits em 4 bytes
{
int32 resultado1=0,resultado2=0;
resultado1 = valor32/256; byte1 = valor32%256; //o que for resto (%) menos significativo
resultado2 = resultado1/256; byte2= resultado1%256;
byte3= resultado2%256; byte4 = resultado2/256;
return(byte4,byte3,byte2,byte1);
}
void main() {
clock_int_4MHz();
setup_adc_ports(AN0); //Habilita entradas analgicas - A0
setup_adc(ADC_CLOCK_INTERNAL);
while(1){
set_adc_channel(0);
tempo_ms(10); //Tenso 32bis porque o produto 5000* read_adc() de 10 bits (1023) //pode ser
maior que 65536
tensao_lida32=(5000*(int32)read_adc())/1023; //Calcula a tenso Trimpot em mV: //5000mV
1023 (10bis)
printf ("\r\n tensao do Trimpot = %lu mV\r\n",tensao_lida32);//
tensao_lida - read_adc();
conv_dec_4bytes(tensao_lida32);
//printf ("\r\nVariavel em Hexadecimal = %x %x %x %x\r\n",byte4,byte3,byte2,byte1);//Debug
posicao=2*endereco; //Endereo o ponteiro de cada valor de 2 bytes (16 bits)
escreve_eeprom( 0, posicao, byte2); //segundo Byte menos significativo do int32
escreve_eeprom( 0, posicao+1, byte1 ); //Byte menos significativo do int32
//printf ("\r\nEndereco = %lu Posicao = %lu\r\n",endereco,posicao);//Debug
++endereco; if (endereco>=150){endereco=0;} //Buffer de 300 bytes posicao<=300
//****************LEITURA DO BUFFER DA EEPROM EXTERNA***************************
if (kbhit(1)) //Se existe carater digitado entre na funo
{comando=getc();
if (comando=='L'){
printf("\r\n\nEEPROM:\r\n"); // Display contm os primeiros 64 bytes em hex da eeprom externa i2c
for(i=0; i<10; ++i) { //10linhas * 30colunas = 300 bytes (int16 i,j)
for(j=0; j<15; ++j) {

[ 160 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

valorgravado= 256*le_eeprom(0,(i*30)+2*j) + le_eeprom(0,(i*30)+2*j+1); //150 Valores de 16 bits


ou 300 de 8 bits.
printf("%lu ", valorgravado );
}

printf(usb_cdc_putc, "\n\r");
}}}
//*****************************************************************************
inverte_saida(pin_b7);
tempo_ms(1000);

}}

Figura 11. 9: Leitura de valores da memria.

RTC (RELGIO EM TEMPO REAL)


O Real Time Clock I2C DS1307 um relgio/calendrio serial de baixo custo
controlado por um cristal externo de 32.768 Hz. A comunicao com o DS1307 atravs
de interface serial I2C (SCL e SDA). Oito bytes de RAM do RTC so usados para funo
relgio/calendrio e so configurados na forma Binary Coded Decimal BCD. possvel a
reteno dos dados na falta de energia utilizando uma bateria de ltio de 3V - 500mA/h
conectada ao pino 3.

[ 161 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 12. 1: RTC DS1307 e similar.


Para representar nmeros decimais em formato binrio, o relgio DS1307, bem
como calculadoras e computadores utilizam o cdigo BCD, que incrementa a parte alta do
byte hexadecimal quando o nmero da parte baixa maior que 9. Isto possvel somando
6 (0110b) ao resultado maior que 9. Este cdigo facilita a transmisso de dados e a
compreenso do tempo, tendo em vista que em formato hexadecimal, apresenta o valor
em decimal.
Para transformar decimal em BCD, possvel dividir o nmero binrio (byte) por 10
e colocar o resultado isolado das dezenas no nibble alto do byte BCD e o resto, ou seja, as
unidades, no nibble baixo do byte BCD.
Para iniciar o relgio DS1307, aps o power-on, necessrio incrementar os
segundos quando estiverem todos os registros da RAM em zero. A bateria GP 3.6V
garante o funcionamento do relgio e tambm o processamento do PIC. Testes indicaram
que a bateria suportou o processamento e incremento automtico do relgio por cerca de
sete horas sem alimentao externa.

Figura 12. 2: Registros de tempo DS1307.

[ 162 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

//PROGRAMA PARA CONFIGURAR E LER UM RELGIO RTC I2C VIA MONITOR


SERIAL/////////////////////
--------------------------------------------------------------------------------------------------------------#include SanUSB1.h
#include <i2c_sanusb.c>
Char entrada,funcao,endrtc,valorrtc1,valorrtc2;
unsigned int endereco, valor,valorbcd, numquant;
boolean led;
/*****************************************************************************
* Converso BCD P/ DECIMAL
****************************************************************************/
int bcd_to_dec(int valorb)
{
int temp;
temp = (valorb & 0b00001111);
temp = (temp) + ((valorb >> 4) * 10);
return(temp);
}
/*****************************************************************************
* Converso DECIMAL p/ BCD
*****************************************************************************/
int dec_para_bcd(unsigned int valord)
{
return((0x10*(valord/10))+(valord%10));//Coloca a parte alta da diviso por 10 no nibble mais
significativo
}
//////////////////////////////////////////////////////////////////////////////////
void main() {
clock_int_4MHz();
while (1) {
//*****************************************************************************
if (kbhit(1)) { //verifica se acabou de chegar um novo dado no buffer de recepo, depois o kbhit
zerado
entrada=getc(); //comando o Byte recebido pela serial,
if (entrada=='A')
{ funcao=getc();
switch (funcao) //UTILIZAR VALORES DECIMAIS EM DOIS DIGITOS. ex:06 ou 23 ou 15
{
////////////////////////FUNCAO 4: CONFIGURA RELGIO//////////////////////////////Ex: A4H09
case '4':
{
endrtc=getc();
valorrtc1=getc();
valorrtc2=getc(); //Ex: A4M43 - Altera os minutos para 43
if (endrtc=='H') { endereco=2;} //Escreve o endereco das horas
if (endrtc=='M') { endereco=1;} //Escreve o endereco dos minutos
if (endrtc=='S') { endereco=0;} //Escreve o endereco dos segundos
if (endrtc=='D') { endereco=4;} //Escreve o endereco do dia
if (endrtc=='N') { endereco=5;} //Escreve o endereco do mes
if (endrtc=='Y') { endereco=6;} //Escreve o endereco do ano
if (valorrtc1>='0'&&valorrtc1<='9') {numquant=(valorrtc1-0x30);}

[ 163 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

if (valorrtc2>='0'&&valorrtc2<='9') {numquant=numquant*10+(valorrtc2-0x30);
valor=numquant;
if (endereco==0) { if(valor>59) {valor=0;}}
if (endereco==1) { if(valor>59) {valor=0;}}
if (endereco==2) { if(valor>23) {valor=0;}}
if (endereco==4) { if(valor>31) {valor=1;}}
if (endereco==5) { if(valor>12) {valor=1;}}
if (endereco==6) { if(valor>99) {valor=0;}}
//---------Converte byte hexadecimal para byte BCD decimal -------------valorbcd=dec_para_bcd(valor);
//----------------------------------------------------------------------escreve_rtc(endereco,valorbcd); //Valor1 byte BCD (decimal).
printf("\r\nA5 %2x:%2x:%2x",le_rtc(2), le_rtc(1),le_rtc(0)); //BCD em hexadecimal representa o
decimal
printf(" %2x%2x%2x\r\n",le_rtc(4), le_rtc(5), le_rtc(6));
}
}
break;
//////////////////////FUNCAO 5: L RELGIO/////////////////////Ex: A5- L o relgio e o calendrio
case '5':
printf("\r\nA5 %2x:%2x:%2x",le_rtc(2), le_rtc(1),le_rtc(0));//BCD em hexadecimal representa o
decimal
printf(" %2x%2x%2x\r\n",le_rtc(4), le_rtc(5), le_rtc(6));
break;
}}}
//*****************************************************************************
led = !led; // inverte o led de teste
output_bit (pin_b7,led);
tempo_ms(500);

}}

EXEMPLO: PROTTIPO DATALOGGER USB DE BAIXO CUSTO


Em muitos sistemas de aquisio de dados e controle necessria a medida de
algumas grandezas fsicas, como exemplo, temperatura, presso e velocidade, entre
outras. Tais grandezas so inerentes a alguns fenmenos fsicos e, em geral, sua natureza
analgica. Isto , trata-se de variveis que assumem valores contnuos e reais, diferentes
de sinais digitais que so descontnuos e expressados segundo representao binria.
Comumente quando as sadas analgicas dos sensores so processadas por sistemas
digitais, h a necessidade do condicionamento do sinal para que os sinais provenientes
dos sensores sejam adequados s caractersticas de um conversor AD. Assim, com o uso
de um microcontrolador dotado de um conversor interno AD para aquisio de dados, o
valor analgico convertido para digital processado pelo software de controle de acordo
com decises lgicas baseadas em comparaes ou em operaes matemticas.
A bateria em paralelo com a fonte de alimentao tem uma grande relevncia neste
projeto de aquisio de dados. Alm de evitar reset por queda de tenso, ela permite a
mudana da fonte de alimentao da USB para a fonte externa sem desconexo do
sistema.
O conversor TTL/EIA-232 Max232 utilizado para conexo do mdulo GPRS ao
sistema, cujos comandos AT so descritos no prximo tpico.

[ 164 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 13. 3: Datalogger.

Este sistema de aquisio de dados USB Dual Clock, ou seja, utiliza duas fontes
de clock, uma para o canal USB de 48MHz, proveniente do oscilador externo de 20MHz, e
outra para o processador na execuo do protocolo i2c, proveniente do oscilador RC
interno de 4 MHz. (#byte OSCCON=0XFD3 //Aponta o registro do oscilador interno para
configurao de 4MHz na funo Main -> OSCCON=0B01100110;).

Figura 12. 4: Comunicao PIC com PC e via I2C.


/////////////////////////////////////////////////////////////////////////
//// Este programa utiliza duas fontes de clock, uma para o canal USB////
//// de 48MHz proveniente do oscilador externo de 20MHz e outra para ////
//// o processador na execuo do protocolo i2c, proveniente do
////
//// oscilador interno 4 de MHz//////////////////////////////////////////
//// O Watch Dog Timer (WDT) protege contra travamento do programa /////
////////////////////////////Cabealho Padro/////////////////////////////

[ 165 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

#include SanUSB1.h
//#device ADC=8
#include ".\include\usb_san_cdc.h"// Biblioteca para comunicao serial
#include <i2c_dll16sanc.c>
char escravo,funcao,sensor,endrtc,
valorrtc1,valorrtc2,posmeme1,posmeme2,posmeme3,posmeml1,posmeml2,posmeml3,posquant1,p
osquant2;
unsigned int ender, endereco, val, valor,valorbcd;
unsigned int mult=2,end=0, reg, numquant;
unsigned
int16
hora,horadec,minuto,minutodec,segundo,segundodec,dia,diadec,mes,mesdec,ano,anodec;
unsigned int16 i, j,numpose, numposl,num16,endpromext,k,puloext,bufferdia;
int8 regi[2];
boolean led,ledint,flagwrite;
/*****************************************************************
* Converso BCD P/ DECIMAL
*******************************************************************/
int bcd_to_dec(int valorb)
{
int temp;
temp = (valorb & 0b00001111);
temp = (temp) + ((valorb >> 4) * 10);
return(temp);
}
/**************************************************************
* Converso DECIMAL p/ BCD
***************************************************************/
int dec_para_bcd(unsigned int valord)
{
return((0x10*(valord/10))+(valord%10));//Coloca a parte alta da diviso por 10 no nibble mais
significativo
}
//////////////////////////////////////////////////////////////////////////////////
#int_timer1
void trata_t1 ()
{--mult;
if (!mult)
{mult=2; // 2 *(48MHz/4MHz) - 4 seg
hora=le_rtc(2);
minuto=le_rtc(1);
segundo=le_rtc(0);
dia=le_rtc(4);
mes=le_rtc(5);
ano=le_rtc(6);
ledint = !ledint; // inverte o led de teste - pisca a cada 2 *12 interrupcoes = 1 seg.
output_bit (pin_b0,ledint);
reg= read_adc(); //Tenso e corrente
//escreve_eeprom(0,end,reg); no funciona a escrita i2c dentro da interrupo do timer
write_eeprom( end, reg );

[ 166 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

++end; if(end>=127){end=0;}
segundodec=bcd_to_dec(segundo);minutodec=bcd_to_dec(minuto);horadec=bcd_to_dec(hora);
diadec=bcd_to_dec(dia);mesdec=bcd_to_dec(mes);anodec=bcd_to_dec(ano);
if (segundodec==05 &&
(minutodec==00||minutodec==10||minutodec==20||minutodec==30||minutodec==40||minutodec==5
0))
//if
((segundodec==00||segundodec==10||segundodec==20||segundodec==30||segundodec==40||segu
ndodec==50))
{flagwrite=1;}
//endpromext=(minutodec/10)+(horadec*6)+((diadec-1)*24*6*2)+24*6*k;
//endpromext=(segundodec/10)+(minutodec*6); }//No aceita DE JEITO NENHUM escrever na
eeprom ext por interrupo do timer via i2c
//printf("\n\rEndpromext = %lu e reg = %u \n\r, segundodec = %lu\n\r",endpromext,reg,segundodec);
//Aceita imprimir via USB
set_timer1(3036 + get_timer1()); }} // Conta 62.500 x 8 = 0,5s
//////////////////////////////////////////////////////////////////////////////////
void main() {
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com a usb do PC
OSCCON=0B01100110; //Clock interno do processador de 4MHZ
setup_adc_ports(AN0_TO_AN1); //Habilita entradas analgicas - A0 A1
setup_adc(ADC_CLOCK_INTERNAL); //Configurao do clock do conversor AD
enable_interrupts (global); // Possibilita todas interrupcoes
enable_interrupts (int_timer1); // Habilita interrupcao do timer 1
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8);// inicia o timer 1 em 8 x 62500 = 0,5s
set_timer1(3036);
setup_wdt(WDT_ON); //Habilita o temporizador co de guarda - resseta se travar o programa
principal ou ficar em algum getc();
while (1) {
//************************************************************************
if (flagwrite==1) {flagwrite=0; //Flag de gravao setada na interrupo do timer quando chega a
hora de gravar
k=0;
for(k=0;k<2;k++)
{
set_adc_channel(k);
tempo_ms(20);
regi[k]= read_adc(); //Tenso M1[0], correnteM1[1]
endpromext=(minutodec/10)+(horadec*6)+((diadec-1)*24*6*2)+24*6*k;
//endpromext=(segundodec/10)+(minutodec*6)+((diadec-1)*60*6*2)+60*6*k; //Para teste 60 em vez
de 24
escreve_eeprom(0,endpromext, regi[k]);
printf("\r\nPosicao = %lu -> Sensor[%lu] = %u\r\n",endpromext,k,regi[k]);
}
}
//************************************************************************

[ 167 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

led = !led; // inverte o led de teste


output_bit (pin_b7,led);
restart_wdt(); // Limpa a flag do WDT para que no haja reset
tempo_ms(500);
//************************************************************************
if (kbhit(1)) { //verifica se acabou de chegar um novo dado no buffer de recepo, //depois o kbhit
zerado para prximo dado
escravo=getc(); //comando o Byte recebido pela serial,
if (escravo=='A')
{ funcao=getc();
switch (funcao) //UTILIZAR VALORES DECIMAIS EM DOIS DIGITOS. ex:06 ou 23 ou 15
{
//************************************************************************
case '4':
{
endrtc=getc();
valorrtc1=getc();
valorrtc2=getc();
//Ex: A4M43 - Altera os minutos para 43
if (endrtc=='H') { endereco=2;}
if (endrtc=='M') { endereco=1;}
if (endrtc=='S') { endereco=0;}
if (endrtc=='D') { endereco=4;}
if (endrtc=='N') { endereco=5;}
if (endrtc=='Y') { endereco=6;}

//Escreve o endereco das horas


//Escreve o endereco dos minutos
//Escreve o endereco dos segundos
//Escreve o endereco do dia
//Escreve o endereco do mes
//Escreve o endereco do ano

if (valorrtc1>='0'&&valorrtc1<='9') {numquant=(valorrtc1-0x30);}
if (valorrtc2>='0'&&valorrtc2<='9') {numquant=numquant*10+(valorrtc2-0x30);
valor=numquant;
if (endereco==0) { if(valor>59) {valor=0;}}
if (endereco==1) { if(valor>59) {valor=0;}}
if (endereco==2) { if(valor>23) {valor=0;}}
if (endereco==4) { if(valor>31) {valor=1;}}
if (endereco==5) { if(valor>12) {valor=1;}}
if (endereco==6) { if(valor>99) {valor=0;}}
//---------Converte byte hexadecimal para byte BCD decimal -------------valorbcd=dec_para_bcd(valor);
//----------------------------------------------------------------------escreve_rtc(endereco,valorbcd); //Valor1 byte BCD (decimal).
//printf("\r\nVALOR ESCRITO = %2x\r\n",valorbcd);
//printf(r\nPOSICAO = %2x\r\n",endereco);
hora=le_rtc(2);minuto=le_rtc(1);segundo=le_rtc(0);
printf(r\nA4%2x:%2x:%2x",hora, minuto,segundo);
printf(%2x%2x%2x\r\n",le_rtc(4), le_rtc(5), le_rtc(6));
}

[ 168 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

}
break;
//////////////////////FUNCAO 5: L RELGIO////////////////////////Ex: A5- L o relgio e o calendrio
case '5':
printf(usb_cdc_putc,"\r\nA5 %2x:%2x:%2x",le_rtc(2), le_rtc(1),le_rtc(0));
printf(usb_cdc_putc," %2x%2x%2x\r\n",le_rtc(4), le_rtc(5), le_rtc(6));
break;
//////////////////////FUNCAO 6: L BUFFER EEPROM/////////////////////Ex: A6 09(DIA) 0(SENSOR)
case '6':{
posmeme1=getc();
posmeme2=getc();
sensor=getc();
if (posmeme1>='0' && posmeme1<='9') {bufferdia=(posmeme1-0x30);}
if (posmeme2>='0' && posmeme2<='9') {bufferdia=bufferdia*10+(posmeme2-0x30);}
if (sensor>='0' && sensor<='1') {k=(sensor-0x30);}
printf(usb_cdc_putc,"Buffer Sensor %lu - Dia %lu\r\n",k,bufferdia);
tempo_ms(10);
//puloext=((bufferdia-1)*60*6*2)+60*6*k;// Seleciona buffer de teste de tensao
puloext=((bufferdia-1)*24*6*2)+24*6*k;// Seleciona buffer
for(i=0; i<6; ++i)
{
//for(j=0; j<60; ++j) {printf(usb_cdc_putc,"%2u ", le_eeprom(0,puloext+(i*60+j)) );}
//"%2u\n\r" para gerar grfico no excell
for(j=0; j<24; ++j){printf(usb_cdc_putc,"%2u ", le_eeprom(0,puloext+(i*24+j)) );}
tempo_ms(15);
}
printf(usb_cdc_putc,"\r\n"); //posiciona prxima linha
}
break;
}}}
}
}

TRANSMISSO DE DADOS VIA GSM


A sigla GSM significa Global Standard Mobile ou Global System for Mobile
Communications que quer dizer Sistema Global para Comunicaes Mveis. O GSM
um sistema de celular digital baseado em diviso de tempo, como o TDMA, e
considerado a evoluo deste sistema, pois permite, entre outras coisas, a troca dos dados
do usurio entre telefones atravs do SIM Card e acesso mais rpido a servios WAP e
Internet, atravs do sistema GPRS.
A transmisso de dados GSM pode ser feita por:
- GPRS (General Package Radio Service): uma conexo em uma rede de pacote de
dados. Uma vez conectado nessa rede, o sistema estar sempre on line, podendo
transferir dados imediatamente. O GPRS compatvel com o protocolo de rede TCP/IP e
as operadoras de GSM disponibilizam um gateway para a Internet, possibilitando conectar

[ 169 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

e controlar equipamentos wireless atravs da Internet. Como o GPRS baseado no


protocolo IP, ele necessita de autenticao de um servidor da internet.
- SMS (Short Message Service): o servio de envio/recebimento de pequenas
mensagens de texto do tipo datagrama, sem autenticao de um servidor de internet.
Os Modems GSM so controlados atravs de comandos AT. Esses comandos so
normalizados pelas normas GSM 07.07 e GSM 07.05.
A manipulao do modem pode ser realizada em algum emulador de comunicao
serial como o Hyperterminal, nele deve-se ajustar para 9600 bps,e no esquecendo de
instalar o SIM Card no modem.
COMANDOS AT PARA ENVIAR MENSAGENS SMS DE UM COMPUTADOR PARA UM
CELULAR OU MODEM GSM
A seguinte tabela lista os commandos AT para escrever e enviar mensagens SMS:
Comando AT

Significado

+CMGS

Envia mensagem

+CMSS

Envia uma mensagem armazenada

+CMGW

Escreve uma mensagem na memria

+CMGD

Apaga mensagem

+CMGC

Envia comando

+CMMS

Envia mais mensagens

Exemplo feito com um computador:


1-AT
2-OK
3- AT+CMGF=1
4- OK
5-AT+CMGS="+558588888888"//<ctrl + z (minsculo)> digita-se o texto aps >
6->
Teste
de
mensagem
7- OK
+CMGS:
170
OK
Abaixo est o significado de cada linha:
1- Testa conexo com o modem.
2- Modem conectado.
3- Coloca o celular no modo texto.
4- Modo texto confirmado.
5- Nmero do telefone que ir receber a mensagem.
6- O modem retorna o caractere > solicitando a mensagem a ser enviada (ao final: ctrl
z).
7- Mensagem enviada.

[ 170 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

COMANDOS AT PARA RECEBER MENSAGENS SMS EM UM COMPUTADOR


ENVIADAS POR UM CELULAR OU MODEM GSM
A seguinte tabela lista os commandos AT para receber e enivair mensagens SMS:

Comando AT

Significado

+CNMI

New message indications

+CMGL

Lista mensagens

+CMGR

L menssagens

+CNMA

Reconhecimento de nova menssagem

Exemplo feito com um computador:


AT
OK
AT+CMGF=1
OK
AT+CMGL="ALL"
+CMGL: 1,"REC READ","+85291234567",,"06/11/11,00:30:29+32"
Hello, welcome to our SMS tutorial.
+CMGL: 2,"REC READ","+85291234567",,"06/11/11,00:32:20+32"
A simple demo of SMS text messaging.
Adiante apresentado um exemplo de como enviar uma mensagem SMS do modem
GSM para um celular com uso do PC. Os comandos enviados ao modem esto em negrito
para diferenciar de suas respostas.
1-AT
2-OK
3- AT+CMGF=1
4- OK
5-AT+CMGS="+558588888888"
6->Intruso
7- OK
As figuras abaixo apresentam a foto em protoboard e o circuito esquemtico para
transmisso GPRS/GSM. A conexo USB observado no esquema, foi utilizada pela
ferramenta SanUSB para a alimentao do circuito e gravao do programa no PIC
atravs do PC. O LED verde foi usado por esta ferramenta para sinalizar o momento em
que o sistema estava no modo de gravao. O vermelho simulou o acionamento do
alarme, como descrito anteriormente. As chaves conectadas aos pinos 23, 24 e 25,
representam as chaves sinalizadoras dos trs sensores utilizados. A figura abaixo mostra
tambm o dispositivo MAX232 usado na interface RS/EIA-232 entre o microcontrolador e o
modem. Este, representado na figura apenas pelo conector DB9, possui o pino 2 para
transmisso de dados e o 3 para recepo, j que se trata de um equipamento do tipo
DCE (Data Comunication Equipment).

[ 171 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 14. 1: Esquemtico e foto do datalogger conectado ao PIC.


#include SanUSB1.h
short int ledpisca;
#USE RS232 (BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7,stream=PC)
void main(){
clock_int_4MHz();
printf("AT+CMGF=1\r"); //configura modo texto para o modem

[ 172 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

ledpisca=!ledpisca; // ledpisca igual ao inverso de ledpisca


output_bit(pin_b7,ledpisca); // b7 recebe o valor de ledpisca
tempo_ms(2000);
printf("AT+CMGS=\"+558588888888\"\r"); //5- Envia para o numero de destino
ledpisca=!ledpisca;
output_bit(pin_b7,ledpisca);
tempo_ms(2000);
printf("Alarme atuado\r"); //6 - escreve a mensagem para o modem GSM
putc(0x1A); // control z
ledpisca=!ledpisca;
output_bit(pin_b7,ledpisca);
tempo_ms(2000);
putc(0x0D);
while(TRUE){ nivel_alto(pin_B7);
tempo_ms(500);
nivel_baixo(pin_B7);
tempo_ms(500);
}}

O PROTOCOLO MODBUS EMBARCADO


O protocolo Modbus foi desenvolvido pela Modicon Industrial Automation Systems,
hoje Schneider, para comunicar um dispositivo mestre com outros dispositivos escravos.
Embora seja utilizado normalmente sobre conexes seriais padro EIA/RS-232 e EIA/RS485, ele tambm pode ser usado como um protocolo da camada de aplicao de redes
industriais tais como TCP/IP sobre Ethernet.
Este talvez o protocolo de mais utilizado em automao industrial, pela sua
simplicidade e facilidade de implementao.
A motivao para embarcar um microcontrolador em uma rede MODBUS pode ser
por:
- Baixo custo;
- Tamanho reduzido;
- Alta velocidade de processameto (1 a 12 MIPs);
- Possuir 10 canais ADs internos com resoluo de 10 bits;
- Ferramentas de desenvolvimento gratuitas e possibilidade de programao da memria
de programa sem necessidade de hardware adicional, bastando uma porta USB;
- Estudo das caractersticas construtivas de hardware e de software de uma rede
MODBUS.

MODELO DE COMUNICAO
O protocolo Modbus baseado em um modelo de comunicao mestre-escravo,
onde um nico dispositivo, o mestre, pode iniciar transaes denominadas queries. O

[ 173 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

demais dispositivos da rede (escravos) respondem, suprindo os dados requisitados pelo


mestre ou executando uma ao por ele comandada. Geralmente o mestre um sistema
supervisrio e os escravos so controladores lgico-programveis. Os papis de mestre e
escravo so fixos, quando se utiliza comunicao serial, mas em outros tipos de rede, um
dispositivo pode assumir ambos os papis, embora no simultaneamente.

Figura 14. 1: Checagem de dados.


DETECO DE ERROS
H dois mecanismos para deteco de erros no protocolo Modbus serial: bits de
paridade em cada caractere e o frame check sequence ao final da mensagem. O modo
RTU utiliza como frame check sequence um valor de 16 bits para o CRC (ciclic redundance
check), utilizando como polinmio, P(x) = x16 + x15 + x2 + 1. O registro de clculo do CRC
deve ser inicializado com o valor 0xffff.

MODOS DE TRANSMISSO
Existem dois modos de transmisso: ASCII (American Code for Information
Interchange) e RTU (Remote Terminal Unit), que so selecionados durante a configurao
dos parmetros de comunicao.
Como a comunicao geralmente utilizada em automao industrial em modo
RTU, o projeto proposto foi desenvolvido nesta forma de comunicao.

[ 174 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

A implementao prtica de um projeto com o modbus embarcado mostrada no


diagrama de blocos abaixo.

Figura 14. 2: Diagrama de blocos comunicao ModBus.


Para testar a comunicao com escravo Modbus (microcontrolador) em protocolo
RTU, atravs da porta serial emulada pela USB do PC, possvel utilizar o Modbus Tester
que um software livre de Mestre MODBUS escrito em C++. Ele pode ser utilizado para
testar se o desenvolvimento das rotinas de processamento do protocolo Modbus contidas
no microcontrolador. Durante o teste possvel utilizar tambm um sistema supervisrio
real como o Elipse SCADA.

Figura 14. 3: Software de teste de comunicao ModBus.


Os sistemas supervisrios so softwares que permitem que sejam monitoradas e
rastreadas informaes de um processo produtivo ou instalao fsica. Tais informaes
so coletadas atravs de equipamentos de aquisio de dados e, em seguida,
manipuladas, analisadas, armazenadas e posteriormente apresentadas ao usurio. Estes
sistemas tambm so chamados de SCADA (Supervisory Control and Data Aquisition).
Para comunicar com o supervisrio Elipse necessrio instalar um driver dedicado
a comunicao ModBus RTU, que fornecido gratuitamente pela prpria Elipse.

[ 175 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

O modo Modbus RTU com microcontrolador PIC desse projeto, mostrado no link
http://www.youtube.com/watch?v=KUd1JkwGJNk , suporta funes de leitura (3) e escrita
(16).
#include SanUSB1.h
#include <usb_san_cdc.h>// Biblioteca para comunicao serial
long int checksum = 0xffff;
unsigned int x,i,y,z;
unsigned char lowCRC;
unsigned char highCRC;
int tamanhodata;
int32 buffer[100];
void CRC16 (void) //Modo RTU
{
for (x=0; x<tamanhodata; x++)
{
checksum = checksum^(unsigned int)buffer[x];
for(i=8;i>0;i--)
{
if((checksum)&0x0001)
checksum = (checksum>>1)^0xa001;
else
checksum>>=1;
}
}
highCRC = checksum>>8;
checksum<<=8;
lowCRC = checksum>>8;
buffer[tamanhodata] = lowCRC;
buffer[tamanhodata+1] = highCRC;
checksum = 0xffff;
}
void ler (void)
{
buffer[2]=getc();
buffer[3]=getc();
buffer[4]=getc();
buffer[5]=getc();
buffer[6]=getc();
buffer[7]=getc();
tempo_ms(3);
buffer[2]=0x02;
buffer[3]=0x00;
buffer[4]=port_a; //o buffer[4] leva o valor de entrada da porta A do microcontrolador para o
//SCADA
tamanhodata = 5;
CRC16();
}
void rxler (void) //Leu a porta a no buffer[4] e escreve o CRC no buffer[5] e [6], pois tamanhodata
=5

[ 176 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

{
printf(usb_cdc_putc,"%c%c%c%c%c%c%c",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5],b
uffer[6]); // 6 bytes
}
void escrever (void)
{
buffer[2]=getc();
buffer[3]=getc();
buffer[4]=getc();
buffer[5]=getc();
buffer[6]=getc();
buffer[7]=getc();
buffer[8]=getc();
buffer[9]=getc();
buffer[10]=getc();
tempo_ms(3);
tamanhodata = 6;
CRC16();
PORTB = buffer[8]; //A porta B do microcontrolador recebe o valor enviado pelo SCADA
}
void rxescrever (void)
{
printf(usb_cdc_putc,"%c%c%c%c%c%c%c%c",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5
],buffer[6],buffer[7]); //7 bytes
}
void main()
{
clock_int_4MHz();
PORTB= 0b00000000;
while(1)
{
if (kbhit(1))
{
//verifica se acabou de chegar um novo dado no buffer USB, depois o kbhit zerado para //prximo
dado
buffer[0]=getc();
z = buffer[0];
if (z==1) //verifica se o endereco do slave e igual a 1
{
buffer[1]=getc(); //verifica a funo contida no segundo byte buffer[1]
y = buffer[1];
}
if (y==3) //verifica se a funo para leitura e encaminha para leitura de varivel do
//microcontrolador
{
ler();
rxler();
}
if (y==16) //verifica se a funo para escrita no microcontrolador, ou seja, comando de //atuao

[ 177 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

do uC
{
escrever();
rxescrever();
}}}}

O fluxograma desse firmware mostrado abaixo:

Figura 14. 4: Fluxograma do sistema de comunicao ModBus.


Note que a comunicao serial desse projeto foi emulada via USB, para aplicao
em um processo real necessrio utilizar um transceptor ou TTL/EIA-232 (MAX232) ou
transceptor ou TTL/EIA-485 (MAX485). Com o MODBUS embarcado possvel integrar
um microcontrolador, preservando as limitaes de funes, em um processo de
automao industrial que utiliza esse protocolo.
INTRODUO MULTITASKING E SISTEMAS OPERACIONAIS EM TEMPO REAL (RTOS)
Um sistema operacional em tempo real (RTOS) um programa (geralmente chamado de

[ 178 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

kernel), que controla a alocao de tarefas quando o processador est operando em um


ambiente multitarefas (multitasking).
O RTOS decide, por exemplo, que tarefa executar em seguida, como coordenar a
prioridades de tarefas e como transmitir dados e mensagens entre as tarefas. O
compilador CCS dispe de bibliotecas embutidas para executar multitarefas paralelas, ou
seja, programao multitasking. Como exemplo, podemos citar a execuo de trs tarefas quaisquer como comutar trs leds ou funes em
frequncias diferentes, de forma independente e paralela. Algumas funes RTOS multitarefas do compilador CCS esto descritas abaixo:

rtos_run () inicia a operao de RTOS. Todas as operaes de controle de tarefas so implementadas aps chamar essa funo.
rtos_terminate () termina a operao de RTOS. O controle retorna ao programa original sem RTOS. Na verdade, esta funo um retorno de rtos_run
().

rtos_enable () esta funo ativa a tarefa para que ela possa ser chamado pelo rtos_run ().
rtos_disable () esta funo desativa a tarefa para que ela no possa mais ser chamado pelo rtos_run (), a menos que seja reativada pela funo
rtos_enable ().

rtos_msg_send () recebe esta funo envia um byte para a tarefa especificada, onde ele colocado na tarefa mensagem.
rtos_msg_read () l o byte localizado na tarefa mensagem.
rtos_msg_ poll () retorna true se houver dados na tarefa mensagem.

PREPARAO PARA RTOS MULTITASKING

Alm das funes anteriores, o comando de pr-processamento # use rtos() deve


ser especificado no incio do programa, antes de chamar as funes RTOS. O formato
deste comando pr-processador:
#use rtos(timer=n, minor_cycle=m)
onde o timer est entre 0 e 4 e especifica o timer do microcontrolador que ser usado pelo
RTOS; e minor_cycle o maior tempo de qualquer tarefa executada. O nmero deve ser
seguido por s, ms, us ou ns.

DECLARAO DE UMA TAREFA


A tarefa declarada como qualquer outra funo em C, mas as tarefas de uma
aplicao multi-tasking no tem argumentos e no retornam nenhum valor. Antes de uma
tarefa ser declarada, especificado o comando de pr-processamento de tarefas. O
formato deste comando de pr-processamento :
#task(rate=n, max=m, queue=p)
onde rate especifica em quanto tempo a tarefa deve ser chamada. O nmero especificado
deve
ser seguido por por s, ms, us ou ns; max especifica o tempo mximo em que o
processador pode executar a tarefa. O tempo especificado aqui deve ser igual ou inferior a
o tempo especificado por minor_cycle. queue opcional e especifica o nmero de bytes a
serem reservados para a tarefa receber mensagens de outras tarefas. O programa
multitasking abaixo comuta trs leds em frequncias diferentes, de forma independente e
paralela.
#include SanUSB1.h
//O firmware abaixo executa uma multi-tarefa (multi-tasking) onde 3 LEDs comutam
//independentes e simultaneamente

[ 179 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

// Define qual o timer utilizado para o multitasking e o maior tempo de cada tarefa (minor_cycle) do
RTOS
#use rtos(timer=0, minor_cycle=10ms)
#task(rate=250ms, max=10ms) // Declara TAREFA 1 - chamada a cada 250ms
void task_B7()
{inverte_saida(PIN_B7); }// comuta B7 inverte o estado de B7
#task(rate=500ms, max=10ms) // Declara TAREFA 2 - chamada a cada 500ms
void task_B6()
{inverte_saida(PIN_B6);} // comuta B6
#task(rate=1s, max=10ms) // Declara TAREFA 3 - chamada a cada segundo
void task_B0()
{inverte_saida(PIN_B0); } // comuta B0
void main()
{
clock_int_4MHz();//Funo necessria para habilitar o dual clock (48MHz para USB e 4MHz para
CPU)
PORTB=0; // Configura PORTB como sada
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); //ciclo de mquina de 1us
rtos_run(); // inicia o RTOS (sistema operacional em tempo real)
}

Em um sistema multitarefa, inmeras tarefas exigem tempo da CPU, e uma vez que
existe apenas uma CPU, necessria alguma forma de organizao e coordenao para
cada tarefa tenha o tempo que necessita. Na prtica, cada tarefa tem um intervalo de
tempo muito curto, assim parece que as tarefas so executadas de forma paralela e
simultnea.
Quase todos os sistemas baseados em microcontroladores executam mais de uma
atividade e trabalham em tempo real. Por exemplo, um sistema de monitoramento da
temperatura composto de trs tarefas que, normalmente, que se repete aps um
pequeno intervalo de tempo, a saber:
- Tarefa 1 l a temperatura;
- Tarefa 2 Formata o valor da temperatura;
- Tarefa 3 exibe a temperatura;
MQUINAS DE ESTADO
As mquinas de estado so simples construes usadas para executar diversas
atividades, geralmente em uma seqncia. Muitos sistemas da vida real que se enquadram
nesta categoria. Por exemplo, o funcionamento de uma mquina de lavar roupa ou
mquina de lavar loua facilmente descrito com uma mquina de estado de construo.
Talvez o mtodo mais simples de implementar uma mquina de estado em C usar um
switch-case. Por exemplo, nosso sistema de monitoramento de temperatura tem trs
tarefas, nomeado Tarefa 1, Tarefa 2, Tarefa 3 e, como mostrado na Figura abaixo.

[ 180 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 15. 1: Implementao de mquina de estado.


A mquina de estado executa as trs tarefas usando declaraes switch-case.
O estado inicial 1, incrementado a cada tarefa do Estado para selecionar o
prximo estado a ser executado. O ltimo estado seleciona o estado 1, e h um atraso no
final do switch-case. A mquina de estado executada continuamente no interior
de um lao infinito.

Figura 15. 2: Mquina de estado implementada em Linguagem C.


Em muitas aplicaes, os estados no precisam ser executados em seqncia. Pelo
contrrio, o prximo estado selecionado direto pelo estado atual ou baseado em alguma
condio.

[ 181 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 15. 3: Selecionando o prximo estado a partir do estado atual.


O RTOS tambm o responsvel por decidir o agendamento (scheduling) da
sequncia das tarefas a serem executadas considerando os nveis de prioridade e o tempo
mximo de execuo de cada tarefa.
APNDICE I: CABEALHOS DA FERRAMENTA PARA DIVERSOS COMPILADORES
CCS C Compiler

#include <18F4550.h> //This library 18F4550.h is valid for the whole family USB
PIC18Fx5xx
#device ADC=10
#fuses
USBDIV,CPUDIV1,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG

HSPLL,PLL5,

#byte OSCCON=0XFD3
#use tempo(clock=48000000)// USB standard frequency (cpu and timers 12 MIPS =
4/48MHz)
//#use tempo(clock=4000000) // internal Oscillator Clock of 4MHz

[ 182 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)


//SanUSB program memory allocation
#define CODE_START 0x1000
#build(reset=CODE_START, interrupt=CODE_START+0x08)
#org 0, CODE_START-1 {}
void clock_int_4MHz(void)
{
//OSCCON=0B01100110; //with dual clock -> cpu and timers #use tempo(clock=4000000)
while(le_eeprom(0xfd));
}

C18 compiler

/* www.tinyurl.com/SanUSB

*/

#include "p18F4550.h"
void low_isr(void);
void high_isr(void);
#pragma code low_vector=0x1018
void interrupt_at_low_vector(void){
_asm GOTO low_isr _endasm
}
#pragma code

[ 183 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

#pragma code high_vector=0x1008


void interrupt_at_high_vector(void){
_asm GOTO high_isr _endasm
}
#pragma code
#pragma interruptlow low_isr
void low_isr (void){
return;}
#pragma interrupt high_isr
void high_isr (void){
return;}
void main( void ){
...;}

SDCC
Example Format

/* www.tinyurl.com/SanUSB

*/

#include <pic18f4550.h>
#pragma code _reset 0x001000
void _reset( void ) __naked{
__asm

[ 184 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

EXTERN __startup
goto __startup
__endasm;}
#pragma code _high_ISR 0x001008
void _high_ISR( void ) __naked{
__asm
retfie
__endasm;}
#pragma code _low_ISR 0x001018
void _low_ISR( void ) __naked{
__asm
retfie
__endasm;}
void main() { }

MikroC
Example Format for Bootloader

/* www.tinyurl.com/SanUSB

*/

#pragma orgall 0x1000


void interrupt(void) org 0x1008{
;}

[ 185 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

void interrupt_low(void) org 0x1018


{
;
}
void main()
{
......;
}

Hi-Tech C Compiler
step1:goto Build option
step2:linker tap
step3:set offset : 1000
Microchip ASM compiler

/* www.tinyurl.com/SanUSB

*/

processor PIC18F4550
#include"p18f4550.inc"
org 0x1000
goto init
org 0x1020
goto int_isr
init

[ 186 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

...

; initialization

loop
...

; code
goto loop

int_isr
...

; interrupt code
retfie
end

APNDICE II: O AMPLIFICADOR OPERACIONAL

Um amplificador operacional (abreviadamente AmpOp) basicamente um


dispositivo amplificador de tenso, caracterizado por um elevado ganho em tenso,
impedncia de entrada elevada (no puxam corrente), impedncia de sada baixa e
elevada largura de banda. O termo operacional surgiu porque foi projetado inicialmente
para realizar operaes matemticas em computadores analgicos.
Estes dispositivos so normalmente dotados de uma malha de realimentao com
funes que transcendem a simples amplificao.
O ampop um componente que possui dois terminais de entrada e um terminal de
sada que referenciado massa. O seu smbolo eltrico, que se apresenta na Figura 1,
um tringulo que aponta no sentido do sinal. Das duas entradas, uma, assinalada com o
sinal (-) chamada de entrada inversora e a outra, a que corresponde o sinal (+)
chamada entrada no-inversora. A sada faz-se no terminal de sada que se encontra
referenciado massa. O amplificador normalmente alimentado com tenses simtricas,

[ 187 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

tipicamente +12 V e 12 V ou +15 V e 15 V, que so aplicadas aos respectivos terminais


de alimentao V+ e V-. Note-se que nos esquemas eltricos freqentemente estes
terminais so omitidos, representando-se apenas as entradas e a sada.
Em alguns casos podem estar disponveis terminais adicionais que permitem
compensar deficincias internas do amplificador, como a tenso de desvio (ou offset).

Figura 1: Simbologia de um amplificador operacional

Ganho de tenso - Normalmente chamado de ganho de malha aberta (sem


realimentao), medido em C.C.(ou em freqncias muito baixas), definido como a
relao da variao da tenso de sada para uma dada variao da tenso de entrada.
Este parmetro, notado como A, tem seus valores reais que vo desde alguns poucos
milhares at cerca de cem milhes em amplificadores operacionais sofisticados.
Normalmente, A o ganho de tenso diferencial em C.C.. O ganho de modo comum , em
condies normais, extremamente pequeno.

O amplificador diferencial (AmpD) o primeiro estgio de um AmpOp estabelecendo


algumas de suas principais caractersticas. Por definio um AmpD um circuito que tem
duas entradas nas quais so aplicadas duas tenses Vi1 e Vi2 e uma sada (a) ou duas
sadas (b). No caso ideal, Vo= A.(Vi1 Vi2) onde A o Ganho de tenso diferencial. Se

[ 188 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

considerarmos a condio ideal, se Vi1 = Vi2, a sada ser nula, isto , um AmpD um
circuito que amplifica s a diferena entre duas tenses rejeitando os sinais de entrada
quando estes forem iguais.

Figura 2: Circuito simplificado de um amplificador diferencial

Geralmente, o amplificador diferencial apresenta apenas um terminal de sada (a),


pois na maioria dos circuitos um lado da carga conectado ao terra.
Os amplificadores operacionais possuem elevada impedncia de entrada e baixa
impedncia na sada. Para amplificadores operacionais como o 741, a resistncia de
entrada de 1 M, a resistncia de sada da ordem de 75 e o ganho pode chegar a
100.000.
Note em (a), que o lado da entrada positiva o mesmo lado da alimentao +Vcc e
que, quando a entrada no-inversora ou o transistor Q1 saturado, parte da corrente de
+Vcc tende a ir, passando por Rc, no sentido de Vo, gerando uma tenso na sada Vo
positiva. Quando a entrada inversora ou o transistor Q2 saturado, parte da corrente
tende a ir em sentido contrrio, gerando uma tenso na sada Vo negativa.
Na verdade, a estrutura interna de um amplificador operacional muito complexa,
sendo constitudo por dezenas de transistores e resistncias contidos numa muito

[ 189 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

pequena pastilha de Silcio (chip). A figura 3 mostra o diagrama de componentes


internos do LM741.

Figura 3: Diagrama de componentes internos do LM741

Analogia de um Amplificador Operacional

Um amplificador operacional alimentado pelo desequilibro das duas entradas. Quando h


uma tenso diferencial, ele satura rapidamente.

[ 190 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 4: Analogia de um Amplificador operacional

Essa simples analogia de um AO e o fluxo de gua est prxima da dinmica real.


medida que a diferena de fora nas duas entradas se torna finita, a pea azul gira, e a
sada conectada a umas das duas tenses de alimentao. Os canais so de tal forma
que a sada rapidamente enviada ao fornecimento +Vs ou -Vs. Quando o equilbrio entre
as entradas restaurado, ento a sada mais uma vez configurada em zero.

Tenso de "offset" - A sada de um amplificador operacional ideal nula quando suas


entradas esto em mesmo nvel de tenso. Nos amplificadores reais, devido
principalmente a um casamento imperfeito dos dispositivos de entrada, normalmente
diferencial, a sada do amplificador operacional pode ser diferente de zero quando ambas
entradas esto no potencial zero. Significa dizer que h uma tenso CC equivalente, na
entrada, chamada de tenso de "offset". O valor da tenso de "offset" nos amplificadores
comerciais esto situado na faixa de 1 a 100 mV. Os componentes comerciais so
normalmente dotados de entradas para ajuste da tenso de "offset".

Amplificador operacional real

Na prtica os Amp-Ops so circuitos integrados que, como qualquer sistema fsico tem
suas limitaes. Um dos Amp-Ops mais difundidos at hoje o 741, que recebe inmeras
codificaes de acordo com seu fabricante, como por exemplo: uA741, LM741 entre
outras. Os pinos 1 e 5 so destinados ao ajuste da tenso de off-set. O Amp-Op 741
mostrado na figura a seguir:

[ 191 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 5: Representao de um amplificador operacional 741


A descrio dos pinos a seguinte:
1 e 5 - So destinados ao ajuste da tenso de off-set
2- Entrada inversora
3- Entrada no-inversora
4- Alimentao negativa (-3V a -18V)
7- Alimentao positiva (+3V a +18V)
6- Sada
8- No possui nenhuma conexo

Modos de Operao do Amplificador Operacional


O amplificador operacional pode ser utilizado basicamente de trs modos distintos.

1) Sem Realimentao (Malha aberta)


Como foi visto, O amplificador operacional um amplificador diferencial, que
amplifica a diferena entre as tenses presentes as suas entradas. Se V1 e V2 forem as
tenses aplicadas s entradas no inversora e inversora respectivamente e Vo for a tenso
de sada, ento:

Vo=A (V1-V2)

[ 192 ]

(1)

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

em que A o ganho do amplificador, dito em malha aberta (sem realimentao). Este


ganho normalmente muito elevado, sendo da ordem de 105 ou superior. A tenso
mxima de sada igual tenso de alimentao, por exemplo, 15 V, o que significa que
em malha aberta, uma diferena de tenso da ordem de 100mV entre as duas entradas
suficiente para elevar a sada a este valor, saturando o amplificador. Na Figura 2
representa-se esta "caracterstica de transferncia" de um amplificador operacional, isto ,
o traado da tenso de sada em funo da tenso de entrada.

Figura 4: Funo de transferncia de um amplificador operacional em malha aberta


O amplificador operacional como um amplificador diferencial de ganho bastante alto
deixa claro que a tenso da sada levada muito rapidamente para as tenses de
alimentao. Com um ganho de cerca de 1 milho, necessria somente uma diferena
de alguns micro-volts entre as duas entradas para levar o amplificador at a saturao.
possvel ver uma pr

[ 193 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Figura 5: Tenso de sada de um amplificador operacional em malha aberta

Esse sistema em malha aberta tambm conhecido como comparador de tenso entre
Vi (tenso de entrada) e Vref (tenso de referncia), que nesse tem a Vref igual ao Gnd.
possvel

ver

uma

prtica

de

LM

741

no

link:

http://www.youtube.com/watch?v=EDol0zL96Ms

2) Amplificador Inversor com Realimentao Negativa

Esta a montagem bsica mais utilizada com amplificadores operacionais no


cotidiano de laboratrios, no interior de equipamentos que amplificam sinais, etc..

[ 194 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Caractersticas:
- A tenso na sada (Vo) ser nula ou a desejada quando as entradas inversora (-) e no
inversora (+) apresentem o mesmo potencial.
- Como a entrada no inversora (+) est aterrada, a entrada inversora (-) ser um
terra virtual.
- Nenhuma das entradas (em teoria) permite a passagem de corrente eltrica do exterior
para o amplificador operacional (impedncia de entrada infinita).
- Se a entrada inversora um terra virtual, temos que, simplesmente, resolver o circuito
abaixo, onde o terra virtual representado:

Para que haja o terra virtual necessrio que Iin = - Iout, ento:

Vin V
V V
V
R
= out
out = 2
R1
R2
Vin
R1
Quase todas as aplicaes de AmpOps envolvem realimentao negativa. Nesse
caso, quando a tenso de sada aumenta, uma parte da tenso de sada realimentada
para a entrada inversora, i reduzindo a sada. Muito rapidamente, o AmpOp encontra seu
ponto operacional. Note que o ganho do AmpOp depende da relao entre R2 e R1.
Exemplo de um amplificador inversor:

[ 195 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Nesse exemplo, o ganho de tenso com o resistor de realimentao varivel em


10K 10. Diminuindo-se o valor desse resistor, o ganho pode ficar bastante pequeno, e o
dispositivo se torna essencialmente um buffer inversor.

2.1) Amplificador Somador Inversor


Nesse circuito, a corrente i4 igual a soma de i1 , i2 e i3. Na figura abaixo, observa-se que o
circuito um amplificador somador, em que cada entrada pode ser operada com fatores de
escala diferentes. i4= - es / R4

Uma das aplicaes mais utiizadas do somador inversor a realizao de um


conversor digital-analgico (DA). Com efeito, considerando, por exemplo, que as fontes de
sinal digital de entrada valem 1 V ou 0 V, e as resistncias Ri se encontram organizadas

[ 196 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

binariamente em funo da ordem de grandeza do bit, por exemplo, R1=R, R2=R/2,


R3=R/4... Rk=R / 2k-1.

Dessa forma, considerando R4 igual a R e as palavras digitais 10011 e 00001 (em


decimal 19 e 1, respectivamente), os valores de tenso na sada sero:
Vo = -(16 + 0 + 0 + 2 + 1) = -19V
Vo = -(0 + 0 + 0 + 0 + 1) = -1V

Na prtica pode se considerar o valor de R4 muito maior que R para limitar o valor da
tenso mxima de sada em 5V. Uma prtica interessante construir um conversor DA a
partir de sinais digitais de uma porta do microcontrolador e conferindo o valor convertido
com um multmetro.

2.2) Amplificador de Diferena


A utilizao conjunta das entradas inversora e no-inversora permite realizar um
circuito que implementa a amplificao da diferena entre dois sinais de entrada. Neste
amplificador, a tenso de sada a diferena entre duas tenses relativas aplicadas
entrada, multiplicada pelo ganho do amplificador. O amplificador da diferena ou subtrator
mostrado na figura abaixo. Mais detalhes no no link:

[ 197 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Onde : Us a tenso de sada em volts (V)


U1 e U2 so as tenses de entrada em volts (V)
R1 e R4 so as resistncias em ohms ()
A tenso de sada deve ser menor do que a tenso de alimentao, pois o ganho
linear somente se no h saturao. Se U1 for ligado ao Gnd, a sada ser igual a entrada
no inversora U2 amplificada pelo ganho (R4/R1). Dessa forma, possvel amplificar sinais
de tenso com pequena amplitude (sensores de corrente e de vibrao) e aumente a
capacidade

do

conversor

AD.

Masi

detalhes

podem

ser

visots

em:

http://www.youtube.com/watch?v=Z8zXBsPa1_k .

Amplificador de Instrumentao
Muito utilizados por sensores com sinais de tenso diferenciais como termopares e
sensores de corrente. O amplificador de instrumentao representado na figura abaixo,
adota dois amplificadores no inversores (AmpOps 1 e 2) na entrada e um amplificador de
diferena (AmpOp 3) na sada. Neste caso, a resistncia de entrada vista por cada uma
das duas fontes infinita (com a mesma resistncia de entrada dos terminais positivos dos
AmpOps 1 e 2), e o ganho de tenso dado pelo produto de dois cocientes entre as
resistncias no amplificador diferencial. Nesse caso a tenso de referncia na entrada

[ 198 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

vs2 pode ser flutuante, ou seja, possvel amplificar faixas de tenses entre as entradas
vs1 e vs2 no simtricas.

A anlise deste circuito pode ser efetuada em trs passos:


(i) determinao das tenses Vo1 e Vo2 nas sadas no inversoras dos AmpOps 1 e 2;

Para vo1 = vo2 = 0, ento:

v1+ = v1- = vs1 -> vo1 = v1- + Rx . i

i = (vs1-vs2) / R -> vo1 = vs1 + Rx . (vs1-vs2) / R

v2+ = v2- = vs2 -> vo2 = v2- - Rx . i

i = (vs1-vs2) / R -> vo2 = vs2

Rx . (vs1-vs2) / R

(ii) obteno das expresses das tenses nos respectivos ns de sada;

vo1 vo2 = (vs1- vs2) + 2. Rx . (vs1-vs2) / R ->

vo1 vo2 = (vs1-vs2) (1 + 2. Rx / R)

(iii) aplicao da expresso do amplificador diferencial no inversor para determinar a


tenso na sada do circuito.

[ 199 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Assim, verifica-se que:

Vo3 = R4/R3 (vo1 vo2) -> Vo3 = R4/R3 (vs1-vs2) (1 + 2. Rx / R)

Vo3 / (vs1-vs2) = R4/R3 (1 + 2. Rx / R)

REFERNCIAS BIBLIOGRFICAS

[ 200 ]

Aplicaes prticas de Eletrnica e microcontroladores em sistemas computacionais

Grupo SanUSB (2011). Arquivos do Grupo SanUSB. Retirado em 05/01/11, no World Wide
Web: www.tinyurl.com/SanUSB/.
Jornal O Povo (2011). Da escola pblica para o mundo. Retirado em 05/01/11, no World
Wide Web:
http://www.opovo.com.br/app/opovo/cienciaesaude/2011/01/08/noticiacienciaesaudejorn
al,2086691/da-escola-publica-para-o-mundo.shtml.
Juc, S. et al.(2011). A low cost concept for data acquisition systems applied to
decentralized renewable energy plants. Retirado em 05/01/11, no World Wide Web:
http://www.mdpi.com/1424-8220/11/1/743 .
Juc, S. et al.(2011). Gravao de microcontroladores PIC via USB pelo terminal do Linux.
Retirado em 05/03/11, no World Wide Web:
http://www.vivaolinux.com.br/artigo/Gravacao-de-microcontroladores-PIC-via-USB-peloterminal-do-Linux/.
Jornal O Povo (2010). De Maracana para Eslovquia. Retirado em 05/01/11, no World
Wide Web: http://publica.hom.opovo.com.br/page,489,109.html?i=2051467.
Dirio do Nordeste (2010). Rob cearense. Retirado em 05/01/11, no World Wide Web:
http://diariodonordeste.globo.com/materia.asp?codigo=861891.
TV Dirio (2010). Feira do Empreendedorismo SEBRAE. Retirado em 05/01/11, no World
Wide Web: http://www.youtube.com/watch?v=8Y7gOPd_zN4.
TV Cidade (2009). Projetos Comsolid/Setapi IFCE. Retirado em 05/01/11, no World Wide
Web: http://www.youtube.com/watch?v=i_waT0_201o.
Juc, S. et al.(2009). SanUSB: software educacional para o ensino da tecnologia de
microcontroladores. Retirado em 05/01/11, no World Wide Web:
http://www.cienciasecognicao.org/pdf/v14_3/m254.pdf .
Dirio do Nordeste (2007). Alunos estimulados a construir robs. Retirado em 05/01/11, no
World Wide Web: http://diariodonordeste.globo.com/materia.asp?codigo=491710.

[ 201 ]

Вам также может понравиться