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

Bem vindo ao Curso USB - Universal Serial Bus

com imensa alegria e satisfao que venho atravs deste curso, acrescentar a todos um pouco da minha experincia com algumas pesquisas, testes e estudos sobre o barramento USB. Espero que todos gostem e tirem o mximo proveito das informaes aqui contidas, para que possam aplic-las nos seu novos projetos, acrescentando uma tecnologia de ponta, mundialmente utilizada por diversos fabricantes em milhares de dispositivos como: computadores, mouses, impressoras, scanners, cmeras digitais, modems, celulares, relgios, aparelhos de som, placas de interfaces, Finger Scanners, Players MP3, gravadores/leitores de CD-ROM/DVD, memrias portteis, entre outros. Parece at moda, mas na verdade, os produtos com interfaces USB tornaram as vidas dos tcnicos, usurios e consumidores de eletrnicos muito mais fceis. Onde antes, o usurio que deseja-se acrescentar por exemplo, um scanner ao computador, era necessrio abrir o gabinete, espetar uma placa em um de seus slots, jampear, configurar endereos de DMA, IRQs, e no final de tudo, ao rodar o software especifico, receber uma mensagem de erro do sistema operacional, indicando conflitos entre dispositivos. Agora simplesmente "pluga-se" a extremidade de um cabo USB, na traseira ou dianteira externa do gabinete, sem ser preciso nenhum tipo de configurao. Pronto, o scanner est apto a trabalhar. No sistema USB a tecnologia Plug-and-Play funciona na sua integra; voc pode conectar o dispositivo ao Hub e o sistema reconhece e carrega os device drivers relacionados ao novo dispositivo, sem auxlio do usurio. Podemos conectar e remover dispositivos sem ser preciso reiniciar o computador (HotSwap), ou mesmo o sistema operacional. Nas primeiras aulas iremos conhecer o sistema USB de um modo geral, para nos capacitar a compreender as futuras aulas que trataro da criao, programao e desenvolvimento de circuitos usando os chipset da FTDI. Optamos em utilizar os chipset da FTDI, por serem fceis de utilizar; eficientes; muito compactos (7, 2mm); uso opcional de uma memria flash para personalizar o novo produto; bastante difundidos no mercado mundial; drivers e DLLs gratuitos para vrios sistemas operacionais e sem pagamento de Royalties; facilidades para criar conversores RS232, RS422 e RS485. Iremos tambm ter a oportunidade de programar um micro controlador PIC em C, fazendo comunicao com a porta Serial para controle de dispositivos e aquisio de dados. Segue abaixo alguns produtos USB disponveis atualmente no mercado:

Figura 1 - Auto Rdio MP3

Figuras 2, 3 e 4 - Memrias Flash

Figura 5 - Relgio com suporte USB

Figura 6 - Pen drive

Figura 7- Leitor/gravador de memory card

Figura 8 - Impressora

Figura 9 - Multi-acessrios

Figura 10 - Mouse

Figura 11- Cmera

Introduo ao Barramento USB


O USB (Universal Serial Bus) surgiu em 1995 com uma parceria entre vrias companhias de alta tecnologia (Compaq, Hewlett-Packard, Intel, Lucent, Microsoft, NEC e Philips). Uma das primeiras verses foi a 1.0 com velocidade de 1,5Mbs (Low-speed), logo em seguida foi concebida a 1.1 com velocidades que vai de 1,5Mbps a 12Mbps. Essa verso conhecida com Full-speed. No final de 2000 foi lanada a verso 2.0 (high-speed), compatvel com as verses anteriores, mas com alguns aperfeioamentos que vo desde a topologia, velocidade de trafego de dados, chegando ao extremo de 480Mbps, equivalente a cerca de 60MBps (60 milhes de Bytes por segundos). As primeiras verses do bus USB utilizavam/utilizam os Controladores Host UHCI (Universal Host Controller Interface) e OHCI (Open Host Controller Interface). O USB 2.0 utiliza o Controlador Host EHCI (Enhanced Host Controller Interface). O barramento USB permite a conexo mxima de at 127 dispositivos em uma nica porta. Para isso ser possvel utiliz-se de HUBs conectados em cascata. Normalmente cada HUB USB dispe de 4 a 8 portas onde podem ser plugados mais HUBs ou dispositivos. Os Hubs so componentes muito importantes na topologia de uma Rede USB. Eles fornecem novos canais fsicos para que se possam inserir novos dispositivos mesma.

Figura 12 - Mostra um Hub de 7 portas, sua fonte de alimentao e um cabo para conectar ao Host/controlador

Os Hubs costumam ser ligados Rede eltrica para alimentar seus circuitos e ao mesmo tempo fornecer correntes suficientes para alimentar dispositivos conectados s suas portas. Alguns Hubs no tem fontes externa, estes so parasitas, alimentam-se da prpria corrente do barramento USB. Esses Hubs no so uma boa escolha se voc pretende "plugar" dispositivos que tambm se alimentam atravs do barramento. Hubs sem fonte de alimentao chegam a ter 4 portas Downstream fornecendo cada uma 100mA. J Hubs com fontes de alimentao podem fornecer por porta, 500mA. Se um dispositivo tentar consumir mais corrente do que o Hub pode fornecer atravs de uma de suas portas, o mesmo permanecer conectado fisicamente ao barramento, mas no poder se comunicar.
Figura 13 - Ilustrao de um Hub e suas portas: primria e secundrias

Veja na figura acima, que a porta principal do Hub chamada de Upstream, utilizada para conect-lo ao Host (placa controladora/PC). As demais portas secundrias so chamadas de Downstream, e servem para conectar outros Hubs ou dispositivos (conhecidos tambm como funo). So atravs dos Hubs que o Host/controlador tem o poder de detectar se um dispositivo (funo) foi inserido ou removido do sistema, como tambm saber se o mesmo funcionar em baixa ou alta velocidade. Hubs tambm fornecem energia atravs de suas portas Downstream a dispositivos que se alimentam do prprio Bus USB.
Figura 14 - Topologia USB (Tier star)

Num sistema USB existe apenas um HOST, os demais componentes so os Hubs e os dispositivos (funo). Na figura acima temos 5 fileiras contando a partir do Host. Na especificao da norma USB 1.1 fala-se que podemos enfileirar at 4 dispositivos/Hub aps o Root Hub, como mostra a figura acima (Hub1, Hub2, Hub4 e Node). J na verso USB 2.0 possvel enfileirar at 6 dispositivos/Hub sem contar o Root Hub. sempre bom seguir essas regras quando for criar uma rede de dispositivos USB. Tambm importante saber que o comprimento do cabo USB de 5m, portanto, a distncia mxima entre um Hub e um dispositivo/funo fica limitada a essa medida.

Figura 15 - Topologia fsica

A figura acima um padro da norma USB e mostra o esquema da topologia fsica. No topo temos o Controlador Host (HC), mais abaixo o Root Hub, ou Hub Raiz. atravs das portas do Hub Raiz que conectamos Hub e dispositivos, formando uma Rede USB. Observe na figura acima que a combinao de um Hub e, um ou mais dispositivos, chamada de Compound Device (dispositivo composto).

Figura 16 - Arquitetura tpica de um sistema USB

Veja na figura acima, que temos somente um Host (hospedeiro), alguns Hub e vrios dispositivos/funes pendurados ao sistema, em forma de uma rvore. Isso somente um exemplo de como agregar ao sistema USB, vrios dispositivos distintos. Dispositivos como: impressoras, udio/vdeo, modem ADSL e WebCam, consomem muita banda do sistema. Se voc tiver esses equipamentos "plugados" e funcionando simultaneamente em um Hub, observar uma queda na performance do sistema; e quanto mais dispositivos forem sendo conectados, mais devagar ser o trafego de dados em todo o sistema. Esta perda de performance fica bem evidente numa controladora OHCI/UHCI (USB 1.1 - 12Mbps mx.). J numa controladora EHCI (USB 2.0 - 480Mbps) a queda de performance imperceptvel, isso porque a largura de banda da verso 2.0 incomparavelmente maior que a da verso USB 1.1.

Figura 17 - Dispositivos com Hub incluso

Na configurao acima, vemos dispositivos conectados ao teclado e tambm ao monitor, isso possvel porque alguns fabricantes incluem em seus dispositivos, mini-hub, com uma ou mais portas downstream, tornando bastante prtica a conexo de webcams, joystick e mouses ao computador. O hub/funo do monitor tem sua prpria fonte de alimentao, dessa forma pode fornecer mais corrente para dispositivos conectados s suas portas. J o hub/funo do teclado alimentado pelo prprio Bus USB, fornecendo pouca corrente s suas portas downstream. Nesse caso, o dispositivo conectado no pode consumir mais que 100mA da porta.

Introdcuo ao Universal Serial Bus (USB) CONTROLADOR HOST


O host USB se comunica com os dispositivos atravs do seu controlador (chipset e outros componentes). O controlador host pode ser encontrado na prpria estrutura base da placa-me do computador, ou pode ser adicionada num dos slots do barramento PCI. Na maioria das placas controladoras USB PCI, alm das portas externas, h uma interna, que permite instalar perifricos USB dentro do gabinete do computador, se isso for preciso. responsabilidade do Host:

Detectar a incluso e remoo de dispositivos; Gerenciar o fluxo de controle de dados entre os dispositivos conectados; Fornecer alimentao (tenso e corrente) aos dispositivos conectados;

Monitorar os sinais do bus USB.

Figura 1 - Placa controladora USB 2.0 - 5 portas

Como j foi mencionado na aula anterior, o padro USB foi desenvolvido por um consrcio de empresas de tecnologia de ponta, destacando-se entre elas: Compaq, Hewlett-Packard, Intel, Lucent, Microsoft, NEC e Philips. No foi fcil essas empresas chegarem a um acordo plausvel sobre a abordagem do controlador. Opinies foram divididas e terminou formando-se dois grupos diferentes: UHCI - (Universal Host Controller Interface). Defendido e apoiado pela Intel, onde uma parte do funcionamento do protocolo deveria ser processado no software (driver), tornando o hardware do Controlador mais simples. OHCI - (Open Host Controller Interface). Algumas empresas como a Compaq e a Microsoft, concordavam e defendiam que a maior parte do processamento deveria ser executado pelo hardware do Controlador, simplificando o driver (controlador lgico). Esse desacordo entre as empresas gerou incompatibilidade no padro USB. EHCI - (Enhanced Host Controller Interface). Surgiu para unir o que de melhor tem os dois modelos anteriores; como aumento significativo na velocidade de comunicao (largura de banda) chegando ao extremo de 480Mbps, onde o driver (software) e o hardware, trabalham dividindo o servio para que dispositivos de udio e vdeo possam funcionar simultaneamente em alta velocidade. Portanto, UHCI, OHCI, EHCI so modelos de controladores USB compostos de software bsico (driver) e hardware. Um circuito Controlador consiste de duas partes: o Driver de Controle do

Host (HCD) que um software bsico (driver fornecido pelo fabricante), e um Controlador Host (circuito que processa eletronicamente os sinais do barramento USB). Controladores Host UHCI e OHCI esto associados verso USB 1.1. J o controlador EHCI est associado verso USB 2.0. O bus USB 2.0 tambm compatvel com UHCI e OHCI. Sendo assim, o EHCI agora um padro USB universal.
Figura 2 - Detalhes da placa controladora

no Host onde o driver (software) do controlador executado, dividindo o processamento. Na figura abaixo d para se ter uma idia geral do sistema USB, desde a aplicao ou programa do cliente, ao driver do cliente; driver do sistema operacional; driver do controlador; a placa do controlador (hardware) e, por fim, o dispositivo USB do cliente, conectado a uma das portas USB do Root Hub. Tanto a camada de software como a de hardware, est acomodada num nico Host (hospedeiro). Este hospedeiro tem que ser um computador (PC), mas j existem dispositivos portteis com caractersticas e poder de Host. Ou seja, podendo acomodar camada de software e hardware como se fosse um PC. Essa tecnologia atualmente nova e se chama OTG (On-The-Go) e trataremos do assunto em aulas futuras.

Figura 3 - Viso geral do sistema USB, camadas de software e hardware

Para entendermos melhor a ilustrao grfica acima, vamos partir da Aplicao do Cliente (programa EXE). Imagine que o usurio a partir da sua Aplicao Cliente, deseje enviar um comando para ligar um rel, no dispositivo USB (placa de controle desenvolvida pelo usurio), mostrada na ltima camada de hardware (retngulo azul). Observe os passos abaixo para entender melhor: 1 - A aplicao do cliente chama uma rotina da API passando-lhe parmetros de controle; 2 - A API por suas vez chama o Driver do Cliente. Ou seja, o software bsico do fabricante do Dispositivo USB. Este driver na maioria das vezes acompanha o protudo adquirido pelo usurio; instalado no sistema operacional tornando-se parte do mesmo. Por exemplo, quando compramos uma mquina digital, vem com ela um CD-ROM, contendo os drivers e a aplicao para visualizar fotos; 3 - O Driver USB (USBD) um software bsico que j vem agregado ao sistema operacional, ele quem garante ao Sistema Operacional suporte USB. Verses mais antigas do Windows 95 e do Linux no do suporte ao USB, porque no agregam esses drivers em seus Kernel. Esse driver interpreta e traduz comandos do Driver do Cliente e envia-os para o Driver do Controlador Host; 4 - O Driver do Controlador Host (HCD) fornecido pelo fabricante da placa do Controlador Host (HC). O HDC trabalha de forma direta com o HC, processando a parte lgica do sistema USB;

5 - O Controlador Host (HC) ou placa controladora, onde contm o chipset, Root Hub e demas componentes auxiliares, a parte fsica do sistema USB onde so conectados os dispositivos. O HC controla e detecta a incluso e remoo de dispositivos. Todos os sinais eletrnicos interpretados pelo HC so enviados para o HCD, que por sua vez envia comandos para o USBD. 6 - Por ltimo, temos o Dispositivo do Cliente, conectado ao Root Hob do HC. Um dos nossos objetivos com esse curso, criar a Aplicao (programa EXE) e desenvolver o dispositivo (produto final), utilizando como base o chipset FT232BM da FTDI. A API e os Drivers do Cliente so fornecidos pela prpria FTDI sem nenhum pagamento de royalties. Ou seja, podemos desenvolver um novo produto USB, vender a um cliente e os drivers seguirem junto.

Estrutura eltricas do USB


Tipos de conectores H duas sries de conectores USB: Srie "A": -Conector Tipo "A" Fmea, encontrado no Host (PC), ou em portas Downstream de Hub; -Conector Tipo "A" Macho, encontrado em um dos extremos do cabo USB, onde deve ser conectado ao Host/Root raiz, ou em portas Downstream de Hub. Srie "B": -Conector Tipo "B" Fmea, encontrado no dispositivo/funo do cliente. Exemplos: impressoras, mquinas digitais, modem ADSL, etc; -Conector Tipo "B" Macho, encontrado em um dos extremos do cabo USB, onde deve ser conectado a um dispositivo/funo. Veja abaixo na ilustrao da Figura 4, os tipos de conectores da srie "A" e "B".

Figura 4 - Cabos e conectores

Mecanicamente os conectores USB foram projetados de forma a no permitir encaixes errados por parte do usurio. S h uma possibilidade de conect-los: a correta! Tipo "A" macho com Tipo "A" fmea e, Tipo "B" macho com Tipo "B" fmea. Qualquer outra combinao impossvel de unir-los

Figura 5 - Conector Tipo "A" (Fmea Host)

Figura 6 - Conector Tipo "B" (Fmea Disp.)

Na Figura 5 acima temos o conector receptculo Tipo "A", encontrado no Host e nas portas Downstream de Hub. Observem que a identificao dos pinos comea a partir da esquerda para a direita. J na Figura 6 exibida uma figura do conector receptculo Tipo "B", encontrado em dispositivos/funes do cliente. A numerao dos pinos comea da direita para a esquerda na parte superior, e continua na parte inferior da esquerda para a direita. Vero mais adiante, que os conectores do cabo tem a numerao invertida.

Figura 7 - Pinagem do conector Tipo "A" (Fmea Host)

Figura 8 - Pinagem do conector Tipo "B" (Fmea Disp.)

Observem bem as figuras acima, elas mostram as partes inferiores dos conectores e a identificao dos pinos. Essas identificaes sero muito importantes quando forem criar uma placa de circuito impresso, ou mesmo uslos no proto-board para criar prottipos de circuitos.

Figura 9 - Pinagem dos conectores Tipo "A" e "B" Machos do cabo USB

Veja agora, que nos conectores dos cabos, a identificao dos pinos so diferentes. Observem tambm que os dois extremos do cabo dispem de Tipos "B" macho.

Estrutura eltrica e sinais do cabo USB

O cabo USB composto por 4 fios e uma malha para eliminao de rudos simples. Desses, 2 so fios que transportam energia para alimentar dispositivos. Essa energia fornecida pela controladora e gerenciada pelo Driver do Controlador Host. O Cabo USB usa cores padro para os fios, sendo assim, o fio de cor vermelha chamado Vbus (5v), ou seja, o fio positivo de fornecimento de energia. O fio de cor o GND (0v). Este o pino negativo de energia do Bus. O bus USB pode fornecer no mximo 5 Volt de tenso e 500mA de corrente eltrica, isso para cada porta do Root Hub do host. A quantidade de corrente que seu dispositivo ir precisar para funcionar pode ser configurada via software. Nos circuitos que iremos criar usando o chipset da FTDI, a configurao de consumo de corrente ser armazenada numa memria Flash tipo 95C56. Os outros dois fios D+(dado+) e D-(dado-) so usados pelo sistema USB para transferncia de dados entre o Host, hub e dispositivos. Todos os sinais de dados trafegam apenas por esses dois fios usando a codificao NRZI (No Return to Zero Inverted). Ou seja, o bit 1 codificado atravs de uma transio ocorrendo da maior voltagem para a menor, ou tambm o inverso, da menor para a maior. J o bit 0 codificado sem haver transio. Durante o intervalo de um bit a voltagem constante.

Figura 10 - Exemplo de codificao de bits em NRZI

S por curiosidade sobre a codificao NRZI, o grfico acima mostra como um sinal digital comum codificado em NRZI. Na NRZI a transio s ocorre quando o bit tem o valor 1. Quando o bit tem o valor 0 no ocorre transio para sua codificao.
Figura 11 - Interior do cabo

Figura 12 - Foto de um cabo USB, nomes e numerao dos fios

As duas figuras acima mostram as cores dos fios, associadas aos nmeros dos pinos dos conectores, tanto do Tipo "A" como do Tipo "B".
Figura 13 - Organizao interna dos fios

Figura 14 - Par de fios D+ e D- entrelaados

Observem nas duas figuras acima, que o par de fios D+ e D- esto entrelaados, o objetivo minimizar interferncias.

Configurao de alta e baixa velocidade de comunicao


Figura 15 - Configurao de alta velocidade entre o dispositivo e o Host

Na figura acima temos uma configurao fsica entre o Host e o dispositivo. Observem no dispositivo o resistor de Pull-up de 1k5 ohm ligado desde o sinal D+ a uma tenso de 3,3V. Esta tenso pode ser conseguida atravs de um regulador de tenso ligado ao Vbus e ao GND do bus USB. Este resistor pullup muito importante, e serve para avisar ao controlador Host que um novo dispositivo foi conectado ao bus USB e tambm informar que o dispositivo ir se comunicar com o Host em alta velocidade. Para dispositivos que se comunicam em baixa velocidade, como: mouses e teclados, o resistor de pullup deve ser conectado ao sinal D-, em vez do D+. Para que o controlador host possa detectar a presena de um dispositivo, necessrio que a tenso que circula entre o resistor de 1k5 at o D+ ou D- (alta ou baixa velocidade), persista por mais que 2,5 microssegundos. J a desconexo de um dispositivo detectada pela ausncia da tenso que circula pelo resistor pull-up, por mais que 2,5 microssegundos. Esta configurao a base para o funcionamento do sistema plug-andplay do bus USB.

Tipos de interfaces
H dois tipos de interfaceamento em que um dispositivo USB pode trabalhar: Bus-powered e Self-powered. No Bus-powered o dispositivo alimentado pelo prprio Bus USB atravs dos pinos Vbus e Gnd podendo fornecer no mximo 500mA direto de uma Porta do Root Hub (host) ou de uma Porta de um Hub comum que tenha sua prpria fonte de alimentao. Se o Hub no tiver uma fonte de alimentao, os dispositivos conectados a ele s podero consumir cada um, no mximo 100mA do Bus USB. J o tipo selfpowered no consome energia do Bus USB, mas deve ser alimentado com uma fonte externa para que o circuito possa funcionar. Para que um dispositivo USB trabalhe no modo Bus-powered ou Selfpowered, necessrio que o desenvolvedor configure o circuito eletricamente para que possa trabalhar da maneira desejada. Dispositivos configurados para trabalhar no modo Bus-powered devem consumir no mximo 100mA, podendo retirar essa corrente diretamente da porta do Root hub, ou de qualquer tipo de Hub. Dispositivos Bus-powered que consomem 500mA devem ser conectados somente no Root Hub ou na porta de

um Hub que disponha de sua prpria fonte de alimentao. Dispositivos Bus-powered so resetados/desligados involuntariamente quando o computador ligado ou desligado. J dispositivos eletricamente configurados como Self-powered mantm o circuito ligado mesmo que o computador seja resetado/desligado, isso porque so alimentados atravs de uma fonte externa. Esses tipos de interfaceamento devem ser levados em considerao quando criarem circuitos crticos, como alarmes, controles de abrir e fechar portas, portes e quaisquer outros dispositivos que, em hipteses nenhuma, devem ser acionados involuntariamente. Para esses tipos de dispositivos a Self-powered a ideal. Veja nas figuras abaixo exemplos de interfaceamento de dispositivos USB:
Figura 1 - Dispositivo Bus-powered

Veja na Figura 1 que o dispositivo conectado direto em uma das portas do Root hub (PC-host). Como aprendemos em aulas anteriores, uma porta do Root Hub pode fornecer no mximo 500mA. Portanto, esse tipo de interfaceamento de dispositivo pode consumir at 500mA. Nesse tipo de interfaceamento temos a vantagem de no necessitarmos de fonte externa, mas temos a desvantagem do dispositivo ser desligado quando o PC for desligado.
Figura 2 - Dispositivo Self-powered

Na configurao mostrada no esquema acima, temos um dispositivo alimentado como uma fonte externa, no necessitando da energia do Bus USB. Nesta configurao o dispositivo poder consumir quanto de corrente a fonte drenar.

Este tipo de configurao a ideal para dispositivos que no podem ser desligados aps o corte da energia do PC.
Figura 3 - Dispositivo conectado a um Hub Bus-powered

Veja que na figura acima o dispositivo est ligado a um Hub Bus-powered, nesta configurao cada porta do hub fornece no mximo 100mA. Assim, o dispositivo s poder extrair 100mA da porta. Dos 500mA fornecidos por uma porta do Root hub, 100mA so para alimentar seu prprio circuito.
Figura 4 - Dispositivo conectado a um Hub Self-powered

Na figura acima temos um dispositivo hub do tipo Self-powered (alimentado atravs de uma fonte externa). Nesse tipo de configurao o hub poder ter mais que 5 portas, e fornecer em cada uma a corrente mxima. Portanto, cada dispositivo conectado ao hub poder extrair indiretamente corrente do Bus USB.

Interfaces Bus e Self Powered As figuras 5 e 6 abaixo mostram os esquemas eltricos genricos para se criar dispositivos alimentados pelo prprio cabo USB (Bus-powered) ou por uma fonte externa (Self-powered). Esses esquemas sero usados em todos os nossos projetos aqui nesse curso. Em aulas posteriores irei explicar a funo de cada pino do shipset FT232BM. a partir de uma dessas configuraes eltricas que iremos acrescentar um microcontrolador para criarmos produtos USB especficos e com vrios recursos.

Figura 5 - Interface para dispositivos Bus-powered

No esquema acima, o objetivo da ferrite de eliminar interferncias eletromagnticas geradas pelo computador. Os capacitores so usados como desacopladores. Atravs do resistor R4 de 1,5K que o Host USB detecta se um dispositivo

foi conectado ou desconectado do sistema. O LED TX acende quando enviamos dados do dispositivo para o computador. J o LED RX acende quando o dispositivo recebe dados do computador. A memria 93C46 opcional e seu objetivo personalizar o novo produto criado. Pode ser usado o mesmo modelo com terminaes: 56 ou 66. Observe tambm que a energia para alimentar o circuito fornecida atravs do pino 1 (Vbus) do conector USB. Todos os terminais VCC-USB no circuito devem ser ligados entre si
Tabela 1 - Lista de componentes (Bus-powered) Resistores Capacitores Diversos R1: 27 Ohm C1: 10nF 1 Cristal 6 Mhz 1 Memria Flash 93C46 ou 56 R2: 27 Ohm C2: 10uF eletroltico ou 66 R3: 470 Ohm C3: 100nF 1 Chipset FT232BM R4: 1,5K C4: 100nF 1 Conector tipo "B" fmea PCI R5: 220 Ohm C5: 100nF 1 Ferrite (*) 1 Cabo USB (padro R6: 220 Ohm C6: 100nF impressora) R7: 2,2K C7: 33nF R8: 10K C8: 27pF C9: 27pF

Figura 6 Ferrite

Figura 7- Ferrite com uma volta de fio

O objetivo da ferrite no terminal VBus de eliminar quaisquer interferncias eletromagnticas geradas pelos componentes do computador como: fonte de alimentao, processador, cristais etc. A ferrite pode ser semelhante as das figuras acima, com uma volta de fio duro, tipo cabo de Rede, telefone ou outro. A ferrite pode ter as seguintes caracteristicas: NBT 4,5/2,6/6,7.

Figura 8 - Interface Self-powered

A diferena no esquema acima em relao ao do Bus-powered, no acrscimo dos resistores R5 de 4,7K e R8 10K; na eliminao da ferrite e do capacitor de 10nF; e a ligao do pino 14 (PWRCTL) do FT232BM, que agora conectado ao +5V da fonte de alimentao externa.

Tabela 2 - Lista de componentes (Self-powered) Resistores Capacitores Diversos R1: 27 Ohm C1: 10uF eletroltico 1 Cristal 6 Mhz 1 Memria Flash 93C46 ou 56 R2: 27 Ohm C2: 100nF ou 66 R3: 470 Ohm C3: 100nF 1 Chipset FT232BM R4: 1,5K C4: 100nF 1 Conector tipo "B" fmea PCI 1 Cabo USB (padro R5: 4,7K C5: 100nF impressora) R6: 220 Ohm C6: 33nF R7: 220 Ohm C7: 27pF R8: 10K C8: 27pF R9: 2,2K R10: 10K

Protocolo USB
O protocolo uma das partes mais importantes do funcionamento do sistema USB, atravs dele que um ou mais dispositivos conversam e trocam informaes com o Host. No Host a pilha do protocolo est disponvel em forma de drivers de arquivos .sys, dll, drv, exe, etc. J no dispositivo o protocolo pode ser encontrado dentro de um microcontrolador especfico, como por exemplo um PIC que disponha de uma certa quantidade de memria. Nesse caso, o protocolo escrito com base na norma USB, em uma linguagem especfica com: C ou Assembler; depois compilado e gravado na memria do microcontrolador atravs de um gravador de PIC. Esta umas das maneiras mais complexas, trabalhosa e no muito produtiva. H microcontroladores PIC como o 18F2450 e 18F4450 que internamente j dispe do protocolo, tornando assim mais fcil o desenvolvimento de aplicaes. Uma outra maneira atravs de um chipset que carrega dentro de si toda a funcionalidade do protocolo USB, livrando o microcontrolador de todo o trabalho pesado. Diferente da Porta Serial ou Paralela onde simplesmente atravs dos sinais eltricos dos pinos e um programa bsico possvel se comunicar com um dispositivo. No USB isso s possvel se o dispositivo carregar o protocolo USB num chipset ou mesmo dentro de um microcontrolador. Assim, conclumos que o combustvel do sistema USB seu protocolo, sem ele, no h troca de informao entre os dispositivos. Nessa aula irei trazer a nosso conhecimento alguns pontos importantes do protocolo USB para nos ajudar a compreender algumas caractersticas de funcionamento dos dispositivos que iremos criar. Tambm iremos usar alguns softwares disponveis no mercado (free) para visualizar o protocolo. O protocolo USB tem vrios recursos como: CRC (Cyclic Redundancy Check), deteco e correo de erros, deteco de conexo e remoo de dispositivos, controle de fluxo de dados assegurando transmisses isossncronas (trafego contnuo de dados), disponibilidade assegurada de largura de banda, entre outros. 4 tipos de transferncias de dados USB

Controle: As transferncias de controle so utilizadas pelo Host para configurar um dispositivo e requisitar informaes sobre o seu estado. Essas transferncias so usadas principalmente pelo sistema USB para configurar dispositivos durante a primeira conexo. Interrupo: Esse tipo de transferncia utilizado por dispositivos que usam pouca banda do sistema USB, mais comumente usada por dispositivos como: mouses, teclados, joysticks ou outros que precisam enviar e receber dados de maneira no freqente, mas com certos limites de latncia. Nesse caso o dispositivo quem requisita dados do host. Isossncrona: Chamada tambm de transferncia de correntes em tempo real (Stream real-time transfers). Tipo de transferncia composta somente de dados, ideal para dispositivos que no necessitam checar se os dados chegaram corretamente ao destino. No tem deteco de erro e nem utiliza CRC. Esse tipo de transferncia mais utilizada por dispositivos de vdeos, udios e outros que precisam de uma velocidade constante de transmisso, no importando a perda de dados por erro ocasionais. As transferncias isossncronas tm prioridades em termos de largura de banda. Bulk: Transferncias de grandes volumes de dados como: aquisio de dados de dispositivos tipo scanners, impressoras, discos de memrias flash, modems ADSL. Nesse tipo de transferncia h deteco e correo de erros, confirmao e recuperao de pacotes de dados corrompidos. A largura de banda para esse tipo de transferncia pode variar se houver outras atividades concorrentes sendo executadas no barramento USB. Esse tipo de transmisso garante a segurana no trfego de dados, mas no garante velocidade constante em que os mesmos so transmitidos. Toda as transmisses de dados no sistema USB so baseadas no envio de pacotes. O Host quem inicia todas as transaes, o primeiro pacote gerado o Token para descrever o que seguir no prximo pacote e, se a transao de dados uma escrita ou leitura. O prximo pacote geralmente um pacote Data que leva a carga til de dados, seguido por um pacote de Handshake, que informa se houve sucesso na negociao da transao. Cada transao USB consiste dos seguintes pacotes mostrados na figura abaixo:

Figura 1 - Pacotes de dados de transferncia

Descrio dos campos dos pacotes

SYNC - Todos os pacotes tem que comear com um campo de sync. Este campo tem um tamanho de 8 bits para velocidades baixas e, 32 bits para altas velocidades. utilizado para sincronizar o relgio (clock) do transmissor com o do receptor. PID - Representa Pacote ID (identificao). Este campo tem um tamanho de 8 bits, usado para identificar o tipo de pacote que ser enviado.
Figura 2 - Descrio dos bits do campo PID

Os bits (PID0 a PID1) indicam o tipo de pacote que pode ser: Token, Data, Handshake e Special. Os bits (PID2 e PID3) acrescentam mais informaes sobre o tipo de pacote. Os bits (PID#0 a PID#3) so usados para checagem dos dados (clculo para verificao e preveno de erros).
Tabela 1 - Tipos de PID

Tipo de PID

Nome do PID OUT IN SOF SETUP

Descrio
Endereo + nmero do Endpoint. Transao do Host para o Dispositivo. Endereo + nmero do Endpoint. Transao do Dispositivo para o Host. incio e o nmero do Frame. Endereo + nmero do Endpoint. Transao de configurao para controle do Pipe. Direo do Host

Token

DATA0 DATA1 Data DATA2 MDATA ACK NAK Handshake STALL NYET PRE ERR Special SPLIT PING

para o Dispositivo. Pacote de dados impar. Pacote da dados par. Pacote da dados para tansao em alta-velocidade (high-speed) Isossncrona. Pacote da dados para tansao em alta-velocidade (high-speed) Isossncrona. Reconhecimento. O pacote foi recebido corretamente. Informa que o dispositivo temporariamente no pode enviar ou receber dados. O dispositivo encontra-se em um estado que requer interveno do Host. O receptor no responde. Prembulo para indicar low speed. Utilizado somente em modo High speed. Erro em transao split. Para transao split em High speed. Verificao de Busy aps um NYET.

ADDR - Este campo define o endereo de destino do dispositivo ao qual o pacote de dados ser enviado. Tem um tamanho de 7 bits, podendo enderear no mximo at 127 dispositivos distintos, conectados no bus USB. ENDP - Este campo conhecido como Endpoint e tem o tamanho de 4 bits, permitindo 16 possveis Endpoints diferentes. O Endpoint de nmero 0 (zero) usado pelo Host para se comunicar com todos os dispositivos conectados ao bus USB, para configur-los ou obter informaes. DATA - So os dados propriamente dito para transferncia. Este campo pode armazenar at 1024 bytes. CRC - (Cyclic Redundancy Check). O objetivo deste campo armazenar o resultado de um clculo em nvel de bits executado em alguns campos do pacote, para garantir a segurana dos dados transmitidos. Ou seja, se os dados se alterarem durante a transmisso, o receptor poder comparar o valor deste campo, calculando o CRC do pacote recebido e correo do erro se houver. O campo PID no agregado a esse clculo porque tem seu prprio recurso de correo de erros. Para os pacotes Token esse campo tem o tamanho de 5 bits (CRC5), e para pacotes de Dados, tem tamanho de 16 bits (CRC16). EOP - Este campo indica o fim de qualquer pacote. Ele representado com um simples zero (0) por aproximadamente 2 a 3 bits de tempo.

Pacote Token - Indica o incio de uma transao USB.

H 4 tipos de comandos Token: Out - Informa ao dispositivo que o Host deseja enviar informaes; In - Informa ao dispositivo que o Host deseja ler informaes; Setup - Usado para iniciar transferncias de controle; SOF - Indica o incio e o nmero do Frame.
Figura 2 - Representao grfica de um pacote SOF

Os Pacotes SOF (Incio de Frame) consiste em um nmero de 11 bits e so enviados pelo Host entre 1ms a +/- 500ns num Bus Full speed, ou entre 125us a +/- 0,0625us num Bus High speed. Esse pacote consiste de um PID que indica um pacote do tipo SOF, e o campo Frame Number que referencia o nmero do Frame (quadro). Pacote de Dados - Contm a carga til de dados a ser transportado. Existem 4 tipos de pacotes de dados capaz de transmitir at 1024 bytes. Esses pacotes so conhecidos como:

DATA0 DATA1 DATA2 MDATA

DATA 0 e DATA 1 so utilizados nos modos low speed e full speed; DATA 2 e MDATA so utilizados somente no modo de alta velocidade (High Speed). Pacote Handshake - Usado para reconhecer transaes e prover meios de correo de erros. Como mostrado na Figura 1, o handshake composto somente por um campo de informao vlida (PID). Os comandos PID de handshake so: ACK, NACK, STALL ou NYET.

Protocolo USB Endpoints e Pipes (interface lgica)


Endpoint (ponto final de um dispositivo) - rea de memria (Buffer) reservada no Dispositivo para armazenar os dados que trafegam em um tubo (pipe). Um dispositivo USB pode ter no mximo 16 Endpoins na verso 2.0 do USB. O Endpoint 0 (zero) reservado para o Host obter informaes sobre cada dispositivo conectado ao Bus USB. Atravs deste Endpoint, o Host pode enviar comandos de controle em baixa velocidade para obter informaes descritivas sobre o dispositivo, como: nmero de srie, fabricante, classe, subclasse, verso do Bus USB, nome do produto, tipo do protocolo, nmeros de Endpoints, interfaces, velocidade, tipo de transferncia, entre outras. Aps a

aquisio de todas estas informaes sobre o dispositivo, o Host estabelece realmente uma comunicao USB.
Figura 1 - Tipos de Endpoints

Pipe (tubo) - uma associao entre um Endpoint no dispositivo e um software no Host. Pipe no algo fsico, uma via de comunicao virtual que s existe em nvel de software. Quando um dispositivo USB se conecta ao sistema, o Host cria uma configurao para se comunicao com o dispositivo. Um Pipe pode ser descrito tambm como uma via de comunicao unidirecional ou bidirecional, onde podem existir Endpoints de entrada(In) e sada (Out). Os Pipes passam a existir quando um dispositivo configurado pelo Host. Enquanto um dispositivo estiver sendo alimentado e conectado ao controlador Host, sempre existir um Pipe de controle padro (Control Default) para que esse dispositivo possa fornecer acesso as configuraes, como, informaes de controle e estado do mesmo.

Figura 2 - Ilustrao de um Pipe entre o Host e o dispositivo

Figura 3 - Interface lgica entre o Host e os diversos dispositivos USB atravs dos Pipes e Endpoints

H dois tipos de Pipes:

Stream (corrente de dados) - uma via de comunicao unidirecional entre um softwares no Host e um Endpoint que pode ser dos tipos: Interrupo, Isossncrono ou Bulk. Se um dispositivo precisar transferir de forma bidirecional um dos tipos de Endpoint citados acima, o sistema deve estabelecer dois Pipes: um definido com Endipoint de sada(Out), e outro com Endpoint de entrada(In).

Figura 4 - Pipe Stream Out

Figura 5 -Pipe Stream In

Mensagem ou controle - uma via de comunicao bidirecional entre um softwares no Host e dois Endpoints de Controle (control) em um dispositivo USB. Ou seja, um tubo com dois Endipoints: um de entrada (In) e outro de sada (Out) que tem uma estrutura de dados bem

definida. atravs de um Pipe deste que o Host usa o Endpoint 0, para obter os descritivos dos dispositivos para configur-los no sistema USB.
Figura 6 - Pepe de Mensagem ou Controle

Descritores
Todos os dispositivos USB tm uma hierarquia de descritores que informam ao Host o que o dispositivo , ou seja, sua "personalidade", suas caractersticas de funcionamento, como; nmero de srie do produto, identificao do fabricante, tipo do dispositivo (impressora, scanner, modem, mouse, etc.), nmero de configuraes, nmero de Endpoint, tipo de transferncia, tipo de interface, etc.
Animao - Envio dos descritores pelo dispositivo

Figura 7 - Janela do Gerenciador de Dispositivos do Windows

No windows, para executar o Gerenciador de Dispositivos, acesse o Painel de Controle; d duplo clique no cone Sistema; Clique na guia Hardware e depois no boto Gerenciador de Dispositivos. O programa Usbready.exe (de uso livre) criado pela Intel para testar se um computador oferece suporte USB; pode-se fazer seu download clicando aqui.
Figura 8 - Janela do programa USBready para checar a existncia do sistema USB no PC

Descritores de Dispositivos - Informam ao Host de uma forma geral, caractersticas sobre o dispositivo. Um dispositivo USB s pode ter um Descritor de Dispositivo. Estas informaes so muito importantes para o Host saber qual a verso do USB, o dispositivo suporta. Um dos

descritores so: identificao do fabricante, nmero de srie, ID do Vendedor e produto, classe e subclasse do dispositivo.

Para visualizar os descritores de um dispositivo USB, faa download do programa USB Monitor da HHD Softwares em: http://www.hhdsoftware.com/download.html. A Microsoft tambm disponibiliza um utilitrio free (de uso livre), chamado Usbview.exe para visualizar os descritores. Clique aqui para fazer download.
Figura 9 - Tela inicial do programa USB Monitor

Um dos inconvenientes do programa USB Monitor, que ele no faz a atualizao dos dados automaticamente. Se for conectar um novo dispositivo, preciso fechar o programa e execut-lo novamente, para que os novos dados sejam exibidos na janela.

Figura 10 - Tela inicial do programa USBview da Microsoft

Para que o programa USBview exiba todos os descritores dos dispositivos conectados ao Bus USB, clique no Menu Options, e marque todos os itens, conforme mostra a figura abaixo:
Figura 11 - Menu Options do USBview

Figura 12 - Exibio do Descritor de Dispositivo atravs do software USB Monitor

No Descritor de Dispositivo mostrado na figura acima, observe os campos principais:


USB Version: 2.0 (dispositivo compatvel com a verso 2.0 do USB) Vendor: 0x0500 (cdigo do vendedor do produto ou dispositivo) Product ID: 0x2000 (identificao do produto ou dispositivo) Product Version : 0x0400 (verso do produto ou dispositivo) Manufacturer: 0x0409 "ROGERCOM" (fabricante do produto ou dispositivo) Product: 0x0409 "Sensor de Temperatura" (nome do produto ou dispositivo) SerialNumber: 0x0409 "RCNPMGL5" (nmero de srie do produto ou dispositivo)

Os dados acima so gravados na memria opcional Flash 93C46 para personalizar o produto (dispositivo). O campo SerialNumber gerado automaticamente por um algoritmo, atravs do programa gravador de memria Flash. So atravs dos campos acima que o driver USB do Sistema Operacional carrega os drivers USB do dispositivo corretamente, aps a leitura de um arquivo .INF. Em aulas futuras iremos entender todo o processo de configurao do arquivo .INF.

Descritores de Configurao - Contm informaes sobre as capacidades e funcionalidades do dispositivo, como tipo de alimentao de energia (Bus-powered ou Self-powered), mxima corrente consumida pelo dispositivo, entre outras. Veja na figura abaixo, algumas informaes sobre o Descritor de configurao de um dispositivo:

Figura 13 - Exibio do Descritor de Configurao atravs do software USB Monitor

Veja no campo Attributes da figura acima, o tipo de alimentao do dispositivo: Bus Powered, e no campo Max Power, a corrente mxima extrada do Bus USB pelo dispositivo: 400mA.

Descritores de Interface - Contm informaes sobre o nmero de Endpoint que suporta, o protocolo utilizado e, algumas strings de texto especificando o nome do produto. Veja mais detalhes na figura abaixo:

Figura 14 - Exibio do Descritor de Interface atravs do software USB Monitor

Descritores de Endpoint - O sistema sempre assume que o Endpoint 0 (zero) um endpoint de controle e, configurado antes de qualquer descritor. Fora o Endpoint 0, cada endpoint deve ser configurado e consiste no nmero do Endpoint, direo da comunicao (In, Out) e tamanho do pacote de dados a transmitir. A figura abaixo mostra um descritivo de 2 Endpoint: um de entrada (Input) e outro de sada (Output), do tipo Bulk (alto volume de dados).

Figura 15 - Exibio do Descritor de Endpoint atravs do software USB Monitor

Veja na figura acima os endereos de Endpoint In/Out, o tipo de transferncia e o tamanho mximo do pacote de dados. Esses descritores so de um dispositivo que trabalha no modo Full-speed.

Descritores de Classe - Determinam a classe do dispositivo. No sistema USB cada dispositivo identificado como sendo de uma classe. Veja abaixo na Tabela 1: Smbolo Classe 1 2 Descrio udio Dispositivos de comunicao. Dispositivos de Interfaces humanas: Mouse, Teclados, Joysticks, leitor cdigo de barras, etc. Imagem: Scanner, cmera. Impressoras.

Tabela 1 - Classe de dispositivos USB

6 7

Amazenamento de massa: Floppy disk driver, CD-ROM, DVD, ATAPI, SCSI, memria flash. Hub. Interface de Dados. Chip/Smart card. Vendor-Specific: dispositivos que no entram em qualquer outra classe. Interface Serial RS232, Rede ponto-a-ponto, etc.

9 10 11

255

Processo de enumerao
No sistema USB o processo de enumerao se refere conexo, deteco, leitura dos descritivos dos dispositivos e desconexo. uma atividade ininterrupta. Isso tudo gerenciado em tempo real pelo controlador Host e o software do sistema. Do ponto de vista do usurio do computador, o processo de enumerao transparente, desde que se tenha antes instalado no sistema operacional, os drives do fabricante do dispositivo. Aps isso, o carregamento dos drives quando um dispositivo conectado, automtico. Segue abaixo uma seqncia de passos que ocorrem no processo de enumerao:
Figura 16 - Conexo do dispositivo

Figura 17 - Conexo do dispositivo ao Host

1 O dispositivo conectado ao host; 2 O controlador host detecta o dispositivo atravs de seu sinal eltrico; 3 O host provoca uma interrupo de reset para que o dispositivo reinicie, limpando as variveis e registros para que se possa iniciar a enumerao; 4 Um host define um canal (Pipe) de comunicao com o dispositivo; 5 O host habilita e configura o Endpoit 0 (In/Out) para aceitar transaes do tipo Setup; 6 O host atribuiu um nico endereo ao Dispositivo; 7 O host requisita os descritores do dispositivo, interpreta-os, e carrega o device driver (software) apropriado que ir interagir com a aplicao do cliente. Pronto, aps todos os passos descritos acima terem sido efetuados, estabelecida a fase de gerenciamento do dispositivo e das comunicaes de dados. Aps isso, o dispositivo estar apto a exercer sua funo para ao qual foi criado.

Conhecendo o chipset FT232BM

O chipset FT232BM uma soluo ideal para construir dispositivos que se comuniquem com o computador atravs do Bus USB, com velocidade de at 3Mbps atravs de sinais TTL: RS422 e RS485 e no mximo 1Mbs para comunicao atravs de drivers RS232. Ele pertence a uma segunda gerao do popular componente USB UART da FTDI (FT8U232AM). compatvel com controladores Host USB verses 1.1 e 2.0. A FTDI - Future Technology Devices International Ltd., fabricante do FT232BM, disponibiliza no seu site http://www.ftdichip.com/FTDrivers.htm, os drivres de controle, livres de pagamento de royalties, para os sistemas operacionais Windows 98/Me/200/XP/CE.NET, Linux e Mac OS-X/9/8. A FTDI tambm disponibiliza outros chipset, como o FT245BM que disponibiliza os dados USB em paralelo, (em 1 byte) atravs de 8 pinos de entrada e sada (bits D0 a D7), para propsitos gerais, e mais 4 pinos de controle (RD#, WR, TXE# e RXF#). O FT245BM pode ser usado sem a necessidade de um microcontrolador para controlar dispositivos diretamente atravs de interfaces simples, com: rels, motores, conversores ADC, entre outros.

Principais caractersticas:
Um nico chip manipula tanto transferncias USB como Serial. Interface para Modem com total suporte aos sinais de Handshake. A UART suporta 7 e 8 bits de dados; 1/2 stop bits e paridade par/impar/marca/espao e nenhuma. Taxa de transferncia entre 300 a 3M Baud (TTL). Taxa de transferncia entre 300 a 1M Baud (RS232). Taxa de transferncia entre 300 a 3M Baud (RS422/RS485). Timeout ajustvel para o buffer RX. Compatvel com bus USB 1.1 e 2.0. Tenso de alimentao entre 4,35V a 5,25V. Regulador integrado de 3.3v para Entrada/Sada USB. Compatvel com os controladores Host: UHCI/OHCI/EHCI. Suporte a uma memria EEPROM externa opcional para personalizar o produto, onde pode ser armazenado os descritores do mesmo como: VID, PID, e nmero de srie. Encapsulado em tamanho miniatura 32-LD LQFP. EEPROM pode ser programada na prpria placa via USB. Suporte para alimentar dispositivos diretamente no Bus USB atravs do pino PWREN#. Modos de transferncias USB Bulk e Isossncrono.

Suporte para os recursos USB (suspend/resume) atravs dos pinos SLEEP# e RI#.
Figura 1 - Diagrama interno do FT232BM

Na figura acima temos uma viso geral em blocos do chipset FT323BM, onde podemos ver a clula do regulador de tenso que fornece 3.3v no pino 3v3OUT do chipset; a clula (USB transeiver) que trata diretamente os sinais D+ e D- atravs do meio fsico (cabo) , o USB DPL que trata da codificao NRZI; o multiplicador de sinal de clock, que a partir de uma freqncia de 6Mhz gera 48Mhz; a Interface Serial avanada (SIE); o UART que disponibiliza os

dados seriais para comunicao externa (RS232/RS422/RS485); clula EEPROM que gerencia uma memria externa 93C56, 93C66 ou 93C46 opcional para personalizar o produto USB; clula para controle dos Buffers FIFO; o USB Protocol Engine, que trata da pilha de dados do protocolo USB em baixo nvel, como Pipes, Endpoints, etc.
Figura 2 - Pinagem do FT232BM

Tabela 1 - Descrio dos pinos do FT232BM Pino Nome Tipo Descrio EESK 1 Sada Sinal de Clock para a EEPROM. Conexo de dados direta com a EEDATA Entrada/Sada 2 EEPROM. VCC 3 Alimentao Tenso de alimentao (+4,4V a +5,25V). Atravs deste pino podemos realizar um RESET# Entrada 4 reset a partir do exterior. Se no for usado, deve ser conectado ao VCC. Sada do gerador interno de Reset. Este RSTOUT# Sada 5 pino no afetado no caso de um reset no Bus USB. Sada do regulador LDO (Low Drop Out) de 3,3V. Este pino deve ser conectado a um capacitor cermico de 33nF. Uma 3V3OUT Sada 6 pequena quantidade de corrente (<= 5mA) pode ser tirada deste pino, para alimentar um circuito a 3.3v se for preciso. Sinal positivo de Dados (D+) USB. Requer um resistor de pull-up de 1,5K USBDP 7 Entrada/Sada conectado ao pino 3V3OUT ou RSTOUT#.

8 9 10 11

USBDM GND SLEEP# RXLED#

Entrada/Sada Sinal negativo de Dados (D-) USB. Alimentao Sada Sada Sinal negativo (massa). Vai ao estado baixo enquanto est no modo USB "Suspend". LED indicador de recepo de dados. Este pino quando est em nvel baixo indica recepo de dados. LED indicador de transmisso de dados. Este pino quando est em nvel baixo indica transmisso de dados. Especifica os nveis de tenso utilizados na interface UART (3.0V - 5,25V). Em nvel baixo, o FT232BM alimentado atravs do bus USB (Bus-powered). Em nvel alto alimentado mediante conexo externa (Self-powered). Est em nvel baixo quando se tem configurado o FT232BM no modo Buspowered. Est em nvel alto durante o perodo de suspenso do bus USB. Pode-se usar este pino para controlar a alimentao de dispositivos externos, alimentados diretamente atravs do bus USB, mediante a utilizao de um MOSFET Canal-P. Habilita a transmisso de dados para RS485. Sinal negativo (massa). Indicador de Ring. Data Carrier Detect (detecta a portadora de dados). Data Set Ready (Dados pronto). Data Terminal Ready (Terminal de dados pronto). Clear To Send. Request To Send. Pino de recepo. Pino de transmisso. Tenso de alimentao (+4,4V a +5,25V). Entrada do oscilador de 6MHz.

12 13

TXLED# VCCIO

Sada Alimentao

14

PWRCTL Entrada

15

PRWEN# Sada

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

TXDEN GND RI# DCD# DSR# DTR# CTS# RTS# RXD TXD VCC XTIN XTOUT AGND AVCC TEST EECS

Sada Alimentao Entrada Entrada Entrada Sada Entrada Sada Entrada Sada Alimentao Entrada Sada

Sada do oscilador de 6MHz. Gnd analgico para o multiplicador x8 do Alimentao Clock interno. VCC analgico para o multiplicador x8 do Alimentao Clock interno. Pe o FT232BM no modo teste. Para Entrada funcionamento normal, deve-se conectar ao GND. Entrada/Sada EEPROM-Chip select (seleciona o chip).

Configurao da EEPROM 93C46 (56 ou 66)

A memria 93C46 uma memria do tipo EEPROM serial (SPI), com 64 palavras de 16 bits de largura, podendo armazenar 1024 bits (128 bytes). O modelo 93C56 tem um tamanho de 2048 bits, e o 93C66, 4096 bits. O FT232BM requer uma memria de 16 bits de largura e os modelos 93C46 /56 e 66 so ideais. O uso da EEPROM 93C46 opcional, seu objetivo personalizar o novo produto criado, armazenando nela o nome do fabricante, nmero de srie, verso, vendedor, etc. Se esta memria no for agregada ao circuito, sero assumidos os dados padro gravado no chipset pelo fabricante (FTDI), que so: Vendor ID (VID 0403) e Produtc ID (PID 6001), entre outros.
Figura 3 - Pinagem da memria 93C46 (56 ou 66)

Tabela 2 - Descrio dos pinos da memria 93C46 (56 ou 66) Pino Descrio CS Chip Select (Seleo do chip) Serial Data Clock (Sinal de SK relgio) Serial Data Input (Entrada de DI dado serial) Serial Data Output (Sada de D0 dado serial) VCC Alimentao +5V NC No Conectado GND 0v (massa) Figura 4 - Conexo da memria 93C46 (56 ou 66) ao chipset FT232BM

A figura acima mostra a configurao da memria 93C46 (56 ou 66), e a conexo com o FT232BM para personalizar o novo produto USB desenvolvido.

Configurando interfaces Bus-Powered e Self-powered Nas Figuras 6 e 8 da aula 3, esto disponveis as configuraes completas das interfaces Bus-powered e Self-powered. Aqui estamos mostrando claramente as diferenas importantes entre as duas. Como j aprendemos anteriormente, as diferenas visveis ao usurio que um dispositivo Buspowered retira a energia do prprio Host e, um dispositivo Self-powered precisa de uma fonte de energia externa para alimentar seus componentes. Alm das configuraes fsicas mostradas nas Figuras 5 e 6 logo abaixo, na hora de se programar os descritores do dispositivo na memria EEPROM, deve-se informar em um dos seus campos, o tipo de interface em que o dispositivo ir trabalhar.
Figura 5 - Configurao Bus-powered

Numa interface Bus-powered o pino 14-PWRCTL deve ser levado a nvel baixo (0v). A ferreite ligada em srie ao pino 1-Vbus (+5v do Bus USB) para eliminar rudos que possam afetar o bom funcionamento do dispositivo.

Figura 6 - Configurao Self-powered

Numa interface Self-powered o pino 14-PWRCTL deve ser levado a nvel alto (+5v). Devero ser acrescentados dois resistores: um de 4K7 e outro de 10K para gerar um sinal ao pino 4-RESET#.

Fazendo com que os pinos de I/O do UART do FT232BM trabalhe com 3.3v

Figura 7 - Interface Bus-powered com regulador 3.3v

O circuito Bus-powered configurado conforme exibido na figura acima usa um regulador LDO (Low Drop Output), ou seja, um tipo de regulador compacto e com baixa queda e perda de tenso, ideal para nosso propsito. A partir de uma tenso de entrada de 4.35 volts um regulador LDO 3.3V poder disponibilizar em sua sada uma tenso estvel de 3.3V. Esses 3.3V de sada aplicado ao pino VCCIO para fazer os pinos de I/O do UART do FT232BM trabalharem com apenas 3.3V. A sada do LDO pode ser usada para alimentar o prprio microcontrolador e seus componentes auxiliares, desde que no consumam mais que a corrente fornecida pelo Bus USB e pela sada do regulador. Essa configurao til quando se est trabalhando com microcontroladores que so alimentados com 3.3v. Um regulador LDO recomendado pela FTDI o TC55 fabricado pela Microchip, mas outros podem ser usados. Mais informaes sobre o TC55, acesse o site da Microship(R) em http://www.microchip.com.

Configurando o cristal ou resonador


Figura 8 - Oscilador com resonador cermico Figura 9 - Oscilador com cristal de quartzo

Temos duas opes de componentes para configurar um oscilador para o FT232BM. A Figura 8 mostra uma configurao usando um resonador cermico de 3 pinos. No so necessrios capacitores auxiliares porque o resonador tem embutido em si estes capacitores. A finalidade do resistor de 1M (mega) entre os pinos XTIN e XTOUT garantir uma maior preciso do oscilador. Na Figura 9 temos uma configurao de oscilador usando um cristal de 6MHz e dois capacitores de 27pF, entre os pinos XTIN, XTOUT e GND (massa). Dentre estas configuraes a mais econmica a que usa o resonador. J a que usa o cristal torna a placa mais elegante. A melhor configurao fica por conta do desenvolvedor.

Configurando os LEDs indicadores de comunicao (TX e RX)

Figura 10 - Configurao com 2 LEDs

Figura 11 - Configurao com 1 LED

O FT232BM tem dois pinos indicadores de estado de dados transmitidos e dados recebidos, onde podem ser conectados LEDs para indicar ao usurio. O pino 12 (TXLED) piscar intermitentemente quando dados so transmitidos pelo Bus USB e, o pino 11 (RXLED) oscila quando dados so recebidos. Na Figura 11 temos uma forma econmica de configurar o estado de transmisso e recepo de dados pelo FT232BM, conectando os pinos RXLED# e TXLED# entre si, e usando um nico LED para indicar tanto transmisso como recepo. A desvantagem desta configurao que o usurio no poder distinguir entre transmisso uma recepo de dados. Para contornar esse inconveniente, pode ser utilizado um LED bi-color ou tricolor, com anodo comum, para representar os dois estados: transmisso e recepo, como mostra a animao abaixo:
Animao 1 - Configurao com um nico LED bi-color ou tri-color

Instalao e configurao de drivers relacionados aos chipsets FTDI

A FTDI disponibiliza dois tipos de drivers para se comunicar com nossas aplicaes, todos eles so distribudos gratuitamente, atravs do site da empresa em: http://www.ftdichip.com/FTDrivers.htm por qualquer usurio. Um dos drivers se chama D2XX e usa uma DLL para se comunicar diretamente atravs do Bus USB com dispositivos baseados nos chipsets da FTDI. Para se programar uma aplicao usando a DLL necessrio saber usar suas funes (em aulas futuras iremos programar em C++ e Delphi). O outro driver se chama VCP - Virtual COM Port (porta virtual de comunicao serial). Emula uma porta padro RS232 do PC. Uma vez instalado no sistema operacional Windows, disponibiliza uma porta serial virtual COMx para se comunicar de uma forma simples com o Bus USB. Usando um driver VCP, qualquer aplicao que se comunique com a porta serial RS232 pode se comunicar naturalmente com o Bus USB, sem nenhuma modificao no programa. Para se criar um novo programa que acesse o Bus USB atravs do driver virtual, as funes so as mesmas da API do windows usadas para programar a porta serial. Se no quiser usar a API do windows a FTDI tambm disponibiliza uma biblioteca de funes para facilitar a programao por parte do desenvolvedor. Para instalar os drivers D2XX, confeccione o circuito Bus-powered da Figura 5 / aula 3. Observao ao instalar no windows XP: A FTDI informa em seu site que alguns usurios dos drivers D2XX, usando o VID(0x0403) e PID(0x6001) padro, tiveram problemas ao instalar o mesmo no Windows XP com Service Pack 1. Para resolver esse problema, desconecte a Internet temporariamente antes de instalar os drivers.

Passos para instalar os drivers D2XX da FTDI no Windows (como exemplo, o 2000)

1 2 3

Acesse o site da FTDI em: www.ftdichip.com, e faa download do driver D2XX para a verso do Windows ou outros sistemas operacionais; Na pgina principal da FTDI, clique no item Drivers do Menu; e depois no subitem FT232 - FT245; Aps se abrir a nova pgina, clique no link D2XX. Apos isso exibida . Clique no link correspondente ao seu

a seo sistema operacional.

Download dos Drivers a partir da Rogercom. Observao: para futuras atualizaes, bom sempre fazer download dos drivers a partir da pgina da FTDI.

Aps o download do arquivo, descompacte-o:

Figura 1 - Arquivos de drivers

Os arquivos FTD2XX.lib e FTD2XX.h so bibliotecas de funes para programao. Os drivers so somente os arquivos marcados com retngulos vermelhos.

Para comear a instalao do dispositivo USB FT232BM, conecte o cabo USB ao Host/Root Hub (PC), ou em uma porta downstream de um Hub;
Figura 2 - Conexo do dispositivo baseado no FT232BM ao Host(PC)

Foto ilustrativa da placa Rogercom USB232RCOM-1 baseada no FT232BM

Alguns segundos aps a conexo do cabo do dispositivo FT232BM ao Host, so exibidas algumas janelas mostradas nas Figuras 3 e 4 logo abaixo:

Figura 3 - Janela exibida ao conectar o dispositivo pela primeira vez ao Host (PC)

A mensagem "USB <-> Serial" o nome do dispositivo, e vem por padro gravada dentro do chipset FT232BM. Esta mensagem enviada ao Host via Descritores quando o novo dispositivo conectado pela primeira vez ao Bus USB. Para mudar esta mensagem, preciso que o FT232BM seja configurado com uma memria 93C46 (93C56 ou 93C66), e, atravs do programa MProg criado pela FTDI, possvel personalizar o dispositivo. Se a memria 93Cxx do dispositivo estiver vazia, assumido o Descritor padro do FT232BM. Na prxima aula irei mostrar passo-a-passo como configurar os drivers e a memria 93Cxx, para personalizar um dispositivo baseado nos chipsets FT232BM/FT245BM.

Figura 4 - Assistente de instalao de um novo hardware do Windows - tela 1

Clique no boto Avanar para passar para o prximo passo...

Conforme a figura abaixo, marque a opo "(o)Procurar por um driver adequado para o dispositivo (recomendado)";

Figura 5 - Assistente de instalao de um novo hardware do Windows - tela 2

Clique no boto Avanar para passar para o prximo passo...

8
(pasta);

Conforme a figura abaixo, marque a opo "[\/]Especificar um local"

Figura 6 - Assistente de instalao de um novo hardware do Windows - tela 3

Clique no boto Avanar para passar para o prximo passo...

Conforme a figura abaixo, clique no boto Procurar... para localizar a pasta onde se encontram os drivers;
Figura 7 - Janela para localizar a Pasta onde se encontram os Drivers D2XX

Clique no boto OK para passar para o prximo passo...

10
ftd2xx.inf;

Aps localizar e abrir a pasta dos drivers, selecione o arquivo

Figura 8 - Pasta onde se encontram os drivers

Clique no boto Abrir para passar para o prximo passo...

11

Aps a localizao correta dos arquivos, exibida a janela abaixo:

Figura 9 - Assistente de instalao de um novo hardware do Windows - tela 4

Clique no boto Avanar para passar para a prxima etapa...

Figura 10 - Copiando os arquivos para as pastas do sistema windows

Figura 11 - Tela que indica sucesso na instalao dos drivers D2XX

Clique no boto Concluir para fechar o assistente de instalao.

Verificando se o dispositivo foi instalado corretamente no Windows Ainda com o dispositivo conectado ao Host (PC), abra o Gerenciador de dispositivos a partir do Painel de Controle do windows, fazendo assim: Abra o Painel de Controle; Localize o cone Sistema; Na janela Propriedades do Sistema, clique na Aba Hardware e depois no boto Gerenciador de dispositivos;

Aps ser exibida a janela abaixo, clique no item "Controladores Universal Serial Bus" ;
Figura 12 - Janela do Gerenciador de dispositivos do Windows

Para ver as propriedades do novo dispositivo instalado, d duplo clique no item FTDI FT8U2XX. Ser exibida a janela abaixo:

Figura 13 - Janela de Propriedades do novo dispositivo, FTDI FT8U2XX recentemente instalado

Clique no boto OK e depois feche todas as janelas. Observao: O Windows registra a instalao do dispositivo na janela Adicionar ou remover programas do Painel de Controle. Para ver, abra o Painel de Controle e d duplo clique no cone Adicionar ou remover programas.
Figura 14 - Janela Adicionar ou remover programas do Windows

Na prxima aula irei explicar como instalar os drivers VCP, e tambm gravar a memria 93Cxx para personalizar um dispositivo baseado no FT232BM para comercializao.

Instalando os drivers da Porta Virtual COM (VCP)

Passos para instalar os drivers VCP da FTDI no Windows (como exemplo, o 2000) O objetivo dos drivers VCP adicionar ao sistema operacional uma porta serial COMx virtual, para possibilitar aos programas que se comuniquem com a porta Serial, tambm se comunicarem com uma Porta USB. Sendo assim, um programa j existente de comunicao Serial, poder se comunicar com o Bus USB sem ser necessrio nenhuma alterao no seu cdigo fonte. Novos programas podem ser criados usando a API do Windows para programao da porta Serial, para se comunicarem com o Bus USB, usando a mesma facilidade de programao da Porta Serial. Os programas tambm podem ser criados usando a biblioteca de funes da FTDI. Segue abaixo os passos necessrios para se instalar os drivers VCP: Observao para se fazer uma nova instalao: Se j encontra-se instalado um driver D2XX ou VCP no sistema, preciso que o mesmo seja removido. Faa isso a partir do Adicionar ou remover programas do Painel de Controle do Windows.

1 2 3

Acesse o site da FTDI em: www.ftdichip.com, e faa download do driver VCP para a verso do Windows ou outros sistemas operacionais; Na pgina principal da FTDI, clique no item Drivers do Menu; e depois no subitem FT232 - FT245; Aps se abrir a nova pgina, clique no link VCP. Apos isso exibida a . Clique no link correspondente ao seu sistema

seo operacional.

Download dos Drivers a partir da Rogercom. Observao: para futuras atualizaes, bom sempre fazer download dos drivers a partir da pgina da FTDI.

Aps o download do arquivo dos drivers, descompacte-o:

Figura 1 - Arquivos de drivers

Alm dos arquivos de drivers de converso Serial para USB (FTDIBUS), a FTDI disponibiliza tambm um mini driver para controle de um mouse Serial.

5 6

Para comear a instalao do dispositivo USB FT232BM, conecte o cabo USB ao Host/Root Hub (PC), ou em uma porta downstream de um Hub; Alguns segundos aps a conexo do cabo do dispositivo FT232BM ao Host, so exibidas algumas janelas mostradas nas Figuras 2 e 3 logo abaixo:
Figura 2 - Janela exibida ao conectar o dispositivo pela primeira vez ao Host (PC)

Como j aprendemos na aula anterior, a mensagem "USB <-> Serial" o nome do dispositivo, e vem por padro gravada dentro do chipset FT232BM.

Figura 3 - Assistente de instalao de um novo hardware do Windows - tela 1

Clique no boto Avanar para passar para o prximo passo...

Conforme a figura abaixo, marque a opo "(o)Procurar por um driver adequado para o dispositivo (recomendado)";

Figura 4 - Assistente de instalao de um novo hardware do Windows - tela 2

Clique no boto Avanar para passar para o prximo passo...

8
(pasta);

Conforme a figura abaixo, marque a opo "[\/]Especificar um local"

Figura 5 - Assistente de instalao de um novo hardware do Windows - tela 3

Clique no boto Avanar para passar para o prximo passo...

Conforme a figura abaixo, clique no boto Procurar... para localizar a pasta onde se encontram os drivers;
Figura 6 - Janela para localizar a Pasta onde se encontram os Drivers VCP

Clique no boto OK para passar para o prximo passo...

10

Aps localizar e abrir a pasta dos drivers, selecione o arquivo FTDIBUS.INF;

Figura 7 - Pasta onde se encontram os drivers

Clique no boto Abrir para passar para o prximo passo...

11

Aps a localizao correta dos arquivos, exibida a janela abaixo:

Figura 8 - Assistente de instalao de um novo hardware do Windows - tela 4

Clique no boto Avanar para passar para a prxima etapa...

Figura 9 - Copiando os arquivos para as pastas do sistema windows

Figura 10 - Tela que indica sucesso na instalao dos drivers VCP

Clique no boto Concluir para fechar o assistente de instalao.

Verificando se o dispositivo foi instalado corretamente no Windows Ainda com o dispositivo conectado ao Host (PC), abra o Gerenciador de dispositivos a partir do Painel de Controle do windows, fazendo assim: Abra o Painel de Controle; Localize o cone Sistema; Na janela Propriedades do Sistema, clique na Aba Hardware e depois no boto Gerenciador de dispositivos; Aps ser exibida a janela abaixo, abra o item "Portas (COM e LPT)" ;

Figura 11 - Janela do Gerenciador de dispositivos do Windows

Para ver as propriedades do novo dispositivo instalado, d duplo clique no item USB Serial Port (COM4). Ser exibida a janela abaixo, aps clicar na Aba "Port Settings":
Figura 12 - Janela de Propriedades do novo dispositivo, USB Serial Port (COMx) recentemente instalado

Se desejar alterar o nmero da porta, ou simplesmente ver qual est associada ao Bus USB, clique no boto "Advanced..." e veja no campo "COM Port Number".
Figura 13 - Configuraes avanadas da Porta COM instalada

Clique no boto OK e depois feche todas as janelas para finalizar. Observao: O Windows registra a instalao do dispositivo na janela Adicionar ou remover programas do Painel de Controle. Para ver, abra o Painel de Controle e d duplo clique no cone Adicionar ou remover programas.
Figura 14 - Janela Adicionar ou remover programas do Windows

Na prxima aula irei explicar como gravar a memria 93Cxx para personalizar um dispositivo baseado no FT232BM para comercializao.

Usando o aplicativo MProg para gravar a EEPROM 93C46

Para personalizar o novo dispositivo criado, precisamos gravar na memria 93C46 alguns campos com informaes sobre o tipo do dispositivo, como o nome, o VID e o PID, a quantidade de corrente que ser consumida, a verso do USB, Bus powered ou Self powered, nmero de srie, etc. Para gravarmos esses dados na EEPROM, usaremos o programa Mprog de uso livre, criado pela FTDI. Alm de programarmos a EEPROM, precisaremos alterar algumas linhas dos arquivos INF e INI de um dos drivers (D2XX ou VCP), escolhido para ser instalado no sistema operacional. Um arquivo INF est associado a um ou vrios dispositivos, e contm informaes bsicas para a instalao dos drivers apropriados. Se os nmeros PID e VID do dispositivo forem idnticos aos do contedo do arquivo INF, os drivers especificados sero carregados na memria e a comunicao USB ser estabelecida. Caso contrrio, o dispositivo ficar conectado ao Bus USB, mas sem comunicao de dados. Quando uma EEPROM externa no est configurada ao FT232BM, assumido o VID e o PID "default" ou padro da FTDI, que so respectivamente os nmeros: 0403 e 6001. Quando fazemos download dos drivers, esto gravados nos arquivos INF e INI, o VID (0403) e o PID (6001). Portanto, se uma EEPROM externa for configurada ao FT232BM e gravado um novo VID e um novo PID, so necessrios que eles tambm sejam gravados nos arquivos INF e INI para que o sistema consiga instalar os drivers corretamente. Se a memria EEPROM configurada ao FT232BM estiver vazia ou for apagada, o FT232BM enviar ao sistema o VID e PID padro FTDI (0403 e 6001). O programa MProg s conseguir gravar na memria EEPROM se os drivers associados ao dispositivo tiverem sido previamente instalados no sistema. Se por algum motivo no lembrarmos qual o VID ou PID gravados na EEPROM externa de um dispositivo FT232BM, poderemos usar o programa de analises de protocolo USB (Usbview.exe) para descobrirmos o VID e PID e, posterior incluso destes nos arquivos INF e INI. Para fazer download do aplicativo MProg, clique em um dos cones abaixo: Download MProg 2.8 ou superior (FTDI). Download MProg 2.8 (www.rogercom.com). Para sua instalao so necessrios os drivers D2XX.

Figura 1 - Tela parcial do MProg com dados padro FTDI para o chipset FT232BM.

Descrio dos campos e botes do MProg

A - (Modo de edio). Quando um arquivo for aberto ou salvo e, aps isso, for
necessrio fazer uma alterao em um dos campos do MProg, preciso clicar nesse boto para habilit-los;

B - (Salva as configuraes). Salva num arquivo para futura recuperao, a


configurao atual;

C - (Procurar por dispositivos). Ao clicar nesse boto o MProg localiza todos


os dispositivos FTDI conectados ao Bus USB. So exibidas informaes sobre quantos dispositivos (EEPROM) foram programados ou esto em branco;

D - (Apagar dispositivos). Apaga a memria EEPROM de todos os dispositivos


FTDI conectados ao Bus USB;

E - (Programar dispositivos). Grava a memria EEPROM de todos os


dispositivos FTDI conectados ao Bus USB.

1 - (Device Type). Selecione nesse campo o tipo de chipset FTDI: FT232BM,


FT245BM, etc;

2 - (USB VID/PID). Se voc desejar gravar seu prprio VID e PID, selecione a
opo Own VID & PID. Se desejar manter o padro FTDI (VID=0403 e PID=6001), selecione a opo FTDI default;

3, 4 - (Campos VID e PID). Esses dois campos so muito importantes e


identificam o vendedor e o fabricante do dispositivo. atravs desses campos que o sistema operacional reconhece e carrega na memria, o driver apropriado. Por isso, preciso que sejam gravados os mesmos VID e PID no arquivo INF;

5 - (USB Power Options). Selecione como o seu dispositivo ser alimentado.


Bus-powered (alimentado pelo Bus USB), ou Self powered (auto-alimentado, a energia vir de uma fonte externa);

6 - (Max Bus Power). Se seu dispositivo foi configurado como sendo Bus
powered, digite neste campo a quantidade mxima de correntente que ele consumir. O valor mximo permitido 500mA. J vimos em aulas anteriores que um Hub Bus powered s pode fornecer 100mA. Se estiver criando um dispositivo que consumir mais que 100mA, importante que ele seja do tipo Self powered (com sua prpria fonte de alimentao);

7 - (USB Serial Number Control). Todo dispositivo USB poder ter um nmero
Serial. Nessa opo poderemos definir nosso prprio nmero Serial ou pedir que o MProg crie um automaticamente, iniciando a partir de um prefixo de dois caracteres;

8 - (USB Version Number). A verso do USB que seu dispositivo suporta.


Mantenha selecionado sempre USB 2.0, assim seu dispositivo ser reconhecido tanto na verso USB 1.1 como USB 2.0;

9 - (Disable USB Serial Number). Ao marcar essa opo o Nmero Serial no


ser levado em conta. Ou seja, a opo 7 ser desconsiderada;

10 - (Pull Down IO Pins in USB Suspend). Ao habilitar esta opo na


EEPROM, o pino PRWEN# do FT232BM poder ser usado para controlar a

alimentao de dispositivos externos, alimentados diretamente atravs do bus USB, mediante a utilizao de um MOSFET Canal-P;

11 - (USB Remote Wake Up). Se esta opo for habilitada na EEPROM, ser
possvel a partir do pino RI# (em nvel lgico baixo) do FT232BM, retomar o Controlador Host USB do estado de dormncia (Sleep);

12 - (Enable Plug And Play). Windows plug and Play. Usada somente para
chips da srie FT232. Ao selecionar um chip do tipo FT245 esta opo automaticamente desabilitada;

13 - (Manufacturer). Nome do fabricante do dispositivo. Use poucos


caracteres, ou abrevie o nome da sua empresa;

14 - (Product Description). Descrio do produto (o que ele faz). Exemplo


"Sensor de Temperatura USB";

15 - (Only Program Blank Devices). Ao marcar esta opo, o MProg s


gravar dispositivos que estiverem em branco (vazio). Ou seja, a EEPROM que estiver com contedo no ser alterada. Para atualizar uma EEPROM, desmarque essa opo antes de grav-la;

16 - rea de exibio do estado de algumas aes executadas pelo usurio.


Analisando o contedo dos arquivos INF e INI para personalizar o Dispositivo Como j foi escrito anteriormente no incio desta aula, para personalizar um dispositivo, alm de gravar alguns campos de dados na memria EEPROM, necessrio que os arquivos INF e INI associados aos drivers sejam tambm modificados, com o mesmo VID e PID gravados nessa memria. Mas, antes de fazermos as devidas alteraes nesses arquivos, iremos analisar o contedo padro dentro deles. Para facilitar a visibilidade, irei mostrar somente fragmentos do contedo de cada arquivo, ou seja, somente as partes onde sofrero alteraes ou adies de dados. Arquivos dos Drivers D2XX

Figura 2 - Pasta com os arquivos dos Drivers D2XX

Na figura acima vemos os arquivos que contm informaes sobre a instalao (ftd2xx.inf), e a desinstalao (FTD2XXUN.INI) dos drivers D2XX. Somente estes dois arquivos devem ser atualizados com o mesmo VID e PID que foram programados na EEPROM do dispositivo. Os fragmentos dos arquivos abaixo mostram as configuraes padro da FTDI.
Figura 3 - Fragmentos do arquivo FTD2XX.INF mostrando os segmentos que sofrero as devidas alteraes [FtdiHw] %USB\VID_0403&PID_6001.DeviceDesc%=FTD2XX, USB\VID_0403&PID_6001 [ControlFlags] ExcludeFromSelect=USB\VID_0403&PID_6001 [FTD2XX.UnInst] HKLM,%WINUN%,"FTD2XX" HKLM,%WINUN%\FTD2XX , "UninstallString",,"%11%\FTDIUNIN.exe %11%\FTD2XXUN.INI" HKLM,%WINUN%\FTD2XX , "DisplayName",,"FTDI FTD2XX USB Drivers" [Strings] Ftdi="FTDI" USB\VID_0403&PID_6001.DeviceDesc="FTDI FT8U2XX Device" FTD2XX.SvcDesc="FTD2XX.SYS FT8U2XX device driver" WINUN="Software\Microsoft\Windows\CurrentVersion\Uninstall" DriversDisk="FTDI FTD2XX Drivers Disk"

A string "DisplayName",,"FTDI FTD2XX USB Drivers" exibida na janela "Adicionar ou remover programas" do Painel de Controle do Windows. J a string DeviceDesc="FTDI FT8U2XX Device" exibida na seo de dispositivos USB instalados, no Gerenciador de Dispositivos do Windows, e na janela de propriedades do mesmo.

Figura 4 - Fragmento do arquivo FTD2XXUN.INI de desinstalao

[Uninstall] Device=VID_0403&PID_6001

Arquivos dos Drivers VCP Na figura abaixo esto marcados com retngulos vermelhos, os arquivos que contm informaes sobre a instalao e a desinstalao dos drivers VCP. Somente estes quatro arquivos devem ser atualizados com o mesmo VID e PID que foram programados na EEPROM do dispositivo.
Figura 5 - Pasta com os arquivos dos Drivers VCP

Figura 6 - Fragmento do arquivo FTDIBUS.INF de instalao [FtdiHw] %USB\VID_0403&PID_6001.DeviceDesc%=FtdiBus,USB\VID_0403&PID_6001 [ControlFlags] ExcludeFromSelect=USB\VID_0403&PID_6001 [Strings] USB\VID_0403&PID_6001.DeviceDesc="USB Serial Converter"

Figura 7 - Fragmento do arquivo FTDIPORT.INF de instalao [FtdiHw] %VID_0403&PID_6001.DeviceDesc%=FtdiPort232,FTDIBUS\COMPORT&VID_0403&PID _6001

[Strings] VID_0403&PID_6001.DeviceDesc="USB Serial Port"

Figura 8 - Fragmento do arquivo FTD2XXUN.INI de desinstalao [Uninstall] Device=VID_0403&PID_6001 InfFiles=FTDIBUS,FTDIPORT,FTSERMOU Key=FTDICOMM

Figura 9- Fragmento do arquivo FTDIUN2K.INI de desinstalao Device=VID_0403&PID_6001 Converter=FTDIBUS Serial=FTSER2K Key=FTDICOMM

Dica: Quando criarmos nosso primeiro dispositivo, o mesmo estar com o EEPROM, vazia, portanto, o FTDI232BM enviar para o sistema USB os descritores de dispositivo, contendo o VID=0403 e PID=6001 (Padro da FDI). Sendo assim, na primeira instalao do dispositivo, os drivers tem de conter o mesmo VID=0403 e PID=6001. Se for comercializar o novo dispositivo, grave seu VID e PID na EEPROM e Tambm altera os INF e INI associados aos drivers que sero instalados o (D2XX ou VPC). So esses drivers que devero ser enviados ao cliente junto com o dispositivo (gravado com o novo VID/PID).

Como exemplo, na prxima aula iremos criar um novo PID e VID, grav-los na EEPROM do dispositivo e fazermos as devidas alteraes nos arquivos INF e INI dos drivers D2XX.

Programando a memria EEPROM 93C46 para personalizar o dispositivo Nesta aula iremos usar o aplicativo MProg para gravar a memria EEPROM 93C46, e assim personalizar o novo dispositivo criado. Iremos tambm aprender a remover do sistema, os drivers D2XX e VCP. Para executar na prtica, a maioria dos procedimentos contidos nesta aula, ser preciso que voc confeccione o dispositivo Bus powered da Figura 5, Aula 3 (clique aqui...). Na Figura 1 logo abaixo, est visvel a tela de edio do MProg onde constam alguns campos marcados. Esses campos foram alterados conforme as caractersticas do dispositivo que se quer personalizar. Siga os passos abaixo para gravar a memria EEPROM de um novo dispositivo:

1 - Certifique-se se h uma pasta com os arquivos dos drivers D2XX em seu disco rgido (HD):

Figura 1 - Pasta com os arquivos dos Drivers D2XX

2 - D duplo clique sobre o arquivo ftd2xx.inf, para abri-lo (no Bloco de Notas do Windows). Altere ou adicione as linhas marcadas, conforme mostra a figura abaixo:
Figura 2 - Fragmentos do arquivo FTD2XX.INF mostrando as linhas que devem ser adicionadas/alteradas [FtdiHw] %USB\VID_0403&PID_6001.DeviceDesc%=FTD2XX, USB\VID_0403&PID_6001 %USB\VID_5000&PID_6000.DeviceDesc%=FTD2XX, USB\VID_5000&PID_6000 [ControlFlags] ExcludeFromSelect=USB\VID_0403&PID_6001 ExcludeFromSelect=USB\VID_5000&PID_6000 [FTD2XX.UnInst] HKLM,%WINUN%,"FTD2XX" HKLM,%WINUN%\FTD2XX , "UninstallString",,"%11%\FTDIUNIN.exe %11%\FTD2XXUN.INI" HKLM,%WINUN%\FTD2XX , "DisplayName",,"ROGERCOM Controle Residencial - Driver USB." [Strings] Ftdi="FTDI" USB\VID_0403&PID_6001.DeviceDesc="FTDI FT8U2XX Device" USB\VID_5000&PID_6000.DeviceDesc="Controle Residencial via USB." FTD2XX.SvcDesc="FTD2XX.SYS FT8U2XX device driver" WINUN="Software\Microsoft\Windows\CurrentVersion\Uninstall" DriversDisk="FTDI FTD2XX Drivers Disk"

Este cone indica que voc dever duplicar a linha e alterar o VID e o PID, iguais queles que foram gravados na EEPROM do novo dispositivo. No nosso caso VID=5000 e PID=6000.

Este cone indica que voc dever alterar somente a string de cor verde daquela linha. A string "DisplayName",,"ROGERCOM Controle Residencial - Driver USB.", ser exibida na janela "Adicionar ou remover programas" do Painel de Controle do Windows. J a string DeviceDesc="Controle Residencial via USB.", ser exibida na seo de dispositivos USB instalados, no Gerenciador de Dispositivos do Windows e na janela de propriedades do mesmo.
Figura 3 - Alterao do PID e VID do arquivo FTD2XXUN.INI [Uninstall] Device=VID_5000&PID_6000 Converter=FTD2XX Key=FTD2XX

O arquivo FTD2XXUN.INI utilizado pelo programa de desinstalao dos drivers.

3 - Aps a alterao dos arquivos, salve-os; 4 - Conecte o seu novo dispositivo FT232BM a uma das portas do Root Hub do Host PC;
Figura 4 - Foto ilustrativa do novo dispositivo conectado ao Host USB (PC)

5 - Abra o programa MProg; 6 - Clique no boto


template; (Create New Programming Template), para criar um novo

7 - Selecione no campo Device Type o dispositivo chamado FT232BM; 8 - Preencha os dados conforme a tela abaixo:

Figura 5 - Tela de edio de dados do MProg para gravar um novo dispositivo

9 - Aps o preenchimento dos dados, clique no boto


para salvar o template em um arquivo (DispResid1.ept);

(Save Template As...)

Figura 6 - Tela salvar template do MProg

10 - Clique no boto Salvar; 11 - Depois, clique no boto


dispositivo; Se a gravao tiver tido sucesso, ser exibida a seguinte mensagem na rea de status do MProg, mas com um nmero serial diferente:
Figura 7 - Tela de status do MProg

para gravar a memria EEPROM do

Dicas: - Caso haja alguma dificuldade, desconecte o dispositivo do Bus USB e remova os drivers. Para isso siga os passos da seo "Desinstalando os drives D2XX e VCP", no final desta aula. - Se por algum motivo voc no lembrar qual o nmero do VID e PID que esto gravados na memria EEPROM do dispositivo, execute o aplicativo Usbview.exe (analisador de protocolo USB). Download do Usbview.exe.

Figura 8 - Tela do aplicativo Usbview

No programa Usbview, para se descobrir qual o VID e PID, clique sobre o nome do dispositivo na janela da esquerda, na janela da direita so mostrados os campos VID (idVendor) e PID (idProduct). Pronto, agora adicione o VID e PID no arquivo ftd2xx.inf conforme exibido na Figura 2. Salve o arquivo e conecte o dispositivo ao Host USB. Desinstalando os drives D2XX e VCP O mtodo certo para remover os drivers da FTDI, atravs do "Adicionar ou remover programas" do Painel de Controle do Windows. O Windows chama automaticamente o programa FTDIUNIN.EXE, passando para ele alguns parmetros, sobre o driver a ser removido, como os nmeros VID e PID. Siga os passos abaixo para remover os drivers D2XX ou VCP:

1 - Desconecte fisicamente o dispositivo do Bus USB;


Figura 9 - Desconecta dispositivo

2 - Abra o utilitrio "Adicionar ou remover programas" atravs do Painel de


Controle do Windows;

Figura 10 - Tela do Adicionar ou remover programas do Windows

3 - Selecione na listagem da figura acima, o nome do driver, depois clique no boto Alterar/remover. Se voc personalizou o dispositivo, o nome do driver ser igual quele que escreveu na seo [FTD2XX.UnInst] do arquivo ftd2xx.inf.
Figura 11 - Tela de aviso do utilitrio de remoo FTDIUNIN.EXE

4 - Clique no boto Continue para passar para o prximo passo;


Figura 12 - Tela de concluso de remoo dos drivers

5 - Pronto, os drivers foram removidos, clique no boto Finish para finalizar.


Para remover os drivers VCP, os passos so os mesmos, s muda o nome exibido na listagem do utilitrio Adicionar e remover programas do Painel de Controle do Windows. Observao importante: Se o VID e o PID gravados na EEPROM forem diferentes dos existentes no arquivo ftd2xx.inf, ao conectar o dispositivo ao Bus USB, e tentar instalar os dirvers, ser exibida uma mensagem de erro, e a comunicao USB no ser estabelecida. O dispositivo ficar parcialmente conectado ao sistema USB. Para resolver esse problema, desconecte o dispositivo; remova os drivers; abra o arquivo ftd2xx.inf e acrescente os mesmos PID e VID gravados na EEPROM. Torne a conectar o dispositivo ao Bus USB, e siga os procedimentos de instalao dos drivers. Veja abaixo, a tela com a mensagem de erro na instalao dos drivers:
Figura 13 - Mensagem de erro ao instalar os drivers

A figura acima mostra a tela de mensagem de erro, exibida quando o VID e PID dos drivers so diferentes daqueles existentes na memria EEPROM do dispositivo.

Introduo a Porta Serial A partir desta aula iremos comear nossos estudos sobre a comunicao serial, especificamente o padro RS232 que tem mais de 40 anos de existncia, mas ainda muito usado em vrios dispositivos atuais, como computadores Modems, Mouses, Microcontroladores, Impressoras etc. Como objetivo principal pretendo deixar informaes suficientes para que possam compreender o funcionamento da porta serial e, a partir dessa compreenso, tornarem-se capacitados a criar, tanto software de controle como o hardware, e assim implementar seus novos projetos. A comunicao serial teve incio com a inveno do telgrafo. Depois teve um grande desenvolvimento com a inveno do Teletype (teletipo) pelo Francs Jean Maurice mile Baudot, em 1871. Baudot, alm de criar toda a mecnica e eltrica do Teletype, criou tambm um cdigo para a transferncia serial assncrona de informaes, de forma totalmente digital. No cdigo de Baudot havia dois subconjuntos de cdigos. Um era os das letras, chamado por ele de LTRS, abreviatura da palavra LETRAS, e o outro era chamado de FIGS, que significa FIGURAS. Os LTRS eram para codificar as letras, e os FIGS para os dgitos de 0-9 e alguns smbolos e sinais de pontuao. Esse cdigo utilizava um sistema de 5 dgitos binrios para representar um caracter. O dgito 1 era chamado de Mark (Marca) e o zero (0) de Space (Espao). O aparelho de Teletype recebia um caracter de forma assncrona e o imprimia numa fita de papel, onde a Marca era representada por um furo e o Espao pela ausncia do mesmo. Na transmisso dos caracteres atravs da linha telegrfica, o sinal de Marca era representado pela presena de corrente eltrica, e o Espao pela ausncia desta corrente. Para que o Teletype conseguisse distinguir o incio e o final de um caracter, o mesmo era precedido com um sinal Espao e finalizado com um sinal de Marca. Entenda que o estado da linha ociosa (sem transmisso de dados) era o sinal de Marca (presena de corrente eltrica). Foi baseado nesse sistema que o padro de transmisso RS232 evoluiu e se tornou no padro atual, usado na maioria dos computadores e equipamentos digitais diversos. A finalidade de se escrever aqui, sobre o trabalho de Baudot, mostrar a relao de seu invento com o padro serial RS232 atual. Alguns termos ainda usados como: BAUD (Baudot), Mark, Space, Start bit, Stop bit com intervalo de 1,5 bit, tamanho dos dados de 5 bits, entre outras similaridades, iremos compreender nesta aula.

Tabela 1 - Tabela parcial do cdigo de Baudot BITS DECIMALLTRSFIGS 000113 A 1100125 B ? 0111014 C : 010019 D $ 000011 E 3 0110113 F ! . . . . . . . . . . . . 010008 CR CR 000102 LF LF 001004 SP SP Receptor Baudot 1111131 LTRSLTRSColeo de imagens 1101127 FIGS FIGS Fons Vanden Berghen.

Jean Maurice mile Baudot (1845-1903)

Para explicar como eram transmitidos os caracteres codificados no sistema de Baudot, segue abaixo um exemplo de como enviar a palavra FADA! LTRS 11111 F A D A FIGS 01101 00011 01001 00011 11011 ! 01101

No exemplo acima, as letras da palavra FADA esto dispostas na primeira coluna (LTRS) da tabela de cdigos de Baudot. Portanto, para que o sistema receptor de teletype entenda, o transmissor ter que inform-lo previamente atravs do envio de um comando LTRS (11111), alertando que, os prximos caracteres enviados sero letras. Para enviar o caracter "!", antes, se envia o cdigo FIGS para avisar ao receptor que interprete os cdigos conforme os da segunda coluna (FIGS). Na verdade, os cdigos especiais LTRS e FIGS servem para combinar, e portanto, enviar qualquer um dos caracteres da tabela de cdigos de Baudot (Letras, dgitos, sinais de pontuao e smbolos) num total de 64, incluindo os prprios LTRS e FIGS. Para assimilarmos o conceito dos cdigos LTRS e FIGS no sistema de Baudot, podemos comparar, grosso modo, com um teclado de computador onde o cdigo de cada tecla transmitido serialmente e, para alternar entre letras maisculas e minsculas, pressiona-se a tecla CapsLock.
Figura 1 - Sinal eltrico para o caracter 'P' (10110) no cdigo de Baudot

Na figura acima temos a representao grfica de um caracter de 5 bits do cdigo Baudot, na relao corrente/tempo. Quando a linha est ociosa (nenhum dado fluindo), a mesma fica no estado Marca (presena de corrente eltrica). Como exemplo, para se transmitir o caracter 'P' (10110), primeiro envia-se um START (ausncia de corrente na linha - Espao) por um determinado intervalo de tempo (t). Depois se envia os impulsos representando as Marcas e os Espaos do cdigo do caracter. Aps isso, envia-se um STOP (A linha levada ao estado Marca), e fica assim indeterminadamente at que um novo caracter seja enviado.
Figura 2 - Fita de papel com impresso do cdigo de Baudot

A figura acima mostra uma fita de papel com impresses dos cdigos de Baudot. O bit 1 (Marca) associado a um furinho, e o bit 0 (Espao), a ausncia do mesmo, ou seja, um espao.

Modos de transmisso serial O modo da transmisso pode ser classificado em Simplex, Half-duplex e Full-duplex. Ou seja, a informao pode fluir num nico sentido, nos dois sentidos sendo que somente um transmitindo a cada vez, ou nos dois sentidos simultaneamente. Os sistemas de comunicaes como: telefonia, satlite, Redes, sistemas wireless, teleprocessamento, etc., usam um desses modos de transmisso. A escolha de qual modo usar depende do que se pretende transmitir.

SIMPLEX No modo Simplex, o fluxo de transmisso flui somente em um sentido, ou seja, um dispositivo s envia os dados e o outro s recebe. Como exemplo, podemos citar uma emissora de Rdio, onde ela s transmite.

Figura 3 - Modo SIMPLEX

HALF-DUPLEX No modo Half-duplex ambos os dispositivos transmitem nos dois sentidos, mas, no simultaneamente. Ou seja, um transmite enquanto o outro espera e vise versa. Esse modo usa um nico canal bidirecional. Como exemplos, podemos citar um rdio Walk-Talk, onde ambas as pessoas podem falar e escutar, mas no ao mesmo tempo.
Figura 4 - HALF-DUPLEX

FULL-DUPLEX No modo de transmisso Full-duplex, h duas linhas independentes, onde uma usada para transmitir e a outra para receber os dados. Ambos os dispositivos taransmitem simultaneamente. Como exemplo, podemos citar uma auto-estrada de duas vias onde os veculos rodam nos dois sentidos. A porta Serial RS232 trabalha em modo Full-duplex, atravs das duas linhas TX-RX.
Figura 5 - FULL-DUPLEX

DTE / DCE Diferente da porta USB, onde o Host sempre um PC e um dispositivo no pode se conectar com outro dispositivo diretamente (a no ser que um deles use tecnologia OTG). No padro RS232, um DTE (Data Terminal Equipment), ou seja, um PC, pode ser conectado a um outro PC (DTE), ou a um DCE (Data Circuit-Terminating Equipment), que pode ser um Modem ou qualquer outro dispositivo serial RS232. possvel tambm um DCE estabelecer comunicao com outro DCE. Como exemplo, posso citar dois dispositivos microcontrolados que disponham de perifricos UART para estabelecer comunicao serial.

Figura 6 - Terminais DTE-DCE

A interface RS232 foi criada com o propsito inicial de conectar Equipamento de Terminais de Dados (DTE), a aparelhos de Modem (DCE Equipamentos de Comunicao de Dados). Com o passar dos anos e a evoluo da tecnologia, surgiram novos equipamentos. Atualmente o RS232 usado para conectar uma grande variedade de dispositivos eletrnicos ao computador, como mouses, dispositivos de telemetria, PDVs, balanas digitais, cdigos de barra, impressoras, Nobreaks, dispositivos microcontrolados em geral entre outros. Quando estivermos estudando os sinais dos conectores RS232, iremos perceber que os pinos so nomeados com termos tcnicos referente as linhas de um Modem. Tipos de transmisso Numa transmisso serial preciso que o DTE entre em sincronismo como o DCE para que os bits possam ser enviados pela linha. Dispositivos seriais podem transmitir de forma sncrona ou assncrona. O receptor, atravs de seus circuitos dedicados, monitora o sinal enviado pelo transmissor e, dessa forma, obtm os bits que esto sendo transmitidos, no mesmo intervalo de tempo. Sncrona No tipo de transmisso sncrona, o DTE fica constantemente enviando sinais para o DCE, com o objetivo de manter a sincronizao da comunicao. Esse tipo de transmisso mais rpido que a assncrona, porque no necessita enviar sinais de controle para cada byte transmitido, como, Start bit e Stop bits. Na transmisso sncrona, envia-se um ou mais bytes de sincronismo antes do incio dos pacotes de dados, e depois, alguns bytes para indicar o final dos mesmos. Aps a transferncia dos pacotes, o DTE continua enviando bytes de controle para manter o sincronismo com o DCE.

Figura 7 - Exemplo didtico de uma transmisso Sncrona

A figura acima mostra uma transmisso sncrona em nvel fsico (de hardware). Observe que o DTE quem envia o sinal de clock para manter o DCE em sincronismo. Os bits dos pacotes so enviados um-a-um atravs da linha de Dados a cada mudana do sinal de clock. Como exemplo, vamos imaginar a transferncia do pacote de dados: "Curso USB/Serial". Veja: sinc sinc sinc... INICIO_BLOCO "Curso USB/Serial" FIM_BLOCO sinc sinc sinc... Muitos chips de memria usam a transmisso sncrona para ler e gravar dados. Assncrona No tipo de transmisso assncrona, o relgio do DTE e DCE so configurados para oscilarem na mesma freqncia (velocidade de transmisso). Numa transmisso assncrona os dados so divididos em pequenos pacotes de dados de tamanho entre 5 a 8 bits, para minimizar o risco do oscilador do transmissor e do receptor variar. Se os dados no fossem divididos em pacotes menores, os relgios iriam gradativamente perder o sincronismo, conforme fosse passando o tempo, isso porque o temporizador (relgio) do DTE independente do que h no DCE. por isso que na transmisso serial RS232 utiliza-se um bit de incio (Start bit), e alguns bits de parada (Stop bit), para garantir o sincronismo.
Figura 8 - Exemplo didtico de uma transmisso Assncrona

A figura acima mostra uma transmisso assncrona; DTE e DCE teem relgios de temporizao independentes; so configurados com a mesma velocidade (Baud); mas para garantir a sincronizao ideal, os dados teem tamanho mximo de 8 bits (9 quando utiliz-se o bit de paridade), e so precedidos e finalizados com bits de sincronismos, respectivamente (Start bit e Stop bit).

A figura abaixo mostra a formatao de um Frame (quadro) de 11 bits de extenso, para envio numa transmisso assncrona.
Figura 9 - Formatao de um Frame (Quadro) de 11 bits

Na figura acima temos um Frame de 11 bits formatado da seguinte forma: 1 bit de Start (incio); 8 bits de dado representado no exemplo como o caracter "A"; 1 bit para a paridade e 1 bit de Stop (parada). Quando a linha est ociosa (inativa, idle ou inoperante) ela permanece no estado Marca ou "1" lgico, ou seja, com nveis de tenses entre -3v a -25v. Para transmitir um caracter pela linha serial, o transmissor primeiramente envia um 1 bit de Start com o objetivo de zerar e inicializar o temporizador do receptor, avisando que um novo caracter est a caminho. Aps os bits de dados e a paridade (opcional) terem sido enviados, logo 1 Stop bit transmitido para avisar ao receptor o final do Frame, e manter a linha no estado inativa novamente. Observe tambm na figura acima, o tempo de 1 bit (104uS). Ou seja, o intervalo de tempo que o receptor ter para identificar o estado do sinal Marca (1) ou Espao (0). Esse tempo tambm o mesmo usado pelo transmissor enviar um bit. No exemplo da figura acima estamos usando uma taxa de transferncia de 9600 Baud. Sendo assim, a cada 104uS um sinal alternado, ou seja, passa de um estado para outro. Para saber o tempo de cada bit, divida o nmero 1 pela taxa de baud: 1/9600 = 104uS (arredondado). Este o tempo de um bit.
Figura 10 - Exemplo de uma transmisso serial

A figura acima mostra a animao de uma transmisso serial bit-a-bit (DTE-->DCE), usando como exemplo o caracter "A". Bit de Paridade O bit de paridade utilizado numa transmisso serial assncrona, como uma soluo primria em nvel de hardware para detectar a ocorrncia de erros na transmisso de dados. A cada byte enviado, o receptor verifica se os bits do mesmo no foram modificados. O hardware receptor verifica isso somando todos os bits "1" que h no byte, mais o valor do bit de paridade. O resultado dessa soma dever ser Par ou mpar. Se a paridade na configurao do DTE e DCE foi definida, por exemplo, como PAR, a soma dos bits "1" do dado, mais o valor do bit de paridade recebido tem que ser PAR para um dado correto. Se por acaso o resultado der mpar, isso indica que o dado recebido sofreu alguma modificao em algum momento da transmisso, ou seja, houve um erro. Se a transmisso no for usar bit de paridade, isso deve ser avisado na configurao do DTE e DCE. Os tipos de paridades que podem ser usadas para configurar os terminais so: Nenhuma, mpar, Par, Marca ou Espao. As paridades Marca e Espao no so mais usadas, e ainda constam nas configuraes para manter compatibilidade com os antigos sistemas de transmisso serial.
Figura 11 - Exemplo 1 - paridade PAR

A figura acima demonstra o uso da paridade PAR. Temos um dado de 8 bits 00110100 (com um total de 3 bits "1", resultando em um nmero mpar). Para que a soma dos bits de dado+paridade seja Par, o circuito transmissor adiciona o valor "1" ao bit de paridade. Assim, a soma dos bits de dados+paridade fica igual a 4 (PAR). Aps isso, o transmissor envia o Frame ao receptor. Por sua vez, ao receber o Frame, o receptor verifica se a soma dos bits de dado+paridade um resultado tambm PAR, confirmando o sucesso. Caso contrrio, detectado um erro de transmisso. A demonstrao abaixo segue o mesmo princpio da anterior, para adicionar o bit de paridade pelo transmossor e a verificao pelo receptor, levando em conta tambm a paridade PAR. A diferena abaixo que a soma dos bits do dado j um resultado Par. Nesse caso, o hardware do transmissor adiciona um valor "0" ao bit de paridade, para que o resultado da soma dos bits dado+paridade seja um resultado PAR.

Figura 12 - Exemplo 2 - paridade PAR

Interface RS232 O padro RS232 foi criado em 1962 para conectar diretamente dois dispositivos. Foi padronizado pela Associao de Indstria de Eletrnica (EIA). Originalmente era usado para conectar dispositivos de teletipo que utilizavam o cdigo ASCII para transmitir dados de forma assncrona. As letras "RS" quer dizer Recomended Standard (padro recomendado) e 232, a verso. O padro RS232 foi criado com o objetivo de definir as caractersticas eltricas, temporizao, mecnicas e funes dos sinais da interface serial, para conectar dispositivos ponto-a-ponto. Com o passar dos anos o padro evoluiu e teve a terceira reviso em 1969 (RS-232C) verso "C". EIA-232D e EIA-232E foram atualizadas respectivamente em 1987 e 1991. Por volta de 1984 o nico padro de comunicao serial em computadores pessoais IBM-PC era o RS232C. Mais tarde surgiram o irDA (Infra-vermelho), USB entre outros. Sinais eltricos O grfico abaixo mostra as tenses eltricas para representar os sinais lgicos usados no padro RS232. Observe que h uma regio de transio do sinal onde a tenso utilizada para representar o "0" e o "1" lgico. Veja tambm que o "0" lgico associado a faixa de tenso positiva e o "1" a faixa de tenso negativa.

Figura 13 - Sinal eltrico do padro RS232

As tenses mximas que a interface RS232 suporta 25v. Um Espao ou zero (0) lgico, representado por tenses positivas, entre +3v a +25v. Uma Marca ou o um (1) lgico, representado por tenses entre -3v -25v. J a faixa de tenses entre -3v e +3v conhecida como uma regio de transio, sendo considerada indefinida. Ou seja, esta regio no representa nenhum estado lgico vlido no padro RS232. Algumas interfaces RS232 nos computadores atuais fornecem -12v e +12v, mas suportam mnimas de -25v e mximas de +25v.

Conectores Existem atualmente vrios tipos de conectores seriais, como o RJ45, parafusado, plug, etc. Essa diversidade porque muitos fabricantes de dispositivos e equipamentos de comunicao serial criam seus prprios conectores, seja por questes de designer ou dimenses fsicas, por no ter espao para comportar um conector padro RS232. Mas o padro RS232 define somente os tipos macho e fmea dos conectores DB9 e DB25. Aqui iremos tratar dos dois como sendo do tipo Macho. Os do tipo furinho so fmeas. Tanto o conector macho como o fmea tem seus pinos numerados. Cada pino tem um significado e esse significado est associado a um perifrico Modem.

Veja abaixo as caractersticas do conector DB9:


Figura 1 - Conector DB9 Macho

Tabela 1 - Significado e sentido dos sinais dos pinos do DB9 Macho DB9 - No. Sentido Sinal Descrio Pino (DTE) Pino 3 TXD Sada=> Transmit Data Pino 2 RXD <=Entrada Receive Data Pino 7 RTS Sada=> Request To Send Pino 8 CTS <=Entrada Clear To Send Pino 6 DSR <=Entrada Data Set Ready Pino 5 SG Signal Ground Pino 1 DCD <=Entrada Data Carrier Detect Pino 4 DTR Sada=> Data Terminal Ready Pino 9 RI <=Entrada Ring Indicator

Obs.: Alguns pinos do DB25 no foram descritos aqui, isso porque no so muito utilizados. Alguns cabos seriais usam o pino 1 para ligar um fio de malha. No DB9 no h um pino para ligar a malha e pode ser soldado na prpria carcaa do cabo. O objetivo do fio de malha eliminar rudos na transmisso entre o DTE e o DCE, quando a mesma se faz em altas velocidades.

Figura 2 - Conector DB25 Macho

Tabela 2 - Significado e sentido dos sinais dos pinos do DB25 Macho DB25 - No. Sentido Sinal Descrio Pino (DTE) Pino 2 TXD Sada=> Transmit Data Pino 3 RXD <=Entrada Receive Data Pino 4 RTS Sada=> Request To Send Pino 5 CTS <=Entrada Clear To Send Pino 6 DSR <=Entrada Data Set Ready Pino 7 SG Signal Ground (terra) Pino 8 DCD <=Entrada Data Carrier Detect Pino 20 DTR Sada=> Data Terminal Ready Pino 22 RI <=Entrada Ring Indicator

Observe que no conector DB9 o pino 2 RXD, e o pino 3 TXD. No DB25 isso no o mesmo, veja na tabela acima que o inverso. Fique atento quando for fazer converses de conectores DB9 para DB25 ou vice versa.

Funes dos sinais de controle As linhas de sadas >> DTR e RTS podem ser ligadas ou desligadas independentemente, atravs do envio de um valor lgico "0" ou "1" para um registrador especfico da porta serial. O "0" liga e o "1" desliga. Veja o sentido dos sinais, se o dispositivo conectado porta serial for um Modem: Quando o DTR for ligado ("0") prepara o modem para ser conectado ao telefone. Aps a conexo o sinal se mantm. Para desconectar o modem da linha telefnica, DTR deve ser levado a "1" (desligado). Quando o RTS for ligado ("0") prepara o Modem para aceitar os dados transmitidos pelo PC. Quando o Modem estiver pronto ele enviar um sinal ("0") ativando a linha CTS no PC. As linhas de entradas << CTS, DCD, DSR e RI podem ser lidas independentemente uma das outras. So usadas pelos dispositivos externos para enviar informaes de aviso para o DTE (PC). Os sinais recebidos podem ser lidos num registrador especfico da porta serial. Esses valores podem ser "0" lgico (ligado) ou "1" lgico (desligado). O CTS habilitado em ("0") pelo DCE para avisar ao DTE (PC) que ele j pode transmitir. O DCD habilitado em nvel lgico ("0") pelo DCE quando a linha telefnica estiver fora do gancho ou uma conexo for completada. Quando no houver tom de resposta, o DCE envia um lgico ("1") para o DTE (PC). O DSR habilitado em ("0") lgico pelo DCE para avisar sucesso na operao. Se houver um erro o DCE sinaliza com um ("1") lgico. O RI habilitado em nvel lgico ("0") quando for detectado um sinal de chamada na linha telefnica. desabilitado em ("1") quando no houver tom de chamada.

Funes dos sinais de dados A linha de sada >> TXD utilizada para enviar bits de dados numa velocidade controlada pelo hardware da porta serial. Como sabemos, atravs dessa linha podemos enviar um byte no formato (Start bit, bits de dados, paridade, Stop bit). Mas tambm possvel usar essa linha como um simples liga/desliga, enviando um comando break (ON/OFF) para um registrador da porta serial. A linha de entrada << RXD utilizada para receber bits de dados numa velocidade controlada pelo hardware da porta serial. Atravs dessa linha podemos receber um byte no formato (Start bit, bits de dados, paridade, Stop

bit). Na prxima aula iremos estudar os registradores da UART (Universal Asynchronous Receiver Transmitter), para podermos manipular os sinais de controle e de dados da linha serial. Controle de Fluxo ou Handshaking uma forma de controlar a transmisso de dados numa comunicao entre dois dispositivos serial. Ou seja, uma maneira amigvel de um dispositivo perguntar e o outro responder. Freqentemente os dispositivos enviam comandos ou sinais um para o outro, perguntando se pode transmitir. O outro dispositivo responde negando ou afirmando. O objetivo eliminar a sobreposio de caracteres (erro de overrun) no dispositivo receptor.

Controle de Fluxo por Software XON/XOFF O controle de fluxo por software conhecido como XON/XOFF (um conjunto de caracteres especiais da tabela ASCII), usados para controlar a transmisso de dados entre dois dispositivos. O caracter XON igual ao cdigo ASCII 17 e o XOFF ao 19. Um caracter XOFF enviado pelo dispositivo receptor ao dispositivo emissor para pedir que ele pare momentaneamente de enviar, porque o buffer de recepo est ficando sem espao para armazenamento dos caracteres. Quando o buffer estiver quase vazio, o receptor envia um caracter XON ao transmissor avisando-o que est pronto para receber mais caracteres. A vantagem de se utilizar o controle de fluxo XON / XOFF que so necessrios somente 3 fios para conectar o DTE ao DCE. H duas desvantagens: uma delas que um arquivo a ser transmitido no poder conter os cdigos ASCII 17 e 19, pois a transmisso ser interrompida inesperadamente. A segunda a reduo na velocidade de transmisso, pois os cdigos de controle XON e XOFF circulam pelas linhas de dados TXD e RXD.
Figura 3 - Cabo para handshaking por software XON/XOFF

Controle de Fluxo por Hardware RTS/CTS ou DTR/DSR Para implementar o controle de fluxo por hardware preciso adicionar mais linhas entre o DTE e o DCE. Numa comunicao onde os dois lados tanto podem transmitir como receber, utiliza-se um par de linhas RTS/CTS tanto no

DTE como no DCE. Quanto o DTE quer transmitir, ele ativa a linha RTS. Se o DCE puder receber os dados ele avisa ao DTE ativando a linha CTS. As vantagens de se implementar controle de fluxo via hardware a tima performance na velocidade de comunicao, porque agora as linhas de dados TXD e RXD no precisam dividir a Banda para enviar caracteres especiais de controle de fluxo, como o XON e o XOFF. A outra vantagem que um arquivo a ser enviado pode conter quaisquer caracteres especiais, sem o inconveniente de a conexo ser interrompida como no caso dos caracteres XON e XOFF de controle por software. A desvantagem o custo do cabo por conter mais fios.
Figura 4 - Cabo para handshaking por hardware RTS/CTS

Algumas vezes o controle de fluxo via hardware pode ser implementado atravs dos sinais DTR/DSR da mesma forma como foi explicado usando os sinais RTS/CTS. Veja na figura abaixo, a conexo das linhas para se confeccionar um cabo serial com suporte a controle de fluxo via hardware, usando os sinais DTR/DSR.
Figura 5 - Cabo para handshaking por hardware DTR/DSR

Cabo Null Modem Se desejarmos fazer uma transmisso de dados PC-PC (DTE-DTE) sem a utilizao de Modems confecciona-se um cabo serial chamado Null Modem. Este cabo s tem as linhas SG, TXD e RXD conectadas aos conectores do cabo serial. Os outros sinais so interligados de forma a entrarem em crculo ou loop (loopback). Assim os dois pontos (DTE-DTE) sempre estaro prontos para enviar e receber dados.

Veja nas figuras abaixo, 3 maneiras de confeccion-los, usando conectores DB25 e DB9:
Figura 6 - Cabo Null Modem DB9-DB9

Figura 7 - Cabo Null Modem DB25-DB25

Figura 8 - Cabo Null Modem DB25-DB9

Confeco de cabos para controle de fluxo por Hardware

Os trs cabos abaixo so usados para conectar dois dispositivos atravs de controle de fluxo (handshaking) por Hardware. Veja que a diferena entre as trs figuras so os tipos de conectores:
Figura 9 - Cabo Handshaking por Hardware - DB25-DB9

Figura 10 - Cabo Handshaking por Hardware - DB25-DB25

Figura 11 - Cabo Handshaking por Hardware - DB9-DB9

Obs.: Alm de confeccionarmos um cabo serial, preciso, alm de se desenvolver um software serial, elaborar um protocolo. Alguns softwares de comunicao serial usam protocolos padronizados como o simples XON/XOFF ou outros mais sofisticados. Alguns protocolos usados so: ZMODEM, XMODEM, YMODEM, XMODEM-CRC, YMODEM-G, etc. Em nossos projetos iremos implementar nossos prprios protocolos.

Interligao LoopBack As vezes precisamos testar um novo programa de comunicao serial que criemos, sem que para isso seja preciso conectar dois pontos (DTE-DTE). Ou as vezes no dispomos de dois computadores ou duas portas seriais no mesmo micro. Se um desses for seu problema, confeccione um dos conectores LoopBack mostrados nas figuras abaixo, soldando os pinos conforme indicado:
Figura 12 - Conector LoopBack DB9

Figura 13 - Conector LoopBack DB25

UART (Universal Asynchronous Receiver Transmitter)


Transmissor e Receptor Assncrono Universal

Um chip UART um tipo de chip programvel, que tem a funo de gerenciar a comunicao serial assncrona num computador, ou quaisquer outros dispositivos similares. Um chip UART converte dados paralelos em seriais e transmite automaticamente os mesmos pelo pino TXD da Porta Serial, seguindo as especificaes do protocolo RS232 (start bit, bits de dado, bit de paridade e stop bit). Tambm recebe os dados de forma serial pelo pino RXD e converte em paralelo (1 byte), mantendo o mesmo num registrador interno especfico, para posterior leitura pela aplicao do cliente. O UART tambm gerencia todos os sinais de controle e estado como: DTS, DSR, RTS, CTS, DCD e RI. Em 1991 a IBM introduziu no projeto do PC um chip UART 8250 da National. Esse chip UART tinha a capacidade de receber e armazenar somente um byte, e no era to eficiente em questo de velocidade (aproximadamente 9600 baud). Para que o caracter recebido pelo UART no fosse sobreposto por um novo caracter, o software aplicativo tinha que ler esse dado rapidamente. Mais tarde surgiu o UART 16450, totalmente compatvel com o UART 8250, mas com a vantagem de ser mais rpido (aproximadamente 38400 baud). Depois lanaram o 16550 com mais espao para armazenar os caracteres recebidos. Buffer FIFO (First Input First Output - O primeiro que entra o primeiro que sai). Mas logo saiu de linha, pois esse buffer no funcionava corretamente. Para corrigir esse problema, foi lanado o UART 16550 com finais A, AF ou AFN. Nesses modelos, o buffer FIFO tem um tamanho de 16 bytes, tanto para a transmisso como para a recepo dos dados. Todos so compatveis com o UART 8250. Para usar um chip UART adequadamente para transmitir e receber dados, primeiro teremos que program-lo com parmetros passados a alguns de seus registradores. Esses parmetros so valores como: velocidade de transmisso, tamanho dos dados (5, 6, 7 ou 8), paridade (nenhuma, mpar, par, marca ou espao) e stop bit (quantos bits de parada: 1, 1.5 ou 2). possvel programar outros parmetros como: habilitar o UART a gerar interrupes quando um erro de: Overrun (sobreposio), Paridade ou Break ocorrer. Ou quando ocorrer mudanas em qualquer uma das entradas: CTS, DCD, DSR ou RI. A empresa StarTech fabrica o UART 16650, com buffer FIFOs de 32 bytes e velocidade mxima de transmisso de 460.800 baud. J Texas Instruments fabrica o UART 16750, com FIFOs de 64 bytes e velocidade de at 921.600 baud. Esse ltimo no compatvel pino a pino com o UART 16550 da National.

Figura 1 - Pinagem de um chip UART 16550

A figura acima mostra um modelo de chip UART 16550, compatvel com os chips 8250 (diferente somente nos pinos 24 e 29), onde o pino 29 no conectado e o 24 chamado de Select Out (CSOUT). Os pinos D0-D7(Buffer de Bus de dados) so as entradas/sadas paralelas usadas pela CPU para enviar/receber para o UART um byte de dado. Os pinos A0, A1 e A2 so usados para endereamento. O pino 10 (RD) recebe os bits serialmente e o pino 11(TD) transmite-os. Os demais so conectados CPU e ao circuito driver da interface RS232.
Figura 2 - Diagrama do UART 16550

Na figura acima temos uma viso geral da estrutura interna do chip UART 16550. No lado esquerdo da figura observamos os pinos que sero conectados

ao Host (CPU), e ao lado direito, os pinos que sero conectados ao circuito driver da interface RS232.
Tabela 1 - Os principais registradores do UART 16550 Porta Porta Nome do Significado COM1 COM2 Registrador Transmit Holding Register (Buffer de 3F8h 2F8h THR transmisso). 3F8h 2F8h RDR Receiver Data Register (Buffer de recepo). Divisor Latch LOW (Byte LSB da taxa de 3F8h 2F8h DLL transmisso). Divisor Latch HIGH (Byte MSB da taxa de 3F9h 2F9h DLH transmisso). Interrupt Enable Register (Habilita 3F9h 2F9h IER interrupes). Interrupt Identification Register (Identifica a 3FAh 2FAh IIR ltima int. ocorrida). Line Control Register (Configura a 3FBh 2FBh LCR comunicao serial). MODEM Control Register (Controla os sinais do 3FCh 2FCh MCR MODEM). 3FDh 2FDh LSR Line Status Register (Estado da linha serial). MODEM Status Register (Estado dos sinais do 3FEh 2FEh MSR MODEM).

Na tabela acima, temos nas duas primeiras colunas, os endereos das Portas: COM1 e COM2. Esses endereos so fixos nos microcomputadores padro IBM-PC e similares. Observe tambm que um endereo est associado a um ou mais Registradores do UART. Veja o endereo 3F8h, ele est associado aos Registradores THR, RDR e DLL. Todos os Registradores do UART so de 8 bits, portanto, os parmetros passados tem um tamanho de 1 byte. A taxa de transmisso em Baud tem um tamanho de 16 bits, sendo assim, para enviar esse valor para o UART o mesmo deve ser dividido em duas partes de 8 bits, e passados como parmetros em dois registradores distintos (DLL e DLH). Segue abaixo os detalhes de cada registrador: Registrador THR (Buffer de transmisso) Quando uma aplicao deseja transmitir um caracter pela porta serial, ela coloca um byte no registrador THR, ao detectar esse byte, automaticamente o UART formata-o inserindo paridade (opcional) e Stop bit (criando um Frame). Aps isso, o Frame movido para o registrador de deslocamento e depois transferido serialmente pelo pino TXD da interface RS232. Atravs do registrador de Status da linha LSR, possvel saber se o buffer de transmisso THR est vazio, ou seja, se est pronto para aceitar um novo byte. Registrador RDR (Buffer de recepo)

Quando o UART recebe um byte serialmente pelo pino RXD da interface RS232, ele move o mesmo do registrador de deslocamento para o buffer de recepo RDR. Para saber se h um dado no buffer de recepo RDR, nossa aplicao verifica se o bit 0 do registrador LSR est ligado ("1"). Se um segundo byte for recebido sem que o primeiro tenha sido lido, ocorrer um erro de overrun. Registradores DLH e DLL da taxa de transmisso Para configurar o Gerador de Baud Rate, ou seja, a velocidade de transmisso do UART, preciso passar como parmetro um valor chamado Divisor. O Divisor o resultado da seguinte operao: 1.843.200 / (bps * 16), onde: 1.843.200 a freqncia do cristal conectado ao UART; bps (a velocidade que desejamos que a UART trabalhe, como:...2400, 9600, 19200, etc). O nmero 16 um multiplicador. Como o Divisor resulta em um nmero de 16 bits e cada registrador do UART de 8 bits, ento, temos que passar esse nmero em dois registradores: o DLH (Divisor Latch High - Byte mais significativo) e o DLL (Divisor Latch Low - Byte menos significativo). Veja na tabela abaixo, alguns valores que podem ser passados como parmetros aos registradores DLH e DLL, para configurar a velocidade de transmisso do UART:
Tabela 2 - Calculando os valores para atribuir aos registradores DLH e DLL Velocidade DLH DLL Divisor em decimal (bps) MSB LSB 50 2304 = (1.843.200 / (50*16) 09h 00h 300 384 = (1.843.200 / (300*16) 01h 80h 600 192 = (1.843.200 / (600*16) C0h 00h 1200 96 = (1.843.200 / (1200*16) 00h 60h 2400 48 = (1.843.200 / (2400*16) 00h 30h 4800 24 = (1.843.200 / (4800*16) 00h 18h 9600 12 = (1.843.200 / (9600*16) 0Ch 00h 19200 6 = (1.843.200 / (19200*16) 00h 06h 38400 3 = (1.843.200 / (38400*16) 00h 03h 57600 2 = (1.843.200 / (57600*16) 00h 02h 115200 1 = (1.843.200 / (115200*16) 00h 01h

Como exemplo, usaremos a velocidade de 50 bps para configurar o UART. Veja que o valor do Divisor em decimal 2304, e em hexadecimal 0900h. Para pass-lo como parmetro ao UART, primeiro habilita-se o bit 7 do registrador LCR, e depois envia-se o primeiro byte (00h) no registrador DLL (byte menos significativo), e o segundo byte (09h) no registrador DLH (byte mais significativo).

Registrador IER (Permite habilitar interrupes) Atravs do registrador IER possvel configurar o UART para gerar um sinal de interrupo quando alguns eventos ocorrerem. Assim, nossa aplicao

poder identificar atravs do registrador IIR qual foi o evento que gerou a interrupo. A interrupo pode ser definida ativando-se em "1", um dos bits (0 a 3) do registrador IER mostrado na tabela abaixo:

Registrador IER - (leitura e escrita)


Bits Funo 0 Habilita int. RDR (recebe) Valor Descrio 0 No habilita interrupo. 1 Uma interrupo gerada pela UART para informar quando um dado estiver disponvel no Registrador de recepo (RDR). 0 No habilita interrupo. 1 Uma interrupo gerada quando a UART estiver preparada para aceitar um novo dado no Registrador de transmisso (THR). 0 No habilita interrupo. 1 Uma interrupo gerada quando ocorrer um erro de Overrun, Paridade ou Break. 0 No habilita interrupo. 1 Uma interrupo gerada quando ouver qualquer mudanas em uma das entradas (CTS, DSR, DCD e RI) da porta serial. 0000 No usados.

Habilita int. THR (envia) Habilita Int. Status da linha Habilita Int. Status do Modem

4-7 indefinidos

Como exemplo, para habilitar a interrupo de estado do Modem e interrupo do RDR, o byte a ser enviado para o registrador IER este: 00001001b (9 em decimal).

Registrador IIR (Identifica a ltima interrupo ocorrida) O Registrador IIR especifica quais interrupes foram geradas ou esto pendentes. Se houve a ocorrncia de uma interrupo, o bit 0 desse registrador estar em "0". A especificao da interrupo pode ser obtida nos bits 1 e 2 do IIR. Se no ocorreu interrupo o bit 0 do IIR estar em "1".

Registrador IIR - (Somente leitura)


Bits Funo Interrupo 0 ON/OFF Identifica a interrupo Reservados no 8250 e 16450 Valor Descrio 0 O UART gerou um sinal de interrupo. 1 Sem interrupo. Linha de status do modem mudou (RI, DCD, 00 DSR, CTS). 01 Buffer de transmisso (THR) vazio . 10 Um byte foi recebido e est disponvel no RDR. 11 Ocorreu um erro ou um Break foi recebido. Usados para configurar FIFOs nos UARTs 16550 ou mais novos.

1,2

3-7

Como exemplo, se obtermos no registrador IIR um byte com o valor: 00000100b (4 em decimal), isso indica que o UART gerou uma interrupo, porque recebeu um byte, e este se encontra no buffer RDR.

Registrador LCR (Configura canal de comunicao serial) a partir desse registrador, que configuramos as caractersticas da comunicao do UART, como: bit de dados, paridade, stop bit, break e habilitar o DLAB (Divisor Latch Access Bit), ou seja, fazer com que os registradores DLL e DLH recebam os bytes baixo e alto da taxa de transmisso (valor do Divisor). Uma vez feita a configurao do UART e, uma conexo tenha sido estabelecida, no mais possvel fazer mudanas, a no ser que se faa uma desconexo. Depois possvel alterar as caractersticas e fazer uma nova conexo. Ou seja, enquanto uma aplicao estiver conectada em uma porta serial COMx, no possvel alterar as caractersticas da comunicao, pois ocorrer erros.

Registrador LCR - (leitura e escrita)


Bits Funo 0,1 Bits de dado Valor Descrio 00 5 bits de dado. 01 6 bits de dado. 10 7 bits de dado. 11 8 bits de dado. 0 1 stop bit. 1 2 stop bits (somente se Bits de dado for 6, 7 ou 8 bits). 1,5 stop bit (somente se Bits de dado for 5 bits). 000 Nenhuma. 001 mpar. 011 Par. 101 Marca. 111 Espao. 0 Desativado. 1 Aps a transmisso do caracter, a linha serial forada a ir a condio Espao (0 lgico). 0 Acesso normal dos registradores do UART para 1 leituras e escritas. Habilita o THR para receber o valor de configurao do Baud Rate (DLL e DLH).

Stop bit

3,4,5 Paridade

Set break Taxa de transmisso DLAB

Como exemplo, para configurar as caractersticas da comunicao com os parmetros: 8 bits de dado, paridade nenhuma, 1 stop bit e set break desabilitado, escreve-se no registrador LCR o byte: 00000011b (3 em decimal).

Registrador MCR (Controla os sinais do MODEM) atravs do registrador MCR que so controlados os sinais do Modem como: DTR e RTS. Tambm possvel fazer com que o UART execute um auto-teste (Loopback). Uma aplicao que usa controle de fluxo por hardware, acessa este registrador para enviar sinais de controle DTR e RTS, e assim controlar o fluxo de dados na transmisso.

Registrador MCR - (leitura e escrita)


Bits Funo 0 DTR Valor Descrio A linha DTR levada a 1, sinalizando ao 0 MODEM que o terminal no est pronto. A linha DTR levada a 0, sinalizando ao 1 MODEM que o terminal est pronto. 0 A linha RTS levada a 1, sinalizando ao MODEM que o computador no est pronto. 1 A linha RTS levada a 0, sinalizando ao MODEM que o computador est pronto. 0 0 1 0 1 000 Sempre zero. Controle de Interrupo do UART desativado. Controle de Interrupo do UART ativado. No executa testes no UART. Executa testes no UART. Sempre zeros.

1 2 3 4

RTS Output 1 Output 2

Loopback modo teste 5,6,7 Reservados

Como exemplo, para ativar a linha DTR ponha o bit 0 em "0". Para desativ-la ponha o bit 0 em "1". Para ativar a linha CTS ponha o bit 1 em "0". Para desativ-la ponha o bit 1 em "1". Registrador LSR (Estado da linha serial) O registrador LSR usado para obter informao sobre o estado da transmisso e recepo dos dados. Checando alguns bits deste registrador, possvel saber se h um caracter no buffer de recepo RDR, ou no buffer de transmisso THR. Tambm possvel saber, se um caracter foi recebido com algum tipo de erro como: overrun, frame, paridade, ou mesmo se um sinal de break foi recebido.

Registrador LSR - (leitura e escrita)


Bits Funo Valor Descrio 0 Nenhum dado foi recebido. Buffer de recepo 1 (RDR) vazio. Data ready Indica que o UART recebeu um dado. Esse bit (Dados Prontos) permanecer ligado enquanto o dado estiver no Buffer de recepo (RDR). 0 Nenhum erro de Overrun foi detectado. Overrun error 1 Um dado foi sobreposto sobre o anterior no (Erro de Buffer de recepo (RDR). Ou seja, os dados sobreposio) esto sendo recebidos mais rpido que a CPU ou a aplicao possa process-los. 0 Parity error Nenhum erro de paridade. (Erro de paridade) 1 O dado recebido veio com erro de paridade. 0 Nenhum erro de Stop bit. Framming error 1 O dado recebido no tem o nmero de Stop bit (Erro de quadro) especificado. 0 Nenhuma interrupo por break. Break interrupt 1 Um break foi recebido (condio space da linha). (Interrupo por Ou seja, foram recebidos mais bits zeros que o break) tamanho dos bits de dados especificado. THR empty 0 H dado no buffer de transmisso (THR). (Buffer de trans. 1 Buffer de trans. vazio. Um novo dado pode ser

2 3

vazio) TSR empty 0 1 (Reg. de transferncia vazio) FIFO data error 0 somente (16650 a 16750)

enviado para o THR. H dado no registro de deslocamento de transferncia (TSR). Registro de deslocamento de transferncia (TSR) vazio. Este bit sempre est em zero para UARTs 8250 e 16450.

Registrador MSR (Estado dos sinais do MODEM) O registrador MSR usado para obter informaes sobre o estado das linhas do Modem, ou seja, as linhas de handshaking (CTS, DSR, RI e DCD). Estas linhas so todas entradas, e podem ser lidas no DTE ou no DCE como nveis lgicos um ("1") ou zero ("0"). J os bits de 0 a 3 registram se houve mudanas de estado nas linhas: CTS, DSR, RI e DCD, desde o ltimo acesso ao registrador MSR.

Registrador MSR - (leitura e escrita)


Bits Funo Delta Clear to 0 Send (DCTS) Delta Data Set 1 Ready (DDSR) Trailing Edge 2 Ring Indicator (TERI) Delta Data 3 Carrier Detect (DDCD) 4 CTS Valor Descrio 0 Nenhuma mudana no CTS. 1 Houve mudana no CTS desde a ltima leitura no MSR. 0 Nenhuma mudana no DSR. 1 Houve mudana no DSR desde a ltima leitura no MSR. 0 Nenhuma mudana no RI. 1 Houve mudana no RI desde a ltima leitura no MSR. 0 Nenhuma mudana no CTS. 1 Houve mudana no CTS desde a ltima leitura no MSR. 0 O Modem no est pronto para receber dados 1 do computador. O Modem est pronto para receber dados do computador 0 O Modem no est preparado. 1 O Modem est preparado. 0 Nenhum sinal de ring detectado. 1 Sinal de ring detectado. 0 Nenhum sinal de portadora detectado. 1 Sinal de portadora detectado.

5 6 7

DSR RI DCD

Passos iniciais para configurar o UART, preparando-o para enviar e receber dados 1 - Escolher a porta a ser utilizada: COM1=3F8h, COM2=2F8h... 2 - Escolher a velocidade de transmisso (bps): 9600, 4800, 19200... 3 - Calcular o valor do Divisor: 1.843.200/(bps*16); 4 - Ativar em "1" o bit 7 (DLAB) do registrador LCR; 5 - Escrever no registrador DLL o byte menos significativo (LSB) do Divisor;

6 - Escrever no registrador DLH o byte mais significativo (MSB) do Divisor; 7 - Configurar os bits de 1 a 6 do registrador LCR, para definir as caractersticas da comunicao. Pronto, aps o UART ser configurado, possvel usar os demais registradores para enviar e receber dados, obter o estado da linha e do Modem, entre outros.

Comentrio No desenvolvimento de programas de comunicao serial RS232 para o sistema operacional Windows, no precisamos manipular bit-a-bit os registradores do UART para criar um aplicativo, programaremos em nvel de API do Windows, onde h um conjunto de funes que podem ser usadas com facilidade, para passar parmetros de configurao ao UART, enviar e receber dados, ativar e desativar os sinais de controle DTR e RTS, l o estado dos sinais da linha e do Modem (CTS, DSR, RI e DCD), entre outras. Em compiladores como: C++Builder, Delphi, VisualBasic, entre outros, podem ser instalados componentes de terceiros para facilitar ainda mais o desenvolvimento de programas para acessar a porta serial. Na prxima aula iremos aprender a usar a API do Windows para controlar a porta serial.

Funes da API do windows para acessar a Porta Serial


Para acessar a Porta Serial iremos utilizar algumas funes da API (Application Programming Interface) - Interface de programao de aplicativos do Windows, que tornam nossos programas compatveis com as verses 95/98/Me/NT/2000 e XP. Nesta aula, exemplos do uso das funes e programas esto escritos tanto em Delphi com C++Builder. Como as funes da API so padronizadas, os exemplos escritos em C++ so muito semelhantes aos do Delphi. Veja algumas das funes da API do Windows, usadas nos programas e exemplos aqui apresentados, com o objetivo de acessar a Porta Serial. Essas funes eliminam o trabalho rduo de se programar em nveis de bits, os registradores do UART, tornando a programao muito mais fcil e produtiva. So estas as funes que iremos explorar nesta aula:

CreateFile() CloseHandle() GetCommState() SetCommState() BuildCommDCB() ReadFile() WriteFile() GetCommTimeouts() SetCommTimeouts() EscapeCommFunction() SetCommBreak() ClearCommBreak() TransmitCommChar() GetCommModemStatus()

CreateFile() Utilizada para abrir a Porta Serial ou quaisquer outras. Veja abaixo, exemplos em Delphi e C++Builder de como usar esta funo.
Exemplo 1 C++ - Uso da funo CreateFile() da API do windows HANDLE hCom; // Handle para a Porta Serial (identificador). char *NomePorta = "COM1"; //COM1, COM2...COM9 ou portas virtuais "\\.\COMx". hCom = CreateFile( NomePorta, //Nome da porta. GENERIC_READ | GENERIC_WRITE, //Para leitura e escrita. 0, //(Zero) Nenhuma outra abertura ser permitida. NULL, //Atributos de segurana. (NULL) padro. OPEN_EXISTING, //Criao ou abertura. 0, //Entrada e sada sem overlapped. NULL //Atributos e Flags. Deve ser NULL para COM. ); if(hCom == INVALID_HANDLE_VALUE) return false; //Erro ao tentar abrir a porta especificada. else return true; Exemplo 1 DELPHI - Uso da funo CreateFile() da API do windows

Var hCom : THANDLE; // Handle para a Porta Serial (identificador). NomePorta : String; // Nome da porta COM1, COM2.... Begin NomePorta := 'COM1'; //COM1, COM2...COM9 ou portas virtuais. hCom := CreateFile( PChar(NomePorta), //Nome da porta (tipo caracteres). GENERIC_READ or GENERIC_WRITE, //Para leitura e escrita. 0, //(Zero) Nenhuma outra abertura ser permitida. nil, //Atributos de segurana. (nil) padro. OPEN_EXISTING, //Criao ou abertura. 0, //(Zero) Entrada e sada sem overlapped. 0 //Atributos e Flags. Deve ser 0 para COM. ); if hCom = INVALID_HANDLE_VALUE then result := false //Erro ao tentar abrir a porta especificada. else result := true; End;

A funo CreateFile() da API do windows responsvel pela abertura da Porta Serial. Ela aceita vrios parmetros, sendo o primeiro, o nome da porta "COM1", "COM2", etc. O segundo especifica o tipo de acesso: leitura (GENERIC_READ), escrita (GENERIC_WRITE) ou leitura e escrita (GENERIC_READ | GENERIC_WRITE); o caracter "|" do C++ idntico ao operador (OR) do Delphi e sua funo no Exemplo 1 combinar as duas constantes formando um novo valor. O terceiro parmetro especifica o compartilhamento, se for definido como 0 (zero), a Porta no ser compartilhada, ou seja, enquanto seu programa estiver usando a Porta Serial nenhum outro poder abri-la. Os outros parmetros sero usados como padro. hCom uma varivel do tipo HANDLE (identificador) que armazenar todas as informaes necessrias sobre o dispositivo aberto, no nosso caso, a Porta Serial. Esta varivel ser utilizada como parmetro para as funes que iro configurar, alterar, l e escrever na Porta Serial. Para facilitar a programao, a varivel hCom poder ser declarada com Global. Se houver algum tipo de erro na abertura da Porta Serial, a funo CreateFile() retornar um valor do tipo INVALID_HANDLE_VALUE para a varivel hCom. Portanto, imprescindvel que o programa teste a varivel hCom para checar se houve erro, antes de usar as demais funes de acesso a Porta Serial.

GetCommState() e SetCommState() Essas duas funes so utilizadas para obter e alterar as configuraes da Porta Serial como: velocidade em que os dados so transmitidos, bit de dados, paridade, bit de parada, etc.

Exemplo 2 C++ - Uso das funes GetCommState() e SetCommState() DCB dcb; //Estrutura DCB utilizada para definir todos os parmetros da comunicao. if( !GetCommState(hCom, &dcb) ) // Obtm a configurao atual da Porta Serial. return false; // Erro na leitura de DCB. //Define novos parmetros dcb.BaudRate = CBR_19200; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; //Define nova configurao. if( SetCommState(hCom, &dcb) == 0 ) return false; //Erro ao tentar gravar configurao. else return true; Exemplo 2 DELPHI - Uso das funes GetCommState() e SetCommState() //Estrutura DCB utilizada para definir todos os parmetros da comunicao. Var dcb: TDCB; Begin if not GetCommState(hCom, dcb) then //Obtm a configurao atual da Porta Serial. result: false; //Erro na leitura de DCB. //Define novos parmetros dcb.BaudRate := CBR_19200; dcb.ByteSize := 8; dcb.Parity := NOPARITY; dcb.StopBits := ONESTOPBIT; //Define nova configurao. if not SetCommState(hCom, dcb) then result:= false //Erro ao tentar gravar configurao. else result:= true; End;

As funes GetCommState() e SetCommState() trabalham juntas e tem como objetivos, obter as configuraes atuais da Porta Serial encontradas na estrutura DCB (Device Control Block), como tambm alterar seus atributos. Para obter os parmetros atuais armazenados no UART, utiliza-se a funo GetCommState(), que pega e grava esses parmetros na estrutura/registro dcb. A partir da leitura desta estrutura possvel saber o valor de cada parmetro do UART como: bps, bits de dados, paridade, stop bit, etc. Para mudar as configuraes atuais da Porta Serial, utiliza-se a funo SetCommState() conforme o Exemplo 2. A funo BuildCommDCB() tambm pode ser usada com a mesma finalidade. A tabela abaixo mostra as constantes definidas pela API do windows, para configurar as caractersticas de comunicao no UART.

Tabela 1 - Constantes e valores da API do Windows utilizadas para configurar a Porta Serial

BaudRate
Velocidade CBR_110 CBR_300 CBR_600

ByteSize Parity

Tamanho Paridade dos dados CBR_38400 5 CBR_56000 6 CBR_57600 7 EVENPARITY (par) MARKPARITY (marca) NOPARITY (nenhuma) ODDPARITY (mpar)

StopBits
Bits de parada ONESTOPBIT (1) ONE5STOPBITS (1.5) TWOSTOPBITS (2)

CBR_1200 CBR_115200 8 CBR_2400 CBR_128000 CBR_4800 CBR_256000 CBR_9600 CBR_14400 CBR_19200

BuildCommDCB() Utilizada para preencher os campos da estrutura DCB com valores especificados numa string de caracteres. O formato desta string deve ter esta seqncia: bps, paridade, bits de dados e stop bits, como neste exemplo: "19200,N,8,1". A letra 'N' significa dizer, sem paridade (No parity). Para configurar outros parmetros do UART, use a funo SetCommState() em vez da BuildCommDCB().
Exemplo 3 C++ - Uso da funo BuildCommDCB() DCB dcb; //Estrutura DCB utilizada para definir todos os parmetros da comunicao. if( !GetCommState(hCom, &dcb)) //Obtm a configurao atual. return false; //// Erro na leitura de dcb. BuildCommDCB("19200,N,8,1", &dcb); //Atribui os parmetros estrutura dcb. //Define nova configurao. if( SetCommState(hCom, &dcb) == 0 ) return false; //Erro ao tentar gravar configurao. else return true; Exemplo 3 DELPHI - Uso da funo BuildCommDCB()

//Estrutura DCB utilizada para definir todos os parmetros da comunicao. Var dcb: TDCB; Begin if not GetCommState(hCom, dcb) then //Obtm a configurao atual da Porta Serial. result: false; //Erro na leitura de DCB. BuildCommDCB('19200,N,8,1', dcb); //Atribui novos valores estrutura DCB. //Define nova configurao. if not SetCommState(hCom, dcb) then result:= false //Erro ao tentar gravar configurao. else result:= true; End;

No exemplo acima, a funo BuildCommDCB() atribui a string "19200,N,8,1", para determinados campos da estrutura/registro DCB.

GetCommTimeouts() e SetCommTimeouts() Utilizadas para obter e alterar os parmetros atuais dos Timeouts associados s funes WriteFile() e ReadFile().
Exemplo 4 C++ - Uso da funo GetCommTimeouts() e SetCommTimeouts() COMMTIMEOUTS CommTimeouts; if( GetCommTimeouts(hCom, &CommTimeouts) == 0 ) //Obtm os Timeouts atuais. return false; //se houve erro. //Atribui novos valores. CommTimeouts.ReadIntervalTimeout = 2; CommTimeouts.ReadTotalTimeoutMultiplier = 0; CommTimeouts.ReadTotalTimeoutConstant = 2; CommTimeouts.WriteTotalTimeoutMultiplier = 5; CommTimeouts.WriteTotalTimeoutConstant = 5; if( SetCommTimeouts(hCom, &CommTimeouts) == 0 ) return false; //se houve erro.

Exemplo 4 DELPHI - Uso da funo GetCommTimeouts() e SetCommTimeouts()

Var CommTimeouts: TCOMMTIMEOUTS; Begin if not GetCommTimeouts(hCom, CommTimeouts) then //Obtm os Timeouts atuais. result:= false; //se houve erro. //Atribui novos valores. CommTimeouts.ReadIntervalTimeout := 2; CommTimeouts.ReadTotalTimeoutMultiplier := 0; CommTimeouts.ReadTotalTimeoutConstant := 2; CommTimeouts.WriteTotalTimeoutMultiplier := 5; CommTimeouts.WriteTotalTimeoutConstant := 5; if not SetCommTimeouts(hCom, CommTimeouts) then //Configura Timeouts. result:= false //se houve erro. else result:= true; End;

As funes GetCommTimeouts() e SetCommTimeouts() trabalham juntas, e tem como objetivos, obter e modificar as configuraes atuais dos timeouts da Porta Serial. Quaisquer mudanas nos valores dos atributos da estrutura COMMTIMEOUTS, afetaro consideravelmente os tempos de leitura e escrita na Porta Serial. Os valores de tempos definidos no Exemplo 4, foram os mais adequados para enviar e receber dados atravs das funloes WriteFile() e ReadFile().

ReadFile() Utilizada para l dados atravs da Porta Serial. Para seu funcionamento, preciso que a funo CreateFile() tenha retornado um identificador vlido associado com a Porta Serial especificada.
Exemplo 5 C++ - Uso da funo ReadFile() #define LEN_BUFFER 100; //Define o tamanho do buffer de recepo de dados.. DWORD BytesLidos = 0; //Para retornar a quantidade de bytes realmente lidos. char BufferRecebe[LEN_BUFFER]; //Para armazenar a string a ser lida. //L uma String da Porta Serial. ReadFile( hCom, BufferRecebe, LEN_BUFFER, &BytesLidos, NULL ); Exemplo 5 DELPHI - Uso da funo ReadFile() Const LEN_BUFFER = 100; //Tamanho do Buffer de recepo de dados. Var BytesLidos: DWORD; //Para retornar a quantidade de bytes realmente lidos. BufferRecebe: array [0..LEN_BUFFER] of char; //Para armazenar a string a ser lida.

Begin //L uma String da Porta Serial. ReadFile( hCom, BufferRecebe, LEN_BUFFER, BytesLidos, nil); End;

atravs da funo ReadFile() que feita a leitura dos dados que chegam na Porta Serial. Esta funo aceita 5 parmetros, sendo o primeiro (hCom), o identificador da Porta Serial retornado na abertura da mesma atravs da funo CreateFile(). O segundo um buffer (BufferRecebe), ou seja, um local temporrio na memria onde os dados lidos da Porta Serial sero armazenados. O terceiro (LEN_BUFFER), informa funo ReadFile() qual o tamanho do buffer de dados (BufferRecebe). O quarto (BytesLidos), uma varivel do tipo ponteiro longo, onde a funo ReadFile() armazenar a quantidade exata de bytes lidos. O quinto e ltimo um ponteiro para uma estrutura "overlapped", no nosso caso no ser utilizada, portanto, definimos este parmetro com (nulo). A cada chamada funo ReadFile(), os dados lidos da Porta Serial so armazenados na varivel BufferRecebe, e a quantidade total de bytes so armazenados na varivel BytesLidos. Se ReadFile() retornar um valor igual a 0 (zero), isso indica um erro. Se aps uma chamada funo ReadFile() a varivel BytesLidos for maior que zero (BytesLidos > 0), isso quer dizer que a Porta Serial recebeu dados.

WriteFile() Esta funo utilizada para enviar dados atravs da Porta Serial. Para seu funcionamento preciso que a funo CreateFile() tenha retornado um identificador (handle) vlido, associado Porta Serial especificada.
Exemplo 6 C++ - Uso da funo WriteFile() #define LEN_BUFFER 100; //Define o tamanho do buffer. DWORD BytesEscritos=0; //Para retornar a quantidade de bytes realmente escritos. int TamaString; //Para calcular o tamanho da String. char BufferEnvia[LEN_BUFFER]; //Para armazenar a string a ser enviada. strcpy(BufferEnvia, "Curso USB/Serial"); //A tribui uma string varivel. TamaString = strlen(BufferEnvia); //Calcula o tamanho da string a ser enviada. WriteFile( hCom, BufferEnvia, TamaString, &BytesEscritos, NULL ); Exemplo 6 DELPHI - Uso da funo WriteFile() Var BytesEscritos: DWORD; //Para retornar a quantidade de bytes realmente escritos. TamaString: integer; //Para calcular o tamanho da String. BufferEnvia: AnsiString; //Para armazenar a string a ser enviada. BufferEnvia := 'Curso USB/Serial'; //A tribui uma string

varivel. TamaString := Length(BufferEnvia); //Obtm o tamanho da string a ser enviada. WriteFile( hCom, PChar(BufferEnvia)^, TamaString, BytesEscritos, nil);

atravs da funo WriteFile() que nossos programas enviam dados pela Porta Serial. Esta funo aceita 5 parmetros, sendo o primeiro (hCom) o identificador da Porta Serial retornado na abertura da mesma atravs da funo CreateFile(). O segundo um buffer de dados (BufferEnvia), ou seja, um local na memria onde dever est armazenados os dados a serem enviados para a Porta Serial. O terceiro (TamaString) informa funo WriteFile(), qual o tamanho do buffer de dados (BufferEnvia). O quarto (BytesEscritos), uma varivel do tipo ponteiro longo, onde a funo WriteFile() retorna a quantidade exata de bytes escritos. O quinto e ltimo um ponteiro para uma estrutura "overlapped", no nosso caso no ser utilizada, portanto, definimos este parmetro com (nulo). A cada chamada funo WriteFile(), os dados armazenados no buffer (BufferEnvia) so enviados para a Porta Serial. Se ocorrer um erro aps a chamada da funo WriteFile(), retornado um 0 (zero). Obs.: As funes ReadFile() e WriteFile() devem ser chamadas a partir de Threads (linhas de execuo ou processos que rodam paralelo ao programa). Assim, obtm-se uma boa performance em programas que trabalham com a Porta Serial. Em breve, na seo de projetos iremos aprender a usar Threads.

CloseHandle() Esta funo utilizada para fechar a Porta Serial, aberta pela funo CreateFile().
Exemplo 7 C++ e DELPHI - Uso da funo CloseHandle() CloseHandle( hCom ); //Fecha a porta aberta anteriormente por CreateFile().

A funo CloseHandle() fecha a Porta Serial aberta pela funo CreateFile(), disponibilizando-a para que outros programas possam acess-la, abri-la.

EscapeCommFunction() EscapeCommFunction() deve ser usada se um programa deseja controlar o fluxo diretamente. Ou seja, controlar as linhas DTR e RTS. Atravs desta funo tambm possvel gerar e limpar um sinal de Break na linha TXD. Use como parmetro a constante SETBREAK para gerar um sinal de Break; CLRBREAK para limpar um sinal de Break; SETDTR para ativar a linha DTR; CLRDTR para desativar a linha DTR. SETCTS para avivar a linha CTS, e CLRCTS para desativ-la.
Exemplo 8 C++ e DELPHI - Uso da funo EscapeCommFunction()

EscapeCommFunction(hCom, SETBREAK); //Gera um sinal de Break na linha TXD. EscapeCommFunction(hCom, CLRBREAK); //Limpa o sinal de Break na linha TXD. //----------------------------------------------------------------------------------------------------------------------EscapeCommFunction(hCom, SETDTR); //Liga a linha DTR. EscapeCommFunction(hCom, CLRDTR); //Desliga a linha DTR. //----------------------------------------------------------------------------------------------------------------------EscapeCommFunction(hCom, SETCTS); //Liga a linha CTS. EscapeCommFunction(hCom, CLRCTS); //Desliga a linha CTS.

A utilizao da funo EscapeCommFunction() para gerar (SETBREAK) e limpar (CLRBREAK) um Break na linha TXD, pode ser substituda respectivamente pelas funes SetCommBreak() e ClearCommBreak().

SetCommBreak() e ClearCommBreak() Atravs dessas duas funes possvel gerar e limpar um sinal de Break na linha TXD. Um Break um sinal especial gerado fora do Frame, ou seja, como se um bit de start fosse mantido na linha por um intervalor maior que o tempo de um caracter. Esse sinal altera o estado Marca (tenso positiva) da linha para Espao (tenso negativa), mantendo-a assim enquanto no for enviado um sinal para retorn-la ao normal.
Exemplo 9 C++ e DELPHI - Uso das funes SetCommBreak() e ClearCommBreak() SetCommBreak(hCom); //Gera um sinal de Break na linha TXD. ClearCommBreak(hCom); //Limpa o sinal de Break na linha TXD.

Use SetCommBreak() para gerar um sinal de Break, e ClearCommBreak() para limp-lo.

TransmitCommChar() Esta funo e usada para transmitir um caracter atravs da linha TXD. Ela coloca o caracter a ser transmitido a frente de quaisquer caracteres existentes no buffer de transmisso. Se houver sucesso na transmisso, TransmitCommChar() retorna um valor diferente de zero, caso contrrio, retorna um valor igual a zero. Ela til tambm para enviar caracter de interrupo de transmisso (como um CTRL+C) diretamente para a porta serial.
Exemplo 10 C++ - Uso da funo TransmitCommChar() TransmitCommChar(hCom, 'A' ); //Transmite o caracter 'A' pela porta Serial. Exemplo 10 DELPHI - Uso da funo CloseHandle()

TransmitCommChar(hCom, char('A') ); //Transmite o caracter 'A' pela porta Serial.

GetCommModemStatus() A funo GetCommModemStatus() est associada ao registrador de estado do Modem (MSR). Atravs dela podemos monitorar os estados das linhas de entrada: DCD, DSR, CTS e RI. Aps uma chamada funo GetCommModemStatus(), o estado das linhas do Modem fica disponvel numa varivel. Para verificar se uma determinada linha est ligada, executa-se uma operao AND (E) em nvel de bits nesta varivel. Veja abaixo as constantes definidas na API do windows:
Tabela 2 - Constantes usadas para testar o estado das linhas do Modem Valor em Constante Descrio decimal Usado para testar se o CTS MS_CTS_ON 16 est ligado. Usado para testar se o DSR MS_DSR_ON 32 est ligado. Usado para testar se o RI est MS_RING_ON 64 ligado. Usado para testar se o DCD MS_RLSD_ON 128 est ligado. Exemplo 11 C++ - Uso da funo GetCommModemStatus() DWORD COMStatus; //Status do Modem (API). GetCommModemStatus(hCom, &COMStatus); //Obtm estado da linha. //--------------------------------------------------------------------------------------------if(COMStatus & MS_RLSD_ON) //Se DCD est ligado. //DCD Ligado. else //DCD desligado. //------------------------------------------------------------------------------------------if(COMStatus & MS_DSR_ON) //Se DSR est ligado. //DSR ligado. else //DSR desligado. //------------------------------------------------------------------------------------------if(COMStatus & MS_CTS_ON) //Se CTS est ligado. //CTS ligado. else //CTS desligado. //------------------------------------------------------------------------------------------if(COMStatus & MS_RING_ON) then //Se RI est ligado. //RI ligado. else //RI desligado. Exemplo 11 DELPHI - Uso da funo GetCommModemStatus() Var

COMStatus: DWORD; //Status do Modem (API). Begin GetCommModemStatus(hCom, COMStatus); //Obtm estado da linha. //--------------------------------------------------------------------------------------------if(COMStatus and MS_RLSD_ON) = MS_RLSD_ON then //Se DCD est ligado. //DCD Ligado. else //DCD desligado. //------------------------------------------------------------------------------------------if(COMStatus and MS_DSR_ON) = MS_DSR_ON then //Se DSR est ligado. //DSR ligado. else //DSR desligado. //------------------------------------------------------------------------------------------if(COMStatus and MS_CTS_ON) = MS_CTS_ON then //Se CTS est ligado. //CTS ligado. else //CTS desligado. //------------------------------------------------------------------------------------------if(COMStatus and MS_RING_ON) = MS_RING_ON then //Se RI est ligado. //RI ligado. else //RI desligado. end;

Interface para testar as linhas do Modem Para colocarmos em prtica a maioria das funes aqui apresentadas, foi desenvolvido um programa para controlar as linhas: DTR, RTS, TXD, DCD, DSR, CTS e um circuito auto-alimentado pela porta serial, que mostrar o estado das linhas atravs de LEDs. Tambm possvel enviar sinais para a porta serial atravs dos botes liga/desliga. O programa explora o uso das seguintes funes: CreateFile(), GetCommModemStatus(), EscapeCommFunction(), CloseHandle(), GetCommState(), SetCommState() e GetLastError().

Figura 1 - Circuito auto-alimentado para testar os sinais de status da RS232

No circuito acima o LED TXD vermelho aceso quando um SETBREAK enviado pelo programa. Assim, a tenso da linha TXD fica positiva "+" (estado Space). Quando o programa envia um CLRBREAK, o LED TXD verde acende, e a linha levada ao estado Mark "-" (tenso negativa). Os LEDs DTR e RTS so controlados respectivamente pelas linhas DTR e RTS. J para enviar sinais para as linhas DCD, DSR, CTS e RI preciso ativar a linha TXD (enviando um SETBREAK), para que a mesma fique positiva (+), e possa alimentar qualquer uma das entradas quando um dos botes for pressionado.
Figura 2 - Tela do programa para testar os sinais do Modem

Clique aqui para fazer download do programa EXE e dos fontes em DELPHI; Clique aqui para fazer download do programa EXE e dos fontes em C++BUILDER. O programa abaixo acessa os registros do windows para descobrir quais os nomes das portas seriais esto instaladas no sistema. Os nomes das portas esto armazenados na chave: HKEY_LOCAL_MACHINE > HARDWARE\\DEVICEMAP\\SERIALCOMM
Figura 3 - Tela do programa para l as portas instaladas no windows

Clique aqui para fazer download do programa EXE e dos fontes em DELPHI; Clique aqui para fazer download do programa EXE e dos fontes em C++BUILDER.

Convertendo sinais padro RS232 em TTL Interface foto-acoplada usando o CI 4N25 Para interfacear a porta RS232 de um PC com um dispositivo microcontrolado, preciso converter os sinais RS232 em TTL. possvel fazer isso atravs de transistores, resistores ou foto-acopladores, mas a velocidade de transmisso fica comprometida. A interface mostrada na Figura 1 isola totalmente o PC, do dispositivo, atravs de foto-acopladores. Uma interface foto-acoplada pode ser til quando for preciso isolar dispositivos que trabalhem em alta tenso ligado Rede eltrica; conectado linha telefnica ou quaisquer outros que possam danificar o PC.

Figura 4 - Interface RS232 foto-acoplada com o CI 4N25

No circuito acima, a parte ligada ao PC auto-alimentada pela RS232 (PCDB9F). J no outro lado do circuito (pinos 1 e 2; 5 e 4 dos 4N25 so alimentados com 5v da mesma fonte que ser alimentado o dispositivo. Interface usando o driver MAX232 O Max232 um pequeno circuito integrado capaz de converter os nveis de tenso positiva e negativa de uma porta RS232, em sinais TTL (0v e 5v). Ele necessita de quatro capacitores eletrolticos num arranjo externo para gerar as tenses positivas e negativas, necessrias para o seu funcionamento. Numa interface do tipo Null-modem, utiliza-se somente os pinos 13-->12 e 14<--11 do Max232. Se a pretenso for criar uma interface que use controle de fluxo por hardware, alm dos pinos de dados, utiliza-se tambm os pinos: 8-->9 e 7<---10 do Max232.
Figura 5 - Pinagem e configurao do circuito integrado MAX232

Figura 6 - Interface para converter nveis de sinais RS232 em TTL

A interface da figura acima pode ser usada para conectar um PC a um circuito microcontrolado, alimentado com 5v. Para o Max232A os valores dos capacitores so todos de 0.1uF / 50v. Para qualquer outra verso do Max232, use capacitores com valores de 1uF /

Trabalhando com o microcontrolador PIC 16F877


A partir desta aula irei dar informaes importantes sobre as ferramentas necessrias para se programar um microcontrolador PIC 16F877. O objetivo aqui no ensinar sobre os detalhes dos microcontroladores, pois seria necessrio escrever um outro mdulo para falar sobre o assunto. O que irei ensinar so noes bsicas sobre as ferramentas necessrias para se programar e gravar um microcontrolador PIC, usando a linguagem C. A linguagem nativa de programao de microcontroladores o Assembler, pois seus comandos de programao esto associados diretamente a endereos de memria e registradores do microcontrolador. Por esse motivo, um programa escrito em Assembler ser compacto e, assim, ser executado mais rapidamente. H algumas desvantagens em se programar todo um cdigo em Assembler, como a demora na programao (pois, temos que programar endereo por endereo de memria), dificuldade em se dar manuteno no cdigo futuramente, pois a programao baseada em saltos GOTOs, as rotinas ficam todas "amarradas"; no um cdigo portvel (por exemplo, se for preciso migrar para um outro modelo de microcontrolador, preciso criar um novo programa a partir do zero, pois a maioria das rotinas esto associadas a endereos fsicos de memria,do modelo do microcontrolador anterior. Antigamente os microcontrolaores tinham pouco espao de memria para armazenar programas e, portanto, era necessrio economiz-la ao mximo, para que se pudesse armazenar o cdigo do programa. Nessa condio o compilador Assembler era de suma importncia para gerar um cdigo pequeno. Mas, com a evoluo da microeletrnica, hoje em dia, os microcontroladores dispem de uma quantidade muito maior de memria de programa. Agora, com os microcontroladores podendo armazenar mais cdigos de programa, muito mais produtivo e seguro, programar usando uma linguagem de alto nvel como

o C, que portvel, rpida, compacta e eficiente, sem falar na facilidade em se dar manuteno no cdigo futuramente. O Assembler nunca deve ser desprezado, pois, quando necessitarmos de uma rotina que precise de toda a velocidade que o hardware dispe para melhorar a eficincia de uma rotina, poderemos criar esta em Assembler e cham-la a partir da linguagem C. Para o desenvolvimento de nossos projetos iremos usar o PIC 16F877, pois este tem 33 I/O (entradas/sadas), e vrios perifricos como: USART, EEPROM, Timers, PWM, A/Ds, PSP, comunicao sncrona e assncrona. Assim, poderemos controlar rels, LEDs, sensores A/C, comunicao serial, I2C, Paralela, etc., usando um nico modelo de microcontrolador para desenvolvermos todos os projetos propostos neste curso. Quem desejar poder criar os projetos usando outros microcontroladores e compiladores disponveis no mercado. Neste tpico do curso iremos usar as seguintes ferramentas para programar o microcontrolador PIC 16F877: O ambiente MPLAB IDE da Microchip verso 7.21 ou superior; O compilador PCW C Compiler IDE da CCS verso Trial 30 dias; Uma gravador serial que d suporte ao PIC 16F877 e grave a partir do MPLAB (PICStart Plus).

Obs.: Os programas dessa aula foram gravados no PIC 16F877, usando o gravador McFlash da Mosaico (www.mosaico-eng.com.br). Antes de comearmos a programar, vamos conhecer algumas caractersticas do microcontrolador PIC 16F877, como, as portas disponveis, o nome e o nmero de cada pino, o tamanho da memria de programa entre outras. Quem deseja se aprofundar na programao de microcontroladores PIC usando a linguagem C, pode aprender muito atravs do livro "Microcontroladores PIC - Programao em C" escrito pelo autor Fbio Pereira - Editora rica. Todos os programas exemplos desse livro foram escritos com base nos compiladores da CCS, onde h uma biblioteca de funes para facilitar a programao. Nesta aula so apresentados vrios circuitos exemplos e seus respectivos programas fonte. J na prxima aula iremos aprender a usar o compilador da CCS e o MPLAB para efetuar a gravao no PIC 16F877. Caractersticas bsicas do PIC 16F877: - 33 pinos de I/O; - 8k de memria de programa FLASH; - 368 bytes de memria RAM; - 256 bytes de memria EEPROM; - Velocidade mxima de trabalho 20Mhz; - Watchdog timer (WDT); - 3 Timers;

- 8 canais A/D de 10 bits; - 1 USART sncrona/assncrona; - Porta Paralela escrava (PSP); - Porta serial sncrona SSP, SPI e I2C; Entre outras.
Figura 1 - Pinagem do PIC 16F877

A figura acima mostra todos os pinos do PIC 16F877, com seus respectivos nomes/funes. Os pinos (RA0 a RA5) esto associados a porta 'A'. (RE0, RE1 e RE2) a porta "E". (RC0 a RC7) a porta "C". (RD0 a RD7) a porta "D". E por ltimo, os pinos (RB0 a RB7) associados a porta "B". Cada um destes pinos pode ser usado como entrada ou sada e so definidos na programao. Observe que a maioria dos pinos teem mais de uma funo. Como exemplo veja o pino 10 que teem as funes de entrada/sada digital (RE2) e de selecionar um chip SPI (CS); ou a funo de um canal A/D (AN7).
Figura 2 - Simples diagrama interno do PIC16F877

Como um simples exemplo didtico da estrutura interna do microcontrolador PIC 16F877, possvel observar na figura acima, que ele composto de vrios mdulos como: uma unidade lgica e de controle, memrias RAM e ROM, Portas de entradas e sadas e tambm vrios perifricos de grande utilidade para a implementao de muitos projetos interessantes. Grosso modo, um microcontrolador tem vrias caractersticas de um microcomputador. Sendo assim, em alguns projetos, no necessitamos de um computador para executar determinadas funes, pois o microcontrolador dispe do que preciso para o projeto funcionar. Se desejarmos obter uma informao processada pelo microcontrolador de forma visual, poderemos conectar a ele um display LCD, LEDS ou mesmo conectar a um microcomputador atravs de uma de suas portas: Serial, Paralela, USB etc. Descrio de algumas funes do compilador CCS usadas aqui em nossos exemplos: Funo set_timer0() Altera o contedo interno do timer0. Esta funo aceita como parmetro uma varivel ou uma constante de 8 bits. Exemplo: set_timer0(131); //inicializa o valor do timer0 em 131. Funo get_timer0() Obtm o valor interno do timer0. Ela retona um valor de 8 bits. Exemplo: int8 valor; valor = get_timer0(); Funo set_tris_d() Escrita e leitura na porta D. Ou seja, define se um ou vrios pinos so entradas ou sadas na porta D. Um bit '1' indica que o respectivo pino associado a uma porta ser usado como entrada (Input). E um bit '0', sada (Output). O parmetro pode ser passado funo set_tris_d() tambm no sistema de numerao binrio usando a constante 0b. Exemplo: set_tris_d(0b01000001); //Os pinos RD6 e RD0 so definidos como entradas e os demais
como sadas.

ou em hexadecimal: set_tris_d(0x41); Funo setup_timer_0() Configura o prescaler do timer0. O parmetro passado uma constante predeterminada usada para dividir o sinal de contagem por um prescaler (divisor de freqncia). Exemplo: setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64); //Informa que o timer0() usa
interrupo interna, e que a freqncia dividida por 64 (prescaler).

Funo enable_interrupts() Usada para habilitar uma interrupo. Exemplos: enable_interrupts( GLOBAL ); //Habilita o sistema de interrupo geral. enable_interrupts( int_timer0 ); //Habilita interrupo do timer0(). enable_interrupts( int_rda ); //Habilita interrupo para leitura de caracter pela USART. ou enable_interrupts(GLOBAL | int_timer0 | int_rda); //Ou todas atravs do operador
OR ' |'.

Funo input() L o estado de um pino de uma determinada porta.


Exemplo:

boolean estado; estado = input(pin_d2); //L o estado do pino RD2 da porta D. Se o valor da varivel estado for '0' (false), isso indica que o nvel lgico do pino RD2 baixo (low). Se for '1' (true), o nvel lgico no pino RD2 alto (high). Funo output_bit() Liga ou desliga um determinado pino. Essa funo aceita dois parmetros: o primeiro o pino e o segundo se ele ser ligado ou desligado. Exemplos: output_bit(pin_d0, 1); //Pe pino RD0 em nvel alto (high). Pode-se usar a constante true
em vez de '1'.

output_bit(pin_d0, 0); //Pe pino RD0 em nvel baixo (low). Pode-se usar a constante
false em vez de ' 0'.

Funo output_high() Liga (pe em nvel alto) um determinado pino. Exemplos: output_high(pin_d2); //Pe o pino RD2 da porta D em nvel Alto. o mesmo que usar: output_bit(pin_d2, true); Funo output_low() Desiga (pe em nvel baixo) um determinado pino. Exemplos: output_low(pin_d2); //Pe o pino RD2 da porta D em nvel Baixo. o mesmo que usar: output_bit(pin_d2, false); Funo delay_ms() Retarda o processamento do programa em milisegundos. Exemplos: delay_ms(15); //Aguarda 15 milisegundos. delay_ms(1000); //Aguarda 1 segundo. Funo getc() Aguarda e chegada de um caracter na porta serial (USART). Exemplo:

char valor; valor = getch(); //Espera a chegada de um caracter na Serial e armazena-o na varivel
valor.

Funo printf() Envia um ou mais caracteres formatados, pela porta serial (USART). Usa os mesmos caracteres padro de formatao da funo printf() ANSI. Exemplos: printf("Curso USB/Serial.\r\n"); //Envia uma sting constante. printf("%d", 85); //Envia um nmero decimal. int valor = 0x3F; printf("%X", valor); //Envia um nmero hexadecimal. char *texto = "Teste de transmisso.\r\n"; printf("%s", texto); //Envia uma string a partir de uma varivel

Diretivas #int_rda Usada para definir uma funo de interrupo para leitura dos caracteres que chegam no buffer da porta serial. #include <16F877.h> inclui o arquivo cabealho usado para se trabalhar com o PIC 16F877. Esse arquivo contm vrias constantes e definies teis. #use delay(clock=4000000) Define o valor do relgio do PIC. Este valor tem que ser idntico ao da freqncia do cristal ou resonador externo. Para usar as funes delay_us(), delay_ms(), delay_cycles() necessrio definir #use delay(). #fuses XT, PUT, NOWDT, NOBROWNOUT, NOLVP Esta diretiva define quais fusveis interno do PIC so configurados. Os parmetros so armazenados no arquivo .HEX e so usados somente na hora da gravao. Veja o significado de alguns fusveis: Tipo de osciladores: LP - Low Power (oscilador < 200Khz); RC - Oscilador Resistor/Capacitor; XT - Oscilador a cristal <= 4Mhz; HS - High Speed (alta velocidade) > 4Mhz.

Outros fusveis:

PUT ---> (Power Up Timer). Temporizador de power up ligado; NOPUT ---> (No Power Up Timer). Temporizador de power up desligado; WDT ---> (Watch Dog Timer) habilitado. O programa resetado se por algum motivo, travar; NOWDT ---> (No Watch Dog Timer) desabilitado. Se travar, o programa no resetado; BROWNOUT ---> Reset por queda de tenso habilitado. Sempre que a alimentao cai a um valor mnimo; NOBROWNOUT ---> Reset por queda de tenso desabilitado. O PIC no resetado; LVP ---> Programao em baixa tenso habilitada; NOLVP ---> Programao em baixa tenso desabilitada; PROTECT ---> Protege todo o cdigo do programa contra leitura; NOPROTECT ---> Desabilita a proteo do cdigo do programa contra leitura. Obs.: Nem todos os modelos de PIC aceitam todas as constantes de fusveis.

#use rs232(BAUD=9600, PARITY=N, BITS=8, XMIT=pin_c6, RCV=pin_c7) Configura os parmetros da comunicao serial. BAUD ---> Velocidade da transmisso (depende da freqncia do cristal). PARITY ---> Paridade (N=nenhuma, E=par, O=mpar); BITS ---> Bits de dados (5, 6, 7, 8 ou 9); XMIT ---> Especifica o pino que ir transmitir os dados ( no 16F877 o pin_c6 fixo usando o USART); RCV ---> Especifica o pino que ir receber os dados ( no 16F877 o pin_c7 fixo usando o USART); Obs.: possvel escolher outros pinos para XMIT e RCV, porm, todo o processo de transmisso e recepo de dados ficar por conta do software.

Definindo a direo dos pinos de I/O No PIC, os pinos de I/O podem ser definidos tanto como entradas como sadas, sendo assim, atravs de um nico pino, podemos envia ou receber um sinal, para isso, preciso definir a direo do pino atravs da funo set_tris_X(). No nosso exemplo abaixo estamos usando a porta D. Se desejarmos definir todos os pinos da porta D como entradas, usamos a funo set_tris_d(0b11111111). Para definirmos todos os pinos da porta D como sadas, usamos set_tris_d(0b00000000) com todos os bits zeros. Os bits esto associados aos pinos (RD7 a RD0) da direita para a esquerda, ou seja, bit mais significativo igual a RD7, e menos significativo igual a RD0.

Figura 3 - Direo dos pinos da porta D

Exemplos de circuitos e programao usando o PIC16F877 Para assimilarmos mais conhecimentos sobre o PIC 16F877, vamos praticar atravs do desenvolvimento de pequenos circuitos, para ligar/desligar LEDs e l botes. Isso suficiente para quem nunca programou um microcontrolador, para levar adiante um estudo mais abrangente e preciso sobre o assunto. Um bom conhecimento da linguagem C ou do Assembler de suma importncia para o desenvolvimento de projetos eficientes e seguros. Mas tudo precisa de um comeo. Aproveite, pois o comeo agora.
Figura 4 - Circuito para piscar um LED

O circuito acima esquematiza a configurao bsica para fazer o PIC 16F877 funcionar eletricamente. Os capacitores C1 e C2 podem assumir valores entre 15 a 33pF e so usados em paralelo com o cristal de 4Mhz para estabiliz-lo. O pino 1 ligado ao +5v da fonte de alimentao atravs do resistor de 1K usado para resetar o PIC. O LED1 conectado ao pino 21 (RD2) ser controlado pelo programa mostrado no Fonte 1 logo abaixo: Dowload do Fonte 1.

Fonte 1 CCS Compiler - faz o LED da figura 4 piscar (uso de loop while() e delay_ms()) #include <16F877.h> #use delay(clock=4000000) #fuses XT, PUT, NOWDT, NOBROWNOUT, NOLVP void main(void) { set_tris_d(0b00000000); //Todos os pinos da porta 'D' como sadas. while( true ) //Loop infinito. { output_high(pin_d2); delay_ms(1000); output_low(pin_d2); delay_ms(1000); } }

//Liga LED. //espera 1 segundo. //Desliga LED. //espera 1 segundo.

O programa Fonte 1 acima deve ser compilado e gravado no PIC 16F877 para controlar o circuito da Figura 4, fazendo com que o LED1 pisque em intervalos de 1 segundo. A funo set_tris_d(0b00000000); define todos os pinos da porta D como sadas. A funo output_high(pin_d2) liga o LED1, e output_low(pin_d2) desliga-o. Delay_ms(1000) mantm o LED1 aceso ou apagado por 1 segundo. While() entra num loop infinito para manter o programa em execuo. Dowload do Fonte 2.
Fonte 2 - CCS Compiler - faz o LED da figura 4 piscar (uso do Timer0) #include <16F877.h> #use delay(clock=4000000) #fuses XT, PUT, NOWDT, NOBROWNOUT, NOLVP #int_timer0 void MeuTimerPiscaLED() { static boolean PiscaLed; //para piscar o led. static int contador; //para contar o tempo de 1 segundo. set_timer0(131-get_timer0()); contador++; if(contador == 125) //Se contou 125 (1 segundo). { contador=0; //zera contagem. PiscaLed = !PiscaLed; //Inverte bit; output_bit(pin_d0, PiscaLed); //Liga/desliga LED. } } //---------------------------------------------------------------------//Programa principal. //---------------------------------------------------------------------void main(void) { set_tris_d(0b00000000); //Todos os pinos da porta 'D' como sadas. setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64); //Define prescaler.

set_timer0(131); //Inicializa timer0 com 0 valor 131. enable_interrupts( global|int_timer0 ); //Habilita interrupes. while( true ) //Loop infinito - aguarda interrupo acontecer. { //Aqui pode ser executado o fluxo normal do programa //independente do Timer0. } }

O programa Fonte 2 acima faz o mesmo que o programa Fonte 1. A diferena que este usa o Timer0, para fazer o LED1 piscar independente do fluxo normal no corpo do programa principal main(). Ou seja, como se dois programas estivessem sendo executados ao mesmo tempo. Quanto mais veloz for o cristal usado, melhor ser a performance da execuo das instrues pelo PIC. Os parmetros das funes setup_timer_0() e set_timer0() definem o prescaler e o valor que inicializa o Timer0. Os parmetros da funo enable_interrupts() habilitam o sistema de interrupo geral e a interrupo do Timer0.
Figura 5 - Circuito para l o estado de um boto e acender um LED

O circuito acima usa dois pinos do PIC: o pino 27 (RD4) conectado ao boto (interruptor K) e ligado a um resistor pull-up para manter a estabilidade do sinal de entrada no pino. O pino 21 (RD2) usado para controlar o acendimento do LED1. Para comprovar o funcionamento do circuito, o boto (interruptor K) dever ser pressionado para que o LED1 acenda e, solto para que o mesmo se apague. Dowload do Fonte 3.
Fonte 3 - CCS Compiler - Programa para gravar o PIC e controlar o circuito da Figura 5

#include <16F877.h> #use delay(clock=4000000) #fuses XT, PUT, NOWDT, NOBROWNOUT, NOLVP //--------------------------------------------------------------------------//Programa Principal. //--------------------------------------------------------------------------void main(void) { boolean TravaPress = true; //Inicia varivel para controle do boto. set_tris_d(0b00010000); //somente o pino d4 da porta 'D' como entrada. while( true ) //Loop infinito. { if( input(pin_d4) == 0) //Se leu '0' (zero) o boto foi pressionado. { if(TravaPress == true) //Para executar o cdigo abaixo uma nica vez. { TravaPress = false; //Nega a condio acima. output_high(pin_d2); //Liga LED. delay_ms(15); //bounce - retardo para eliminar rudo ao pressionar boto. } }else{ //Se o boto foi solto. if(TravaPress == false) //Para executar o cdigo abaixo uma nica vez. { TravaPress = true; //Nega a condio acima. output_high(pin_d2); //Desliga LED. delay_ms(15); //bounce - retardo para eliminar rudo ao pressionar boto. } } } }

O programa acima deve ser compilado para gravar o PIC 16F877 e controlar o circuito da Figura 5. O funcionamento simples: quando o boto (interruptor K) mantido pressionado, o LED1 permanece aceso. Quando o interruptor solto o LED1 apagado. J o programa funciona assim: enquanto input(pin_d4) retorna o valor '0' (boto pressionado) a varivel TravaPress se torna false, e a funo output_high(pin_d2) liga o LED1. Mesmo que o boto permanea pressionado as funes dentro do corpo do if(TravaPress == true){ } no so mais processadas. Quando o boto (interruptor K) for solto, a funo input(pin_d4) retornar um valor '1' fazendo com que as instrues dentro do corpo { } do 'else' sejam processadas, executando a funo output_low(pin_d2) desligando o LED1.

Figura 6 - Conectando o PIC 16F877 na porta RS232 do PC

O circuito acima conectado porta RS232 do computador por meio do driver Max232. O LED1 ligado ou desligado atravs do computador. O boto (interruptor K) usado para enviar uma string atravs da RS232 quando o mesmo pressionado ou solto.

Figura 7 - Conectando o PIC 16F877 no Bus USB atravs do FT232BM

O circuito da Figura 7 acima funciona da mesma forma que o circuito da Figura 6, com a nica diferena de que este acima funciona conectado ao Bus USB, atravs do circuito Bus powered da Aula 3 - Figura 5, que usa o chip FT232BM. Dowload do Fonte 4.
Fonte 4 - CCS Compiler - Programa para controlar os circuitos das Figuras 6 e 7. #include <16F877.h> #use delay(clock=4000000) #fuses XT, PUT, NOWDT, NOBROWNOUT, NOLVP #use rs232(BAUD=9600, parity=N, BITS=8, XMIT=pin_c6, RCV=pin_c7) //--------------------------------------------------------------------------//Interrupo de recebimento de caracter pela UART. //--------------------------------------------------------------------------#int_rda void Serial_Detecta_Car() { char ch; ch = getc(); //Pega o caracter no registrador da UART. if( ch == 'l' ) //Se recebeu o caracter L. { output_high(pin_d1); //Liga LED. } if( ch == 'd' ) //Se recebeu o caracter D. { output_low(pin_d1); //Desliga LED. } } //---------------------------------------------------------------------------

//Programa Principal. //--------------------------------------------------------------------------void main(void) { boolean TravaPress = true; //Inicia varivel para controle do boto. enable_interrupts(int_rda); //Habilita interrupo de recebimento. enable_interrupts(GLOBAL); //Habilita registrador de interrupo. set_tris_d(0b00000100); //somente o pino 2 da porta 'D' como entrada. while( true ) //Loop infinito. { if( input(pin_d2) == 0) //Se leu '0' (zero) o boto foi pressionado. { if(TravaPress == true) //Para executar o cdigo abaixo uma nica vez. { TravaPress = false; //Nega a condio acima. printf("Boto pressionado.\r\n"); //Envia para a porta rs232. delay_ms(15); //bounce - retardo para eliminar rudo ao pressionar boto. } }else{ //Se o boto foi solto. if(TravaPress == false) //Para executar o cdigo abaixo uma nica vez. { TravaPress = true; //Nega a condio acima. printf("Boto solto.\r\n"); //Envia para a porta rs232. delay_ms(15); //bounce - retardo para eliminar rudo ao pressionar boto. } } } }

O programa acima funciona de forma semelhante ao do Fonte 3, mas com algumas diferenas: o LED1 aceso quando o caracter 'l'-ligado for enviado pelo computador, tanto pela RS232 como pelo Bus USB. Esse LED apagado quando for enviado o caracter 'd'-desligado. A leitura desses caracteres feita pela funo getc() que l um caracter atravs do buffer do USART do PIC 16F877. Quando o boto (interruptor K) for pressionado, a string "Boto pressionado.\r\n" enviada ao computador atravs do USART, pela funo printf(). Quando for solto, enviada a string "Boto solto.\r\n". Aps a compilao, use o programa Fonte 4 para gravar o PIC16F877 nos circuitos da Figura 6 e da Figura 7. Na prxima aula iremos usar o MPLAB da Microchip , o compilador da CCS e uma placa para gravar o PIC 16F877. Instalando o CCS C Compiler (verso Trial Evaluation 30 dias)

Nesta aula iremos aprender a gravar um programa escrito na linguagem C, dentro de um microcontrolador PIC16F877 para que o mesmo possa controlar nossos circuitos. Mas para isso necessrio termos em mos as ferramentas necessrias para que possamos executar esta tarefa. Uma dessas ferramentas o compilador, que converte o cdigo escrito na linguagem C, num cdigo de mquina (seqncia lgica de endereos de memria e instrues internas prprias do microcontrolador). Para essa tarefa iremos usar o compilador C da CCS (demo), onde podemos us-lo por 30 dias gratuitamente (funciona somente com os PICs: 16F877, PIC16C544 e 18F458 com no mximo 2K de cdigo de programa). A verso completa trabalha com muitos modelos de PIC, e explora toda a sua capacidade de memria. possvel editar o cdigo fonte e compilar usando o ambiente IDE do prprio compilador, s no h um recurso para a gravao do PIC. Iremos usar o ambiente MPLAB IDE da Microchip para editar o cdigo fonte e gravar o PIC. O MPLAB chama automaticamente o compilador PCW da CSS para compilar o cdigo, desde que configuremos o mesmo adequadamente. Dessa forma s precisamos de um nico ambiente para: editar, compilar e gravar o PIC, tornando mais fcil a tarefa de se programar um PIC. Veja na figura abaixo o processo para se gravar o PIC16F877:
Figura 1 - Processo de edio, compilao e gravao do PIC 16F877

No MPLAB, aps a edio do cdigo fonte, o processo de compilao e gravao automtico. Aps alguns clique do mouse, o PIC estar gravado e pronto para ser inserido em nosso circuito. Aps o processo de compilao gerado um arquivo com o mesmo nome do arquivo fonte, mas com a extenso (.HEX) (arquivo compilado, prprio para ser gravado no PIC pelo dispositivo gravador).
Figura 2 - Cdigo Fonte (.C) Figura 3 - Cdigo compilado (.HEX)

#include <16F877.h> #use delay(clock=4000000) #fuses XT, PUT, NOWDT, NOBROWNOUT, NOLVP void main(void) { set_tris_d(0b00000000); //Todos sadas. while( true ) //Loop infinito. { output_high(pin_d2); //Liga LED. delay_ms(1000); //espera 1 segundo. output_low(pin_d2); //Desliga LED. delay_ms(1000); //espera 1 segundo. } }

:1000000000308A00192800002230840000080319FB
:1000100018280130F800F701F70B0C28F80B0B2813 :100020004A30F700F70B122800000000800B092867 :10003000003484011F30830583161F149F141F157D :100040009F11003088000811831208150430A100A8 :10005000FA30A2000420A10B28288316081183126D :1000600008110430A100FA30A2000420A10B3328AB :0600700083162328630043 :02400E00313F40 :00000001FF ;PIC16F877

Siga os passos abaixo para fazer download e instalar o compilador PCWH da CCS 1 - Acesse o site da CCS em: www.ccsinfo.com; 2 - No menu da pgina da CCS selecione o item Compiler Information e depois clique no item Free Demo; 3 - Aps a abertura da pgina, preencha seu nome no campo Your Name, depois clique no boto Download Demo. Salve o arquivo demoupd.exe em seu disco rgido; 4 - Aps o download, d duplo clique no arquivo demoupd.exe para abrir o programa de instalao. Siga as instrues nas telas do programa instalador. Obs.: O compilador instalado na pasta: \Arquivos de programas\PICC

Figura 4 - Tela do compilador PCW C da CCS

Para agregar o compilador PCW ao MPLAB, siga os prximos passo... Obs.: Para que o MPLAB (verso 6 ou superior) consiga identificar o compilador PCW, necessrio instalar um Plug-in (programa de recurso auxiliar) no seu computador.

Siga os passos abaixo para fazer download e instalar o Plug-In

1 - Acesse novamente o site da CCS em: www.ccsinfo.com; 2 - No menu da pgina da CCS selecione o item Customer Download e depois clique no item MPLAB 6.x Plugin-In; 3 - Aps a abertura da pgina, v at a seo MPLAB Plug-In e clique no link MPLAB Plug-in. Salve o arquivo mplab-ccs-plugin-install.exe em seu disco rgido; 4 - Aps o download, d duplo clique no arquivo mplab-ccs-plugin-install.exe para abrir o programa de instalao. Siga as instrues nas telas do programa instalador. Siga os passos abaixo para fazer download e instalar o MPLAB IDE Obs.: antes de instalar uma nova verso do ambiente MPLAB, remova do sistema quaisquer verses antigas do mesmo.

1 - Acesse o site da Microchip em: www.microchip.com; aps a abertura da pgina, clique no menu Products e depois no submenu Development; 2 - Na pgina da Microchip, clique no link: MPLAB IDE e faa download da verso completa MPLAB IDE v7.21 ou superior; 4 - Aps o download, d duplo clique no arquivo MP721_full.zip para abrir o programa de instalao. Siga as instrues nas telas do programa instalador at concluir.
Figura 5 - Tela inicial do programa de instalao do MPLAB Tools

Para continuar a instalao clica-se no boto Next >...

Criando um novo projeto no MPLAB IDE para o microcontrolador PIC16F877 Como exemplo de um novo projeto, faa download do Fonte1.zip (Aula 15). Aps o download, faa a descompactao do mesmo:

Figura 6 - Pasta Fonte1 aps descompactao

1 - No Windows, clique em: Iniciar-->Programas-->Microchip-->MPLAB IDE v7.21--> MPLAB IDE. Ao abrir o ambiente MPLAB, siga os prximos passos: 2 - Clique no menu Project do MPLAB v7.21;
Figura 7 - Ambiente MPLAB

Aps clicar no menu Project ser exibida a tela abaixo:

Figura 8 - Tela inicial do Wizard para instalar o MPLAB

Clique no boto Avanar > para passar para o prximo passo... 3 - No campo Device da prxima tela, selecione o modelo do PIC a ser usado no projeto. No nosso caso selecione o PIC16F877;
Figura 9 - Seleo do modelo de PIC

Clique no boto Avanar > para passar para o prximo passo...

4 - No campo Active Toolsuite da tela abaixo, selecione CCS C Compiler for PIC12/14/16/18. No campo Toolsuite Contents selecione CCS C Compiler (ccsc.exe]. J no campo Location, clique no boto Browse... para localizar a pasta PICC, selecionado em seguida o programa Ccsc.exe;
Figura 10 - Seleo do compilador da CCS

preciso que o Plug-In tenha sido instalado para que aparea o nome do compilador CCS nos campos 1 e 2. Depois clique no boto Avanar > para passar para o prximo passo... 5 - Na prxima tela clique no boto Browse...

Figura 11 - Seleo da pasta onde sero gravados os arquivos do projeto

Aps clicar no boto Browse... ser exibida a tela abaixo para localizar a pasta onde ser gravado o novo projeto. No nosso caso iremos selecionar a pasta Fonte1, aquela que foi criada anteriormente quando descompactamos o arquivo Fonte1.zip.
Figura 12 - Procurando a pasta

Clique no boto OK e depois no boto Avanar > para passar para o prximo passo...

6 - Na prxima tela, selecione o arquivo Fonte1.c na pasta Fonte1. Depois clique no boto Add >> para adicionar o arquivo fonte ao novo projeto;
Figura 13 - Adicionando um arquivo fonte ao projeto

Clique no boto Avanar > para passar para o prximo passo...

Figura 14 - Tela de concluso da criao do projeto

Clique no boto Concluir para finalizar a criao do projeto.


Figura 15 - Janela do MPLAB mostrando os arquivos do projeto e o editor de cdigo fonte

A partir de agora o compilador PCW da CCS est agregado ao ambiente MPLAB, sendo possvel compilar e gerar o arquivo Fonte1.hex. Na prxima aula iremos configurar o MPLAB para usar o gravador McFlash da Mosaico conectado porta serial para gravar o PIC 16F877.

Obs.: Lembre-se de salvar o projeto clicando no menu File-->Save All, para aproveit-lo na prxima aula. Continua na prxima aula...

Testando os circuitos da Aula 15


Agora que aprendemos a usar as ferramentas bsicas para trabalhar com o PIC16F877, poderemos testar os exemplos da Aula 15. Para facilitar nossos testes iremos usar o programa RcomSerial. A verso desse programa, disponvel aqui para download, suporta velocidades de at 921.600 pbs. Essa velocidade ser configurada quando formos testar os conversores RS485 e interfaces USB<=>USB (laplink PC-PC). Nesta aula, o programa RComSerial ser usado simplesmente para testar os exemplos. Nas aulas seguintes iremos desenvolver programas especficos para cada projeto. Para testar os circuitos das Figuras 6 e 7 da Aula 15, siga os passos abaixo: 1 - Compile o cdigo Fonte 4 da Aula 15 e grave-o no PIC16F877; 2 - Conecte um dos circuitos das Figuras 6 ou 7 da Aula 15 ao computador; 3 - Faa download do RComSerial clicando aqui;

4 - Aps o download, descompacte o arquivo RComSerial.zip e rode o programa RComSerial.exe, configurando-o conforme detalhes na Figura 1. Obs.: Se o driver VCP ainda no foi instalado, ou no saiba qual a Porta COMx deve ser configurada no RComSerial, retorne a Aula 8 para obter informaes.

Figura 1 - Tela do RComSerial.exe para testar os circuitos das Figuas 6 e 7 / Aula 15

Aps ter configurado o RComSerial conforme a Figura 1 acima, clique no boto "Abrir Porta". Na janela "TX-Enviar Mensagem:" digite a letra 'l' para ligar o LED1 do circuito, e 'd' para deslig-lo. No circuito, pressione o Interruptor K para enviar a mensagem "Boto pressionado." caixa "RX-Recebe Mensagem:" do RComSerial. Ao soltar o Interruptor K, enviada a mensagem "Boto solto.".

Projetos Prticos - Conversores


Atravs de uma interface bus-powered ou self-powered baseadas no chipset USB FT232BM, possvel fazer vrios tipos de interfaceamento. O objetivo do chipset FT232BM converter sinais USB em Serial (TTL). Se desejarmos criar um conversor USB<==>RS232 para conectar dois PCs ou outro aparelho, temos que criar um circuito usando um componente driver, que converta os sinais seriais (TTL), em RS232. Da mesma forma que possvel converter os sinais seriais TTL em RS232, possvel tambm converter em RS485, RS422, etc. Vamos agora analisar alguns conversores RS232 e RS485:

Conversores RS232
O circuito da Figura 2 abaixo usa um driver MAX213CAI ou SP213EHCA para converter os sinais seriais TTL do FT232BM em sinais seriais padro RS232. A diferena entre os dois est na velocidade. O SP213EHCA permite velocidades de at 500k baud, enquanto que o MAX213CAI suporta no mximo 115.200 baud. Os dois so compatveis pino a pino. Se a velocidade no for um fator importante para o projeto, o MAX213CAI uma alternativa mais em conta. Observe que esses drivers disponibilizam todos os sinais de Handshaking (RTS, CTS, DTR, DSR, DCD e RI), necessrios para se projetar circuitos de Modem ou RF modem, entre outros.
Figura 2 - Conversor USB<==>RS232 (Full) usando o MAX213CAI ou SP213EHCA

Se o objetivo no for o de criar circuitos de Modem que utilizam todos os sinais de handshaking, possvel usar um simples MAX232 para converter os sinais TTL, em sinais padro RS232. O MAX232 pode operar numa velocidade de at 115.200 baud. Ele dispe de dois sinais de handshaking (RTS e CTS), usados por algumas interfaces seriais para controle de fluxo por hardware.

Figura 3 - Conversor USB<==>RS232 (Parcial) usando o MAX232

Conversores RS485
Interfaces USB e RS232 no foram projetadas para transmitir dados a longas distncias. O padro RS232 estabelece um cabo em torno de 15m de distncia entre dois pontos. Quanto maior for a distncia e a velocidade, mais suscetvel a erros fica a transmisso. A distncia de um cabo USB no pode passar dos 5m, distncias maiores tornam o sistema invivel. Para solucionar esse problema poderemos usar drivers RS485 para transmitir dados a uma distncia de at 1200m. O Padro RS485 estabelece apenas caractersticas eltricas. Usa somente 2 fios; trabalha em modo half-duplex; multiponto (at 32 ns) e, voltagem diferencial. A velocidade numa linha RS485 pode chegar at 10Mbps dependendo do driver utilizado. um padro largamente usado em automao industrial por ser imune a rudos. A implementao do protocolo de comunicao fica por conta do usurio, o padro RS485 no especifica um. Sendo assim, uma interface RS485 de um fabricante pode no "conversar" com a de um outro. A no ser que elas implementem o mesmo protocolo.
Figura 4 - Circuito RS485

O esquema acima mostra um circuito RS485 ponto-a-ponto para transmisso de dados a uma distncia de at 1200m usando dois drivers MAX485. O CI MAX485 suporta at 2,5Mbps de velocidade. O pino 2 do MAX485 usando para habilitar a recepo de dados, j o pino 3 usado para habilitar a transmisso. Quando aplicado um sinal em nvel lgico baixo (0) ao pino 2 (habilita receptor), a linha RX fica preparada para receber dados. Quando um sinal em nvel lgico alto (1) aplicado ao pino 3 (habilita transmissor), dados podem ser transmitidos pela linha TX. Como o padro RS485 half-duplex (transmisso e recepo no ocorrem simultaneamente), comum conectar o pino 2 com o pino 3 transformando-os em um nico pino (te-transmite enable). Quando for aplicado nvel lgico 1 a linha (te), o transmissor (pino 3) habilita a linha TX, e o receptor (pino 2) desabilita a linha RX. No fim do cabo mais distante do circuito mestre, deve ser colocado um resistor de terminao de 120 ohm, em paralelo com as duas linhas de dados TX/RX.
Figura 5 - Interface RS485 entre dois circuitos FT232BM

O circuito acima um conversor USB/TTL<=>RS485<=>TTL/USB para se transmitir dados entre dois Host USB (PC-PC). O FT232BM usa o pino 16TXDEN para habilitar a transmisso, sendo transparente para o software. Ou seja, quando nosso programa transmite dados via FT232BM, este habilita (pe em nvel alto 1) a linha (te) automaticamente, habilitando a transmisso no CI RS485. Assim que for finalizada a transmisso dos dados, o FT232BM pe o pino 16-TXDEN em nvel lgico 0, fazendo com que o MAX485 fique preparado para receber dados (linha "te" em nvel 0). Para testar o circuito acima usando um nico computador, faa assim: conecte dois circuitos FT232BM e depois instale seus driveres VCP. Rode duas cpias do RComSerial.exe e configure as duas com a mesma velocidade (460.800 baud). As portas tem que ser diferentes (veja no Gerenciador de Dispositivos do Windows, quais esto disponveis aps a instalao dos drivers VCP).
Figura 6 - Cpia (1) do programa RComSerial Figura 7 - Cpia (2) do programa RComSerial

Figura 8 - Interface RS485 entre o FT232BM e um PIC16F877-20/P

O esquema acima usa o padro RS485 para transmitir dados a longas distncias entre um circuito baseado no chipset FT232BM e um microcontrolador PIC16F877-20/P. O PIC 16F877-20/P pode ser configurado para trabalhar com um driver do tipo MAX485 como se fosse uma comunicao RS232. Para isso preciso especificar um parmetro a mais na funo #use rs232(). Esse parmetro o ENABLE, usado para definir um pino para habilitar a transmisso numa linha RS485. Veja abaixo como us-lo na funo: #use delay(clock=20000000) //20Mhz. #use rs232(BAUD=256000, parity=N, BITS=8, XMIT=pin_c6, RCV=pin_c7, ENABLE=pin_c5) Obs. Usando um cristal de 20Mhz com o PIC16F877-20/P, possvel estabelecer uma transmisso RS485 numa velocidade de at 256.000 bps. Para testar o circuito da Figura 8, siga os passos abaixo:

1 - Confeccione o circuito da Figura 8 (bus-porwered ou self-powered), substituindo o PIC16F877-20/P que consta no circuito B, pelo circuito da figura abaixo, conectando-o linha RS485 do mesmo circuito B:
Figura 9 - Esquema detalhado da configurao do PIC16F77-20/P do circuito B da Figura 8

2 - Compile e grave no PIC16F877-20/P, o programa abaixo: Dowload do Programa 1.


Programa 1 - Cdigo para gravar o PIC16F877-20/P #include <16F877.h> #use delay(clock=20000000) //20Mhz. #fuses HS, PUT, NOWDT, NOBROWNOUT, NOLVP #use rs232(BAUD=256000, parity=N, BITS=8, XMIT=pin_c6, RCV=pin_c7, ENABLE=PIN_c5) //Comunicao RS485. //--------------------------------------------------------------------------//Interrupo de recebimento de caracter pela UART. //--------------------------------------------------------------------------#int_rda void Serial_Detecta_Car() { char ch; ch = getc(); //Pega o caracter no registrador da UART. if( ch == 'l' ) //Se recebeu o caracter L. { output_high(pin_d1); //Liga LED. } if( ch == 'd' ) //Se recebeu o caracter D. { output_low(pin_d1); //Desliga LED. }

} //--------------------------------------------------------------------------//Programa Principal. //--------------------------------------------------------------------------void main(void) { boolean TravaPress = true; //Inicia varivel para controle do boto. enable_interrupts(int_rda); //Habilita interrupo de recebimento. enable_interrupts(GLOBAL); //Habilita registrador de interrupo. set_tris_d(0b00000100); //somente o pino 2 da porta 'D' como entrada. while( true ) //Loop infinito. { if( input(pin_d2) == 0) //Se leu '0' (zero) o boto foi pressionado. { if(TravaPress == true) //Para executar o cdigo abaixo uma nica vez. { TravaPress = false; //Nega a condio acima. printf("Boto pressionado.\r\n"); //Transmite via rs485. printf("Teste de transmisso RS485.\r\n"); printf("Curso USB/Serial ROGERCOM.\r\n"); printf("www.rogercom.com.\r\n\r\n"); delay_ms(15); //bounce - retardo para eliminar rudo ao pressionar boto. } }else{ //Se o boto foi solto. if(TravaPress == false) //Para executar o cdigo abaixo uma nica vez. { TravaPress = true; //Nega a condio acima. printf("Boto solto.\r\n"); //Transmite via rs485. printf("Transmisso USB<->RS485\r\n"); printf("Microcontrolador PIC16F877-20/P.\r\n"); printf("FT232BM.\r\n\r\n"); delay_ms(15); //bounce - retardo para eliminar rudo ao pressionar boto. } } } }

3 - Rode o RComSerial em seu computador e configure-o assim: Porta: COM4 (verifique no Gerenciador de Dispositivos do Windows qual foi a porta criada pelo driver VCP); Velocidade: 256000 baud; Paridade: Nenhuma; Bits de dados: 8. Bits de parada: 1. 4 - Depois de configurado o RComSerial, clique no boto "Abrir Porta" para estabelecer comunicao;

5 - Para transmitir dados para o RComSerial, pressione e solte o Interruptor K no circuito.

Projetos Prticos - Interfaces foto-acopladas


As vezes preciso isolar eletricamente dois circuitos, seja para protege-los ou mesmo eliminar rudos. Se voc for projetar algum circuito para controle de dispositivos via Rede telefnica, preciso isol-lo, pois os circuitos de altas freqncias do computador geram um grande zumbido na Rede, inviabilizando projetos do tipo URA (Unidade de Resposta Audvel). Nas prximas figuras so mostradas 3 interfaces foto-acopladas usando o acoplador ptico 6N136. Este CI permite comutaes de at 1Mbps de velocidade. Os circuitos mostrados abaixo esto limitados a uma velocidade mxima de 128.000 bps. possvel tambm combinar estes circuitos numa linha RS485.
Figura 10 - Circuito TX/RX foto-acoplado

O circuito acima pode ser usado para isolar eletricamente qualquer interface (USB/232TTL, RS232, RS485, entre outras) de uma maneira simples. possvel tambm adicionar mais CIs 6N136 para permitir mais linhas como as de handshaking da interface RS232 (RTS, CTS, DTR, DSR, DCD e RI). Os terminais de "Entrada" do circuito acima so usados para conectar uma linha TX, e os terminais de "Sada" para conectar uma linha RX. Lembre-se que o circuito acima est limitado a uma velocidade mxima de 128.000 bps.

Figura 11 - Interface TX/RX foto-acoplada entre um circuito FT232BM e um PIC16F877

Figura 12 - Interface TX/RX foto-acoplada entre dois circuitos FT232BM

A partir da prxima aula comearemos a desenvolver alguns projetos prticos para assimilarmos os ensinamentos passados no curso.

Programando atravs das funes da dll FTD2XX


Essa aula explora muita das funes da dll FTD2xx para acesso direto ao Bus USB. A partir de suas funes possvel saber se um dispositivo FT232BM est conectado ao bus USB; quantos esto; obter os descritores, como: nome do fabricante, identificao do fabricante, nmero serial; enviar e receber dados; gravar, l e apagar a EEPROM para personalizar o dispositivo. H tambm um conjunto de funes usadas para manipular a rea de memria EEPROM do usurio (espao restante da EEPROM usado pelo usurio para

gravar algumas configuraes do seu circuito, se desejar). A funo FT_EE_UASize( ) retorna o tamanho em bytes do espao livre do usurio. As funes que manipulam a rea livre do usurio no interferem nos dados armazenados no restante da EEPROM. Quanto menos caracteres escrever na descrio do produto, maior ser a rea livre do usurio. H funes que abrem o dispositivo pelo seu nmero (0 para o primeiro conectado, 1 para o segundo...), pelo Local ID, pela Descrio do Produto ou pelo Nmero Serial do mesmo. H tambm funes para fazer o FT232BM trabalhar de forma paralela (8 pinos de I/O) no modo Bit Bang. Dessa forma possvel controlar at 8 entradas ou sadas sem a necessidade de usar um microcontrolador. A velocidade das entradas/sadas pode ser configurada para trabalhar em alta velocidade. A FTD2xx.DLL disponibiliza um conjunto de funes para se trabalhar com o FT232BM, compatveis com quelas da API do Windows que d acesso Porta Serial, mas prprias para controlar o FT232BM. Estas funes usam o pr-fixo FT_W32 e esto detalhadas na guia de programao da FTDI: D2XXPG30.pdf. Observao: Para fazer os exemplos dessa aula necessrio ter montado um dispositivo FT232BM configurado como Bus-powered ou Self-powered; Se em seu computador esto instalados os drivers VCP, remova-os atravs do Adicionar ou remover programas do Painel de Controle do Windows; Baixe do site da FTDI os drivers FTD2xx mais atuais que encontrar, ou clique aqui para baixar a partir do curso. Conecte o dispositivo FT232BM numa Porta USB livre do PC. Siga normalmente o processo de instalao.

Os exemplos esto escritos em C++Builder e Deplhi. C++Builder: Para compilar todos os exemplos em C++ usamos a biblioteca FTD2xx.LIB e o arquivo cabealho FTD2xx.H. Se seu compilador C++ indicar uma incompatibilidade, use o programa implib.exe que acompanha seu compilador para criar uma FTD2xx.LIB a partir da FTD2xx.DLL; assim: C:\Implib.exe FTD2xx.LIB FTD2xx.DLL O comando acima cria o arquivo FTD2xx.LIB usado para compilar os exemplos em C++ Delphi: Em Delphi s precisamos adicionar o arquivo FTD2xxUnit.pas para compilar os exemplos. No se preocupem, pois em cada pasta dos exemplos esto as bibliotecas necessrias para a compilao.

Segue abaixo a descrio de cada funo usada em nossos exemplos:

Funes Clssicas da FT2DXX


FT_ListDevices( )
Obtm informaes atualmente relativa aos dispositivos conectados. Esta funo devolve o nmero de dispositivos conectados, a descrio, o nmero serial e o ID local dos dispositivos conectados. FT_STATUS FT_ListDevices(PVOID pvArg1, PVOID pvArg2, DWORD dwFlags) Parmetros: pvArg1 - O significado depende de dwFlags. pvArg2 - O significado depende de dwFlags. dwFlags - Determina o formato da informao retornada. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. Em sua forma mais simples, pode ser usado para devolver o nmero de dispositivos conectados atualmente. Se a constante de bit FT_LIST_NUMBER_ONLY fixada em dwFlags, o parmetro pvArg1 interpretado como um ponteiro do tipo DWORD para armazenar o nmero de dispositivos atualmente conectados. Pode ser usada para retornar informao do dispositivo. Se bit FT_OPEN_BY_SERIAL_NUMBER setado em dwFlags, ser retornado uma string como o Nmero de Srie; se bit FT_OPEN_BY_DESCRIPTION setado em dwFlags, ser retornado uma string com a Descrio do Produto; se FT_OPEN_BY_LOCATION setado em dwFlags, o Local ID ser retornado; se nenhum destes bits for setados em dwFlags, por padro, ser retornado o nmero de Srie do Dispositivo. Pode ser usada para retornar informao string para um nico dispositivo. Se FT_LIST_BY_INDEX e FT_OPEN_BY_SERIAL_NUMBER ou FT_OPEN_BY_DESCRIPTION so setados em dwFlags, o parmetro pvArg1 interpretado como o ndice do dispositivo, e o parmetro pvArg2 interpretado como um ponteiro para um buffer que contm uma string apropriada. ndices so iniciados em 0, e o cdigo de erro FT_DEVICE_NOT_FOUND devolvido para um ndice invlido. Pode ser usada para retornar informao string de todos dispositivos conectados. Se FT_LIST_ALL e FT_OPEN_BY_SERIAL_NUMBER ou FT_OPEN_BY_DESCRIPTION so setados em dwFlags, o parmetro pvArg1 interpretado como um ponteiro para uma array de ponteiros de buffers para conter a string apropriada e, o parmetro pvArg2 interpretado como um ponteiro para uma varivel do tipo DWORD, onde armazenado o nmero de dispositivos atualmente conectados. Note que para pvArg1, a ltima entrada na ordem de ponteiros para array dever ser um ponteiro NULL. O local ID de um dispositivo devolvido se FT_LIST_BY_INDEX e FT_OPEN_BY_LOCATION so setados em dwFlags. Neste caso o parmetro pvArg1 interpretado como o ndice do dispositivo, e o parmetro pvArg2 interpretado como um ponteiro para uma varivel de tipo DWORD para conter o local ID. ndices so baseados em zero, e o cdigo de erro FT_DEVICE_NOT_FOUND retornado para um ndice invlido. So retornados os Local ID de todos os dispositivos conectados se FT_LIST_ALL e FT_OPEN_BY_LOCATION so setados em dwFlags. Neste caso, o parmetro pvArg1 interpretado como um ponteiro para a um array de variveis do tipo DWORD para conter os Local ID, e o parmetro pvArg2 interpretado como um ponteiro para uma varivel DWORD para armazenar o nmero de dispositivos atualmente conectados.

FT_Open() - Exemplos 1, 2, 3e4 Delphi C++

FT_Open( )
Abre um dispositivo e retorna um identificador (handle) para ser usado pela maioria das funes. FT_STATUS FT_Open(int iDevice, FT_HANDLE *ftHandle) Parmetros: iDevice - Zero (0) para abrir o primeiro dispositivo plugado, um (1) para o segundo e, para mais, siga a seqncia numrica. ftHandle - Ponteiro para uma varivel de tipo FT_HANDLE onde a Handle ser armazenado. Este handle deve ser usado pelas funes para ter acesso ao dispositivo. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_Open() - Exemplo 1 Delphi C++

FT_OpenEx( )
Abre um dispositivo e retorna um identificador (handle) para ser usado pela maioria das funes. FT_STATUS FT_OpenEx(PVOID pvArg1, DWORD dwFlags, FT_HANDLE *ftHandle) Parmetros: pvArg1 - O significando depende de dwFlags, mas regularmente ser interpretado como um ponteiro a uma string terminada em NULL. dwFlags - FT_OPEN_BY_SERIAL_NUMBER, FT_OPEN_BY_DESCRIPTION ou FT_OPEN_BY_LOCATION. ftHandle - Ponteiro para uma varivel de tipo FT_HANDLE onde a Handle ser armazenado. Este handle deve ser usado pelas funes para ter acesso ao dispositivo. O significado de pvArg1 depende de dwFlags: se dwFlags setado em FT_OPEN_BY_SERIAL_NUMBER, pvArg1 interpretado como um ponteiro a uma string terminada em NULL que representa o nmero de srie do dispositivo; se dwFlags for setado em FT_OPEN_BY_DESCRIPTION, pvArg1 interpretado como um ponteiro para uma string terminada em NULL que representa a descrio de dispositivo; se dwFlags setado em FT_OPEN_BY_LOCATION, pvArg1 interpretado como um valor DWORD que contm o Local ID do dispositivo. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_OpenEx() - Exemplos 1, 2, 3 e 4 Delphi C++

FT_Close( )
Fecha um dispositivo aberto pelas funes FT_Open() ou FT_OpenEx(). FT_STATUS FT_Close(FT_HANDLE ftHandle) Parmetro: ftHandle - Identificador do dispositivo. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito.

FT_SetDivisor( )
Esta funo define a velocidade da comunicao com o dispositivo. Ela usada para definir uma velocidade em Baud rate no padronizada. FT_STATUS FT_SetDivisor(FT_HANDLE ftHandle, USHORT usDivisor) Parmetros: ftHandle - Identificador do dispositivo. usDivisor - Divisor. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_SetDivisor() Exemplo 1 Delphi C++

FT_SetBaudRate( )
Esta funo define a velocidade da comunicao com o dispositivo. FT_STATUS FT_SetBaudRate(FT_HANDLE ftHandle, DWORD dwBaudRate) Parmetros: ftHandle - Identificador do dispositivo. dwBaudRate - Velocidade (Baud rate). Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_SetBaudRate() Exemplo 1 Delphi C++

FT_SetDataCharacteristics( )
Esta funo define as caractersticas da comunicao com o dispositivo. FT_STATUS FT_SetDataCharacteristics(FT_HANDLE ftHandle, UCHAR uWordLength, UCHAR uStopBits, UCHAR uParity) Parmetros: ftHandle - Identificador do dispositivo. uWordLength - Tamanho do dado: FT_BITS_7 ou FT_BITS_8. uStopBits - Nmero de stop bits: FT_STOP_BITS_1 ou FT_STOP_BITS_2. uParity - Paridade: FT_PARITY_NONE, FT_PARITY_ODD, FT_PARITY_EVEN, FT_PARITY_MARK, FT_PARITY_SPACE. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_SetDataCharacteristics() - Exemplo 1 Delphi C++

FT_SetTimeouts( )
Esta funo seta os timeouts de leitura e escrita do dispositivo. FT_STATUS FT_SetTimeouts(FT_HANDLE ftHandle, DWORD dwReadTimeout, DWORD dwWriteTimeout) Parmetros: ftHandle - Identificador do dispositivo. dwReadTimeout - Timeout de leitura em milisegundos. dwWriteTimeout - Timeout de escrita em milisegundos. Retorna:

Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_SetTimeouts() Exemplo 1 Delphi C++

FT_Purge( )
Esta funo limpa os bufferes de transmisso e recepo no dispositivo. Use-a antes de uma transmisso ou recepo, dependendo dos bits setados em dwMask. FT_STATUS FT_Purge(FT_HANDLE ftHandle, DWORD dwMask) Parmetros: ftHandle - Identificador do dispositivo. dwMask - podem ser usadas as constantes FT_PURGE_RX ou FT_PURGE_TX. Ou uma combinao das duas. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_Purge() - Exemplo 1 Delphi C++

FT_GetStatus( )
Obtm o estado do dispositivo, inclusive o nmero de caracteres recebidos na fila, nmero de caracteres transmitidos na fila, e o estado atual do evento. FT_STATUS FT_GetStatus(FT_HANDLE ftHandle, LPDWORD lpdwAmountInRxQueue, LPDWORD lpdwAmountInTxQueue, LPDWORD lpdwEventStatus) Parmetros: ftHandle - Identificador do dispositivo. lpdwAmountInRxQueue - Ponteiro para uma varivel do tipo DWORD para obter o nmero de caracteres da fila de recepo. lpdwAmountInTxQueue - Ponteiro para uma varivel do tipo DWORD para obter o nmero de caracteres da fila de transmisso. lpdwEventStatus - Ponteiro para uma varivel do tipo DWORD para obter o estado do evento atual. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito.

FT_Read( )
L dados de um dispositivo. FT_STATUS FT_Read(FT_HANDLE ftHandle, LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpdwBytesReturned) Parmetros: ftHandle - Identificador do dispositivo. lpBuffer - Ponteiro para um buffer armazenar os dados lidos do dispositivo. dwBytesToRead - Nmero de bytes que ser lido do dispositivo. lpdwBytesReturned - Ponteiro para uma varivel do tipo DWORD, para obter o nmero de bytes lidos no dispositivo. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. Exemplos: FT_GetStatus() e FT_Read( ) Delphi C++

FT_Write( )
Escreve dados para um dispositivo. FT_STATUS FT_Write(FT_HANDLE ftHandle, LPVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpdwBytesWritten) Parmetros: ftHandle - Identificador do dispositivo. lpBuffer - Ponteiro para um buffer onde contm os dados a serem escritos no dispositivo. dwBytesToWrite - Nmero de bytes a serem escritos no dispositivo. lpdwBytesWritten - Ponteiro para uma varivel do tipo DWORD, para obter o nmero de bytes escritos no dispositivo. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. Exemplo 1 - FT_Write() Delphi C++

FT_GetDeviceInfo( )
Obtm informaes sobre o dispositivo. FT_STATUS FT_GetDeviceInfo(FT_HANDLE ftHandle, FT_DEVICE *pftType, LPDWORD lpdwID, PCHAR pcSerialNumber, PCHAR pcDescription, PVOID pvDummy) Parmetros: ftHandle - Identificador do dispositivo. pftType - Ponteiro para um DWORD para armazenar o tipo do dispositivo. lpdwId - Ponteiro para um DWORD para armazenar o ID. pcSerialNumber - Ponteiro para uma string terminada em NULL, para armazenar o Nmero de Srie do dispositivo. pcDescription - Ponteiro para uma string terminada em null, para armazenar a Descrio. pvDummy - Reservado para uso futuro. Atribuir NULL. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. Exemplo 1 FT_GetDeviceInfo( ) Delphi C++

FT_CreateDeviceInfoList( )
Esta funo cria uma lista de informaes sobre os dispositivos e retorna o numero de dispositivos conectados ao sistema. Esta lista contm informaes sobres os dispositivos abertos. FT_STATUS FT_CreateDeviceInfoList(LPDWORD lpdwNumDevs) Parmetros: lpdwNumDevs - Ponteiro para uma varivel do tipo DWORD para armazenar o nmero de dispositivos conectados. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. Exemplo 1 FT_CreateDeviceInfoList( ) Delphi C++

FT_GetDeviceInfoList( )
Esta funo retorna uma lista de informaes e o nmero de dispositivos conectados. FT_STATUS FT_GetDeviceInfoList(FT_DEVICE_LIST_INFO_NODE *pDest, LPDWORD

lpdwNumDevs) Parmetros: pDest - Ponteiro para uma estrutura de array FT_DEVICE_LIST_INFO_NODE. lpdwNumDevs - Ponteiro para o nmero de elementos no array (nmero de dispositivos conectados). Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. Exemplo 1 - FT_GetDeviceInfoList( ) Delphi C++

FT_GetDeviceInfoDetail( )
Esta funo devolve uma entrada da lista de informao de dispositivo. FT_STATUS FT_GetDeviceInfoDetail(DWORD dwIndex, LPDWORD lpdwFlags, LPDWORD lpdwType, LPDWORD lpdwID, LPDWORD lpdwLocId, PCHAR pcSerialNumber, PCHAR pcDescription, FT_HANDLE *ftHandle) Parmetros: dwIndex - ndice da entrada na lista de informaes de dispositivos. lpdwFlags - Ponteiro para um DWORD para armazenar o valor do Flag. lpdwType - Ponteiro para um DWORD para armazenar o tipo do dispositivo. lpdwID - Ponteiro para um DWORD para armazenar o ID do dispositivo. lpdwLocId - Ponteiro para um DWORD para armazenar o ID local do dispositivo. pcSerialNumber - Ponteiro para uma string terminada em NULL, para armazenar o Nmero de Srie do dispositivo. pcDescription - Ponteiro para uma string terminada em null, para armazenar a Descrio. ftHandle - Ponteiro para uma varivel de tipo FT_HANDLE onde a Handle ser armazenado. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. Exemplo 1 FT_GetDeviceInfoDetail( ) Delphi C++

Funes da FT2DXX para controle das linhas do Modem


FT_GetModemStatus( ) Obtm o estado das linhas do modem do dispositivo. FT_STATUS FT_GetModemStatus(FT_HANDLE ftHandle, LPDWORD lpdwModemStatus) Parmetros: ftHandle - Identificador do dispositivo. lpdwModemStatus - Ponteiro para uma varivel do tipo DWORD para receber o estado das linhas do modem do dispositivo. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. Exemplo 1 - FT_GetModemStatus( ) Delphi C++

FT_ClrRts( ) Esta funo limpa o sinal de controle RTS (Request To Send). FT_STATUS FT_ClrRts(FT_HANDLE ftHandle) Parmetro: ftHandle - Identificador do dispositivo. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_SetRts( ) Esta funo seta o sinal de controle RTS (Request To Send). FT_STATUS FT_SetRts(FT_HANDLE ftHandle) Parmetro: ftHandle - Identificador do dispositivo. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_ClrDtr( ) Esta funo limpa o sinal de controle DTR (Data Terminal Ready). FT_STATUS FT_ClrDtr(FT_HANDLE ftHandle) Parmetro: ftHandle - Identificador do dispositivo. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_SetDtr( ) Esta funo seta o sinal de controle DTR (Data Terminal Ready). FT_STATUS FT_SetDtr(FT_HANDLE ftHandle) Parmetro: ftHandle - Identificador do dispositivo. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_SetBreakOn( ) Seta uma condio de BREAK para o dispositivo. FT_STATUS FT_SetBreakOn(FT_HANDLE ftHandle) Parmetro: ftHandle - Identificador do dispositivo. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_SetBreakOff( ) Reseta uma condio de BREAK para o dispositivo. FT_STATUS FT_SetBreakOff(FT_HANDLE ftHandle) Parmetro: ftHandle - Identificador do dispositivo. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. Exemplos: FT_ClrRts(), FT_SetRts(), FT_ClrDtr(), FT_SetDtr(), FT_SetBreakOn() e FT_SetBreakOff( ) Delphi C++

Funes da FT2DXX para programao da EEPROM


FT_EE_Program( ) Programa a EEPROM. FT_STATUS FT_EE_Program(FT_HANDLE ftHandle, PFT_PROGRAM_DATA lpData) Parmetros: ftHandle - Identificador do dispositivo. lpData - Ponteiro para uma estrutura do tipo FT_PROGRAM_DATA. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_EE_Program() - Exemplos 1 e 2 Delphi C++

FT_EE_ProgramEx( ) Programa a EEPROM passando strings separadamente. FT_STATUS FT_EE_ProgramEx(FT_HANDLE ftHandle, PFT_PROGRAM_DATA pData, char *Manufacturer, char * ManufacturerId, char *Description, char *SerialNumber) Parmetros: ftHandle - Identificador do dispositivo. pData - Pointer to a structure of type FT_PROGRAM_DATA. Manufacturer - Ponteiro para uma string terminada em NULL, que contm o Nome do fabricante. ManufacturerID - Ponteiro para uma string terminada em NULL, que contm o ID do fabricante. Description - Ponteiro para uma string terminada em NULL, que contm a Descrio do dispositivo. SerialNumber - Ponteiro para uma string terminada em NULL que contm o Nmero Serial do dispositivo. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito.
FT_EE_ProgramEx() Exemplo 1 Delphi C++

FT_EE_Read( ) L o contedo da EEPROM. FT_STATUS FT_EE_Read(FT_HANDLE ftHandle, PFT_PROGRAM_DATA lpData) Parmetros: ftHandle - Identificador do dispositivo. lpData - Ponteiro para uma estrutura do tipo FT_PROGRAM_DATA. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_EE_Read() - Exemplo 1 Delphi C++

FT_EE_ReadEx( ) L o contedo da EEPROM passando strings separadamente.

FT_STATUS FT_EE_ReadEx(FT_HANDLE ftHandle, PFT_PROGRAM_DATA pData, char *Manufacturer, char *ManufacturerId, char *Description, char *SerialNumber) Parmetros: ftHandle - Identificador do dispositivo. pData - Pointer to a structure of type FT_PROGRAM_DATA. Manufacturer - Ponteiro para uma string terminada em NULL, que contm o Nome do fabricante. ManufacturerID - Ponteiro para uma string terminada em NULL, que contm o ID do fabricante. Description - Ponteiro para uma string terminada em NULL, que contm a Descrio do dispositivo. SerialNumber - Ponteiro para uma string terminada em NULL que contm o Nmero Serial do dispositivo. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_EE_ReadEx() Exemplo 1 Delphi C++

FT_ReadEE( ) L um valor num determinado endereo da EEPROM. FT_STATUS FT_ReadEE(FT_HANDLE ftHandle, DWORD dwWordOffset, LPWORD lpwValue) Parmetros: ftHandle - Identificador do dispositivo. dwWordOffset - Endereo a ser lido na EEPROM. lpwValue - Ponteiro para uma varivel DWORD armazenar o valor lido na EEPROM. Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_EE_ReadEE() Exemplo 1 Delphi C++

FT_WriteEE( ) Escreve um valor num determinado endereo da EEPROM. FT_STATUS FT_WriteEE(FT_HANDLE ftHandle, DWORD dwWordOffset, WORD wValue) Parmetros: ftHandle - Identificador do dispositivo. dwWordOffset - Endereo para escrever na EEPROM. wValue - Valor a ser escrito na EEPROM. Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_EE_WriteEE() Exemplo 1 Delphi C++

FT_EraseEE( ) Apaga TODO o contedo da EEPROM, inclusive o espao livre do usurio. FT_STATUS FT_EraseEE(FT_HANDLE ftHandle) Parmetro: ftHandle - Identificador do dispositivo. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito.
FT_EraseEE() - Exemplo 1 Delphi C++

Funes da FT2DXX para programao da EEPROM (rea livre do usurio)


FT_EE_UASize( ) Obtm o tamanho EEUA (rea livre da EEPROM para uso pelo usurio). FT_STATUS FT_EE_UASize(FT_HANDLE ftHandle, LPDWORD lpdwSize) Parmetro: ftHandle - Identificador do dispositivo. lpdwSize - Ponteiro para uma varivel do tipo DWORD que receber o tamanho em bytes da EEUA. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito.
FT_EE_UAWrite( ) Escreve dados dentro da EEUA (rea livre da EEPROM para uso pelo usurio). FT_STATUS FT_EE_UAWrite(FT_HANDLE ftHandle, PUCHAR pucData, DWORD dwDataLen) Parmetros: ftHandle - Identificador do dispositivo. pucData - Ponteiro para um buffer que contm os dados a serem escritos. dwDataLen - Tamanho em bytes do buffer que contm os dados a serem escritos. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_EE_UARead( ) L o contedo da EEUA (rea livre da EEPROM para uso pelo usurio). FT_STATUS FT_EE_UARead(FT_HANDLE ftHandle, PUCHAR pucData, DWORD dwDataLen, LPDWORD lpdwBytesRead) Parmetros: ftHandle - Identificador do dispositivo. pucData - Ponteiro para um buffer para armazenar os dados lidos. dwDataLen - Tamanho em bytes do buffer que ir armazenar os dados lidos. lpdwBytesRead - Ponteiro para uma varivel do tipo DWORD que contm o nmero de bytes lidos. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. Exemplos: FT_EE_UASize( ), FT_EE_UAWrite( ) e FT_EE_UARead( ) Delphi C++

Funes de programao em modo Bit Bang


possvel atravs do FT232BM, enviar e receber 8 bits de forma paralela, usando o modo bit bang. Esse recurso do chip uma mo-na-roda para queles que no desejam usar um microcontrolador em seus projetos, com o objetivo de utilizar o UART do mesmo, para se comunicar de forma serial com o FT232BM, atravs dos pinos TXD e RXD. No modo bit bang como se estivssemos trabalhando com a Porta Paralela bidirecional EPP do PC, ou ainda, com se estivssemos usando uma porta de um microcontrolador (PIC, ATMEL etc), onde se possvel definir independentemente, um pino do outro, como entrada ou sada. Fazemos isso da mesma forma no modo bit bang, com a diferena de que no FT232BM possvel tambm definir uma velocidade (baud rate) para a porta. Ao trabalhar com o FT232BM no modo bit bang, ficam disponveis 8 pinos para uso como entradas ou sadas. Veja abaixo a relao dos pinos com a ordem dos bits:
Tabela 1 - Pinos do FT232BM no modo bit bang Pinos no FT232BM TXD RXD RTS# CTS# DTR# DSR# DCD# RI# Ordem dos bits D0 D1 D2 D3 D4 D5 D6 D7

Obs.: Alguns pinos da tabela cima so resetados no FT232BM quando o computador reiniciado, mesmo que o circuito seja Self powered (alimentado com fonte externa). Se desejar construir um circuito que no seja resetado quando o computador reiniciado, use microcontrolador para receber e validar somente os comandos pr-estabelecidos no programa.
FT_SetBitMode( ) FT_STATUS FT_SetBitMode(FT_HANDLE ftHandle, UCHAR ucMask, UCHAR ucEnable) Parmetros: ftHandle - Identificador do dispositivo. ucMask - Valor requerido para a mscara de bits. ucEnable - Habilita valor, 0 = FALSE, 1 = TRUE. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_GetBitMode( ) Obtm instantaneamente um valor do Bus de dados. FT_STATUS FT_GetBitMode(FT_HANDLE ftHandle, PUCHAR pucMode) Parmetros: ftHandle - Identificador do dispositivo. pucMode Ponteiro para UCHR (unsigned char) para armazenar o valor dos bits lido. Retorna:

Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_SetLatencyTimer( ) Seta a latncia do timer. FT_STATUS FT_SetLatencyTimer(FT_HANDLE ftHandle, UCHAR ucTimer) Parmetros: ftHandle - Identificador do dispositivo. ucTimer - Valor em milisegundos da latncia do timer. Limite vlido: 2 - 255ms. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. FT_GetLatencyTimer( ) Obtm o valor corrente da latncia do timer. FT_STATUS FT_GetLatencyTimer(FT_HANDLE ftHandle, PUCHAR pucTimer) Parmetros: ftHandle - Identificador do dispositivo. pucTimer - Ponteiro para uma varivel do tipo UCHAR (unsigned char) para armazenar o valor da latncia do timer. Retorna: Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a funo no teve xito. Exemplos: FT_SetBitMode( ), FT_GetBitMode( ) e FT_SetLatencyTimer( ) Delphi Figura 1 - Tela do programa para controlar o Circuito 1 C++

Figura 2 - Circuito controlado pelo modo Bit Bang

No circuito acima, os pinos 25, 24, 23 e 22 so usados como sadas, e os pinos 21, 20, 19 e 18 como entradas. Os pinos estabelecidos como entradas ou sadas so definidos no segundo parmetro da funo FT_SetBitMode() no programa. Os resistores pull-down de 10K conectados aos pinos 21, 20, 19 e 18 do FT232BM so usados para fazer com que as entradas trabalhem com lgica positiva.

Para conhecer mais funes da dll FTD2xx, faa download da guia de programao D2XXPG30.pdf no site da FTDI:
http://www.ftdichip.com/Documents/ProgramGuides/D2XXPG30.pdf

Projetos prticos
Nesta aula esto disponveis dois projetos onde foram aplicados os conhecimentos adquiridos nas aulas anteriores. So projetos bsicos que pode ser agregados a projetos maiores. Um dos projetos apresentado aqui um controle de Rels que poder ser usado como base para ligar ou desligar qualquer outro atuador. O outro um termmetro que utiliza o sensor de temperatura LM35 da National Semiconductor, conectado a uma entrada analgica do PIC16F877. Com algumas mudanas possvel agregar aos projetos um protocolo mais eficiente para garantir a segurana, tendo certeza de que o dispositivo tenha sido ligado ou desligado corretamente, ou obtido a informao sem erro.

Controlando Rels
O objetivo desse projeto ligar e desligar at 8 rels atravs de um circuito microcontrolado, conectado ao Bus USB e controlado por um programa no PC.

Para esse projeto so necessrios dois programas: um que ir rodar no PIC16F877 e o outro no PC.
Figura 1 - Tela do programa controle de rels

O programa acima pode ligar ou desligar at 8 dispositivos, e funciona da seguinte forma: quando pressionamos um boto, uma string de comandos enviada pelo programa ao FT232BM, esse por sua vez envia a string para o PIC16F877. O programa que est em execuo dentro do PIC16F877 compara se a string recebida vlida, se for, executa uma ao que depende do contedo da mesma (ligar ou desligar o dispositivo). Se a string de comando foi vlida, o PIC16F877 envia uma resposta ao programa no PC, informando que o rel foi ligado ou desligado. O programa no PIC s garante se um pino foi ligado ou desligado corretamente, mas no se realmente o rel foi ligado ou desligado. Para isso, seria necessrio adicionar mais componentes ao projeto, como sensores ligados aos rels para informar ao PIC atravs de pinos de entradas, que os rels foram de verdade ligados ou desligados.
Download do programa: Delphi C++

Figura 2 - Circuito para controle de Rels

No circuito acima foi usado um driver ULN 2803 com 8 entradas TTL e 8 sadas que podem controlar at 45v/500mA. No nosso caso o ULN2803 alimentado com 12v para poder controlar os Rels tambm de 12v. Cada rel consome em torno de 50mA; quando todos os rels estiverem acionados o consumo total de 400mA (8 rels x 50mA). Assim o ULN2803 trabalha com uma folga de 100mA. O dispositivo FT232BM deve ser configurado para trabalhar como selfpowered (alimentado com uma fonte externa). Uma configurao self-powered necessria para que os rels no sejam resetados quando o computador for desligado/ligado. O boto Reset e o LED1 so opcionais. O Reset serve para reiniciar o PIC e o LED1 para informar que o programa gravado no PIC est em execuo.

Figura 3 - Driver para controle de um Rel

Se desejar controlar 8 rels, adicione 8 circuitos idnticos ao da Figura 3 s sadas (RL1 a RL8) do ULN2803. Os rels so acionados com 12v e seus contatos suportam at 10A/220v.
Figura 4 - Regulador de tenso

O circuito acima um regulador de tenso usado para alimentar o PIC e o dispositivo FT232BM a partir de uma fonte de 12v. Os 12v so usados somente para alimentar os Rels e as sadas do ULN2803.

Observe com ateno, pois temos duas voltagens (5v e 12v). O PIC e o FT232BM devem ser alimentados com 5v. O 0v deve ser comum em todos os circuitos. DownLoad do programa Controle de Rels para gravar o PIC16F877.
Fonte 1 CCS Compiler - Programa para ser compilado e gravado dentro do PIC16F877

//Controle de Rels //Curso USB/Serial //www.rogercom.com //-----------------------------------------------------------------------------------------------------#include <16F877.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #use delay(clock=4000000) #fuses XT, PUT, NOWDT, NOBROWNOUT, NOLVP #use rs232(BAUD=9600, parity=N, BITS=8, XMIT=pin_c6, RCV=pin_c7) #define MAX_BUFFER 15 char BufferRX[MAX_BUFFER+1]; boolean CHEGOU_COMANDO = false; //-------------------------------------------------------------------------//Interrupo de recebimento de caracter pela UART. //--------------------------------------------------------------------------#int_rda void Serial_Recebe_Car() { static unsigned char ch; static int IndexBuf=0; ch = getc(); //Pega o caracter no registrador da UART. BufferRX[IndexBuf] = ch; //Guarda o caracter no buffer. if( BufferRX[IndexBuf] == '*' ) //Se o fim da string de comando. { BufferRX[IndexBuf+1] = '\0'; //Finaliza sting. IndexBuf = 0; CHEGOU_COMANDO = true; //Avisa que chegou uma string de comando. }else{ IndexBuf++; } if( (BufferRX[0] != '>' ) || (IndexBuf >= MAX_BUFFER) ) { IndexBuf = 0; } } //-------------------------------------------------------------//Para fazer o LED piscar. #int_timer0 void MeuTimer() { static boolean led; static int conta; set_timer0(131-get_timer0()); conta++; if(conta == 125) { conta=0;

led = !led; output_bit(pin_d1, led); //pisca o LED1 } } //-------------------------------------------------------------//Programa Principal. void main(void) { char COMANDO[15]; set_timer0(131); setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64); enable_interrupts(int_rda); //Habilita interrupo de recebimento. enable_interrupts(int_timer0); enable_interrupts(GLOBAL); //Habilita registrador de interrupo. set_tris_d(0b00000000); //Todos os pinos da porta D como sadas. set_tris_b(0b00000000); //Todos os pinos da porta B como sadas. output_b(0b00000000); //Desliga todos os pinos da porta B. while( true ) //Loop infinito. { if(CHEGOU_COMANDO == true) { CHEGOU_COMANDO = false; strcpy(COMANDO,">CMD#01#ON*"); if( strcmp(BufferRX,COMANDO) == 0) { output_high(pin_b0); //Liga Rel 1. printf("Rel #1 LIGADO\r\n"); continue; //volta para o incio do loop while(). } strcpy(COMANDO,">CMD#01#OFF*"); if(strcmp(BufferRX,COMANDO) == 0) { output_low(pin_b0); //Desliga Rel 1. printf("Rel #1 DESLIGADO\r\n"); continue; } //-------------------------------------------------------------strcpy(COMANDO,">CMD#02#ON*"); if( strcmp(BufferRX,COMANDO) == 0) { output_high(pin_b1); //Liga LED. printf("Rel #2 LIGADO\r\n"); continue; } strcpy(COMANDO,">CMD#02#OFF*"); if(strcmp(BufferRX,COMANDO) == 0) { output_low(pin_b1); //Desliga LED. printf("Rel #2 DESLIGADO\r\n"); continue; }

//-------------------------------------------------------------strcpy(COMANDO,">CMD#03#ON*"); if( strcmp(BufferRX,COMANDO) == 0) { output_high(pin_b2); //Liga LED. printf("Rel #3 LIGADO\r\n"); continue; } strcpy(COMANDO,">CMD#03#OFF*"); if(strcmp(BufferRX,COMANDO) == 0) { output_low(pin_b2); //Desliga LED. printf("Rel #3 DESLIGADO\r\n"); continue; } //-------------------------------------------------------------strcpy(COMANDO,">CMD#04#ON*"); if( strcmp(BufferRX,COMANDO) == 0) { output_high(pin_b3); //Liga LED. printf("Rel #4 LIGADO\r\n"); continue; } strcpy(COMANDO,">CMD#04#OFF*"); if(strcmp(BufferRX,COMANDO) == 0) { output_low(pin_b3); //Desliga LED. printf("Rel #4 DESLIGADO\r\n"); continue; } //-------------------------------------------------------------strcpy(COMANDO,">CMD#05#ON*"); if( strcmp(BufferRX,COMANDO) == 0) { output_high(pin_b4); //Liga LED. printf("Rel #5 LIGADO\r\n"); continue; } strcpy(COMANDO,">CMD#05#OFF*"); if(strcmp(BufferRX,COMANDO) == 0) { output_low(pin_b4); //Desliga LED. printf("Rel #5 DESLIGADO\r\n"); continue; } //-------------------------------------------------------------strcpy(COMANDO,">CMD#06#ON*"); if( strcmp(BufferRX,COMANDO) == 0) { output_high(pin_b5); //Liga LED. printf("Rel #6 LIGADO\r\n"); continue; } strcpy(COMANDO,">CMD#06#OFF*"); if(strcmp(BufferRX,COMANDO) == 0) { output_low(pin_b5); //Desliga LED. printf("Rel #6 DESLIGADO\r\n"); continue; }

//-------------------------------------------------------------strcpy(COMANDO,">CMD#07#ON*"); if( strcmp(BufferRX,COMANDO) == 0) { output_high(pin_b6); //Liga LED. printf("Rel #7 LIGADO\r\n"); continue; } strcpy(COMANDO,">CMD#07#OFF*"); if(strcmp(BufferRX,COMANDO) == 0) { output_low(pin_b6); //Desliga LED. printf("Rel #7 DESLIGADO\r\n"); continue; } //-------------------------------------------------------------strcpy(COMANDO,">CMD#08#ON*"); if( strcmp(BufferRX,COMANDO) == 0) { output_high(pin_b7); //Liga LED. printf("Rel #8 LIGADO\r\n"); continue; } strcpy(COMANDO,">CMD#08#OFF*"); if(strcmp(BufferRX,COMANDO) == 0) { output_low(pin_b7); //Desliga LED. printf("Rel #8 DESLIGADO\r\n"); continue; } //-------------------------------------------------------------} } }

O programa acima l uma string de comandos atravs da interrupo #int_rda (pino RX do PIC) at encontrar o caracter asterisco '*', que indica final de string em nosso simples protocolo. Aps detectar esse caracter, a varivel global CHEGOU_COMANDO fica igual a true, e a string BufferRx contm o comando recebido. No loop while() do programa principal o comando if(CHEGOU_COMANDO == true) se torna verdade e um processo de comparao acionado. Se uma string, por exemplo: ">CMD#08#ON*" for igual ao contedo recebido e armazenado na varivel BufferRx, o pino pin_b7 vai a nvel alto, ligando o Rel #8 e logo em seguida enviada a string de confirmao: "Rel #8 LIGADO\r\n" para o programa no PC. No era necessrio usar o comando strcpy() no programa acima, mais foi preciso pois a funo strcmp() da CCS s compara duas variveis e no constantes " ". Poderiamos ter armazenado as constantes na memria para eliminar a funo strcpy() mas a verso Trial 30 dias da CCS s reserva o mnimo de memria RAM para os programas.

Sensor de Temperatura
O projeto termmetro aqui apresentado baseado no sensor de temperatura LM35. Existem no mercado vrios tipos de sensores de temperatura como NTSCs, diodos e muitos outros. O LM35 um sensor de temperatura de altssima preciso fabricado pela National Semiconductor. Sua gama de preciso de 10mV (milivolts) por cada grau Celsius de temperatura, e pode trabalhar com voltagens entre 4 a 30v. Drena menos de 60uA. Para mais informaes tcnicas sobre o LM35, acesse o site do fabricante em: http://www.national.com e faa download do Datasheet.

Figura 5 - Tela do programa sensor de Temperatura

O programa acima exibe numa ampola (componente ProgressBar) a temperatura ambiente a cada 1 segundo aps o boto "Abrir USB" ter sido pressionado. A partir desse ponto qualquer alterao na temperatura o sensor LM35 detecta, e atravs do pino RA0 (analgico) do PIC 16F877, a temperatura convertida em dados digitais e transferidos para o computador atravs do FT232BM usando o Bus USB. A temperatura mostrada em graus Celsius (C).
Download do programa: Delphi C++

Figura 6 - Pinagem LM35

Figura 7 - Circuito sensor de temperatura atravs do LM35

No circuito acima, a sada do sensor de temperatura LM35 est conectado ao pino 2 - RA0 (Canal 0) do PIC16F877. Como no circuito de Controle de Rels o boto Reset e o LED1 so opcionais.

DownLoad do programa Sensor de Temperatura para gravar o PIC16F877.


Fonte 2 - CCS Compiler - Programa que ler o canal 0 analgico e envia os dados para o FT232BM //Curso USB/Serial. //Sensor de temperatura usando o CI LM35 //www.rogercom.com #include <16F877.h> #device ADC=10 //Canal analgico de 10 bits. #include <stdio.h> #use delay(clock=4000000) #fuses XT, PUT, NOWDT, NOBROWNOUT, NOLVP #use rs232(BAUD=9600, parity=N, BITS=8, XMIT=pin_c6,

RCV=pin_c7) //Para fazer o LED piscar. #int_timer0 void MeuTimer() { static boolean led; static int conta; set_timer0(131-get_timer0()); conta++; if(conta == 125) { conta=0; led = !led; output_bit(pin_d1,led); } } //--------------------------------------------------------------------------//Programa Principal. //--------------------------------------------------------------------------long Temperatura; long valor; void main(void) { setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(RA0_ANALOG); //Todas as porta A como analgicas set_adc_channel(0); //Canal 0 selecionado como entrada analgica. set_timer0(131); setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64); enable_interrupts(int_timer0); enable_interrupts(GLOBAL); //Habilita registrador de interrupo. set_tris_d(0b00000000); //todos os pinos da porta D como sadas. while( true ) //Loop infinito. { delay_ms(1000); //A cada 1 segundos. valor = read_adc(); //L o canal 0 - pino RA0 analgico. Temperatura = 2+100 * valor / 303; //Calcula a temperatura em graus Celsius. //Temperatura = 5 * valor * 100 / 1023; //Calcula a temperatura em graus Celsius. //printf("%2Lu C - %2Lu\r\n", Temperatura, valor); printf("%2Lu\r\n",Temperatura); //Envia para a porta serial. } }

No programa acima o comando #device ADC=10 define que o PIC usa um conversor analgico/digital de 10 bits de resoluo. J a funo setup_adc_ports(RA0_ANALOG); define que o pino 2 (Canal 0) uma entrada analgica. A funo setup_adc(ADC_CLOCK_INTERNAL) diz ao PIC que o sistema de converso usa um sinal de clock interno.

O valor da temperatura obtido atravs da funo read_adc(). A frmula (Temperatura = 5 * valor * 100 / 1023) a responsvel por converter o valor digital obtido, em Graus Celsius (C). Os dados so enviados para o FT232BM pela funo printf("%2Lu\r\n",Temperatura);. "Lu" significa unsigned long (nmero inteiro longo sem sinal).

Projetos prticos Sensor de luminosidade


Este um projeto base para ser agregado a novos projetos que, por algum motivo, precise medir a intensidade da luz num ambiente. O valor da luminosidade obtido atravs de um LDR (Resistor Dependente de Luz) conectado a um dos canais analgicos do PIC16F877. Nenhuma frmula matemtica foi usada para converter o valor obtido do canal analgico, em uma informao padro. Esse valor pode variar entre 0 a 1023 (10 bits de resoluo), dependendo da intensidade da luz. Quanto maior for a intensidade da luz exposta sobre o LDR, maior ser o valor obtido. Neste projeto iremos explorar a programao no PC atravs das funes da dll FTD2XX.DLL para se comunicar com o FT232BM; plotagem de grficos avanados usando o componente TChar, e programao do PIC16F877 para ler o LDR e se comunicar com o FT232BM.
Figura 1 - Tela do programa Sensor de Luminosidade

O grfico acima foi criado em tempo de edio do cdigo fonte, atravs do componente TChar do Delphi ou do C++Builder. O componente TChar pode ser configurado de forma totalmente interativa, tornando o aprendizado deste

muito rpido. Tudo que se faz de forma interativa no TChar pode ser feito em nvel de programao. Na figura do programa acima, a luminosidade diminui quando a curva tende a ir para a parte inferior da janela grfica (azul mais escuro), e aumenta quando tende a ir para a parte superior (azul mais claro).
Download do programa: Delphi C++

LDR (Resistor dependente de Luz). Sua resistncia diminui de acordo com a quantidade de luz exposta sobre sua superfcie. No escuro, a resistncia do LDR altssima impedindo a passagem da corrente entre seus terminais.
Figura 2 - Circuito sensor de luminosidade atravs de um LDR

No circuito acima, um dos terminais do sensor de luminosidade LDR est conectado ao pino 2 - RA0 (Canal 0) do PIC16F877. O capacitor C1 e o resistor de pull down R2 so usados para estabilizar e manter um nvel de tenso adequada no pino RA0. O dispositivo FT232BM foi configurado como self-powered, mas voc pode configur-lo como Bus-powered, pois todo o circuito alimentado com 5v e o consumo de corrente em torno de 20mA.

Como no circuito de Controle de Rels, o boto Reset e o LED1 so opcionais.

DownLoad do programa Sensor de Luminosidade para gravar o PIC16F877.


Fonte 1 - CCS Compiler - Programa Sensor de Luminosidade para gravar o PIC16F877

//Curso USB/Serial. //Sensor de luminosidade usando LDR (Resistor Dependente de Luz). //www.rogercom.com #include <16F877.h> #device ADC=10 //Canal analgico de 10 bits. #include <stdio.h> #use delay(clock=4000000) //Cristal de 4Mhz. #fuses XT, PUT, NOWDT, NOBROWNOUT, NOLVP #use rs232(BAUD=9600, parity=N, BITS=8, XMIT=pin_c6, RCV=pin_c7) //Para fazer o LED1 piscar. #int_timer0 void MeuTimer() { static boolean led; static int conta; set_timer0(131-get_timer0()); conta++; if(conta == 125) // ~1 segundo. { conta=0; led = !led; output_bit(pin_d1, led); //liga/deliga LED1. } } //--------------------------------------------------------------------------//Programa Principal. //--------------------------------------------------------------------------void main(void) { long Luminosidade; //Para armazenar o valor digital da luminosidade. setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(RA0_ANALOG); //Todas as porta A como analgicas set_adc_channel(0); //Canal 0 selecionado como entrada analgica. set_timer0(131); setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64); enable_interrupts(int_timer0); enable_interrupts(GLOBAL); //Habilita registrador de interrupo. set_tris_d(0b00000000); //todos os pinos da porta D como sadas. while( true ) //Loop infinito. { delay_ms(60); //A cada 60 milisegundos. Luminosidade = read_adc(); //L o canal 0 - pino RA0 analgico. printf("%04Lu\r\n", Luminosidade); //Envia para a porta serial. } }

No programa acima o comando #device ADC=10 define que o PIC usa um conversor analgico/digital de 10 bits de resoluo. J a funo setup_adc_ports(RA0_ANALOG); define que o pino 2 (Canal 0) uma entrada analgica. A funo setup_adc(ADC_CLOCK_INTERNAL) diz ao PIC que o sistema de converso usa um sinal de clock interno. O valor da luminosidade obtido atravs da funo read_adc() a cada 60 ms (delay_ms(60) ). Os dados so enviados para o FT232BM pela funo printf("%04Lu\r\n",Luminosidade);. "Lu" significa unsigned long (nmero inteiro longo sem sinal).

Controle de Motor de Passo


Este projeto tem como principal objetivo o controle de um motor de passo unipolar, alimentado com 12v /300mA. Para controlar um motor que consuma mais corrente preciso substituir o driver ULN2003 por um outro driver de maior potncia. possvel tambm criar um driver com transistores de potncia. O motor controlado por um programa no PIC16F877 e comandado por um outro programa que roda no PC. A partir do programa no PC possvel enviar comandos para aumentar ou diminuir a velocidade do motor, faze-lo girar no sentido horrio ou anti-horrio, par-lo ou deslig-lo. Ou seja, o que realmente o programa faz passar parmetros para o PIC16F877 controlar o motor. Mesmo que o computador seja desligado o motor continua funcionando, conforme os ltimos parmetros passados para o PIC16F877.

Figura 3 - Tela do programa Controle de Motor de Passo

Veja o significado da string de comandos que o programa cima envia para o PIC16F877 controlar o motor:
Figura 4 - Formato da string de comando do motor

Para comandar o motor, o programa que roda no PC envia uma string conforme a mostrada na figura acima. O caracter '>' indica que a seqncia de caracteres a seguir vlida, e o caracter '*' sinaliza o fim da string de comandos. O caracter '#' usado para separar os comandos dentro da string. O caracter 'S' deve ser substitudo pela letra H (horrio) ou A (Anti-horrio) que representam o sentido da rotao do motor. O caracter 'X' deve ser substitudo por uma das letras: I (Incia motor - o faz girar); P (pra o motor, mas o mesmo continua energizado) ou D (desligar o motor, mantendo-o desernegizado). J os trs caracteres 'VVV' devem ser substitudos por um nmero entre 5 a 255, representando o tempo de cada passo em milisegundos. Quanto menor for esse nmero maior ser a velocidade do motor. Veja na tabela abaixo os detalhes da string.

Tabela 1 - Detalhe do formato da string de comandos

Comandos Descrio

>
S

Indica incio da string H - Horrio A - Anti-horrio I - Inicia motor (faz girar) P - Pra motor (continua Pra, inicia ou desliga o energizado) motor: D - Desliga motor (desernegizado) Tempo de cada passo em milisegundos (5 a 255). Ou seja, a velocidade de rotao do motor. Indica fim da string. Direo da rotao: Separador de comandos.

VVV

*
#

Download do programa: Delphi C++

O driver ULN 2003 tem 7 entradas que podem controlar at 7 sadas. Com ele poderemos controlar um motor de passo.
Figura 5 - Pinagem do driver ULN 2003

Figura 6 - Circuito para controle de Motor de Passo

No circuito acima o motor de passo controlado pelos pinos 40, 39, 38 e 37 do PIC conectados ao ULN 2003. Os 4 LEDs conectados aos mesmos pinos servem para visualizar a seqncia de pulsos gerados pelo PIC para controlar o motor. O driver ULN deve ser alimentado com 12v, e o negativo deve ser ligado ao 0v da fonte que alimenta o resto do circuito. A funo do diodo proteger a fonte de alimentao e o prprio driver. Use o circuito da Figura 7 para alimentar tanto o motor de passo como o PIC e o FT232BM. Mas preste muita ateno na sada de 12v que deve ser usada somente para alimentar o driver ULN.

Figura 7 - Regulador de tenso

DownLoad do programa Controle de Motor de Passo para gravar o PIC16F877.


Fonte 2 - CCS Compiler - Programa Controle de Motor de Passo para gravar o PIC16F877

//Curso USB/Serial. //Controle de Motor de Passo. //www.rogercom.com //rogercom@rogercom.com //--------------------------------------------------------------------------#include <16F877.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_PASSO 3 //0-3 (total 4 passos). #use delay(clock=4000000) #fuses XT, PUT, NOWDT, NOBROWNOUT, NOLVP #use rs232(BAUD=9600, parity=N, BITS=8, XMIT=pin_c6, RCV=pin_c7) #define MAX_BUFFER 15 char BufferRX[MAX_BUFFER+1]; boolean CHEGOU_COMANDO = false; //------------------------------------------------------------------------------------------//Esta funo converte uma string de caracteres em um valor do Tipo int16. //Com a necessidade de converter somente nmeros inteiros sem sinal na base decimal, //desprezei o uso da funo atoi() da biblioteca padro por ter seu cdigo fonte muito //grande. Esta funo retorna 0 (zero) se houver erro na converso. //------------------------------------------------------------------------------------------unsigned int16 StrToInt(char *s) { unsigned int16 Resultado=0; unsigned int index=0; char Car; if(s) //omite todos os caracteres alfanumricos, se existir na string. Car = s[index++]; while(Car >= '0' && Car <= '9') { Resultado = 10*Resultado + (Car - '0'); Car = s[index++]; } return(Resultado); } //--------------------------------------------------------------------------//Interrupo de recebimento de caracter pela UART. #int_rda void Serial_Recebe_Car() { static unsigned char ch; static int IndexBuf = 0; ch = getc(); //Pega o caracter no registrador da UART. BufferRX[IndexBuf] = ch; //Guarda o caracter no buffer. if( BufferRX[IndexBuf] == '*' ) //Se o fim da string de comando. { BufferRX[IndexBuf+1] = '\0'; //Finaliza sting. IndexBuf = 0; CHEGOU_COMANDO = true; //Avisa que chegou uma string de comando. }else

IndexBuf++; if( (BufferRX[0] != '>' ) || (IndexBuf >= MAX_BUFFER) ) //Caracter de incio. IndexBuf = 0; } //--------------------------------------------------------------------------//Pisca LED1 indicando que o PIC est em execuo. #int_timer0 void MeuTimer() { static boolean led; static int conta; set_timer0(131-get_timer0()); conta++; if(conta == 125) //+- 1 segundo. { conta = 0; led = !led; output_bit(pin_d1, led); } } //--------------------------------------------------------------------------//Gira motor no sentido horrio. void MotorHorario(int nibble) { output_bit(pin_b7, bit_test(nibble, 0) ); output_bit(pin_b6, bit_test(nibble, 1) ); output_bit(pin_b5, bit_test(nibble, 2) ); output_bit(pin_b4, bit_test(nibble, 3) ); } //--------------------------------------------------------------------------//Gira motor no sentido anti-horrio. void MotorAntiHorario(int nibble) { output_bit(pin_b7, bit_test(nibble, 3) ); output_bit(pin_b6, bit_test(nibble, 2) ); output_bit(pin_b5, bit_test(nibble, 1) ); output_bit(pin_b4, bit_test(nibble, 0) ); } //--------------------------------------------------------------------------//Desliga todas as bobinas do motor. void MotorDesligado(void) { output_bit(pin_b7, 0); output_bit(pin_b6, 0); output_bit(pin_b5, 0); output_bit(pin_b4, 0); } //--------------------------------------------------------------------------//Programa Principal. void main(void) { //char Passos[4] = {8,4,2,1}; //Passo completo 1. char Passos[4] = {12,6,3,9}; //Passo completo 2. int index=0; //ndice para a matriz de passos. char MotorDirecao = 'H'; //Direo do motor - Horrio/anti-horrio. char MotorOnOff = 'D'; //Liga/desliga motor. char MotorVelo[6]; //Velocidade do motor.

int TempoPasso = 10;

//Tempo de cada passo (velocidade).

set_timer0(131); setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64); enable_interrupts(int_rda); //Habilita interrupo de recebimento. enable_interrupts(int_timer0); enable_interrupts(GLOBAL); //Habilita registrador de interrupo. set_tris_d(0b00000100); //somente o pino 2 da porta 'D' como entrada. set_tris_b(0b00000000); //Todos sada. output_b(0b00000000); //Todos os pinos de sada da porta b desligados. while( true ) //Loop infinito. { if(CHEGOU_COMANDO == true) //Se chegou uma string vlida. { CHEGOU_COMANDO = false; //torna o if acima falso. //String de comando: ">#x#x#xxx*" MotorOnOff = BufferRX[2]; //Motor: Ligado/Desligado. MotorDirecao = BufferRX[4]; //Direo: Horrio/Anti-horrio. MotorVelo[0] = BufferRX[6]; //Velocidade do motor. MotorVelo[1] = BufferRX[7]; //Velocidade do motor. MotorVelo[2] = BufferRX[8]; //Velocidade do motor. MotorVelo[3] = '\0'; //finaliza a string MotorVelo do motor. TempoPasso = StrToInt(MotorVelo); //Converte velocidade para inteiro. if(TempoPasso == 0) //Se houve erro na converso. TempoPasso = 5; //Define velocidade mnima como padro. printf("Configurado: %s\r\n", BufferRX); //Envia status via TXD. } if(MotorOnOff == 'I') //Se recebeu um comando de 'I' - Iniciar. { delay_ms(TempoPasso); //Aguarda um tempo para cada posso. if(MotorDirecao == 'H') //Se recebeu um comando 'H' - Horrio. MotorHorario( Passos[index] ); else if(MotorDirecao == 'A') //Se recebeu um comando 'A' - Antihorrio. MotorAntiHorario( Passos[index] ); if(index >= MAX_PASSO) //Controla os passos (ndice da matriz).. index = 0; else index++; //incrementa para o prximo passo. } if(MotorOnOff == 'D') //Se recebeu um comando 'D' - Desliga. MotorDesligado(); //Desliga todas as bobinas do motor. } }

No programa acima, quando uma string de comandos recebida pelo PIC, a varivel global CHEGOU_COMANDO fica igual a true e o contedo da string BufferRX separado em campos independentes, usados para configurar o motor. A matriz Passos armazena os nmeros da seqncia de passos para girar o motor no sentido horrio ou anti-horrio. Para criar as funes MotorHorario() e MotorAntiHorario() foram usadas as funes output_bit() e bit_test(). A funo bit_test() checa se um bit numa determinada varivel esta ligado ou desligado, retornando um valor 0 ou 1. Exemplos: char resultado; char valor = 1; //0000-0001. resultado = bit_test(valor, 0); //testa se o bit 0 da varivel valor est ligado ou desligado. No exemplo acima a funo bit_test() retorna 1, pois o bit 0 da varivel valor 1. Outro exemplo: char resultado; char valor = 128; //1000-0000. resultado = bit_test(valor, 7); //Retorna 1, pois o valor do bit 7 1. Ento: char valor = 12; //0000-1100. output_bit(pin_b7, bit_test(valor, 0) ); //desliga o pino b7. output_bit(pin_b6, bit_test(valor, 1) ); //desliga o pino b6. output_bit(pin_b5, bit_test(valor, 2) ); //liga o pino b5. output_bit(pin_b4, bit_test(valor, 3) ); //liga o pino b4. Na realidade, o que a funo bit_test() faz l o estado de um bit numa varivel, retornando 0 ou 1 para a funo output_bit() ligar ou desligar um determinado pino. Outras tcnicas podem ser usadas para controlar o motor, s depende da sua criatividade.

Informaes bsicas sobre motor de passo Motores de passos so dispositivos mecnicos eletromagnticos que podem ser controlados digitalmente atravs de um hardware especfico ou atravs de softwares. Nessa aula iremos aprender a construir drivers (hardwares) e softwares para que possamos control-los e aplic-los em nossos projetos. Motores de passos so encontrados em aparelhos onde a preciso um fator muito importante. So usados em larga escala em impressoras, plotters, scanners, drivers de disquetes, discos rgidos e muitos outros aparelhos. Existem vrios modelos de motores de passos disponveis no mercado que

podem ser utilizados para diversos propsitos. Poderemos utiliz-los para mover robs, cmeras de vdeo, brinquedos ou mesmo uma cortina. Vamos agora entender um pouco sobre o funcionamento dos motores de passo:

Trs estados de um motor de passo Desligado: No h alimentao suprindo o motor. Nesse caso no existe consumo de energia, e todas as bobinas esto desligadas. Na maioria dos circuitos este estado ocorre quando a fonte de alimentao desligada. Parado: Pelo menos uma das bobinas fica energizada e o motor permanece esttico num determinado sentido. Nesse caso h consumo de energia, mas em compensao o motor mantem-se alinhado numa posio fixa. Rodando: As bobinas so energizadas em intervalos de tempos determinados, impulsionando o motor a girar numa direo.

Modos de operao de um motor de passo Passo completo 1 (Full-step) -Somente uma bobina energizada a cada passo; -Menor torque; -Pouco consumo de energia; -Maior velocidade. Passo completo 2 (Full-step) -Duas bobinas so energizadas a cada passo; -Maior torque; -Consome mais energia que o Passo completo 1; -Maior velocidade.

Meio passo (Half-step) -A combinao do passo completo1 e do passo completo 2 gera um efeito de meio passo; -Consome mais energia que os passo anteriores; - muito mais preciso que os passos anteriores; -O torque prximo ao do Passo completo 2; -A velocidade menor que as dos passos anteriores. A forma com que o motor ir operar depender bastante do que se deseja controlar. Tem casos em que o torque mais importante, outros, a preciso ou mesmo a velocidade. Essas so caractersticas gerais dos motores de passos, a maioria deles permitem trabalhar dessa forma. Ao trabalhar com motores de passos, precisamos saber algumas caractersticas de funcionamento como a tenso de alimentao, a mxima corrente eltrica suportada nas bobinas, o grau (preciso), o torque e muitos outros. As caractersticas importantes que deveremos saber para poder controlar um motor de passo seriam a tenso de alimentao e a corrente eltrica que suas bobinas suportam. Veja nas tabelas abaixo, as seqncias corretas para se controlar um motor de passo:
Tabela 2 - Passo Completo 1 (Full-step)

N do B3 B2 B1 B0 Decimal passo 1--> 1 0 0 0 8 2--> 0 1 0 0 4 3--> 0 0 1 0 2 4--> 0 0 0 1 1


Tabela 3 - Passo Completo 2 (Full-step)

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

B3 B2 B1 B0 Decimal 1 0 0 1 1 1 0 0 0 1 1 0 0 0 1 1 12 6 3 9

Tabela 4 - Meio passo (Half-step)

N do B3 B2 B1 B0 Decimal passo 1--> 1 0 0 0 8 2--> 1 1 0 0 12

3--> 4--> 5--> 6--> 7--> 8-->

0 0 0 0 0 1

1 1 0 0 0 0

0 1 1 1 0 0

0 0 0 1 1 1

4 6 2 3 1 9

A velocidade de um motor de passo Para se controlar a velocidade de um motor de passo envia-se uma seqncia de pulsos digitais (veja Tabelas 2, 3 e 4) num determinado intervalo. Quanto menor esse intervalo, maior ser a velocidade em que o motor ir girar.
Animao 1 - Velocidade do motor

A direo (esquerda / direita) de um motor de passo Para mudar a direo de rotao do motor, simplesmente inverta a seqncia dos passos conforme os exemplos abaixo:
Tabela 5 - Passo completo 1 (direita)

N do B3 B2 B1 B0 Decimal Direita passo 1--> 1 0 0 0 8 2--> 0 1 0 0 4 3--> 0 0 1 0 2 4--> 0 0 0 1 1

Tabela 6 - Passo completo 1 (esquerda)

N do B3 B2 B1 B0 Decimal Esquerda passo 1--> 0 0 0 1 1 2--> 0 0 1 0 2 3--> 0 1 0 0 4 4--> 1 0 0 0 8

Projetos prticos Controlando um Display LCD (Liquid Crystal Display)


O objetivo desta aula criar uma interface Serial para controlar um display LCD 16x2, compatvel com HD44780. Os LCDs compatveis com processadores HD44780 trabalham com um bus de dados paralelo (interfaces entre dispositivos externos de 4 ou 8 bits). Mas atualmente voc pode comprar displays LCD que utilizam comunicao Serial. Isso possvel, pois algumas empresas adaptam uma plaquinha contendo um microcontrolador PIC ou quaisquer outros, para torn-los seriais. A maioria desses displays seriais usam um microcontrolador PIC 16F627 ou 16F628 de 18 pinos, mais que suficiente para interfacear um display LCD configurado para trabalhar com um Bus de dado de 4 bits. Como estamos usando a verso free do compilador da CCS, iremos criar nosso driver para tornar um LCD serial, um PIC 16F877 (a maioria dos pinos no sero usados), portanto, o ideal seria usar um microcontrolador pequeno, para tornar o circuito compacto e menos dispendioso. As vantagens de se criar um dirver e tornar um display bus serial, so: Usa somente um fio para fazer a comunicao com o LCD; Facilidade em escrever dados no display LCD; Facilidade em desenvolver circuitos microcontrolados usando LCD; Produtividade no desenvolvimento de projetos baseados em LCD.
Figura 1 - Display LCD 16x2 com backlight

Os mdulos LCDs so compostos de memria ROM, memria RAM e dois ou mais micro processadores. A maioria deles dispe de um espao de memria chamada CGRAM, que permite ao usurio desenhar at 8 caracteres personalizados (para cada caracter so necessrios 8 bytes). H display LCD de vrios tamahos e caractersticas venda no mercado. Nesta aula iremos usar um Mdulo LCD de 2x16 (2 linhas por 16 caracteres) com backlight (luz de fundo), e compatvel com o processador HD44780.
Tabela 1 - Pinagem do mdulo LCD 2x16 compatvel (HD44780)

Pino Descrio VSS -Terra/GND (Alimentao 0v). 1

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

VDD - (Alimentao +5v ). VO - Tenso para ajuste do contraste. RS - (Register Select) Seleciona Dado/Comando. R/W - (Read/Write) Seleciona leitura/escrita. E - (Enable) Habilita/desabilita sinal. D0 D1 D2 D3 D4 D5 D6 D7 LED+ Alimentao (Anodo Backlight). LED- Alimentao (Catodo Backlight). Barramento de dados.

A tabela acima descreve as caractersticas de cada pino do mdulo LCD. O pino 1 (VSS) ligado ao negativo da fonte de alimentao (0v), e o pino 2 (VDD) ao positivo (+5v). O pino 3 (VO) usado para ajustar o contraste dos caracteres; ligado a um Trim-pot de 10k ohm. O pino 4 (RS) utilizado para avisar ao mdulo LCD se o que ser enviado posteriormente uma Instruo (comando de controle), ou um Dado (caracter a ser impresso no display). J o pino 5 (R/W) usado para Escrever ou L um dado no LCD. Como nesse projeto s iremos escrever no LCD, esse pino poder ficar aterrado (0v). O pino 6 (E) usado para habilitar ou desabilitar o LCD. Deveremos ativ-lo (E = 1) apenas quando o display for acessado. Os pinos 7..14 (D0...D7) so usados para interfacear o LCD com microcontroladores (no nosso caso, o PIC 16F877). Os pinos 15 e 16 (LED+ e LED-) s estaro disponveis se o mdulo adquirido tiver backlight (luz de fundo). Para controlar a luminosidade acrescenta-se um Trim-pot de 100 ohm entre esses pinos. O objetivo do backlight facilitar a leitura das informaes no escuro pelo usurio.
Tabela 2 - Informaes sobre configurao e instrues para controle do mdulo LCD. INSTRUO RS R/W D7 D6 D5 D4 D3 D2 D1 D0 DESCRIO Tempo Limpa o display e toda a memria. Retorna o curso Limpa Display 0 0 0 0 0 0 0 0 0 1 1,6 ms para a primeira linha e primeira coluna. Retorna o curso para seu Cursor no lugar de origem e o display 0 0 0 0 0 0 0 0 1 x 1,6 ms incio da tela. volta ao estado normal de funcionamento.

Define a direo de movimento do cursor ou da tela. ID incrementa/decrementa o endereo de memria. Quando: ID=0 cursor moveFixa modo de 0 0 0 0 0 0 0 1 ID SH se p/ esquerda. 1,6 ms funcionamento Quando: ID=1 cursor movese p/ direita. Quando: SH=1 o texto movese com a entrada de um novo caracter. Se SH=0, o texto no movido. D=1 liga o display, D=0 desliga. Controle do 0 0 0 0 0 0 1 D C B C=1 liga o cursor, C=0 40us display desliga. B=1 cursor piscante, se C=1. SC=0 move o cursor. Move o cursor SC=1 move o texto. 0 0 0 0 0 1 SC RL x x 40us ou texto RL=1 move para a direita. RL=0 move para a esquerda. INSTRUO RS R/W D7 D6 D5 D4 D3 D2 D1 D0 DESCRIO Tempo Comunicao: DL=1, se comunica com 8 bits. DL=0, se comunica com 4 bits. Configurao Quantidade de linha: 0 0 0 0 1 DL N F x x 40us do LCD N=0, somente 1 linha. N=1, de 2 ou mais linhas. Tamanho da fonte dos caracter: F=0, matriz 5x7. F=1, matriz 5x10. A - Define o endereo de Posiciona na 0 0 1 A A A A A A A memria para gravao ou 40us memria leitura. Leitura do contador de endereos (C) e do flag (F). O flag F , indica que uma Leitura do Flag operao est sendo 0 1 F C C C C C C C 40us Busy executada. Se F=0, controlador ocioso e pronto para receber comandos. Grava o byte (DDDDDDDD) Escreve na no endereo de memria 1 0 D D D D D D D D 40us memria apontado pelo contador de endereos. L o byte (DDDDDDDD) na L dado na 1 1 D D D D D D D D memria, apontado pelo 40us memria contador de endereos.

Figura 2 - Procedimentos para inicializar o Mdulo LCD compatvel (HD44780 ).

Observe no fluxograma acima que aps ligar o mdulo LCD, espera-se por mais de 30ms antes de se enviar os comandos de controle. Isso necessrio para que a tenso no mdulo LCD estabilize. Veja abaixo a seqncia detalhada para inicializar o mdulo LCD: a) Ligar o LCD; b) Aguardar 30ms; c) Habilitar o envio de comandos (RS=0); d) Colocar o byte comando/dados na via de dados (DB7...DB0); e) Fazer com que o pino 6 (E) do LCD v a nvel 0 (zero); f) Aguardar uns 20ms; g) Fazer com que o pino 6 (E) do LCD v a nvel 1 (um); h) Aguardar uns 20ms. Para escrever um byte de COMANDO no display LCD, proceda conforme a seqncia abaixo: a) RS=0, R/W=0, E=0 b) Einvia-se o byte de comando na via (DB7...DB0) c) RS=0, R/W=0, E=1 d) RS=0, R/W=0, E=0

c) Habilitar o envio de comandos (RS=0); d) Colocar o byte de comando na via de dados (DB7...DB0); e) Fazer com que o pino 6 (E) do LCD v a nvel 0 (zero); f) Aguardar uns 40us;

g) Fazer com que o pino 6 (E) do LCD v a nvel 1 (um); h) Aguardar uns 40us; Para enviar qualquer comando para o LCD repetir os passos: d), e), f), g) e h).

Para escrever um byte de DADO no display LCD, proceda conforme a seqncia abaixo: a) RS=1, R/W=0, E=0 b) Einvia-se o byte de dados na via (DB7...DB0) c) RS=1, R/W=0, E=1 d) RS=1, R/W=0, E=0

c) Habilitar o envio de comandos (RS=1); d) Colocar o byte de dados na via de dados (DB7...DB0); e) Fazer com que o pino 6 (E) do LCD v a nvel 0 (zero); f) Aguardar uns 40us; g) Fazer com que o pino 6 (E) do LCD v a nvel 1 (um); h) Aguardar uns 40us. Para enviar qualquer dado para o LCD repetir os passos: d), e), f), g) e h).
Fonte 1 - Driver para controle de LCD usando o PIC16F877 //---------------------------------------------------------------------------------------------- ---//Curso USB/Serial //Programa: DriverLCD.c //Driver para controle de LCD no modo 4 bits. //Configurado para o PIC16F877 - 4Mhz. //Com pequenas mudanas possvel usar PIC16F627 ou 16F628. //LCD Padro: Microprocessador HD44780. //www.rogercom.com //rogercom@rogercom.com //Antonio Rogrio Messias //Data: 20/11/2005 //--------------------------------------------------------------------------//Pinos do PIC16F877 para interfacear o LCD //--------------------------------------------------------------------------#define LCD_PIN_RS pin_d7 //Seleciona Registrador. #define LCD_PIN_ENABLE pin_d6 //Habilita LCD. #define LCD_PIN_RW pin_d5 //Nvel 0 = Escrita no LCD. //--------------------------------------------------------------//Bus de 4 bits #define LCD_DADO_7 pin_b7 // --> pino 14 LCD. #define LCD_DADO_6 pin_b6 // --> pino 13 LCD. #define LCD_DADO_5 pin_b5 // --> pino 12 LCD. #define LCD_DADO_4 pin_b4 // --> pino 11 LCD. //--------------------------------------------------------------------------#define LCD_MOVE_CURSOR_ESQ 0x10 //Move cursor para esquerda. #define LCD_MOVE_CURSOR_DIR 0x14 //Move cursor para direita.

#define LCD_MOVE_DISPLAY_ESQ #define LCD_MOVE_DISPLAY_DIR

0x18 //Move o texto para a esquerda. 0x1C //Move o texto para a direita.

#define LCD_MODO_8_BITS 0x38 //8 bit de dados, 2 linhas (fonte 5x7). #define LCD_MODO_4_BITS 0x28 //4 bit de dados, 2 linhas (fonte 5x7). #define LCD_CONTROLE_DISPLAY 0x0E //00001110 #define LCD_FIXA_MODO 0x06 //Fixa modo de funcionamento do display. #define LCD_DISPLAY_ON 0x0C //Liga display. #define LCD_DISPLAY_OFF 0x08 //Desliga Display sem apagar os dados na memria. #define LCD_SET_DD_RAM 0x80 //Linha 1 posio 1. #define LCD_LINHA_1 0x80 //DDRAM nicio da primeira linha. #define LCD_LINHA_2 0xC0 //DDRAM nicio da segunda linha. #define LCD_LIMPA_DISPLAY 0x01 //Limpa o display e apaga a memria. #define LCD_CURSOR_HOME 0x02 //Pe curso no incio da tela. #define LCD_CURSOR_OFF 0x0C //desliga cursor. #define LCD_CURSOR_PISCANTE 0x0D //cursor barra piscante. #define LCD_CURSOR_LINHA 0x0E //linha fixa. #define LCD_CURSOR_LINHA_BARRA 0x0F //linha fixa e barra piscante. //--------------------------------------------------------------------------//Funes para controle do LCD //--------------------------------------------------------------------------void LCD_Modo_Comando(void); void LCD_Modo_Dado(void); void LCD_Escreve_Modo_4_bits(char ByteValor); void LCD_EnviaChar(char carac); void LCD_EnviaString(char *Str); void LCD_Gotoxy(int colunaX, int LinhaY); void LCD_StringCentro(char *Texto, int LinhaY); void LCD_LimpaDisplay(void); void LCD_CursorHome(void); void LCD_TrocaCursor(int Tipo); void LCD_PiscaString(int ColunaX, int LinhaY, char *String, int Vezes); void LCD_Cria_Car_CGRAM(int Endereco,unsigned char codigo[]); void LCD_Configura(void); //--------------------------------------------------------------------------//Faz o LCD aceitar Comandos. //--------------------------------------------------------------------------void LCD_Modo_Comando(void) { output_low( LCD_PIN_RS ); //RS em 0 - COMANDO. delay_us(50); } //--------------------------------------------------------------------------//Faz o LCD aceitar Dados. //--------------------------------------------------------------------------void LCD_Modo_Dado(void) { output_high( LCD_PIN_RS ); //RS em 1 - DADO. delay_us(50); } //--------------------------------------------------------------------------//Escreve 8 bits de dados no modo 4 bits no LCD. //--------------------------------------------------------------------------void LCD_Escreve_Modo_4_bits(int ByteValor)

{ //===> 20Mhz usar delay de 20us. //===> 4Mhz usar delay de 2us. //Envia o nibble mais significante (MSB) para o LCD. output_bit(LCD_DADO_7, bit_test(ByteValor, 7) ); output_bit(LCD_DADO_6, bit_test(ByteValor, 6) ); output_bit(LCD_DADO_5, bit_test(ByteValor, 5) ); output_bit(LCD_DADO_4, bit_test(ByteValor, 4) ); delay_us(2); output_high( LCD_PIN_ENABLE ); delay_us(2); output_low( LCD_PIN_ENABLE ); //Clock. delay_us(2); //Envia o nibble menos significante (LSB) para o LCD. output_bit(LCD_DADO_7, bit_test(ByteValor, 3) ); output_bit(LCD_DADO_6, bit_test(ByteValor, 2) ); output_bit(LCD_DADO_5, bit_test(ByteValor, 1) ); output_bit(LCD_DADO_4, bit_test(ByteValor, 0) ); delay_us(2); output_high( LCD_PIN_ENABLE ); delay_us(2); output_low( LCD_PIN_ENABLE ); //Clock. } //--------------------------------------------------------------------------//Envia um caracter para o LCD. //--------------------------------------------------------------------------void LCD_EnviaChar(char carac) { LCD_Escreve_Modo_4_bits(carac); } //--------------------------------------------------------------------------//Envia uma string de caracteres para o LCD. //--------------------------------------------------------------------------void LCD_EnviaString(char *Str) //Envia um texto para o LCD. { LCD_Modo_Dado(); while(*Str) //Loop enquanto no for 'encontrado '\0' (final da string). LCD_EnviaChar(*Str++); //Envia caracter a caracter para o display LCD. } //--------------------------------------------------------------------------//Posisiona o cursor na na coluna X linha do LCD. //--------------------------------------------------------------------------void LCD_Gotoxy(int colunaX, int LinhaY) //Posiciona na coluna e linha do display de LCD. { LCD_Modo_Comando(); if(LinhaY < 2) //se for a linha 1. LCD_EnviaChar(LCD_LINHA_1+colunaX); //Endereo de memria da 1a. linha do LCD (0x80). else //se no 2a linha. LCD_EnviaChar(LCD_LINHA_2+colunaX); //Endereo de memria da 2a. linha do LCD (0xC0). LCD_Modo_Dado(); //Volta ao modo Dado. }

//--------------------------------------------------------------------------//Envia uma string no centro da linha do LCD. //--------------------------------------------------------------------------void LCD_StringCentro(char *Texto, int LinhaY) { int Metade; Metade = strlen(Texto) / 2; //Acha a metade do texto. LCD_Gotoxy(8-Metade, LinhaY); //Centraliza. O 8 o centro da tela do display (16 Div. 2). LCD_EnviaString(Texto); } //--------------------------------------------------------------------------//Limpa o LCD. //--------------------------------------------------------------------------void LCD_LimpaDisplay(void) //Limpa o display e a memria do LCD posicionando na primeira linha. { LCD_Modo_Comando(); //Pe no modo Comando. LCD_EnviaChar(LCD_LIMPA_DISPLAY); //Limpa o display. LCD_Modo_Dado(); //Volta ao modo Dado. } //------------------------------------------------------------------------------//Pe o curso na posio superior esquerda do display. //------------------------------------------------------------------------------void LCD_CursorHome(void) //Limpa o display e a memria do LCD posicionando na primeira linha. { LCD_Modo_Comando(); //Pe no modo Comando. LCD_EnviaChar(LCD_CURSOR_HOME); //Pe o curso na posio superior esquerda do display. LCD_Modo_Dado(); //Volta ao modo Dado. } //--------------------------------------------------------------------------//Muda o tipo de cursor do LCD. //--------------------------------------------------------------------------void LCD_TrocaCursor(int Tipo) //Muda o tipo de cursor do display do LCD. { LCD_Modo_Comando(); //Pe no modo Comando. LCD_EnviaChar(Tipo); //Muda o tipo de cursor. LCD_Modo_Dado(); //Volta ao modo Dado. } //-------------------------------------------------------------------------------------------//Pisca uma string na linha/coluna do LCD, definindo um intervalo. //-------------------------------------------------------------------------------------------void LCD_PiscaString(int ColunaX, int LinhaY, char *String, int Vezes) { char Apaga[16]; //para armazenar 16 espaos. int Conta=0; int TamaString; TamaString = strlen(String); //acha o tamanho do texto. memset(Apaga,' ',TamaString); //preenche com espaos a varivel 'Apaga'. Apaga[TamaString] = '\0'; //finaliza a string. while( Conta < Vezes ) //enquanto nenhuma tecla for pressionada. { LCD_Gotoxy(ColunaX, LinhaY); //posiciona texto. LCD_EnviaString(String); //escreve texto. delay_ms(200); //aguarda. LCD_Gotoxy(ColunaX, LinhaY); //posiciona espaos. LCD_EnviaString(Apaga); //apaga texto. delay_ms(200); //aguarda.

Conta++; } } //----------------------------------------------------------------------------------------------------------------//Cria at 8 caracteres personalizados na CGRAM. //Endereo para cada caracter: 0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78 //Aps a criao, os novos caracteres podem ser acessados respectivamente //atravs dos seguintes caracteres ASC: 0, 1, 2, 3, 4, 5, 6 e 7. //Para cada caracter so necessrios passa 8 bytes atravs da matriz codigo[]. //----------------------------------------------------------------------------------------------------------------void LCD_Cria_Car_CGRAM(int Endereco, unsigned char codigo[] ) { int i; LCD_Modo_Comando(); LCD_EnviaChar(Endereco); //Endereo para criar o caracter. LCD_Modo_Dado(); for(i=0; i<8; i++) LCD_EnviaChar(codigo[i]); //Desenha na CGRAM o novo caracter. } //--------------------------------------------------------------------------//Configura o LCD. //--------------------------------------------------------------------------void LCD_Configura(void) { delay_ms(30); //Aguarda a tenso no LCD estabilizar. LCD_Modo_Comando(); LCD_EnviaChar(0x33); delay_ms(10); LCD_EnviaChar(0x32); delay_ms(10); LCD_EnviaChar(LCD_MODO_4_BITS); delay_ms(10); LCD_EnviaChar(LCD_FIXA_MODO); delay_ms(10); LCD_EnviaChar(LCD_DISPLAY_ON); delay_ms(10); LCD_EnviaChar(LCD_LIMPA_DISPLAY); delay_ms(10); LCD_Modo_Dado(); }

O driver acima foi escrito para simplificar a programao com LCDs, deve ser usado quando formos criar um novo programa fonte. Use a diretiva #include <DriverLCD.c> para incluir o driver ao seu novo programa fonte.

DownLoad do projeto PIC_LCD para gravar o PIC16F877.


Fonte 2 - Programa LCD_Serial.c para gravar o PIC16F877 //Curso USB/Serial. //Programa: LCD_Serial.c //Controle de LCD no modo 4 bits atravs de uma interface Serial. //Configurao: 9600,8,N,1. //www.rogercom.com //rogercom@rogercom.com

//Antonio Rogrio Messias //----------------------------------------------------------------------------------------------#include <16F877.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #use delay(clock=4000000) //4Mhz. #fuses XT, PUT, NOWDT, NOBROWNOUT, NOLVP #use rs232(BAUD=9600, parity=N, BITS=8, XMIT=pin_c6, RCV=pin_c7) #include <DriverLCD.c> //Funes para acesar o LCD no modo 4 bits. //------------------------------------------------------------------------------------------------------------------------------//Interrupo de recebimento de caracter pela Serial. //Esta funo a responsvel em receber os comandos via serial e envi-los para o LCD. //-------------------------------------------------------------------------------------------------------------------------------#int_rda void Serial_Recebe_Car() { static char ch; static int FlagComando=false; ch = getc(); //Pega o caracter da Serial. if( ch == 0xFE ) //Habilita Modo Comando (0xFE). { FlagComando = true; }else if( FlagComando == true ) { //Escreve no Modo Comando. FlagComando = false; LCD_Modo_Comando(); //Pe LCD no modo Comando. LCD_EnviaChar(ch); //Escreve um Comando no LCD. LCD_Modo_Dado(); //Pe LCD no modo Dado. }else{ //Escreve no Modo Dados. LCD_Modo_Dado(); //Pe LCD no modo Dado. LCD_EnviaChar(ch); //Escreve um caracter no LCD. } } //--------------------------------------------------------------------------//Pisca LED1 indicando que o PIC est em execuo. //--------------------------------------------------------------------------#int_timer0 void MeuTimer() { static boolean led; static int conta; set_timer0(131-get_timer0()); conta++; if(conta == 10) { conta = 0; led = !led; output_bit(pin_d1, led); } } //---------------------------------------------------------------------------

//Programa Principal. void main(void) { set_timer0(131); setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64); enable_interrupts(int_rda); //Habilita interrupo de recebimento. enable_interrupts(int_timer0); enable_interrupts(GLOBAL); //Habilita registrador de interrupo. set_tris_d(0b00000000); //Controle do LCD. set_tris_b(0b00000000); //Controle do LCD. output_b(0b00000000); //Pinos desligados. output_d(0b00000000); //Pinos desligados. LCD_Configura(); //Inicializa LCD (funo disponvel no DriverLCD.c.) LCD_CursorHome(); //Inicializa LCD (funo disponvel no DriverLCD.c.) while( true ); //Loop. }

O programa acima funciona da seguinte forma: quando um byte recebido pela funo Serial_Recebe_Car() atravs da serial (UART do PIC), o byte enviado imediatamente para o mdulo LCD atravs dos pinos (D7, D6, D5 e D4) e escrito na tela do display. Para enviar uma instruo (comando) para o LCD necessrio primeiramente enviar o byte 0xFE seguido do comando propriamente dito (LCD_LIMPA_DISPLAY, LCD_CURSOR_HOME, LCD_LINHA_1, etc). Quando o PIC recebe o valor 0xFE ele trata o prximo byte como um Comando. Aps a execuo do comando, ele coloca automaticamente o LCD no modo Dado. A partir desse ponto, qualquer byte recebido, diferente de 0xFE ser imediatamente escrito na tela do display LCD. As funes de interrupo do timer0 podem ser eliminadas do programa, pois seu objetivo no mesmo simplesmente fazer o LED1 do circuito da Figura 3 piscar, para mostrar ao desenvolvedor que o programa gravado no PIC est funcionando. Na fase inicial de testes do circuito bom manter esta funo, pois um recuso a mais para eliminao de erros. Se for remover esta funo, elimine tambm o LED1 do circuito,, pois este no ter mais utilidade.

Figura 3 - Circuito que torna um display comum, em um display com interface Serial

No circuito acima a transmisso de dados entre o PIC e o LCD feita de forma paralela (em 4 bits - D7, D6, D5 e D4). Como o display ir trabalhar com bus de 4 bits, os pinos D0, D1, D2 e D3 no sero usados. O PIC controla o LCD atravs dos pinos 28, 29 e 30. No nosso projeto o programa (DriverLCD.c) no usa o pino R/W, sendo assim, ele pode ser desconectado do PIC e aterrado (0v). A funo do trim-pot P1 (10k) de ajustar o contraste dos caracteres. J o trim-pot P2 (100R) tem a funo de ajustar a luz de fundo do LCD (backlight), se o mesmo tiver este recurso; caso contrrio desconsidere este componente no circuito. O LED1 e o boto RESET so opcionais e podem ser eliminados do circuito sem interferir no funcionamento do mesmo.

Figura 4 - Tela do programa controle de LCD

Download do programa fonte e EXE: Delphi C++

O programa acima um exemplo de como controlar o LCD serial do circuito da Figura 3 conectado ao PC atravs do FT232BM. Nesse programa so exploradas vrias funes para controle do LCD como: movimento do cursor, movimento de textos na tela, centralizar e posicionar textos, limpar, ligar e desligar o display ou o cursor, entre outras.

Figura 5 - Tela do programa para desenhar caracteres na memria CGRAM do LCD

Download do programa fonte e EXE: Delphi C++

O programa acima tambm foi criado para ser usado com o circuito da Figura 3. Seu objetivo criar novos caracteres para ser gravado na memria CGRAM. Ao clicar com o mouse na rea de desenho do caractere, os valores correspondentes a cada linha do caracter so gerados e atribudos matriz char linha[8]. Esse cdigo pode ser copiado e usado como modelo no seu programa fonte, para gravar um novo caracter na CGRAM. Veja no programa, que tambm possvel mudar o nome da matiz, inverter os pixels do caracter, limpar o LCD, apagar a rea de desenho e o contedo da CGRAM no LCD. Um recurso bastante interessante neste programa a opo "Desenha em tempo real". Se esta opo for marcada os pixels plotados na rea de desenho sero automaticamente plotados tambm na tela do display LCD. Esse programa s desenha em um nico endereo da memria CGRAM. Este endereo o 40(em hexadecimal) referente a posio do caracter de cdigo ASCII (0).

Exemplo de como gravar novos caracteres na CGRAM: Veja no exemplo abaixo como gravar um novo caracter na memria CGRAM usando as funes do driver Driver_LCD.c:

char linha[8]; linha[0] = 0x01; linha[1] = 0x02; linha[2] = 0x0E; linha[3] = 0x01; linha[4] = 0x0F; linha[5] = 0x11; linha[6] = 0x0F; linha[7] = 0x00;

//Armazena o cdigo para criar o caracter ''.

LCD_Cria_Car_CGRAM( 0x40, linha ); //Escreve no primeiro endereo da memria CGRAM associado ao cdigo ASCII (0). LCD_EnviaChar( 0 ); //Mostra na tela do LCD o caracter '' gravado com a funo acima.

Para imprimir na tela do LCD o novo caracter desenhado, use o cdigo ASCII (0). Este cdigo est associado ao endereo 0x40, ou seja, ao caracter '' criado no exemplo acima. Veja abaixo uma tabela com os 8 endereos vlidos para se criar caracteres na memria CGRAM.
Tabela 3 - Endereos para se criar caracteres na CGRAM Cdigo ASCII Endereo associado 0x40 0 0x48 1 0x50 2 0x58 3 0x60 4 0x68 5 0x70 6 0x78 7

Cada caracter desenhado ocupa 8 bytes da memria CGRAM. Sendo assim, para desenhar um caracter associado ao ASCII (0) os endereos ocupados so: 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 e 0x47. J o caracter ASCII (1) comea a partir do endereo 0x48, conforme mostrado na tabela acima.

Projetos prticos Controle de acesso sem fio atravs dos mdulos RR3 e RT4 da Telecontrolli
Nesta aula iremos desenvolver um controle de acesso sem fio atravs dos mdulos transmissor e receptor (RR3 / RT4) da telecontrolli. O projeto dividido em dois circuitos, um composto por um mdulo receptor RR3, um decoder MC145027 e um dispositivo FT232BM Bus powered, trabalhando no modo Bit Bang. J o segundo circuito composto de um microcontrolador PIC 16F877, um mdulo RT4, um encoder MC145026 e um display de 7 segmentos com catodo comum. O objetivo do display exibir

os nmeros de 0 a 9 a partir da seleo feita atravs dos botes "seta para cima" ou "seta para baixo" existentes no circuito. Para enviar o nmero selecionado ao receptor, pressiona-se o boto "Enter". Assim possvel digitar qualquer senha numrica no circuito transmissor e recebe-la no circuito receptor. No circuito receptor no houve necessidade de se utilizar um microcontrolador, pois o dispositivo FT232BM foi configurado para receber os dados do transmissor no modo Bit Bang (8 pinos que podem ser configurados como entradas ou sadas). A configurao do modo Bit Bang feita via software (atravs da nossa aplicao controle de acesso que rodar no PC). O circuito transmissor pode ser alimentado com pilhas ou bateria que fornea entre 4,5v a 5.0v, para acesso mvel numa distncia de (+/-) 50m. Se o transmissor for ficar num local definitivo, o melhor aliment-lo atravs de uma fonte de alimentao de 5v, para no gastarmos com pilhas ou bateria. Segue abaixo algumas figuras exemplos da aparncia externa do circuito transmissor.
Figura 1 - Ao executada ao ligar o circuito Figura 2 - Indica que o circuito est ligado

A duas figuras acima mostram as aes executadas pelo microcontrolador quando o circuito ligado, e tambm como ele fica aps sua inicializao.
Figura 3 - Exemplo de incremento Figura 4 - Exemplo de decremento

As setas "para baixo" e "para cima" so usadas para incrementar e decrementar os nmeros no display, e dessa forma selecionar um desses nmeros, para em seguida atravs do pressionamento da tecla "Enter", envilo via transmissor RT4. Para avisar ao sistema remoto que os nmeros anteriormente enviados devem ser comparados com as senhas cadastradas no sistema, seleciona-se no display atravs das setas "para cima" ou "para baixo" o "dgito apagado", somente com o ponto decimal piscando, como o da Figura 2, logo em seguida pressiona-se o boto "Enter".
Figura 8 - Tela do programa de controle de Acesso

Download do programa fonte e EXE: Delphi C++

O programa acima um exemplo funcional para testar os dois circuitos. Os dgitos enviados pelo circuito transmissor so armazenados no campo "Senha recebida", e s sero comparados com as senhas armazenadas na caixa "Senhas vlidas" quando for recebido o digito 10 em decimal, ou seja, o "Dgito apagado". Tambm atravs do programa acima possvel ligar ou desligar os pinos DSR#, DCD# e RI#, simplesmente marcando ou desmarcando as caixas de opo. Com base no programa acima e um pouco de trabalho extra, possvel desenvolver um programa mais sofisticado, usando um banco de dados para armazenar senhas e usurios que tero acesso a um determinado local de um recinto.

Figura 5 - Circuito receptor conectado ao PC atravs do Bus USB

Na figura acima, todo o circuito deve ser alimentado pelo Bus USB, sendo assim, altere o consumo de corrente do dispositivo FT232BM para mais de 100mA atravs da gravao da memria 93C46 (para isso use o programa MProg). Observe o endereamento (A1 a A5), o pino A2 no deve ser conectado, pois ele est assumindo um valor de alta impedncia, que resulta no endereo escolhido, assim, deve ser tambm no circuito transmissor. No dispositivo FT232BM os pinos TXD, RXD, RTS#, CTS# e DTR# so usados como entradas de dados. O LED L8 (LED VT) acende por alguns instantes quando o mdulo RR3 recebe um dado. J os LEDs L4, L5, L6, L7 e L8 mostram a codificao em binrio do dado recebido. O dado recebido enviado ao programa aplicativo no PC que gerencia o controle de acesso atravs de senhas cadastradas. Os pinos DSR#, DCD# e RI# so usados como sadas e servem para controlar dispositivos externos, mas no nosso projeto eles esto simplesmente conectados a LEDs.

DownLoad do projeto PIC-RT4-ACESSO para gravar o PIC16F877.


Fonte 1 - Programa de controle do circuito transmissor para ser gravado no PIC16F877

// Curso USB/Serial. // Programa: PIC-RT4-Acesso.c // Controle de Acesso sem fio. // Circuito transmissor usando o mdulo RT4 433,92MHz da Telecontrolli. // www.rogercom.com // rogercom@rogercom.com // Antonio Rogrio Messias //--------------------------------------------------------------------------#include <16F877.h> #use delay(clock=4000000) #fuses XT, PUT, NOWDT, NOBROWNOUT, NOLVP #define RT4_PINO_TE pin_d0 #define BOTAO_ENTER pin_d1 #define BOTAO_INCREMENTA pin_d2 #define BOTAO_DECREMENTA pin_d3 #define PONTO_DECIMAL pin_b0 #define PRESSIONADO 0 #define LIGADO 0 #define DESLIGADO 1 //Para testar se um boto foi pressionado. //Para desabilitar o pino TE (ligado 0) do RT4 //Para habilitar o pino TE (desligado 1) do RT4

//Mscaras de bits para acender cada nmero no display. #define NUM_0 0b11111100 #define NUM_1 0b01100000 #define NUM_2 0b11011010 #define NUM_3 0b11110010 #define NUM_4 0b01100110 #define NUM_5 0b10110110 #define NUM_6 0b10111110 #define NUM_7 0b11100000 #define NUM_8 0b11111110 #define NUM_9 0b11110110 #define NUM_BRANCO 0b00000000 //Mscaras de bits para acender cada segmento do display. #define SEG_a 0b10000000 #define SEG_b 0b01000000 #define SEG_c 0b00100000 #define SEG_d 0b00010000 #define SEG_e 0b00001000 #define SEG_f 0b00000100 #define SEG_g 0b00000010 const int num[] = { NUM_0, NUM_1, NUM_2, NUM_3, NUM_4, NUM_5, NUM_6, NUM_7, NUM_8, NUM_9, NUM_BRANCO }; const int Seg[] = { SEG_a, SEG_b, SEG_c, SEG_d, SEG_e, SEG_f, SEG_g }; unsigned int PUB_Index_Menu = 0; //Para controlar os botes seta para cima e para baixo. long int TempoDisplayAtivo = 0; //Para contar o tempo em que o display permanece ligado. boolean TIMER_PontoDecimal = true; //--------------------------------------------------------------------------//Mostra um nmero no display. //--------------------------------------------------------------------------void Display_Numero(int byte_num) { output_bit(pin_b7, bit_test(byte_num, 7) );

output_bit(pin_b6, bit_test(byte_num, 6) ); output_bit(pin_b5, bit_test(byte_num, 5) ); output_bit(pin_b4, bit_test(byte_num, 4) ); output_bit(pin_b3, bit_test(byte_num, 3) ); output_bit(pin_b2, bit_test(byte_num, 2) ); output_bit(pin_b1, bit_test(byte_num, 1) ); } //--------------------------------------------------------------------------//Mostra ponto decimal no display. //--------------------------------------------------------------------------void Display_PontoDecimal(boolean ponto_OnOff) { output_bit(PONTO_DECIMAL, ponto_OnOff); } //------------------------------------------------------------------------------------------------------//Disponibiliza os dados ao ENCODE MC145026 (pinos D6, D5, D4 e D3. //-------------------------------------------------------------------------------------------------------void DisponibilizaDados(int byte_num) { output_bit(pin_c0, bit_test(byte_num, 0) ); output_bit(pin_c1, bit_test(byte_num, 1) ); output_bit(pin_c2, bit_test(byte_num, 2) ); output_bit(pin_c3, bit_test(byte_num, 3) ); } //---------------------------------------------------------------------------------------------------------//Para controlar a piscagem do ponto decimal e o tempo em que o display //permanecer ligado. //---------------------------------------------------------------------------------------------- -----------#int_timer0 void MeuTimer() { static boolean Pisca = 0; static int conta = 0; set_timer0(131-get_timer0() ); if(TIMER_PontoDecimal== true) { conta++; if(conta == 8) //Velocidade da piscagem do ponto decimal. { conta = 0; //zera o contador. Pisca = !Pisca; //Alterna entre 1 e 0. Display_PontoDecimal(Pisca); //Liga/desliga ponto decimal do display. } } //---------------------------------------------------------------------------TempoDisplayAtivo++; if(TempoDisplayAtivo > 250 ) //Se a contagem ultrapassou 250 vezes, apaga display. { TIMER_PontoDecimal = true; //Desabilita a piscagem do ponto decimal. TempoDisplayAtivo = 0; //Zera o contador. PUB_Index_Menu = 10; //Pe no ltimo ndice da matriz do Menu. Display_Numero(NUM_BRANCO); //Apaga display. } } //-----------------------------------------------------------------------------//Seqencial de segmentos do display. //------------------------------------------------------------------------------

void SequenciaSegmentos(void) { int Pos; for(Pos=0; Pos < 7; Pos++) //Para percorrer todos os 7 segmentos do display. { Display_Numero(Seg[Pos]); //Acende e apaga cada um dos segmentos do display. delay_ms(200); //Aguarda 200ms. } } //-----------------------------------------------------------------------------//Programa principal. //-----------------------------------------------------------------------------void main(void) { //Para controlar os botes. boolean FlagButCima = true; boolean FlagButBaixo = true; boolean flagButEnvia = true; enable_interrupts(GLOBAL | int_timer0); setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64); set_timer0(131); set_tris_b(0b00000000); //Todos os pinos como sada. set_tris_c(0b00000000); //Todos os pinos como sada. set_tris_d(0b00000111); //Os 3 primeiros pinos como entradas. output_c(0x00); //Desliga todos os pinos da porta C.

Display_PontoDecimal(false); //Ponto-decimal do display desligado. output_bit(RT4_PINO_TE, DESLIGADO); //Pino TE desligado. SequenciaSegmentos(); //Faz seqncial nos segmentos do display. //Apaga display. //Liga o ponto-decimal do display. //Habilita timer0, fazendo o ponto-decimal

Display_Numero(NUM_BRANCO); Display_PontoDecimal(true); enable_interrupts(int_timer0); alternar.

while(1) //Loop principal. { if( input(BOTAO_INCREMENTA) == PRESSIONADO ) //Incrementa os nmeros. { if(FlagButCima == true) { FlagButCima = false; //Nega o if acima. TempoDisplayAtivo = 0; TIMER_PontoDecimal = true; //Habilita a intermitncia do ponto decimal. Display_PontoDecimal(false); //Desliga o ponto-decimal do display. if(PUB_Index_Menu < 10) PUB_Index_Menu++; else PUB_Index_Menu = 0; Display_Numero(num[PUB_Index_Menu]); } delay_ms(15); //Tempo necessrio para eliminar rudo ao preessionar boto. }else{ //Quando o boto for solto.

if(flagButCima == false) { FlagButCima = true; //Nega o if acima. TempoDisplayAtivo = 0; } delay_ms(15); //Tempo necessrio para eliminar rudo ao preessionar boto. } //-------------------------------------------------------------------------------if( input(BOTAO_DECREMENTA) == PRESSIONADO ) //Decrementa os nmeros. { if(FlagButBaixo == true) { FlagButBaixo = false; //Nega o if acima. TempoDisplayAtivo = 0; TIMER_PontoDecimal = true; //Habilita a intermitncia do ponto decimal. Display_PontoDecimal(false); //Desliga o ponto-decimal do display. if(PUB_Index_Menu > 0) PUB_Index_Menu--; else PUB_Index_Menu = 10; //ltima posio do menu. Display_Numero(num[PUB_Index_Menu]); } delay_ms(15); }else{ //Quando o boto for solto. if(flagButBaixo == false) { FlagButBaixo = true; TempoDisplayAtivo = 0; } delay_ms(15); //Tempo necessrio para eliminar rudo ao preessionar boto. } //-------------------------------------------------------------------------------if( input(BOTAO_ENTER) == PRESSIONADO ) //Boto: ENTER (Habilita envio de dados). { if(flagButEnvia == true) { flagButEnvia = false; //Nega o if acima. DisponibilizaDados(PUB_Index_Menu); //Pe os dados nos pinos c0,c1,c2 e c3. output_bit(RT4_PINO_TE, LIGADO); //TE - Envio ON. if(PUB_Index_Menu == 10) //Se for a posio do display apagado. { TempoDisplayAtivo = 210; //Adianta o contador, faz o ponto-decimal piscar logo em seguida. TIMER_PontoDecimal = true; //Ativa a intermitencia do ponto-decimal do display. }else{ TIMER_PontoDecimal = false; //Desativa a intermitencia do pontodecimal do display. } Display_PontoDecimal(false); //Apaga o ponto-decimal do display. } delay_ms(15); //Tempo necessrio para eliminar rudo ao preessionar boto. }else{ //Quando o boto ENTER for solto. if(flagButEnvia == false) {

FlagButEnvia = true; //Nega o if acima. TIMER_PontoDecimal = false; //Desabilita a intermitncia do ponto decimal. Display_PontoDecimal(true); //Liga o ponto-decimal do display. output_bit(RT4_PINO_TE, DESLIGADO); //TE - Envio OFF. } delay_ms(15); //Tempo necessrio para eliminar rudo ao preessionar boto. } } //Fim while }

No programa acima a funo Display_Numero() exibe os nmeros no display. A funo Display_PontoDecimal() liga ou desliga o ponto decimal do display. A varivel global PUB_Index_Menu usada para incrementar ou decrementar o ndice para selecionar um nmero. A funo DisponibilizaDados() pe os dados nos pinos (D6, D7, D8 e D9) para posterior transmisso pelo mdulo RT4. A varivel global TIMER_PontoDecimal controla a intermitncia do ponto decimal do display.
Figura 6 - Pinagem de um display de 7 segmentos do tipo catodo comum

Figura 7 - Circuito transmissor controlado por um PIC 16F877

No circuito acima, os botes K1, K2 e K3 so usados para selecionar e enviar os nmeros para o circuito receptor remoto (RR3). O display serve para mostrar o nmero selecionado. O PIC disponibiliza o cdigo do nmero selecionado no display, nos pinos 15, 16, 17 e 18. O cdigo transmitido atravs do RT4 quando o PIC envia um sinal de nvel lgico 0 (zero) ao pino TE. O display de sete segmentos utilizado em nosso projeto do tipo catodo comum.

Observe que o endereo (A1 a A5) deve ser igual ao do circuito receptor. O pino A2 deve permanecer desconectado.

Informaes sobre os mdulos RR3 / RT4 e o Encoder / Decoder


(Artigo completo disponvel no nosso site Rogercom)

Disponibilizo aqui nesta aula, algumas informaes e experincias utilizando os mdulos transmissor RT4 e receptor RR3, fabricados pela empresa Italiana Telecontrolli (www.telecontrolli.com). Os mdulos produzidos pela Telecontrolli j so um padro de mercado, so utilizados como componentes bsicos para a construo de dispositivos como: sistema de alarme para carros, sistema de segurana residencial, controle remoto para abertura e fechamento de portes, controles para ligar e desligar luzes, dispositivos sensores, aquisio de dados, robtica e controle em geral. Enfim, um prato cheio para a construo de dispositivos domticos e robticos. Os mdulos RT4 e RR3 tem alcance de at 100m sem obstculos, desde que a antena e a fonte de alimentao do transmissor sigam as recomendaes tcnicas do fabricante. Esses mdulos j saem de fbrica regulados atravs de tecnologia Laser, dispensando qualquer tipo de regulagem por parte do desenvolvedor. Os mdulos RT4 e RR3 trabalham nas faixas de freqncias de: 315MHz, 418MHz e 433,92MHz. Os mdulos utilizados para criar nosso projeto trabalham na freqncia de 433,92MHz. Voc pode escolher usar outros mdulos com uma das freqncias citadas acima, mas o par (RT4 e RR3) deve ter freqncias idnticas para que possa haver uma comunicao entre o transmissor e receptor. A largura de banda (para a transferncia dos dados) do mdulo RT4 de 4KHz, j a do mdulo RR3 de 2KHz. Portanto, para que o mdulo receptor RR3 consiga receber os dados corretamente, o transmissor RT4 dever se limitar a transmitir os dados numa taxa inferior ou igual a 2KHz. Para que possamos transmitir dados de forma digital e seguindo um determinado padro atravs da portadora dos mdulos RF RT4 e RR3, utilizamos os famosos e teis CIs MC145026 (Encoder) e MC145027 (Decoder), fabricados pela Motorola. Este artigo, alm de demonstrar a utilizao dos mdulos RT4 e RR3 na prtica, aproveita para divulgar um controle remoto sem fio conectado a Porta Paralela controlado por um programa, onde poderemos ligar e desligar at 8 dispositivos independente um do outro.
Figura 9 - Foto dos mdulos RT4 e RR3

Na figura acima, vemos as fotos dos mdulos transmissor RT4, e receptor RR3, ambos devem operar no mesmo espectro de freqncia. Optamos em

usar os mdulos com freqncia de 433,92MHz por serem encontrados com mais facilidade no mercado nacional. Clculo da antena de 1/4 de onda O comprimento preciso da antena muito importante para que se possa obter um bom alcance, entre o mdulo transmissor e o receptor. Para um mdulo que trabalha na freqncia de 433,92MHz, pode ser usado um fio rgido de cobre (26AWG) como antena, de comprimento igual a 17,5 cm. Para maiores informaes sobre antena, acesse o tutorial escrito por Kent Smitch: antenna.pdf. - Comprimento da antena em centmetros: Comprimento = 7500 / Freqncia em MHz. Comprimento = 7500 / 433,92. Comprimento = 17,5 cm. - Comprimento da antena em polegadas: Comprimento = 2952 / Freqncia em MHz. Comprimento = 2952 / 433,92. Comprimento = 6,8 in. Data Sheets Mdulos RT4 e RR3 http://www.telecontrolli.com/pdf/receiver/rr3.pdf http://www.telecontrolli.com/pdf/transmitter/rt4.pdf Onde encontrar os mdulos RT4 e RR3 http://www.acpcomponentes.com.br
Figura 10 - Layout dos CIs MC145026 e MC145027

Data Sheets Encoder/Decoders MC145026 / 27 / 28 http://www.freescale.com/files/rf_if/doc/data_sheet/MC145026.pdf

Figura 11 - Teste de transmisso entre o Encoder e o Decoder

Antes de conectar os mdulos RT4 e RR3 ao circuito, interessante verificar se o encoder e o decoder esto oscilando na mesma freqncia. Para isso, enderece igualmente os pinos A1 a A5 tanto no encoder como no decoder. No pino 11 (VT-Valid Transmission) do decoder conecte um resistor de 470 ohm e um LED. Para testar se h um sincronismo entre os CIs, leve o pino 14 (TE- Transmit Enable) do MC145026 ao nvel baixo (0v), ao fazer isso, o LED conectado ao pino VT do MC145027 dever acender. Se desejar um teste mais elaborado, codifique as entradas de dados (D6D9) do MC145026 e conecte LEDs aos pinos de dados (D6-D9) do MC145027, ao levar o pino TE a nvel baixo (0v) os LEDs conectados aos pinos de dados do MC145027, devero se acender conforme a combinao feita nos pinos de dados do MC145026. Dessa forma voc estar certo de que o par encoder e decoder est em sincronismo, funcionando corretamente. Depois s acrescentar os mdulos RT4 e RR3 ao circuito e testar o sistema completo. Informaes O CI MC145026 pode combinar at 19.683 endereos no modo trinrio (0, 1 e aberto), usando os pinos (A1,A2,A3,A4,A5,D6,D7,D8 e D9), e 512 endereos no modo binrio (0 e 1). Se forem usados somente os pinos A1,A2,A3,A4 e A5, possvel combinar at 243 endereos no modo trinrio e, 32 endereos no modo binrio. Dessa forma, os pinos D6,D7,D8 e D9 so utilizados para transmisso de dados, sendo possvel combinar 16 valores diferentes e envi-los para o decoder MC145027. H tambm um outro decoder da Motorola, o MC145028 que usa os 9 pinos (A1,A2,A3,A4,A5,A6,A7,A8 e A9) todos para endereamento tanto no modo binrio como no modo trinrio, esse decoder mais utilizado para chavear endereos de controle remoto, possibilitando no mximo 19.683 endereos diferentes.

Tenso de trabalho dos decoders e encoder O CI encoder MC145026 pode trabalhar numa faixa de tenso de 2,5 a 18V. J os decoders MC145027 e MC145028 trabalham entre 4,5 a 18V. Tenso de trabalho dos mdulos RT4 e RR3 O mdulo receptor RR3 pode trabalhar numa faixa de tenso que vai de 4,5 a 5.5V. J o mdulo transmissor RT4 trabalha entre 2,0 a 14,0V.

Figura 12 - Animao: Modulao da mensagem travs da portadora de RF

A animao acima mostra a transmisso dos dados digitais entre os pares MC145026/RT4 e RR3/MC145027. Veja que o encoder MC145026 envia os bits de endereo/dados serialmente para o mdulo transmissor assim que o pino TE tenha sido levado a nvel baixo (0v). Por sua vez, o mdulo RT4 transmite os bits modulados atravs da portadora de Rdio Freqncia. O mdulo RR3 captura os dados e repassa-os para o decoder MC145027 que faz uma comparao nos bits do endereo recebido com os bits do endereo de sua prpria configurao. Se os endereos forem iguais, os bits de dados ficam disponveis nos pinos (D6,D7,D8 e D9) e o pino VT levado a nvel alto (1). O pino VT s permanece ativo por um instante informando que um dado foi reconhecido e est disponvel. J os pinos dos dados retm a ltima informao. Isso possvel porque estes pinos esto ligados a um latch (um tipo de memria voltil elementar). Esses dados permanecem no latch at que um novo dado seja enviado e aceito, ou a alimentao da fonte seja interrompida.
Tabela 1 - Opo de escolha dos componentes para criar a oscilao desejada nos CIs MC145026/27

f osc (kHz)
362 181

RTC CTC' Rs
10 k 10 k 120 pF 20 k 240 pF 20 k

R1
10 k 10 k

C1

R2

C2
910 pF 1800 pF

470 pF 100 k 910 pF 100 k

88.7 42.6 21.5 8.53 1.71

10 k 10 k 10 k 10 k 50 k

490 pF 1020 pF 2020 pF 5100 pF 5100 pF

20 k 20 k 20 k 20 k 100 k

10 k 10 k 10 k 10 k 50 k

2000 pF 100 k 3900 pF 100 k 8200 pF 100 k 0.02 F 0.02 F 200 k 200 k

3900 pF 7500 pF 0.015 0.02 0.1 F F F

1.71

50 k

5100 pF

100 k

50 k

0.02

200 k

0.1

Para que os CIs MC145026/27 trabalhem conforme o esperado, importante escolhermos os valores dos capacitores e resistores mostrados na tabela acima, elaborada pelo fabricante. Observem a primeira coluna da tabela, l se encontram as freqncias, e nas demais colunas, os valores dos componentes (resistores e capacitores) necessrios para produzi-las. Aqui no nosso projeto, escolhemos a freqncia de 1.71KHz (ltima linha da tabela). No escolhemos por caso essa freqncia, mas porque a nica freqncia da tabela que no excede o limite da banda passante do mdulo receptor RR3, que de 2KHz. Para facilitar a aquisio dos componentes no mercado, o resistor de 50K ohm pode ser substitudo por um de 51K ohm, o capacitor de 5100pF pode ser substitudo por um de 5,6nF (polister). Para ficar mais legvel, as medidas dos capacitores C1 e C2 formam convertidas de micro para nano, conforme mostra a tabela abaixo:
1.71 51 k 5,6 nF 100 k 51 k 22 nF 200 k 100 nF

Nota: Alguns usurios da Rogercom tem dificuldades em fazerem os circuitos transmissor e receptor se comunicarem. Preste bastante ateno nos seguintes dethalhes para ter sucesso com o projeto desta aula: Os mdulos RR3 e RT4 devem operar na mesma freqncia; O capacitor Ctc do circuito transmissor RT4 tem que ser de poliester, com valor em torno de 5,6 nF; A configurao do endereamento (A1 a A5) do circuito RT4 tem que ser idntico ao do circuito RR3; Fazer um teste sem os mdulos RR3 e RT4, somente com o Decoder e o Encoder atravs de um fio para saber se eles esto oscilando na mesma freqncia; Antes de alimentar os circuitos, checar pelo menos 2 vezes a montagem dos componentes;

Informaes

USB OTG (On The Go) Tecnologia que permite conectar entre si dispositivos USB sem a necessidade de um computador. Assim, possvel que uma mquina fotogrfica digital imprima direto numa impressora que tenha agregada esta tecnologia. A Leadership (www.leadershop.com.br) fabricante de acessrios para informtica, ps no mercado uma caixa de som que usa a tecnologia OTG. Ela permite reproduzir arquivos digitais MP3 sem a necessidade do computador, possevel at plugar um pen driver.
Caixas de som OTG Leadership

Para mais informaes:


http://www.semiconductors.philips.com/products/connectivity/usb/products/otg/overview/#wh at Tutorial OTG.pdf

WUSB (Wireles Universal Serial Bus) Tecnologia USB sem fio. Como o padro Bluetooth para interconexo sem fio de perifricos no agradou muito dos fabricantes, com sua velocidade atual de 1Mbps, o WUSB j o queridinho, com uma velocidade de 110Mbps para distncias de at 10 metros e 480Mbps (3 metros), pode conectar at 127 dispositivos simultaneamente por porta. O WUSB baseado na tecnologia de rdio UWB (Ultra Wideband) da MultiBand OFDM Alliance (MBOA) e WiMedia Alliance, associaes que promovem conectividade sem fio. O WUSB utiliza a faixa de freqncia UWB de 3,1 GHz a 10,6 GHz. Diferente do Bluetooth que usa a freqncia de 2,4 GHz, a mesma usada pela Wi-Fi IEEE 802.11. Para fazer com que seu PC reconhea e conecte dispositivos WUSB, simplesmente plugue em uma porta USB do seu PC um adaptador HWA (Host Wire Adapter). Se desejar plugar dispositivos USB tradicionais, adquira um DWA (Device Wire Adapter). Veja o exemplo da figura abaixo:

Exemplo de conexo sem fio de dispositivos USB

O consorcio que criou o WUSB formado pelas empresas: Agere Hewlett-Packard Intel Microsoft NEC Philips Samsung A evoluo da velocidade do WUSB depender do avano da tecnologia de rdio UWB (Ultra Wideband). Para mais informaes:
Sobre WUSB (Wireless Universal Serial Bus) Sobre UWB (Ultra Wideband)

Pesquise sobre a disponibilidade desses produtos no mercado brasileiro, pois eles faro a diferena na implementao de um novo projeto. O futuro profissional agora est em suas mos, progridam e realizem seus objetivos. At o prximo curso, Antonio Rogrio Messias www.rogercom.com So Paulo, 18 de dezembro de 2005 21h35.

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