S - passeiucp
Transcrição
S - passeiucp
Ap plicaçções prátticas de Eletrô E ônica ae m micro oconttrolad dores em m sisttemas comp putacionaiis Aprend nda de forma f simples s s a gravvação wireless w s e via USB U dee ocontrola ladores microc Saandro Juccá INTRODUÇÃO..................................................................................................................................................................6 ASSEMBLY X LINGUAGEM C.........................................................................................................................................................6 VANTAGENS X DESVANTAGENS DA LINGUAGEM C PARA MICROCONTROLADORES..............................8 ARQUITETURAS DOS MICROCONTROLADORES..............................................................................................................8 O CONTADOR DE PROGRAMA (PC).........................................................................................................................................9 BARRAMENTOS.....................................................................................................................................................................................9 A PILHA (STACK)..............................................................................................................................................................................10 CICLO DE MÁQUINA.......................................................................................................................................................................10 MATRIZ DE CONTATOS OU PROTOBOARD.....................................................................................................................11 RESISTORES........................................................................................................................................................................................12 CAPACITORES.....................................................................................................................................................................................13 FONTES DE ALIMENTAÇÃO........................................................................................................................................................15 PROTOCOLO DE COMUNICAÇÃO USB.................................................................................................................................16 MÉTODOS DE COMUNICAÇÃO USB......................................................................................................................................16 FERRAMENTA DE GRAVAÇÃO VIA USB........................................................................................................18 2.1 GRAVAÇÃO DE MICROCONTROLADORES........................................................................................................19 2.2 GRAVANDO O MICROCONTROLADOR VIA USB NO WINDOWS.........................................................24 2.3 GRAVAÇÃO WIRELESS DE MICROCONTROLADORES...............................................................................27 2.4 SISTEMA DUAL CLOCK.................................................................................................................................................35 2.5 EMULAÇÃO DE COMUNICAÇÃO SERIAL NO WINDOWS..........................................................................35 2.6 GRAVANDO O MICROCONTROLADOR VIA USB NO LINUX...................................................................42 2.7 GRAVANDO O PIC VIA USB PELO TERMINAL DO LINUX OU MAC OSX.........................................43 2.8 SISTEMA DUAL CLOCK.................................................................................................................................................45 2.9 EMULAÇÃO DE COMUNICAÇÃO SERIAL NO LINUX....................................................................................45 2.10 PROGRAMA COM INTERRUPÇÃO EXTERNA POR BOTÃO E DO TIMER 1.....................................49 2.11 OBTENÇÃO DE UM VOLTÍMETRO ATRAVÉS DO CONVERSOR AD COM A VARIAÇÃO DE UM POTENCIÔMETRO............................................................................................................................................................................50 2.12 CIRCUITO COM84 PARA GRAVAÇÃO DO gerenciador.hex.....................................................................51 PERIFÉRICOS INTERNOS DO MICROCONTROLADOR.........................................................................53 3.1 CONVERSOR A/D.............................................................................................................................................................53 3.1.1 AJUSTE DE RESOLUÇÃO DO SENSOR E DO CONVERSOR AD DE 8 BITS.....................................54 3.1.2 AJUSTE DA TENSÃO DE FUNDO DE ESCALA COM AMPOP....................................................................54 3.1.3 AJUSTE DA TENSÃO DE REFERÊNCIA COM POTENCIÔMETRO..........................................................55 3.1.4 CONVERSOR AD DE 10 BITS....................................................................................................................................55 3.1.5 OBTENÇÃO DE UM VOLTÍMETRO ATRAVÉS DO CONVERSOR AD COM A VARIAÇÃO DE UM POTENCIÔMETRO............................................................................................................................................................................56 3.1.6 LEITURA DE TEMPERATURA COM O LM35 ATRAVÉS DO CONVERSOR AD................................57 3.1.7 TERMISTOR.........................................................................................................................................................................58 3.2 MEMÓRIAS DO MICROCONTROLADOR.............................................................................................................59 3.2.1 MEMÓRIA DE PROGRAMA..........................................................................................................................................59 3.2.2 MEMÓRIA DE INSTRUÇÕES......................................................................................................................................59 3.2.3 MEMÓRIA EEPROM INTERNA...................................................................................................................................60 3.2.4 MEMÓRIA DE DADOS (RAM)....................................................................................................................................60 3.2.5 EXEMPLO DE APLICAÇÃO...........................................................................................................................................61 3.2.5.1 CONTROLE DE ACESSO COM TECLADO MATRICIAL...........................................................................61 3.3 MODULAÇÃO POR LARGURA DE PULSO PELO CCP....................................................................................65 CONTROLE PWM POR SOFTWARE DE VELOCIDADE DE UM MOTOR CC......................................................67 [2] INTERRUPÇÕES E TEMPORIZADORES.........................................................................................................68 INTERRUPÇÕES.................................................................................................................................................................................68 INTERRUPÇÕES EXTERNAS.......................................................................................................................................................69 INTERRUPÇÃO DOS TEMPORIZADORES...........................................................................................................................70 MULTIPLEXAÇÃO POR INTERRUPÇÃO DE TEMPORIZADORES............................................................................72 EMULAÇÃO DE PORTAS LÓGICAS...................................................................................................................73 5.1 INSTRUÇÕES LÓGICAS PARA TESTES CONDICIONAIS DE NÚMEROS..........................................74 5.2 INSTRUÇÕES LÓGICAS BOOLANAS BIT A BIT..............................................................................................74 5.3 EMULAÇÃO DE DECODIFICADOR PARA DISPLAY DE 7 SEGMENTOS.............................................78 5.4 MULTIPLEXAÇÃO COM DISPLAYS DE 7 SEGMENTOS...............................................................................84 COMUNICAÇÃO SERIAL EIA/RS-232............................................................................................................86 6.1 CÓDIGO ASCII...................................................................................................................................................................88 6.2 INTERFACE USART DO MICROCONTROLADOR............................................................................................88 6.3 COMUNICAÇÃO SERIAL EIA/RS-485....................................................................................................................90 ACIONAMENTO DE MOTORES MICROCONTROLADOS........................................................................90 ACIONAMENTO DE MOTORES CC DE BAIXA TENSÃO..............................................................................................91 MOTORES ELÉTRICOS UTILIZADOS EM AUTOMÓVEIS...........................................................................................91 COROA E O PARAFUSO COM ROSCA SEM-FIM..............................................................................................................93 CHAVEAMENTO DE MOTORES CC COM TRANSISTORES MOSFET....................................................................94 EXEMPLO: SEGUIDOR ÓTICO DE LABIRINTO................................................................................................................95 ESTABILIDADE DO CONTROLE DE MOVIMENTO.........................................................................................................95 PONTE H................................................................................................................................................................................................99 DRIVER PONTE H L293D.............................................................................................................................................................99 SOLENÓIDES E RELÉS.................................................................................................................................................................100 DRIVER DE POTÊNCIA ULN2803..........................................................................................................................................102 PONTE H COM MICRORELÉS...................................................................................................................................................103 ACIONAMENTO DE MOTORES DE PASSO.......................................................................................................................103 MOTORES DE PASSO UNIPOLARES....................................................................................................................................104 MODOS DE OPERAÇÃO DE UM MOTOR DE PASSO UNIPOLAR.........................................................................105 ACIONAMENTO BIDIRECIONAL DE DOIS MOTORES DE PASSO......................................................................106 SERVO-MOTORES...........................................................................................................................................................................106 FOTOACOPLADORES E SENSORES INFRAVERMELHOS....................................................................109 TRANSMISSOR E RECEPTOR IR..........................................................................................................................................110 AUTOMAÇÃO E DOMÓTICA COM CONTROLE REMOTO UNIVERSAL.............................................................111 CODIFICAÇÃO DE RECEPTOR INFRAVERMELHO UTILIZANDO A NORMA RC5.......................................114 ACIONAMENTO DE CARGAS CA COM TRIAC................................................................................................................118 TRIACS E RELÉS DE ESTADO SÓLIDO..............................................................................................................................118 DIMMER ANALÓGICO...................................................................................................................................................................118 CONTROLE DIGITAL DE DISPARO DE UM TRIAC......................................................................................................119 DIMMER DIGITAL COM CONTROLE REMOTO IR........................................................................................................124 LCD (DISPLAY DE CRISTAL LÍQUIDO)......................................................................................................128 EXEMPLO: CONTROLE DE TENSÃO DE UMA SOLDA CAPACITIVA COM LCD...........................................131 MODELAGEM DE SINAIS DE SENSORES...................................................................................................134 EXEMPLO: MODELAGEM DE UM LUXÍMETRO MICROCONTROLADO COM LDR......................................134 SUPERVISÓRIO................................................................................................................................................................................137 INTERFACE I2C.......................................................................................................................................................141 REGRAS PARA TRANSFERÊNCIA DE DADOS.................................................................................................................142 MEMÓRIA EEPROM EXTERNA I2C.........................................................................................................................................145 RTC (RELÓGIO EM TEMPO REAL)................................................................................................................147 EXEMPLO: PROTÓTIPO DATALOGGER USB DE BAIXO CUSTO.........................................................................151 TRANSMISSÃO DE DADOS VIA GSM..........................................................................................................157 COMANDOS AT PARA ENVIAR MENSAGENS SMS DE UM COMPUTADOR PARA UM CELULAR OU MODEM GSM.....................................................................................................................................................................................157 COMANDOS AT PARA RECEBER MENSAGENS SMS EM UM COMPUTADOR ENVIADAS POR UM CELULAR OU MODEM GSM.......................................................................................................................................................158 O PROTOCOLO MODBUS EMBARCADO.....................................................................................................161 MODELO DE COMUNICAÇÃO..................................................................................................................................................161 DETECÇÃO DE ERROS.................................................................................................................................................................162 MODOS DE TRANSMISSÃO......................................................................................................................................................162 INTRODUÇÃO À SISTEMAS OPERACIONAIS EM TEMPO REAL (RTOS)...................................167 MÁQUINAS DE ESTADO..............................................................................................................................................................169 UTILIZANDO O COPILADOR C18 E A IDE MPLABX MULTIPLATAFORMA COM FUNÇÕES EM PORTUGUÊS.....................................................................................................................................................171 FUNÇÕES EM PORTUGUÊS.......................................................................................................................................................172 FUNÇÕES BÁSICAS DA APLICAÇÃO DO USUÁRIO.....................................................................................................172 FUNÇÕES DO CONVERSOR ANALÓGICO DIGITAL (A/D)......................................................................................177 FUNÇÕES DA COMUNICAÇÃO SERIAL RS-232.............................................................................................................178 EXEMPLOS DE PROGRAMAS....................................................................................................................................................179 APÊNDICE I: CABEÇALHOS DA FERRAMENTA PARA DIVERSOS COMPILADORES............186 CCS C Compiler................................................................................................................................................................................186 C18 compiler......................................................................................................................................................................................186 SDCC......................................................................................................................................................................................................188 MikroC....................................................................................................................................................................................................189 Hi-Tech C Compiler........................................................................................................................................................................190 Microchip ASM compiler..............................................................................................................................................................190 Dedico este trabalho a Deus e à minha família. Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá INTRODUÇÃO Um microcontrolador é um sistema computacional completo, no qual estão incluídos internamente uma CPU (Central Processor Unit), memórias RAM (dados), flash (programa) e E2PROM, pinos de I/O (Input/Output), além de outros periféricos internos, tais como, osciladores, canal USB, interface serial assíncrona USART, módulos de temporização 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 América), possui uma boa diversidade de recursos, capacidades de processamento, custo e flexibilidade de aplicações. ASSEMBLY X LINGUAGEM C A principal diferença entre uma linguagem montada (como assembly) e a linguagem de programação 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 compilação é um processo mais complexo do que a montagem. Na montagem, uma linha de instrução é traduzida para uma instrução em código de máquina. Já em uma linguagem de programação, não existem linhas de instrução, e sim estruturas de linguagem e expressões. Uma estrutura pode ser condicional, incondicional, de repetição, etc... As expressões podem envolver operandos e operadores mais complexos. Neste caso, geralmente, a locação dos registros de dados da RAM é feita pelo próprio compilador. Por isso, existe a preocupação, por paret do compilador, de demonstrar, após a compilação, o percentual de memória RAM ocupado, pois neste caso é relevante, tendo em vista que cada variável pode ocupar até 8 bytes (tipo double). Para edição e montagem (geração do código HEX) de um programa em assembly, os softwares mais utilizados são o MPASMWIN (mais simples) e o MPLAB. Para edição e compilação em linguagem C (geração do código HEX), o programa mais utilizado é o PIC C Compiler CCS®. Os microcontroladores PIC possuem apenas 35 instruções em assembly para a família de 12 bits (PIC12) e 14 bits (PIC16), descritas nas tabelas abaixo, e 77 instruções para a família de 16 bits (PIC18). A tabela abaixo mostra algumas instruções em assembly. [6] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá Figura 1. 1: Instruções em assembly. Como pode ser visto, a família PIC16F (14 bits com aproximadamente 35 instruções) não possui uma instrução em assembly que realize multiplicação ou divisão de dois operandos, o que curiosamente é presente na linguagem assembly da família MCS51 (256 instruções que satisfazem a maioria das aplicações industriais). Portanto, para realizar uma multiplicação, é necessário realizar somas sucessivas, ou seja, em vez de multiplicar uma variável por outra, realizar somas de uma variável em uma terceira área de memória, tantas vezes quando for o valor da segunda variável. (X * 5 = X + X + X + X + X). Mas em linguagem C é possível se utilizar o operador de multiplicação (*), de forma simples e prática. Ao compilar, a linguagem gerada irá converter a multiplicação em somas sucessivas sem que o programador se preocupe com isso. [7] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá VANTAGENS X DESVANTAGENS MICROCONTROLADORES DA LINGUAGEM C PARA - O compilador C irá realizar o processo de tradução, permitindo uma programação mais amigável e mais fácil para desenvolvimento de aplicações mais complexas como, por exemplo, uso do canal USB e aplicações com o protocolo I2C. - A linguagem C permite maior portabilidade, uma vez que um mesmo programa pode ser recompilado para um microcontrolador diferente, com o mínimo de alterações, ao contrário do ASSEMBLY, onde as instruções mudam muito entre os diversos modelos de microcontroladores existentes como PIC e 8051. - Em C para microcontroladores PIC, não é necessário se preocupar com a mudança 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 próprio compilador através das bibliotecas. - É possível 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 compilação em C é que o código gerado, muitas vezes, é maior do que um código gerado por um montador (assembler), ocupando uma memória maior de programa e também uma memória maior de dados. No entanto, para a maioria das aplicações sugeridas na área de automação industrial, a linguagem C para PIC se mostra a mais adequada, tendo em vista que a memória de programa tem espaço suficiente para estas aplicações. - Outra desvantagem é que o programador não é “forçado” a conhecer as características internas do hardware, já que o mesmo se acostuma a trabalhar em alto nível, o que compromete a eficiência do programa e também o uso da capacidade de todos os periféricos internos do microcontrolador. Isso provoca, em alguns casos, o aumento do custo do sistema embarcado projetado com a aquisição de novos periféricos externos. ARQUITETURAS DOS MICROCONTROLADORES A arquitetura de um sistema digital define quem são e como as partes que compõe o sistema estão interligadas. As duas arquiteturas mais comuns para sistemas computacionais digitais são as seguintes: - Arquitetura de Von Neuman: A Unidade Central de Processamento é interligada à memória por um único barramento (bus). O sistema é composto por uma única memória onde são armazenados dados e instruções; - Arquitetura de Harvard: A Unidade Central de Processamento é interligada a memória de dados e a memória de programa por barramentos diferentes, de dados e de endereço. O PIC possui arquitetura Harvard com tecnologia RISC, que significa Reduced Instruction Set Computer (Computador com Conjunto de Instruções Reduzido). O barramento de dados é de 8 bits e o de endereço pode variar de 13 a 21 bits dependendo do modelo. Este [8] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá tipo de arquitetura permite que, enquanto uma instrução é executada, uma outra seja “buscada” na memória, ou seja, um PIPELINE (sobreposição), o que torna o processamento mais rápido. O CONTADOR DE PROGRAMA (PC) O contador de programa é responsável de indicar o endereço da memória de programa para que seu conteúdo seja transportado para a CPU para ser executado. Na família PIC16F ele contém normalmente 13 bits, por isso, pode endereçar os 8K words de 14 bits (o PIC16F877A possui exatamente 8K words de 14 bits, ou seja, 14 Kbytes de memória de programa). A família 18F ele possui normalmente 21 bits e é capaz e endereçar até 2 Megas words de 16 bits (o PIC18F2550 possui 16K words de 16 bits, ou seja, 32 Kbytes de memória de programa). Cada Word de 14 ou 16 bits pode conter um código de operação (opcode) com a instrução e um byte de dado. BARRAMENTOS Um barramento é um conjunto de fios que transportam informações com um propósito comum. A CPU pode acessar três barramentos: o de endereço, o de dados e o de controle. Como foi visto, cada instrução possui duas fases distintas: o ciclo de busca, quando a CPU coloca o conteúdo do PC no barramento de endereço e o conteúdo da posição de memória é colocado no Registro de instrução da CPU, e o ciclo de execução, quando a CPU executa o conteúdo colocado no registro de instrução e coloca-o na memória de dados pelo barramento de dados. Isso significa que quando a operação do microcontrolador é iniciada ou resetada, o PC é carregado com o endereço 0000h da memória de programa. Figura 1. 2: Memórias. As instruções de um programa são gravadas em linguagem de máquina hexadecimal na memória de programa flash (ROM). No início da operação do microcontrolador, o contador de programa (PC) indica o endereço da primeira instrução da memória de programa, esta instrução é carregada, através do barramento de dados, no Registro de Instrução da CPU. Um opcode (código de instrução), gerado na compilação em hexadecimal, contém uma instrução e um operando. No processamento, a CPU compara o código da instrução [9] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá alocada no registro de instrução com o Set de Instruções do modelo fabricado e executa a função correspondente. Após o processamento, o operando dessa instrução indica para a CPU qual a posição da memória de dados que deve ser acessada e, através do barramento de controle, a CPU comanda a leitura ou a escrita nesta posição. Após o processamento de uma instrução, o PC é incrementado para indicar o endereço do próximo código de instrução (opcode), da memória de programa, que deve ser carregado no registro de instrução. A PILHA (STACK) A pilha é um local da RAM ( no PIC18F2550 é localizada no final dos Registros de Função Especial entre FFDh e FFFh) onde é guardado o endereço da memória de programa antes de ser executado um pulo ou uma chamada de função localizada em outra posição de memória. CICLO DE MÁQUINA O oscilador externo (geralmente um cristal) ou o interno (circuito RC) é usado para fornecer um sinal de clock ao microcontrolador. O clock é necessário para que o microcontrolador possa executar as instruções de um programa. Nos microcontroladores PIC, um ciclo de máquina (CM) possui quatro fases de clock que são Q1, Q2, Q3 e Q4. Dessa forma, para um clock externo de 4MHz, temos um ciclo de máquina (CM=4 x 1/F) igual a 1μs. Figura 1. 3: Ciclo de máquina. O Contador de Programa (PC) é incrementado automaticamente na fase Q1 do ciclo de máquina e a instrução seguinte é resgatada da memória de programa e armazenada no registro de instruções da CPU no ciclo Q4. Ela é decoficada e executada no próximo ciclo, no intervalo de Q1 e Q4. Essa característica de buscar a informação em um ciclo de máquina e executá-la no próximo, ao mesmo tempo em que outra instrução é “buscada”, é chamada de PIPELINE (sobreposição). Ela permite que quase todas as instruções sejam executadas em apenas um ciclo de máquina, gastando assim 1 μs (para um clock de 4 [ 10 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá MHz) e tornando o sistema s mu uito mais rrápido. As únicas exe eções refeerem-se às instruçõess m “saltos” no contador de prog grama, com mo chamadas de funnções em outro loca al que geram da memórria de programa e os retornos d dessas funções. MATR RIZ DE CO ONTATOS OU PROT TOBOARD D Para d desenvolve er os proje etos e exeercícos pro opostos nessa apostiila será ne ecessário a uilização d de uma Ma atriz de Con ntatos (ou Protoboarrd em inglê ês), mostraada na figu ura abaixo, que é uma placa co om diverso os furos e conexões condutora as para moontagem de d circuitoss eletrônicoss. A grand de vantage em do Prot otoboard na a montage em de circcuitos eletrrônicos é a facilidade de inserção de comp ponentes (n não necesssita soldagem). Figura 1 1. 4: Prottoboard. Na superfície de uma matriz m de ccontatos há uma basse de plásstico em qu ue existem m centenas de orifício os onde são s encaixxados os componen ntes ou taambém po or ligaçõess e inferior são insta alados con ntatos mettálicos que interliga a mediante fios. Em sua parte eletricame ente os com mponentess inseridos na placa que q são org ganizados em coluna as e canais. De cada la ado da pla aca, ao lon ngo de seu u comprime ento, há duas colunaas complettas. Há um m espaço livvre no meiio da placa a e de cad da lado de esse espaç ço há váriios gruposs de canaiss horizontaiss (pequena as fileiras)), cada um m com 05 orifícios de d acordo como é ilu ustrado na a figura abaixo. [ 11 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Fig gura 1. 5: Contatoss internos s de uma protoboa ard. Em alguns po ontos do circuito é neecessário limitar a in ntensidade da corrente elétrica. Para fazerr isso utilizzamos um componen , nte chama ado resisto or. Quanto maior a resistência r menor é a corrente elétrica e que passa nu um condutor. RESIS STORES Os resistores geralmentte são feito os de carbo ono. Para identificar qual a ressistência de e um resisto or específicco, comparramos ele ccom a segu uinte tabela: [ 12 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 1. 1 6: Códiigo de corres de res sistores. CAPACITORES S Cap pacitor ou condensador é um compone ente que armazena a energia num campo o elétrico. co onsistem em e dois ele etrodos ou placas que e armazen nam cargass opostas. Estas duass placas são o condutorras e são separadass por um isolante ou o por um m dielétrico o. Eles são o utilizados desde armazenar a bits naas memórrias volátteis dinâm micas (DR RAM) doss computado ores, até corrigir c o fa ator de pottência de indústrias fornecendo f o reatância a capacitiva a para comp pensar a re eatância in ndutiva pro ovocada po or bobinas e motoress elétricos de grande e porte. unção maiis comum é filtrar ru uídos em circuitor c ellétricos e eestabilizar as fontes, A fu absorvend do os picoss e preench hendo os vvales de te ensão. Os capacitorees descarre egados são o [ 13 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá um curto e carregad dos abrem o circuito,, por isso são utilizados tambéém para isolar fontess CC. Figura 1. 7: Form ma de on nda de cap pacitor. Os capacitore es podem ser s carregaados e desscarregado os muito raapidamentte, por isso o são utilza ados tamb bém no fllash eletrô ônico em uma câm mera fotoggráfica, on nde pilhass carregam o capacito or do flash h durante vários seg gundos, e então o ccapacitor descarrega d a toda a carga no bu ulbo do flash quase que instan ntaneamen nte geranddo o alto brilho. b Isto o pode torna ar um cap pacitor gran nde e carrregado exttremamentte perigosoo. Eles são o utilizadoss também e em paralelo com mo otores eléttricos para a fornecer energia ppara que as a bobinass energizada as possam vencer a inércia i quaando os mo otores são ligados. As Unidades de Medida a de capaccitância são Farad (F F), Microfaarad (μF), Nanofarad d (nF) e Piccofarad (pF F). Os capacitores m mais comun ns são os eletrolíticoos, lstradoss na figura a abaixo, oss cerâmicoss e os de poliéster. p Figurra 1. 8: Ex xemplos de d Capacitores. A fig gura abaixxo mostra a identificaação de cap pacitores cerâmicos. c Figura 1. 9: Cálculo d demonstra ativo de capacitân c ncia. gura abaixxo mostra a identificaação de cap pacitores de d poliésteer. A fig [ 14 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 1. 10: Código d de cores Capacitor C res Poliésster. FONT TES DE AL LIMENTAÇ ÇÃO As fontes mais comun ns em sisstemas em mbarcados com miccrocontrola adores são o baterias re ecarregáve eis ou conv versores CA A-CC como o carregado ores de cellulares. As baterias ou pilhass são dispo ositivos qu ue armazen nam energia químicaa e a torna a disponíve el na forma d de energia elétrica. A ccapacidade de armazzenamento o de energ gia de uma a bateria é medida através da a multiplicaçção da corrente de descarga d p pelo tempo o de autono omia, senddo dado em m ampére-hora (1 Ah h= 3600 Coulombs) C . Deve-se observar que, ao co ontrário daas bateriass primáriass (não recarrregáveis),, as baterias recarreegáveis não o podem ser s descarrregadas até a 0V poiss isto leva a ao final prematuro da d vida da bateria. Na N verdade e elas têm m um limite e até onde e podem serr descarreg gadas, cha amado de ttensão de corte. c Desc carregar a bateria ab baixo deste e limite redu uz a vida útil da bateria. As b baterias diitas 12V, por p exempllo, devem operar de 13,8V (teensão a ple ena carga), até 10,5V (tensão de e corte), quando 100 0% de sua capacidad de terá sidoo utilizada,, e é este o tempo que e deve ser medido co omo auton omia da ba ateria. Como o ccomportam mento das baterias n não é linear, isto é,, quando m maior a corrente de e descarga m menor será á a autono omia e a ccapacidade e, não é co orreto falarr em uma bateria de e 100Ah. De eve-se fala ar, por exe emplo, em uma bateria 100Ah padrão dee descarga a 20 horas, com tensã ão de corte e 10,5V. Esta bateriaa permitirá á descarga de 100 / 20 = 5A durante d 20 0 horas, qua ando a bateria irá atingir 10,5V V. Outtro fator im mportante é a temperratura de operação o da d bateria,, pois sua capacidade c e e vida útil dependem m dela. Usu ualmente aas informa ações são fornecidas f supondo T=25°C T ou u T=20°C, q que é a tem mperatura ideal para maximizarr a vida útiil. 1.12. RUÍDO (BOUNCIN B NG) E FILT TRO (DEB BOUNCIN NG) Em operaçõess de Liga/D Desliga e m mudança de nível lógico, surge um ruído (Bouncing g) na transição que, ca aso uma interrupção o esteja ha abilitada ou até messmo um co ontador de e evento, po ode provoccar várias interrupçõ ões ou contagens. Ass formas m mais comun ns de filtro o (Debounciing) são via software e, program mando um tempo t (em m torno de 100ms, de ependendo o [ 15 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá da chave) após as transições, de modo a eliminar o ruído antes de efetuar uma instrução, ou via hardware, utilizando um capacitor de filtro em paralelo com a chave. Figura 1. 11: Ruído. PROTOCOLO DE COMUNICAÇÃO USB A USB, sigla para Universal Serial Bus, é o padrão de interface para periféricos 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 periférico. Todas as transferências USB são administradas e iniciadas pelo host. Mesmo que um dispositivo queira enviar dados, é necessário que o host envie comandos específicos para recebê-los. A fase de preparação, conhecida como enumeração, acontece logo depois de quando o dispositivo USB é fisicamente conectado ao computador. Nesse momento, o sistema operacional realiza vários pedidos ao dispositivo para que as características de funcionamento sejam reconhecidas. O sistema operacional, com a obtida noção do periférico USB, atribui-lhe um endereço e seleciona a configuração mais apropriada de acordo com certos critérios. Com mensagens de confirmação do dispositivo indicando que essas duas últimas operações foram corretamente aceitas, a enumeração é finalizada e o sistema fica pronto para o uso. MÉTODOS DE COMUNICAÇÃO USB Os métodos mais comuns de comunicação USB, também utilizados pela ferramenta SanUSB, são: Human Interface Device (HID) - O dispositivo USB é reconhecido automaticamente pelo sistema operacional Windows@ ou linux como um Dispositivo de Interface Humana (HID), não sendo necessário a instalação de driver especiais para a aplicação. Este método apresenta velocidade de comunicação de até 64 kB/s e é utilizado pelo gerenciador de gravação da ferramenta SanUSB no linux. Mais detalhes na video-aula disponível em http://www.youtube.com/watch?v=h6Lw2qeWhlM . Communication Device Class (CDC) – Basicamente o driver emula uma porta COM, fazendo com que a comunicação entre o software e o firmware seja realizada como se [ 16 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá fosse uma a porta de comunicaçção serial padrão. É o método o mais simpples de co omunicação o bidireciona al com velo ocidade de e comunicaação é de até 115 kb bps, ou sejja, aproxim madamente e 14,4 kB/ss. Mais de etalhes em m uma ap plicação Windows@ W com prottocolo Mo odbus RTU U http://w www.youtu ube.com/ /watch?v v=KUd1Jk kwGJNk e em uuma apliicação de e comunicaçção bidirecio onal no Linuxx http://w www.youtu ube.com/ /watch?v v=cRW99T T_qa7o. Mass Storage Device (MSD) - Método customiza ado para dispositivos de e mento em m massa que q permitte alta velocidade de d comuni cação USB B, limitado o armazenam apenas pe ela própria a velocida ade do baarramento USB 2.0 (480 Mbpps). Este método é utilizado p por pen-drives, sccanners, cââmeras diigitais. Foii utilizado juntamen nte com a ferramenta a SanUSB para comunicação ccom softwa are de sup pervisão p rogramado o em Java. Mais hes na vide eo-aula m detalh dissponível em http://w www.youtu ube.com/ /watch?v v=Ak9RAl2YTr4. Como foi visto,, a comun nicação U USB é basseada em uma cenntral (hostt), onde o or enumerra os dispo ositivos US SB conectados a ele. Existem três grand des classess computado de dispositivos com mumente associados a a USB: dispositivos d s de interfface huma ana (HID), classe de dispositivo os de comu unicação ((CDC) e dispositivos de armazeenamento em massa a (MSD). Ca ada uma dessas classes já possui um m driver im mplementaado na maioria m doss sistemas o operaciona ais. Portantto, se ade quarmos o firmware e de nossoo dispositiv vo para ser compatíve el com uma a dessas classes, não o haverá ne ecessidade e de implem mentar um m driver. Figurra 1. 12: D Drivers e comunica ação. Noss sitemas operaciona o is Window ws@ e Linux x, o modo mais fácil de comun nicar com o PIC USB é o CDC, por uma razão sim mples, os programa as para PC Cs são ba aseados na a comunicaçção via porrta serial, o que torn na o proce esso ainda mais simpples. O método CDC C no Linux e o HID no n Window ws@ são naativos, ou seja, não é necessáário instala ar nenhum m driver no ssistema op peracional para p que o PC reconh heça o disp positivo. [ 17 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá FERRAMENTA DE GRAVAÇÃO VIA USB O sistema de desenvolvimento SanUSB é uma ferramenta composta de software e hardware básico da família PIC18Fxx5x com interface USB. Esta ferramenta livre se mostra eficiente no desenvolvimento rápido de projetos reais, pois não há necessidade de remover o microcontrolador para a atualização do firmware. Além disso, esta ferramenta se mostra eficaz no ensino e na difusão de microcontroladores, bem como em projetos de eletrônica e informática, pois todos os usuários podem desenvolver projetos reais no ambiente de ensino ou na própria residência sem a necessidade de um equipamento para gravação de microcontroladores. Além disso, o software de gravação de microcontroladores USB é multiplataforma, pois é executável no Windows@, Mac OSX e no Linux e também 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 específico para gravação de um programa no microcontrolador; conversor TTL - RS-232 para comunicação serial bidirecional, emulado via USB pelo protocolo CDC, que permite também a depuração do programa através da impressão via USB das variáveis do firmware; fonte de alimentação, já que a alimentação do PIC provém 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 alimentação externa. Conversor analógico-digital (AD) externo, tendo em vista que ele dispõe internamente de 10 ADs de 10 bits; software de simulação, considerando que a simulação do programa e do hardware podem ser feitas de forma rápida e eficaz no próprio circuito de desenvolvimento ou com um protoboard auxiliar. Além de todas estas vantagens, os laptops e alguns computadores atuais não apresentam mais interface de comunicação paralela e nem serial EIA/RS-232, somente USB. Como pode ser visto, esta ferramenta possibilita que a compilação, a gravação e a simulação real de um programa, como também a comunicação serial através da emulação de uma porta COM virtual, possam ser feitos de forma rápida e eficaz a partir do momento em o microcontrolador esteja conectado diretamente a um computador via USB. [ 18 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 2. 1: G Gravação do d PIC via a PC. Utilizando estta ferramenta, estud antes fora am três vezes conseccutivas cam mpeões da a Competiçã ão de Robó ótica do IF FCE (2007, 2008 e 20 009) na ca ategoria Loocalização, campeõess da Feira Brasileira de Ciências e Engeenharia (F FEBRACE09 9) da USPP em São o Paulo na a Categoria Engenhariia (2009), como tam mbém obtiv veram Prêm mio de Inoovação em m Aplicação o Tecnológicca na Ferria Explora a 2009 em m Medelin n na Colô ômbia e fforam Cam mpeões na a Categoria Supranive el do Foro Internacio nal de Cie encia e Ing geniería 20010 no Chile, terceiro o lugar em iinovação na n Semante ec 2011 do o IFCE e ca ampeões na n V Feira Estadual de d Ciênciass e Cultura d do Ceará na n categoriia robótica educacion nal em 201 11. 2.1 GRA AVAÇÃO DE MICRO OCONTRO OLADORE ES A trransferênccia de prog gramas pa ra os micrrocontrolad dores é noormalmente efetuada a através de e um hard dware de gravação específico o. Através desta ferrramenta, é possíve el efetuar a descarga de d program mas para o microcon ntrolador diretament d te de uma porta USB B er PC. de qualque Para que ttodas essas funcionalidades sejjam possív veis, é nece essário graavar, anterriormente e somente u uma vez, com c um grravador esspecífico pa ara PIC, o gerenciaddor de gravação pela a USB Geren nciador.he ex disponív vel na passta comple eta da ferramenta noo link abaixo, onde e também é possível baixar b perio odicamentte as atualiizações dessa ferram menta e a inclusão de e novos prog gramas: http://ww ww.4share ed.com/fiile/sIZwB BP4r/100 0727SanU USB.html Casso o compu utador ainda não o ttenha o ap plicativo Ja ava JRE ouu SDK insttalado para a suporte a programa as executá áveis deseenvolvidoss em Java a, baixe a Versão Windows@ W @ disponível em: http p://www w.4shared d.com/file e/WKDhQ QwZK/jre--6u21-Wiindows@-ou u através doo link: i586-s.httml http://w www.java..com/pt_BR/down nload/ma anual.jsp. Para a que os programas p s em C posssam ser gravados g no n microcoontrolador via USB, é necessário o compilá-los, ou se eja, transfo ormá-los em e linguag gem de m áquina he exadecimal. Existem diiversos com mpiladoress que podeem ser utillizados porr esta ferraamenta, entre eles o [ 19 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá SDCC, o C18, o Hi-Tech H e o CCS. D Devido à didática d da as funçõess e biblio otecas USB B os perifériccos e multtitasking, uum dos compiladoress disponíveiss para emulação serrial, diverso utilizados com bom rendimentto, além d do C18, co om exemplos de apliccação disp poníveis na a desenvolvim mento, é o CCS na vversão 3.24 45. Esta ve ersão funccional com bibliotecass pasta de d de suporte a USB B pod e ser obtida a atraavés do link: http://w www.4sha ared.com/ /file/Mo6 6sQJs2/10 00511Com mpilador. html . As vversões 4 deste com mpilador ap presentam m bugs em funções e aplicaçõe es, embora a tenham sid do testada as algumass versões e funcionarram satisfatoriamentee até a verrsão 4.084. Neste caso, é recom mendado criar, c paraa cada firm mware (pro ograma a ser comp pilado), um m novo sourc rce file. Casso grave no microcontrolado or o novo o gerencia ador de gravação pela USB B Gerenciado orPlugandP Play.hex, não esqueeça de collar o novo o arquivo cabeçalho SanUSB.h h dentro da a pasta ExxemploseB BibliotecasC CCS localizzada na pasta p instaalada do compilado c r (C:\Arquivvos de pro ogramas\PICC\Driverrs ). A re epresentaçã ão básica do circuitto SanUSB B montado e em protobo board é mosstrada a seeguir: Figura 2. 2: Esquemá ático de m montagem m da Ferra amenta pa ara 28 pin nos. Para um m microcontro olador de 40 4 pinos, o circuito é mostrado abaixo: [ 20 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 2. 3: Esquemático de m montagem m da ferramenta pa ara 40 pin nos. Os com mponentes básicos do o circuito ssão: 1m microcontro olador da família f PIC C USB (18F F2550, 18F F2455, 18FF4550, etc.); 1 crristal de 20 0MHz; 2 ca apacitores de 22pF; 2 ca apacitores de 1uF (um no pino o 14 Vusb e outro entre o +5V e o Gnd ) ; 3 le eds e 3 ressistores de 390 (só é necessário o um led co om resisto r no pino B7); B 1 re esistor de 2k2 2 e um botão b ou fiio para gra avação no pino 1; 1 diodo qualq quer entre o +5V e o o pino Vdd d; 1 Cabo USB qualquer. q Notte que, es ste sistem ma multip iplataform ma (Wind dows@, LLinux e Mac M OSX), ), compatív vel com o softwarre de gra avação HID HI USB da d Microcchip tamb bém para a Linux e Mac OSX X, pode e ser imp plementad do també ém em q qualquer placa de e desenvollvimento de micro ocontrola adores PIIC com interface in USB, pois utiliza o botão de reset, no pino 1, co omo botão de gravaçção via US SB. Ao connectar o ca abo USB e ontrolador, com o p pino 1 no Gnd (0V),, através ddo botão ou de um m alimentar o microco simples fio o, o micro ocontrolado or entra em m Estado para Grav vação via U USB (led no n pino B7 7 aceso) e q que, após o reset com m o pino 1 no Vcc (+ +5V através do resisttor fixo de 2K2 sem o jump j ), en ntra em Estado E pa ara Operaçção do programa p aplicativo (firmware e) que fo oi compilado o. a normalme nte quatro o fios, que são conecctados ao circuito do o O ccabo USB apresenta microcontrrolador no os pontos mostradoss na figurra acima, onde norm malmente, o fio Vccc (+5V) do ccabo USB é vermelho o, o Gnd ((Vusb-) é marrom m ou preto, o D D+ é azul ou verde e o D- é am marelo ou branco. b Notte que a fo onte de aliimentação do microccontroladorr nos pinoss 19 e 20 e dos barra amentos vermelho v ((+5V) e azzul (Gnd) do circuitoo provem da própria a porta USB do compu utador. Parra ligar o ccabo USB no n circuito é possível cortá-lo e conectá-lo o direto no protoboard rd, com fios rígidos soldados, como tam mbém é poossível con nectar sem m em um pro otoboard ou o numa p placa de circuito c imp presso, utiilizando um m conector cortá-lo, e [ 21 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá USB fêmea a. O diodo o de proteçção colocad do no pino o 20 entre o Vcc da USB e a alimentação o do microcontroladorr serve parra protegeer contra corrente c re eversa casso a tensão o da porta a USB esteja a polarizad da de forma a inversa. A fiigura abaixxo mostra a ferrameenta SanU USB monta ada em pro rotoboard seguindo s o circuito an nterior e a posição de d cada teerminal no conector USB a serr ligado no o PC. Cada a terminal é conecta ado diretamente no os pinos do microc controladorr pelos quatro q fioss correspond dentes do cado USB.. Figura 2.. 4: Esque ema monttado em protoboar p rd e conecctor USB.. É im mportante salientar que, q para o perfeito o funcionam mento da gravação via USB, o esta ferra circuito de amenta de eve conterr um cap pacitor de filtro enttre 0,1uf e 1uF na a alimentaçã ão que vem m da USB, ou seja, co olocado en ntre os pino os 20 (+5V V) e 19 (Gnd). Casso o sistem ma microco ontrolado sseja embarcado com mo, por exeemplo, um m robô, um m sistema de e aquisição o de dados ou um ccontrole de e acesso, ele e necesssita de uma fonte de e alimentaçã ão externa, que pode e ser uma bateria comum de 9V V ou um ccarregador de celular. A figura abaixo mosstra o PCB, disponíveel nos Arqu uivos do Grupo SanU USB, e o circuito para a esta ferram menta com m entrada para fontee de alimen ntação externa. Paraa quem de eseja obter o sistema pronto para um apre endizado m mais rápido o, é possív vel também m encomen ndar placass de circuito o impresso o da ferram menta San nUSB, com mo a foto da placa aabaixo, en ntrando em m contato co om o grupo o SanUSB através a do e-mail: sa anusb_laesse@yahoo. com.br . Figura a 2. 5: Esq quema mo ontado em m PCB. Se preferir co onfecciona ar a placa,, é possív vel também m imprimirr o PCB (em ( preto)) abaixo, em m folha ap propriada, corroer, ffurar (pontos marrons) e solddar os com mponentes. [ 22 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Mais detalhes em: www.4sha ared.com/ /get/ithq Lbiq/Faze endoPCBttermico.h html ou através a do o http://w video disponível em:: http://w www.youttube.com m/watch?v v=8NhNssNw5BfU. Figura 2. 6: PCB B da Ferra amenta Sa anUSB. Para a obter vários v programas-fo nte e víd deos deste e sistema livre de gravação, comunicaçção e alim mentação via USB, basta se e cadastra ar no gruupo de accesso livre e www.tiny yurl.com/ /SanUSB e clicar no o item Arqu uivos. Durrante a pro ogramação o do microccontrolador basta insserir, no in nicio do pro ograma em m C, a biblioteca cab beçalho SanUSB S (# #include <SanUSB.h < h>) contidda dentro da pasta a Exemplose eBibliotecasCCS e que q você j á adiciono ou dentro da Driverss localizada a na pasta a instalada d do compila ador ( C:\A Arquivos dee programa as\PICC\Drivers ). Essta bibliote eca contém m instruçõess do PIC1 18F2550 para p o sisstema operacional, configuraações de fusíveis e habilitação o do sistem ma Dual Clo ock, ou sejja, oscilado or RC interrno de 4 M Hz para CP PU e crista al oscilador e externo de e 20 MHz para gerrar a frequ uência de 48MHz daa comuniccação USB, através de e prescalerr multiplicador de freq quência. Como a frequê ência do oscilador interno é de 4 MHz, cadda increm mento doss temporizad dores corrresponde a um micro rossegundo o. O progrrama exem mplo1 abaixo comuta a um led con nectado no o pino B7 a cada 0,5 segundo. --------------------------------------------------------------------------------------------------------------------#include < <SanUSB.h h> void main(() { clock_int_4 4MHz();//F Função neccessária paara habilita ar o dual clock c (48M Hz para USB e 4MHzz para CPU) while (1) [ 23 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá { output_toggle(pin_B7); // comuta Led na função principal delay_ms(500); } } O programa pisca3 abaixo pisca três leds conectados nos pinos B5, B6 e B7. #include <SanUSB.h> main(){ clock_int_4MHz();//Função necessária para habilitar o dual clock (48MHz para USB e 4MHz para CPU) while (1) { output_high(pin_B5); // Pisca Led na função principal delay_ms(500); output_low(pin_B5); output_high(pin_B6); delay_ms(500); output_low(pin_B6); output_high(pin_B7); delay_ms(500); output_low(pin_B7); }} --------------------------------------------------------------------------------------------------------------- Os arquivos compilados .hex assim como os firmwares estão disponíveis em http://www.4shared.com/file/sIZwBP4r/100727SanUSB.html. 2.2 GRAVANDO O MICROCONTROLADOR VIA USB NO WINDOWS Para executar a gravação com a ferramenta SanUSB, é importante seguir os seguintes passos: 1. Baixe o a pasta da ferramenta de desenvolvimento SanUSB, para um diretório raiz C ou D, obtida no link http://www.4shared.com/file/sIZwBP4r/100727SanUSB.html. 2. Grave no microcontrolador, somente uma vez, com um gravador específico para PIC ou com um circuito simples de gravação ICSP mostrado nas próximas seções, o novo gerenciador de gravação pela USB GerenciadorPlugandPlay.hex disponível na pasta Gerenciador, compatível com os sistemas operacionais Windows@, Linux e Mac OSX. 3. Pressione o botão ou conecte o jump de gravação do pino 1 no Gnd para a transferência de programa do PC para o microcontrolador. 4. Conecte o cabo USB, entre o PIC e o PC, e solte o botão ou retire o jump. Se o circuito SanUSB estiver correto acenderá o led do pino B7. 5. Caso o computador ainda não o tenha o aplicativo Java JRE ou SDK instalado para suporte a programas executáveis desenvolvidos em Java, baixe a Versão Windows@ disponível em: http://www.4shared.com/file/WKDhQwZK/[email protected] ou através do link: [ 24 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá http://w www.java..com/pt_BR/down nload/ma anual.jsp e execute o aplicativo SanUSB B da pasta S SanUSBwin nPlugandPla ay. Surgiráá a seguintte tela: F Figura 2. 7: Interfa ace de gra avação do o microco ontrolado or via USB B. 6. Clique e em Abrirr e escolha o program ma .hex que q deseja gravar, co como por exemplo, e o programa compilado o exemplo o1.hex da pasta ExxemploseBiibliotecasSSanUSB e clique em m Gravar. Esste program ma pisca o led conecttado no pino B7; 7. Após a gravação do d program ma, lembree-se de soltar o botã ão ou retiraar o jump do pino de e gravação e clique em e Resetar. Pronto o program ma estará em operaçção. Para programar novamente e, repita os passos anteriores a partir do passo 3. Para prote eger o exe ecutável sa anusb de eexclusão do o anti-virus, como ppor exemplo, o AVG, basta ir em m Proteçã ãoResiden nte do antti-virus AVG G: [ 25 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Clicar em g gereciar exxecessões,, como na figura abaixo: Clicar em Gerenciar Exceções e adicionaar caminho o. Então in nserir o cam el minho do executáve que é em C:\Program Files\Sa anUSB ou em C:\Arq quivos de Programas P s\SanUSB e clicar em m OK. [ 26 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Pronto é isso. Para reinstalarr o executtável da subpasta s SanUSBwin S nPlugandPlay , basta a instalá-lo d de dentro do d arquivo o .zip ou .raar. 2.3 3 GRAV VAÇÃO WI IRELESS D DE MICRO OCONTRO OLADORE ES A g gravação wireless w descrita nestta apostila a pode ser feita com m modems Zigbee ou u Bluetooth. Para a grravação Zig gbee são u utlizados dois d módulos XBee® ® da Série 1 (S1). De e um lado, u um módulo é conecttado a um m PC coord denador co onectado aao PC via USB U do PC C através do o chip FTD DI FT232RL L ou atravvés de uma a porta serial real coom o MAX X-232 e, do o outro lado o da rede,, um módulo Zigbeee é conectado ao microcontro m olador do dispositivo o final. Esta a conexão o permite a program mação sem fio no mic crocontrolaador PIC. Programass disponíveiss em: http://www.4sshared.com m/get/aP17 7n4FT/sanu usbee.htm l Aba aixo uma illustração para p realizaar gravaçã ão de micro ocontroladdor de form ma wirelesss com tensã ão de alime entação de e 3,3V. [ 27 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 2. 8: Ilustra ação do ccircuito de e gravaçã ão wirelesss Zigbee. Para mais detalhes basta acompanhar o os vídeos Gravação sem fio dee microcon ntroladoress http://w www.youtu ube.com/ /watch?v v=_Pbq2e eYha_c e Gravaçção sem m fio de e microcontrroladores via Zigbee: http:/ //www.yo outube.co om/watch h?v=BlRjKbXpepg. Procedime ento para gravação g wireless: w 1- Circuitto básico o: Conecte e o módu lo Xbee® ao micro ocontroladoor da placca SanUSB B (www.tinyyurl.com/Sa anUSB), co om alimenttação entrre 3V e 3,6 6V e apenaas 4 fios: Vcc V (3,3V), Gnd, Tx e Rx, como o mostra a figura abaaixo. Na figura, o fio o vermelhoo é ligado ao pino 20 0 (Vcc) do m microcontrolador e ao a pino 1 ((Vcc) do modem m Zig gbee, o fioo azul é lig gado ao 19 9 (Gnd) do m microcontrrolador e ao a pino 10 (Gnd) do modem Zigbee, o fi o laranja é ligado ao o pino 18 (R Rx) do miccrocontrola ador e ao pino 2 (DOUT odem Zigbeee, e o fio amarelo é O ) do mo ligado ao 1 17 (Tx) do o microconttrolador e ao pino 3 (DIN) do modem m Zigbbee. 2- Config guração dos d Módu ulos: A grravação wireless w só vai aconttecer se os o móduloss Xbee® da a série 1 (ccoordenad dor e dispo ositivo final) estiverem configu rados com m o mesmo o baud rate do microccontroladorr (19200 b ps). Para o coordena ador, bastaa conectar, o módulo o coordenad dor ao micrrocontrolad dor, ver cirrcuito básico acima, gravar viaa USB e ex xaminar em m qual firmw ware (Conf nfigCoord96 600to19200 00.hex ou ConfigCoor C rd19200to1 o19200.hexx) o led no o pino B7 irá á piscar inttermitentemente. Se o led não piscar, provavelmennte existe um u erro na a [ 28 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá ligação do o circuito. Após A a con nfiguração, coloque o módulo Coordenado C or no conv versor USB-serial e conecte ao PC. P Faça postteriormente e o mesm mo para o módulo Dispositivo o final, g ravando o firmware e (ConfigDisspFinal9600 00to19200.h hex ou ConfigDi DispFinal192 200to19200 00.hex) e deixe-o o conectado o ao microccontrolador. Quando o led do pino p B7 estiver piscaando, signiffica que oss módulos e estão conecctados corretamente e estão ap ptos para gravação g w wireless. Figura a 2. 9: Grravação v ia USB de e Configuração wirreless. 3- Adap ptador W Wireless: Agora grave, novamentte via USB, o firmware e AdaptadorrSerial.hexx da pasta a Adaptad orWirelesss. Se, apó ós a gravaação do Adaptador A , apresentarr o erro Odd O addresss at begin inning of HEX H file errror, comoo na figura a abaixo, é necessário o gravar novamente n o gerencciador.hex, com qualquer gravvador espe ecifico (ver tutorial), e em segu uida, realizar novam mente a gravação viia USB doo firmware e aplicativo o AdaptadorrSerial.hex. Após a transferên t cia deste firmware, o microcoontrolador está apto o para grava ação wirele ess. [ 29 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figurra 2. 10: Gravação G o via USB de Adapttador wire eless. Ago ora basta acessar a pasta saanusbee pelo p Prompt do Wi ndows@ (Iniciar ( -> > Pesquisar -> Promp pt de Coma ando), com mo na figu ura abaixo, e digitar, r, como mo ostrado no o vídeo Gravvação sem m fio de microcontro m oladores via v Zigbee,, as linhass de coma ando, para a transferir os progra amas aplicativos.hex como o Exemplo1w wireless.heex contido o na pasta a sanusbee. Exe emplo: san nusbee Exeemplo1Wire eless.hex ––p COM2 F Figura 2. 11: Grava ação wire eless zigbe ee pelo prompt do o Window ws. A g gravação wireless s Bluetoo oth pode ser realiza ada com apenas um módulo o Bluetooth conectado o ao microccontrolado or, pois norrmalmente e no PC cooordenadorr, como em m laptops e desktops, já existe um u módulo o bluetooth h interno. A tensão ddo módulo o Bluetooth h [ 30 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá encapsulad do, mostra ado na figu ura abaixo,, suporta até a 6V, dife erentementte do módulo Xbee® ® que suporrta de 3,3V V. Dessa fo orma, pod de-se cone ectar o módulo Bluettooth diretamente ao o microcontrrolador alim mentado pela p tensão o da porta USB de 5V V. De um lado um u PC coo ordenador e, do outrro lado da rede, um módulo bluetooth b é conectado o ao microccontrolado or do dispo ositivo final. Esta co onexão perrmite a pro ogramação o sem fio no m microcontro lador PIIC. Os Programa as http://www w.4shared.com/get/a aP17n4FT//sanusbee..html. estão Neste N liink disponív íveis anexo: em http://sanusb-laese.w wix.com/ro obotica#!p produtos/productsstackergalleryyv20=1, em: pode ser adquirido o modem Bluetooth mostrado neste tutorial. Aba aixo uma illustração para p realizaar gravaçã ão de micro ocontroladdor de form ma wirelesss Bluetooth com tensã ão de alime entação dee 5V. Fig gura 2. 12 2: Ilustração do Ciircuito de e gravação o wirelesss Bluetoo oth. Para mais detalhes basta acompanhar o os vídeos Gravação sem fio de microcon ntroladores es http://w www.youtu ube.com/ /watch?v v=_Pbq2e eYha_c e Gravação G ssem fio (w wireless) de e microcontrroladores http:/ //www.yo outube.co om/watch h?v=0PcC CQtsO1Bw wg via a Bluetooth. Procedime ento para gravação w wireless: 1- Circuitto básico o: Conecte o módulo o bluetooth h ao micro ocontroladdor da placca SanUSB B (www.tinyyurl.com/Sa anUSB), co om alimen ntação entrre 3V e 6V V e apena s 4 fios: Vcc V (3,3V), Gnd, Tx e Rx, como mostra a figura f acim ma do circu uito. Na fig gura, o fio vvermelho é ligado ao o [ 31 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá pino 20 (V Vcc) do miicrocontrolador e ao pino Vcc do modem m bluetoothh, o fio azzul é ligado o ao 19 (Gnd) do micrrocontrolad dor e ao p pino Gnd do modem bluetooth,, o fio verd de é ligado o ao pino 18 8 (Rx) do o microcon ntrolador e ao pino Tx modem m bluetoothh, e o fio amarelo é ligado ao 1 17 (Tx) do o microconttrolador e ao pino Rx x do modem m bluetootth. 2- Parearr o mode em Blueto ooth: Apóss alimenta ar o modem Bluetoooth com 3,,3V ou 5V V, conectado o ao microccontroladorr, realizar o pareame ento com o PC indo eem: 2.1- Inicia ar -> Pain nel de con ntrole -> A Adicionar um u dispositivo de bluuetooth -> > linvor -> > senha pad drão: 1234;; 2.2- Após o paream mento, cliqu ue em Inicciar -> Pa ainel de co ontrole -> exibir imp pressoras e os. Irá aparrecer o mo odem pareaado, como o, por exem mplo, o linvvor. dispositivo h. F Figura 2. 13: 1 Pareamento do o modem bluetooth 1.3- Clicarr em cima,, por exem mplo, do m modem de linvor, e verificar v quual porta criada c pelo o modem Bluetooth, em e Hardwa are, que seerá utilizada a para a grravação wiireless. Figu ura 2. 14:: Verificaç ção da po orta seriall criada pe elo mode em blueto ooth. On número da porta Serrial Padrão o por Link Bluetooth (COM37) ppode ser modificada m , por exemp plo, para COM9 com mo neste tutorial, através do o Gerenciaador de Dispositivos, clicando co om o botão direito em e cima daa porta -> propriedad des -> Connfiguração de Porta > Avançad do -> Núm mero da Porrta COM. [ 32 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá 3- Config guração do d Módullo blueto ooth: A grravação wireless w só vai aconttecer se o módulo Bluetooth esstiver confiigurado co om o mesm mo baud ra ate do micrrocontrolad dor (19200 0 bps). Para a isto, basta conectarr, o módulo o bluetooth h ao micro ocontroladoor, ver circcuito básico o acima, gra avar via US SB o firmw ware Config figbluetotth h9600to192 200.hex e verificar se s o led no o pino B7 irá á piscar inttermitentemente. Se o led não piscar, provavelmennte existe um u erro na a ligação do circuito. Quando o led do pino p B7 esstiver piscaando, sign nifica que os móduloos estão conectados c s corretame ente e estão o aptos pa ara gravaçãão wirelesss. Figura a 2. 15: Gravação v via USB de Configu uração wiireless. 4- Adap ptador W Wireless: Agora grave, novamentte via USB, o firmware e AdaptadorrSerial.hexx da pasta a Adaptad orWirelesss. Se, apó ós a gravaação do Adaptador A , apresentarr o erro Odd O addresss at begin inning of HEX H file errror, comoo na figura a abaixo, é necessário o gravar novamente n o gerencciador.hex, com qualquer gravvador espe ecifico (ver tutorial), e em segu uida, realizar novam mente a gravação viia USB doo firmware e aplicativo o AdaptadorrSerial.hex. Após a transferên t cia deste firmware, o microcoontrolador está apto o para grava ação wirele ess. [ 33 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figurra 2. 16: Gravação G o via USB de Adapttador wire eless. Ago ora basta acessar a pasta saanusbee pelo p Prompt do Wi ndows@ (Iniciar ( -> > Pesquisar -> Promp pt de Coma ando), com mo na figu ura abaixo, e digitar, r, como mo ostrado no o vídeo PIC C wireless Zigbee programmin p ng II, as linhas de comandoo, para tra ansferir oss programass aplicativo os.hex com mo o Exemp plo1wirelesss.hex contido na pa sta sanusb bee. Exe emplo: san nusbee Exe emplo1Wirreless.hex –p COM9 Fig gura 2. 17 7: Gravaçã ão wirele ess blueto ooth pelo prompt d do Window ws. As vantagens do mo odem Bluetooth em relação ao o Zigbee, são s o preçoo e a disp ponibilidade e de mode ems Bluettooth já disponíveeis em vários v sisttemas coomputacion nais como o computado ores e ce elulares. A desvantaagem em relação ao a Zigbee é a distâ ância para a gravação d de microco ontroladore es máxima de 10 metros. [ 34 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá 2.4 4 SISTEMA DUAL L CLOCK Devvido à inccompatibilid dade entree as frequ uências ne ecessárias para a gravação g e emulação serial via a USB e a frequênccia padrão o utilizada pela CPU U, temporrizadores e interface I2C, esta fe erramenta adota o p princípio Dual D Clock, ou seja, uutiliza duass fontes dee clock, umaa para o caanal USB de d 48MHz, provenien nte do cristtal osciladoor externo de 20MHzz multiplicad da por um m prescale er interno, e outra para p o CP PU de 4 M MHz, prove eniente do o oscilador R RC interno de 4 MHz,, como é ilustrado na a figura abaixo. Fiigura 2. 18: 1 Comun nicação PIC P com PC P e via I2 C. Esse e princípio o de clock paralelo, rrealizado pela p instrução clock_ k_int_4MHz( z(), permitee que um da ado digitad do no tecla ado do com mputador, trafegue para p o miccrocontrola ador em 48 8 MHz via USB, depoiss para perifféricos com mo um reló ógio RTC ou o para a m memória EE EPROM em m 4 MHz via I2C e vice--versa. 2.5 5 EMULA AÇÃO DE COMUNIC CAÇÃO SE ERIAL NO O WINDOW WS do um méttodo de co omunicação o serial biddirecional através do o Nesste tópico é mostrad canal USB B do PIC18F2550. Uma dass formas mais simp ples, é attravés do protocolo o Communiccations Dev evices Class ss (CDC), qque emula uma porta COM RSS-232 virtu ual, atravéss do canal U USB 2.0. Dessa D form ma, é posssível se co omunicar com c caraccteres ASCII via USB B através de e qualquerr software monitor sserial RS-2 232 como o HyperT Terminal, o SIOW do o CCS® Com mpiler ou o ambiente e de prograamação De elphi®. O driver CDC C instalado o no PC e o programa aplicativo gravado no n PIC, co om a biblio oteca CDC (#includee <usb_san_cdc.h>), são os ressponsáveis por esta emulação e d da porta RS S-232 virtu ual através da USB. biblioteca CDC C para o program ma.c do microcontrollador está dentro da a pasta de e A b exemplos, a qual devve estar na a mesma p pasta onde e está o programa.c a ser comp pilado para a a emulaçã ão da com municação serial RS S-232. Alé ém disso, o program ma.c deve e inserir a biblioteca usb_san_ccdc.h, com mo mostra a o exemplo de leitura e escrrita em um m buffer da a EEPROM in nterna do microcontrrolador. Ass funções CDC C mais utilizadas u ccontidas na a biblioteca a usb_san_ccdc.h para comunicaçção com a COM virtu ual são: usb_cdc_ _putc() – o microcontrolador eenvia caraccteres ASC CII emuladoos via USB B. Ex.: prin ntf(usb_cd dc_putc, "\r\nEnder " reco para escrever: e "); usb_cdc_ _getc() – retém um caractere ASCII emu ulado pela USB. Ex.: dado o = usb_c cdc_getc((); //retém m um caractere na variável dadoo [ 35 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá gethex_usb() – retém um número hexadecimal digitado no teclado. Ex.: valor = gethex_usb();//retém um número hexadecimal na variável valor usb_cdc_kbhit( ) – Avisa com TRUE (1) se acabou de chegar um novo caractere no buffer de recepção 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 emulação da serial através da USB: --------------------------------------------------------------------------------------------------------------#include <SanUSB.h> #include <usb_san_cdc.h>// Biblioteca para comunicação 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 periférico com a usb do PC output_high(pin_b7); // Sinaliza comunicação USB Ok while (1) { printf(usb_cdc_putc, "\r\n\nEEPROM:\r\n"); // Display contém os primeiros 64 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); }} --------------------------------------------------------------------------------------------------------------Após gravação de um programa que utilize comunicação serial CDC no microcontrolador pelo SanUSB e resetar o microcontrolador, vá, se for o Windows 7, em propriedades do sistema -> Configurações avançadas do sistema -> Hardware -> Gerenciador de [ 36 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá dispositivos e clique com botão direito no driver CDC do microcontrolador e atualizar Driver, apontando para a pasta DriverCDCwinSerial. No Windows@ XP, após a gravação de um programa que utilize comunicação serial CDC no microcontrolador pelo SanUSB e resetar o microcontrolador, o sistema vai pedir a instalação do driver CDC (somente na primeira vez). Figura 2. 19: Instalação do driver CDC (1). Escolha a opção Instalar de uma lista ou local especifico (avançado). Após Avançar, selecione a opção Incluir este local na pesquisa e selecione a pasta DriverSanWinCDC, onde está o driver CDC. Figura 2. 20: Instalação do driver CDC (2). Após Avançar, clique em Continuar assim mesmo. [ 37 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá Figura 2. 21: Instalação do driver CDC (3). Aguarde enquanto o Driver CDC é instalado no Windows@. Figura 2. 22: Instalação do driver CDC (4). Clique em Concluir para terminar a instalação. [ 38 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá Figura 2. 23: Instalação 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. Figura 2. 24: Verificação 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 através da emulação serial via USB. [ 39 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá Figura 2. 25: Utilização da porta COM pelo CCS. Para utilizar uma função que necessite de atendimento imediato quando um caractere for digitado como, por exemplo o caractere L ou D, é necessário inserir no firmware do microcontrolador a condição para verificar de forma constante e reter o caractere emulado que chegou pela USB S (SB_cdc_kbhit( )) {dado=usb_cdc_getc();} no laço infinito da função 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 função 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 comunicação serial virtual BYTE comando; void main() { clock_int_4MHz();//Função necessária 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 periférico com USB do PC while (TRUE) { if (usb_cdc_kbhit( )) //avisa se chegou dados do PC [ 40 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá { //verifica a se tem um novo byte no b buffer de recepção, depois o kbhit é ze erado para a próximo byyte comando= =usb_cdc_g getc(); //sse chegou,, retém o caractere e comparra com ‘L’ ou ‘D’ em m ASCII if (comand do==’L’) {o output_hig gh(pin_b7); printf(usb_cdc_putc, “\r\nLedd Ligado\r\\n”);} if (comand do==’D’) {output_low { w(pin_b7);; printf(usb b_cdc_putc c, “\r\nLedd Desligado o\r\n”);} } gh(pin_B6)); // Pisca Led na fun nção principal output_hig delay_ms((500); output_low w(pin_B6);; delay_ms((500); }} --------------------------------------------------------------------------------------------------------------------- Figurra 2. 26: Visualizaç V ção de tex xtos via serial s emu ulada. Para a utilizar o programa a de comu unicação Java-SanUS SB para em mulação se erial virtua al entre o co omputadorr e o micro ocontrolado or, é necessário baix xá-lo atravvés do link k disponíve el em http://w www.4sha ared.com/ /file/1itVIIv9s/101 1009Softw wareComS Serial_Window.ht ml . Após execcutar o prrograma de comuniccação serial Java-Sa anUSB, verrifique a porta p COM M virtual gerrada (COM M3,COM4,COM11,etc. ) no Wind dows@, em m Painel dde Controle e\Todos oss Itens do Painel de e Controle\Sistema e altere no progra ama seriall Java- Sa anUSB em m os e depoiss clique em m Conectarr, como mo ostra a figu ura abaixo.. Dispositivo [ 41 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figurra 2. 27: Interface I e em Java de comunicação sserial. 2.6 6 GRAVA ANDO O MICROCO M ONTROLAD DOR VIA USB NO L LINUX Esta a aplicação o substitui a gravação o via USB pelo terminal do Linuux, pois é uma forma a mais simp ples e dire eta de gra avação. Co om apenass dois cliq ques no innstalador automático a o SanUSB.de eb é possíível instala ar este ap licativo em m qualquerr máquinaa com Linu ux (Ubuntu u 10.04, equ uivalente ou o posterio or). Depoiss de instala ado, a inte erface de ggravação é localizada a em Aplicattivos -> accessórios. Se você já te em o Java a instalado o (JRE ou SDK) baix xe o instalaador automático.deb b atualizado disponíveel no link: www.4sha ared.com/ /file/RN4 4xpF_T/sa anusb_Lin nux.html contido ta ambém na a http://w pasta gera al http:// /www.4sh hared.com m/file/sIZ ZwBP4r/100727Sa anUSB.httml. Se ainda não tem o Jav va (JRE ou u SDK), ba aixe o instalador SannUSB, já configurado c o Java a JRE e dispponível em: com o http://w www.4sha ared.com/ /file/3mh hWZS5g/s sanusb.httml . A ffigura abaiixo mostra a a interfaace gráfica a desenvolvida para gravação o direta de e microcontrroladores via v USB: [ 42 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá agem de programa F Figura 2. 28: 2 Mensa a gravado o. Nesste aplicatiivo, estão disponíve is botões para Abrirr o prograama em he exadecima al compilado o, para Grravar o prrograma h hexadecima al no micrrocontroladdor via USB e para a Resetar o microcontrolador no n intuito de colocá--lo em op peração. A interface apresenta a a gravar e resetar au utomaticam mente. ainda um botão para É im mportante salientar que q para u utilizar esta a ferramen nta no Linuux é necesssário estar logado com m permisssão para accessar a p porta USB como, c por exemplo, super-usu uário (sudo o su), e que para esstabelecer comunicaçção com o microcontrolador é necessá ário gravar anteriorme ente no microcontro m olador, som mente uma a vez, com m qualquerr gravadorr específico o para PIC, o gerencia ador de grravação peela USB Ge erenciadorrLinux.hex,, disponíve el na pasta a SanUSB ou u em http://www.4shared.ccom/file/ /HGrf9nD Dz/Gerencciador.htm ml . Após gravvar o GerenciadorLinux.hex co m um gravador convencional para PIC, coloque o circuito Sa anUSB em modo de gravação pela USB B (pino 1 ligado ao G Gnd (0V) através de e botão ou fio ) e con necte o ca abo USB d o circuito no PC. Se e o circuit ito SanUS SB estiver er correto, a acenderá á o led do pino B7. Pronto, o sistema s já está prepaarado para a gravar no o microcontrrolador, de d forma simples e direta, quantos programas p .hex voccê desejar utilizando a interface e USB. Para progrramar nova amente, basta press ionar o bo otão de gra avação no pino 1, de esconecte e conecte o cabo US SB de alim mentação, selecione o programa.hex d esejado em e Abrir e pressione o botão Grravar&Rese etar. 2.7 7 GRAVA ANDO O PIC P VIA U USB PELO TERMINA AL DO LIN NUX OU MAC M OSX [ 43 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Esta a aplicação o é realiza ada de forrma simple es em linha de comaando no terminal do o Mac OSX. Para abrirr o termina al é necesssário baixa ar e instala ar o softwaare Xcode.. No Linuxx, instale o san nusb.deb disponív ível em m http://w www.4sha ared.com/ /file/sIZw wBP4r/10 00727San nUSB.htm ml . Para inicia ar a gravação com linhas de com mando é im mportante seguir os sseguintes passos: 1. Grave no microco ontroladorr, somentee uma vezz, com um gravadorr específico o para PIC C com o cirrcuito simp ples de gravação C COM84 desscrito nestta apostilaa ou outro o gravador qualquer, o gerenciiador de gravação g p pela USB Gerenciado dor.hex, quue é multiplataformaa ac OSX e Windows@) W ). (Linux, Ma 2. Pelo Te erminal do o Linux ou Mac OSX X acesse on nde está o executávvel sanusb b, instalado o pelo arq quivo san nusb.deb, e no Mac OSX acessse a ppasta de arquivoss SanUSBMa acPlugandP Play, ond de está o execcutável sa anusb. M Mais dealhes em: http://www w.youtube e.com/watcch?v=rSg_ i3gHF3U . 3. Após e entrar na pasta do exectável sanusb, acesse infformações do conte eúdo deste e arquivo dig gitando: . / sanusb-h A figura abaixxo mostra o printscreeen de exe emplo de um u processso de acessso à pasta a e também do processso de grav vação pelo o terminal: Figu ura 2. 29: Acesso à pasta pe elo termin nal do LIN NUX. ntado, colo oque-o em modo de gravação g ((pino 1 liga ado ao Gnd d 4. Com o ccircuito SanUSB mon com botão o pressiona ado ou jum mp ) e coneecte o cabo o USB do circuito c no PC. 5. Para g gravar no microconttrolador, o firmware desejado, como o exemplo1.hex, deve e estar mesm mo diretório do executável sanusb, então o para a grravação viaa USB, digita-se: [ 44 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá . / sanusb –w exemplo1.he ex 6. Depois de gravar, remova o botão ou jjump de gravação, g então e resett digitando o: . / sanusb –r ou simplem mente: . / sanusb –w – exem plo1 –r Para a program mar novam mente, bassta coloca ar o jump p de gravvação, dessconecte e conecte o cabo USB de alimen ntação, e reepita os pa assos anteriores a paartir do passso 6. Se o ão for reco onecido, ffeche o te erminal, co onecte o m microcontrrolador em m microcontrrolador nã outra portta USB, ab bra um no ovo terminaal e repita a repita oss passos a nteriores a partir do o passo 3. 2.8 8 SISTEMA DUAL L CLOCK Devvido à inccompatibilid dade entree as frequ uências ne ecessárias para a gravação g e emulação serial via a USB e a frequênccia padrão o utilizada pela CPU U, temporrizadores e interface I2C, esta fe erramenta pode ado otar o princípio Duall Clock reaalizado pela a instrução o clock_int_4 4MHz(), ou u seja, utiliza duas ffontes de clock, uma a para o ccanal USB de 48MHz, provenientte do crista al oscilado or externo de 20MHz multiplicada por um m prescalerr interno, e outra para a o CPU de d 4 MHzz, provenieente do osscilador RC interno de 4 MHz, como é ilustrado n na figura abaixo. 3 Comun nicação PIC P com PC P e via I2 C. Fiigura 2. 30: Esse e princípio o de clock ck paralelo, permite que um dado digiitado no teclado t do o computado or, trafegu ue para o microcontr m rolador em 48 MHz via v USB, deepois para periféricoss como um relógio RTC ou para a memóriaa EEPROM em 4 MHzz via I2C e vice-versa. 2.9 9 EMULA AÇÃO DE COMUNIC CAÇÃO SE ERIAL NO O LINUX do um méttodo de co omunicação o serial biddirecional através do o Nesste tópico é mostrad canal USB B do PIC18F2550. Uma dass formas mais simp ples, é attravés do protocolo o Communiccations Dev evices Classs (CDC), quue é padrã ão no Linux x e que em mula uma porta COM M RS-232 virrtual com o microcontrolador, através do o canal US SB. Dessa forma, é possível se e comunicarr com cara acteres ASC CII via US SB através de qualqu uer softwarre monitorr serial RS-[ 45 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá 232 como o Cutecom, o minicom ou outros aplicativos com interface serial. A biblioteca CDC_ACM padrão no Linux e o programa aplicativo gravado no PIC com a biblioteca CDC (#include <usb_san_cdc.h>), são os responsáveis por esta emulação da porta RS-232 virtual através da USB. A emulação serial é muito utilizada também para “debugar”, ou seja, depurar as variáveis de um programa.c, imprimindo-as pela USB durante a execução real do programa. Dessa forma, o programador pode encontrar possíveis erros na programação do firmware. A biblioteca CDC (#include <usb_san_cdc.h>) está dentro da mesma pasta de ExemploseBibliotecas. Para a compilação de um programa aplicativo com emulação 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 função principal e comanda, via USB através emulação serial, o estado de outro led no pino B7 com as teclas L e D do teclado de um PC. As funções CDC mais utilizadas para comunicação com a COM virtual são: usb_cdc_putc() – o microcontrolador envia caracteres ASCII emulados via USB. Ex.: printf(usb_cdc_putc, "\r\nEndereco para escrever: "); usb_cdc_getc() – retém um caractere ASCII emulado pela USB. Ex.: dado = usb_cdc_getc(); //retém um caractere na variável dado gethex_usb() – retém um número hexadecimal digitado no teclado. Ex.: valor = gethex_usb();//retém um número hexadecimal na variável valor usb_cdc_kbhit( ) – Avisa com TRUE (1) se acabou de chegar um novo caractere no buffer de recepção USB do PIC. Ex.: if (usb_cdc_kbhit( )) {dado = usb_cdc_getc();} Outras funções do protocolo são: • 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 nãoremovido literalmente; • usb_detach(): Desconecta o dispositivo. Deve ser usada antes de sua remoção física do computador; • usb_enumerated(): Verifica se o dispositivo está pronto para a comunicação. #include <SanUSB.h> #include <usb_san_cdc.h>// Biblioteca para comunicação serial virtual via USB BYTE comando; main() { clock_int_4MHz();//Função necessária para habilitar o dual clock (48MHz para USB e 4MHz para CPU) [ 46 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá usb_cdc_init(); // Inicializa o protocolo CDC usb_init(); // Inicializa o protocolo USB usb_task(); // Une o periférico 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 recepção, depois o kbhit é zerado para próximo byte comando=usb_cdc_getc(); //se chegou, retém 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 Desigado!\r\n");} } output_high(pin_B6); // Pisca Led na função principal delay_ms(300); output_low(pin_B6); delay_ms(300); }} Este firmware realiza a comunicação serial virtual com o protocolo CDC inserido no firmware do microcontrolador através da biblioteca usb_san_cdc.h. Este protocolo é padrão no sistema operacional Linux. Após gravar o firmware via USB com o executável linux sanusb, instale o software de comunicação 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 informações podem ser obtidas no video: http://www.youtube.com/watch?v=cRW99T_qa7o . [ 47 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 2. 31: Cu uteCOM. É p possível também utilizar o pro ograma de e comunicação seriaal Java-SanUSB para a emulação serial virtu ual entre o computad dor e o miccrocontrolador. É p possível baixar esta ferramenta f a de comu unicação se erial atravéés do link disponíve el usb_10_a em http:://www.4 4shared.c com/file/ /5emc7kn nO/SerialJ Java-sanu all.html . Após cone ectar o miccrocontrola ador e abrrir o progra ama de co omunicaçãoo serial Jav va-SanUSB B em Aplicattivos -> Outros, O ap parecerá a porta serial virtual gerada g no Linux (tty yACM0) em m Dispositivo os. Para listar a portta serial viirtual gerad da, utilizan ndo o Term minal do Liinux, basta a digitar ls / /dev/ttyA ACM* . É possível p reealizar a co omunicação o depois dee clicar em m Conectar, como mosstra a figura abaixo. Fig gura 2. 32: Interfa ace de com municaçã ão serial em e Java p para LINU UX. [ 48 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá 2.10 PROGRAMA COM INTERRUPÇÃO EXTERNA POR BOTÃO 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()); } #int_ext void bot_ext() { for(x=0;x<5;x++) // pisca 5 vezes após o pino ser aterrado (botão 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 função principal delay_ms(500); output_low(pin_B6); delay_ms(500); }} [ 49 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá --------------------------------------------------------------------------------------------------------------------2.1 11 OBTEN NÇÃO DE UM VOLT TÍMETRO ATRAVÉS S DO CON NVERSOR R AD COM M A VARIA AÇÃO DE UM U POTEN NCIÔMET TRO ------------------------------------------------------------------------------------------------------------------------ #include < <SanUSB.h h> //Leiturra de tensãão em mV com variaçção de um m potenciôm metro #include < <usb_san_ _cdc.h>// Biblioteca B ppara comu unicação se erial virtuall int32 tensa sao; main() { 4MHz(); clock_int_4 usb_cdc_in init(); // In nicializa o protocolo p C CDC usb_init();; // Inicializ iza o protoc ocolo USB usb_task() (); // Une o periférico o com a usb sb do PC setup_adc_ c_ports(AN N0); //Hab bilita entradda analógicca - A0 setup_adcc(ADC_CLO OCK_INTER RNAL); while(1){ //ANALÓGI / ICO DIGITAL(1 10 bits) set_adc_cchannel(0);; // 5000 m mV 1023 3 delay_ms((10); // tensaoo read_ _adc() tensao= (5 (5000*(int3 32)read_ad dc())/1023; 3; printf (usb b_cdc_putcc,"\r\nA ten nsao e' = % %lu mV\r\n",tensao)); // Imprim me pela se erial virtuall output_hig gh(pin_b7)); delay_ms((500); output_low w(pin_b7);; delay_ms((500); }} Figura 2. 2 33: Uso o de poten nciômetro o no conv versor AD D do PIC. Para a obter no ovos progra amas e pro ojetos, bassta acessarr os arquivvos do grup po SanUSB B em www.tinyurl.com/SanU USB como também baixar b a ap postila com mpleta disp ponível em m TTP://www w.4shared.com/docu ument/Qst_ _pem-/100 0923Apostila_CPIC.httml . [ 50 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá 2.1 12 CIRCU UITO COM M84 PARA A GRAVAÇ ÇÃO DO ge erenciado or.hex a este circcuito simple es de gravvação só é necessário o 3 resistoores de 10k k, um cabo o Para serial DB9 9 (RS-232)) e uma fo onte exterrna de 5V,, que pode ser obti da da porrta USB. O circuito e a foto abaiixo mostram o esqueema simple es de ligaçã ão dos pinoos. F Figura 2. 34: Circu uito COM8 84 para gravação do d gerencciador.hex x Este circuito a partir da porta COM C DB9 p pode ser visualizado na figura aabaixo. ura 2. 35:: Esquema a de ligaç ção do conector se erial. Figu Estte circuito de gravaçção funcion na com o software PICPgm (ddetectado como JDM M Programm mer) ou com m WinPic (detectado ( M84 Progra ammer). E Este último o se mostra a como COM mais está ável, poiss após a detecçãão do microcontro m lador, é possível gravar o microcontrrolador, e mesmo o indican ndo ERRO OR: Prog gramming failed, o arquivo o gerenciado or.hex mostrou-se m gravado corretam mente para geren ciar grav vações no o microcontrrolador pella porta US SB nos sisttemas operracionais Windows@® W ®, Linux e Mac OSX. O ssoftware de d gravaçção do geerenciador..hex pode ser baixxado atrvé és do linkk, disponível em http:/ //www.4 4shared.co om/get/1 1uP85Xru u/winpicp prCOM84..html. [ 51 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 2. 2 36: Tela de conffiguração do softw ware de grravação. Apó ós a insta alação, execute o p programa. Na guia "Device, Config", escolha o microcontrrolador. Um ma vez qu ue o microccontrolado or é conecttado à port rta COM RS S-232 de 9 pinos do PC, vá para "Interrface", seleecione " COM84 prrogrammerr for seria al port", e pressione "Initialize"". Se o softtware disseer que a in nicialização o foi um êxxito "Succe ess", então o o program ma está pronto p parra gravar o gerencciador.hex no microocontrolado or. Para a gravação, selecione e em File e Load & Program mDevice e depois sselecione o arquivo o gerenciado or.hex. Co omo citado o anteriorm mente, messmo que, após a grravação e verificação o apareça “Programm med Failed d”, é prováável que o gerenciiador.hex tenha sido gravado o corretame ente. [ 52 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá Figura 2. 37: Tela de confirmação de reconhecimento do circuito. PERIFÉRICOS INTERNOS DO MICROCONTROLADOR 3.1 CONVERSOR A/D O objetivo do conversor analógico-digital (AD) é converter um sinal analógico, geralmente de 0 a 5V, em equivalentes digitais. Como pode ser visto, algumas configurações permitem ainda que os pinos A3 e A2 sejam usados como referência externa positiva e negativa, fazendo com que uma leitura seja feita em uma faixa de tensão mais restrita como, por exemplo, de 1 a 3 Volts. Figura 3. 1: Diagrama de blocos interno do conversor A/D. Em C, o conversor AD pode ser ajustado para resolução 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 resolução de 10 bits e tensão de referência padrão de 5V, o valor de cada bit será igual a 5/(210 - 1) = 4,8876 mV, ou seja, para um resultado igual a 100 (decimal), teremos uma tensão de 100* 4,8876 mV = 0,48876 V. Note que a tensão de referência padrão (Vref) depende da tensão de alimentação do PIC que normalmente é 5V. Se a tensão de alimentação for 4V, logo a tensão de referência (Vref) também será 4V. Para um conversor A/D com resolução de 10 bits e tensão de referência de 5V, o valor de cada bit será igual a 5/(28 - 1) = 19,6078 mV, ou seja, para um resultado igual a 100 (decimal), é necessário uma tensão 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), pressão (STRAIN-GAGE), tensão, corrente, humidade, etc.. [ 53 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá Figura 3. 2: Uso de periféricos no conversor A/D. Para utilizar este periférico interno, basta: setup_adc_ports (AN0_TO_AN2); setup_adc(ADC_CLOCK_INTERNAL ); //(Seleção dos pinos analógicos 18F2550) //(selecionar o clock interno) Veja a nomenclatura dos canais analógicos de cada modelo, dentro da biblioteca do CCS na pasta Device. Depois, no laço infinito, basta selecionar o canal para leitura, esperar um tempo para a seleção física e então 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 conversão A/D e guarda na variável valor 3.1.1 AJUSTE DE RESOLUÇÃO DO SENSOR E DO CONVERSOR AD DE 8 BITS O ajuste da resolução do conversor AD se dá aproximando a tensão de fundo de escala do sensor (VFS) à tensão de referencia do conversor (VREF). Para isso existem duas técnicas de ajuste por Hardware: Para este tópico é utilizado como exemplo de ajuste da resolução do conversor AD, o sensor de temperatura LM35 que fornece uma saída de tensão linear e proporcional com uma resolução de 10mV a cada °C. 3.1.2 AJUSTE DA TENSÃO DE FUNDO DE ESCALA COM AMPOP Para conversores AD de 8 bits e VREF de 5V, a resolução máxima é de 19,6mV (R= VREF / (2 -1). Dessa forma, como a Resolução do sensor é 10mV/°C (RS), é necessário aplicar um n [ 54 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá ajuste de resolução com um ganho na tensão de fundo de escala do sensor para que cada grau possa ser percebido pelo conversor do microcontrolador. A forma mais comum de ganho é a utilização de amplificadores operacionais não inversores. Veja mais detalhes no material de apoio no final dessa apostila. A tensão de fundo de escala (VFS) está relacionada à Temperatura Máxima desejada de medição (TMAX), onde VFS = RS(10mV/°C) * TMAX e o Ganho (G) de aproximação da tensão de fundo de escala (VFS) à tensão de referencia (VREF) é dado por G = VREF / VFS, ou seja, para uma Temperatura Máxima desejada de 100°C, o ganho deve ser aproximadamente 5. Figura 3. 3: AMP-OP não inversor. A aproximação da tensão de fundo de escala (VFS) à tensão de referencia (VREF) é realizada para diminuir a relevância de ruídos em determinadas faixas de temperatura. 3.1.3 AJUSTE DA TENSÃO DE REFERÊNCIA COM POTENCIÔMETRO Outra forma mais simples de ajuste por Hardware (aumento da resolução do conversor AD) é a aproximação da tensão de referencia (VREF) à tensão de fundo de escala (VFS) através da diminuição da tensão de referência (VREF) com o uso de um potenciômetro (divisor de tensão). Por exemplo, um conversor AD de 8 bits com uma tensão de referência (VREF) de 2,55V no pino A3, apresenta uma resolução de 10mV por bit (2,55/(28-1)), ou seja, a mesma sensibilidade do sensor LM35 de 10mV/°C . Percebe variação de cada °C. 3.1.4 CONVERSOR AD DE 10 BITS Para conversores de 10 bits, com maior resolução (4,89 mV), o ajuste (escalonamento) é realizado geralmente por software, em linguagem C, que possui um elevado desempenho em operações aritméticas. OBS.: O ganho de tensão de um circuito poderia ser simulado por software com os comandos: Int32 valorsensor= read_adc(); Int32 VFS = 4 * Valorsensor; A fórmula utilizada pelo programa no PIC para converter o valor de tensão fornecido pelo sensor LM35 em uma temperatura é: ANALÓGICO 5V = 5000mV DIGITAL 1023 -> [ 55 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá T(°C)* 10mV/°C -> (int32)read_adc() T (ºC) = 500 * (int32)read_adc()/1023 onde (int32)read_adc() é o valor digital obtido a partir da temperatura (T(ºC)) analógica medida. Esta variável é configurada com 32 bits (int32), porque ela recebe os valores dos cálculos intermediários e pode estourar se tiver menor número de bits, pois uma variável de 16 bits só suporta valores de até 65.535. A tensão de referência do conversor é 5V e como o conversor possui 10 bits de resolução, ele pode medir 1023 variações. 3.1.5 OBTENÇÃO DE UM VOLTÍMETRO ATRAVÉS DO CONVERSOR AD COM A VARIAÇÃO DE UM POTENCIÔMETRO --------------------------------------------------------------------------------------------------------------#include <SanUSB.h> //Leitura de tensão em mV com variação de um potenciômetro #include <usb_san_cdc.h>// Biblioteca para comunicação 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 periférico com a usb do PC setup_adc_ports(AN0); //Habilita entrada analógica - A0 setup_adc(ADC_CLOCK_INTERNAL); while(1){ //ANALÓGICO 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); }} --------------------------------------------------------------------------------------------------------------- [ 56 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura a 3. 4: Con nexão do potenciômetro no converso or A/D. 3.1.6 LEIITURA DE E TEMPER RATURA CO VÉS DO C ONVERSO OR AD OM O LM35 ATRAV --------------------------------------------------------------------------------------------------------------------#include < <SanUSB.h h> #include < <usb_san_ _cdc.h>// Biblioteca B p para comunicação se erial virtuall int16 temp peratura; main() { clock_int_4 4MHz(); usb_cdc_in nit(); // Inicializa o protocolo p C CDC usb_init();; // Inicializza o protoccolo USB usb_task()); // Une o periférico com a US SB do PC setup_adcc_ports(NA A0); //Habilita entrad da analógicca – A0 setup_adcc(ADC_CLO OCK_INTER RNAL); while(1){ set_adc_channel(0);; delay_ms((10); temperatu ura=430*re ead_adc()//1023; //V Vref = 4,,3V devido o à quedda no dio odo, então o (430*temp p) printf (usb b_cdc_putcc,”\r\nTemperatura d do LM35 = %lu C\r\n”,temperattura); gh(pin_b7)); // Pisca Led em o n operação normal output_hig delay_ms((500); output_low w(pin_b7);; delay_ms((500); }} --------------------------------------------------------------------------------------------------------------------- [ 57 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 3. 5: Le eitura de temperatura via monitor m se erial. 3.1.7 TER RMISTOR R Um termistor é um ma resistência variáável com a tempera atura. Na realidade e todas ass resistência as variam com a tem mperatura, só que oss termistorres são feiitos para terem t uma a grande va ariação com m a tempe eratura. A ligação do d termisto or ao micrrocontolado or é muito o simples, co omo mostrra a figura baixo. ura 3. 6: C Conexão do termis stor. Figu Convém le embrar que e a respostta de um teermistor não é linearr, como moostra a figu ura abaixo. Figu ura 3. 7: R Resposta do termis stor. LINEARIZ ZAÇÃO uito comum m de lineaarização do o termistorr é por moodalidade da tensão, Um forma mu onde um ttermistor NTC N é cone ectado em série com um resisto or normal formando um divisor de tensão. O circuito do diviso or contém m uma fontte de tensã ão de refeerência (Vrref) igual a [ 58 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá 2,5V. Isto tem o efeito de prod duzir uma ttensão na saída que seja linearr com a tem mperatura. or R25C esco olhida for iigual ao da a resistênc cia do term mistor na te emperatura a Se o valor do resisto 0 ambiente (25 C), en ntão a reg gião de ten nsão linear será simé étrica em to torno da te emperatura a ambiente (como vistto em figurra abaixo). Figura a 3. 8: Lin nearizaçã ão do term mistor. 3.2 MEMÓRIAS DO MICR ROCONTRO OLADOR Om microcontro olador apre esenta diveersos tiposs de memória, entre eelas: 3.2.1 MEMÓRIA DE D PROGR RAMA Am memória de e programa a flash, é o local ond de são grav vados o cóódigo hexadecimal do o programa compilado o. Essa me emória é u uma espéccie de EEPROM (mem mória prog gramável e apagável e eletronicam mente), ma as só podee ser gravada e apagada complletamente e não byte e a byte, o q que a torna a mais eco onômica. 3.2.2 MEMÓRIA DE D INSTRU UÇÕES A m memória de d instruçõ ões, que é uma esp pécie de BIOS B (binaary input and a output ut system), se localizaa dentro da CPU ppara comp paração co om o códdigo hexad decimal do o programa que está sendo s proccessado e eexecução de d uma açã ão corresppondente. [ 59 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá 3.2.3 MEMÓRIA EEPROM INTERNA A maioria dos modelos da família PIC apresenta memória EEPROM interna, com dimensões de 128 ou 256 bytes. Em algumas aplicações, a EEPROM interna é muito útil para guardar parâmetros de inicialização ou reter valores medidos durante uma determinada operação de sensoreamento. O PIC18F2550 contém 256 bytes (posições 0 a 255) de EEPROM interna, que podem ser escritas facilmente utilizando a instrução write_eeprom(posicao, valor); e lidas com a instrução valor2=read_eeprom (posicao);. O projeto de controlde de acesso com teclado matricial abaixo mostra o uso desta memória. 3.2.4 MEMÓRIA DE DADOS (RAM) A memória RAM do microcotrolador 18F2550 possui 2Kbytes disponíveis para propósito geral (entre 000h a 7FFh). No final da RAM (entre F60h e FFFh) estão localizados os registros de funções especiais (SFR), que servem para configurar os periféricos internos do microcontrolador. Esses registros podem ser configurados bit a bit através do seu endereço com a diretiva #byte que funciona para apontar uma posição de memória (#byte OSCCON=0XFD3 -> OSCCON=0B01100110; //Configura oscilador interno para 4MHz) ou por funções proprietárias 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). [ 60 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá Figura 3. 9: Registros de funções especiais. 3.2.5 EXEMPLO DE APLICAÇÃO 3.2.5.1 CONTROLE DE ACESSO COM TECLADO MATRICIAL O teclado matricial é geralmente utilizado em telefones e em controle de acesso de portas com senhas pré-definidas. O controle de acesso é feito, na maioria das vezes, com sistemas microcontrolados por varredura das linhas, aterrando individualmente as colunas do teclado. Caso alguma tecla seja pressionada, o pino da tecla correspondente também será aterrado e indicará a tecla digitada. [ 61 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 3. 1 0: Teclad do Matricial. Para a reconhe ecer uma senha d digitada em um te eclado maatricial é necessário o armazenarr o valor das teclass digitadass em seqü üência em m alguma memória, como por exemplo, na memória de dad dos RAM (pode-se utilizar qu uaisquer poosições do os 2Kbytess disponíveiss entre 000h 0 a 7F FFh), depo ois compará-la com uma sennha pré-programada a contida na a memória de programa flash (““ROM”) ou u na EEPRO OM internaa. gura 3. 11: Formas s de comp paração com c a sen nha pré-p rogramad da. Fig Notte que o prrograma de e controle de acesso o em anexo o utiliza a E EEPROM in nterna para a possibilitarr a inserçção de no ovas senh has na EE EPROM, se em a neccessidade de gravar novamente e a memórria de prog grama do m microcontro olador. PONTEIR ROS Ponteiros s guardam m endereç ços de me emória de e program ma. Exemplo p para declarrar um pon nteiro: unsigned d int16 p= =100; //ponteirro igual a posição p 100 *p='7'; /// Conteúdo o endereça ado por p é igual a ‘7 7’(ASC II) ou o 0x37. ++p; //In ncrementa a posição para receb ber próxim mo dado. Programa de contro ole de acessso com arrmazename mento de se enhas na EEEPROM in nterna pelo o próprio tec eclado atravvés de uma a senha dee administr trador (messtre): [ 62 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá ///////////////////////////////////////////////////////////////////////// ///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 não são //perdidas e é possivel armazenar novas senhas após a última senha gravada //É possível apagar senhas lendo a EEPROM e zerando as posições da senha ex.:write_eeprom( endereco, 0 ); #include <SanUSB.h> #include <usb_san_cdc.h>// Biblioteca para comunicação serial char caract,tecla0,tecla1,tecla2,tecla3; unsigned int16 p=100,i,j; unsigned int mult=8,k=0,n=0; int1 led,flag=0,flag2=0,flag3=0; ////////////////////////////////////////////////////////////////////////////////// #int_timer1 // Interrupção 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 posição 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 periférico 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 memória de senhas zerando k if(read_eeprom(239)>0 && read_eeprom(239)<40) {k=read_eeprom(239);} // Carrega a útima posição 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);} [ 63 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá 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);} 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 posição para próxima 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 próxima 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 usuário também 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 ); [ 64 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá ++k; // incremente as posições 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 posição livre antes do reset na posição 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 operação output_bit (pin_b7,led); delay_ms(100); }} --------------------------------------------------------------------------------------------------------------valor = read_adc(); // efetua a leitura da conversão A/D e guarda na variável valor 3.3 MODULAÇÃO POR LARGURA DE PULSO PELO CCP O Periférico interno independente CCP (Capture/Compare/PWM) é responsável por comparação de sinais, bem como, gerar um sinal de sáida em PWM (CCP1CON=0x0C), ou seja, modulação por largura de pulso (pulse width modulation). Dessa forma, é possível [ 65 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá realizar o PWM pelo periférico interno CC CP do micrrocontrolad dor ou porr software através de e essador do microconttrolador, co omo mostrrado no iteem 3.3.1. emulação pelo proce A gerração do PWM P é pro oduzida, geeralmente,, pelo chav veamento de uma te ensão com m amplitude constante e (+5V porr exemplo)), tendo em m vista qu ue quanto menor a la argura doss pulsos em mitidos na base de uma chavve eletrôn nica, como o um traansistor, menor m é a saturação do transisstor e, conssequentem mente, men nor a tensã ão lado da carga, ressultante do o chaveamento. O perríodo T0 é o intervalo de tempo que se reg gistra o pe eríodo repeetitivo do pulso p e o τ0 é o ciclo d de trabalh ho (duty-ciicle), ou seeja, o tem mpo em que q o pulsso permanece com a amplitude em nível lógico alto. Figura F 7. 1 1: Ciclo de e trabalho o. dulo CCP, o registro PR2 é carrregado parra servir de referênccia de conttagem para a No mód o timer 2 d de 8 bits com c presca aler (multip plicador de e tempo de e geralmennte 4 ou 16 6). Quando o o timer 2 quando chega ao va alor de PR R2, seta o flip-flop f do o CCP para gerar o período (T0) e consequentemente e a frequên ncia desejaada do PW WM (freqPW WM). O valor digital (Vd dig) de 10 bits do cic lo de traba alho, obtido do valor percentua al (0 a 100)) inserido pe elo usuário o. O Vdig O Vdig é carregado em CCPR R1L, que guuarda os 8 bits maiss significativvos do valo or digital, e nos bitss 5 e 4 do o CCP1CON são carrregados os o dois bitss menos sig gnificativos do valor digital, d e sserve de re eferência para p o timeer2 resetarr o ciclo de e trabalho. etalhes no vídeo: v http p://www.yo outube.com m/watch?v v=lB21b3zA A4Ac Mais de [ 66 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá CONTR ROLE PW WM POR SO OFTWARE E DE VELO OCIDADE DE UM M MOTOR CC C A fina alidade desste controle de veloccidade com m a modulação de teensão por largura de e pulsos (PW WM) é realizar uma conversão c d digital-ana alógica que e acontece devido à impedância a inerente do circuito em e alta fre equência. ura 7. 2: PWM. P Figu O pro ograma abaixo mostrra o contro ole de velocidade de e um motrro CC por PWM com m período co onstante de d 20ms, onde cad da increme ento ou de ecrementoo da onda quadrada a correspond de a 1ms,, ou seja, ou seja, um acrésccimo ou decréscimo d o de 5% no n ciclo de e trabalho. --------------------------------------------------------------------------------------------------------------------#include < <SanUSB.h h> #define m motor pin_b b7 #define le ed pin_b0 unsigned iint ton,tofff,incton,incctoff,guard aton,guard datoff; int1 flag1, flag2; main() { clock_int_4 4MHz(); port_b_pu ullups(true)); incton=2; inctoff=18 8; //Períod do de 20m s - Passo mínimo de e tempo = 1ms (5% % (1/20) do o duty cicle ) guardaton n=read_eep prom(10);g guardatofff=read_eep prom(11); n<=20) {in ncton=guarrdaton; inc ctoff=guard rdatoff;} if (guardatton>0 && guardaton while (1) { ton=incton n; toff=incctoff; if (!input(p pin_b1)) {fflag1=1;} [ 67 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá if (incto on<20 && flag g1==1 && inp put(pin_b1)) ) {{flag1=0;+ ++incton;--inctoff;outtput_high(lled);//se não chegou u no máxim mo (incton< <50), write_eeprrom(10,inccton);write e_eeprom(1 11,inctoff); //se e o botãão foi pressionado p o (flag1==1 1) e se o bo otão já foi solto (inpu ut(pin_b1)) incremen nte }// a onda qua adrada e gu uarde os va valores na eeprom e if (!input(p pin_b2)) {fflag2=1;} if (incto off<20 && flag g2==1 && inp put(pin_b2)) ) {{flag2=0;+ ++inctoff;--incton;outtput_low(le ed); write_eeprrom(10,inccton);write e_eeprom(1 11,inctoff); } ou utput_high h(motor); w while(ton) {--ton;delay { y_ms(1); } //Parte alta da onda quadradaa ou utput_low((motor); w while(toff) {--toff;dela { ay_ms(1); } //Parte baixa b da on nda quadraada }} } --------------------------------------------------------------------------------------------------------------------- A figura aabaixo mosstra o circu uito montaado para com co este exemplo. e V Veja o funccionamento to desse circu cuito no víd deo http:/ //www.yo outube.co om/watch h?v=6IIH H02dbboE E. Figura 7. 3 3: PWM co om Mosfe et. INTER RRUPÇÕ ÕES E TEMPOR RIZADO ORES INTERRU UPÇÕES As interrupçõ ões são ca ausadas attravés de eventos assíncrono a os (podem ocorrer a momento) causando um desvio o no proce essamento. Este desvvio tem com mo destino o qualquer m um endere eço para trratamento da interru upção. Uma a boa analogia para melhor en ntendermoss [ 68 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá o conceito de interrupção é a seguinte: você está trabalhando digitando uma carta no computador quando o seu telefone toca. Neste momento você, interrompe o que está fazendo, para atender ao telefone e verificar o que a pessoa do outro lado da linha está precisando. Terminada a conversa, você coloca o telefone no gancho novamente e retoma o seu trabalho do ponto onde havia parado. Observe que não precisamos verificar a todo instante, se existe ou não alguém na linha, pois somente quando o ramal é chamado, o telefone toca avisando que existe alguém querendo falar com você. Após do atendimento das interrupções, o microcontrolador retorna exatamente ao ponto onde parou no programa antes de atendê-la. As interrupções mais comuns na família PIC18F são: - pela interrupção externa 0 (Pino B0) -> enable_interrupts(int_ext); - pela interrupção externa 1 (Pino B1) -> enable_interrupts(int_ext1); - pela interrupção 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 comunicação serial -> enable_interrupts(int_rda); //serial As interrupções do PIC são vetorizadas, ou seja, têm endereços de início da interrupção fixos para a rotina de tratamento. No PIC18F2550 o endereço de tratamento é 0x08. No programa em C basta escrever a função de tratamento da interrupção após #, e o compilador fará o direcionamento do códico automaticamente para essa posição. INTERRUPÇÕES EXTERNAS O modelo PIC18F2550 possui três interrupções externas, habilitadas nos pinos B0 (ext) , B1 (ext1) e B2 (ext2), que atuam (modo default) quando os pinos são aterrados. Quandos atuados o processamento é desviado para #int_ext, #int_ext1 ou #int_ext2, respectivamente, para que a interrupção possa ser tratada por uma função específica, que no caso do exemplo é void bot_ext(). Dentro da função principal deve-se habilitar o “disjuntor” geral das interrupções, enable_interrupts(global); e depois a interrupção específica, por exemplo enable_interrupts(int_ext); como mostra o exemplo com aplicação de interrupção externa e também interrução do temporizador 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()); } [ 69 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá #int_ext void bot_ext() { for(x=0;x<5;x++) // pisca 5 vezes após o pino ser aterrado (botão 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 interrupções estão disponíveis em view > valid interrupts. Quando for utilizada alguma interrupção externa, é necessário inserir um resistor de pull-up externo de 1K a 10K para elevar o nível lógico do pino quando o mesmo for liberado evitando outra interrupção, pois o processador entende tristate e níveis intermediários de tensão como nível lógico baixo. INTERRUPÇÃO DOS TEMPORIZADORES O microcontrolador PIC 18F2550 tem quatro temporizadores, que são os timers 0, 1, 2 e 3. O timer 0 tem 16 bits, ou seja, pode contar até 65535μs (216) e um prescaler (divisor de frequência ou multiplicador de tempo) de até 256 (RTCC_DIV_256). Os timers 1 e 3 são idênticos com 16 bits e um prescaler de até 8 (RTCC_DIV_8). Por sua vez, O timer 2 possui 8 bits e um prescaler de até 16 (RTCC_DIV_16). Os timers incrementam até estourar, quando estouram, processamento é desviado para #int_timer, para que a interrupção possa ser tratada por uma função específica, que no caso do exemplo é void trata_t0 () e void trata_t1 (). O programa a seguir pisca um led em b5 na função principal main(), outro pela interrupção do timer 1 em b6 e um terceiro led em b7 pela interrupção do timer0. -------------------------------------------------------------------------------------------------------------#include <SanUSB.h> short int led0, led1; int vart1=2, vart3=4; // multiplicador de tempo [ 70 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá #int_timer0 void trata_t0 () //Função 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 interrupção } #int_timer1 //O timer 1 e o timer 3 são idênticos, só basta modificar 1 por 3 na configuração 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 máximo é 8 (T1_DIV_BY_8) set_timer1(3036 + get_timer1()); // get_timer() carrega o timer compensando o tempo gasto no tratamento da interrupção } } 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 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){ //Função principal pisca led em a5 output_high(pin_b5); delay_ms(500); output_low(pin_b5); delay_ms(500); [ 71 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá } } --------------------------------------------------------------------------------------------------------------MULTIPLEXAÇÃO POR INTERRUPÇÃO DE TEMPORIZADORES O programa abaixo mostra uma multiplexação de displays de 7 segmentos por interrupção dos temporizadores 0 e 1. O timer 0 incrmena a variável a ser multiplexada pelos displays e o timer 1 multiplexa a porta B dígitos de dezenas e dígitos de unidades até 99. --------------------------------------------------------------------------------------------------------------#include <SanUSB.h> #byte port_b = 0xf81//Atribuição do nome portb para o registro da porta B localizado na posição 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 interrupção } //********************************************* #int_timer1 //O timer 1 e o timer 3 são idênticos, só basta modificar 1 por 3 na configuração //void trata_t1 () { dezena=i/10; //dezena recebe o número inteiro da divisão por 10 unidade=i%10; //unidade recebe o resto da divisão 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 número das dezenas apontado pela variável dezena flag=1; break;} [ 72 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá case 1: { output_high(pin_a1); //selecionei a unidade output_low(pin_a0); port_b = setseg[unidade]; //A porta B recebe o desenho do número das unidades apontado pela variável unidade flag=0; break;} } set_timer1(55536 + get_timer1()); } main(){ clock_int_4MHz(); set_tris_b(0b00000000);// Define os pinos da porta B como saída 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); estourar while (1){ // Conta 10000 us (10ms) para //Função principal } output_high(pin_a5); delay_ms(300); output_low(pin_a5); delay_ms(300); } -------------------------------------------------------------------------------------------------------------------- EMULAÇÃO DE PORTAS LÓGICAS Os operadores lógicos descritos abaixo adotam o padrão ANSI C, ou seja, podem ser utilizados por qualquer compilador em linguagem C direcionado à microcontroladores. [ 73 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá 5.1 I INSTRUÇ ÇÕES LÓG GICAS PARA P TESTES CO ONDICION NAIS DE E NÚME EROS Nessse caso, os opera adores sã o utilizado os para realizar ooperações de testess condionaiss geralmen nte entre números intteiros. OPER RADOR & && ll ! CO OMANDO Operaçção E (AND) Operaçção OU (OR)) Operaçã ão NÃO (NOT T) Exemplos: dodec==05 5 && (min nutodec== =00|| minu utodec==30)) {flagw write=1;}//Analisando o if (segund um relógio o para seta ar a flagwrite if (x>0 & && x<20) (y=x;) // Estabeleceendo faixa de valoress para y. 5.2 I INSTRUÇ ÇÕES LÓG ICAS BOO OLANAS BIT B A BIT T Considere as portas lógicas abaixo: Figura 5. 1: Portas Lógicas s. É im mportante salientar que q emulaçção é a rep produção via v softwarre das funçções de um m determinado sistema a real. Atra avés do ci rcuito SanUSB, é possível emuular as porrtas lógicass físicas e a as diversa as combina ações das mesmas com apen nas uma ffunção bo ooleana no o programa.. [ 74 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá OPER RAÇÃO EXPR RESSÃO B BOOLEANA A EXPR RESSÃO B BOOLEANA A LITERA AL EM C Operação E (AND) S= A . B S= A & B Operação o OU (OR)) S= A + B S= A l B Operação o NÃO (NO O) S= !A A S= OU exclusivo (XOR)) S= A B S= A ^ B O ccircuito aba aixo mostra a as possívveis entrad das boolea anas nos p inos B1, B2 B e B3 e a saída do ccircuito lógiico boolean no é expreessa de forma real através do LLED no pino o B7. Figura a 5. 2: Us so de resis stores de e pull dow wn para ap plicar fun ção lógica a 0/1. É im mportante e salientar que atraavés das operações o E, OU, NÃ ÃO e OU-básicas E Exclusivo é possível construir outras opeerações co omo NAND, NOR e C Coincidência, que é o inverso do o OU-Exclu usivo. Isto é realizad do transforrmando a expressãoo booleana a literal em m uma expre essão boole eana em C e apresen ntando o re esultado em um LED D de saída. Figura 5.. 3: Outra as funçõess lógicas a partir de d NOT, O OR e AND. Exemplo 1: Elaborre um prog grama paraa emular uma u porta lógica OU--Exclusivo através do o microcontrrolador. [ 75 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá --------------------------------------------------------------------------------------------------------------------#include <SanUSB.h> // Emu ulação de ccircuitos lóg gicos boole eanos (OU -Exclusivo)) short int A A, B, saida,, ledpisca; main(){ clock_int_4 4MHz(); while (TRU UE) { A=input(p pin_b1); //e entrada com pull-dow wn externo o (resistor conectado ao Terra) B=input(p pin_b2); //e entrada com pull-dow wn externo o (resistor conectado ao Terra) A^B; //sa aida é igual ao resu ultado do o OU-Exclu usivo obttida pelas s entradas s saida = A dos pinos sAeB output_bitt(pin_b7,sa aida); //O pino_b7 mostra o resultado o do circuuito lógico o booleano o alocado em m saida ledpisca=!!ledpisca; // / ledpisca é igual ao o inverso de ledpisca output_bitt(pin_b0,le edpisca); /// b0 recebee o valor de ledpisca delay_ms((500); } } -------------------------------------------------------------------------------------------------------------------------Exemplo 2: Elabore um programa e a tabela ve erdade para emular uuma o circcuito lógico o abaixo. booleano a Fig gura 5. 4: Exemplo de circuito combin nacional ((1). O program ma para em mular de fo orma real eesse circuito é mostra ado abaixoo: --------------------------------------------------------------------------------------------------------------------#include < <SanUSB.h h> // Emulação de ciircuitos lóg gicos booleanos short int A A, B, C, said da, ledpiscca; main(){ clock_int_4 4MHz(); while (TRU UE) { A=input(p pin_b1); //e entrada com pull-dow wn externo o (resistor conectado ao Terra) B=input(p pin_b2); //e entrada com pull-dow wn externo o (resistor conectado ao Terra) C=input(p pin_b3); //e entrada com pull-dow wn externo o (resistor conectadoo ao Terra) [ 76 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá saida = !(!A & B) & !C; //sa aida do ciircuito bo ooleano obtida pela as entrad das de b1,, b2 e b3 output_bitt(pin_b7,sa aida); //O pino_b7 p m mostra o ressultado do circuito lóógico boole eano ledpisca=!!ledpisca; // / ledpisca é igual ao o inverso de ledpisca output_bitt(pin_b0,le edpisca); /// b0 recebee o valor de ledpisca delay_ms((500); } } -------------------------------------------------------------------------------------------------------------------------Note que para emular qualque er outro cirrcuito booleano com três entraadas, basta a modificar o em negritto (saida = !(!A & B)) & !C). A ttabela verd dade desse e apenas a ffunção de conversão circuito bo ooleano é mostarada m abaixo: RADAS ENTR B 0 0 1 1 0 0 1 1 A 0 0 0 0 1 1 1 1 C 0 1 0 1 0 1 0 1 SA AIDA S 1 0 0 0 1 0 1 0 Exemplo 3: Elabore um programa e a tabela ve erdade para emular uuma o circcuito lógico o abaixo. booleano a S= (A & B)) | !C | !(C & D) Fig gura 5. 5: Exemplo de circuito combin nacional ((2). --------------------------------------------------------------------------------------------------------------------#include < <SanUSB.h h> // Emulação de ciircuitos lóg gicos booleanos short int A A, B, C, D, saida, ledp pisca; main(){ clock_int_4 4MHz(); while (TRU UE) [ 77 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá { 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 lógico 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 lógico é mostrada abaixo: ENTRADAS A 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 B 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 C 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 D 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 SAIDA S 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 A tabela verdade pode ser facilmente comprovada de forma real montando o circuito proposto. 5.3 EMULAÇÃO SEGMENTOS DE DECODIFICADOR PARA DISPLAY DE 7 Antes de comentar sobre os decodificadores, vamos definir o que é um display de sete segmentos. O display de sete segmentos, é formado por sete leds. Quando necessitase acender o número “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 [ 78 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá respectivo os pinos. No N lado direito, d os dois tiposs de displlays, anoddo comum m e catodo o Não esqueçça que no anodo com mum o led liga com Gnd e no catodo comum o led d comum. N liga com V Vcc. Figurra 5. 6: Diisplay de 7 segmen ntos e con nexão intterna. Com mo os seg gmentos são s leds, eentão é necessário n limitar a corrente, para isso o devemos u usar um re esistor em cada segm mento (catodo comu um), ou appenas um no comum m (anodo co omum), sen não serão queimado os. Normalmente se utilizam reesistores entre 220 e 560 ohms para uma a fonte de 5Volts. U ma dica, se s for usarr um displ ay, teste antes a cada a segmentoss, para te er certeza que não está usa ando um display d coom algum segmento o queimado.. Os decodificad dores, inve erso dos co odificadore es, tem a função f de converter um código o “desconhe ecido” de linguagem m de máqu uina, como o o binário de entrrada mostrrado neste e exemplo, em um có ódigo compreensível,, como o código de ecimal ou uum desenho em um m display de 7 segmen ntos. Os de ecodificado ores fixos podem p ser construídoos com porrtas lógicass reais ou em mulados, ou o seja, reproduzidoss via softw ware, como é o caso pproposto. Os decodificadores de displays d dee 7 segme entos, com mo o 9317 (anodo co omum) e o 9307 (cato odo comum m), recebe em 4 bits de entrada a para a decodificaç d ção do núm mero a ser “desenhad do” pelos segmentos s dos displaays. [ 79 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá CI - 9317 Entradas /L T L H H H H H H H H H H H /RB I X L H X X X X X X X X X Saídas Desen ho A0 A1 A2 A3 a b c d e f g X L L H L H L H L H L H X L L L H H L L H H L L X L L L L L H H H H L L X L L L L L L L L L H H L H L H L L H L L L L L L H L L L L L H H L L L L H L L H L L L L L L L L H L H L L H L L H L L L H L H L H H H L H L H L H L H H H L L L H L L L H H H L L L L L H L L pont o H teste L apaga H 0 H 1 H 2 H 3 H 4 H 5 H 6 H 7 H 8 H 9 Para a emulação, ou seja, reprodução via software, de decodificadores de displays de sete segmentos, os pinos do microcontrolador devem apresentar os seguintes valores mostrados na tabela abaixo: TABELA (Anodo comum – zero no pino acende segmento) NÚMERO B6 B5 B4 B3 B2 B1 B0 Porta B DISPLAY Hexadeci g f e d c b a mal 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 também dos pinos do microcontrolador ligados ao displays, é possível utilizar o mesmo programa abaixo, alterando apenas os valores dos elementos da matriz setseg[10]. --------------------------------------------------------------------------------------------------------------#include <SanUSB.h> #byte port_b = 0xf81//Atribuição do nome portb para o registro da porta B localizado na posição 0xf81 da memória de dados [ 80 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá int setseg[10] = {0xx40,0x79,0 0x24,0x30,,0x19,0x12 2,0x02,0x7 78,0x00,0x 10}; //Vettor com 10 0 elementoss que desen nham de 0 a 9 int i; //índ dice i (pontteiro) void main () { clock_intt_4MHz(); set_tris_b(0b00000 0000);// De efine os pin nos da porrta B como o saída while(1) { for (i=0 0;i<10;i++ +) { port_b b = setseg[i]; delay_ _ms(500); } } } ---------------------------------------------------------------------------------------------------------------------------Exemplo:: Construa a um deco odificador eemulado atarvés a de diagramaas de Karn naugh para a escrever, letra por letra, l a ca ada segund do, a palavra StoP. É importaante salientar que oss pinos do m microcontrolador e os o pinos do o display em e anodo comum deevem ser conectados c s com um rresistor de e 220Ω a 1KΩ 1 para não queim mar os seg gmentos ddo display. O circuito o abaixo mo ostra a ligação do display de 7 ssegmentoss. Figura a 5. 7: Co onexão do o display 7 seg na porta p B d o PIC. [ 81 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá Os segmentos ascendem com zero no pino do microcontrolador (anodo comum). Note que como são somente quatro letras só é necessário duas entradas (Xe Y) para a decodificação. Entradas Pin_b0 Pin_b1 Pin_b2 Pin_b3 Pin_b4 Pin_b5 Pin_b6 X Y a b c d e f g 0 0 0 1 0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0 1 1 0 0 1 1 0 0 0 S t o P Após a definição de cada segmento do display para representar os caracteres da palavra, é feita a simplicação de cada segmento através dos diagramas de Karnaugh abaixo para a construção da função de emulação 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 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 funções de emulação do decodificador fixo para a palavra StoP obtidas dos diagramas de Karnaugh. --------------------------------------------------------------------------------------------------------------#include <SanUSB.h> // Emulação de decodificador para display de 7 segmentos - palavra StoP short int X, Y; //Entradas short int a, b, c, d, e, f, g; //saídas void decodificador(short int X, short int Y) //Função 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(){ [ 82 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá clock_int_4MHz(); while (1) { decodificador(0,0); // Insere as entradas X=0 e Y=0 no decodiicador fixo – Saída letra S delay_ms(1000); decodificador(0,1); // Saída letra t delay_ms(1000); decodificador(1,0); // Saída letra o delay_ms(1000); decodificador(1,1); // Saída 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 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 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 0 U S b 2 Após a definição de cada segmento do display para representar os caracteres da palavra, é feita a simplicação de cada segmento através dos diagramas de Karnaugh abaixo para a construção da função de emulação 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 [ 83 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá O programa abaixo mostra as funções de emulação do decodificador fixo para a palavra USb2 obtidas dos diagramas de Karnaugh. --------------------------------------------------------------------------------------------------------------#include <SanUSB.h> // Emulação de decodificador para display de 7 segmentos - palavra Usb2 short int X, Y; //Entradas short int a, b, c, d, e, f, g; //saídas void decodificador(short int X, short int Y) //Função 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); } main(){ clock_int_4MHz(); while (1) { decodificador(0,0); // Insere as entradas X=0 e Y=0 no decodiicador fixo – Saída letra S delay_ms(1000); decodificador(0,1); // Saída letra t delay_ms(1000); decodificador(1,0); // Saída letra o delay_ms(1000); decodificador(1,1); // Saída letra P delay_ms(1000); }} --------------------------------------------------------------------------------------------------------------5.4 MULTIPLEXAÇÃO COM DISPLAYS DE 7 SEGMENTOS Como a economia de consumo e de componentes são sempre fatores importantes a serem considerados em projetos de sistemas digitais, uma técnica bastante utilizada é a multiplexação de displays. Esta técnica 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 saídas do decodificador, possam controlar uma série de displays em paralelo. Estes são ciclicamente acesos e apagados numa frequência acima de 20Hz de tal forma que, para o olho humano, todos os displays estejam acesos permanentemente. Para [ 84 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá isso, são colocados transistores de corte que atuam em sequência sobre cada terminal comum dos displays em paralelo. O programa abaixo mostra um exemplo para contar de 0 a 99 multiplexando dois displays de sete segmentos anodo comum. --------------------------------------------------------------------------------------------------------------#include <SanUSB.h> #byte port_b = 0xf81//Atribuição do nome portb para o registro da porta B localizado na posição //0xf81 da memória de dados 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, z, dezena, unidade; //índice dezena,unidade (ponteiro) void main () { clock_int_4MHz(); set_tris_b(0b00000000);// Define os pinos da porta B como saída while(1) { for (i=0;i<99;i++) { for(z=0;z<20;z++){ dezena=i/10; //dezena recebe o número inteiro da divisão por 10 unidade=i%10; //unidade recebe o resto da divisão por 10 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 número das dezenas apontado pela //variável dezena delay_ms(10); output_high(pin_a1); //selecionei a unidade output_low(pin_a0); port_b = setseg[unidade]; //A porta B recebe o desenho do número das unidades apontado //pela variável unidade delay_ms(10); }} } } [ 85 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figu ura 5. 811 1: Multiple exação de e display 7 segmen ntos. --------------------------------------------------------------------------------------------------------------------- COMUNICAÇÃ ÃO SER RIAL EIA A/RS-2 232 A comu unicação serial s teve início com m a invenção do telé égrafo. Deppois teve um u grande e desenvolviimento com a invenção do Teeletype (te eletipo) pelo Francêss Jean Mau urice Émile e Baudot, em m 1871, da aí o nome Baud Rate te. Baudot, além de criar c toda a mecânica a e elétrica a do Teletyype, criou também uma tabeela de códigos (Código de B Baudot) com letras, números, e símbolo os para a transferên ncia serial assíncron na digital dde informações. Da aí adrão de comunicaçã c ão RS-232,, que significa Padrão ão Recomen endado verssão 232. surgiu o Pa Na tra ansmissão dos caraccteres atraavés da linha teleg gráfica, o sinal de Marca era a representa ado pela presença p de e corrente elétrica, e o Espaço o pela ausêência desta a corrente. Para que o Teletype e conseguissse disting uir o início o e o final de um carractere, o mesmo m era a precedido com um sinal s Espaçço (start b bit) e finalizado com um sinal de Marca (stop bit). que o estado da linh ha ociosa ((sem transsmissão de e dados) eera o sinal de Marca a Entenda q (presença de corren nte elétrica a). Foi basseado nessse sistema que o paadrão de trransmissão o RS-232 evvoluiu e se e tornou um m padrão muito utiliizado nos computadoores e equ uipamentoss digitais. Algu umas in nterfaces EIA/RS-2 232 noss compu utadores atuais fornecem m aproximad damente -1 10v e +10v v, mas sup portam mín nimas de -2 25v e máxiimas de +2 25v. A Comuniicação serial é feita a pela tran nsmissão de bits em m seqüênccia. É um m modo de e comunicaçção muito recomenda r ado para trransmissão o de dadoss a longa ddistância. Nesse N caso, a comunicação serrial aprese enta um menor cu usto pelo número reduzido de fios e conseqüen ntemente menor m velo ocidade em m relação à comunica ação paraleela. [ 86 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Para a a transm missão de dados d por d distâncias maiores e com poucca interferê ência pode-se utilizarr uma inte erface com m outros p c o EIIA/RS-232 e o EIA//RS-485. A padrões como comunicaçção serial pode p ser síncrona s ou u assíncrona. Na primeira, alé m dos bitss de dadoss são envia ados tamb bém bits de sincro onismo, ou u seja, o receptor fica em constante e sincronism mo com o Transmisso T or. Na com municação assíncrona a, que é o modo ma ais utilizado o de comun nicação entre e siste emas de controle e automa ação por não necessitar de e sincronism mo, existe um bit que e indica o início da transmissã ão, chamaddo de starrt bit (níve el lógico baix ixo) e um bit b que ind dica o finall da transm missão cha amado de stop bit (nível (n lógico o alto). Nesssa transmiissão, o Re eceptor em m sincronissmo com o Transmisssor apena as no início o da transm missão de dados. d Dev ve-se consiiderar que e o transmiissor e o rreceptor de evem estar na mesma a velocidad de de transsmissão. Qua ando o canal serial está em rrepouso, o sinal corrresponden te no canal tem um m nível lógico o ‘1’. Um pacote p de dados sem mpre começça com um m nível lógiico ‘0’ (start bit) para a sinalizar a ao recepttor que um u transm missão foii iniciada. O “startt bit” iniccializa um m temporizad dor interno o no recep ptor avisan ndo que a transmissã ão. Seguiddo do startt bit, 8 bitss de dados d de mensag gem são en nviados co om a velocidade de trransmissãoo pré-programada no o emissor e no recepttor. O paco ote é conccluído com m os bits de paridadee e de parrada (“stop p bit”). O b bit de pariidade é ussado como o nono bitt com o propósito dde detecçã ão de erro. Nessa con nvenção, quando o número n tottal de dígittos ‘1’ , o valor do bbit de parid dade é 1 e quando for ímpar é 0. 0 do em com municação o serial. Figura 6. 1: Dad A interrupçã ão do canal seria al é utiliz zada quan ndo se e espera rec eceber um m e sse executa outro pro ograma. Quuando o da ado chega, dado em tempo aleatório enquanto o start bit (nível lógico baix xo) acionaa a interrupção, pre eviamentee habilitada a, onde a e recepção da comunicação serrial é execcutada. Caso o canal serial seeja utilizado somente para transsmissão de dados, nã ão é necesssário habiliitar a interrupção serrial. [ 87 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá 6.1 C CÓDIGO ASCII A Um dos fo ormatos mais utilizad dos em com municação serial, com mo no paddrão EIA/R RS-232, é o ASCII (Am merican Sta andard Cod de for Info rmation In nterchange e). Este forrmato utilizza sete bitss de cada byyte (valor máximo m 0x x7F) e o oi tavo bit de e paridade que pode ou não ser utilizado.. Se o núme ero de “1s”” for par, o bit de paaridade X7 é zero e, se s for ímpaar, X7 é um m. A Tabela a de Caracte eres ASCII é mostrad da abaixo: Figura 6. 2 2: Caracte eres ASCI II. 6.2 I INTERFAC CE USART T DO MIC CROCONTROLADOR R A in nterface se erial USART T (transmiissor-recep ptor univerrsal síncronno e assíncrono) doss microcontrroladores pode ser síncrona o ou assíncro ona, sendo o esta últiima a mais utilizada a para comu unicação com o mun ndo extern o utilizand do o padrão EIA/RS-2232, onde cada byte e serial é prrecedido por p um sta art-bit de n nível lógico o baixo e encerradoo por um stop-bit s de e nível lógicco alto. Oss conectorres utilizad dos são o DB9 e o DB25, coomo mostrra a figura a abaixo: [ 88 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Fig gura 6. 3 : Conecto ores USAR RT. Em suma, os o pinos utilizados na comu unicação serial s enttre compu utadores e microcontrroladores são s o TXD,, o RXD e o Terra (GND). On nível lógico alto no pa adrão RS23 32 está enttre –3 e –25V – e o nnível lógico baixo está á entre +3 e +25V. Para a co omunicação o entre um m PC e um m PIC são utilizados chips que e convertem m os níveis de tensão TTL/RS23 32. Figura 6. 4: Sinal eléttrico RS-2 232. Par converter os padrõe es TTL/RS2 232, o chip p mais utilizzado é o M MAX232, o qual utiliza a quatro invversores pa ara convertter entre – –10V (RS23 32) em +5V V (TTL), e entre +10 0V (RS232)) em 0V (TT TL). Compu utadores apresentam m cerca de –10V e +1 10V, mas ssuportam mínimas m de e -25v e m máximas de +25v. Assim A Com mo o MAX X232 existem outroos converssores, tipo o ICL3232, e etc. O esqu uema de lig gação do M MAX232 é mostrado a seguir: [ 89 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá Figura 6. 5: Circuito de conexão MAX 232. 6.3 COMUNICAÇÃO SERIAL EIA/RS-485 No padrão EIA/RS-232, os sinais são representados por níveis de tensão referentes ao Gnd. Há um fio para transmissão, outro para recepção e o fio terra para referência dos níveis de tensão. Este tipo de interface é útil em comunicações ponto-a-ponto e baixas velocidades de transmissão. Visto a necessidade de um terra comum entre os dispositivos, há limitações do comprimento do cabo a apenas algumas dezenas de metros. Os principais problemas são a interferência e a resistência do cabo. Mais detalhes, bem como um projeto sobre diagnóstico microcontrolado de transceptor no padrão EIA/RS-485 podem ser conferidos no livro disponível no link: https://www.agbook.com.br/book/140210-Diagnostico_microcontrolado_de_transceptor_no_padrao_EIARS485 . 6.4 APLICAÇÃO DE COMUNICAÇÃO SERIAL VIA BLUETOOTH OU ZIGBEE Para a comunicação entre os modem bluetooth ou Zigbee, com um aplicativo serial instalado no PC ou em algum dispositivo móvel 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 frequência. Mais detalhes podem ser vistos no vídeo com link descrito abaixo: http://www.youtube.com/watch?v=aTe7G__9_us . ACIONAMENTO DE MOTORES MICROCONTROLADOS Os motores mais utilizados com sistemas microcontrolados são os motores CC , motores de passo e servo-motores. [ 90 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá ACIONAM MENTO DE D MOTOR RES CC DE E BAIXA TENSÃO T Os motorees CC são abundantees no me ercado em m função dda ampla gama de e üentementte, existeem em várias dimensões, d utilização, conseqü , tensões, pesos, característticas e são fáceis de d encontrrar em su ucatas com mo video-ccassete, brinquedos b , impressora as, etc. e geralmente g e vêm asso ociados a uma u caixa de engrennagem parra aumento o do torque e redução o de velocid dade. Figura 7 7. 4: Moto ores CC. MOTORES S ELÉTRIC COS UTIL LIZADOS EM AUTO OMÓVEIS Os motores utilizados em automó óveis são to odos com tensão nom minal a 12 2 volts, são o robustos e normalm mente projjetados paara condiçções extremas, tais como poe eira, calor, variações de tensão e corrente e, entre ou utros. Algu umas opçõe es são ideaais para ap plicação no o mpactos, fortes, altaa rotação e leves, allém de seerem muito o fáceis de e robô por sserem com conseguir em oficina as e empresas do raamo. Os motores m ma ais usadoss em proje etos são de e p bom mba do li mpador de d para-brisa e de gasolina, bomba de e trava-elétrrica das portas, motor doo ventilado combustívvel, motor do vidro-elétrico, m motor da ventoínha, v or interno, limpador d de para-briisa dianteirro e traseirro, bomba hidráulica do freio A ABS. [ 91 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 7. 5: Motorr CC com caixa de redução. Além m do acio onamento elétrico, o es CC de baixa pottência utilizados em m os motore automação o e robótica, apre esentam g geralmente e uma ca aixa de reedução, que q é um m equipamen nto compo osto por en ngrenagenss, com o in ntuito de reduzir r a vvelocidade de rotação o do eixo (o ou angularr) e aumen ntar o torq que do mo otor. O torrque varia em funçã ão da força a aplicada ((F) e do raio r de giiro (nas eengrenagen ns é a metade do diâmetro primitivo), segundo a equação T = F.r. Sen ndo: F = força (em m Newtons)), r = raio de giro (em m metros) e T = torqque (em N.m). Figura 7. 6: R Relação de e transmissão. m imprime umaa força co onstante, a variaçãão do torrque entre e Já que o motor ens ocorre devido ao o raio de giro. Na prática p em um sistem ma de eng grenagens, engrenage comprovad da pelas eq quações abaixo, quaanto maior o diâmetro o da engreenagem movida (D2), maior o to orque (T2) proporcio onal e men nor a velo ocidade de rotação ((n2). Considerando a engrenage em 1 com motora m e a engrenag gem 2 com mo movida, tem-se: Fconst -> T1/r1 = T2/r2 -> > T1/D1 = T2/D2 T2 . D1 = T1 .D2 n2 . D2 = n1. d1 [ 92 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá COROA E O PARA AFUSO CO OM ROSCA A SEM-FIM M A co oroa e o pa arafuso com rosca seem-fim com mpõem um m sistema dde transmissão muito o utilizado p principalme ente nos ca asos em q ue é necessária elev vada reduçção de velo ocidade ou u um elevad do aumento o de força,, como no os redutore es de velocidade. Figura F 7. 7 7: Coroa e sem-fim m. On número de entradas do d parafusso tem influ uência no sistema dee transmisssão. Se um m parafuso ccom rosca sem-fim tem apenaas uma en ntrada (ma ais comum m) e está acoplado a a uma coroa a de 60 dentes, em cada voltta dada no o parafuso o a coroa vai girar apenas a um m dente. Com mo a coroa a tem 60 dentes, d serrá necessá ário dar 60 voltas no parafuso para que a coroa gire uma volta a. Assim, a rpm da ccoroa é 60 vezes men nor que a do parafusso. Se, por exemplo, o parafuso o com roscca sem-fim m está girando a 1.80 00 rpm, a coroa gira ará a 1.800 0 rpm, divididas por 60 0, que resu ultará em 3 30 rpm. Sup ponhamos, agora, qu ue o paraffuso com rosca sem m-fim tenhaa duas entradas e a coroa tenh ha 60 denttes. Assim,, a cada vo olta dada no parafusso com rossca sem-fim, a coroa a girará doiss dentes. Portanto, P será s necesssário dar 30 voltas no parafu so para qu ue a coroa a gire uma vvolta. Assim, a rrpm da corroa é 30 vezes v meno or que a rpm r do parafuso com m rosca se em-fim. Se, por exemp plo, o para afuso com m rosca sem m-fim está á girando a 1.800 rppm, a coro oa girará a 1.800 divid didas por 30, que re esultará em m 60 rpm. A rpm da a coroa podde ser exp pressa pela a equação: i=N Nc . Zc =Np. Zp Ncc=Np. Zp /Zc / de: ond Nc = número de rotaçõe es da coroaa (rpm) Zc = número de dentes da coroa Np = número de rotações do paraafuso com rosca sem-fim (rpm)) Zp= = número de d entrada as do paraffuso As p possibilidad des mais comuns c de controle digital d de motores m CC C são: [ 93 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá CHAVEAM MENTO DE E MOTOR RES CC CO OM TRANS SISTORES S MOSFET T Os ttransistore es de efeito o de campo o MOSFET T executam m o chavea mento porr tensão na a base e po odem ser utilizados no lugar dos transistores Da arlington ppara aciona amento de e dispositivo os de média potência a, devido p principalme ente à men nor queda de tensão e à menor dissipação o em forma a de calor. Os MOSFETs apresentam m alta taxaa de velocidade no chaveamen c nto e uma resistência a uito baixa (décimos de d ohms). Deesa form ma, a qued da de tenssão nesse transistor t é interna mu muito baixxa, o que não acon ntece com transistorres Darling gton. A fguura abaixo o mostra a configuraçção dos pin nos de um MOSFET, onde o pin no 1 é o Gate G (base)), o pinos 2 é o Drain n e o pino 3 é o Sourcce. Figura F 7. 8 8: Mosfett – IRF540 0. Om modelo IRF F540 suporrta tensõess de chaveamento en ntre o drain in e o sourc rce de 100V V e corrente e de até 22 2A. A figura a abaixo m mostra o cirrcuito com MOSFET ppara acionamento de e quatro mo otores com m MOSFETss. A etapa de potênccia é comp posta peloss MOSFETss IRF530 e diodos de roda lvre para prote eção de teensão reverrsa. O func cionamentto é simple es. Quando o o microcontrolador coloca na saída dass portas de e controle um ‘1’ lóógico, os transistores t s MOSFET e entram em m conduçã ão e uma tensão de d 12V é aplicada ssobre as cargas. c Oss resistores e LEDs se ervem som mente paraa visualiza ação do ch haveamentto. Note que q o pino o Source do o MOSFET T é conecttado ao G Gnd do miicrocontrolador paraa gerar a tensão de e chaveamento no gatte (VG). namento d de um mottor CC de 3V 3 utilizaddo em robó ótica móve el A figura abaixo mosstra o acion através de e um mosfe et IRF540. [ 94 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 7. 9: 9 Acionam mento de e motor co om Mosfe et. EXEMPLO O: SEGUID DOR ÓTIC CO DE LAB BIRINTO Neste caso o é interesssante deffinir que no o princípio o seguidor de paredee o robô considera c o obstáculo como refe erência a qual q ele vaai seguir em e movime ento de avvanço norm mal. Nesse e exemplo e ele “cola” do d lado esquerdo, ou u seja, o motor m direiito deve seer mais rápido que o motor esquerdo, qua ando os do ois estivereem acionad dos. Seguindo a as paredess do labirin nto até finaal encontra am-se quattro situaçõees: Fig gura 7. 10 0: Situaçõ ões encon ntradas em m labirinttos. É importan nte salienttar que no o princípio de seguirr o obstácu ulo, o robôô não pode tocar no o outro lado o, em verm melho, poiss ele podee tomá-lo como c referrência e vooltar, o qu ue fará sair por onde e entrou. Ma ais detalhess: http://w www.youtu ube.com/w watch?v=QR RDrG2iEFp pM . O CONTRO OLE DE M MOVIMENT TO ESTABILIIDADE DO Para a garantir estabilidade do con ntrole de movimento m , ou seja, garantir que q o robô ô está seguindo correttamente a referênciaa (o obstácculo), o sen nsor ótico lateral (L), com sina al [ 95 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá analógico, deve ser lido freque entementee e estar com valoress que garaantam a prresença do o obstáculo. Casso seja acu usada a au usência de obstáculo, o microcontroladorr deve parar o motor esquerdo e acionar o motor direito, um m determin nado temp po, suficie nte para garantir g ass situações 3 e 4. Notte que o tempo t de 4 é maior que o de 3, mas coom o temp po de 4 na a situação 3 3, o robô va ai ser segu uro pelo ob bstáculo atté acabar o tempo dee desvio e seguir em m frente até encontrar obstáculo frontal ou u lateral. Casso o sen nsor frontal verifiq que obsttáculo, mostrado nna situaçção 2, o microcontrrolador para o moto or direito, aciona o motor esq querdo e ssegue em frente até é encontrar obstáculo lateral, o que garaante a esta abilidade do d movimeento. Note e que se o a for pouco o, o guia o oval frontall do robô conduzirá c o robô à estabilidade e e desvio parra a direita ao tocar no obstáculo com o av vanço fron ntal. O circu uito é mosstrado abaiixo: Figura 7. 7 11: Uso o de senso ores ótico os para co ontrolar m motores. Programa:: --------------------------------------------------------------------------------------------------------------------#include < <SanUSB.h h> //Leiturra de tensãão em mV com variaç ção de um potenciôm metro #define essquerdo pin_b6 #define diireito pin_ _b5 int32 ten nsaofrente,, tensaola ateral, ap proximacao o=4790; //int32 / deevido aoss cálculoss intermediá ários short int le edpisca; unsigned iint flagnao osensor=0, flagfrentee=0, flaggiro=1; main() { clock_int_4 4MHz(); [ 96 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá setup_adc_ports(AN0_TO_AN1); //Habilita entrada analógica - A0 setup_adc(ADC_CLOCK_INTERNAL); 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);//pára 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; }} //************************************************************************ ***** //ANALÓGICO 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 também estabiliza delay_ms(10); tensaolateral= (5000*(int32)read_adc())/1023; [ 97 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá }} osensor; ++flagnao output_hig gh(esquerd do);output_ _high(dire ito); //Os dois moto ores em freente ledpisca=!!ledpisca; output_bitt(pin_b7,le edpisca); delay_ms((20); }} --------------------------------------------------------------------------------------------------------------------O fluxogra ama do pro ograma do microconttrolador é mostrado m abaixo: a Figurra 7. 12: Fluxogram F ma de fun ncionamen nto de rob bô móvel com sens sores. [ 98 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá PONTE H O acio onamento da ponte H permite o movime ento do mo otor nos doois sentido os. A ponte e H pode se er feita com transisttores MOSFFETs, maiss aconselh hável deviddo a baixa a queda de e ou de tensão, potência a Darllin ngton TIIP ou BD. Maais deta alhes em m outube.com m/watch?v=6IIH02db bboE . ://www.yo Fig gura 7. 13 3: Motor em e Ponte e H. --------------------------------------------------------------------------------------------------------------------DRIVER P PONTE H L293D Uma das solu uções maiis simples e barata em atuaç ção de ro bôs móvéis consiste e utilizar um m integrado o motor driver dr como o o L293D. Este inte egrado posssibilita o controle c de e dois motorres CC, utilizando quatro pinos de saída do d microco ontrolador. O circuito inte egrado L293D deve ter duas alimentaçõe es. Uma paara comando (5V) no o pino 16 e outra para potência a (por exem mplo 9,6 V ou 5V) no o pino 8. O Os motoress percebem m uma queda de 0,7V em relação o à tensão da fonte externa. e As e entradas nos n pinos 2 e 7 são para acion nar o moto or A e entrradas nos pinos 10 e 15 são para acionar o motor B. B O pino 8 é conecttado à fontte de alimeentação do os motoress que tem o mesmo Gnd G do circuito de con ntrole. Figura 7. 14 : CI Ponte e H – L29 93D. [ 99 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Am mudança do os sinais nos n pinos d de entrada a tem o efe eito de prooduzir a alteração do o sentido da a corrente no enrola amento do motor, lo ogo do seu u sentido dde rotação o. A Tabela a permite prrogramar o movimen nto em quaalquer direçção (conjugando 2 m motores). Se a primeira entrada alta, a segun nda entrada baixa , então e om motor se de esloca para a frente, se a primeira a entrada baixa b e a ssegunda entrada alta a , o moto r se movim menta para a trás. Se am mbas as en ntradas baixas ou alttas, o motor pára. SOLENÓIIDES E RE ELÉS Uma solenóid de consiste e num êmb bolo de fe erro coloca ado no inteerior de uma bobina a a) elétrica,, enrolada em torno o de um tu ubo. Quand do se alim enta eletriicamente a (indutância bobina, crria-se um campo ma agnético q ue atrai o êmbolo (núcleo ( móóvel) para dentro da a bobina como é mosstrado na figura f aba ixo. No caso c de um m relé, feccha um co ontato para a circulação de outro nivel n maiorr de corren nte. Figura 7 7. 15: Sollenóide. Os relés são dispositivo os comutaadores elettromecânic cos (Figuraa 2.14). A estrutura a simplificad da de um relé é mo ostrada naa figura ab baixo e a partir delaa é expliccado o seu u princípio d de funciona amento. [ 100 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figurra 7. 16: Relés. R O ccontrole de uma so olenóide o ou relé po ode ser feito pelo cchaveamen nto de um m transistor Darlington n ou de um m MOSFET mostrado abaixo. a nterruptor acionado eletricame ente que ppermite o isolamento o O rrelé é um tipo de in elétrico de e dois circu uitos. O re elé é formaado por um m eletroím mã (uma boobina enro olada sobre e um núcle eo de ma aterial ferrromagnéticco) que quando acionado, a através da d atração o eletromagnética, feccha os con ntatos de u um interru uptor. Norm malmente o interrup ptor de um m relé tem d duas posiçções, com isso existeem dois tipos, os NF(normalm mente fechado) e NA A (normalme ente aberto o), como mostra m a fiigura abaix xo. A bobina do relé é acionad da por uma a tensão con ntínua que e é especificada de accordo com o fabrican nte, bobinaas de 5, 12 2 e 24 Voltss são as mais comuns. Figura 7. 7 17: Acio onamento o de moto or 12V com m relé bo obina 5V. [ 101 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Uma das cara acterísticass do relé é que ele pode p ser en nergizado com corre entes muito o ão à corrente que o circuito o controlad do exige ppara funciionar. Isso o pequenas em relaçã significa a possibilida ade de con ntrolar circ uitos de alltas correntes como motores, lâmpadas e ente a part ir de micro ocontrolado ores. máquinas industriaiss, diretame Figu ura 7. 18 Aplicação o de um relé. r DE POTÊN NCIA ULN N2803 DRIVER D Um driver de potência é utilizado sempre quando se necessita n aacionar um m hardware e especifico de maior potência. p Esse E driverr pode ser usado parra controla r motores de passos, solenóidess, relés, motores m CC C e várioss outros dispositivos d s. Ele conttém intern namente 8 transistore es Darlingtton NPN de potênciaa, oito resiistores de base de 22K7 e oito diodos de e roda livre e, para de escarregar no Vcc (pino 10)) a corren nte reverssa da força contra-eletromotrriz gerada no chaveamento doss transistorres, proteg gendo os m mesmos. Qua ando o miccrocontrola ador colocaa +5V (níve el lógico 1)) no pino 1 do driverr ULN2803, ele conectta o pino 18 1 do outro o lado, ond de está liga a um pólo do motor,, ao Gnd (n nível lógico o 0, por isso o a simbolo ogia de porta inverso ora na figu ura abaixo). Como o outro lado o da bobina a (o comum m) ou do motor m deve e estar ligaado ao Vccc da fonte de até 300V, esse co omando irá á energizar a bobina ou o o motor. Figura 7 7. 19: ULN 2803. [ 102 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá PONTE H COM MIC CRORELÉ ÉS Como o foi visto,, acioname ento da p onte H pe ermite o movimento m o do moto or nos doiss sentidos. A ponte H pode ser feita f tamb ém com apenas doiss microreléés. Neste caso, c pode-se utilizar também o driver ULN2803 para a en nergização das bobinnas, pois já contém m b e oito diodos dee roda livre e. Esse tipo o internamente oito transistores com resisttores de base de ponte H, mostrrada na figura f abaaixo, não causa qu ueda de ttensão na fonte de e ão do mottor, porqu ue as fonttes de ene ergização da bobinaa do micro orelé e de e alimentaçã alimentaçã ão do moto or devem ser s diferen ntes, ou se eja, isolada as uma da outra, parra que seja a possível o chaveame ento do relé é. Figura a 7. 20: Acionamen A nto de mo otor nos 2 sentidos s com relé és em Po onte H. Notte que iniccialmente os o dois reelés estão conectado os ao V-Mootor. Ao energizar e a bobina do relé da essquerda, conectando o o V+Moto or, a corre ente da fonnte passa pelo motor no sentido o da esque erda para a direita o que deterrmina o se entido de rrotação do motor. Ao o desligar o relé da essquerda e acionar o relé da direita ocorrre o sentiddo de rotaçção inverso o do motor. Qua ando se uttiliza moto or CC em p ponte H para atuado ores robótticos, como o rodas de e veículos o ou braços mecânicoss, o que deetermina o torque e a velociddade do attuador é a relação de e transmisssão da caix xa de engreenagens co onectada ao a motor. ACIONAM MENTO DE E MOTOR RES DE PA ASSO Mottores de pa assos são dispositivo d s mecânico os eletromagnéticos que podem m ser controlado os digitalmente. [ 103 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá A crrescente popularidad de dos mottores de pa asso se dev ve à total aadaptação desses dispositivo os à lógica digital. São encontraados não só em aparelhos ondee a precisã ão é um fator muito o importan nte como im mpressorass, plotters,, scanners,, drivers dee disquetes, discos rígidos, ma as também m, como intterface enttre CPUs e movimen nto mecâniico, constittuindo, em m suma, a ch have para a Robótica a. MOTORES S DE PASSO UNIPO OLARES Os motores de d passo unipolaress são facilmente reconhecidoss pela derivação ao o centro dass bobinas. O motor de d passo teem 4 fasess porque o número dde fases é duas d vezess o número o de bobin nas, uma vez que cada bobiina se enc contra divvidida em duas pela a derivação ao centro das bobina as (comum m). Norrmalmente, a derivaçção centraal das bob binas está ligada ao terminal positivo p da a fonte de a alimentaçã ão (Vcc) e os termin nais de cad da bobina são ligadoos alternad damente à terra atravvés de chavveamento eletrônico produzind do movimento. As b bobinas se e localizam m no estato or e o roto or é um im mã permaneente com 6 pólos ao o longo da ccircunferên ncia. Para que q haja u uma maior resolução angular, o rotor dev verá conter mais póloss. Figura a 7. 21: M Motor de passo p unipolar. Os motores de passo un nipolares m mais encon ntrados possuem 5 oou 6 fios. Os O motoress s comuns (derivaçã ão centra al). Para o de passo unipolaress de 6 fioss possuem dois fios acionamen nto do motor m de passo, p esttes fio co omuns devem ser ligados à fonte de e alimentaçã ão (+5V ou u +12V) e os termin nais da bob bina ligado os ao contrrole de cha aveamento o do motor d de passo. M Motor de 5 fios Motor de 6 fioss [ 104 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 7. 22: Mo otores de passo un nipolar – conexão c iinterna. Para a descobrir os termin nais de um m motor de passo, deve-se conssiderar que e: Para moto ores de 6 fios, f a resistência en ntre os fioss comuns (Fio ( 1 e Fioo 2) é infinita por se e tratarem d de bobinas diferentess. A re esistência entre o fio o comum ((Fio 1) e o terminal de uma boobina é a metade da a resistência a entre dois terminaiss desta bob bina. Para a encontra ar a seqüên ncia corretta dos fios para chav veamento ddas bobina as, pode-se e ligar manu ualmente o fio comum ao Vcc,, e de form ma alternad da e seqüeencial, o GND G (terra)) da fonte a aos termina ais das bob binas, verifficando o movimento m do motor de passo. MODOS D DE OPERA AÇÃO DE UM U MOTO OR DE PAS SSO UNIP POLAR 1 (FUL PAS SSO COMPL LETO LL-STEP) -So omente m meia bobiina é ene ergizada a cada passo p a parrtir do comum; -Menor torque; -Pou uco consu umo de energia. Nº do passo 1--> 2--> 3--> 4--> 1a a 2a 1b 2b 2 Decima al 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 8 4 2 1 SSO COMPLET TO 2 (FU ULL-STEP PAS 2) -Du uas meia a-bobinas são ene ergizadass a cada a passo; -Maior torque; -Con nsome m mais energia que o Passso comp pleto 1. Nº do 1a a 2a 1b 2b 2 Decima al passo 1--> 1 1 0 0 8 2--> 0 1 1 0 4 3--> 0 0 1 1 2 4--> 1 0 0 1 1 Figurra 7. 23: Caracterís C sticas e Ló ógica de acioname a ento de m motor de passo. p [ 105 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá ACIONAMENTO BIDIRECIONAL DE DOIS MOTORES DE PASSO Como o driver de potência ULN2803 ou ULN2804 possui internamente 8 transistores de potência ele é capaz de manipular dois motores de passo ao mesmo tempo. Ele contém internamente oito diodos de roda livre e oito resistores de base dos transistores, o que possibilita a ligação direta ao microcontrolador e aos motores de passo. Figura 7. 24: Conexão 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, é possível associar baterias 9V em paralelo para aumentar a corrente de energização ou utilizar baterias de No-Breaks. O link abaixo mostra esse motor utilizando a ferramenta SanUSB http://www.youtube.com/watch?v=vaegfA65Hn8. SERVO-MOTORES Há dois tipos de servos: os de posição, com giro de 180º, e o de rotação, que possui o giro contínuo. O Servo de Posição é utilizado em antenas parabólicas, em braços robóticos, na robótica móvel terrestre com o controle de pernas mecânicas e no controle de câmeras. O Servo de Rotação é prioritariamente escolhido para a locomoção por rodas. Trata-se de dispositivos muito precisos que giram sempre o mesmo ângulo para um dado sinal. Um servo típico possui três fios de ligação, normalmente preto, vermelho e branco (ou amarelo). O condutor preto é a referência de massa da alimentação (0 volts), o condutor vermelho é a alimentação e o condutor branco (ou amarelo) é o sinal de posicionamento, como é mostrado na figura abaixo que é um carro para desvio de obstáculos, acionado por dois servo-motores de rotação. O sinal do servo-motor de posição é 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 posição central. [ 106 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura a 7. 25: Ap plicação d de servo-motores em robô m móvel. A te ensão de alimentaçã a ão do servo omotor é tipicament t te de 5V, ppodendo variar v entre e 4,5V e 6V. Devido à alta redução do jog go de engrrenagens, o torque qque se obttém de um m servo é ba astante alto, considerando o seeu tamanh ho reduzido o. Lamentaavelmente,, os servoss consomem m corrente es elevada as (de 20 00 mA a 1 A) e introduzem m ruído ellétrico noss condutores de alime entação, ne ecessitand o a aplicaçção de cap pacitores dde filtro. O programa a abaixo mo ove um serrvo-motor de rotação o para fren nte e um outro o paraa trás. Note e que essa a operação é utilizada por robôs móveis qu ue possuem m dois mottores em aanti-paralelo. --------------------------------------------------------------------------------------------------------------------#include < <SanUSB.h h> #define m motor1 pin_ _b5 #define m motor2 pin_ _b6 int16 frentte=50; short int le ed; main(){ clock_int_4 4MHz(); UE) while (TRU { while (fren nte>0) { output_hiigh(motor2 2); //Inicialiiza o pulso do motor 1 output_high(motor1 1); //Inicializza o pulso do motor 2 delay_ms((1); output_low w(motor1)); //Termiina o pulso o de 1ms do d motor1–– sentido horário h delay_ms((1); output_low w(motor1)); output_low w(motor2)); horário ///Termina o pulso de 2ms do m motor2 – se entido anti-- delay_ms((10); --frente; [ 107 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá } frrente=50; led=!led; //pica led d a cada 50 5 ciclos do o servo-mo otor, ou sejja a cada 112ms*50 = 600ms output_bitt(pin_b7,leed); }} ----------------------------------------------------------------------------------------------------------------------- Figura 7. 26: Visualiza ção interna de um m servo-m motor. O programa abaixo move um m servo-m motor de posição. Com o pulso de e aproximad damente 1 ms, o serrvo move-sse para 0 graus, g e com o pulsoo de 1,2 ms m para 90 0 graus e co om o pulso o de 2 ms para 180 g graus. Notte que este e motor é utilizado em e antenass parabólicas, em siste emas robótticos e no controle de câmeras. --------------------------------------------------------------------------------------------------------------------#include < <SanUSB.h h> //Servo o-motor d e parabóliica - 3 po osições deffinidas: 0, 90 e 180 0 graus. NTE=200, TRAS=200 0; //no serrvo de testte 200 passsos correspponderam a aprox. 1 int16 FREN volta void main(() { clock_int_4 4MHz(); while (1) { while (FRENTE>0)) { FRENTE--; output_high(pin_b0); delay_ms((1); /// tempo dee busca de e 0 graus output_low w(pin_b0); delay_ms((10); } FR RENTE=20 00; while (TR RAS>0) [ 108 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá { TRAS--; output_high(pin_b0); /// tempo dee busca de 180 grauss delay_ms((2); output_low w(pin_b0); delay_ms((10); } TR RAS=200; output_to oggle(pin_b b7); } } --------------------------------------------------------------------------------------------------------------------- FOTOA ACOPLA ADORES S E SEN NSORES S INFRA AVERM ELHOS S Fotoacopladores ou optoiso oladores p proporciona am a isola ação de sinnais em um ma grande e variedade de aplica ações. Tam mbém chaamados de e acoplado ores óticoss, eles comutam ou u transmitem m sinais e informaçõ ões ao meesmo tempo que iso olam diferrentes parttes de um m circuito. Optoiso oladores liineares são usados para isola ar sinais análogos atté 10MHz,, enquanto o optoisoladores digita ais são usados para ccontrole, in ndicação de e estados, isolação de d sinais de e comando e mudança as de níveis lógicos. Existem m fotoacop pladores de e diversos tipos e co om constru uções interrnas diversas, como, por exemp plo, acopladores onde e a constru ução intern na é basea ada em um m diodo infrravermelho o e um fotottransistor. Como exemplo podeemos citar o 4N25 e o TIL111: Figurra 8. 1: Viisualizaçã ão interna a de um Fotoacopl F ador. Esse e disposittivo pode ser utilizaado por um u microc controladoor para identificar a presença d de tensão 220VAC em e um detterminado ponto. A potência p m máxima disssipada por esse comp ponente é de 250mW W em 25 grraus Celsiu us. Dessa forma, devee-se dimen nsionar um m resistor em m série com m o foto-diiodo intern no para pro otegê-lo. Esco olhendo re esistores são s de 33 3mW, ou seja, a po otência mááxima que e pode ser dissipada em cada um deles. É interesssante que exista um m certo inttervalo de segurança a entre a po otência máxima do co omponentee e a potên ncia máxim ma dissipadda. Então, a potência a máxima esscolhida pa ara os resiistores é d de 200mW.. Na Equaç ção (6.1) é calculado o o resistor que será utilizado no n circuito, consideraando a te ensão de pico. p Consiidere 311V V como a tensão de pico. P=V V2/R -> 0,2 2W = (311 1)2/R -> R R=483 KΩ. O re esistor com mercial mais próximo o desse valo or é 470KΩ Ω. [ 109 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 8. 8 2: Aplica ação de um u fotoac coplador. TRANSM MISSOR E RECEPT TOR IR Os transmisso ores e rece eptores IR R (infrared ou Infrave ermellhos) são muito o utilizadoss como senssor ótico por p reflexã ão difusa p para registtro de posiição. A figgura abaixo o mostra o circuito do o sensor e um gráficco do sinaal de saída (em mV) do recepttor IR em função da a distância p perceptívell pelo rece eptor IR co om resistorr de elevaç ção de tennsão para 5V 5 (pull-up p 2K2). O vvídeo http p://www.yo outube.com m/watch?v v=18w0Oeaco4U moostra essa a variação, com o acionamento o de um le ed pela q ueda do sinal s analó ógico atarvvés da condução do o receptor IR R. xão do pa ar infraverrmelho: TIL T 32 (em missor) e TIL 78 (rreceptor).. Figura 8.. 3: Conex Para a ter um maior alca ance e perrceber um ma maior variação v dee posição, com esse e sensor, é aconselhá ável utiliza ar o convversor AD de 10 bits b do m icrocontrolador para a identificar variações de até 5m mV no sinall do sensor. A distância ótima é a distânccia em que e [ 110 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá incide no receptor a maior parte do feixe de luz emitido pelo transmissor. Nessa distância ocorre a maior variação (queda) do sinal de saída analógico do receptor IR. Utilizando o princípio on/off, só há identificação de posição quando o sinal do receptor for menor ou igual a 2,5V (nível lógico baixo), o que torna o sensoreamento muito limitado. Durante os testes desse circuito foi verificado que, devido a resistência de 390Ω em paralelo com 2K2, quando o led é conectado no circuito, há uma diminuição na variação do sinal de saída analógico do receptor IR. O programa abaixo mostra a leitura em mV do sensor ótico via emulação serial. --------------------------------------------------------------------------------------------------------------#include <SanUSB.h> //Leitura de tensão em mV com variação de um potenciômetro #include <usb_san_cdc.h>// Biblioteca para comunicação 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 periférico com a usb do PC setup_adc_ports(AN0); //Habilita entrada analógica - A0 setup_adc(ADC_CLOCK_INTERNAL); while(1){ //ANALÓGICO 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); }} -------------------------------------------------------------------------------------------------------------AUTOMAÇÃO E DOMÓTICA COM CONTROLE REMOTO UNIVERSAL A comunicação entre uma unidade remota e um eletrodoméstico, como uma TV, se dá geralmente por emissão de radiação infravermelha modulada por pulsos. [ 111 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá F Figura 8. 4: Diagra ama de bllocos de comunica c ção infrav vermelha a. Para a tornar o sistema in nsensível a interferên ncias e filtrrar os ruídoos, aceitan ndo apenass as ordens do controlle remoto, o código d de pulsos do emissor contém uum dado binário, b que e é identifica ado pelo decodificado or do recep ptor. As interferênccias podem m se origiinar de fontes estátticas, isto é, que nã ão pulsam, como o so ol, lâmpadas incande escentes, aaquecedorres, e de fontes f dinââmicas que e são maiss intensas e geram maior m interrferência, como lâm mpadas fluo orescentess, a image em da TV V, outros tran nsmissoress de infrave ermelho e etc. O rreceptor, geralmente g e contido n num único invólucro montado no painel frontal do o televisor, entrega ao a decodifiicador apeenas os pulsos retangulares ccorrespond dentes aoss códigos de e identifica ação e dados, eliminaando a ma aioria das fontes f de i nterferênccias, exceto o as que ten nham a me esma frequ uência de p pulsos, cab bendo a rejjeição desttas ao Deccodificadorr, se não tive erem o me esmo códig go de pulso os. Para a acionar uma carg ga à distâância bastta ter o controle c reemoto e o receptor infraverme elho, pois ao invés de d capturaar o código o em bits emitidos ppelo contro ole remoto o para deco odificação, é possível identificaar apenas o start bit desse cóódigo que apresenta a nível lógicco baixo (0V) que e, conectaado ao pino p de interrupção i o externa a (B0) do o microcontrrolador com m um resisstor de pul ull-up de 2K K2, executa ará uma taarefa desejjada como, por exemp plo, o chavveamento de d um reléé para acio onamento de uma m máquina. Um m exemplo o de circuito o para aciionamento de cargaas remotass com con ntrole univversal pode e ser vista a abaixo e e em http:// /www.yo outube.co m/watch h?v=1l6s9 9xtrJl0 . [ 112 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 8. 8 5: Conexão de re eceptor in nfraverme elho de TV V no PIC. Notte que, se nesse casso não hou uver um sisstema de decodificaçção, o receptor deve e ter um invvólucro parra proteção o contra in nterferência as, pois esstá sujeito às fontes estáticas e dinâmicas. Abaixo um u progra ama exem mplo de accionamento o de um relé atrav vés de um m controle re emoto univversal. --------------------------------------------------------------------------------------------------------------------#include < <SanUSB.h h> short int re ele; #int_ext ext() void bot_e { rele=!rele;; output_bitt(pin_b5,re ele); delay_ms((1000); ///Tempo pa ara deixar o recepto or cego por 1 seg appós a 1ª atuação a da a interrupção } main() { clock_int_4 4MHz(); enable_intterrupts (global); // Possibilita P ttodas interrrupcoes enable_intterrupts (int_ext);//Habilita in nt. ext. 0 no pino o B0 ondde está o receptor infraverme elho while (TRU UE) { output_tog ggle(pin_B B7); [ 113 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá delay_ms((500); }} --------------------------------------------------------------------------------------------------------------------Para a filtrar as interferên ncias dinâm micas é neccessário co olocar o recceptor em uma caixa a preta com m um pequ ueno orifício ou em um tubo feito de caneta com m cola que ente, como o mostra a ffigura abaixxo, para re eceber som mente a luzz IR direcio onal. Figura 8. 6: Exem mplo de prroteção do o recepto or contra emissões e s externas s de raios s IR. CODIFIC CAÇÃO DE E RECEPTO OR INFRA AVERMEL LHO UTILI IZANDO A NORMA A RC5 RC5 5 é uma no orma unive ersal desen nvolvida pe ela Phillips para comaandos a disstância por infraverme elho utilizzada prin ncipalmentte em equipamen e ntos de áudio, televisores t , videocasse etes e outros o ap parelhos d domésticos, com uma áreea de allcance de e aproximad damente 10 0m. A n norma RC5 5 usa mo odulação b bifásica, ou u seja, có ódigo Man nchester. Cada C bit é separado por dois se emi-ciclos;; a metadee esquerda a e direita têm níveiss opostos. Se o bit a ser transm mitido for zero z (0), o seu lado esquerdo (primeiro semi-cicloo) é um e o seu lado o direito é zzero (segu undo semi-ciclo). See o bit a ser transm mitido for um (1), o seu lado o esquerdo é zero qua ando o seu lado direitto é um. Fig gura 8. 7:: Modulaç ção Bifásica. O código ttransmitido o consiste de d uma paalavra de 14 bits, sen ndo eles : - 2 bits pa ara ajuste do nível (2 2 start bits)). O primeiro e o seg gundo correesponde a 1; - 1 bit para controle e (toggle bit b ou flip) q que muda de estado o lógico cadda vez que e um botão o é pression nado na un nidade de comando a distância. Isto serrve para inndicar se o botão fo oi pressionad do uma vezz ou se con ntinua sen do pressio onado; [ 114 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá - 5 bits d de endereçço do siste ema para sseleção de e 1 dos 32 sistemas possíveis listados na a tabela 7. IIsso define e o tipo de aparelho q que se prettende conttrolar; - 6 bits de e comando o representtando 1 do os 128 com mandos possíveis. Issso define a ação que e se pretend de executar em um determinad d do aparelho o (sistema)) selecionaado. Na figura aba aixo vemoss os bits dee 1 a 14 e sua identificação: eem azul cla aro os startt bits 1 e 2 de equaliização; o bit b 3, FLIP P, em ama arelo; bits de 4 a 8 em azul in ndicando o endereçam mento; e oss bits de 9 a 14, indi cando o co omando a executar. Figura 8. 8 8: Sinal trransmitido. Na norma RC5, os dado os são mod dulados nu uma frequê ência portaadora de 30 0 a 40KHz, indicados pelos doiis últimos números do recep ptor TSOP P1740, TSO OP4836, TSOP4830 T . de 36 kHzz, o período de cada bit correspponde a 64 Consideran ndo uma modulação m 4 pulsos de e 1/36 kHz,, ou seja,, 64 vezzes 27,7 μ μs (micro segundoss), o em que corre esponde a aproximad damente 1772us. O programaa abaixo id dentifica o o enderreço do sistema e o comando d das teclas pressionad das por um m controle remoto RC C5. --------------------------------------------------------------------------------------------------------------------#include < <SanUSB.h h> //Progra ama com p protocolo RC5 R da Phiilllips de coontrole rem moto #include < <usb_san_ _cdc.h>// Biblioteca B p para comunicação se erial virtuall char chego oupc, coma mando, siste ema, bit_rxx; int32 i; void identiifica_bit(vo oid) { bit_rx=0; _rx=1;} ///identifica 0 ou 1 if (input(pin_b0))==1) {bit_ delay_ _us(860); // / //pula para o próxximo períod do para outra leitura } #int_ext void san_e ext() { output_tog ggle(pin_b b6); sistema=0 0; comando= =0; //******* ****************** ********* ********* ********* ** delay_us(7 750); //Tempo do sttart bit 1 ccom a perrda do tem mpo do prim mi-ciclo alto o meiro sem pela interrrupção delay_us(1 1720); //Te empo do start s bit 2 delay_us(1 1720); //Te empo do to oogle bit [ 115 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) sistema|=16; //Bit 5 do byte sistema 0b00010000 delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) sistema|=8; //Bit 4 do byte sistema 0b00001000 delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) sistema|=4; //Bit 3 do byte sistema 0b00000100 delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) sistema|=2; //Bit 2 do byte sistema 0b00000010 delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) sistema|=1; //Bit 1 do byte sistema 0b00000001 //************************************************* delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) comando|=32; //Bit 4 do byte comando delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) comando|=16; //Bit 5 do byte comando delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) comando|=8; //Bit 4 do byte comando delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) comando|=4; //Bit 3 do byte comando delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) comando|=2; //Bit 2 do byte comando delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) comando|=1; //Bit 1 do byte comando //************************************************* [ 116 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá write_eeprrom(0x10,sistema); write_eep prom(0x11 1,comando); ////gguarda ass variáveiss decodificad das while(read d_eeprom(0xfd)); printf (usb b_cdc_putcc,"comando o: %x\r\n"",read_eep prom(0x11))); delay_ms((500); //Te empo para a deixar o receptor cego por um segunndo após a primeira a atuação da a interrupçção } main() { clock_int_4 4MHz(); usb_cdc_in nit(); // Inicializa o protocolo p C CDC usb_init();; // Inicializza o protoccolo USB usb_task()); // Une o periférico com US B do PC //Para / depurar o proograma em m aplicação o real b_enumera ated()); //A Aguarda recconhecime ento da em mulação serrial via USB B while(!usb enable_intterrupts (global); // Possibilita P ttodas interrrupcoes enable_intterrupts (in nt_ext); // Habilita in nterrupcao externa 0 no pino B B0 onde esstá ligado o receptor in nfravermelho while(1) { if (usb_cdcc_kbhit(1))) //avisa se e chegou d dados do PC P { chegoupc= =usb_cdc_ _getc(); //sse chegou, retém o caractere c e compara com 'L' ou 'D' if (chegoupc=='L') {output_tog { ggle(pin_b b6); printf(usb_cdc_p putc, "\r\nT Testa led!\\r\n");} } ++i; if (i> >=10000) {i=0; { outpu ut_toggle( pin_b7);} //Led de visualização v o }} --------------------------------------------------------------------------------------------------------------------O resultad do dos co omandos gerados g q ue correspondem às à teclas ppressionad das de um m controle rremoto Ph hillips RC5 5 é mostrrado na figura abaixo. Mais detalhes no vídeo: http://w www.youtu ube.com/ /watch?v v=9VG7Ro okuDTs. Figura 8. 9: Leitura da te ecla pressionada via monito r serial. [ 117 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá ACIONAM MENTO DE D CARGA AS CA COM M TRIAC Com mo a maiorria dos sisttemas auto omáticos é acionada em corrennte alterna ada, para o controle d de fluxo de d energia de tais ssistemas é muito uttilizada um ma chave eletrônica, chamada TRIAC (trriode for Alternating A g Current) da família dos tirisstores, ou u seja, um m nte eletrônico equivalente a do ois retificad dores contrrolados dee silício (SC CR) ligadoss componen em antiparalelo que permite conduzir c a corrente elétrica e nos dois senntidos quan ndo recebe e um pulso n na base (d disparo). TRIACS E RELÉS DE D ESTAD DO SÓLIDO O Os Triacs optto-isoladoss, geralmen nte utilizad dos em ca argas CA, podem co onduzir noss dois semi--ciclos de uma onda a senoidal. Dessa forma, são utilizados tanto com mo relés de e estado sóllido sem controle c de e fase da ttensão, co omo també ém no conttrole de te ensão para a uma carga a CA atravvés de pu ulsos no gaatilho do triac em períodos p ddeterminad dos após a passagem pelo zero realizando o o controlee de fase da d tensão, que prom movem a co ondução de e tensão parra a carga até a nova a passagem m pelo zero o. Os relés de estado só ólido (Solid id State Relay R ), que e não aprresentam comutação o eletromecâ ânica, por isso o no ome, conssistem na alternativa a modernaa ideal para uso em m lugar dos relés eletrromecânico os com seu us contato os ruidososs e seus prroblemas mecânicos m . Na verdad de, a tendê ência é um ma substitu uição gradativa dos relés eletroomecânico os pelos de e estado sólido a base e de tiristorres como o os triacs. DIMMER ANALÓGICO Durrante a varriação da onda o seno idal na alim mentação do dimmeer mostrado o na figura a abaixo, esste disposittivo aprese enta um m momento zero z volt e, e conseqüüentemente e, corrente e nula passa ando pelo triac, que o trava no ovamente até o próx ximo dispaaro no próx ximo semi-ciclo, cujo tempo de epende o tempo t de ccarregame ento do capacitor dee 220nF lim mitado pelo o potenciôm metro em sé érie. Figura 8. 10: Cirrcuito dim mmer ana alógico. As ffiguras abaixo mostram o com mportamen nto das correntes em m cargas resistivas r e indutivas a após o cha aveamento do triac. [ 118 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 8. 11: Co omportam mento dass corrente es em carg gas resisttivas e ind dutivas após a o cha aveamentto do triac. Sup ponha que o TRIAC esteja e cond duzindo. Quando Q a corrente c invverte, passando pelo o zero, o triiac corta a alimentaçção da carrga pela fo onte CA e a partir ddaí a tensã ão sobre o capacitor ccomeça a crescer c no ovamente eem função do valor da d capacitâância e da resistência a em série, até atingirr a tensão de disparro (VD) no DIAC (exe emplos: 1N N5411 e 40583) 4 que e dispara o gatilho do triac. Note e que sem mpre que a corrente passa p peloo zero, o trriac corta a ão da carga e só voltta a condu uzir quando o o capacittor atinge a tensão de d disparo, alimentaçã O víídeo gerando uma onda senoidaal “fattiada”. no n linkk http://w www.youtu ube.com/ /watch?v v=u1HwZLRcrYQ mostra m a ooperação de e um triac.. CONTROL LE DIGITA AL DE DIS SPARO DE UM TRI IAC Para a de realizzar o conttrole digitaal do dispa aro de um m triac é nnecessário identificar iniciamentte a passa agem pelo zero da ssenóide da a rede (ze ero-crossingg), para a partir da aí decidir qua ando, em cada c semi--ciclo da seenóide da rede, será á realizado o chaveam mento pelo o triac da re ede para a carga CA. Para identtificar a pa assagem pelo zero daa senóide da rede fo oi utilizado o métod do simple es do o opto-acoplador, com interruupção ex xterna do o microcontrrolador por bordas de subida e descida, e o método do transsformador com ponte e de diodo com interrrupção ex xterna por borda de e subida. As A figuras abaixo mostram m ass forma de o ondas obtid das pelos dois d métod dos de sen nsoriamento o da rede. [ 119 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura a 8. 12: Ze ero-cross sing: form ma de ond das obtida as pelos d dois métodos de sensoriiamento da d rede. Notta-se que a forma de e onda pelo o cruzamen nto do zero o com senssoriamento o por opto-acoplador não é exa ata, sendo adequadaa para uso o por exem mplo, com sistemas de d controle e de ilumina ação. Nestte caso, pode p ser que os te empos t1 e t2, obttidos nos semi-cicloss simétricos negativo e positivo, respectivvamente, são s diferen ntes. Um eexemplo de placa de e mpressa com m o respecctivo circuitto é mostrrada na fgu ura abaixo.. circuito im Figura 8. 8 13: PCB B do circuito zero-c crossing. [ 120 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá No caso do transforma t dor e da ponte de diodo, que diminui o nível de e tensão e rebate o ssemi-ciclo negativo para posittivo, é posssível identtificar na base do transistor o momento em que a onda se enoidal vai a zero, pois p neste curto perríodo, o transistor á d coletor é levado a 5V, ou seja, s nível lógico altto, identificcando com m cortado e a saída do elo zero. maior exattidão a passsagem pe Fig gura 8. 14 4: Passage em da on nda pelo zero z da re ede. Mais detalhe es podem ser vistos no http://w www.youtu ube.com/ /watch?v v=u1HwZLRcrYQ. A fo orma de on nda pode ser s vista co om mais de etalhes na figura abaaixo: vídeo: Figura a 8. 15: Fo orma de onda o de e entrada e saída do circuito d detector de d zero O P Programa abaixo a iden ntifica a paassagem pelo p zero de d tensão e determina a partir daí, com d dois botõess, o ângulo o de fase ((atraso de chaveame ento) entree 300 valorres de uma a tabela, em m que cada a atraso co orrespondee a variação de 0,3% % da potênncia conced dida para a carga. --------------------------------------------------------------------------------------------------------------------- [ 121 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá #include <SanUSB.h> //Mais http://www.youtube.com/watch?v=7O9a0E_WXPA detalhes #define button PIN_E3 #define button1 PIN_B1 int16 pointer=0; int16 CONST table[300] = { 500, 482, 474, 468, 442, 439, 436, 433, 417, 415, 413, 411, 398, 396, 394, 392, 381, 379, 378, 376, 366, 365, 363, 362, 352, 351, 350, 348, 340, 338, 337, 336, 327, 326, 325, 324, 315, 314, 313, 312, 304, 303, 302, 301, 293, 292, 291, 290, 282, 281, 280, 279, 271, 270, 269, 268, 261, 260, 258, 257, 250, 249, 248, 247, 239, 238, 237, 236, 229, 228, 227, 225, 218, 217, 216, 215, 207, 206, 205, 204, 196, 195, 194, 193, 185, 183, 182, 181, 173, 172, 170, 169, 160, 159, 158, 157, 148, 146, 145, 144, 134, 132, 131, 130, 119, 117, 116, 114, 102, 101, 99, 97, 83, 81, 79, 77, 58, 55, 52, 49, };//*/ 463, 431, 409, 391, 375, 361, 347, 335, 323, 311, 300, 289, 278, 267, 256, 246, 235, 224, 214, 203, 191, 180, 168, 155, 142, 128, 113, 95, 74, 45, 459, 428, 407, 389, 373, 359, 346, 333, 321, 310, 298, 287, 277, 266, 255, 245, 234, 223, 213, 202, 190, 179, 167, 154, 141, 127, 111, 93, 72, 41, 455, 426, 405, 387, 372, 358, 345, 332, 320, 309, 297, 286, 276, 265, 254, 244, 233, 222, 211, 200, 189, 177, 165, 153, 139, 125, 109, 91, 69, 37, 451, 423, 403, 386, 370, 356, 343, 331, 319, 307, 296, 285, 275, 264, 253, 243, 232, 221, 210, 199, 188, 176, 164, 152, 138, 124, 108, 89, 67, 32, 448, 421, 401, 384, 369, 355, 342, 330, 318, 306, 295, 284, 273, 263, 252, 242, 231, 220, 209, 198, 187, 175, 163, 150, 137, 122, 106, 87, 64, 26, int16 i, phase_count=0; signed int j=0, disparo=0; #int_TIMER2 void function_t0 () { // set_timer2(239); //es zählt 20 us bis interrupt, d.h. 50kHz ++phase_count; [ 122 ] 445, 419, 399, 383, 368, 354, 341, 328, 317, 305, 294, 283, 272, 262, 251, 240, 230, 219, 208, 197, 186, 174, 162, 149, 135, 121, 104, 85, 61, 18 em Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá if(table[pointer]==phase_count){ output_high(PIN_B6); //triac an } } #INT_EXT void Crossing0() { output_low(PIN_B6); //triac aus phase_count=0; } void main(void) { clock_int_4MHz(); //Função necessária para habilitar o dual clock (48MHz para USB e 4MHz para CPU) //setup_wdt(WDT_ON); //Watch dog timer an disparo=read_eeprom(10); //carrega o último valo ajustado if (disparo>9) {disparo=0; write_eeprom(10,0);} //inicio de operação após gravação setup_adc_ports(AN0); //Habilita entradas analógicas - A0 setup_adc(ADC_CLOCK_INTERNAL); //Configuração do clock do conversor AD enable_interrupts (global); enable_interrupts (int_timer2); //enable_interrupts (int_timer1); enable_interrupts(INT_EXT); ext_int_edge(L_TO_H); //setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); //setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_1);// inicia o timer 1 em 8 x 62500 = 0,5s setup_timer_2(T2_DIV_BY_1,239,1); while(1) { ++i; if (i>=20000) {i=0; restart_wdt(); // must clear WDT flag in 16 sec. output_toggle(pin_b7);} //Led if(!input(button)) { delay_ms(30); //while(!input(button)) delay_ms(50); //filter pointer++; // if(pointer>=299) {pointer=299;} //o botão no pino E3 regula o ângulo de disparo write_eeprom(10, pointer); [ 123 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá } if(!inputt(button1)) { delay_ms(3 30); //whiile(!input(b button1)) delay_ms((50); poin nter--; if(po ointer<=1)) {pointer= =0;} writte_eeprom(10, pointe er); } } } --------------------------------------------------------------------------------------------------------------------DIMMER DIGITAL L COM CO NTROLE REMOTO R IR A fig gura abaixxo apresenta um um circuito de e controle digital d de lluminosidade de uma a lâmpada C CA por um m microcontrolador attravés de comandos de um coontrole rem moto IR de e TV utilizan ndo detector de passagem p pelo zero. O comand do do conntrole rem moto IR do o upção no pino B0, altera optoisolador, que é recebido por interru a o â ngulo de disparo do o MOC3020,, após a detecção d de passageem pelo ze ero por intterrupção nno pino B1 realizada a pelo optoa acoplador e, consequ uentementte, altera o tempo de conduçãão do TRIA AC BT, que e conduz pa ara a carga a tensão até a o final do semicicclo da onda senoidal.. Fig gura 8. 16: Contro ole digitall de lumin nosidade de d uma lâ âmpada CA. C É p possível veer mais deetalhes em m http://w www.youtu ube.com/ /watch?v v=7O9a0E E_WXPA . Abaixo o firmware do dimmer digital com m controle remoto IR R. --------------------------------------------------------------------------------------------------------------------#include B.h> //M Mais detaalhes m <SanUSB em http://www w.youtube e.com/watcch?v=7O9aa0E_WXPA A otao PIN_E E3 #define bo #define bo otao1 PIN_ _A0 [ 124 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá int16 i; signed int j=0, disparo=0; char chegoupc, comando, sistema, bit_rx, flag; void identifica_bit(void) { bit_rx=0; if (input(pin_b0)==1) {bit_rx=1;} //identifica 0 ou 1 delay_us(860); // //pula para o próximo período para outra leitura } #int_ext void san_ext() { disable_interrupts(INT_EXT1); sistema=0; comando=0; //************************************************* delay_us(700); //Diminuir de 750 pelo break etc. Tempo do start bit 1 com a perda do tempo do primeiro semi-ciclo alto pela interrupção delay_us(1720); //Tempo do start bit 2 delay_us(1720); //Tempo do toogle bit delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) sistema|=16; //Bit 5 do byte sistema 0b00010000 delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) sistema|=8; //Bit 4 do byte sistema 0b00001000 delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) sistema|=4; //Bit 3 do byte sistema 0b00000100 delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) sistema|=2; //Bit 2 do byte sistema 0b00000010 delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) sistema|=1; //Bit 1 do byte sistema 0b00000001 //************************************************* delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); [ 125 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá if (bit_rx) comando|=32; //Bit 4 do byte comando delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) comando|=16; //Bit 5 do byte comando delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) comando|=8; //Bit 4 do byte comando delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) comando|=4; //Bit 3 do byte comando delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) comando|=2; //Bit 2 do byte comando delay_us(860); //pula o primeiro semi-ciclo identifica_bit(); if (bit_rx) comando|=1; //Bit 1 do byte comando //************************************************* while(read_eeprom(0xfd)); if (comando==1) {output_toggle(pin_b7); disparo++; if(disparo>=8) {disparo=8;}} if (comando==2) {output_toggle(pin_b7); disparo--; if(disparo<=0) {disparo=0;}} enable_interrupts(INT_EXT1); } #INT_EXT1 void CruzaPor0() { if (!input(pin_b0)) break; delay_us(500); //devido a detecção de interrup. já com 2,5V como zero, //o inicio para o disparo se encontra ainda no semi-ciclo anterior, por isso, //o delay de inicial para entrar no próximo semi-ciclo delay_ms(disparo); //Para 60 Hz cada semi-ciclo aprox. 4,33ms e o ciclo 8,66ms if(flag==0){ output_high(PIN_B6); //dispara triac delay_us(300); output_low(PIN_B6); } if (j==0){ j=1; ext_int_edge(H_TO_L); // Muda a interrupção da borda de subida para descida da senóide } else { [ 126 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá j=0; ext_int_edge(L_TO_H); // Muda a interrupção da borda de descida para subida da senóide } } void main() { clock_int_4MHz(); //Função necessária para habilitar o dual clock (48MHz para USB e 4MHz para CPU) disparo=read_eeprom(10); //carrega o último valo ajustado if (disparo==0xff) {disparo=0; write_eeprom(10,0);} //inicio de operação após gravação enable_interrupts(GLOBAL); enable_interrupts(INT_EXT); enable_interrupts(INT_EXT1); ext_int_edge(L_TO_H); while(true) { ++i; if (i>=50000) {i=0; output_toggle(pin_b7);} //Led de visualização if(!input(botao))//botão de incremento manual de fase { delay_ms(100); while(!input(botao)) delay_ms(100); //filtro botão disparo++; // na prática está identificando o zero só uma vez por ciclo if(disparo>=8) {disparo=8;} //o botão no pino E3 regula o ângulo de disparo write_eeprom(10, disparo); enable_interrupts(INT_EXT1); } if(!input(botao1)) { delay_ms(100); while(!input(botao1)) delay_ms(100); disparo--; if(disparo<=0) {disparo=0;} write_eeprom(10, disparo); enable_interrupts(INT_EXT1); } } } --------------------------------------------------------------------------------------------------------------Alguns modelos comerciais de triac são o BT e o TIC. Com eles é possível construir dimmers (controladores de luminosidade de lâmpadas) e também controladores de velocidade de motores CA como ventiladores. Este princípio de controle possibilita também economia de energia, pois, enquanto ele não recebe o disparo, não há condução de corrente para a carga. Outra característica importante é a causa pela qual passou a substituir o reostato original, que acompanha os [ 127 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá motores das máquinas de costura. Como o controle de velocidade é feito pela parcela do semiciclo aplicado e não pela tensão, o torque se mantém mesmo em baixas velocidades. A outra série de MOC3041, já é projetada com circuito interno fixo para detecção de passagem por zero, assim o chaveamento é automático e não é possível nenhum controle do ângulo de disparo. LCD (DISPLAY DE CRISTAL LÍQUIDO) O LCD, ou seja, display de cristal líquido, é um dos periféricos mais utilizados como dispositivo de saída em sistemas eletrônicos. Ele contém um microprocessador de controle, uma RAM interna que mantém escritos no display (DDRAM) os dados enviados pelo microcontrolador e uma RAM de construção de caracteres especiais (CGRAM). Os LCDs são encontrados nas configurações previstas na Tabela abaixo. Número de Colunas 8 12 16 16 16 20 20 20 24 24 40 40 Número de Linhas 2 2 1 2 4 1 2 4 2 4 2 4 Quantidade de pinos 14 14/15 14/16 14/16 14/16 14/16 14/16 14/16 14/16 14/16 16 16 Os displays mais comuns apresentam 16 colunas e duas linhas. Eles têm normalmente 14 pinos ou 16 pinos. Destes, oito pinos são destinados para dados ou instrução, seis são para controle e alimentação do periférico e dois para backlight. O LED backlight (iluminação de fundo) serve para facilitar as leituras durante a noite. Neste caso, a alimentação deste led faz-se normalmente pelos pinos 15 e 16, sendo o pino 15 para ligação ao anodo e o pino 16 para o catodo. A ferramenta SanUSB tem uma biblioteca em C para este periférico 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 configuração: [ 128 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 9. 1: C onexão do d LCD no o PIC. AT Tabela abaixo traz um m resumo d das instruçções mais usadas u na comunicaçção com oss módulos LLCD. Tab bela - Insstruções mais m comuns DESCRIÇ ÇÃO MODO O R R/ Código o S W (Hex) Display Liga ((sem curso or) 0 0 0C Deslig ga 0 0 0A / 08 8 Limpa Disp play com Home H curso or 0 0 01 Controle d do Cursor Liga 0 0 0E Deslig ga 0 0 0C Deslocca para Essquerda 0 0 10 Deslocca para Direita 0 0 14 Curso or Home 0 0 02 Curso or Piscante 0 0 0D Curso or com Alte ernância 0 0 0F Sentido de e deslocam mento Para a esquerda a 0 0 04 cursor ao entrar com m caractere e Para a direita 0 0 06 ento da me ensagem Para a esquerda a 0 0 07 Deslocame ao entrar ccom caracttere Para a direita 0 0 05 Deslocam mento da mensage em Para a esquerda 0 0 18 sem entrrada de ca aractere Para a direita 0 0 1C End. da prrimeira possição primeeira linha 0 0 80 segun nda linha 0 0 C0 Utilizando o as instruçções do LC CD: a rolar o conteúdo do LCD um caracctere para a direita,, utilize o comando o Para lcd_envia a_byte(0,, instruçã ão), por exxemplo, lc cd_envia_ _byte(0,0 0x1C) e pa ara rolar o conteúdo do LC CD um caracteree para a esquerda, uttilize o comando o lcd_envia a_byte(0,,0x18). Exe emplo de uso do recu urso de rolaagem do display: d [ 129 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá A seguinte seqüência de comandos, gera o efeito de uma mensagem rolando no display. Para isso, será necessário declarar uma variável do tipo INT x. --------------------------------------------------------------------------------------------------------------////////////////////////////Cabeçalho Padrão//////////////////////////////// #include <SanUSB.h> #include <MOD_LCD_SANUSB.c> // RB0-RS, RB1-EN, RB2-D4, RB3-D5, RB4-D6, RB5-D7 int16 temperatura; int8 x; int1 led; main() { clock_int_4MHz(); lcd_ini(); // Configuração inicial do LCD setup_adc_ports(AN0); //Habilita entradas analógicas - A0 setup_adc(ADC_CLOCK_INTERNAL); delay_ms(100); printf(lcd_escreve,"AUTOMACAO FERRAMENTA SanUSB "); while (1) { set_adc_channel(0); delay_ms(10); temperatura=500*read_adc()/1023; lcd_pos_xy(1,2); // Posiciona segunda linha printf(lcd_escreve,"TEMPERATURA ATUAL=%lu C",temperatura); //Com LM35 for (x = 0; x < 15; x ++) // repete o bloco abaixo por 15 vezes { lcd_envia_byte(0,0x18); // rola display um caractere para esquerda lcd_envia_byte(0,0x0C); //Apaga o cursor led=!led; output_bit(pin_b7,led); delay_ms(500); } }} --------------------------------------------------------------------------------------------------------------Para ativar o cursor, utilize o comando lcd_envia_byte(0,0x0E). Para ativar o cursor piscante, utilize o comando lcd_envia_byte(0,0x0F), e para desativar o cursor, use lcd_envia_byte(0,0x0C); Posicionando o cursor: Para posicionar o cursor no LCD, podemos usar a função lcd_pos_xy(x,y), onde x e y são, respectivamente, a coluna e a linha onde o cursor deve ser reposicionado. [ 130 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá 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 não foi apagado, as informações antigas permanecerão na primeira linha, a menos que você as sobrescreva. STRING : É o trecho de caracteres delimitado por aspas duplas, que irá definir como será a seqüência 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 não possuírem uma representação impressa, são compostos por uma barra invertida seguida de um símbolo, 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 resultarão efeito em terminais seriais. Já os especificadores de formato são os locais, em meio ao texto, onde serão inseridas as variáveis que aparecerão após a STRING. Desta forma, estes especificadores devem obedecer algumas regras, de acordo com o tipo da variável a ser impressa. Observe a seguinte tabela : Tipo de Especificador de formato e exemplos de uso variável %u valor decimal (ex: 30) %x valor em hexadecimal (ex: 1D) int %3u valor decimal alinhado com três dígitos (ex: _30) %03u valor decimal alinhado 3 dígitos c/ zero (ex: 030) %i valor decimal com sinal. (ex: -2) signed int %02i decimal com sinal, 2 casas e zeros a esq. (ex: -02) %lu valor decimal (ex: 32345675); long %05lu valor decimal 5 casas c/ zeros a esquerda. (ex: int32 01000) signed %li valor decimal c/ sinal (ex: -500) long %4li valor decimal c/ sinal alinhado a esquerda (ex: -_500) signed int32 %f valor real. Ex: (23.313451) float %2.3f valor real c/ 2 casas inteiras, 3 decimais. Ex: (23.313) %c caractere. Ex: (A) char EXEMPLO: CONTROLE DE TENSÃO DE UMA SOLDA CAPACITIVA COM LCD O princípio de uma solda capacitiva acontece através da descarga instantânea de capacitores previamente carregados por dois terminais de solda em um ponto específico. Este projeto consiste em realizar o controle de tensão de uma solda capacitiva em baixo custo, através de um sistema microcontrolado utilizando o PIC18F2550. Para a leitura da tensão CC nos terminais da solda capacitiva, na ordem de 300V, é necessário [ 131 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá inicialmentte utilizar um divisorr de tensãão para ad dequação à tensão m máxima do o conversor AD do m microcontrolador de 5V. Esta relação do d divisor é compe nsada via software, multiplican ndo o valo or de tensã ão lido pelaa mesma relação de e divisão. O Os valores de tensão o real e te ensão de referência a na ordeem de 270V, 2 que pode seer increme entada ou u decrementtada por dois d botõe es de ajusste, são mostrados m em e um diisplay LCD D. A última a tensão de referência a ajustada é guardad da na mem mória. Desssa forma, quando o sistema é reiniciado a tensão de d referênccia assumee o último valor v ajustado. Qua ando a tensão real e a de referrência são iguais, a alimentação a o de 220V do circuito o de potênccia é cortad da pela ab bertura de um relé NF N (normalmente fecchado) e um u LED de e atuação a ascende indicando que a tenssão de refferência fo oi atingida.. O LED de d atuação o indica a p presença ou não de tensão ressidual noss capacitores de cargga e apaga somente e após a desscarga de tensão noss terminaiss de solda, o que con ntribui paraa evitar de escargas de e tensão noss operadorres durante e o manuseeio da sold da. Para a regular esse e sistem ma embarccado é neccessário medir a tenssão nos te erminais da a solda capa acitiva com m o multím metro e igu ualar com o valor atu ual indicad o no LCD através do o potenciôm metro de ajuste do div visor de te nsão. O circuito do sistema s de controle de d tensão e a foto do LCD apóss a montagem em p protoboard d indicando o a tensãoo de referrência para a desligamento (Vref) e a tensão o atual (Vaat) podem ser vistos na figura aabaixo. Figura 9. 9 2: Exem mplo de aplicação a do LCD. -----------------------------------------------------------------------------------------------------------------------//////////////////////////////Cabeça alho Padrãão////////////////////////////////// #include < <SanUSB.h h> #include < <MOD_LCD D_SANUSB B.c> // RB0 0-RS, RB1--E, RB2-D4 4, RB3-D5, RB4-D6, RB5-D7 R #define bo otaoinc pin n_a4 [ 132 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá #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 cálculo do AD que esoura 65536 unsigned int8 baixovref, altovref; // Como vref> 256 guardar o valor em 2 bytes, posições 10 e 11 //da EEPROM interna int1 flag1, flag2; main() { clock_int_4MHz(); lcd_ini(); // Configuração 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 reinício if (guardavref>=100 && guardavref<=500) {vref=guardavref;} // Resgata o último valor de //referência 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) { //********************************BOTÕES********************************** *** if (!input(botaoinc)) {flag1=1;} if (flag1==1 && input(botaoinc) ) {flag1=0;++vref; //se o botão foi pressionado (flag1==1) e se o botão 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 posicões 10 e 11 da eeprom interna if (!input(botaodec)) {flag2=1;} if (flag2==1 && input(botaodec) ) {flag2=0;--vref; //se o botão foi pressionado (flag2==1) e se o botão 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 posicões 10 e 11 da eeprom interna //************************************************************************ ***** if (vatual>=vref) {output_high(rele); output_high(ledrele); } //Abre o relé, avisa com led [ 133 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá if (vatual<=20) {output_low(rele); output_low(ledrele);} //Só desliga depois da descarga //************************************************************************ ***** valorAD = read_adc(); // efetua a conversão A/D vatual=((constante*5*valorAD)/1023); //Regra de três: 5 --------1023 // Tensão real (mV) -------ValorAD lcd_pos_xy(1,2); printf(lcd_escreve,"Vref=%lu Vat=%lu ",vref, vatual); delay_ms(300); }} --------------------------------------------------------------------------------------------------------------- MODELAGEM DE SINAIS DE SENSORES Uma das formas utilizadas para modelar sinais lineares e não lineares de sensores é utilizando funções de aproximação por equação da reta. Esta técnica consiste em obter o gráfico de resposta real tensão do sensor para diversas situações. Após a obtenção do gráfico real, gerar funções lineares deste gráfico através da equação da reta, traçando retas lineares próximas a curva real do gráfico não linear. Esta técnica pode ser utilizada para diversos tipos de sensores, como LDR, acelerômetro, etc. EXEMPLO: MODELAGEM DE UM LUXÍMETRO MICROCONTROLADO COM LDR LDR significa Light Dependent Resistor, ou seja, Resistor Variável Conforme Incidência de Luz. Esse resistor varia sua resistência conforme a intensidade de radiação eletromagnética do espectro visível que incide sobre ele. Um LDR é um transdutor de entrada (sensor) que converte a (luz) em valores de resistência. É feito de sulfeto de cádmio (CdS) ou seleneto de cádmio (CdSe). Sua resistência diminui quando a luz é intensa, e quando a luz é baixa, a resistência no LDR aumenta. Um multímetro pode ser usado para encontrar a resistência na escuridão (geralmente acima de 1MΩ) ou na presença de luz intensa (aproximadamente 100Ω). O LDR é muito frequentemente utilizado nas chamadas fotocélulas que controlam o acendimento de poste de iluminação e luzes em residências. Também é utilizado em sensores foto-elétricos. Este luxímetro tem em seu circuito sensor um LDR, um resistor divisor de tensão e uma fonte de tensão estabilizada, como mostra a figura abaixo. [ 134 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura a 10. 1: C Circuito se ensor com m LDR. Para a obter este e circuito e os valores de e tensão na saída para as diferentess luminosida ades, form ma tidos po or ANTON NIETI, B. Em E que ass mediçõess da tensão de saída a foram feita as e colocadas em uma u tabelaa juntamen nte com ass iluminânccias medid das por um m luxímetro comercial da marca MINIPA, m modelo ML LM-1010, de d 3 ½ díígitos , com m precisão o de 4% da a leitura + 0.5% do o fundo dee escala, na faixa de d 1 a 500000 Lux. Os valoress encontrado os são visttos na tab bela abaixo o. Os valorres em neg grito foram m considera ados como o limite de ccada equaçção da reta a. Co orrespondência entre a tensão da d saída e a iluminânncia Lux 2 5 12 20 36 60 94 130 1 180 2240 338 430 4 530 674 6 827 11000 1183 1404 1651 1923 Volt 4,9 9 4,9 4,8 4,7 4,5 4,3 4,1 4 3,8 33,6 3,3 3,1 3 3 2,8 2 2,7 22,5 2,4 2,3 2,1 2 Com base na tabela,, foi constrruído o grááfico da figura abaixo o. 2500 (Lux) 2000 1500 1000 500 0 2 2,3 2,5 2 2,8 3,1 3,6 4 4,3 3 4,7 4,9 (V)) Fig gura 10. 2 2: Gráfico o Lux x Vo olt. Para simp plificar o programa do o PIC, foi modelado a curva do o gráfico accima, divid dindo-a em m três retas com o mostra a figura abaixo. [ 135 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 10. 3: Mo odelagem m matemá ática dos valores v o obtidos. programa funciona da a seguinte maneira: lê o conversor A/D e multiplica esse valor Op por sua resolução (no caso o de um converso o AD de 10 bits, a resolução é de e aproximad damente 5 mV), enco ontrando eentão a ten nsão (V), de epois são ffeitas 3 comparaçõess (IF) para ssaber qual das três equações e aacima deve e ser utiliza ada para ccalcular a iluminância i a (Lux). A fiigura abaixxo mostra a o novo g gráfico lux versus vo olts, utilizanndo as equações 03, 04 e 05. Os ccálculos da a equação geral de ccada reta são mostrad dos a seguuir: 2500 0 (Lux) 2000 0 1500 0 1000 0 500 0 0 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 6 4,8 5 (V V) F Figura 10.. 4: Gráfic co lux x te ensão utillizando as s equaçõe es 3, 4 e 5. 5 [ 136 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá SUPERVISÓRIO Esta a interface e foi dese envolvida utilizando ambiente e de prog ramação Delphi® e através da a emulaçã ão via USB B de um caanal serial COM virtual. A figura ra 8 mostra a a tela do o supervisórrio para iluminância e temperattura. [ 137 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 10. 5: Fig gura da te ela do sup pervisório o para Iluminância a e Tempe eratura. Veja a abaixo, na n figura abaixo, a o eesquema circuito c ele etrônico moontado e a na figura a 10, a foto o do circuitto montado em operração. No final do tra abalho é m mostrado o programa a completo p para ler a iluminância no canall AD 1 e a temperatu ura do ambbiente com m um LM35 5 no canal A AD 0. Figurra 10. 6: Esquema E eletrônic co do circuito luxím metro. [ 138 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura a 10. 7: F Foto do cirrcuito mo ontado. O lu uxímetro mostrado m neste n trabaalho apressenta como o uma sollução de baixo b custo o para apliccações ond de não é necessáriio haver uma u grand de precisãão nas me edições. O método do o modelagem de currva pode seer aplicado o em várias ocasiõess onde não o se sabe a equação que gero ou o gráffico propo osto. Isto o ratifica a versatiilidade de e sistemass microcontrrolados. // Program ma Luxíme etro digital + termôm metro digita al c/ comun nicação viaa USB// ------------------------------------------------------------------------------------------------------------------------#include < <SanUSB.h h> float tens,lux,temp; main() { clock_int_4 4MHz(); lcd_ini(); usb_cdc_in nit(); // Inicializa o protocolo p C CDC usb_init();; // Inicializza o protoccolo USB usb_task()); // Une o periférico com a usb b do PC //while(!ussb_cdc_connected())) {} // espeera o proto ocolo CDC se conectaar com o driver d CDC //usb_waitt_for_enum meration();; //espera até que a USB do Pic c seja recoonhecida pelo p PC 1); setup_adcc_ports(AN0_TO_AN1 setup_adcc(ADC_CLO OCK_INTER RNAL); output_low w(pin_b6);; printf (lcd_ _escreve," \f "); [ 139 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá while(1) { 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) { if (tens>3.8) { lux=2057.2-494*tens; } lux=(900-180*tens)/1.2; } if (tens>2) { //Leitura válida 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 não válida { 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 } 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); } } --------------------------------------------------------------------------------------------------------------- [ 140 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá INTER RFACE I2C I2C significa Inter-IC I (IIntegrated Circuit). Este barra amento seerial foi de esenvolvido o pela Philip ps como o objetivo de conectarr CIs e perriféricos de e diferentees fabricantes em um m mesmo cirrcuito, com mo microco ontroladorres, memórias extern nas e relóógio em te empo real, usando o m menor núm mero de pinos possívvel. Este prrotocolo se erial necesssita somen nte de duass linhas: um ma linha se erial de dados (SDA)) e uma de e clock (SC CL). Quanddo o baramento não o está em usso, as duas linhas ficcam em nívvel lógico alto a forçada as pelos reesistores de pull-up. Figura F 11.. 1: Barramento I2C. C O b barramento o serial, co om transfeerência de e 8 bits po or vez, posssibilita co omunicação o bidireciona al com velo ocidade de e 100 Kbpss no modo o Padrão, 400 4 Kbps nno modo Fast, ou até é 3,4 Mbits/s no modo o High-spee ed. Esta a interface e apresen nta a filossofia multti-master onde o todoo CI da rede pode e transmitir ou recebe er um dado o, e o transsmissor ge era o seu próprio p clocck de transmissão. O número m máximo de CIs que podem seer conectad dos é limittado apennas pela ca apacitância a máxima do o barramento de 400 0pF. Um exemplo típico t de co onfiguraçã o I2C em TVs T é mosttrado na figgura abaix xo: [ 141 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura a 11. 2: Configuraç ção I2C em m TVs. REGRAS PARA TR RANSFERÊ ÊNCIA DE E DADOS alto. Cad da bit da liinha de da ados só é llido quand do o nível da d linha de clock esttá em níveel Figura 11. 3: Leiturra de dado os em com municaçã o. As ccondições de partida a e parada de transm missão são sempre geeradas pelo o MASTER R. O barrame ento é con nsiderado como c ocup pado após a condiçã ão de part ida, e livre e um certo o período de e tempo ap pós a condição de paarada. Uma transição o de H pa ara L da linha SDA DA (start bit bi ) durantee o tempo em que a linha SCL permanecce em H, ou seja, um dado válido, é definido como con ndição de e nsição de L para H da linha a SDA (sto op bit) duraante o período H daa partida e uma tran linha SCL, define um ma condiçã ão de para rada. Figurra 11. 4: Comandos C s de início o e fim de e comuniccação. da byte é acompa anhado d de um bit b de rec conhecimeento obrig gatório. O Cad reconhecim mento é gerado pelo o MASTER no décim mo bit libe erando a liinha SDA (nível alto)) durante a ocorrênciia do pulso de clockk de recon nhecimento o. Por suaa vez, o CI C receptor (SLAVE) é obrigado a levar a linha SDA A a nível baixo durante o peeríodo H do clock de e reconhecim mento. Figura a 11. 5: re econhecim mento do o byte. Se o SLAVE reconhecer r r o endereeço, mas depois d de algum tem mpo na tra ansferência a não receber mais ne enhum bytte de dado os, o MAST TER deverá abortar a transferê ência. Esta a [ 142 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá condição é indicada pelo SLAVE, devido à não geração do reconhecimento logo após a recepção do primeiro byte de dados. O SLAVE deixa a linha de dados em nível H e o MASTER gera a condição de parada. Caso haja uma interrupção interna no SLAVE durante a transmissão, ele deverá levar também a linha de clock SCL a nível L, forçando o MASTER a entrar em um modo de espera. Para escrever um dado nos escravos é necessário enviar um byte de endereço do escravo, onde os 4 bits mais significativos identificam o tipo de escravo (por exemplo, memórias EEPROM é 1010 ou 0xa0 e RTC é 1101 ou 0xd0 (com exceção do RTC PCF8583 cujo endereço também é 0xa0). Os 3 bits intermediários especificam de um até 8 dispositivos, que são discriminados nos pinos de endereço de cada escravo, e o bit menos significativo R/W indica se a operação é de leitura (1) ou escrita (0). Após isso, deve-se enviar uma palavra de 8 ou16 bits de endereço onde se quer escrever e depois o dado. No final do pacote uma condição de parada (i2c_stop). Figura 11. 6: Escrita de dados. Função da biblioteca I2C que descreve essa operação de escrita em memória EEPROM: --------------------------------------------------------------------------------------------------------------void escreve_eeprom(byte dispositivo, long endereco, byte dado) // Escreve um dado em um endereço do dispositivo // dispositivo - é o endereço do dispositivo escravo (0 - 7) // endereco - é o endereço da memória a ser escrito // dado - é a informação a ser armazenada { if (dispositivo>7) dispositivo = 7; i2c_start(); i2c_escreve_byte(0xa0 | (dispositivo << 1)); // endereça o dispositivo livrando o LSB que é o R\W i2c_le_ack(); // Lê reconhecimento do escravo i2c_escreve_byte(endereco >> 8); // parte alta do endereço de 16 bits i2c_le_ack(); i2c_escreve_byte(endereco); // parte baixa do endereço de 16 bits i2c_le_ack(); i2c_escreve_byte(dado); // dado a ser escrito i2c_le_ack(); i2c_stop(); delay_ms(10); // aguarda a programação da memória [ 143 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá --------------------------------------------------------------------------------------------------------------Para a operação de leitura de um escravo é necessário um start repetido e no final do pacote um sinal de não-reconhecimento (nack) e uma condição de parada (i2c_stop). Figura 11. 7: Recepção e transmissão de dado. A Função da biblioteca I2C que descreve este protocolo de operação de leitura de memória EEPROM é a seguinte: --------------------------------------------------------------------------------------------------------------byte le_eeprom(byte dispositivo, long int endereco) // Lê um dado de um endereço especificado no dispositivo // dispositivo - é o endereço do dispositivo escravo (0 - 7) // endereco - é o endereço da memória a ser escrito { byte dado; if (dispositivo>7) dispositivo = 7; i2c_start(); i2c_escreve_byte(0xa0 | (dispositivo << 1)); // endereça o dispositivo i2c_le_ack(); i2c_escreve_byte((endereco >> 8)); // envia a parte alta do endereço de 16 bits i2c_le_ack(); i2c_escreve_byte(endereco); // envia a parte baixa do endereço de 16 bits i2c_le_ack(); i2c_start(); //repetido start // envia comando para o escravo enviar o dado i2c_escreve_byte(0xa1 | (dispositivo << 1)); endereça o dispositivo e colocando em leitura 0xa1 i2c_le_ack(); dado = i2c_le_byte() // lê o dado i2c_nack(); i2c_stop(); return dado; --------------------------------------------------------------------------------------------------------------- [ 144 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá MEMÓRIA A EEPROM M EXTERN NA I2C Para a sistemass embarcad dos em qu e são nece essários a aquisição dde dados de d mais de e 256 bytess (capacid dade da EEPROM E i nterna do os microco ontroladorees), é necessária a utilização de memórrias EEPRO OM externaals. Os mod delos maiss comuns ssão o 24LC C e 24C256 6 (256 Kbitts que co orresponde e a 32Kb bytes). Esstas memó órias posssuem oito o pinos e apresentam m, entre outras o característicass, interfacce de comunicação II2C. A figura abaixo o mostra o ccircuito sim mples de um ma EEPRO OM I2C ligada nn ferra amenta SaanUSB. Figurra 11. 8: Uso U de me emória EE EPROM ex xterna via a I2C. O p programa abaixo a mo ostra o arm mazenamento de valores digittal de tenssão de 0 a 5000mV de um pote enciômetro, a cada seegundo, em m um buffe er (região de memórria circular)) de 150 re egistros de e 16 bits na memó ória EEPRO OM externa a, ou sejaa, 300 byttes, que é mostrado via emulaçção serial somente s qu uando a te ecla ‘L’ é pressionada p a. --------------------------------------------------------------------------------------------------------------------#include < <SanUSB.h h> #include < <usb_san_ _cdc.h>// Biblioteca B p para emula ação da co omunicaçãoo serial #include < <i2c_sanussb.c> unsigned iint16 i,j,en ndereco=0 0, posicao= =0, valorgrravado; int32 tenssao_lida32; //Varia de 0 a 5 5000mV (16bits), mas m é int332 porque o cãlculo o ultrapassa 65536 int8 byte1,byte2,byte e3,byte4; // / 4 Partess do valor int32 i tensa ao_lida32 ando; char coma [ 145 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá 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 periférico com a usb do PC setup_adc_ports(AN0); //Habilita entradas analógicas - A0 setup_adc(ADC_CLOCK_INTERNAL); while(1){ set_adc_channel(0); delay_ms(10); //Tensão é 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 tensão 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 %x\r\n",byte4,byte3,byte2,byte1);//Debug Hexadecimal = %x %x posicao=2*endereco; //Endereço é 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 %x = ++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 função {comando=usb_cdc_getc(); if (comando=='L'){ printf(usb_cdc_putc, "\r\n\nEEPROM:\r\n"); // Display contém os primeiros 64 bytes em hex da eeprom externa i2c [ 146 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá for(i=0; i<10; ++i)) { //10lin nhas * 30ccolunas = 300 3 bytes (int16 i,j) or(j=0; j<1 15; ++j) { fo ado= 256* *le_eeprom m(0,(i*30)+ +2*j) + le_ _eeprom(0 0,(i*30)+2 *j+1); //150 Valoress valorgrava de 16 bits ou 300 de e 8 bits. printf(usb b_cdc_putcc, "%lu ", vvalorgravad do ); } printtf(usb_cdc_putcc, "\n\r"); }}} //*********** ************** ************* *************************************** ***** output_toggle(p pin_b7); delay_ms((1000); }} Figura 11 1. 9: Leitu ura de valores da memória. m . RTC (R RELÓGIIO EM TEMPO T REAL) O R Real Timee Clock I2C DS13077 é um relógio/cale endário seerial de baixo custo o controlado o por um cristal exterrno de 32.7 768 Hz. A comunicaç ção com o DS1307 é através de e 2 interface sserial I C (SCL e SDA). Oito bytes de RAM do RTC são usados pa ara função o relógio/callendário e são config gurados naa forma Binary Code ed Decimal – BCD. É possível a retenção dos dadoss na falta a de enerrgia utiliza ando uma a bateria de lítio de 3V 500mA/h h conectad da ao pino 3. [ 147 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá Figura 12. 1: RTC DS1307 e similar. Para representar números decimais em formato binário, o relógio DS1307, bem como calculadoras e computadores utilizam o código BCD, que incrementa a parte alta do byte hexadecimal quando o número da parte baixa é maior que 9. Isto é possível somando 6 (0110b) ao resultado maior que 9. Este código facilita a transmissão de dados e a compreensão do tempo, tendo em vista que em formato hexadecimal, apresenta o valor em decimal. Para transformar decimal em BCD, é possível dividir o número binário (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 relógio DS1307, após o power-on, é necessário incrementar os segundos quando estiverem todos os registros da RAM em zero. A bateria GP 3.6V garante o funcionamento do relógio e também o processamento do PIC16F877A. Testes indicaram que a bateria suportou o processamento e incremento automático do relógio por cerca de sete horas sem alimentação externa. Figura 12. 2: Registros de tempo DS1307. [ 148 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá //PROGRAMA PARA CONFIGURAR E LER UM RELÓGIO RTC I2C VIA MONITOR SERIAL///////////////////// --------------------------------------------------------------------------------------------------------------#include <SanUSB.h> #include <usb_san_cdc.h>// Biblioteca para emulação da comunicação serial #include <i2c_sanusb.c> Char entrada,funcao,endrtc,valorrtc1,valorrtc2; unsigned int endereco, valor,valorbcd, numquant; boolean led; /************************************************************************* **** * Conversão BCD P/ DECIMAL ************************************************************************** **/ int bcd_to_dec(int valorb) { int temp; temp = (valorb & 0b00001111); temp = (temp) + ((valorb >> 4) * 10); return(temp); } /************************************************************************* **** * Conversão DECIMAL p/ BCD ************************************************************************** ***/ int dec_para_bcd(unsigned int valord) { return((0x10*(valord/10))+(valord%10));//Coloca a parte alta da divisão 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 periférico com a usb do PC while (1) { //************************************************************************ ***** if (usb_cdc_kbhit(1)) { //verifica se acabou de chegar um novo dado no buffer de recepção, depois o kbhit é zerado entrada=usb_cdc_getc(); //comando é o Byte recebido pela serial usb_cdc_putc, [ 149 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá if (entrada=='A') { funcao=usb_cdc_getc(); switch (funcao) //UTILIZAR VALORES DECIMAIS EM DOIS DIGITOS. ex:06 ou 23 ou 15 { ////////////////////////FUNCAO 4: CONFIGURA RELÓGIO//////////////////////////////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Ê RELÓGIO/////////////////////Ex: A5- Lê o relógio e o calendário 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; }}} //************************************************************************ ***** led = !led; // inverte o led de teste output_bit (pin_b7,led); delay_ms(500); [ 150 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá } } -------------------------------------------------------------------------------------------------------------------- EXEMPLO O: PROTÓ ÓTIPO DAT TALOGGE ER USB DE E BAIXO C CUSTO Em muitos siistemas de e aquisição o de dado os e contro ole é neceessária a medida de e algumas g grandezas físicas, como c exem mplo, tem mperatura, pressão e velocida ade, entre e outras. Ta ais grandezzas são ine erentes a aalguns fenô ômenos físsicos e, em m geral, sua natureza a é analógicca. Isto é, trata-se t de e variáveis que assum mem valore es contínuoos e reais,, diferentess de sinais digitais que são de escontínuo os e expre essados se egundo reepresentaçã ão binária. Comumente quando o as saída as analógi cas dos sensores s são s processsadas por sistemass digitais, há á a necesssidade do condicionam c mento do sinal para que os sinnais proven nientes doss sensores ssejam adeq quados às característticas de um m converso or AD. Assiim, com o uso de um m microcontrrolador do otado de um u converrsor interno AD para a aquisiçãoo de dado os, o valor analógico convertido o para digital é proccessado pe elo software de conttrole de acordo com m decisões ló ógicas base eadas em comparaçõ ões ou em operaçõess matemátticas. A bateria em paralelo co om a fontee de alimentação tem m uma graande relevâ ância neste e projeto de e aquisição o de dadoss. Além dee evitar re eset por qu ueda de teensão, ela permite a mudança da fonte de alimen ntação da USB para a a fonte externa ssem desco onexão do o sistema. O cconversor TTL/EIA-2 232 Max23 32 é utiliza ado para conexão ddo módulo o GPRS ao o sistema, cujos comandos AT sã ão descrito os no próxiimo tópico. Figura 1 13. 3: Dattalogger. [ 151 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá Este sistema de aquisição 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 execução do protocolo i2c, proveniente do oscilador RC interno de 4 MHz. (#byte OSCCON=0XFD3 //Aponta o registro do oscilador interno para configuração de 4MHz na função Main -> OSCCON=0B01100110;). Figura 12. 4: Comunicação PIC com PC e via I2C. --------------------------------------------------------------------------------------------------------------///////////////////////////////////////////////////////////////////////// //// Este programa utiliza duas fontes de clock, uma para o canal USB//// //// de 48MHz proveniente do oscilador externo de 20MHz e outra para //// //// o processador na execução do protocolo i2c, proveniente do //// //// oscilador interno 4 de MHz////////////////////////////////////////// //// O Watch Dog Timer (WDT) protege contra travamento do programa ///// ////////////////////////////Cabeçalho Padrão///////////////////////////// #include <SanUSB.h> //#device ADC=8 #include ".\include\usb_san_cdc.h"// Biblioteca para comunicação serial #include <i2c_dll16sanc.c> char escravo,funcao,sensor,endrtc, valorrtc1,valorrtc2,posmeme1,posmeme2,posmeme3,posmeml1,posmeml2,posmeml3,posq uant1,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,mes,mesdec,ano,anodec; unsigned int16 i, j,numpose, numposl,num16,endpromext,k,puloext,bufferdia; int8 regi[2]; boolean led,ledint,flagwrite; /************************************************************************* **** * Conversão BCD P/ DECIMAL *******************************************************************/ int bcd_to_dec(int valorb) [ 152 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá { int temp; temp = (valorb & 0b00001111); temp = (temp) + ((valorb >> 4) * 10); return(temp); } /************************************************************************* **** * Conversão DECIMAL p/ BCD ***************************************************************/ int dec_para_bcd(unsigned int valord) { return((0x10*(valord/10))+(valord%10));//Coloca a parte alta da divisão por 10 no nibble mais significativo } ////////////////////////////////////////////////////////////////////////////////// #int_timer1 void trata_t1 () {--mult; if (!mult) {mult=2; // 2 *(48MHz/4MHz) - 4 seg hora=le_rtc(2); minuto=le_rtc(1); segundo=le_rtc(0); dia=le_rtc(4); mes=le_rtc(5); ano=le_rtc(6); ledint = !ledint; // inverte o led de teste - pisca a cada 2 *12 interrupcoes = 1 seg. output_bit (pin_b0,ledint); reg= read_adc(); //Tensão e corrente //escreve_eeprom(0,end,reg); não funciona a escrita i2c dentro da interrupção 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( hora); diadec=bcd_to_dec(dia);mesdec=bcd_to_dec(mes);anodec=bcd_to_dec(ano); if (segundodec==05 && (minutodec==00||minutodec==10||minutodec==20||minutodec==30||minutodec==40|| minutodec==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); }//Não aceita DE JEITO NENHUM escrever na eeprom ext por interrupção do timer via i2c [ 153 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá //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 periférico com a usb do PC OSCCON=0B01100110; //Clock interno do processador de 4MHZ setup_adc_ports(AN0_TO_AN1); //Habilita entradas analógicas - A0 A1 setup_adc(ADC_CLOCK_INTERNAL); //Configuração do clock do conversor AD enable_interrupts (global); // Possibilita todas interrupcoes enable_interrupts (int_timer1); // Habilita interrupcao do timer 1 setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8);// inicia o timer 1 em 8 x 62500 = 0,5s set_timer1(3036); setup_wdt(WDT_ON); //Habilita o temporizador cão de guarda - resseta se travar o programa principal ou ficar em algum usb_cdc_getc(); while (1) { //************************************************************************ ***** if (flagwrite==1) {flagwrite=0; //Flag de gravação setada na interrupção 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(); //Tensão 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 não haja reset [ 154 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá delay_ms(500); //************************************************************************ ***** if (usb_cdc_kbhit(1)) { //verifica se acabou de chegar um novo dado no buffer de recepção, //depois o kbhit é zerado para próximo 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 { //************************************************************************ ***** case '4': { endrtc=usb_cdc_getc(); valorrtc1=usb_cdc_getc(); valorrtc2=usb_cdc_getc(); //Ex: A4M43 - Altera os minutos para 43 if if if if if if (endrtc=='H') { endereco=2;} (endrtc=='M') { endereco=1;} (endrtc=='S') { endereco=0;} (endrtc=='D') { endereco=4;} (endrtc=='N') { endereco=5;} (endrtc=='Y') { endereco=6;} //Escreve o endereco das horas //Escreve o endereco dos minutos //Escreve o endereco dos segundos //Escreve o endereco do dia //Escreve o endereco do mes //Escreve o endereco do ano if (valorrtc1>='0'&&valorrtc1<='9') {numquant=(valorrtc1-0x30);} if (valorrtc2>='0'&&valorrtc2<='9') {numquant=numquant*10+(valorrtc2-0x30); valor=numquant; if if if if if if (endereco==0) (endereco==1) (endereco==2) (endereco==4) (endereco==5) (endereco==6) { { { { { { if(valor>59) if(valor>59) if(valor>23) if(valor>31) if(valor>12) if(valor>99) {valor=0;}} {valor=0;}} {valor=0;}} {valor=1;}} {valor=1;}} {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); [ 155 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá 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; //////////////////////FUNCAO 5: LÊ RELÓGIO////////////////////////Ex: A5- Lê o relógio e o calendário 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(); 0x30);} if (posmeme1>='0' && posmeme1<='9') {bufferdia=(posmeme1-0x30);} if (posmeme2>='0' && posmeme2<='9') {bufferdia=bufferdia*10+(posmeme2if (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 gráfico 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 próxima linha } break; ", ", }}} } } --------------------------------------------------------------------------------------------------------------- [ 156 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá TRANSMISSÃO DE DADOS VIA GSM A sigla GSM significa Global Standard Mobile ou Global System for Mobile Communications que quer dizer Sistema Global para Comunicações Móveis. O GSM é um sistema de celular digital baseado em divisão de tempo, como o TDMA, e é considerado a evolução deste sistema, pois permite, entre outras coisas, a troca dos dados do usuário entre telefones através do SIM Card e acesso mais rápido a serviços WAP e Internet, através do sistema GPRS. A transmissão de dados GSM pode ser feita por: - GPRS (General Package Radio Service): É uma conexão em uma rede de pacote de dados. Uma vez conectado nessa rede, o sistema estará sempre on line, podendo transferir dados imediatamente. O GPRS é compatível com o protocolo de rede TCP/IP e as operadoras de GSM disponibilizam um gateway para a Internet, possibilitando conectar e controlar equipamentos wireless através da Internet. Como o GPRS é baseado no protocolo IP, ele necessita de autenticação de um servidor da internet. - SMS (Short Message Service): É o serviço de envio/recebimento de pequenas mensagens de texto do tipo datagrama, sem autenticação de um servidor de internet. Os Modems GSM são controlados através de comandos AT. Esses comandos são normalizados pelas normas GSM 07.07 e GSM 07.05. A manipulação do modem pode ser realizada em algum emulador de comunicação serial como o Hyperterminal, nele deve-se ajustar para 9600 bps,e não esquecendo de instalar o SIM Card no modem. COMANDOS AT PARA ENVIAR MENSAGENS SMS DE UM COMPUTADOR PARA UM CELULAR OU MODEM GSM A seguinte tabela lista os commandos AT para escrever e enviar mensagens SMS: Comando AT Significado +CMGS Envia mensagem +CMSS Envia uma mensagem armazenada +CMGW Escreve uma mensagem na memória +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 [ 157 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá 5-AT+CMGS="+558588888888" //<ctrl + z (minúsculo)> digita-se o texto após > 6-> Teste de mensagem 7- OK +CMGS: 170 OK Abaixo está o significado de cada linha: 1- Testa conexão com o modem. 2- Modem conectado. 3- Coloca o celular no modo texto. 4- Modo texto confirmado. 5- Número 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. 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 estão em negrito para diferenciar de suas respostas. [ 158 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá 1-AT 2-OK 3- AT+CM MGF=1 4- OK 5-AT+CM MGS="+55 58588888 8888" 6->Intrus são 7- OK As figu uras abaixxo apresen ntam a fotto em pro otoboard e o circuitto esquem mático para a transmissã ão GPRS/G GSM. A conexão c U USB observado no esquemaa, foi utiliizada pela a ferramenta a SanUSB para a alim mentação d do circuito o e gravaçã ão do proggrama no PIC P atravéss do PC. O LED verde e foi usado por estaa ferramen nta para sinalizar o momento em que o sistema esstava no modo m de gravação. O vermelho simulou o acionameento do alarme, como o descrito a anteriormen nte. As ch haves coneectadas aos pinos 23, 24 e 25, representam ass chaves sin nalizadorass dos três sensore s utilizado os. A figu ura abaixoo mostra também t o dispositivo o MAX232 usado na interface RS/EIA-23 32 entre o microconttrolador e o modem. Este, repre esentado na n figura apenas a pello conector DB9, posssui o pinoo 2 para trransmissão o de dados e o 3 parra recepçã ão, já que se trata de um equipamentoo do tipo DCE (Data ta Comunicattion Equipm ment). [ 159 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 14. 1: Esque emático e foto do datalogge d er conecta ado ao PIC. #include < <SanUSB.h h> short int lledpisca; #USE RS2 232 (BAUD=9600,XMIT=PIN_C6 6,RCV=PIN N_C7,strea am=PC) main(){ clock_int_4 4MHz(); printf("AT+ +CMGF=1\\r"); //configura mod do texto pa ara o mode em / ledpisca é igual ao o inverso de ledpisca ledpisca=!!ledpisca; // output_bitt(pin_b7,le edpisca); /// b7 recebee o valor de ledpisca delay_ms((2000); printf("AT+ +CMGS=\""+5585888 888888\"\rr"); //5- En nvia para o numero dde destino ledpisca=!!ledpisca; output_bitt(pin_b7,le edpisca); delay_ms((2000); do\r"); //6 - escreve a mensage em para o modem GSSM printf("Alarme atuad putc(0x1A A); // contro ol z [ 160 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá 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); }} 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 conexões seriais padrão EIA/RS-232 e EIA/RS485, ele também pode ser usado como um protocolo da camada de aplicação de redes industriais tais como TCP/IP sobre Ethernet. Este é talvez o protocolo de mais utilizado em automação industrial, pela sua simplicidade e facilidade de implementação. A motivação 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 resolução de 10 bits; - Ferramentas de desenvolvimento gratuitas e possibilidade de programação da memória de programa sem necessidade de hardware adicional, bastando uma porta USB; - Estudo das características construtivas de hardware e de software de uma rede MODBUS. MODELO DE COMUNICAÇÃO O protocolo Modbus é baseado em um modelo de comunicação mestre-escravo, onde um único dispositivo, o mestre, pode iniciar transações denominadas queries. O demais dispositivos da rede (escravos) respondem, suprindo os dados requisitados pelo mestre ou executando uma ação por ele comandada. Geralmente o mestre é um sistema supervisório e os escravos são controladores lógico-programáveis. Os papéis de mestre e escravo são fixos, quando se utiliza comunicação serial, mas em outros tipos de rede, um dispositivo pode assumir ambos os papéis, embora não simultaneamente. [ 161 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figu ura 14. 1:: Checage em de dad dos. DETECÇÃ ÃO DE ERR ROS Há dois meca anismos para detecçção de errros no pro otocolo Moodbus serial: bits de e paridade e em cada ca aractere e o frame ch heck seque ence ao fin nal da men nsagem. O modo RTU U utiliza com mo frame check seq quence um m valor de 16 bits para p o CR RC (ciclic redundance r e 16 15 1 2 check), utilizando co omo polinô ômio, P(x) = x + x + x + 1. 1 O registrro de cálcu ulo do CRC C deve ser in nicializado com o valor 0xffff. MODOS DE D TRANS SMISSÃO Exisstem doiss modos de transm missão: ASCII A (American Coode for Information n Interchang ge) e RTU (Remote Terminal T U Unit), que são selecio onados duurante a co onfiguração o dos parâm metros de comunicaçã c ão. Com mo a comu unicação ge eralmente utilizada em e automação industtrial é em modo m RTU, o projeto p proposto fo oi desenvo olvido nestaa forma de e comunica ação. A implementação prática p de um proj eto com o modbuss embarcaado é mo ostrada no o diagrama d de blocos abaixo. [ 162 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura a 14. 2: Diagrama D de blocos comunicação Mo odBus. Para a testar a comunica ação com escravo Modbus M (m microcontroolador) em m protocolo o RTU, atravvés da porrta serial emulada e peela USB do o PC, é po ossível utilizzar o Modbus Tester que é um software livre de Mestre M MOD DBUS escrrito em C+ ++. Ele podde ser utillizado para a testar se o desenvolvimento das d rotinass de proce essamento do protoccolo Modbu us contidass no microcontroladorr. Durante o teste é possível utilizar u tam mbém um sistema supervisório o real como o Elipse SCADA. Figura a 14. 3: So oftware d de teste de d comunicação Mo odBus. Os sistemas supervisórrios são so oftwares que q permittem que ssejam mon nitoradas e rastreadass informaçõ ões de um processo produtivo ou instalaç ção física. T Tais inform mações são o coletadas através de e equipam mentos de aquisição de dadoss e, em seeguida, ma anipuladas, analisadass, armazen nadas e posteriorm mente aprresentadas ao usuáário. Estess sistemass também sã ão chamad dos de SCA ADA (Superrvisory Con ntrol and Data D Aquisiition). [ 163 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá Para comunicar com o supervisório Elipse é necessário instalar um driver dedicado a comunicação ModBus RTU, que é fornecido gratuitamente pela própria Elipse. O modo Modbus RTU com microcontrolador PIC desse projeto, mostrado no link http://www.youtube.com/watch?v=KUd1JkwGJNk , suporta funções de leitura (3) e escrita (16). --------------------------------------------------------------------------------------------------------------#include <SanUSB.h> #include <usb_san_cdc.h>// Biblioteca para comunicação 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(); buffer[5]=usb_cdc_getc(); buffer[6]=usb_cdc_getc(); buffer[7]=usb_cdc_getc(); delay_ms(3); [ 164 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá 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],buffer[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],buff er[4],buffer[5],buffer[6],buffer[7]); //7 bytes } main() { clock_int_4MHz(); usb_cdc_init(); // Inicializa o protocolo CDC usb_init(); // Inicializa o protocolo USB usb_task(); // Une o periférico com a usb do PC set_tris_b(0b00000000); while(1) [ 165 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá { if (usb_cdc_kbhit(1)) { //verifica se acabou de chegar um novo dado no buffer USB, depois o kbhit é zerado para próximo 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 função contida no segundo byte buffer[1] y = buffer[1]; } if (y==3) //verifica se a função é para leitura e encaminha para leitura de variável do microcontrolador { } ler(); rxler(); if (y==16) //verifica se a função é para escrita no microcontrolador, ou seja, comando de atuação do uC { escrever(); rxescrever(); } } } } --------------------------------------------------------------------------------------------------------------O fluxograma desse firmware é mostrado abaixo: [ 166 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Figura 14 4. 4: Flux xograma d do sistema de comunicação o ModBus.. Notte que a co omunicação o serial dessse projeto o foi emula ada via USB B, para ap plicação em m um processso real é necessário n utilizar um m transcepttor ou TTL L/EIA-232 ((MAX232) ou transcepto or ou TTL/E EIA-485 (M MAX485). C Com o MOD DBUS emb barcado é ppossível inttegrar um microcontrrolador, prreservando o as limitaçções de fun nções, em um processso de auto omação industrial q que utiliza esse proto ocolo. INTRODU UÇÃO À SISTEMAS S S OPERAC CIONAIS EM E TEMPO REAL (R RTOS) Um sistem ma operacio onal em te empo real (RTOS) é um progrrama (geraalmente ch hamado de e kernel), qu ue controla a alocaçção de tareefas quand do o proce essador esstá operando em um m ambiente multitarefa as (multita asking) con correntes. O uso de d um sisttema operaacional em m tempo real (RTOS) para proccessamento o de multita arefas é uma realidade cadaa vez ma ais presente nos prrojetos de e sistemass embarcado os. A fe erramenta computaacional Sa anUSB im mplementaa um RT TOS livre, desenvolviido pelo russo Victo or Timofeeev, atravéss dos compiladores M MPLABX C18 C e CCS, baseado e em interrup pção de tem mporizadorres. [ 167 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá Uma das principais cara acterísticass de um RT TOS é a ca apacidade de processsar tarefass eja, tarefass paralelass. Dessa forma, o RTOS R tornaa a progra amação de e concorrenttes, ou se projetos rreais mais simples, pois bastaa descreve er cada ta arefa em uuma funçã ão task do o firmware, que o RTO OS se enca arrega do gerenciam mento do processo. D Dessa forma, O RTOS S é baseado o na ideia de d multitarrefas (multtithread), onde cada a tarefa é uuma funçã ão em C do o firmware e em laço inffinito. Em um sistem ma multitarrefa, inúmeeras tarefa as exigem tempo da CPU, e um ma vez que e existe ape enas uma CPU, é ne ecessária aalguma forrma de organização e coorden nação pelo o RTOS para a que cada a tarefa te enha o tem mpo que ne ecessita. Na N prática, cada tare efa tem um m intervalo d de tempo muito currto, assim parece que as tare efas são eexecutadass de forma a paralela e simultânea a. Com mo exxemplo, estão dispon níveis uma vídeo-aula em m http://www w.youtube e.com/watcch?v=s6BG G8ZN0aDk as em m e os programa https://dl.dropbox.co om/u/1019 922388/RT TOSB.zip pa ara os com mpiladores CCS e MP PLABX C18. As duas práticas desscritas aba aixo de RT TOS foram desenvolvidas com a placa Sa anUSB, que e ser c construída os o tuttoriais disponíve eis em m pode seguiindo https://dl.dropbox.co om/u/1019 922388/12 1007SanUSBOrig.zip . Prática 1 1: Nesta prrática o RT TOS execu uta em paralelo 3 ta arefas conccorrentes e paralelass em loop infinito pa ara aciona ar 3 leds, conectados nos pinos B7, B B6 e B5, de forma a independe ente. Prática 2: Nesta prá ática o RTO OS executaa em parallelo: 1Tare efa de leitu ura do AD com poten nciômetro para modificar a veloocidade de e brilho doss leds; 2Tare efa de rota ação de oitto leds na porta B; e 3Tare efa que in nverte o sentido s de rotação dos d leds por p botão no pino 1 (PIN_E3)) utilizando display de sete segm mentos com mo leds. OBS: Dentro de cad da projeto o ‚ necessáário inserir o cabeç çalho OSAccfg.h, com mo descrito o abaixo, q que deve in ndicar a quantidade de tarefass e as característicass do proje eto como a prioridade das tarefa as. #ifndef _OS SACFG_H #define _OS SACFG_H _TASKS 3 #define OS_ #define OS_ _DISABLE_PR PRIORITY [ 168 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá #define OS_ _ENABLE_TT TIMERS Qua ase todos os sistema as baseado os em miccrocontrola adores exeecutam ma ais de uma a atividade e trabalha am em tem mpo real. Por exem mplo, um sistema s dee monitora amento da a temperatu ura é com mposto de três tareffas que, normalmente, que se repete e após um m pequeno in ntervalo de e tempo, a saber: - Tarefa 1 lê a tempe eratura; - Tarefa 2 Formata o valor da temperatu t ra; emperatura a; - Tarefa 3 exibe a te MÁQUINA AS DE EST TADO As máquinas de estado são sim mples consstruções usadas u parra executa ar diversass atividades, geralmen nte em um ma sequênccia. Muitos sistemas da d vida reaal que se enquadram e m nesta cate egoria. Po or exemplo o, o funciionamento o de uma máquina de lavar roupa ou u máquina d de lavar louça é facillmente desscrito com uma máq quina de esstado de construção c . Talvez o m método ma ais simpless de impleementar um ma máquin na de estaado em C é usar um m switch-casse. Por exxemplo, no osso siste ma de monitoramento de teemperatura a tem trêss tarefas, no omeado Ta arefa 1, Tarefa 2, Tarrefa 3 e, co omo mostrrado na Figgura abaixo. Figu ura 15. 1:: Impleme entação de d máquin na de esta ado. A m máquina de d estado executa as três ta arefas usa ando declaarações sw witch-case. O estado inicial é 1, é inccrementad o a cada a tarefa do d Estadoo para se elecionar o próximo estado a se er executad do. O últim mo estado seleciona o estado 11, e há um m atraso no o final do sswitch-casse. A máq quina de estado é executad da continuuamente no n interior de um laço o infinito. [ 169 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá F Figura 15.. 2: Máquina de esttado implementad da em Ling guagem C. C Em muitas ap plicações, os o estadoss não precisam ser executados e s em seqüê ência. Pelo o contrário, o próximo o estado é selecionad do direto pelo p estado o atual ou baseado em e alguma a condição. Figura 15. 3: Selecion nando o p próximo estado e a partir p do e estado attual. [ 170 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá O RTOS também m é o respo onsável porr decidir o agendame ento (scheeduling) da sequência a as a serem m executa adas consiiderando os o níveis de prioriddade ou pelo p tempo o das tarefa máximo de e execução o de cada tarefa. t UTILIZ ZANDO O COPILA C ADOR C18 E A IDE MPLABX M X MUL LTIPLAT TAFORM MA COM M FUNÇ ÇÕES EM PORT TUGUÊS 1) Insttale o MPLLABX e o co ompilador C18. É posssível baixa ar gratuita mente o MPLABX M ea verssão C1 18 Lite e para a o sistema operaccional desejado o (htttp://www.m microchip.com/page ehandler/en-us/fam mily/mplab bx/#downlo oads) 2) Para compilarr os progra amas com o C18 e o SanUSB, basta b abrir o Projeto1 1C18.X em m http ps://dl.dropbox.com//u/1019223 388/ProjSa anUSB1_MPLABX/Proojeto1C18.X X.zip . Tod dos essses prog gramas estão disponíve eis no Grupo SanUSB B (ww ww.tinyurl.com/Sa anUSB). Dep pois de instalado é possív el abrir o projeto MPLAX cclicando em Open n projecct e escolh her o proje eto Projeto o1C18.X. É possível visualizar o program ma com um m duplo cclique sobrre pisca.c. Para comp pilar presssione Build d and Cleann (ícone co om martelo o e vasso oura). Parra compilar outros p programas..c basta modifica-lo m os ou criá--los com a extensã ão .c dentrro da mesm ma pasta d do projeto Projeto1C C18.X. Fig gura 16. 1: 1 Projeto o pisca LED D no com mpilador C C18. [ 171 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá FUNÇÕES EM PORTUGUÊS Este capítulo descreve todas as funções em português da biblioteca SanUSB no C18. É importante salientar que além dessas funções, são válidas as funções padrões ANSI C e também as funções do compilador C18 detalhadas na pasta instalada C:\MCC18\doc. A fim de facilitar o entendimento, as funções SanUSB foram divididas em oito grupos, definidos por sua utilização e os periféricos do hardware que estão relacionadas. FUNÇÕES BÁSICAS DA APLICAÇÃO DO USUÁRIO Este grupo de funções define a estrutura do programa uma vez que o usuário deve escrever o programa.c de sua aplicação. O microcontrolador possui um recurso chamado watchdog timer (wdt) que nada mais é do que um temporizador cão-de-guarda contra travamento do programa. Caso seja habilitado habilita_wdt() na função 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() não for zerada, ele provoca um reset do microcontrolador e conseqüentemente a reinicialização do programa. A aplicação deve permanentemente zerar a flag limpa_wdt() dentro do laço infinito (while(1)) na função principal main() em intervalos de no máximo 16 segundos. Este recurso é uma segurança contra qualquer possível falha que venha travar o programa e paralisar a aplicação. Para zerar o wdt, o usuário pode também utilizar a função ClrWdt() do compilador C18. A seguir estão as características detalhadas destas funções. clock_int_4MHz() Função: Habilita o clock para a processador do oscilador interno de 4MHz. Argumentos de entrada: Não há. Argumentos de saída: Não há. Observações: O clock padrão proveniente do sistema USB interno do PIC é de 48MHz gerado a partir do cristal de 20 MHz. Isto é possível através de um multiplicador interno de clock do PIC. A função _int_4MHz() habilita, para o processador do microcontrolador, o oscilador RC interno em 4 MHz que adéqua o período de incremento dos temporizadores em 1us. É aconselhável que seja a primeira declaração da função principal main(). Exemplo: #include “SanUSB1.h” void main (void) { clock_int_4MHz(); nivel_alto() [ 172 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá Função: Força nível lógico alto (+5V) em uma saída digital. Argumentos de entrada: Nome da saída digital que irá para nível lógico alto. Este nome é construído pelo inicio pin_ seguido da letra da porta e do número do pino. Pode ser colocado também o nome de toda a porta, como por exemplo, portb. Argumentos de saída: Não há. Observações: Não há. Exemplo: nivel_alto(pin_b7); //Força nível lógico 1 na saída do pino B7 nivel_alto(portb); //Força nível lógico 1 em toda porta b nivel_baixo() Função: Força nível lógico baixo (0V) em uma saída digital. Argumentos de entrada: Nome da saída digital que irá para nível lógico baixo. Este nome é construído pelo inicio pin_ seguido da letra da porta e do número do pino. Pode ser colocado também o nome de toda a porta, como por exemplo, portc. Argumentos de saída: Não há. Observações: Não há. Exemplo: nivel_baixo(pin_b7); //Força nível lógico 0 na saída do pino B7 nivel_baixo(portc); //Força nível lógico 0 em toda porta c saída_pino(pino,booleano) Função: Acende um dos leds da placa McData. Argumentos de entrada: Pino que irá receber na saída o valor booleano, valor booleano 0 ou 1. Argumentos de saída: Não há. Observações: Não há. Exemplo: ledpisca=!ledpisca; saida_pino(pin_b0,ledpisca); // ledpisca é igual ao inverso de ledpisca // b0 recebe o valor de ledpisca tempo_us() Função: Tempo em múltiplos de 1us. Argumentos de entrada: Tempo de delay que multiplica 1 us. Argumentos de saída: Não há. Observações: Esta instrução só é finalizada ao final do tempo determinado, ou seja, esta função “paralisa” a leitura do programa durante a execução. Exemplo: tempo_us(200); //Delay de 200 us [ 173 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá tempo_ms() Função: Tempo em múltiplos de 1 ms. Argumentos de entrada: Tempo de delay que multiplica 1 ms. Argumentos de saída: Não há. Observações: Esta instrução só é finalizada ao final do tempo determinado, ou seja, esta função “paralisa” a leitura do programa durante a execução. Exemplo: tempo_ms(500); //Delay de 500 ms entrada_pin_xx Função: Lê nível lógico de entrada digital de um pino. Argumentos de entrada: Não há. Observações: Este nome é construído pelo inicio entrada_pin_ seguido da letra da porta e do número do pino. Exemplo: ledXOR = entrada_pin_b1^entrada_pin_b2; pinos b1 e b2 //OU Exclusivo entre as entradas dos habilita_interrupcao() Função: Habilita as interrupções mais comuns do microcontrolador na função main(). Argumentos de entrada: Tipo de interrupção: timer0, timer1, timer2, timer3, ext0, ext1, ext2, ad e recep_serial. Argumentos de saída: Não há. Observações: As interrupções externas já estão habilitadas com borda de descida. Caso se habilite qualquer interrução deve-se inserir o desvio _asm goto interrupcao _endasm na função void _high_ISR (void){ } da biblioteca SanUSB.h Exemplo: habilita_interrupcao(timer0); habilita_interrupcao(ext1); if(xxx_interrompeu) Função: Flag que verifica, dentro da função de tratamento de interrupções, se uma interrupção específica ocorreu. Complemento: timer0, timer1, timer2, timer3, ext0, ext1, ext2, ad e serial. Argumentos de saída: Não há. Observações: A flag deve ser zerada dentro da função de interrupção. Exemplo: #programa interrupt interrupcao void interrupcao() { if (ext1_interrompeu) { //espera a interrupção externa 1 (em B1) [ 174 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá ext1_interrompeu = 0; //limpa a flag de interrupção PORTBbits.RB0 =! PORTBbits.RB0;} //inverte o LED em B0 if (timer0_interrompeu) { //espera o estouro do timer0 timer0_interrompeu = 0; //limpa a flag de interrupção PORTBbits.RB0 =! PORTBbits.RB0; //inverte o LED em B7 tempo_timer16bits(0,62500); } } liga_timer16bits(timer,multiplicador) Função: Liga os timers e ajusta o multiplicador de tempo na função main(). Argumentos de entrada: Timer de 16 bits (0,1ou 3) e multiplica que é o valor do prescaler para multiplicar o tempo. Argumentos de saída: Não há. Observações: 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) Função: 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 máximo 65536). Argumentos de saída: Não há. Observações: O Não há. Exemplo: habilita_interrupcao(timer0); liga_timer16bits(0,16); //liga timer0 - 16 bits com multiplicador (prescaler) 16 tempo_timer16bits(0,62500); //Timer 0 estoura a cada 16 x 62500us = 1 seg. habilita_wdt() Função: Habilita o temporizador cão-de-guarda contra travamento do programa. Argumentos de entrada: Não há. Argumentos de saída: Não há. Observações: O wdt inicia como padrão sempre desabilitado. Caso seja habilitado na função 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() não for zerada, ele provoca um reset do microcontrolador e conseqüentemente a reinicialização do programa. Exemplo: #include “SanUSB1.h” [ 175 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá void main (void) { clock_int_4MHz(); habilita_wdt(); //Habilita o wdt limpaflag_wdt() Função: limpa a flag do wdt Argumentos de entrada: Não há. Argumentos de saída: Não há. Observações: Caso o wdt seja habilitado, a flag deve ser limpa em no máximo 16 segundos para que não haja reinicializaçção do programa. Geralmente esta função é colocada dentro do laço infinito while(1) da função principal main(). É possível ver detalhes no programa exemplowdt.c e utilizar também a função ClrWdt() do compilador C18 . Exemplo: #include “SanUSB1.h” void main (void) { clock_int_4MHz(); habilita_wdt(); while(1) { limpaflag_wdt(); ..... ..... tempo_ms(500); } escreve_eeprom(posição,valor) Função: Escrita de um byte da memória EEPROM interna de 256 bytes do microcontrolador. Argumentos de entrada: Endereço da memória entre 0 a 255 e o valor entra 0 a 255. Argumentos de saída: Não há. Observações: O resultado da leitura é armazenado no byte EEDATA. Exemplo: escreve_eeprom(85,09); //Escreve 09 na posição 85 le_eeprom() Função: Leitura de um byte da memória EEPROM interna de 256 bytes do microcontrolador. Argumentos de entrada: Endereço da memória entre 0 a 255. Argumentos de saída: Não há. Observações: O resultado da leitura é armazenado no byte EEDATA. Exemplo: dado=le_eeprom(85); [ 176 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá FUNÇÕES DO CONVERSOR ANALÓGICO DIGITAL (A/D) As funções a seguir são utilizadas para a aquisição de dados utilizando as entradas analógicas. habilita_canal_AD() Função: Habilita entradas analógicas para conversão AD. Argumentos de entrada: Número do canal analógico que irá ser lido. Este dado habilita um ou vários 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 saída: Não há. Observações: Não há. Exemplo: habilita_canal_AD(AN0); //Habilita canal 0 le_AD8bits() Função: Leitura de uma entrada analógica com 8 bits de resolução. Prototipagem: unsigned char analog_in_8bits(unsigned char). Argumentos de entrada: Número do canal analógico que irá ser lido. Este número pode ser 0, 1 , 2 , 3, 4, 8, 9, 10, 11 ou 12. Argumentos de saída: Retorna o valor da conversão A/D da entrada analógica com resolução de 8 bits. Observações: Não há. Exemplo: PORTB = le_AD8bits(0); //Lê canal 0 da entrada analógica com resolução de 8 bits e coloca na porta B le_AD10bits() Função: Leitura de uma entrada analógica com 8 bits de resolução. Prototipagem: unsigned char analog_in_8bits(unsigned char). Argumentos de entrada: Número do canal analógico que irá ser lido. Este número pode ser 0, 1 , 2 , 3, 4, 8, 9, 10, 11 ou 12. Argumentos de saída: Retorna o valor da conversão A/D da entrada analógica com resolução de 10 bits. Observações: Não há. Exemplo: resultado = le_AD10bits(0);//Lê canal 0 da entrada analógica com resolução de 10 bits [ 177 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá FUNÇÕES DA COMUNICAÇÃO SERIAL RS-232 As funções a seguir são utilizadas na comunicação serial padrão RS-232 para enviar e receber dados, definir a velocidade da comunicação com o oscilador interno 4MHz. As configurações da comunicação são: sem paridade, 8 bits de dados e 1 stop bit. Esta configuração é denominada 8N1 e não pode ser alterada pelo usuário. taxa_serial(); Função: Configura a taxa de transmissão/recepção (baud rate) da porta RS-232 Argumentos de entrada: Taxa de transmissão/recepção em bits por segundo (bps) Argumentos de saída: Não há. Observações: O usuário deve obrigatoriamente configurar taxa_rs232() da comunicação assíncrona antes de utilizar as funções le_serial e escreve_serial. As taxas programáveis são 1200 bps, 2400 bps, 9600 bps, 19200 bps. Exemplo: void main() { clock_int_4MHz(); habilita_interrupcao(recep_serial); taxa_rs232(2400); // Taxa de 2400 bps while(1); //programa normal parado aqui } le_serial(); Função: Lê o primeiro caractere recebido que está no buffer de recepção RS-232. Argumentos de entrada: Não há. Argumentos de saída: Não há. Observações: Quando outro byte é recebido, ele é armazenado na próxima posição livre do buffer de recepção, 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(); Função: Transmite um byte pela RS-232. Argumentos de entrada: O dado a ser transmitido deve ser de 8 bits do tipo char. Argumentos de saída: Não há. Observações: A função escreve_serial não aguarda o fim da transmissão do byte. Como não existe um buffer de transmissão o usuário deve garantir a transmissão com a função [ 178 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá envia_byte( ) para enviar o próximo byte. Exemplo: escreve_serial(PORTC); //escreve o valor da porta C while (envia_byte()); escreve_serial('A'); // escreve A while (envia_byte()); EXEMPLOS DE PROGRAMAS //1- Programa para piscar 3 leds na porta B #include <SanUSB1.h> #pragma interrupt interrupcao void interrupcao() {} void main(){ clock_int_4MHz(); while (1) { nivel_alto(pin_b0); // Pisca Led na função 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 aplicação da função OU Exclusivo e NOT #include <SanUSB1.h> #pragma interrupt interrupcao void interrupcao() {} short int ledXOR, ledpisca; void main(void){ clock_int_4MHz(); [ 179 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá 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; saida_pino(pin_b0,ledpisca); tempo_ms(500); } } // ledpisca é igual ao inverso de ledpisca // b0 recebe o valor de ledpisca //3- Utiliza a interrupção 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 interrupção 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 interrupção PORTBbits.RB7 =! PORTBbits.RB7; //Pisca o LED em B7 tempo_timer16bits(3,50000); } if (ext1_interrompeu) { //espera a interrupção externa 1 (em B1) ext1_interrompeu = 0; //limpa a flag de interrupção PORTBbits.RB0 =! PORTBbits.RB0; //altera o LED em B0 tempo_ms(100); } //Delay para mascarar o ruido do botão(Bouncing) } void main() { clock_int_4MHz(); TRISB = 0b01111110; //B0 e B7 como Saída 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. [ 180 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá habilita_interrupcao(ext1); // habilita a interrupção externa 1 com borda de descida while(1); } //4- Programa que utiliza o wdt, reseta em 16 seg. se a limpaflag_wdt() não for limpa #include <SanUSB1.h> #pragma interrupt interrupcao void interrupcao() {} void main(){ clock_int_4MHz(); habilita_wdt(); // Se a flag wdt não 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 função 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 saída habilita_canal_AD(AN0); while(1){ PORTB = le_AD8bits(0);//Lê canal 0 da entrada analógica com resolução de 8 bits e coloca na porta B escreve_eeprom(endprom, PORTB); [ 181 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá resultado = le_AD10bits(0);//Lê canal 0 da entrada analógica com resolução 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 interrupção serial por recepção de caractere e interrupção 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 interrupção PORTBbits.RB7 =! PORTBbits.RB7; //Inverte o LED em B7 tempo_timer16bits(0,62500); } } } void main() { clock_int_4MHz(); TRISB = 0b01111110; //B0 e B7 como Saída habilita_interrupcao(recep_serial); taxa_rs232(9600); 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"); [ 182 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá 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 configuração para a interrupção do timer 0, em que pisca alera o estado de um LED a cada 0,5 segundo no pino B7 e também a interrupção externa 1 (com pull-up externo no pino B1) em que muda e estado de outro LED no pino B0. Em seguida são mostrados os registros de configuração do timer 0 e das interrupções. #include <SanUSB1.h> #pragma interrupt interrupcao void interrupcao() { if (INTCONbits.TMR0IF) { //espera o estouro do timer0 INTCONbits.TMR0IF = 0; //limpa a flag de interrupção 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 interrupção externa 1 (em B1) INTCON3bits.INT1IF = 0; //limpa a flag de interrupção PORTBbits.RB0 =! PORTBbits.RB0; } //altera o LED em B0 delay_ms(100); //Delay para mascarar o ruido do botão(Bouncing) } void main() { clock_int_4MHz(); TRISB = 0b01111110; //B0 e B7 como Saída RCONbits.IPEN = 1; INTCONbits.GIEH = 1; INTCONbits.TMR0IE = 1; T0CON = 0b10000010; interno //apenas interrpções de alta prioridade (desvio 0x808) //Habilita interrupções de alta prioridade (0x808) // habilita a interrupção do TMR0 //setup_timer0 - 16 bits com prescaler 1:8 e oscilador INTCON3bits.INT1IE = 1; INTCON2bits.INTEDG1 = 0; borda de descida // habilita a interrupção externa 1 (pino B1) // habilita que a interrupção externa 1 ocorra somente na while (1); } [ 183 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá RCONbits.IPEN = 1; INTCONbitts.GIEH = 1; INTCONbit its.TMR0IE E = 1; INTCON2b bits.INTEDG DG1 = 0; descida INTCON3b bits.INT1IE E = 1; if (INTCO ON3bits.INT NT1IF) INTCON3b bits. INT1IF = 0; //Habilita / in nterrupçõe es de alta prioridade p (0x808) /// habilita a interrupçã ão do TMR R0 // habilit ita que a interrupção in o externa 1 ocorra na borda dee // habilita a interrupçã ção externa a1 { //espera o estouro do d timer0 //lim mpa a flag de d interruppção [ 184 ] Aplicações práticas p de Eletrrônica e microcoontroladores em m sistemas comp putacionais, porr Sandro Jucá T0CON = 0b10000010; interno INTCON3b bits.INT1IE E = 1; if (INTCO ON3bits.INT NT1IF) INTCON3b bits. INT1IF = 0; T0CON = 0b10000010; interno //seetup_timerr0 - 16 bitss com presscaler 1:8 e oscilador // habilita a interrupçã ção externa a1 { //espera o estouro do d timer0 //lim mpa a flag de d interruppção //seetup_timerr0 - 16 bitss com presscaler 1:8 e oscilador [ 185 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá APÊNDICE I: CABEÇALHOS DIVERSOS COMPILADORES DA FERRAMENTA 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 #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)); } C18 compiler /* www.tinyurl.com/SanUSB */ [ 186 ] PARA Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá #include "p18F4550.h" void low_isr(void); void high_isr(void); #pragma code low_vector=0x1018 void interrupt_at_low_vector(void) { _asm GOTO low_isr _endasm } #pragma code #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; } [ 187 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá #pragma interrupt high_isr void high_isr (void) { return; } void main( void ) { ...; } SDCC Example Format /* www.tinyurl.com/SanUSB */ #include <pic18f4550.h> #pragma code _reset 0x001000 void _reset( void ) __naked { __asm EXTERN __startup goto __startup __endasm; [ 188 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá } #pragma code _high_ISR 0x001008 void _high_ISR( void ) __naked { __asm retfie __endasm; } #pragma code _low_ISR 0x001018 void _low_ISR( void ) __naked { __asm retfie __endasm; } void main() { } MikroC Example Format for Bootloader /* www.tinyurl.com/SanUSB */ #pragma orgall 0x1000 void interrupt(void) org 0x1008 { ; [ 189 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá } void interrupt_low(void) org 0x1018 { ; } void main() { ......; } Hi-Tech C Compiler step1:goto Build option step2:linker tap step3:set offset : 1000 Microchip ASM compiler /* www.tinyurl.com/SanUSB */ processor PIC18F4550 #include"p18f4550.inc" org 0x1000 goto init org 0x1020 goto int_isr init ... ; initialization [ 190 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá loop ... ; code goto loop int_isr ... ; interrupt code retfie end REFERÊNCIAS BIBLIOGRÁFICAS 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 implementação de dispositivo de controle de alta temperatura aplicado a microgeradores termoelétricos. Anais do Congresso Brasileiro de Automática (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 pública 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). Gravação de microcontroladores PIC via USB pelo terminal do Linux. Retirado em 05/03/11, no World Wide Web: http://www.vivaolinux.com.br/artigo/Gravacao-de-microcontroladores-PIC-via-USB-peloterminal-do-Linux/. Grupo SanUSB (2011). Participação do Grupo SanUSB em Eventos. Retirado em 05/01/11, no World Wide Web: http://sanusb-laese.wix.com/robotica#!premios/. [ 191 ] Aplicações práticas de Eletrônica e microcontroladores em sistemas computacionais, por Sandro Jucá Jornal O Povo (2010). De Maracanaú para Eslováquia. Retirado em 05/01/11, no World Wide Web: http://publica.hom.opovo.com.br/page,489,109.html?i=2051467 . Diário do Nordeste (2010). Robô cearense. Retirado em 05/01/11, no World Wide Web: http://diariodonordeste.globo.com/materia.asp?codigo=861891. TV Diário (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 Robótica 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 . Diário do Nordeste (2007). Alunos estimulados a construir robôs. Retirado em 05/01/11, no World Wide Web: http://diariodonordeste.globo.com/materia.asp?codigo=491710. [ 192 ]