Anda di halaman 1dari 246

Aplicaes prticas de Eletrnica e

Microcontroladores PIC em Sistemas


Computacionais







Aprenda de forma simples a gravao wireless e via USB de
Microcontroladores PIC






Ferramenta SanUSB




Sandro Juc

Renata Pereira


1. INTRODUO ....................................................................................................................................................... 10
1.1 ASSEMBLY X LINGUAGEM C ......................................................................................................................................... 10
1.2 VANTAGENS X DESVANTAGENS DA LINGUAGEM C PARA MICROCONTROLADORES ...................... 12
1.3 ARQUITETURAS DOS MICROCONTROLADORES ................................................................................................. 12
1.4 O CONTADOR DE PROGRAMA (PC) ........................................................................................................................... 13
1.5 BARRAMENTOS .................................................................................................................................................................. 13
1.6 A PILHA (STACK)................................................................................................................................................................ 14
1.7 CICLO DE MQUINA ......................................................................................................................................................... 14
1.8 MATRIZ DE CONTATOS OU PROTOBOARD ............................................................................................................ 15
1.9 RESISTORES ......................................................................................................................................................................... 16
1.10 CAPACITORES ...................................................................................................................................................................... 17
1.11 FONTES DE ALIMENTAO .......................................................................................................................................... 19
1.12 RUDO (BOUNCING) E FILTRO (DEBOUNCING).................................................................................................. 19
1.13 PROTOCOLO DE COMUNICAO USB ...................................................................................................................... 20
1.14 MTODOS DE COMUNICAO USB ........................................................................................................................... 20
2. FERRAMENTA DE GRAVAO VIA USB ...................................................................................................... 22
2.1 GRAVAO DE MICROCONTROLADORES............................................................................................................... 23
2.2 Usando FOR para piscar o LED ................................................................................................................................... 33
2.3 Usando WHILE para piscar o LED ............................................................................................................................. 34
2.4 USANDO O PORT B ............................................................................................................................................................ 34
2.5 GRAVANDO O MICROCONTROLADOR VIA USB NO WINDOWS.................................................................... 36
2.6 GRAVAO WIRELESS DE MICROCONTROLADORES ....................................................................................... 39
2.7 RGB ........................................................................................................................................................................................... 51
2.8 SISTEMA DUAL CLOCK .................................................................................................................................................... 55
2.9 EMULAO DE COMUNICAO SERIAL NO WINDOWS .................................................................................. 55
2.10 GRAVANDO O MICROCONTROLADOR VIA USB NO LINUX ............................................................................. 62
2.11 GRAVANDO O PIC VIA USB PELO TERMINAL DO LINUX OU MAC OSX ..................................................... 64
2.12 SISTEMA DUAL CLOCK .................................................................................................................................................... 65
2.13 EMULAO DE COMUNICAO SERIAL NO LINUX ........................................................................................... 66
2.14 PROGRAMA COM INTERRUPO EXTERNA POR BOTO E DO TIMER 1 ................................................ 69
2.15 DESAFIO: SEMFORO COM BOTO PARA PEDESTRE ...................................................................................... 74
3. BUZZER ................................................................................................................................................................. 77
4. OBTENO DE UM VOLTMETRO ATRAVS DO CONVERSOR AD COM A VARIAO DE UM
POTENCIMETRO ....................................................................................................................................................... 78
5. CIRCUITO COM84 PARA GRAVAO DO gerenciador.hex ................................................................... 79
6. PERIFRICOS INTERNOS DO MICROCONTROLADOR ............................................................................ 81
6.1 CONVERSOR A/D ................................................................................................................................................................ 81
6.2 AJUSTE DE RESOLUO DO SENSOR E DO CONVERSOR AD DE 8 BITS .................................................. 83
6.3 AJUSTE DA TENSO DE FUNDO DE ESCALA COM AMPOP ............................................................................ 83
6.4 AJUSTE DA TENSO DE REFERNCIA COM POTENCIMETRO .................................................................. 84
6.5 CONVERSOR AD DE 10 BITS ......................................................................................................................................... 84
6.6 OBTENO DE UM VOLTMETRO ATRAVS DO CONVERSOR AD COM A VARIAO DE UM
POTENCIMETRO .............................................................................................................................................................................. 85
6.7 LEITURA DE TEMPERATURA COM O LM35 ATRAVS DO CONVERSOR AD .......................................... 86
6.8 TERMISTOR .......................................................................................................................................................................... 88
6.9 LINEARIZAO ................................................................................................................................................................... 89
7. MEMRIAS DO MICROCONTROLADOR ...................................................................................................... 90
7.1 MEMRIA DE PROGRAMA ............................................................................................................................................. 90
7.2 MEMRIA DE INSTRUES .......................................................................................................................................... 90
7.3 MEMRIA EEPROM INTERNA ..................................................................................................................................... 90
7.4 MEMRIA DE DADOS (RAM) ........................................................................................................................................ 91


7.5 EXEMPLO DE APLICAO:CONTROLE DE ACESSO COM TECLADO MATRICIAL ................................. 92
7.6 PONTEIROS ........................................................................................................................................................................... 93
7.7 MODULAO POR LARGURA DE PULSO PELO CCP ........................................................................................... 96
8. CONTROLE PWM POR SOFTWARE DE VELOCIDADE DE UM MOTOR CC ........................................ 98
9. INTERRUPES E TEMPORIZADORES ....................................................................................................... 99
9.1 INTERRUPES .................................................................................................................................................................. 99
9.2 INTERRUPES EXTERNAS ........................................................................................................................................ 100
9.3 INTERRUPO DOS TEMPORIZADORES .............................................................................................................. 101
9.4 MULTIPLEXAO POR INTERRUPO DE TEMPORIZADORES ................................................................ 103
10. EMULAO DE PORTAS LGICAS ......................................................................................................... 105
10.1 INSTRUES LGICAS PARA TESTES CONDICIONAIS DE NMEROS .................................................... 105
10.2 INSTRUES LGICAS BOOLANAS BIT A BIT .................................................................................................... 105
10.3 EMULAO DE DECODIFICADOR PARA DISPLAY DE 7 SEGMENTOS .................................................... 110
11. MULTIPLEXAO COM DISPLAYS DE 7 SEGMENTOS .................................................................... 117
12. COMUNICAO SERIAL EIA/RS-232.................................................................................................... 121
12.1 CDIGO ASCII ..................................................................................................................................................................... 122
12.2 INTERFACE USART DO MICROCONTROLADOR................................................................................................. 123
12.3 CLCULO DE TAXA DE TRANSMISSO SERIAL ................................................................................................. 125
12.4 COMUNICAO SERIAL EIA/RS-485 ...................................................................................................................... 127
12.5 APLICAO DE COMUNICAO SERIAL VIA BLUETOOTH OU ZIGBEE.................................................. 127
13. ACIONAMENTO DE MOTORES MICROCONTROLADOS .................................................................. 128
13.1 ACIONAMENTO DE MOTORES CC DE BAIXA TENSO ................................................................................... 128
13.2 MOTORES ELTRICOS UTILIZADOS EM AUTOMVEIS ................................................................................. 128
13.3 COROA E O PARAFUSO COM ROSCA SEM-FIM ................................................................................................... 130
13.4 CHAVEAMENTO DE MOTORES CC COM TRANSISTORES MOSFET .......................................................... 131
13.5 EXEMPLO: SEGUIDOR TICO DE LABIRINTO .................................................................................................... 132
13.6 ESTABILIDADE DO CONTROLE DE MOVIMENTO ............................................................................................ 132
13.7 PONTE H .............................................................................................................................................................................. 135
13.8 DRIVER PONTE H L293D ............................................................................................................................................. 136
13.9 SOLENIDES E RELS ................................................................................................................................................... 137
13.10 DRIVER DE POTNCIA ULN2803 ........................................................................................................................ 139
13.11 PONTE H COM MICRORELS ................................................................................................................................ 143
13.14 ACIONAMENTO DE MOTORES DE PASSO ....................................................................................................... 145
13.15 MOTORES DE PASSO UNIPOLARES ................................................................................................................... 145
13.16 MODOS DE OPERAO DE UM MOTOR DE PASSO UNIPOLAR ............................................................. 147
13.17 ACIONAMENTO BIDIRECIONAL DE DOIS MOTORES DE PASSO .......................................................... 147
Exemplo de cdigo em C para CCS: .......................................................................................................................................... 148
13.18 SERVO-MOTORES ....................................................................................................................................................... 150
14. FOTOACOPLADORES E SENSORES INFRAVERMELHOS................................................................. 156
14.1 TRANSMISSOR E RECEPTOR IR ............................................................................................................................... 157
14.2 AUTOMAO E DOMTICA COM CONTROLE REMOTO UNIVERSAL ...................................................... 161
15. LCD (DISPLAY DE CRISTAL LQUIDO) ................................................................................................. 164
15.1 EXEMPLO: CONTROLE DE TENSO DE UMA SOLDA CAPACITIVA COM LCD ..................................... 169
15.2 CGRAM (RAM de gerao de caracteres especiais) .......................................................................................... 172
16. MODELAGEM DE SINAIS DE SENSORES .............................................................................................. 174
16.1 EXEMPLO: MODELAGEM DE UM LUXMETRO MICROCONTROLADO COM LDR ............................... 174
16.2 SUPERVISRIO .................................................................................................................................................................. 180
17. INTERFACE I
2
C ............................................................................................................................................ 182
17.1 REGRAS PARA TRANSFERNCIA DE DADOS ...................................................................................................... 183


17.2 MEMRIA EEPROM EXTERNA I
2
C ........................................................................................................................... 187
18. RTC (RELGIO EM TEMPO REAL) ........................................................................................................ 189
18.1 EXEMPLO: PROTTIPO DATALOGGER USB DE BAIXO CUSTO .................................................................. 193
19. TRANSMISSO DE DADOS VIA GSM ..................................................................................................... 199
19.1 COMANDOS AT PARA ENVIAR MENSAGENS SMS DE UM COMPUTADOR PARA UM CELULAR OU
MODEM GSM ....................................................................................................................................................................................... 200
19.2 COMANDOS AT PARA RECEBER MENSAGENS SMS EM UM COMPUTADOR ENVIADAS POR UM
CELULAR OU MODEM GSM .......................................................................................................................................................... 201
20. O PROTOCOLO MODBUS EMBARCADO .............................................................................................. 204
20.1 MODELO DE COMUNICAO ...................................................................................................................................... 204
20.2 DETECO DE ERROS .................................................................................................................................................... 205
20.3 MODOS DE TRANSMISSO .......................................................................................................................................... 205
21. INTRODUO SISTEMAS OPERACIONAIS EM TEMPO REAL (RTOS) .................................... 210
21.1 MQUINAS DE ESTADO ................................................................................................................................................ 212
22. UTILIZANDO O COMPILADOR C18 E A IDE MPLABX MULTIPLATAFORMA COM FUNES
EM PORTUGUS ........................................................................................................................................................ 214
22.1 FUNES EM PORTUGUS .......................................................................................................................................... 215
22.2 FUNES BSICAS DA APLICAO DO USURIO............................................................................................. 215
22.3 FUNES DO CONVERSOR ANALGICO DIGITAL (A/D)............................................................................... 220
22.4 FUNES DA COMUNICAO SERIAL RS-232 ................................................................................................... 221
23. EXEMPLOS DE PROGRAMAS................................................................................................................... 222
24. APNDICE I: CABEALHOS DA FERRAMENTA PARA DIVERSOS COMPILADORES............... 230
24.1 CCS C Compiler .................................................................................................................................................................. 230
24.2 C18 compiler ...................................................................................................................................................................... 231
24.3 SDCC ....................................................................................................................................................................................... 233
24.4 MikroC ................................................................................................................................................................................... 234
24.5 Hi-Tech C Compiler ......................................................................................................................................................... 235
24.6 Microchip ASM compiler ............................................................................................................................................... 235
25. REFERNCIAS BIBLIOGRFICAS ........................................................................................................... 246




ndice de Figuras

Figura 1: Instrues em assembly. ................................................................................................ 11
Figura 2: Memrias. ...................................................................................................................... 14
Figura 3: Ciclo de mquina. .......................................................................................................... 15
Figura 1: Protoboard. .................................................................................................................... 16
Figura 4: Contatos internos de uma protoboard. ........................................................................... 16
Figura 5: Cdigo de cores de resistores. ....................................................................................... 17
Figura 6: Forma de onda de capacitor. ......................................................................................... 18
Figura 7: Exemplos de Capacitores. ............................................................................................. 18
Figura 8: Clculo demonstrativo de capacitncia. ........................................................................ 18
Figura 9: Cdigo de cores Capacitores Polister. ......................................................................... 19
Figura 10: Rudo. .......................................................................................................................... 20
Figura 11: Drivers e comunicao. ............................................................................................... 21
Figura 12: Gravao do PIC via PC. ............................................................................................. 23
Figura 13: Esquemtico de montagem da Ferramenta para 28 pinos. .......................................... 24
Figura 14: Esquemtico de montagem da ferramenta para 40 pinos. .......................................... 25
Figura 15: Esquema montado em protoboard. .............................................................................. 26
Figura 16: Esquema montado em PCB. ........................................................................................ 27
Figura 17: PCB da Ferramenta SanUSB. ...................................................................................... 27
Figura 18: Esquemtico Pisca LED b7. ........................................................................................ 29
Figura 19: Pisca LED b7 com placa SanUSB. .............................................................................. 30
Figura 20: Pisca LED b7b6b5 com placa SanUSB. ...................................................................... 30
Figura 21: Pisca LED b7b6b5 com SanUSB em protoboard. ....................................................... 31
Figura 22: Esquemtico Pisca LED b7b6b5. ................................................................................ 31
Figura 23: Pisca 3 LEDs em protoboard. ...................................................................................... 32
Figura 24: Esquemtico Sequencial de LEDs usando o Port B. ................................................... 34
Figura 25: Botes b0b1 com placa SanUSB. ................................................................................ 35
Figura 26: Interface de gravao do microcontrolador via USB. ................................................. 37
Figura 27: Ilustrao do circuito de gravao wireless Zigbee..................................................... 40
Figura 28: Gravao via USB de Configurao wireless. ............................................................ 41
Figura 29: Gravao via USB de Adaptador wireless. ................................................................. 41
Figura 30: Gravao wireless zigbee pelo prompt do Windows. ................................................. 42
Figura 31: Bluetooth conectado placa SanUSB 2550. ............................................................... 43
Figura 32: Ilustrao e Montagem do Circuito de gravao/comunicao wireless Bluetooth. .. 44
Figura 33: Esquema mdulo BLUETOOTH com placa SanUSB 4550. ...................................... 44
Figura 34: Pareamento do modem bluetooth. ............................................................................... 46
Figura 35: Verificao da porta serial criada pelo modem bluetooth. .......................................... 46
Figura 36: Gravao via USB de Configurao wireless. ............................................................ 47
Figura 37: Gravao via USB de Adaptador wireless. ................................................................. 47
Figura 38: Gravao wireless bluetooth pelo prompt do Windows. ............................................. 48
Figura 39: Processo de formao das cores RGB. ........................................................................ 51
Figura 40: Significado de algumas cores. ..................................................................................... 52
Figura 41: Ligao completa do circuito RGB e SanUSB. ......................................................... 53
Figura 42: Pinos Led RGB catodo comum. .................................................................................. 53
Figura 43: O aplicativo BT4SanUSB - RGB. .............................................................................. 54
Figura 44: A aplicao do projeto Bluetooth, Android e RGB. ................................................... 55
Figura 45: Comunicao PIC com PC e via I
2
C. .......................................................................... 55
Figura 46: Instalao do driver CDC (1). ..................................................................................... 57
Figura 47: Instalao do driver CDC (2). ..................................................................................... 58
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 6 ]
Figura 48: Instalao do driver CDC (3). ..................................................................................... 58
Figura 49: Instalao do driver CDC (4). ..................................................................................... 59
Figura 50: Instalao do driver CDC (5). ..................................................................................... 59
Figura 51: Verificao de porta COM instalada. .......................................................................... 60
Figura 52: Utilizao da porta COM pelo CCS. ........................................................................... 60
Figura 53: Visualizao de textos via serial emulada. .................................................................. 62
Figura 54: Interface em Java de comunicao serial. ................................................................... 62
Figura 55: Mensagem de programa gravado. ............................................................................... 63
Figura 56: Acesso pasta pelo terminal do LINUX. .................................................................... 65
Figura 57: Comunicao PIC com PC e via I
2
C. .......................................................................... 66
Figura 58: CuteCOM. ................................................................................................................... 68
Figura 59: Interface de comunicao serial em Java para LINUX. .............................................. 69
Figura 60: Esquema boes b0 b1. ................................................................................................. 71
Figura 61: Botes b0 b1 em protoboard. ...................................................................................... 71
Figura 62: Botes b0 b1 com placa SanUSB. ............................................................................... 72
Figura 63: Esquemtico Semforo com boto para pedestre. ....................................................... 75
Figura 64: Semforo com boto e semforo para pedestre com SanUSB em protoboard. ........... 75
Figura 65: Buzzer com placa SanUSB. ........................................................................................ 78
Figura 66: Uso de potencimetro no conversor AD do PIC. ........................................................ 79
Figura 67: Circuito COM84 para gravao do gerenciador.hex ................................................... 80
Figura 68: Esquema de ligao do conector serial........................................................................ 80
Figura 69: Tela de configurao do software de gravao. .......................................................... 80
Figura 70: Tela de confirmao de reconhecimento do circuito................................................... 81
Figura 71: Diagrama de blocos interno do conversor A/D. .......................................................... 82
Figura 72: Uso de perifricos no conversor A/D. ......................................................................... 82
Figura 73: AMP-OP no inversor. ................................................................................................ 84
Figura 74: Conexo do potencimetro no conversor A/D. ........................................................... 86
Figura 75:Esquema LM35. ........................................................................................................... 86
Figura 76: LM35 com placa SanUSB. .......................................................................................... 87
Figura 77: LM35 em protoboard. ................................................................................................. 87
Figura 78: Leitura de temperatura via monitor serial. .................................................................. 88
Figura 79: Conexo do termistor. ................................................................................................. 89
Figura 80: Resposta do termistor. ................................................................................................. 89
Figura 81: Linearizao do termistor. ........................................................................................... 90
Figura 82: Registros de funes especiais. ................................................................................... 91
Figura 83: Teclado Matricial. ....................................................................................................... 92
Figura 84: Formas de comparao com a senha pr-programada................................................. 93
Figura 85: Ciclo de trabalho. ........................................................................................................ 97
Figura 86: PWM. .......................................................................................................................... 98
Figura 87: PWM com Mosfet. ...................................................................................................... 99
Figura 88: Portas Lgicas. ......................................................................................................... 106
Figura 89: Uso de resistores de pull down para aplicar funo lgica 0/1. ................................ 107
Figura 90: Outras funes lgicas a partir de NOT, OR e AND. ............................................... 107
Figura 91: Exemplo de circuito combinacional (1). ................................................................... 108
Figura 92: Exemplo de circuito combinacional (2). ................................................................... 109
Figura 93: Display de 7 segmentos. ............................................................................................ 111
Figura 94: Conexo do display 7 seg na porta B do PIC. ........................................................... 114
Figura 95: Esquemtico Display 7 seg duplo. ............................................................................ 118
Figura 96: Display 7 seg duplo com placa SanUSB. .................................................................. 119
Figura 97: Display 7 seg duplo com SanUSB em protoboard. ................................................... 120
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 7 ]
Figura 98: Dado em comunicao serial. .................................................................................... 122
Figura 99: Caracteres ASCII. ...................................................................................................... 123
Figura 100: Conectores USART. ................................................................................................ 124
Figura 101: Sinal eltrico RS-232. ............................................................................................. 124
Figura 102: Circuito de conexo MAX 232. .............................................................................. 125
Figura 103: Motores CC. ............................................................................................................ 128
Figura 104: Motor CC com caixa de reduo. ............................................................................ 129
Figura 105: Relao de transmisso. .......................................................................................... 129
Figura 106: Coroa e sem-fim. ..................................................................................................... 130
Figura 107: Mosfet IRF540. .................................................................................................... 131
Figura 108: Acionamento de motor com Mosfet. ....................................................................... 132
Figura 109: Situaes encontradas em labirintos. ...................................................................... 132
Figura 110: Uso de sensores ticos para controlar motores. ...................................................... 133
Figura 111: Fluxograma de funcionamento de rob mvel com sensores. ................................ 135
Figura 112: Motor em Ponte H. .................................................................................................. 136
Figura 113: CI Ponte H L293D. ............................................................................................... 136
Figura 114: Solenide. ................................................................................................................ 137
Figura 115: Rels. ....................................................................................................................... 138
Figura 116: Acionamento de motor 12V com rel bobina 5V. .................................................. 138
Figura 117: Aplicao de um rel. .............................................................................................. 139
Figura 118: Rel em protoboard. ................................................................................................ 139
Figura 119: ULN 2803. ............................................................................................................... 140
Figura 120: Esquemtico Rel b7. .............................................................................................. 140
Figura 121: Rel b7 com placa SanUSB. ................................................................................... 141
Figura 122: Rel b7 com SanUSB em protoboard. .................................................................... 142
Figura 124: Acionamento de motor nos 2 sentidos com rels em Ponte H. ............................... 143
Figura 125: Ponte H com rels motor CC. ............................................................................... 144
Figura 126: Motor de passo unipolar. ......................................................................................... 145
Figura 127: Motores de passo unipolar conexo interna. ........................................................ 146
Figura 128: Identificao dos terminais do motor de Passo 28BYJ48. ...................................... 146
Figura 129: Caractersticas e Lgica de acionamento de motor de passo. ................................. 147
Figura 130: Conexo do motor de passo no PIC. ....................................................................... 148
Figura 131: Aplicao de servo-motores em rob mvel. .......................................................... 151
Figura 132: Visualizao interna de um servo-motor. ................................................................ 152
Figura 133: Micro-servomotor 1,6kg com placa SanUSB. ........................................................ 153
Figura 135: Visualizao interna de um Fotoacoplador. ............................................................ 156
Figura 136: Aplicao de um fotoacoplador. .............................................................................. 156
Figura 137: Esquema Par infavermelho. ..................................................................................... 157
Figura 138: Conexo do par infravermelho: TIL 32 (emissor) e TIL 78 (receptor). .................. 158
Figura 139: Sensor Infravermelho com SanUSB em protoboard. .............................................. 159
Figura 140: Sensor Infravermelho com placa SanUSB. ............................................................. 160
Figura 141: Diagrama de blocos de comunicao infravermelha. .............................................. 162
Figura 142: Conexo de receptor infravermelho de TV no PIC. ................................................ 163
Figura 143: Exemplo de proteo do receptor contra emisses externas de raios IR................. 164
Figura 144: Esquema LCD. ........................................................................................................ 165
Figura 145: Conexo do LCD no PIC. ....................................................................................... 166
Figura 146: Display LCD com placa SanUSB. .......................................................................... 166
Figura 147: Exemplo de aplicao do LCD. ............................................................................... 170
Figura 148: Criao de caracteres especiais. .............................................................................. 173
Figura 149: Circuito sensor com LDR. ....................................................................................... 175
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 8 ]
Figura 150: Esquemtico Sensor de Luminosidade LDR. .......................................................... 175
Figura 151: Sensor de luminosidade LDR com placa SanUSB. ................................................. 176
Figura 152: Sensor de luminosidade LDR com SanUSB em protoboard. .................................. 176
Figura 153: Grfico Lux x Volt. ................................................................................................. 178
Figura 154: Modelagem matemtica dos valores obtidos. ......................................................... 179
Figura 155: Grfico lux x tenso utilizando as equaes 3, 4 e 5. .............................................. 179
Figura 156: Figura da tela do supervisrio para Iluminncia e Temperatura. ............................ 181
Figura 157: Esquema eletrnico do circuito luxmetro.............................................................. 181
Figura 158: Foto do circuito montado. ...................................................................................... 182
Figura 159: Barramento I
2
C. ....................................................................................................... 183
Figura 160: Configurao I
2
C em TVs. ...................................................................................... 183
Figura 161: Leitura de dados em comunicao. ......................................................................... 184
Figura 162: Comandos de incio e fim de comunicao. ............................................................ 184
Figura 163: reconhecimento do byte. ......................................................................................... 184
Figura 164: Escrita de dados. ...................................................................................................... 185
Figura 165: Recepo e transmisso de dado. ............................................................................ 186
Figura 166: Uso de memria EEPROM externa via I
2
C. ........................................................... 187
Figura 167: Leitura de valores da memria. ............................................................................... 189
Figura 168: RTC DS1307 e similar. ........................................................................................... 190
Figura 169: Registros de tempo DS1307. ................................................................................... 190
Figura 170: Datalogger. .............................................................................................................. 194
Figura 171: Comunicao PIC com PC e via I
2
C. ...................................................................... 194
Figura 172: Esquemtico e foto do datalogger conectado ao PIC. ............................................. 203
Figura 173: Checagem de dados. ................................................................................................ 205
Figura 174: Diagrama de blocos comunicao ModBus. ........................................................... 206
Figura 175: Software de teste de comunicao ModBus. ........................................................... 206
Figura 176: Fluxograma do sistema de comunicao ModBus. ................................................. 210
Figura 177: Implementao de mquina de estado. .................................................................... 212
Figura 178: Mquina de estado implementada em Linguagem C. ............................................. 213
Figura 179: Selecionando o prximo estado a partir do estado atual. ........................................ 214
Figura 180: Projeto pisca LED no compilador C18. .................................................................. 214
Figura 181: Simbologia de um amplificador operacional. ......................................................... 236
Figura 182: Circuito simplificado de um amplificador diferencial. ........................................... 237
Figura 183: Diagrama de componentes internos do LM741. ..................................................... 238
Figura 184: Analogia de um Amplificador operacional. ............................................................ 238
Figura 185: Representao de um amplificador operacional 741. .............................................. 239
Figura 186: Funo de transferncia de um amplificador operacional em malha aberta. .......... 240
Figura 187: Tenso de sada de um amplificador operacional em malha aberta. ....................... 241











Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 9 ]































Dedico este trabalho
a Deus, minha famlia, a todos
ifceanos, amigos e integrantes
do grupo SanUSB.


Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 10 ]
1. INTRODUO


Um microcontrolador um sistema computacional completo, no qual esto includos
internamente uma CPU (Central Processor Unit), memrias RAM (dados), flash (programa)
e E
2
PROM, 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.
1.1 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 MPLAB. 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.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 11 ]



Figura 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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 12 ]
1.2 VANTAGENS X DESVANTAGENS DA LINGUAGEM C PARA
MICROCONTROLADORES
- 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 I
2
C.

- 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 nvel, 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.

1.3 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;
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 13 ]
- 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
buscada na memria, ou seja, um PIPELINE (sobreposio), o que torna o
processamento mais rpido.

1.4 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.

1.5 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.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 14 ]

Figura 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
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.

1.6 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.

1.7 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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 15 ]
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 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
que geram saltos no contador de programa, como chamadas de funes em outro local
da memria de programa e os retornos dessas funes.

1.8 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).

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 16 ]

Figura 1: 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 4: Contatos internos de uma protoboard.
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.

1.9 RESISTORES

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

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 17 ]

Figura 5: Cdigo de cores de resistores.
1.10 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
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 18 ]
so um curto e carregados abrem o circuito, por isso so utilizados tambm para isolar
fontes CC.

Figura 6: 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 7: Exemplos de Capacitores.
A figura abaixo mostra a identificao de capacitores cermicos.



Figura 8: Clculo demonstrativo de capacitncia.

A figura abaixo mostra a identificao de capacitores de polister.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 19 ]

Figura 9: Cdigo de cores Capacitores Polister.

1.11 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 disponvel
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 ampre-
hora (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,
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 nvel lgico, surge um rudo
(Bouncing) na transio que, caso uma interrupo esteja habilitada ou at mesmo um
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 20 ]
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 10: Rudo.

1.13 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.

1.14 MTODOS DE COMUNICAO USB

Os mtodos mais comuns de comunicao USB, tambm utilizados pela ferramenta
SanUSB, so:

Human Interface Device (HID) - O dispositivo USB reconhecido automaticamente
pelo sistema operacional Windows@ ou linux como um Dispositivo de Interface Humana
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 21 ]
(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
disponvel 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 disponvel 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 11: Drivers e comunicao.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 22 ]
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.
2. 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.
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 virtual, possam ser feitos de forma rpida e eficaz a partir do momento
em o microcontrolador esteja conectado diretamente a um computador via USB.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 23 ]

Figura 12: 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.
Caso voc esteja montando o circuito SanUSB com material adquirido de no-
revendedores SanUSB, 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 disponvel na pasta completa
da ferramenta no link abaixo, onde tambm possvel baixar periodicamente as
atualizaes dessa ferramenta e a incluso de novos programas:
http://www.4shared.com/file/sIZwBP4r/100727SanUSB.html .
Se voc estiver usando a placa SanUSB ou o kit SanUSB para protoboard adquirido
de revendedores da Ferramenta SanUSB, voc no deve se preocupar em gravar o
gerenciador, pois o PIC j ser enviado com o bootloader e a placa estar no ponto de ser
reconhecida via USB pelo PC e permitir a gravao do microcontrolador.
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
disponvel 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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 24 ]
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 C18, o Hi-Tech e o CCS. Devido didtica das funes e bibliotecas USB
disponveis para emulao serial, diversos perifricos e multitasking, um dos compiladores
utilizados com bom rendimento, alm do C18, com exemplos de aplicao disponveis na
pasta de desenvolvimento, o CCS na verso 3.245. Esta verso funcional com
bibliotecas de suporte a USB pode ser obtida atravs do link:
http://www.4shared.com/file/Mo6sQJs2/100511Compilador.html .
As verses 4 deste compilador apresentam bugs em funes e aplicaes, embora
tenham sido testadas algumas verses e funcionaram satisfatoriamente at a verso
4.084. Neste caso, recomendado criar, para cada firmware (programa a ser compilado),
um novo source file.Caso grave no microcontrolador o novo gerenciador de gravao pela
USB GerenciadorPlugandPlay.hex, no esquea de colar o novo arquivo cabealho
SanUSB.h dentro da pasta ExemploseBibliotecasCCSlocalizada na pasta instalada do
compilador (C:\Arquivos de programas\PICC\Drivers ). A representao bsica do circuito
SanUSB montado em protoboard mostrada a seguir:


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







Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


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

Figura 14: Esquemtico de montagem da ferramenta para 40 pinos.
Os componentes bsicos do circuito so:
1 microcontrolador da famlia PIC USB (18F2550/2455 ou 18F4550/4455);
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 jump 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(Windows@, Linux 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
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 26 ]
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 conect-
lo 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
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 de cada terminal no conector USB a ser ligado no PC. Cada
terminal conectado diretamente nos pinos do microcontrolador pelos quatro fios
correspondentes do cabo USB.

Figura 15: Esquema montado em protoboard.
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).
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, disponvel 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 ou com a
empresa fabricante R Componentes: pedido@recomponentes.com .
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 27 ]

Figura 16: Esquema montado em PCB.
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 no vdeo
disponvel em: http://www.youtube.com/watch?v=Xm8YJ_XaGA8.


Figura 17: 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
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 28 ]
www.tinyurl.com/SanUSB e clicar no item Arquivos ou na aba DOWNLOADS em:
https://www.recomponentes.com/conteudo/DOWNLOADs.html .
Durante a programao do microcontrolador basta inserir, no inicio do programa em
C, a biblioteca cabealho SanUSB (#include <SanUSB.h>) contida dentro da pasta
ExemploseBibliotecasCCS e que voc j adicionou dentro da Drivers localizada na pasta
instalada do compilador ( C:\Arquivos de programas\PICC\Drivers ). Esta biblioteca contm
instrues do PIC18F2550 para o sistema operacional, configuraes de fusveis e
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.c abaixo comuta umled conectado no
pino B7 a cada 0,5 segundo.
Programao em Linguagem C para CCS:

#include <SanUSB.h> //biblioteca de instrues SanUSB

void main()//programa principal
{

while (1){//lao infinito
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo, reseta
//e entra em estado de gravao
output_high(pin_b7); //coloca a sada B7 em nvel lgico alto, ou seja, acende LED
delay_ms(500);//aguarda 500 milissegundos = 0,5 segundos
output_low(pin_b7); //coloca a sada B7 em nvel lgico baixo, ou seja, apaga LED
delay_ms(500); //aguarda 500 milissegundos = 0,5 segundos
}//fim while
} }//fim main

Aps montar o circuito da Ferramenta SanUSB na protoboard ou utilizando a placa
deve-se iniciar a sequncia de prticas.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 29 ]

Figura 18: Esquemtico Pisca LED b7.

Esta apostila trar diversor exemplos para ajudar voc no desenvolvimento de
projetos com Microcontrolador PIC utilizando a Ferramenta SanUSB!

Temos vdeo-aulas disponveis no endereo:
www.youtube.com/recomponentes.

Pode-se encontrar diversos projetos em:
www.youtube.com/Imaculada27,www.youtube.com/sandrojuca e
www.youtube.com/SanUSB2.

Grupo de apoio: www.tinyurl.com/SanUSB
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 30 ]


Figura 19: Pisca LED b7 com placa SanUSB.

Figura 20: Pisca LED b7b6b5 com placa SanUSB.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 31 ]


Figura 21: Pisca LED b7b6b5 com SanUSB em protoboard.


Figura 22: Esquemtico Pisca LED b7b6b5.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 32 ]


Figura 23: Pisca 3 LEDs em protoboard.

O programa pisca3.c abaixo pisca trs leds conectados nos pinos B5, B6 e B7.

#include <SanUSB.h>//BIBLIOTECA DE INSTRUES

#define time 500

main(){//PROGRAMA PRINCIPAL

//clock_int_4MHZ(); //verificar biblioteca SanUSB.h

while (1)//LAO INFINITO
{
output_high(pin_b7);//SAIDA ALTA NO PINO B7 - LED ACENDE
delay_ms(time);//ATRASO 0,5 SEG
output_low(pin_b7);//SAIDA BAIXA NO PINO B7 - LED APAGA
delay_ms(time);//ATRASO 0,5 SEG

output_high(pin_b6);//SAIDA ALTA NO PINO B6 - LED ACENDE
delay_ms(time);//ATRASO 0,5 SEG
output_low(pin_b6);//SAIDA BAIXA NO PINO B6 - LED APAGA
delay_ms(time);//ATRASO 0,5 SEG

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 33 ]
output_high(pin_b5);//SAIDA ALTA NO PINO B5 - LED ACENDE
delay_ms(time);//ATRASO 0,5 SEG
output_low(pin_b5);//SAIDA BAIXA NO PINO B5 - LED APAGA
delay_ms(time);//ATRASO 0,5 SEG
}
}
Como exerccio para avaliar o aprendizado, deve-se elaborar 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, sero utilizados laos de repetio finitos, como o exemplo a seguir que usa a funo
FOR.
2.2 Usando FOR para piscar o LED

CCS:
#include <SanUSB.h>//BIBLIOTECA DE INSTRUES

int x;// declarao de varivel auxiliar de nome 'x' do tipo inteiro

main(){//PROGRAMA PRINCIPAL

while (1)//LAO INFINITO
{
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo, reseta
//e entra em estado de gravao

output_high(pin_b7);//SAIDA ALTA NO PINO B7 - LED ACENDE
delay_ms(1000);//ATRASO 0,5 SEG
output_low(pin_b7);//SAIDA BAIXA NO PINO B7 - LED APAGA
delay_ms(1000);//ATRASO 0,5 SEG

for (x=0;x<2;x++)
{
output_toggle(pin_b6);//SAIDA COMUTADA NO PINO B6 - LED APAGA OU
ACENDE
delay_ms(500);//ATRASO 0,5 SEG
}

for (x=0;x<3;x++)
{
output_toggle(pin_b5);//SAIDA COMUTADA NO PINO B5 - LED APAGA OU
ACENDE
delay_ms(100);//ATRASO 0,5 SEG
}
}

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 34 ]
Tambm possvel utilizar a funo WHILE, como no exemplo 2.1:
2.3 Usando WHILE para piscar o LED
CCS:
#include <SanUSB.h>//BIBLIOTECA DE INSTRUES
int x;// declarao de varivel auxiliar de nome 'x' do tipo inteiro
main(){//PROGRAMA PRINCIPAL
while (1)//LAO INFINITO
{
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo, reseta //e entra
em estado de gravao
output_high(pin_b7);//SAIDA ALTA NO PINO B7 - LED ACENDE
delay_ms(1000);//ATRASO 0,5 SEG
output_low(pin_b7);//SAIDA BAIXA NO PINO B7 - LED APAGA
delay_ms(1000);//ATRASO 0,5 SEG
while (x<2){
output_toggle(pin_b6);//SAIDA COMUTADA NO PINO B6 - LED APAGA OU ACENDE
delay_ms(500);//ATRASO 0,5 SEG
x++;//INCREMENTA VARIVEL x DE UM EM UM
}
while (x<3){
output_toggle(pin_b5);//SAIDA COMUTADA NO PINO B5 - LED APAGA OU ACENDE
delay_ms(100);//ATRASO 0,5 SEG
x++;//INCREMENTA VARIVEL x DE UM EM UM
}}}

2.4 USANDO O PORT B


Figura 24: Esquemtico Sequencial de LEDs usando o Port B.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 35 ]

Figura 25: Botes b0b1 com placa SanUSB.
Cdigo em C para CCS: Vai e volta de LEDS
#include <SanUSB.h>//BIBLIOTECA DE INSTRUES
void main(){
int i =1;
while(1){
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo,
reseta
//e entra em estado de gravao
while(i <=255){
output_b(i);
i= (i<<1)+ 1;
delay_ms(100);
if(i == 255){
output_b(i);
delay_ms(100);
while(i <= 255){
i = (i>>1) ;
output_b(i);
delay_ms(100);
if(i == 1)
break;
} } } } }

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 36 ]
Cdigo em C para CCS: Desloca bits no port B

#include <SanUSB.h> //BIBLIOTECA DE INSTRUES

void main(){

int d=1;

while(true){
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo,
reseta
//e entra em estado de gravao
output_b(d);
delay_ms(100);
output_b(0);
d=d<<1;
if (d == 256)
d=1;
}}

Os arquivos compilados .hex assim como os firmwares esto disponveis em
http://www.4shared.com/file/sIZwBP4r/100727SanUSB.html.

2.5 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 http://www.4shared.com/file/sIZwBP4r/100727SanUSB.html.
2. Grave no microcontrolador, somente uma vez, caso no tenha adquirido o PIC ou a placa
SanUSB de um de nossos revendedores) 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 disponvel na pasta Gerenciador,
compatvel com os sistemas operacionais Windows@, Linux e Mac OSX. Caso tenha
adquirido nossa placa, no necessrio gravar o gerenciador, pois o PIC j foi enviado
gravado.
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@ disponvel
em:
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 37 ]
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 e execute o aplicativo SanUSB da
pasta SanUSBwinPlugandPlay. Surgir a seguinte tela:


Figura 26: 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:

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 38 ]

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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 39 ]


Pronto isso. Para reinstalar o executvel da subpasta SanUSBwinPlugandPlay , basta
instal-lo de dentro do arquivo .zip ou .rar.

2.6 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.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 40 ]


Figura 27: 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 e Gravao sem fio de
microcontroladores via Zigbee: http://www.youtube.com/watch?v=BlRjKbXpepg.
Procedimento para gravao wireless:
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 (D
OUT
) do modem Zigbee, e o fio amarelo
ligado ao 17 (Tx) do microcontrolador e ao pino 3 (D
IN
) 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) e 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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 41 ]


Figura 28: Gravao via USB de Configurao wireless.
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 a gravao via USB do firmware aplicativo
AdaptadorSerial.hex. Aps a transferncia deste firmware, o microcontrolador est apto
para gravao wireless.


Figura 29: Gravao via USB de Adaptador wireless.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 42 ]
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

Figura 30: 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://lista.mercadolivre.com.br/sanusb ou www.recomponentes.com, pode ser
adquirido o kit placa SanUSB + modem Bluetooth mostrado neste tutorial.
Abaixo uma ilustrao para realizar gravao de microcontrolador de forma wireless
Bluetooth com tenso de alimentao de 5V.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 43 ]





Figura 31: Bluetooth conectado placa SanUSB 2550.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 44 ]

Figura 32: Ilustrao e Montagem do Circuito de gravao/comunicao wireless
Bluetooth.

Figura 33: Esquema mdulo BLUETOOTH com placa SanUSB 4550.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 45 ]

Deve-se conectar da seguinte forma:

PLACA SANUSB MDULO BLUETOOTH
VCC (+5V) + VCC
GND (0V) - GND
RX TX
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: kit.recomponentes@gmail.com .

Para mais detalhes basta acompanhar os vdeos Gravao sem fio de microcontroladores
http://www.youtube.com/watch?v=_Pbq2eYha_ceGravao sem fio (wireless) de
microcontroladoreshttp://www.youtube.com/watch?v=0PcCQtsO1Bwg via 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
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.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 46 ]


Figura 34: 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 35: 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.
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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 47 ]

Figura 36: 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 a gravao via USB do firmware aplicativo
AdaptadorSerial.hex. Aps a transferncia deste firmware, o microcontrolador est apto
para gravao wireless.

Figura 37: 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
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 48 ]
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 38: 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 em vrios sistemas computacionais como
computadores e smartphones. A desvantagem em relao ao Zigbee a distncia para
gravao/comunicao de microcontroladores mxima de 30 metros.

Cdigo em C para CCS: Comunicar SanUSB com modem Bluetooth
#include <SanUSB_BLUE_R.h>
//com com terminal serial no PC (Zuchi) ou android (BlueTerm)
//Verificar o baud rate do modem, se 9600 ou 19200bps e configurar abaixo
#use rs232(baud=19200, xmit=pin_c6, rcv=pin_c7)

short int pisca=0;
char comando;

#INT_RDA
void recepcao_serial()// Interrupcao serial
{
comando=getc();
switch (comando) //teste da comunicacao serial no Terminal
{
case 'L' : {pisca=0; output_high(pin_B7);printf (" Ligado\r\n");} //LIGA LED/REL
break;
case 'D' : { pisca=0; output_low(pin_B7);printf (" Desligado\r\n");} //DESLIGA
LED/REL
break;
case 'P': { pisca=1;output_high(pin_B7);printf (" pisca-pisca\r\n");} //PISCA B7
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 49 ]
break;
}
}

void main()
{
enable_interrupts(GLOBAL); // Possibilita todas interrupcoes
enable_interrupts(INT_RDA); // Interrupcao da serial

output_toggle(pin_B7);// pisca Led
delay_ms (500);

while(1)
{
if (!input(pin_e3)){reset_cpu();} // pressionar o boto no pino 1 para gravao

while (pisca==1){
output_toggle(pin_B7);delay_ms (300); }//pisca rpido


printf("sanusb\r\n"); //envia de forma sem fio a palavra para o PC ou Android
delay_ms (2000);
}}


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 .



Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 50 ]
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:

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 51 ]
2.7 RGB
O aplicativo BT4 SanUSB Bluetooth voice RGB tem como objetivo controlar as
cores RGB (abreviatura do sistema de cores aditivas formado por Vermelho (Red), Verde
(Green) e Azul (Blue)) de um ambiente via Bluetooth utilizando um celular Android,
podendo realizar a mudana real de cores e brilho de um determinado ambiente de acordo
com a simbologia das cores (significado psicolgico de cada cor), via Bluetooth, por
controle PWM (modulao por largura de pulso) atravs da Ferramenta SanUSB.

O apk pode ser baixado em:
https://play.google.com/store/apps/details?id=appinventor.ai_sandro_juca.BT4SanUSB

Totalmente gratuito, alm de realizar a mudana de cor de um determinado
ambiente ele permite que uma determinada configurao desejada de cor seja salva em
memria permanente do aplicativo, pressionando o boto salvar.
Alm disso, este aplicativo possibilita que o usurio modifique o nome do dispositivo
Bluetooth ligado a ele diretamente do aplicativo, inserindo o nome na caixa de texto e
pressionando o boto enviar Nome BT.

Fundamentao das cores RGB

RGB a abreviatura do sistema de cores aditivas formado por Vermelho (Red),
Verde (Green) e Azul (Blue) ver Figura 39. O propsito principal do sistema RGB a
reproduo de cores em dispositivos eletrnicos como monitores de TV e computador,
"data shows", scanners e cmeras digitais, assim como na fotografia tradicional.
No sistema RGB, cada cor definida pela quantidade de vermelho, verde e azul que a
compem. Por convenincia, a maioria dos arquivos digitais atuais usam nmeros inteiros
entre 0 e 255 para especificar essas quantidades. O nmero 0 indica ausncia de
intensidade e o nmero 255 indica intensidade mxima.


Figura 39: Processo de formao das cores RGB.

Simbologia das Cores

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 52 ]
Existe a crena de que as cores teriam diferentes efeitos psicolgicos sobre as
pessoas. Profissionais, principalmente da rea da publicidade acreditam que cada cor
desperte um efeito psicolgico diferente nas pessoas. Existem cores que se apresentam
como estimulantes, alegres, otimistas, serenas e tranquilas, dentre outras. A ideia central
do controle de cores RGB fazer com que pessoas utilizem uma determinada cor de
acordo com suas necessidades em um determinado ambiente.


Figura 40: Significado de algumas cores.
5.3 Ligando RGB na Placa SanUSB

Fita de LED RGB

A fita RGB possui sadas R, G e B que devem ser ligadas nas portas B0, B1 e B2 do
microcontrolador, elas que vo ser responsveis por mandar o sinal PWM para a mudana
de cor, quando for solicitado pelo aplicativo do celular, a figura abaixo ilustra o desenho
desse circuito que tambm deve ter 3 transistores e 3 resistores em srie com as sadas
RGB.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 53 ]

Figura 41: Ligao completa do circuito RGB e SanUSB.


LED RGB Catodo Comum
Identifique com um multmetro as cores de cada pino do LED RGB. Como no
exemplo abaixo, para um LED RGB catodo comum, tem-se um terminal negativo (GND
ou - ) e os demais representam as 3 cores: Red, Green, Blue.


Figura 42: Pinos Led RGB catodo comum.
LED RGB PLACA SanUSB
R - Vermelho Pino b2
G - Verde Pino b1
B - Azul Pino b0

O Compilador
Foi escrito um cdigo em linguagem de programao C, que ser gravado no
microcontrolador, para que ele possa receber o sinal do modem Bluetooth, manipulando as
portas B0, B1 e B2, que esto conectadas ao circuito RGB, ento o microcontrolador
recebe o sinal PWM e o transforma em uma determinada cor, o compilador a ser usado
MPLABX IDE que um software para desenvolver aplicaes para microcontroladores da
Microchip e controladores de sinal digital.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 54 ]
Baixe neste link o cdigo em .hex a ser gravado no PIC:
https://dl.dropboxusercontent.com/u/41097376/SanUSB/0Bluetooth_CCSBT4.hex

O Aplicativo

O aplicativo a ser usado no projeto ser o BT4SanUSB, que um aplicativo gratuito
que pode ser baixado livremente na internet, um aplicativo Android para comunicao
com modem Bluetooth slave HC-04 ou HC-06. Este aplicativo realiza tambm a mudana
de cores e brilho, via Bluetooth, por controle PWM de fita/LED RGB conectado ao PIC e
permite que uma determinada configurao desejada de cor seja salva em memria
permanente do aplicativo, pressionando o boto salvar.
Este aplicativo capaz tambm de ligar leds ou aparelhos por comando de voz. O
comando de voz pode ser gravado na memria permanente do aplicativo pressionando o
boto correspondente por dois segundos.



Figura 43: O aplicativo BT4SanUSB - RGB.
A aplicao

Aps a montagem de todo o circuito, o celular deve enviar o sinal do aplicativo para
o microcontrolador atravs do modem bluetooth, que por sua vez se comunica com a fita
RGB atravs das portas B0, B1 e B2, a figura abaixo ilustra bem esse processo.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 55 ]


Figura 44: A aplicao do projeto Bluetooth, Android e RGB.

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 I
2
C, 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 45: Comunicao PIC com PC e via I
2
C.
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
MHz via USB, depois para perifricos como um relgio RTC ou para a memria EEPROM
em 4 MHz via I
2
C e vice-versa.

2.9 EMULAO DE COMUNICAO SERIAL NO WINDOWS
Neste tpico mostrado um mtodo de comunicao serial bidirecional atravs do
canal USB do PIC18F2550. Uma das formas mais simples, atravs do protocolo
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 56 ]
Communications Devices Class (CDC), que emula uma porta COM RS-232 virtual, atravs
do canal USB 2.0. Dessa forma, possvel se comunicar com caracteres ASCII via USB
atravs de qualquer software monitor serial RS-232 como o HyperTerminal, o SIOW do
CCS Compiler ou o ambiente de programao Delphi. O driver CDC instalado no PC 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 biblioteca CDC para o programa.c do microcontrolador est dentro da pasta de
exemplos, a qual deve estar na mesma pasta onde est o programa.c a ser compilado
para a emulao da comunicao serial RS-232. Alm disso, o programa.c deve inserir a
biblioteca usb_san_cdc.h, como mostra a o exemplo de leitura e escrita em um buffer da
EEPROM interna do microcontrolador. As funes CDC mais utilizadas contidas na
biblioteca usb_san_cdc.h para comunicao com a COM virtual so:

usb_cdc_putc() o microcontrolador envia caracteres ASCII emulados via USB.
Ex.: printf(usb_cdc_putc, "\r\nEndereco para escrever: ");
usb_cdc_getc() retm um caractere ASCII emulado pela USB.
Ex.: dado = usb_cdc_getc(); //retm um caractere na varivel dado
gethex_usb() retm um nmero hexadecimal digitado no teclado.
Ex.: valor = gethex_usb();//retm um nmero hexadecimal na varivel valor

usb_cdc_kbhit( ) Avisa com TRUE (1) se acabou de chegar um novo caractere no buffer
de recepo USB do PIC.
Ex.: if (usb_cdc_kbhit()) {dado = usb_cdc_getc();}

O exemplo abaixo mostra a leitura e escrita em um buffer da EEPROM interna do
microcontrolador com emulao da serial atravs da USB:
#include <SanUSB.h>

#include <usb_san_cdc.h>// Biblioteca para comunicao serial

BYTE i, j, endereco, valor;
boolean led;

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

output_high(pin_b7); // Sinaliza comunicao USB Ok

while (1) {
printf(usb_cdc_putc, "\r\n\nEEPROM:\r\n"); // Display contm os primeiros 64
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 57 ]
bytes em hex
for(i=0; i<=3; ++i) {
for(j=0; j<=15; ++j) {
printf(usb_cdc_putc, "%2x ", read_eeprom( i*16+j ) );
}
printf(usb_cdc_putc, "\n\r");
}

printf(usb_cdc_putc, "\r\nEndereco para escrever: ");
endereco = gethex_usb();
printf(usb_cdc_putc, "\r\nNovo valor: ");
valor = gethex_usb();

write_eeprom( endereco, valor );
led = !led; // inverte o led de teste
output_bit (pin_b7,led);
}}


Aps gravao de um programa que utilize comunicao serial CDC no microcontrolador
pelo SanUSB e resetar o microcontrolador, v, se for o Windows 7, em propriedades do
sistema -> Configuraes avanadas do sistema -> Hardware -> Gerenciador de
dispositivos e clique com boto direito no driver CDC do microcontrolador e atualizar
Driver, apontando para a pasta DriverCDCwinSerial.
No Windows@ XP,aps a gravao de um programa que utilize comunicao serial CDC
no microcontrolador pelo SanUSB e resetar o microcontrolador, o sistema vai pedir a
instalao do driver CDC (somente na primeira vez).



Figura 46: Instalao do driver CDC (1).
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 58 ]
Escolha a opo Instalar de uma lista ou local especifico (avanado). Aps Avanar,
selecione a opo Incluir este local na pesquisa e selecione a pasta DriverSanWinCDC,
onde est o driver CDC.

Figura 47: Instalao do driver CDC (2).

Aps Avanar, clique em Continuar assim mesmo.


Figura 48: Instalao do driver CDC (3).

Aguarde enquanto o Driver CDC instalado no Windows@.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 59 ]

Figura 49: Instalao do driver CDC (4).

Clique em Concluir para terminar a instalao.

Figura 50: Instalao do driver CDC (5).

V em painel de controle -> sistema -> Hardware -> Gerenciador de dispositivos ->
Portas (COM & LPT) e confira qual a porta COM virtual instalada.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 60 ]

Figura 51: Verificao de porta COM instalada.
Abrindo qualquer programa monitor de porta serial RS-232, como o SIOW do CCS
ou o Java-SanUSB, direcionando para a COM virtual instalada (COM3,COM4,COM5,etc.).
No CCS clique em Tools-> Serial port Monitor -> configuration -> set port options para que
o computador entre em contato com o PIC atravs da emulao serial via USB.



Figura 52: Utilizao da porta COM pelo CCS.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 61 ]
Para utilizar uma funo que necessite de atendimento imediato quando um
caractere for digitado como, por exemplo o caractere L ou D, necessrio inserir no
firmware do microcontrolador a condio para verificar de forma constante e reter o
caractere emulado que chegou pela USB S (SB_cdc_kbhit( )) {dado=usb_cdc_getc();}
no lao infinito da funo principal. O comando (SB_cdc_kbhit( )) evita que o programa
fique parado no usb_cdc_getc (que fica esperando um caractere para prosseguir o
programa). Veja o programa abaixo, que pisca um led na funo principal (pino B6) e
comanda o estado de outro led (pino B7) pelo teclado de um PC via USB:
#include <SanUSB.h>
#include <usb_san_cdc.h>// Biblioteca para comunicao serial virtual

BYTE comando;

void main() {
clock_int_4MHz();//Funo necessria para habilitar o dual clock (48MHz para USB e
4MHz para CPU)
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com USB do PC

while (TRUE)
{
if (usb_cdc_kbhit( )) //avisa se chegou dados do PC
{ //verifica se tem um novo byte no buffer de recepo, depois o kbhit zerado para
prximo byte
comando=usb_cdc_getc(); //se chegou, retm o caractere e compara com L ou D em
ASCII

if (comando==L) {output_high(pin_b7); printf(usb_cdc_putc, \r\nLed Ligado\r\n);}
if (comando==D) {output_low(pin_b7); printf(usb_cdc_putc, \r\nLed Desligado\r\n);}
}
output_high(pin_B6); // Pisca Led na funo principal
delay_ms(500);
output_low(pin_B6);
delay_ms(500);
} }



Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 62 ]


Figura 53: Visualizao de textos via serial emulada.
Para utilizar o programa de comunicao Java-SanUSB para emulao serial virtual
entre o computador e o microcontrolador, necessrio baix-lo atravs do link disponvel
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.

Figura 54: Interface em Java de comunicao serial.
2.10 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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 63 ]
Se voc j tem o Java instalado (JRE ou SDK) baixe o instalador automtico.deb
atualizado disponvel no link:
http://www.4shared.com/file/RN4xpF_T/sanusb_Linux.html
contido tambm na pasta geral
http://www.4shared.com/file/sIZwBP4r/100727SanUSB.html.
Se ainda no tem o Java (JRE ou SDK), baixe o instalador SanUSB, j configurado
com o Java JRE e disponvel em:
http://www.4shared.com/file/3mhWZS5g/sanusb.html .
A figura abaixo mostra a interface grfica desenvolvida para gravao direta de
microcontroladores via USB:


Figura 55: 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, disponvel na pasta
SanUSB ou em http://www.4shared.com/file/HGrf9nDz/Gerenciador.html .
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 64 ]
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.11 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,
instale o sanusb.deb disponvel 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:

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 65 ]


Figura 56: 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

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.12 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
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 66 ]
interface I
2
C, 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 57: Comunicao PIC com PC e via I
2
C.
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 I
2
C e vice-versa.

2.13 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
durante a execuo real do programa. Dessa forma, o programador pode encontrar
possveis erros na programao do firmware.
A biblioteca CDC (#include <usb_san_cdc.h>) est dentro da mesma pasta de
ExemploseBibliotecas. Para a compilao de um programa aplicativo com emulao serial,
como o exemplo_emulSerial.c, a biblioteca CDC(#include <usb_san_cdc.h>) deve estar
na mesma pasta do programa exemplo_emulSerial.c a ser compilado ou dentro da pasta
instalada do compilador (C:\Arquivos de programas\PICC\Drivers). O programa
exemplo_emulSerial.c abaixo, contido na pasta ExemploseBilbliotecas, pisca um led no
pino B6 na funo principal e comanda, via USB atravs emulao serial, o estado de
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 67 ]
outro led no pino B7 com as teclas L e D do teclado de um PC. As funes CDC mais
utilizadas para comunicao com a COM virtual so:

usb_cdc_putc() o microcontrolador envia caracteres ASCII emulados via USB.
Ex.: printf(usb_cdc_putc, "\r\nEndereco para escrever: ");

usb_cdc_getc() retm um caractere ASCII emulado pela USB.
Ex.: dado = usb_cdc_getc(); //retm um caractere na varivel dado
gethex_usb() retm um nmero hexadecimal digitado no teclado.

Ex.: valor = gethex_usb();//retm um nmero hexadecimal na varivel valor

usb_cdc_kbhit( ) Avisa com TRUE (1) se acabou de chegar um novo caractere no buffer
de recepo USB do PIC.

Ex.: if (usb_cdc_kbhit( )) {dado = usb_cdc_getc();}

Outras funes do protocolo so:

get_string_usb(char *s, int max): Recebe uma string;
usb_attach(): Re-conecta o dispositivo, deve ser usada para re-conect-lo quando o
dispositivo foi desconectado, mas ainda noremovido literalmente;
usb_detach(): Desconecta o dispositivo. Deve ser usada antes de sua remoo fsica do
computador;
usb_enumerated(): Verifica se o dispositivo est pronto para a comunicao.

#include <SanUSB.h>
#include <usb_san_cdc.h>// Biblioteca para comunicao serial virtual via USB

BYTE comando;

main() {
clock_int_4MHz();//Funo necessria para habilitar o dual clock (48MHz para USB e
4MHz para CPU)
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com USB do PC
while (TRUE)
{
if (usb_cdc_kbhit( )) //avisa se chegou dados do PC
{ //verifica se tem um novo byte no buffer de recepo, depois o kbhit zerado para
prximo byte
comando=usb_cdc_getc(); //se chegou, retm o caractere e compara com 'L' ou 'D' em
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 68 ]
ASCII

if (comando=='L') {output_high(pin_b7); printf(usb_cdc_putc, "\r\nLed Ligado!\r\n");}
if (comando=='D') {output_low(pin_b7); printf(usb_cdc_putc, "\r\nLed Desigado!\r\n");}
}
output_high(pin_B6); // Pisca Led na funo principal
delay_ms(300);
output_low(pin_B6);
delay_ms(300);
} }



Este firmware realiza a comunicao serial virtual com o protocolo CDC inserido no
firmware do microcontrolador atravs da biblioteca usb_san_cdc.h. Este protocolo padro
no sistema operacional Linux.
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 58: CuteCOM.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 69 ]
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 disponvel
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.

Figura 59: Interface de comunicao serial em Java para LINUX.

2.14 PROGRAMA COM INTERRUPO EXTERNA POR BOTO E DO TIMER 1
#include <SanUSB.h>

BYTE 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());
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 70 ]
}

#int_ext //boto no pino b0 ver Figura da prxima pgina
void bot_ext()
{
for(x=0;x<5;x++) // pisca 5 vezes aps o pino ser aterrado (boto pressionado)
{
output_high(pin_B5); // Pisca Led em B5
delay_ms(1000);
output_low(pin_B5);
delay_ms(1000);
}}

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

while (1){
output_high(pin_B6); // Pisca Led na funo principal
delay_ms(500);
output_low(pin_B6);
delay_ms(500);
}}


Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 71 ]

Figura 60: Esquema boes b0 b1.

Figura 61: Botes b0 b1 em protoboard.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 72 ]

Figura 62: Botes b0 b1 com placa SanUSB.
Aps a prtica ser efetuada com sucesso, solicita-se 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 em C para CCS:
#include <SanUSB.h>//BIBLIOTECA DE INSTRUES

main()//PROGRAMA PRINCIPAL
{
clock_int_4Mhz();
while (1)//LAO INFINITO
{
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo, reseta //e
entra em estado de gravao
if (input(pin_b0)==0)// SE BOTO NO PINO B0 FOR ATERRADO
while(input(pin_b1)==1){
{

output_toggle(pin_b7);// LIGA LED NO PINO B7
delay_ms(500);
}
}
if (input(pin_b1)==0)// SE BOTO NO PINO B1 FOR ATERRADO
while(input(pin_b0)==1){
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 73 ]
{

output_toggle(pin_b7);
delay_ms(100);
} } }}

Pode-se trabalhar tambm com 3 LEDs (pinos b7, b6 e b5) piscando, de acordo com o
programa abaixo em C para CCS:
#include <SanUSB.h>//BIBLIOTECA DE INSTRUES

main()//PROGRAMA PRINCIPAL
{
clock_int_4Mhz();
while (1)//LAO INFINITO
{
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo, reseta
//e entra em estado de gravao
if (input(pin_b0)==0)// SE BOTO NO PINO B0 FOR ATERRADO
while(input(pin_b1)==1){
{

output_high(pin_b7);// LIGA LED NO PINO B7
delay_ms(500);
output_low(pin_b7);// LIGA LED NO PINO B7
delay_ms(500);

output_high(pin_b6);// LIGA LED NO PINO B7
delay_ms(500);
output_low(pin_b6);// LIGA LED NO PINO B7
delay_ms(500);

output_high(pin_b5);// LIGA LED NO PINO B7
delay_ms(500);
output_low(pin_b5);// LIGA LED NO PINO B7
delay_ms(500);
} }

if (input(pin_b1)==0)// SE BOTO NO PINO B1 FOR ATERRADO
while(input(pin_b0)==1){
{

output_high(pin_b7);// LIGA LED NO PINO B7
delay_ms(50);
output_low(pin_b7);// LIGA LED NO PINO B7
delay_ms(50);

output_high(pin_b6);// LIGA LED NO PINO B7
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 74 ]
delay_ms(50);
output_low(pin_b6);// LIGA LED NO PINO B7
delay_ms(50);

output_high(pin_b5);// LIGA LED NO PINO B7
delay_ms(50);
output_low(pin_b5);// LIGA LED NO PINO B7
delay_ms(50);
} } } }

2.15 DESAFIO: SEMFORO COM BOTO PARA PEDESTRE

Nesta prtica, o aluno deve utilizar os conceitos da prtica PISCA LED e de BOTES aprendidos
nas aulas anteriores.

Para exercitar a juno dos dois programas, este novo exerccio ser desenvolver um semforo com
boto para pedestre.

Para isso ser necessrio 5 LEDs e 1 boto, ou seja, sero 5 sadas e 1 entrada. A tabela a seguir
sugere pinos para conectar os LEDs e o boto.





Sadas

Pino b7


SEMFORO CARROS
LED VERMELHO

Pino b6
LED AMARELO

Pino b5
LED VERDE
Pino a1
SEMFORO PEDESTRES
LED VERMELHO
Pino a0 LED VERDE
Entrada Pino b0 BOTO PEDESTRE



Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 75 ]

Figura 63: Esquemtico Semforo com boto para pedestre.
A foto a seguir aplica o semforo dos carros com 3 LEDs, dos pedestres com 2 LEDs e um boto.

Figura 64: Semforo com boto e semforo para pedestre com SanUSB em
protoboard.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 76 ]
O programa abaixo em C para CCS funciona da seguinte forma:

O Semforo dos carros permanece em verde e o dos pedestres em vermelho at que o pedestre
pressione o boto. Aps isto, o semforo dos carros fica amarelo, em seguida vai para vermelho, s
ento libera para o pedestre, acendendo o LED verde do semforo dos pedestres. Aps o tempo
programado, o ciclo reinicia e aguarda que o boto seja pressionado novamente. Grave o cdigo
abaixo no PIC e verifique o funcionamento.

#include <SanUSB.h>//BIBLIOTECA DE INSTRUES

main()//PROGRAMA PRINCIPAL
{
clock_int_4Mhz();
while (1)//LAO INFINITO
{
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo, reseta
//e entra em estado de gravao
output_high(pin_b5);// LIGA LED NO PINO B7 - VERDE CARROS
output_high(pin_a1);// LIGA LED NO PINO A1 - VERMELHO PEDESTRE

if (input(pin_b0)==0)// SE BOTO NO PINO B0 FOR ATERRADO
{
output_low(pin_b5);// DESLIGA LED NO PINO B5 - VERDE CARROS

output_high(pin_b6);// LIGA LED NO PINO B6 - AMARELO CARROS
delay_ms(2000); //AGUARDA 2 SEGUNDOS
output_low(pin_b6);// LIGA LED NO PINO B6 - AMARELO CARROS

output_high(pin_b7);// LIGA LED NO PINO B7 - VERMELHO CARROS
delay_ms(1000);

output_low(pin_a1);// DESLIGA LED NO PINO A1 - VERMELHO PEDESTRE
output_high(pin_a0);// LIGA LED NO PINO A0 - VERDE PEDESTRE
delay_ms(4000);
output_low(pin_a0);// DESLIGA LED NO PINO A0 - VERMELHO PEDESTRE
output_low(pin_b7);// LIGA LED NO PINO B7 - VERMELHO CARROS
} }}

O cdigo abaixo mantm o LED do pedestre piscando por 8 vezes antes de abrir para os carros, no
intuito de avisar o pedestre que resta pouco tempo para este atravessar a rua.
Programa em C para CCS:

#include <SanUSB.h>//BIBLIOTECA DE INSTRUES

int x=0;

main()//PROGRAMA PRINCIPAL
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 77 ]
{
clock_int_4Mhz();
while (1)//LAO INFINITO
{
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo, reseta
//e entra em estado de gravao
output_high(pin_b5);// LIGA LED NO PINO B7 - VERDE CARROS
output_high(pin_a1);// LIGA LED NO PINO A1 - VERMELHO PEDESTRE

if (input(pin_b0)==0)// SE BOTO NO PINO B0 FOR ATERRADO
{
output_low(pin_b5);// DESLIGA LED NO PINO B5 - VERDE CARROS

output_high(pin_b6);// LIGA LED NO PINO B6 - AMARELO CARROS
delay_ms(2000); //AGUARDA 2 SEGUNDOS
output_low(pin_b6);// LIGA LED NO PINO B6 - AMARELO CARROS

output_high(pin_b7);// LIGA LED NO PINO B7 - VERMELHO CARROS
delay_ms(1000);

output_low(pin_a1);// DESLIGA LED NO PINO A1 - VERMELHO PEDESTRE
output_high(pin_a0);// LIGA LED NO PINO A0 - VERDE PEDESTRE
delay_ms(4000);
output_low(pin_a0);// LIGA LED NO PINO A0 - VERDE PEDESTRE

for (x=0;x<8;x++)
{
output_toggle(pin_a1);
delay_ms(500);
}
output_low(pin_a0);// DESLIGA LED NO PINO A0 - VERDE PEDESTRE
output_low(pin_b7);// LIGA LED NO PINO B7 - VERMELHO CARROS
} }}


3. BUZZER

Para inserir uma sirene, ou seja, um buzzer, basta seguir o esquema a seguir. Lembrando
que sem transistor, como o PIC no fornece corrente suficiente, deve-se enviar o comando
LOW/BAIXO para acionar o buzzer e HIGH/ALTO para desacionar.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 78 ]

Figura 65: Buzzer com placa SanUSB.

Num tpico a seguir o BUZZER ser trabalhado juntamente com rel e um driver de
potncia, assim, pode-se utilizar a mesma sequncia do pisca LED: HIGH/ALTO liga o
buzzer e LOW/BAIXO desliga o buzzer.


4. OBTENO DE UM VOLTMETRO ATRAVS DO CONVERSOR AD
COM A VARIAO DE UM POTENCIMETRO
#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() {
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);
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 79 ]

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

output_high(pin_b7);
delay_ms(500);
output_low(pin_b7);
delay_ms(500); }}



Figura 66: 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
disponvel em TTP://www.4shared.com/document/Qst_pem-/100923Apostila_CPIC.html .



5. 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.


Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 80 ]
Figura 67: Circuito COM84 para gravao do gerenciador.hex

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

Figura 68: 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,
disponvel em http://www.4shared.com/get/1uP85Xru/winpicprCOM84.html.



Figura 69: Tela de configurao do software de gravao.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 81 ]
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 70: Tela de confirmao de reconhecimento do circuito.
6. PERIFRICOS INTERNOS DO MICROCONTROLADOR
6.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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 82 ]

Figura 71: 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/(2
10
- 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/(2
8
- 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..



Figura 72: Uso de perifricos no conversor A/D.

Para utilizar este perifrico interno, basta:

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 83 ]
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
delay_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

6.2 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 (V
FS
) tenso de referencia do conversor (V
REF
). 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.



6.3 AJUSTE DA TENSO DE FUNDO DE ESCALA COM AMPOP
Para conversores AD de 8 bits e V
REF
de 5V, a resoluo mxima de 19,6mV (R=
V
REF
/ (2
n
-1). Dessa forma, como a Resoluo do sensor 10mV/C (R
S
), 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 (V
FS
)
est relacionada Temperatura Mxima desejada de medio (T
MAX
), onde V
FS
=
R
S
(10mV/C) * T
MAX
e o Ganho (G) de aproximao da tenso de fundo de escala (V
FS
)
tenso de referencia (V
REF
) dado por G = V
REF
/ V
FS
, ou seja, para uma Temperatura
Mxima desejada de 100C, o ganho deve ser aproximadamente 5.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 84 ]


Figura 73: AMP-OP no inversor.

A aproximao da tenso de fundo de escala (V
FS
) tenso de referencia (V
REF
)
realizada para diminuir a relevncia de rudos em determinadas faixas de temperatura.

6.4 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 (V
REF
) tenso de fundo de
escala (V
FS
) atravs da diminuio da tenso de referncia (V
REF
) com o uso de um
potencimetro (divisor de tenso). Por exemplo, um conversor AD de 8 bits com uma
tenso de referncia (V
REF
) de 2,55V no pino A3, apresenta uma resoluo de 10mV por bit
(2,55/(2
8
-1)), ou seja, a mesma sensibilidade do sensor LM35 de 10mV/C . Percebe
variao de cada C.

6.5 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 DIGITAL
5V = 5000mV -> 1023
T(C)* 10mV/C -> (int32)read_adc()

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

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 85 ]
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
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.

6.6 OBTENO DE UM VOLTMETRO ATRAVS DO CONVERSOR AD COM A
VARIAO DE UM POTENCIMETRO
#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() {
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
delay_ms(10); // tensao read_adc()
tensao= (5000*(int32)read_adc())/1023;
printf (usb_cdc_putc,"\r\nA tensao e' = %lu C\r\n",tensao); // Imprime pela serial virtual

output_high(pin_b7);
delay_ms(500);
output_low(pin_b7);
delay_ms(500); }}




Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 86 ]


Figura 74: Conexo do potencimetro no conversor A/D.
6.7 LEITURA DE TEMPERATURA COM O LM35 ATRAVS DO CONVERSOR AD


Figura 75:Esquema LM35.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 87 ]

Figura 76: LM35 com placa SanUSB.

Figura 77: LM35 em protoboard.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 88 ]
#include <SanUSB.h>
#include <usb_san_cdc.h>// Biblioteca para comunicao serial virtual
int16 temperatura;

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(NA0); //Habilita entrada analgica A0
setup_adc(ADC_CLOCK_INTERNAL);

while(1){
set_adc_channel(0);
delay_ms(10);
temperatura=430*read_adc()/1023; //Vref = 4,3V devido queda no diodo, ento
//(430*temp)
printf (usb_cdc_putc,\r\nTemperatura do LM35 = %lu C\r\n,temperatura);

output_high(pin_b7); // Pisca Led em operao normal
delay_ms(500);
output_low(pin_b7);
delay_ms(500); }}






Figura 78: Leitura de temperatura via monitor serial.
6.8 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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 89 ]

Figura 79: Conexo do termistor.
Convm lembrar que a resposta de um termistor no linear, como mostra a figura abaixo.



Figura 80: Resposta do termistor.

6.9 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 R
25C
escolhida for igual ao da resistncia do termistor na temperatura
ambiente (25
0
C), ento a regio de tenso linear ser simtrica em torno da temperatura
ambiente (como visto em figura abaixo).

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 90 ]



Figura 81: Linearizao do termistor.

7. MEMRIAS DO MICROCONTROLADOR

O microcontrolador apresenta diversos tipos de memria, entre elas:

7.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.

7.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.

7.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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 91 ]
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=read_eeprom (posicao);. O projeto de controlde de acesso
com teclado matricial abaixo mostra o uso desta memria.
7.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 endereo com a diretiva #byte que funciona para apontar uma posio de
memria (#byte OSCCON=0XFD3 -> OSCCON=0B01100110; //Configura oscilador interno
para 4MHz) ou por funes proprietrias do compilador (setup_timer_1 (T1_INTERNAL |
T1_DIV_BY_8); set_timer1(3036); // configura o timer 1 com clock interno e dividido por 8
para contar 62500 = 65536-3036 Tempo total = 62500 x 8us = 0,5 segundos).



Figura 82: Registros de funes especiais.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 92 ]
7.5 EXEMPLO DE APLICAO: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.





Figura 83: 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
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 93 ]
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 84: 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.

7.6 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):

/////////////////////////////////////////////////////////////////////////
///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 <SanUSB.h>
#include <usb_san_cdc.h>// Biblioteca para comunicao serial

char caract,tecla0,tecla1,tecla2,tecla3;
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 94 ]
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
}}
//////////////////////////////////////////////////////////////////////////////////
main() {
clock_int_4MHz();
port_b_pullups(true);
usb_cdc_init(); // Inicializa o protocolo CDC
usb_init(); // Inicializa o protocolo USB
usb_task(); // Une o perifrico com a usb do PC

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(read_eeprom(239)>0 && read_eeprom(239)<40) {k=read_eeprom(239);} // Carrega a
tima posio livre da eeprom (k) antes do reset armazenada em 239

while (1)
{
// Reconhecimento de tecla por varredura
output_low(pin_b0);output_high(pin_b1);output_high(pin_b2);
if(input(pin_b3)==0) {*p='1'; flag=1; while(input(pin_b3)==0);delay_ms(200);}
if(input(pin_b4)==0) {*p='4'; flag=1; while(input(pin_b4)==0);delay_ms(200);}
if(input(pin_b5)==0) {*p='7'; flag=1; while(input(pin_b5)==0);delay_ms(200);}
if(input(pin_b6)==0) {*p='*'; flag=1; while(input(pin_b6)==0);delay_ms(200);}

output_high(pin_b0);output_low(pin_b1);output_high(pin_b2);
if(input(pin_b3)==0) {*p='2'; flag=1; while(input(pin_b3)==0);delay_ms(200);}
if(input(pin_b4)==0) {*p='5'; flag=1; while(input(pin_b4)==0);delay_ms(200);}
if(input(pin_b5)==0) {*p='8'; flag=1; while(input(pin_b5)==0);delay_ms(200);}
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 95 ]
if(input(pin_b6)==0) {*p='0'; flag=1; while(input(pin_b6)==0);delay_ms(200);}

output_high(pin_b0);output_high(pin_b1);output_low(pin_b2);
if(input(pin_b3)==0) {*p='3'; flag=1; while(input(pin_b3)==0);delay_ms(200);}
if(input(pin_b4)==0) {*p='6'; flag=1; while(input(pin_b4)==0);delay_ms(200);}
if(input(pin_b5)==0) {*p='9'; flag=1; while(input(pin_b5)==0);delay_ms(200);}
if(input(pin_b6)==0) {*p='!'; flag=1; while(input(pin_b6)==0);delay_ms(200);}

// 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 (usb_cdc_putc,"\r\nValor das teclas digitadas: %c %c %c
%c\r\n",tecla0,tecla1,tecla2,tecla3);
printf (usb_cdc_putc,"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
output_high(pin_c0);printf (usb_cdc_putc,"\r\nSenha Mestre!\r\n");delay_ms(1000);
output_low(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 (usb_cdc_putc,"\r\nSenha armazenada\r\n");

write_eeprom( 239, k); printf(usb_cdc_putc,"proximo k=%u\r\n",k);//Guarda a tima
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 96 ]
//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(usb_cdc_putc,"%2x ", read_eeprom(i*40+j) );}//Leitura da
eeprom interna

printf(usb_cdc_putc,"\r\n");
}
}
//************************************************************************
// Compara conjunto de teclas pressionadas com senhas armazenadas na eeprom
if (flag2==1) {
for(n=0;n<=k;n++)
{
if (tecla0==read_eeprom(4*n) && tecla1==read_eeprom(4*n+1) &&
tecla2==read_eeprom(4*n+2)&& tecla3==read_eeprom(4*n+3))
{ output_high(pin_c0); printf (usb_cdc_putc,"\r\nAbre a porta!\r\n");delay_ms(3000);
output_low(pin_c0);} } }// abre a porta
//************************************************************************

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);
delay_ms(100); }}
valor = read_adc(); // efetua a leitura da converso A/D e guarda na varivel valor



7.7 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
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 97 ]
saturao do transistor e, consequentemente, menor a tenso lado da carga, resultante do
chaveamento.
O perodo T
0
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 nvel lgico alto.


Figura 85: 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 (T
0
)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.


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


Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 98 ]
8. 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 86: 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 <SanUSB.h>

#define motor pin_b7
#define led pin_b0

unsigned int ton,toff,incton,inctoff,guardaton,guardatoff;
int1 flag1, flag2;

main() {
clock_int_4MHz();

port_b_pullups(true);
incton=2; inctoff=18; //Perodo de 20ms - Passo mnimo de tempo = 1ms (5% (1/20) do
duty cicle )

guardaton=read_eeprom(10);guardatoff=read_eeprom(11);
if (guardaton>0 && guardaton<=20) {incton=guardaton; inctoff=guardatoff;}

while (1) {
ton=incton; toff=inctoff;

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 99 ]
if (!input(pin_b1)) {flag1=1;}
if (incton<20 && flag1==1 && input(pin_b1) ) {flag1=0;++incton;--
inctoff;output_high(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;output_low(led);
write_eeprom(10,incton);write_eeprom(11,inctoff);
}
output_high(motor);
while(ton) {--ton;delay_ms(1); } //Parte alta da onda quadrada

output_low(motor);
while(toff) {--toff;delay_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 87: PWM com Mosfet.
9. INTERRUPES E TEMPORIZADORES

9.1 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
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 100 ]
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 o 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.

9.2 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 <SanUSB.h>

BYTE comando;

short int led;
int x;

#int_timer1
void trata_t1 ()
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 101 ]
{
led = !led; // inverte o led - pisca a cada 0,5 seg.
output_bit (pin_b7,led);
set_timer1(3036 + get_timer1());
}

#int_ext// boto no pino b0
void bot_ext()
{//seu programa....o que voc quer que acontece na interrupo externa?
for(x=0;x<5;x++) // pisca 5 vezes aps o pino ser aterrado (boto pressionado)
{
output_high(pin_B5); // Pisca Led em B5
delay_ms(1000);
output_low(pin_B5);
delay_ms(1000);
}
}

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) }



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 nvel lgico do pino quando o mesmo for
liberado evitando outra interrupo, pois o processador entende tristate e nveis
intermedirios de tenso como nvel lgico baixo.

9.3 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 (2
16
) 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).
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 102 ]
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 <SanUSB.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
}
}
main(){
clock_int_4MHz();

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_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
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 103 ]

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){ //Funo principal pisca led em b5
output_high(pin_b5);
delay_ms(500);
output_low(pin_b5);
delay_ms(500);
}
}

9.4 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 <SanUSB.h>

#byte port_b = 0xf81//Atribuio do nome portb para o registro da porta B localizado na
//posio 0xf81
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 ()
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 104 ]
{
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: {
output_high(pin_a0); //pin_a0 aciona transistor do comum das dezenas
output_low(pin_a1); //pin_a3 aciona transistor do comum das unidades
port_b = setseg[dezena]; //A porta B recebe o desenho do nmero das dezenas
//apontado pela varivel dezena
flag=1; break;}

case 1: {
output_high(pin_a1); //selecionei a unidade
output_low(pin_a0);
port_b = setseg[unidade]; //A porta B recebe o desenho do nmero das unidades
//apontado pela varivel unidade
flag=0; break;}
}

set_timer1(55536 + get_timer1());
}

main(){
clock_int_4MHz();
set_tris_b(0b00000000);// 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){ //Funo principal
output_high(pin_a5);
delay_ms(300);
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 105 ]
output_low(pin_a5);
delay_ms(300);
}
}


10. 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.
10.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 COMANDO
&& Operao E (AND)
ll Operao OU (OR)
! 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.

10.2 INSTRUES LGICAS BOOLANAS BIT A BIT
Considere as portas lgicas abaixo:
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 106 ]

Figura 88: 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
LITERAL
EXPRESSO BOOLEANA
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=
S= !A
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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 107 ]

Figura 89: Uso de resistores de pull down para aplicar funo lgica 0/1.
importante salientar que atravs das operaes bsicas E, OU, NO e OU-
Exclusivo 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 90: 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 <SanUSB.h> // Emulao de circuitos lgicos booleanos (OU-Exclusivo)
short int A, B, saida, ledpisca;

main(){
clock_int_4MHz();

while (TRUE)
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 108 ]
{
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 A e B
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
delay_ms(500);
}}




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


Figura 91: Exemplo de circuito combinacional (1).

O programa para emular de forma real esse circuito mostrado abaixo:
#include <SanUSB.h> // Emulao de circuitos lgicos booleanos
short int A, B, C, saida, ledpisca;

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

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 109 ]
ledpisca=!ledpisca; // ledpisca igual ao inverso de ledpisca
output_bit(pin_b0,ledpisca); // b0 recebe o valor de ledpisca
delay_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:

ENTRADAS SAIDA
A B C S
0 0 0 1
0 0 1 0
0 1 0 0
0 1 1 0
1 0 0 1
1 0 1 0
1 1 0 1
1 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 92: Exemplo de circuito combinacional (2).
#include <SanUSB.h> // Emulao de circuitos lgicos booleanos
short int A, B, C, D, saida, ledpisca;

main(){
clock_int_4MHz();

while (TRUE)
{
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 110 ]
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
delay_ms(500);
}}

A tabela verdade deste circuito lgico mostrada abaixo:

ENTRADAS SAIDA
A B C D S
0 0 0 0 1
0 0 0 1 1
0 0 1 0 1
0 0 1 1 0
0 1 0 0 1
0 1 0 1 1
0 1 1 0 1
0 1 1 1 0
1 0 0 0 1
1 0 0 1 1
1 0 1 0 1
1 0 1 1 0
1 1 0 0 1
1 1 0 1 1
1 1 1 0 1
1 1 1 1 1
A tabela verdade pode ser facilmente comprovada de forma real montando o circuito
proposto.
10.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 necessita-
se 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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 111 ]










Figura 93: Display de 7 segmentos.
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.
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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 112 ]
CI - 9317
Entradas Sadas
Desenho
/LT /RBI A0 A1 A2 A3 a b c d e f g ponto
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 segmento acendo com 0 - zero)
NMERO
DISPLAY
B6 B5 B4 B3 B2 B1 B0 Porta B
Hexadecim
al
g f e d c b a
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 <SanUSB.h>
#byte port_b = 0xf81//Atribuio do nome portb para o registro da porta B localizado na
//posio 0xf81 da memria de dados
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 113 ]

int setseg[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //Vetor com 10
//elementos que desenham de 0 a 9
int i; //ndice i (ponteiro)

void main ()
{
clock_int_4MHz();
set_tris_b(0b00000000);// Define os pinos da porta B como sada

while(1)
{
for (i=0;i<10;i++)
{
port_b = setseg[i];
delay_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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 114 ]

Figura 94: 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.

Entradas Pin_b0 Pin_b1 Pin_b2 Pin_b3 Pin_b4 Pin_b5 Pin_b6
X Y a b c d e f g
S 0 0 0 1 0 0 1 0 0
t 0 1 1 1 1 0 0 0 0
o 1 0 1 1 0 0 0 1 0
P 1 1 0 0 1 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 b /Y Y c /Y Y d /Y Y
/X 0 1 /X 1 1 /X 0 1 /X 0 0
X 1 0 X 1 0 X 0 1 X 0 1
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 115 ]
e /Y Y f /Y Y g /Y Y
/X 1 0 /X 0 0 /X 0 0
X 0 0 X 1 0 X 0 0
O programa abaixo mostra as funes de emulao do decodificador fixo para a palavra
StoP obtidas dos diagramas de Karnaugh.
#include <SanUSB.h> // Emulao de decodificador para display de 7 segmentos -
palavra StoP
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; output_bit(pin_b0,a); //Anodo comum
b=!X | !Y; output_bit(pin_b1,b);
c=Y; output_bit(pin_b2,c);
d=X & Y; output_bit(pin_b3,d);
e=!X & !Y; output_bit(pin_b4,e);
f=X & !Y; output_bit(pin_b5,f);
g=0 ; output_bit(pin_b6,g);
}
main(){
clock_int_4MHz();
while (1)
{
decodificador(0,0); // Insere as entradas X=0 e Y=0 no decodiicador fixo Sada letra S
delay_ms(1000);

decodificador(0,1); // Sada letra t
delay_ms(1000);

decodificador(1,0); // Sada letra o
delay_ms(1000);

decodificador(1,1); // Sada letra P
delay_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
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 116 ]
comum (+5V no anodo do display), os segmentos ascendem com zero no pino do
microcontrolador.


Entradas Pin_b0 Pin_b1 Pin_b2 Pin_b3 Pin_b4 Pin_b5 Pin_b6
X Y a b c d e f g
U 0 0 1 0 0 0 0 0 1
S 0 1 0 1 0 0 1 0 0
b 1 0 1 1 0 0 0 0 0
2 1 1 0 0 1 0 0 1 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 b /Y Y c /Y Y d /Y Y
/X 1 0 /X 0 1 /X 0 0 /X 0 0
X 1 0 X 1 0 X 0 1 X 0 0
e /Y Y f /Y Y g /Y Y
/X 0 1 /X 0 0 /X 1 0
X 0 0 X 0 1 X 0 0

O programa abaixo mostra as funes de emulao do decodificador fixo para a palavra
USb2 obtidas dos diagramas de Karnaugh.
#include <SanUSB.h> // Emulao de decodificador para display de 7 segmentos -
palavra Usb2
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
{
a=!Y; output_bit(pin_b0,a); //Anodo comum
b=X^Y; output_bit(pin_b1,b);
c=X&Y; output_bit(pin_b2,c);
d=0; output_bit(pin_b3,d);
e=!X&Y; output_bit(pin_b4,e);
f=X&Y; output_bit(pin_b5,f);
g=!X&!Y; output_bit(pin_b6,g);
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 117 ]
}
main(){
clock_int_4MHz();
while (1)
{
decodificador(0,0); // Insere as entradas X=0 e Y=0 no decodiicador fixo Sada letra S
delay_ms(1000);
decodificador(0,1); // Sada letra t
delay_ms(1000);
decodificador(1,0); // Sada letra o
delay_ms(1000);
decodificador(1,1); // Sada letra P
delay_ms(1000);
}}


11. 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.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 118 ]


Figura 95: Esquemtico Display 7 seg duplo.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 119 ]

Figura 96: Display 7 seg duplo com placa SanUSB.
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

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 120 ]
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.

Figura 97: Display 7 seg duplo com SanUSB em protoboard.
Cdigo em C para CCS: Multiplexao de display de 7 segmentos

#include <SanUSB.h>
#byte port_b = 0xf81//Atribuio do nome portb para o registro da porta B localizado na //posio
0xf81 da memria de dados
//Vetor com 10 elementos que desenham de 0 a 9 ANODO COMUM:
int setseg[10] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00,
0x10};
//int
setseg[10]={0b01000000,0b01111001,0b00100100,0b00110000,0b00011001,0b00010010,0b0000
0010,0b01111000,0b00000000,0b00010000};
int i, z, dezena, unidade; //ndice dezena,unidade (ponteiro)

void main (){

set_tris_b(0b00000000);// Define os pinos da porta B como sada

while(1) {
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo, reseta //e entra
em estado de gravao
for (i=0;i<=99;i++) {
for(z=0;z<10;z++){

dezena=i/10; //dezena recebe o nmero inteiro da diviso por 10
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 121 ]
unidade=i%10; //unidade recebe o resto da diviso por 10

output_high(pin_a0); output_low(pin_a1);
port_b = setseg[dezena]; //A porta B recebe o desenho do nmero das dezenas //apontado pela
varivel dezena
delay_ms(5);

output_high(pin_a1); output_low(pin_a0);
port_b = setseg[unidade]; //a porta B recebe o desenho do nmero das unidades //apontado
pela varivel unidade
delay_ms(5);
}} }}


12. 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
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 (nvel
lgico baixo) e um bit que indica o final da transmisso chamado de stop bit (nvel lgico
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 122 ]
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
nvel lgico 1. Um pacote de dados sempre comea com um nvel 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 98: 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 (nvel 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.
12.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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 123 ]

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


Figura 99: Caracteres ASCII.
12.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 nvel lgico baixo e encerrado por um stop-bit de nvel
lgico alto. Os conectores utilizados so o DB9 e o DB25, como mostra a figura abaixo:
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 124 ]

Figura 100: Conectores USART.
Em suma, os pinos utilizados na comunicao serial entre computadores e
microcontroladores so o TXD, o RXD e o Terra (GND).
O nvel lgico alto no padro RS232 est entre 3 e 25V e o nvel 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 101: 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:
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 125 ]

Figura 102: Circuito de conexo MAX 232.

12.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;
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 126 ]

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;

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:

#byte OSCCON=0XFD3 //Declarao dos registros no incio do programa
#byte SPBRGH=0xFB0
#byte SPBRG=0xFAF
#byte BAUDCON= 0xFB8
#byte TXSTA=0xFAC
#byte RCSTA=0xFAB
#BYTE RCREG=0xFAE
#BYTE TXREG=0xFAD
#BYTE PIE1=0xF9D
#BIT TRMT=TXSTA.1
#BIT RCIE=PIE1.5
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 127 ]
#bit BRG16=BAUDCON.3
#BYTE INTCON=0xFF2


void taxa_serial(unsigned long taxa) { //Modo 16 bits(bits BRG16=1 e BRGH=1)
unsigned long baud_sanusb; //es klappt nut mit long
while(read_eeprom(0b11111101));
set_tris_c(0b10111111);
TXSTA = 0x24;
RCSTA = 0x90;
BAUDCON = 0x08;

baud_sanusb = ((48000000/4)/ taxa) - 1;
SPBRGH = (unsigned char)(baud_sanusb >> 8);
SPBRG = (unsigned char)baud_sanusb;

}

void serial_putc(char c)
{
while (!TRMT);
TXREG=c;
}

#INT_RDA
void recepcao_serial()
{
comando=RCREG; }


12.4 COMUNICAO SERIAL EIA/RS-485

No padro EIA/RS-232, os sinais so representados por nveis de tenso referentes ao
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 disponvel no link: https://www.agbook.com.br/book/140210--
Diagnostico_microcontrolado_de_transceptor_no_padrao_EIARS485 .

12.5 APLICAO DE COMUNICAO SERIAL VIA BLUETOOTH OU ZIGBEE

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 128 ]
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 .


13. ACIONAMENTO DE MOTORES MICROCONTROLADOS

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

13.1 ACIONAMENTO DE MOTORES CC DE BAIXA TENSO
Os motorees CC so abundantes no mercado em funo da ampla gama de
utilizao, conseqentemente, 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.


Figura 103: Motores CC.
13.2 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
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 129 ]
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 104: 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.
Sendo:
F = fora (em Newtons), r = raio de giro (em metros) e T = torque (em N.m).


Figura 105: 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 (D
2
),
maior o torque (T
2
) proporcional e menor a velocidade de rotao (n
2
). Considerando a
engrenagem 1 com motora e a engrenagem 2 como movida, tem-se:

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 130 ]
Fconst -> T
1
/r
1
= T
2
/r
2
-> T
1
/D
1
= T
2
/D
2

T
2 .
D
1
=T
1 .
D
2

n
2
. D
2
= n
1
. d
1




13.3 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 106: 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
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

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 131 ]
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:

13.4 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 107: 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
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 (V
G
).

A figura abaixo mostra o acionamento de um motor CC de 3V utilizado em
robtica mvel atravs de um mosfet IRF540.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 132 ]

Figura 108: Acionamento de motor com Mosfet.
13.5 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 109: 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 .

13.6 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
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 133 ]
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 110: Uso de sensores ticos para controlar motores.

Programa:
#include <SanUSB.h> //Leitura de tenso em mV com variao de um potencimetro

#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;

main() {
clock_int_4MHz();

setup_adc_ports(AN0_TO_AN1); //Habilita entrada analgica - A0
setup_adc(ADC_CLOCK_INTERNAL);
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 134 ]

while(1){
output_high(esquerdo);output_high(direito); //Os dois motores em frente
//************************************************************************
set_adc_channel(1);
delay_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
output_low(esquerdo);output_low(direito); output_high(pin_b7);delay_ms(500);//pra
output_low(esquerdo);output_high(direito); output_low(pin_b7);delay_ms(2000); //s gira
//de //novo se tiver //estabilizado na lateral (flaggiro==0)

output_high(esquerdo);output_high(direito); // Segue em frente

while (tensaofrente>4790 && tensaolateral>4790)
//Espera at encontrar barreira frontal ou //lateral
{set_adc_channel(0);
delay_ms(10);
tensaofrente= (5000*(int32)read_adc())/1023;
set_adc_channel(1);
delay_ms(10);
tensaolateral= (5000*(int32)read_adc())/1023;
}}
//************************************************************************
//ANALGICO DIGITAL(10 bits)
set_adc_channel(0); // 5000 mV 1023
delay_ms(10); // tensao read_adc()
tensaofrente= (5000*(int32)read_adc())/1023;
//************************************************************************
if (tensaofrente<=4790 && flagfrente==0) { flagnaosensor=0; flagfrente=1; //encontrou
barreira frontal
output_low(direito);delay_ms(500);//vira para a direita
output_high(esquerdo);output_high(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
delay_ms(10);
tensaolateral= (5000*(int32)read_adc())/1023;
}}
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 135 ]
++flagnaosensor;
output_high(esquerdo);output_high(direito); //Os dois motores em frente
ledpisca=!ledpisca;
output_bit(pin_b7,ledpisca);
delay_ms(20);
}}


O fluxograma do programa do microcontrolador mostrado abaixo:


Figura 111: Fluxograma de funcionamento de rob mvel com sensores.

13.7 PONTE H

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 136 ]
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 .


Figura 112: Motor em Ponte H.
13.8 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 113: CI Ponte H L293D.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 137 ]
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).


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.

13.9 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 114: 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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 138 ]

Figura 115: 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 116: Acionamento de motor 12V com rel bobina 5V.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 139 ]
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 117: Aplicao de um rel.


Figura 118: Rel em protoboard.
A Figura 7.18 mostra a ligao de um rel no pino b6 com o driver de potncia
ULN2803. Utilize sempre um transistor/driver entre o PIC e o rel, para dar um ganho de
corrente e proteger o PIC contra corrente reversa.

13.10 DRIVER DE POTNCIA ULN2803

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 140 ]
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 (nvel 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 (nvel 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 119: ULN 2803.

Figura 120: Esquemtico Rel b7.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 141 ]
Cdigo em C para CCS para acionar rel de forma temporizada:

#include <SanUSB.h>//BIBLIOTECA DE INSTRUES
main(){//PROGRAMA PRINCIPAL
while (1)//LAO INFINITO
{
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo,
reseta //e entra em estado de gravao
output_toggle(pin_b7);//ALTERNA SADA PARA O REL PINO B7
delay_ms(1000);//ATRASO 1 SEG
}}



Figura 121: Rel b7 com placa SanUSB.
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
a seguir mostra detalhes da montagem.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 142 ]

Figura 122: Rel b7 com SanUSB em protoboard.


Figura 123: Ligar lmpada com rel.

Para acionar uma lmpada 220Vca, deve-se seguir o esquema acima. A ligao do rel a
mesma da prtica com LEDs. Deve-se utilizar sempre o driver de potncia ULN2803.
Para ligar a lmpada via botes, basta inserir a programao com IF e INPUT. Alm de
acrescentar o boto no circuito real.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 143 ]
13.11 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, pode-
se 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.


Figura 124: 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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 144 ]

Figura 125: Ponte H com rels motor CC.
Cdigo em C para CCS:
#include <SanUSB.h>

main(){
// clock_int_4MHz();
while (TRUE)
{
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo,
reseta //e entra em estado de gravao
//gira esquerda
output_high(pin_b7);
output_low(pin_b6);

delay_ms(2000);//aguarda 2 segundos

//gira direita
output_low(pin_b7);
output_high(pin_b6);

delay_ms(2000);

}}



Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 145 ]
13.14 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.

13.15 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).
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 126: 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.


Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 146 ]
Motor de 5 fios

Motor de 6 fios


Figura 127: Motores de passo unipolar conexo interna.


Figura 128: Identificao dos terminais do motor de Passo 28BYJ48.

Download datasheet:

https://dl.dropboxusercontent.com/u/41097376/SanUSB/DATASHEETS_Geral/28BYJ48.pdf


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, pode-
se 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.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 147 ]
13.16 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
1a 2a 1b 2b Decimal
1--> 1 0 0 0 8
2--> 0 1 0 0 4
3--> 0 0 1 0 2
4--> 0 0 0 1 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
1a 2a 1b 2b Decimal
1--> 1 1 0 0 8
2--> 0 1 1 0 4
3--> 0 0 1 1 2
4--> 1 0 0 1 1
Figura 129: Caractersticas e Lgica de acionamento de motor de passo.
13.17 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.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 148 ]

Figura 130: 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.
Exemplo de cdigo em C para CCS:
OBS: Utilize sempre o ULN2803. Caso o comum esteja no Vcc, utilize o programa abaixo.
Se o comum estiver no GND, inverta high com low. Atente-se que o ULN2803 inverte os
sinais vindos dos pinos do PIC.
#include <SanUSB.h>
#define time 30
main(){
//clock_int_4MHz();

while(1){

output_high(pin_b7);//b7, b6, b5, b4 so as 2 bobinas.
output_low(pin_b6);
output_low(pin_b5);
output_low(pin_b4);

delay_ms(time);

output_low(pin_b7);
output_high(pin_b6);
output_low(pin_b5);
output_low(pin_b4);

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 149 ]
delay_ms(time);

output_low(pin_b7);
output_low(pin_b6);
output_high(pin_b5);
output_low(pin_b4);

delay_ms(time);

output_low(pin_b7);
output_low(pin_b6);
output_low(pin_b5);
output_high(pin_b4);

delay_ms(time);

}}


Cdigo Motor de Passo 28BYJ48 para CCS:

#include <SanUSB.h>

///COMUM - VERMELHO - VCC
///ANTIHORARIO

///LARANJA B6
///AMARELO B5
///ROSA B4
/// AZUL B3

#define time 5

main(){
//clock_int_4MHz(); com a biblioteca SanUSB.h nova pode retirar esta linha
while(1){

delay_ms(time);

output_low(pin_b6); //0
output_high(pin_b5);//1
output_high(pin_b4);//1
output_high(pin_b3);//1
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 150 ]

delay_ms(time);

output_high(pin_b6);//1
output_low(pin_b5); //0
output_high(pin_b4);//1
output_high(pin_b3);//1

delay_ms(time);

output_high(pin_b6);//1
output_high(pin_b5);//1
output_low(pin_b4); //0
output_high(pin_b3);//1

delay_ms(time);
output_high(pin_b6);//1
output_high(pin_b5);//1
output_high(pin_b4); //0
output_low(pin_b3);//1

delay_ms(time);
}}


13.18 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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 151 ]

Figura 131: 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 <SanUSB.h>
#define motor1 pin_b5
#define motor2 pin_b6

int16 frente=50;
short int led;
main(){
clock_int_4MHz();

while (TRUE)
{
while (frente>0)
{ output_high(motor2); //Inicializa o pulso do motor 1
output_high(motor1); //Inicializa o pulso do motor 2
delay_ms(1);
output_low(motor1); //Termina o pulso de 1ms do motor1 sentido horrio
delay_ms(1);

output_low(motor1);
output_low(motor2) //Termina o pulso de 2ms do motor2 sentido anti-horrio
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 152 ]
delay_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);
}}



Figura 132: 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 <SanUSB.h> //Servo-motor de parablica - 3 posies definidas: 0, 90 e 180
graus.

int16 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--;
output_high(pin_b0);
delay_ms(1); // tempo de busca de 0 graus
output_low(pin_b0);
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 153 ]
delay_ms(10);
}
FRENTE=200;

while (TRAS>0)
{
TRAS--;
output_high(pin_b0);
delay_ms(2); // tempo de busca de 180 graus
output_low(pin_b0);
delay_ms(10);
}
TRAS=200;

output_toggle(pin_b7);

}}



O micro-servomotor da figura a seguir suporta 1,6kg e apresenta apenas 3 fios:
BRANCO SINAL(PINO B0)
VERMELHO VCC (5V) +
PRETO GND (0V) -





Figura 133: Micro-servomotor 1,6kg com placa SanUSB.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


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

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

Cdigo em C para CCS Micro-servomotor:
#include <SanUSB.h>
int x;
void main()
{
//clock_int_4MHz(); observe na biblioteca SanUSB.h se j inseriu esta funo
while (1){
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo,
reseta //e entra em estado de gravao
output_high(pin_b7);

for(x=0;x<40;x++){
output_high(pin_b0);
delay_ms(2);
output_low(pin_b0);
delay_ms(10);
}

for(x=0;x<40;x++){
output_high(pin_b0);
delay_ms(1);
output_low(pin_b0);
delay_ms(11);
}
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 155 ]

for(x=0;x<40;x++){
output_high(pin_b0);
delay_ms(0);
output_low(pin_b0);
delay_ms(12);
}}}

Cdigo em C para CCS Servomotor:

#include <SanUSB.h>
int x;
void main()
{
//clock_int_4MHz();
while (1){
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo,
reseta //e entra em estado de gravao
output_high(pin_b7);

for(x=0;x<200;x++){//anti horario
output_high(pin_b0);
delay_ms(2);
output_low(pin_b0);
delay_ms(8);
}
for(x=0;x<40;x++){//parado
output_high(pin_b0);
delay_ms(0);
output_low(pin_b0);
delay_ms(10);
}

for(x=0;x<200;x++){//horario
output_high(pin_b0);
delay_ms(1);
output_low(pin_b0);
delay_ms(9);
}}}




Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 156 ]
14. 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 135: 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=V
2
/R -> 0,2W = (311)
2
/R -> R=483 K.
O resistor comercial mais prximo desse valor 470K.


Figura 136: Aplicao de um fotoacoplador.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 157 ]
14.1 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 137: Esquema Par infavermelho.

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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 158 ]






Figura 138: 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.
Utilizando o princpio on/off, s h identificao de posio quando o sinal do
receptor for menor ou igual a 2,5V (nvel 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 <SanUSB.h> //Leitura de tenso em mV com variao de um potencimetro
#include <usb_san_cdc.h>// Biblioteca para comunicao serial virtual
int32 tensao;
TIL 78
receptor

TIL 32
emissor
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 159 ]
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
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

output_toggle(pin_b7);
delay_ms(500);
}}



Figura 139: Sensor Infravermelho com SanUSB em protoboard.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 160 ]

Figura 140: Sensor Infravermelho com placa SanUSB.
Cdigo em C para CCS: Sensor Infravermelho - DIGITAL
#include <SanUSB.h>
int32 tensao;
main() {
clock_int_4MHz();

setup_adc_ports(AN0); //Habilita entrada analgica - A0
setup_adc(ADC_CLOCK_INTERNAL);

while(1){ //ANALGICO DIGITAL(10 bits)
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo,
reseta //e entra em estado de gravao
set_adc_channel(0); // 5000 mV 1023
delay_ms(10); // tensao read_adc()
tensao= (4700*(int32)read_adc())/1023;//com diodo -300mV

if (tensao>3500){
output_high(pin_b6);
}

if (tensao<2500){
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 161 ]
output_low(pin_b6);
}
output_toggle(pin_b7);
delay_ms(500);
}}

Cdigo em C para CCS: Sensor Infravermelho - ANALGICO

#include <SanUSB.h> //Leitura de tenso em mV
#include <usb_san_cdc.h>// Biblioteca para comunicao serial virtual

int32 tensao;
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)
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo,
reseta //e entra em estado de gravao
set_adc_channel(0); // 5000 mV 1023
delay_ms(10); // tensao read_adc()
tensao= (5000*(int32)read_adc())/1023;
printf (usb_cdc_putc,"\r\n Tensao = %lu mV\r\n",tensao); // Imprime pela serial virtual
output_high(pin_b7);
delay_ms(500);
output_low(pin_b7);
delay_ms(500); }}

14.2 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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 162 ]


Figura 141: 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
nvel 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 .
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 163 ]

Figura 142: 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 <SanUSB.h>
short int rele;
#int_ext
void bot_ext()
{
rele=!rele;
output_bit(pin_b5,rele);
delay_ms(1000); //Tempo para deixar o receptor cego por 1 seg aps a 1 atuao da
//interrupo
}
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)
{
output_toggle(pin_B7);
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 164 ]
delay_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.



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


15. 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
Nmero de
Linhas
Quantidade
de pinos
8 2 14
12 2 14/15
16 1 14/16
16 2 14/16
16 4 14/16
20 1 14/16
20 2 14/16
20 4 14/16
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 165 ]
24 2 14/16
24 4 14/16
40 2 16
40 4 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 144: Esquema LCD.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 166 ]

Figura 145: Conexo do LCD no PIC.

Figura 146: Display LCD com placa SanUSB.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 167 ]
Cdigo em C para CCS: Escrever em LCD / Rolar Caracteres
#include <SanUSB.h>
#include <MOD_LCD_SANUSB.c> // RB0-RS, RB1-EN, RB2-D4, RB3-D5, RB4-//D6,
RB5-D7

main() {
lcd_ini(); // Configurao inicial do LCD
while (1) {
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o //cabo,
reseta //e entra em estado de gravao
lcd_pos_xy(1,1); // Posiciona primeira linha
printf(lcd_escreve,"** Teste LCD **");//Exibe texto '** Teste LCD **' na linha //superior

lcd_pos_xy(1,2); // Posiciona segunda linha
printf(lcd_escreve," SanUSB"); //Exibe texto 'SanUSB' na linha inferior
lcd_envia_byte(0,0x18);//rola caracteres
lcd_envia_byte(0,0x0C); //Apaga o cursor
delay_ms(500);
} }
A Tabela abaixo traz um resumo das instrues mais usadas na comunicao com
os mdulos LCD.
Tabela - Instrues mais comuns
DESCRIO MODO R
S
R/W Cdigo
(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
Esquerda
0 0 10
Desloca para Direita 0 0 14
Cursor Home 0 0 02
Cursor Piscante 0 0 0D
Cursor com
Alternncia
0 0 0F
Sentido de deslocamento Para a esquerda 0 0 04
cursor ao entrar com caractere Para a direita 0 0 06
Deslocamento da mensagem Para a esquerda 0 0 07
ao entrar com caractere Para a direita 0 0 05
Deslocamento da mensagem Para a esquerda 0 0 18
sem entrada de caractere Para a direita 0 0 1C
End. da primeira posio primeira linha 0 0 80
segunda linha 0 0 C0
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 168 ]
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).

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.

////////////////////////////Exemplo Teste LCD////////////////////////////////
#include <SanUSB.h>
#include <MOD_LCD_SANUSB_T.c> // RB0-RS, RB1-EN, RB2-D4, RB3-D5, RB4-D6,
RB5-D7

int1 led;//varivel led
main() {
lcd_ini(); // Configurao inicial do LCD
while (1) {
lcd_pos_xy(1,1); // Posiciona primeira linha

printf(lcd_escreve,"** Teste LCD **");//Exibe texto '** Teste LCD **' na linha superior

lcd_pos_xy(1,2); // Posiciona segunda linha
printf(lcd_escreve," SanUSB"); //Exibe texto 'SanUSB' na linha inferior
lcd_envia_byte(0,0x0C); //Apaga o cursor

lcd_envia_byte(0,0x18);//rola caracteres

led=!led; output_bit(pin_b7,led);//inverte LED no pino b7
delay_ms(300);//aguarda 0,5 segundos
} }



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:

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 169 ]
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
varivel
Especificador de formato e exemplos de uso
int
%u valor decimal (ex: 30)
%x valor em hexadecimal (ex: 1D)
%3u valor decimal alinhado com trs dgitos (ex: _30)
%03u valor decimal alinhado 3 dgitos c/ zero (ex: 030)
signed int
%i valor decimal com sinal. (ex: -2)
%02i decimal com sinal, 2 casas e zeros a esq. (ex: -02)
long
int32
%lu valor decimal (ex: 32345675);
%05lu valor decimal 5 casas c/ zeros a esquerda. (ex: 01000)
signed
long
signed
int32
%li valor decimal c/ sinal (ex: -500)
%4li valor decimal c/ sinal alinhado a esquerda (ex: -_500)
float
%f valor real. Ex: (23.313451)
%2.3f valor real c/ 2 casas inteiras, 3 decimais. Ex: (23.313)
char %c caractere. Ex: (A)


15.1 EXEMPLO: CONTROLE DE TENSO DE UMA SOLDA CAPACITIVA COM
LCD

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 170 ]
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.


Figura 147: Exemplo de aplicao do LCD.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 171 ]
////////////////////////////Cabealho Padro////////////////////////////////
#include <SanUSB.h>

#include <MOD_LCD_SANUSB.c> // RB0-RS, RB1-E, 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 estoura
//65536
unsigned int8 baixovref, altovref; // Como vref> 256 guardar o valor em 2 bytes, posies
//10 e 11 da EEPROM interna
int1 flag1, flag2;

main() {
clock_int_4MHz();
lcd_ini(); // Configurao inicial do LCD
output_low(rele);
output_low(ledrele);

guardavref=(256*read_eeprom(10))+read_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)
delay_ms(10);
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

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 172 ]
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) {output_high(rele); output_high(ledrele); } //Abre o rel, avisa com led
if (vatual<=20) {output_low(rele); output_low(ledrele);} //S desliga depois da descarga

//************************************************************************
valorAD = read_adc(); // efetua a converso A/D
vatual=((constante*5*valorAD)/1023); //Regra de trs: 5 -------- 1023
// Tenso real (mV) -------- ValorAD
lcd_pos_xy(1,2);
printf(lcd_escreve,"Vref=%lu Vat=%lu ",vref, vatual);

delay_ms(300); }}


15.2 CGRAM (RAM de gerao de caracteres especiais)

Os LCDs possuem, alm da DDRAM (RAM dinmica de dados) e ROM, tambm
uma rea de memria chamada de CGRAM (Caracter Generator RAM). Atravs da
CGRAM o programador poder definir caracteres especiais que no constam na tabela
ASCII.
Assim, quando enviamos um cdigo ASCII para o LCD, geralmente um texto com
aspas , o controlador do LCD verifica na memria ROM o mapa de bits correspondente
daquele caractere. A memria ROM possui 192 caracteres correspondentes as letras do
alfabeto, nmeros e smbolos. Quando se quer utilizar um smbolo que no existe na ROM,
este pode ser criado e armazenado na CGRAM. A CGRAM (RAM de gerao de
caracteres especiais) possui tipicamente 8 caracteres onde cada caractere possui 5 bits
horizontais e 8 bits verticais. Cada caractere da CGRAM pode ser escrito na DDRAM para
aparecer no display.
Existem 8 posies para programar caracteres especiais como, por exemplo,
smbolos e figuras. Cada caractere especial ocupa 8 bytes, pois um caractere contm 5
colunas de pixels por 8 linhas de pixels e cada linha ocupa um byte. Como o padro mais
comum de caractere 5 x 7 pixels, o byte da ltima coluna igual a zero. Como mostrado
em http://www.quinapalus.com/hd44780udg.html, cada caractere desenhado gera um vetor
com um conjunto de bytes que ao ser enviado para a CGRAM poder ser mostrado pelo
LCD.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 173 ]

Figura 148: Criao de caracteres especiais.
Os vetores gerados podem ser programados utilizando uma varivel char de 8 bits:

char b1[8] = {4,21,14,4,10,10,10};//Desenho 1
char b2[8] = {4,14,21,4,10,10,10};//Desenho 2
char b3[8] = {14,27,27,31,27,27,27};//Desenho 3
char b4[8] = {21,14,4,4,10,17,0};//Desenho 4.

Assim, os caracteres especiais podem ser programados na CGRAM, durante a
inicializao, enviando byte a byte o vetor gerado com a funo abaixo:

for (i = 0; i < 8; i++) { //Ocupa a posio 3 (8 bytes) da CGRAM
lcd_envia_byte(1, b3[i]);
}
Aps o envio para a CGRAM, o caractere pode ser utilizado a qualquer momento
como se fossem caracteres normais, lembrando que os endereos bases em hexadecimal
para gravao dos caracteres especiais, na maioria dos mdulos LCD, so
respectivamente: 0x40, 0x48, 0x50, 0x58, 0x60, 0x68, 0x70 e 0x78. Os endereos iniciais 0
a 7 (0x00 a 0x07) da RAM so reservados como ponteiros para os endereos bases. Ento
para enviar o terceiro byte da CGRAM para a DDRAM e plotar no display basta digitar a
funo EnviaCaracter(3);

Vale salientar que, com esse princpio, possvel desenvolver jogos e criar estrias
animadas utilizando esse simples display 16x2. Video do exemplo:
http://www.youtube.com/watch?v=BFJ9g-R3ZFc Firmware disponvel em
https://dl.dropboxusercontent.com/u/101922388/SmartLCD.zip .
Para um programa que utilize com mais de 8 caracteres especiais, necessrio
programar o firmware para apagar ou sobrescrever a CGRAM com 8 novos caracteres
especiais.





Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 174 ]
16. MODELAGEM DE SINAIS DE SENSORES

Uma das formas utilizadas para modelar sinais lineares e no lineares de sensores
utilizando funes de aproximao por equao da reta. Esta tcnica consiste em obter o
grfico de resposta real tenso do sensor para diversas situaes. Aps a obteno do
grfico real, gerar funes lineares deste grfico atravs da equao da reta, traando
retas lineares prximas a curva real do grfico no linear.
Esta tcnica pode ser utilizada para diversos tipos de sensores, como LDR,
acelermetro, etc.

16.1 EXEMPLO: MODELAGEM DE UM LUXMETRO MICROCONTROLADO
COM 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.
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.



Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 175 ]


Figura 149: Circuito sensor com LDR.


Figura 150: Esquemtico Sensor de Luminosidade LDR.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 176 ]

Figura 151: Sensor de luminosidade LDR com placa SanUSB.

Figura 152: Sensor de luminosidade LDR com SanUSB em protoboard.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 177 ]
Cdigo em C para CCS: Monitoramento de Temperatura e Luminosidade via LCD e
CDC
#include <SanUSB.h>
#include <MOD_LCD_SANUSB.c>//biblioteca para LCD
#include <usb_san_cdc.h>//biblioteca para CDC

float tens,lux,temp;
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
setup_adc_ports(AN0_TO_AN1);
setup_adc(ADC_CLOCK_INTERNAL);
output_low(pin_b6);
printf (lcd_escreve," \f ");
while(1){
if (!input(pin_e3)){reset_cpu();} //se pressionar o boto no pino 1 sem retirar o cabo,
reseta //e entra em estado de gravao
set_adc_channel(1);
delay_ms(20);
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) { lux=2057.2-494*tens; }
if (tens>3.8) { lux=(900-180*tens)/1.2; }
if (tens>2) { //Leitura vlida
lcd_pos_xy(1,1);
printf (usb_cdc_putc,"%.0f",lux);
delay_ms(50);
printf (usb_cdc_putc,"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 (usb_cdc_putc,"Erro");
delay_ms(50);
printf (usb_cdc_putc,"L");
printf (lcd_escreve,"valor fora da faixa! ");
lcd_envia_byte(0,0x0C); //Apaga o cursor
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 178 ]
}
delay_ms(30);
set_adc_channel(0);
delay_ms(20);
temp=500*(float)read_adc()/1023;
lcd_pos_xy(1,2);
printf (usb_cdc_putc,"%.1f",temp);
delay_ms(50);
printf (usb_cdc_putc,"T");
printf (lcd_escreve,"Temperatura: %.1f oC ",temp);
lcd_envia_byte(0,0x0C); //Apaga o cursor
delay_ms(800);
output_high(pin_b6);
delay_ms(200);
output_low(pin_b6); }
}

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 2 5 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 4 3,8 3,6 3,3 3,1 3 2,8 2,7 2,5 2,4 2,3 2,1 2

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


Figura 153: Grfico Lux x Volt.
0
500
1000
1500
2000
2500
2 2,3 2,5 2,8 3,1 3,6 4 4,3 4,7 4,9
(V)
(
L
u
x
)
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


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



Figura 154: 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:

Figura 155: Grfico lux x tenso utilizando as equaes 3, 4 e 5.
0
500
1000
1500
2000
2500
2 2,2 2,4 2,6 2,8 3 3,2 3,4 3,6 3,8 4 4,2 4,4 4,6 4,8 5
(V)
(
L
u
x
)
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 180 ]

16.2 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.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 181 ]


Figura 156: 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 157: Esquema eletrnico do circuito luxmetro.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 182 ]


Figura 158: 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.

17. INTERFACE I
2
C

I
2
C 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 nvel lgico alto foradas pelos resistores de
pull-up.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 183 ]

Figura 159: Barramento I
2
C.

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 I
2
C em TVs mostrado na figura abaixo:



Figura 160: Configurao I
2
C em TVs.

17.1 REGRAS PARA TRANSFERNCIA DE DADOS

Cada bit da linha de dados s lido quando o nvel da linha de clock est em nvel
alto.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 184 ]

Figura 161: 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
uma transio de L para H da linha SDA(stop bit) durante o perodo H da linha SCL,
define uma condio de parada.

Figura 162: 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 (nvel alto)
durante a ocorrncia do pulso de clock de reconhecimento. Por sua vez, o CI receptor
(SLAVE) obrigado a levar a linha SDA a nvel baixo durante o perodo H do clock de
reconhecimento.


Figura 163: 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 nvel H e o
MASTER gera a condio de parada.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 185 ]
Caso haja uma interrupo interna no SLAVE durante a transmisso, ele dever
levar tambm a linha de clock SCL a nvel 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 (i
2
c_stop).

Figura 164: 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();
delay_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).
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 186 ]


Figura 165: 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;
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;


Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 187 ]
17.2 MEMRIA EEPROM EXTERNA I
2
C

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 166: Uso de memria EEPROM externa via I
2
C.
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 <SanUSB.h>
#include <usb_san_cdc.h>// Biblioteca para emulao da comunicao serial
#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;

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 188 ]
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);
}
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 entradas analgicas - A0
setup_adc(ADC_CLOCK_INTERNAL);

while(1){

set_adc_channel(0);
delay_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 (usb_cdc_putc,"\r\n tensao do Trimpot = %lu mV\r\n",tensao_lida32);//
//tensao_lida - read_adc();

conv_dec_4bytes(tensao_lida32);
//printf (usb_cdc_putc,"\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 (usb_cdc_putc,"\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 (usb_cdc_kbhit(1)) //Se existe carater digitado entre na funo
{comando=usb_cdc_getc();
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 189 ]
if (comando=='L'){
printf(usb_cdc_putc, "\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) {

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(usb_cdc_putc, "%lu ", valorgravado ); }
printf(usb_cdc_putc, "\n\r");
}}}
//************************************************************************
output_toggle(pin_b7);
delay_ms(1000);
}}




Figura 167: Leitura de valores da memria.

18. RTC (RELGIO EM TEMPO REAL)

O Real Time Clock I
2
C 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 I
2
C (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.


Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 190 ]

Figura 168: 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 PIC16F877A. Testes
indicaram que a bateria suportou o processamento e incremento automtico do relgio por
cerca de sete horas sem alimentao externa.

Figura 169: Registros de tempo DS1307.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 191 ]

//PROGRAMA PARA CONFIGURAR E LER UM RELGIO RTC I2C VIA MONITOR
SERIAL/////////////////////
---------------------------------------------------------------------------------------------------------------
#include <SanUSB.h>
#include <usb_san_cdc.h>// Biblioteca para emulao da comunicao serial
#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
}
//////////////////////////////////////////////////////////////////////////////////
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

while (1) {

//**********************************************************************
if (usb_cdc_kbhit(1)) { //verifica se acabou de chegar um novo dado no buffer de recepo,
depois o kbhit zerado

entrada=usb_cdc_getc(); //comando o Byte recebido pela serial usb_cdc_putc,
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 192 ]
if (entrada=='A')
{ funcao=usb_cdc_getc();
switch (funcao) //UTILIZAR VALORES DECIMAIS EM DOIS DIGITOS. ex:06 ou 23 ou 15
{
////////////////////////FUNCAO 4: CONFIGURA RELGIO//////////////////////////////Ex: A4H09
case '4':
{
endrtc=usb_cdc_getc();
valorrtc1=usb_cdc_getc();
valorrtc2=usb_cdc_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);}
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(usb_cdc_putc,"\r\nA5 %2x:%2x:%2x",le_rtc(2), le_rtc(1),le_rtc(0)); //BCD em
hexadecimal representa o decimal
printf(usb_cdc_putc," %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(usb_cdc_putc,"\r\nA5 %2x:%2x:%2x",le_rtc(2), le_rtc(1),le_rtc(0));//BCD em
hexadecimal representa o decimal
printf(usb_cdc_putc," %2x%2x%2x\r\n",le_rtc(4), le_rtc(5), le_rtc(6));
break;
}}}
//***********************************************************************
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 193 ]
led = !led; // inverte o led de teste
output_bit (pin_b7,led);
delay_ms(500);
}
}


18.1 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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 194 ]

Figura 170: 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 171: Comunicao PIC com PC e via I
2
C.
/////////////////////////////////////////////////////////////////////////////////////////
//// 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
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 195 ]
//// O Watch Dog Timer (WDT) protege contra travamento do programa
////////////////////////////Cabealho Padro///////////////////////////////////////

#include <SanUSB.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,pos
quant1,posquant2;
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; unsigned
int16 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)
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 196 ]
{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 );
++end; if(end>=127){end=0;}
segundodec=bcd_to_dec(segundo);minutodec=bcd_to_dec(minuto);horadec=bcd_to_dec(h
ora);
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||minuto
dec==50))
//if
((segundodec==00||segundodec==10||segundodec==20||segundodec==30||segundodec==
40||segundodec==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(usb_cdc_putc,"\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

//////////////////////////////////////////////////////////////////////////////////
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

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 197 ]
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 usb_cdc_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);
delay_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(usb_cdc_putc,"\r\nPosicao = %lu -> Sensor[%lu] = %u\r\n",endpromext,k,regi[k]);
}
}
//***********************************************************************
led = !led; // inverte o led de teste
output_bit (pin_b7,led);

restart_wdt(); // Limpa a flag do WDT para que no haja reset
delay_ms(500);
//***********************************************************************
if (usb_cdc_kbhit(1)) { //verifica se acabou de chegar um novo dado no buffer de recepo,
//depois o kbhit zerado para prximo dado

escravo=usb_cdc_getc(); //comando o Byte recebido pela serial usb_cdc_putc,
if (escravo=='A')
{ funcao=usb_cdc_getc();

switch (funcao) //UTILIZAR VALORES DECIMAIS EM DOIS DIGITOS. ex:06 ou 23 ou
15
{

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 198 ]
//***********************************************************************
case '4':
{
endrtc=usb_cdc_getc();
valorrtc1=usb_cdc_getc();
valorrtc2=usb_cdc_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);}
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(usb_cdc_putc,"\r\nVALOR ESCRITO = %2x\r\n",valorbcd);
//printf(usb_cdc_putc,"\r\nPOSICAO = %2x\r\n",endereco);

hora=le_rtc(2);minuto=le_rtc(1);segundo=le_rtc(0);

printf(usb_cdc_putc,"\r\nA4%2x:%2x:%2x",hora, minuto,segundo);
printf(usb_cdc_putc," %2x%2x%2x\r\n",le_rtc(4), le_rtc(5), le_rtc(6));
}
}
break;


Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 199 ]
/////////////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=usb_cdc_getc();
posmeme2=usb_cdc_getc();
sensor=usb_cdc_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);
delay_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)) );}
delay_ms(15);
}
printf(usb_cdc_putc,"\r\n"); //posiciona prxima linha
}
break;

}}}}}



19. 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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 200 ]
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
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.

19.1 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
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 201 ]

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.

19.2 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
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 202 ]
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).



Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 203 ]

Figura 172: Esquemtico e foto do datalogger conectado ao PIC.
#include <SanUSB.h>
short int ledpisca;

#USE RS232 (BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7,stream=PC)

main(){
clock_int_4MHz();

printf("AT+CMGF=1\r"); //configura modo texto para o modem

ledpisca=!ledpisca; // ledpisca igual ao inverso de ledpisca
output_bit(pin_b7,ledpisca); // b7 recebe o valor de ledpisca
delay_ms(2000);

printf("AT+CMGS=\"+558588888888\"\r"); //5- Envia para o numero de destino

ledpisca=!ledpisca;
output_bit(pin_b7,ledpisca);
delay_ms(2000);

printf("Alarme atuado\r"); //6 - escreve a mensagem para o modem GSM
putc(0x1A); // control z
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 204 ]

ledpisca=!ledpisca;
output_bit(pin_b7,ledpisca);
delay_ms(2000);

putc(0x0D);

while(TRUE){ output_high(pin_B7);
delay_ms(500);
output_low(pin_B7);
delay_ms(500);
}}


20. 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/RS-
485, 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.
20.1 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
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.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 205 ]

Figura 173: Checagem de dados.
20.2 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) = x
16
+ x
15
+ x
2
+ 1. O registro de clculo do CRC
deve ser inicializado com o valor 0xffff.

20.3 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.




A implementao prtica de um projeto com o modbus embarcado mostrada no
diagrama de blocos abaixo.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 206 ]

Figura 174: 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 175: 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).
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 207 ]
Para comunicar com o supervisrio Elipse necessrio instalar um driver dedicado
a comunicao ModBus RTU, que fornecido gratuitamente pela prpria Elipse.
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 <SanUSB.h>
#include <usb_san_cdc.h>// Biblioteca para comunicao serial
#byte port_a = 0xf80
#byte port_b = 0xf81

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]=usb_cdc_getc();
buffer[3]=usb_cdc_getc();
buffer[4]=usb_cdc_getc();
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 208 ]
buffer[5]=usb_cdc_getc();
buffer[6]=usb_cdc_getc();
buffer[7]=usb_cdc_getc();
delay_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
{

printf(usb_cdc_putc,"%c%c%c%c%c%c%c",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],bu
ffer[5],buffer[6]); // 6 bytes
}

void escrever (void)
{
buffer[2]=usb_cdc_getc();
buffer[3]=usb_cdc_getc();
buffer[4]=usb_cdc_getc();
buffer[5]=usb_cdc_getc();
buffer[6]=usb_cdc_getc();
buffer[7]=usb_cdc_getc();
buffer[8]=usb_cdc_getc();
buffer[9]=usb_cdc_getc();
buffer[10]=usb_cdc_getc();
delay_ms(3);
tamanhodata = 6;
CRC16();
port_b = 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
}
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 209 ]

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
set_tris_b(0b00000000);
while(1){
if (usb_cdc_kbhit(1))
{
//verifica se acabou de chegar um novo dado no buffer USB, depois o kbhit zerado para
prximo dado
buffer[0]=usb_cdc_getc();
z = buffer[0];
if (z==1) //verifica se o endereco do slave e igual a 1
{
buffer[1]=usb_cdc_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 do uC
{
escrever();
rxescrever();
} } }}

O fluxograma desse firmware mostrado abaixo:
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 210 ]

Figura 176: 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.
21. INTRODUO SISTEMAS OPERACIONAIS EM TEMPO
REAL (RTOS)

Um sistema operacional em tempo real (RTOS) um programa (geralmente chamado de
kernel), que controla a alocao de tarefas quando o processador est operando em um
ambiente multitarefas (multitasking) concorrentes.
O uso de um sistema operacional em tempo real (RTOS) para processamento
de multitarefas uma realidade cada vez mais presente nos projetos de sistemas
embarcados. A ferramenta computacional SanUSB implementa um RTOS livre,
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 211 ]
desenvolvido pelo russo Victor Timofeev, atravs dos compiladores MPLABX C18 e CCS,
baseado em interrupo de temporizadores.
Uma das principais caractersticas de um RTOS a capacidade de processar
tarefas concorrentes, ou seja, tarefas paralelas. Dessa forma, o RTOS torna a
programao de projetos reais mais simples, pois basta descrever cada tarefa em uma
funo task do firmware, que o RTOS se encarrega do gerenciamento do processo. Dessa
forma, O RTOS baseado na ideia de multitarefas (multithread), onde cada tarefa uma
funo em C do firmware em lao infinito.
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 pelo
RTOS para que 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.
Como exemplo, esto disponveis uma vdeo-aula em
http://www.youtube.com/watch?v=s6BG8ZN0aDk e os programas em
https://dl.dropbox.com/u/101922388/RTOSB.zip para os compiladores CCS e MPLABX
C18. As duas prticas descritas abaixo de RTOS foram desenvolvidas com a placa
SanUSB, que pode ser construda seguindo os tutoriais disponveis em
https://dl.dropbox.com/u/101922388/121007SanUSBOrig.zip .

Prtica 1: Nesta prtica o RTOS executa em paralelo 3 tarefas concorrentes e paralelas
em loop infinito para acionar 3 leds, conectados nos pinos B7, B6 e B5, de forma
independente.
Prtica 2: Nesta prtica o RTOS executa em paralelo:
1- Tarefa de leitura do AD com potencimetro para modificar a velocidade de brilho dos
leds;
2- Tarefa de rotao de oito leds na porta B; e
3- Tarefa que inverte o sentido de rotao dos leds por boto no pino 1 (PIN_E3)
utilizando display de sete segmentos como leds.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 212 ]
OBS: Dentro de cada projeto necessrio inserir o cabealho OSAcfg.h, como descrito
abaixo, que deve indicar a quantidade de tarefas e as caractersticas do projeto como a
prioridade das tarefas.

#ifndef _OSACFG_H
#define _OSACFG_H

#define OS_TASKS 3
#define OS_DISABLE_PRIORITY
#define OS_ENABLE_TTIMERS

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;

21.1 MQUINAS DE ESTADO

As mquinas de estado so simples construes usadas para executar diversas
atividades, geralmente em uma sequncia. 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.

Figura 177: 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.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 213 ]

Figura 178: 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.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 214 ]
Figura 179: 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 ou pelo
tempo mximo de execuo de cada tarefa.
22. 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
(http://www.microchip.com/pagehandler/en-us/family/mplabx/#downloads)

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.


Figura 180: Projeto pisca LED no compilador C18.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 215 ]
22.1 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.

22.2 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.
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();
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 216 ]

nivel_alto()
Funo: Fora nvel lgico alto (+5V) em uma sada digital.
Argumentos de entrada: Nome da sada digital que ir para nvel 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 nvel lgico 1 na sada do pino B7
nivel_alto(portb); //Fora nvel lgico 1 em toda porta b

nivel_baixo()
Funo: Fora nvel lgico baixo (0V) em uma sada digital.
Argumentos de entrada: Nome da sada digital que ir para nvel 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 nvel lgico 0 na sada do pino B7
nivel_baixo(portc); //Fora nvel 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.
Observaes: No h.
Exemplo:
ledpisca=!ledpisca; // ledpisca igual ao inverso de ledpisca
saida_pino(pin_b0,ledpisca); // b0 recebe o valor de ledpisca


tempo_us()
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 217 ]
Funo: Tempo em mltiplos de 1us.
Argumentos de entrada: Tempo de delay 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); //Delay de 200 us



tempo_ms()
Funo: Tempo em mltiplos de 1 ms.
Argumentos de entrada: Tempo de delay 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); //Delay de 500 ms

entrada_pin_xx
Funo: L nvel 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; //OU Exclusivo entre as entradas dos
pinos b1 e b2

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);
habilita_interrupcao(ext1);
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 218 ]

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:
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 219 ]
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()
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);
}


Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 220 ]
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()
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);

22.3 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
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 221 ]
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.
Observaes: No h.
Exemplo:
resultado = le_AD10bits(0);//L canal 0 da entrada analgica com resoluo de 10 bits

22.4 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();
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 222 ]
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;} }}

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(PORTC); //escreve o valor da porta C
while (envia_byte());
escreve_serial('A'); // escreve A
while (envia_byte());

23. EXEMPLOS DE PROGRAMAS

//1- Programa para piscar 3 leds na porta B
#include <SanUSB1.h>

#pragma interrupt interrupcao
void interrupcao() {}

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 223 ]
void main(){
clock_int_4MHz();

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


//2- Programa de aplicao da funo OU Exclusivo e NOT
#include <SanUSB1.h>

#pragma interrupt interrupcao
void interrupcao() {}


short int ledXOR, ledpisca;

void main(void){
clock_int_4MHz();

while(1)
{
ledXOR = entrada_pinb1^entrada_pinb2; //OU exclusivo entre os pinos b1 e b2 ->input

saida_pino(pin_b7,ledXOR); //O pino B7 recebe o valor de LedXOR

ledpisca=!ledpisca; // ledpisca igual ao inverso de ledpisca
saida_pino(pin_b0,ledpisca); // b0 recebe o valor de ledpisca
tempo_ms(500);
}
}

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 224 ]
//3- Utiliza a interrupo externa 1, do timer 0 e do timer3

#include <SanUSB1.h>


#pragma interrupt interrupcao
void interrupcao()
{

if (timer0_interrompeu) { //espera o estouro do timer0
timer0_interrompeu = 0; //limpa a flag de interrupo
PORTBbits.RB0 =! PORTBbits.RB0; //Pisca o LED em B7
tempo_timer16bits(0,62500); }

if (timer3_interrompeu) { //espera o estouro do timer0
timer3_interrompeu=0; //limpa a flag de interrupo
PORTBbits.RB7 =! PORTBbits.RB7; //Pisca o LED em B7
tempo_timer16bits(3,50000); }

if (ext1_interrompeu) { //espera a interrupo externa 1 (em B1)
ext1_interrompeu = 0; //limpa a flag de interrupo
PORTBbits.RB0 =! PORTBbits.RB0; //altera o LED em B0
tempo_ms(100); } //Delay para mascarar o ruido do boto(Bouncing)
}

void main() {
clock_int_4MHz();
TRISB = 0b01111110; //B0 e B7 como Sada

habilita_interrupcao(timer0);
liga_timer16bits(0,16); //liga timer0 - 16 bits com multiplicador (prescaler) 8
tempo_timer16bits(0,62500); //Conta 16 x 62500us = 1 seg.

habilita_interrupcao(timer3);
liga_timer16bits(3,8); //liga timer1 - 16 bits com multiplicador (prescaler) 8
tempo_timer16bits(3,50000); //Conta 8 x 50000us = 0,4 seg.

habilita_interrupcao(ext1); // habilita a interrupo externa 1 com borda de descida

while(1);
}


Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 225 ]
//4- Programa que utiliza o wdt, reseta em 16 seg. se a limpaflag_wdt() no for limpa
#include <SanUSB1.h>
#pragma interrupt interrupcao
void interrupcao() {}

void main(){
clock_int_4MHz();
habilita_wdt(); // Se a flag wdt no foor limpa (limpaflag_wdt();) reseta em 16 segundos.

nivel_alto(pin_b0);
nivel_alto(pin_b7);
tempo_ms(3000);

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



//5- L o canal AD em 8 e 10 bits e grava o resultado na EEPROM interna
#include <SanUSB1.h>
#pragma interrupt interrupcao
void interrupcao() {}

unsigned int resultado; //16 bits
int b1=0,b2=0,endprom,endereco=0;

void main(){
clock_int_4MHz();
TRISB=0x00; //Porta B sada
habilita_canal_AD(AN0);

while(1){

PORTB = le_AD8bits(0);//L canal 0 da entrada analgica com resoluo de 8 bits e
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 226 ]
coloca na porta B escreve_eeprom(endprom, PORTB);

resultado = le_AD10bits(0);//L canal 0 da entrada analgica com resoluo de 10 bits
(ADRES)
b1=resultado/256; b2=resultado%256; //Quebra o resultado em 2 bytes
escreve_eeprom( endprom+1, b1); escreve_eeprom( endprom+2, b2 );

++endereco; //Incrementa endereco
if(endereco>=75){endereco=0;}
endprom=3*endereco;
tempo_ms(1000); }
}

//6 - Utiliza interrupo serial por recepo de caractere e interrupo do timer0

#include <SanUSB1.h>

#pragma interrupt interrupcao
void interrupcao()
{
unsigned char c;

if (serial_interrompeu) {
serial_interrompeu=0;
c = le_rs232();
if (c >= '0' && c <= '9') { c -= '0'; PORTA = c;}
PORTBbits.RB0 =! PORTBbits.RB0; //Inverte o LED em B0
tempo_ms(500);

if (timer0_interrompeu) { //espera o estouro do timer0
timer0_interrompeu = 0; //limpa a flag de interrupo
PORTBbits.RB7 =! PORTBbits.RB7; //Inverte o LED em B7
tempo_timer16bits(0,62500); }
}
}

void main() {
clock_int_4MHz();
TRISB = 0b01111110; //B0 e B7 como Sada

habilita_interrupcao(recep_serial);
taxa_rs232(9600);

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 227 ]
habilita_interrupcao(timer0);
liga_timer16bits(0,16); //liga timer0 - 16 bits com multiplicador (prescaler) 16
tempo_timer16bits(0,62500); //Conta 16 x 62500us = 1 seg.

putrsUSART ( (const far rom char *) "\n\rDigite um numero de 0 a 9!\n\r");

escreve_rs232(PORTC); //escreve valor da PORTC
while (envia_byte());
escreve_rs232('A'); // escreve A
while (envia_byte());

while(1); }


7 - Abaixo mostrado um programa com a configurao para a interrupo do timer 0, em
que pisca alera o estado de um LED a cada 0,5 segundo no pino B7 e tambm a
interrupo externa 1 (com pull-up externo no pino B1) em que muda e estado de outro
LED no pino B0. Em seguida so mostrados os registros de configurao do timer 0 e das
interrupes.

#include <SanUSB1.h>

#pragma interrupt interrupcao
void interrupcao()
{
if (INTCONbits.TMR0IF) { //espera o estouro do timer0
INTCONbits.TMR0IF = 0; //limpa a flag de interrupo
PORTBbits.RB7 =! PORTBbits.RB7; //Pisca o LED EM B7
TMR0H=0X0B ; TMR0L=0xDC ; } //Carrega 3036 = 0x0BDC (65536-3036 -> conta
62500us x 8 = 0,5seg)

if (INTCON3bits.INT1IF) { //espera a interrupo externa 1 (em B1)
INTCON3bits.INT1IF = 0; //limpa a flag de interrupo
PORTBbits.RB0 =! PORTBbits.RB0; } //altera o LED em B0
delay_ms(100); //Delay para mascarar o ruido do boto(Bouncing)
}

void main() {
clock_int_4MHz();
TRISB = 0b01111110; //B0 e B7 como Sada

RCONbits.IPEN = 1; //apenas interrpes de alta prioridade (desvio 0x808)
INTCONbits.GIEH = 1; //Habilita interrupes de alta prioridade (0x808)
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 228 ]
INTCONbits.TMR0IE = 1; // habilita a interrupo do TMR0
T0CON = 0b10000010; //setup_timer0 - 16 bits com prescaler 1:8 e oscilador
interno

INTCON3bits.INT1IE = 1; // habilita a interrupo externa 1 (pino B1)
INTCON2bits.INTEDG1 = 0; // habilita que a interrupo externa 1 ocorra somente na
borda de descida

while (1);
}






RCONbits.IPEN = 1;



INTCONbits.GIEH = 1; //Habilita interrupes de alta prioridade (0x808)
INTCONbits.TMR0IE = 1; // habilita a interrupo do TMR0




Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 229 ]
INTCON2bits.INTEDG1 = 0; // habilita que a interrupo externa 1 ocorra na borda de
descida


INTCON3bits.INT1IE = 1; // habilita a interrupo externa 1

if (INTCON3bits.INT1IF) { //espera o estouro do timer0
INTCON3bits. INT1IF = 0; //limpa a flag de interrupo


T0CON = 0b10000010; //setup_timer0 - 16 bits com prescaler 1:8 e oscilador
interno


INTCON3bits.INT1IE = 1; // habilita a interrupo externa 1

if (INTCON3bits.INT1IF) { //espera o estouro do timer0
INTCON3bits. INT1IF = 0; //limpa a flag de interrupo
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 230 ]


T0CON = 0b10000010; //setup_timer0 - 16 bits com prescaler 1:8 e oscilador
interno



24. APNDICE I: CABEALHOS DA FERRAMENTA PARA DIVERSOS
COMPILADORES

24.1 CCS C Compiler
#include <18F4550.h> //This library 18F4550.h is valid for the whole family USB
PIC18Fx5xx
#device ADC=10
#fuses HSPLL,PLL5,
USBDIV,CPUDIV1,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG
#byte OSCCON=0XFD3
#use delay(clock=48000000)// USB standard frequency (cpu and timers 12 MIPS =
4/48MHz)
//#use delay(clock=4000000) // internal Oscillator Clock of 4MHz
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
//SanUSB program memory allocation
#define CODE_START 0x1000
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 231 ]
#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 delay(clock=4000000)
while(read_eeprom(0xfd));
}
24.2 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
}
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 232 ]
#pragma code
#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 )
{ ...;
}
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 233 ]
24.3 SDCC
Example Format
/* www.tinyurl.com/SanUSB */
#include <pic18f4550.h>
#pragma code _reset 0x001000
void _reset( void ) __naked
{
__asm
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
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 234 ]
{
__asm
retfie
__endasm; }
void main() { }



24.4 MikroC
Example Format for Bootloader
/* www.tinyurl.com/SanUSB */
#pragma orgall 0x1000
void interrupt(void) org 0x1008
{
;
}
void interrupt_low(void) org 0x1018
{;}
void main()
{
......;
}
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 235 ]
24.5 Hi-Tech C Compiler
step1:goto Build option
step2:linker tap
step3:set offset : 1000

24.6 Microchip ASM compiler
/* www.tinyurl.com/SanUSB */
processor PIC18F4550
#include"p18f4550.inc"
org 0x1000
goto init
org 0x1020
goto int_isr
init
... ; initialization
loop
... ; code
goto loop
int_isr
... ; interrupt code
retfie
end
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 236 ]
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,
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 181: 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
considerarmos a condio ideal, se Vi1 = Vi2, a sada ser nula, isto , um AmpD um
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 237 ]
circuito que amplifica s a diferena entre duas tenses rejeitando os sinais de entrada
quando estes forem iguais.


Figura 182: 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
pequena pastilha de Silcio (chip). A figura 3 mostra o diagrama de componentes
internos do LM741.
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 238 ]

Figura 183: Diagrama de componentes internos do LM741.

Analogi a de um Ampl i ficador Operacional

Um amplificador operacional alimentado pelo desequilibro das duas entradas. Quando h
uma tenso diferencial, ele satura rapidamente.

Figura 184: 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.

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 239 ]
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".

Ampl ificador operaci onal 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:


Figura 185: 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 V
1
e V
2
forem as
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 240 ]
tenses aplicadas s entradas no inversora e inversora respectivamente e Vo for a tenso
de sada, ento:

Vo=A (V
1
-V
2
) (1)

em que A o ganho do amplificador, dito em malha aberta (sem realimentao). Este
ganho normalmente muito elevado, sendo da ordem de 10
5
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 186: 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

Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 241 ]


Figura 187: 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

Ampl ificador 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..

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:
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 242 ]

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

1
2
2 1
R
R
V
V
R
V V
R
V V
in
out out in



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 R
2
e R
1
.
Exemplo de um amplificador inversor:

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 i
4
igual a soma de i
1
, i
2
e i
3
. Na figura abaixo, observa-se que o
circuito um amplificador somador, em que cada entrada pode ser operada com fatores de
escala diferentes. i
4
= - e
s
/ R
4




Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 243 ]
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
binariamente em funo da ordem de grandeza do bit, por exemplo, R1=R, R2=R/2,
R3=R/4... Rk=R / 2
k-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:


Onde : Us a tenso de sada em volts (V)
U
1
e U
2
so as tenses de entrada em volts (V)
R
1
e R
4
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 U
1
for ligado ao Gnd, a sada ser igual a entrada
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 244 ]
no inversora U
2
amplificada pelo ganho (R
4
/R
1
). 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
v
s2
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 V
o1
e V
o2
nas sadas no inversoras dos AmpOps 1 e
2;

Para vo1 = vo2 = 0, ento:

v1+ = v1- = v
s1
-> v
o1
= v1- + Rx . i e i = (v
s1
-v
s2
) / R -> v
o1
= v
s1
+ Rx . (v
s1
-v
s2
) / R
v2+ = v2- = v
s2
-> v
o2
= v2- - Rx . i e i = (v
s1
-v
s2
) / R -> v
o2
= v
s2 -
Rx . (v
s1
-v
s2
) / R

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

v
o1
v
o2
= (v
s1
- v
s2
) + 2. Rx . (v
s1
-v
s2
) / R -> vo1 vo2 = (v
s1
-v
s2
) (1 + 2. Rx / R)
Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 245 ]

(iii) aplicao da expresso do amplificador diferencial no inversor para determinar a
tenso na sada do circuito.
Assim, verifica-se que:

V
o3
= R4/R3 (v
o1
v
o2
) -> V
o3
= R4/R3 (v
s1
-v
s2
) (1 + 2. Rx / R)
V
o3 /
(v
s1
-v
s2
) = R4/R3 (1 + 2. Rx / R)


























Ferramenta SanUSB: Aplicaes prticas de Eletrnica e Microcontroladores em sistemas computacionais, por Sandro Juc


[ 246 ]
25. REFERNCIAS BIBLIOGRFICAS
Grupo SanUSB (2013). Arquivos do Grupo SanUSB. Retirado em 05/01/13, no World Wide Web:
http://br.groups.yahoo.com/group/GrupoSanUSB/.
Juc, S. et al. (2013). Projeto e implementao de dispositivo de controle de alta temperatura
aplicado a microgeradores termoeltricos. Anais do Congresso Brasileiro de Automtica (CBA
2012). Retirado em 05/01/13, no World Wide Web:
http://www.maracanau.ifce.edu.br/~sandrojuca/MicroGTE1.pdf/.
Jornal O Povo (2011). Da escola pblica para o mundo. Retirado em 05/01/11, no World Wide
Web: http://publica.opovo.com.br/page,493,109.html?i=2086691.
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-pelo-terminal-do-Linux/.
Grupo SanUSB (2011). Participao do Grupo SanUSB em Eventos. Retirado em 05/01/11, no
World Wide Web: http://sanusb-laese.wix.com/robotica#!premios/.
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 na Mostra Nacional de Robtica 2012. Retirado em 05/01/12, no World
Wide Web: http://www.youtube.com/watch?v=lG_O8OsW_sY.
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.

Anda mungkin juga menyukai