Escolar Documentos
Profissional Documentos
Cultura Documentos
com
ÍNDICE
Introdução ao USB (Universal Serial Bus) ............................................................................................. 1
Topologia USB (Tier star)....................................................................................................................... 7
Topologia física ...................................................................................................................................... 8
Hub ......................................................................................................................................................... 9
Portas Downstream e Upstream ............................................................................................................ 9
Tipos de produtos USB disponíveis no mercado ................................................................................... 9
Arquitetura típica de um sistema USB ................................................................................................... 9
Dispositivos com mini-hub incluso ....................................................................................................... 10
Controlador Host .................................................................................................................................. 11
UHCI..................................................................................................................................................... 12
OHCI..................................................................................................................................................... 12
EHCI ..................................................................................................................................................... 12
Visão geral do sistema USB................................................................................................................. 14
Tipos de conectores ............................................................................................................................. 15
Estrutura elétrica e sinais do cabo USB............................................................................................... 18
Corrente/tensão do BUS ...................................................................................................................... 18
Características do cabo USB ............................................................................................................... 19
Configuração de alta e baixa velocidades ........................................................................................... 20
Tipos de interfaces ............................................................................................................................... 21
Bus-powered ........................................................................................................................................ 24
Self-powered ........................................................................................................................................ 26
Protocolo .............................................................................................................................................. 28
Tipos de fluxo de dados ....................................................................................................................... 28
Control .................................................................................................................................................. 28
Interrupt Data........................................................................................................................................ 28
Isochronous .......................................................................................................................................... 29
Bulk Data .............................................................................................................................................. 29
Endpoints.............................................................................................................................................. 34
Pipes..................................................................................................................................................... 34
Stream .................................................................................................................................................. 35
Message ............................................................................................................................................... 36
Descritores ........................................................................................................................................... 36
Processo de enumeração .................................................................................................................... 43
Conhecendo o chipset FT232BM......................................................................................................... 45
Características...................................................................................................................................... 45
Pinagem ............................................................................................................................................... 47
Configuração ........................................................................................................................................ 48
Configuração da EEPROM 93C46 (56 ou 66) ..................................................................................... 48
Configurando uma interface Bus-powered........................................................................................... 50
Configurando uma interface Self-powered........................................................................................... 51
Configurando LEDs indicadores de comunicação (TX/RX) ................................................................. 54
Instalação e configuração de drivers relacionados aos chipsets FTDI................................................ 56
DLL ....................................................................................................................................................... 56
Porta Virtual COM (VCP) ..................................................................................................................... 65
Usando o aplicativo Mprog para gravar a EEPROM 93C46................................................................ 75
Programando a memória EEPROM 93C46 para personalizar o dispositivo ....................................... 82
Desinstalando os drivers D2XX e VCP ................................................................................................ 87
Introdução a Porta Serial...................................................................................................................... 91
Modos de transmissão serial................................................................................................................ 93
Simplex................................................................................................................................................. 94
Half-duplex ........................................................................................................................................... 94
Full-duplex ............................................................................................................................................ 94
DTE-DCE.............................................................................................................................................. 95
Tipos de transmissão ........................................................................................................................... 95
Síncrona ............................................................................................................................................... 95
Índice USB/Serial
ROGERCOM – Curso USB/Serial – www.rogercom.com
ÍNDICE
Assíncrona............................................................................................................................................ 96
Bit de paridade ..................................................................................................................................... 98
Interface RS232.................................................................................................................................... 99
Sinais elétricos ................................................................................................................................... 100
Conectores ......................................................................................................................................... 101
Controle de fluxo por software ........................................................................................................... 105
Controle de fluxo por hardware .......................................................................................................... 106
Cabo Null Modem............................................................................................................................... 107
Confecção de cabos para controle de Fluxo por Hardware............................................................... 108
Interligação LoopBack........................................................................................................................ 109
UART.................................................................................................................................................. 111
Registradores ..................................................................................................................................... 113
THR .................................................................................................................................................... 114
RDR.................................................................................................................................................... 114
DLH .................................................................................................................................................... 114
DLL ..................................................................................................................................................... 114
IER...................................................................................................................................................... 115
IIR ....................................................................................................................................................... 116
LCR .................................................................................................................................................... 116
MCR ................................................................................................................................................... 117
LSR..................................................................................................................................................... 118
MSR.................................................................................................................................................... 119
Funções da API do windows para acessar a Porta Serial ................................................................. 121
CreateFile()......................................................................................................................................... 122
GetCommState() ................................................................................................................................ 123
SetCommState()................................................................................................................................. 123
BuildCommDCB()............................................................................................................................... 125
GetCommTimeouts().......................................................................................................................... 126
SetCommTimeouts() .......................................................................................................................... 126
ReadFile()........................................................................................................................................... 127
WriteFile() ........................................................................................................................................... 128
CloseHandle()..................................................................................................................................... 129
EscapeCommFunction()..................................................................................................................... 130
SetCommBreak()................................................................................................................................ 130
ClearCommBreak() ............................................................................................................................ 130
TransmitCommChar()......................................................................................................................... 130
GetCommModemStatus() .................................................................................................................. 131
Interface para testar as linhas do Modem.......................................................................................... 133
Convertendo sinais padrão RS232 em TTL....................................................................................... 135
Interface foto-acoplada usando o CI 4N25 ........................................................................................ 135
Interface usando o driver MAX232..................................................................................................... 135
Trabalhando com o microcontrolador PIC 16F877 ............................................................................ 137
Pinagem do PIC 16F877 .................................................................................................................... 139
Funções: set_time0(),get_timer0(),set_tris_d(),setup_timer_0()........................................................ 140
Funções: enable_interrupts(),input(),output_bit(),output_high(),output_low() ................................... 140
Funções: delay_ms(), getc(),printf() ................................................................................................... 141
Diretivas: #int_rda,#include,#use delay,#fuses rs232........................................................................ 142
Tipos de osciladores: LP, XT, RC, HS ............................................................................................... 142
Tipos de fusíveis................................................................................................................................. 142
Definindo a direção dos pinos de I/O do PIC 16F877........................................................................ 143
Exemplos de circuitos e programação usando o PIC 16F877........................................................... 144
Circuito/programa pisca LED usando while()..................................................................................... 144
Circuito/programa pisca LED usando timer0() ................................................................................... 145
Circuito/programa lê botão (interuptor) .............................................................................................. 146
Índice USB/Serial
ROGERCOM – Curso USB/Serial – www.rogercom.com
ÍNDICE
Conectando o PIC 16F877 na Porta Serial RS232............................................................................ 148
Conectando o PIC 16F877 no Bus USB ............................................................................................ 149
Instalando o CCS C Compiler (Versão Trial Evaluation 30 dias)....................................................... 151
Configurando o MPLAB IDE para gravação do microcontrolador PIC16F877 .................................. 153
Escolhendo uma placa para gravar o microcontrolador PIC ............................................................. 162
Testando os circuitos da Aula 15 ....................................................................................................... 168
Projetos práticos................................................................................................................................. 169
Conversor USB<=>RS232 ................................................................................................................. 170
Conversor USB<=>RS485 ................................................................................................................. 171
Conversor USB/RS485<=>RS485/USB (numa distância de até 1.200m)......................................... 172
Comunicação USB<=>RS485 com o PIC16F877 a 256.000 bps ..................................................... 173
Interfaces Foto-acopladas.................................................................................................................. 176
Programação através das funções da dll FTD2XX.DLL .................................................................... 179
Trabalhando no modo Bit Bang para controle de 8 pinos (I/O paralela) ........................................... 190
Controle de Relês............................................................................................................................... 193
Sensor de temperatura....................................................................................................................... 201
Sensor de luminosidade..................................................................................................................... 205
Controle de Motor de Passo............................................................................................................... 208
Construindo um dirver Serial para controle de um display LCD via USB .......................................... 220
Controle de acesso sem fio através dos módulos RR3/RT4 da Telecontrolli.................................... 236
Informação: USB OTG (On The Go) .................................................................................................. 252
Informação: WUSB (USB Wireless) ................................................................................................... 252
Bibliografia.......................................................................................................................................... 253
Índice USB/Serial
ROGERCOM – Curso USB – www.rogercom.com
É com imensa alegria e satisfação que venho através deste curso, acrescentar a
todos um pouco da minha experiência com algumas pesquisas, testes e estudos
sobre o barramento USB. Espero que todos gostem e tirem o máximo proveito das
informações 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, câmeras digitais, modems, celulares, relógios, aparelhos de som, placas
de interfaces, Finger Scanners, Players MP3, gravadores/leitores de CD-ROM/DVD,
memórias portáteis, entre outros. Parece até moda, mas na verdade, os produtos
com interfaces USB tornaram as vidas dos técnicos, usuários e consumidores de
eletrônicos muito mais fáceis. Onde antes, o usuário que deseja-se acrescentar por
exemplo, um scanner ao computador, era necessário abrir o gabinete, espetar uma
placa em um de seus slots, jampear, configurar endereços 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 configuração. Pronto, o scanner está apto a trabalhar.
Nas primeiras aulas iremos conhecer o sistema USB de um modo geral, para
nos capacitar a compreender as futuras aulas que tratarão da criação, programação
e desenvolvimento de circuitos usando os chipset da FTDI.
Figuras 2 e 3
O USB (Universal Serial Bus) surgiu em 1995 com uma parceria entre várias
companhias de alta tecnologia (Compaq, Hewlett-Packard, Intel, Lucent, Microsoft,
NEC e Philips). Uma das primeiras versões 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 versão é conhecida com Full-speed. No final de 2000 foi
lançada a versão 2.0 (high-speed), compatível com as versões anteriores, mas com
alguns aperfeiçoamentos que vão desde a topologia, à velocidade de trafego de
dados, chegando ao extremo de 480Mbps, equivalente a cerca de 60MBps (60
milhões de Bytes por segundos).
Figura 12 - Mostra um Hub de 7 portas, sua fonte de alimentação e um cabo para conectar ao
Host/controlador
Os Hubs costumam ser ligados à Rede elétrica para alimentar seus circuitos e ao
mesmo tempo fornecer correntes suficientes para alimentar dispositivos conectados
às suas portas. Alguns Hubs não têem fontes externa, estes são parasitas,
alimentam-se da própria corrente do barramento USB. Esses Hubs não são uma boa
escolha se você pretende "plugar" dispositivos que também se alimentam através do
barramento.
Veja na figura acima, que temos somente um Host (hospedeiro), alguns Hub e
vários dispositivos/funções pendurados ao sistema, em forma de uma árvore. Isso é
somente um exemplo de como agregar ao sistema USB, vários dispositivos distintos.
CONTROLADOR HOST
É responsabilidade do Host:
Como já foi mencionado na aula anterior, o padrão USB foi desenvolvido por um
consórcio de empresas de tecnologia de ponta, destacando-se entre elas: Compaq,
Hewlett-Packard, Intel, Lucent, Microsoft, NEC e Philips.
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.
EHCI - (Enhanced Host Controller Interface). Surgiu para unir o que de melhor tem
os dois modelos anteriores; como aumento significativo na velocidade de
comunicação (largura de banda) chegando ao extremo de 480Mbps, onde o driver
(software) e o hardware, trabalham dividindo o serviço para que dispositivos de
áudio e vídeo possam funcionar simultaneamente em alta velocidade.
Na figura abaixo dá para se ter uma idéia geral do sistema USB, desde a
aplicação 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.
2 - A API por suas vez chama o Driver do Cliente. Ou seja, o software básico
do fabricante do Dispositivo USB. Este driver na maioria das vezes acompanha o
protudo adquirido pelo usuário; é instalado no sistema operacional tornando-se parte
do mesmo. Por exemplo, quando compramos uma máquina digital, vem com ela um
CD-ROM, contendo os drivers e a aplicação para visualizar fotos;
Um dos nossos objetivos com esse curso, é criar a Aplicação (programa EXE) e
desenvolver o dispositivo (produto final), utilizando como base o chipset FT232BM
da FTDI. A API e os Drivers do Cliente são fornecidos pela própria FTDI sem
nenhum pagamento de royalties. Ou seja, podemos desenvolver um novo produto
USB, vender a um cliente e os drivers seguirem junto.
Tipos de conectores
Série "A":
-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.
Série "B":
-Conector Tipo "B" Macho, encontrado em um dos extremos do cabo USB, onde
deve ser conectado a um dispositivo/função.
Figura 9 - Pinagem dos conectores Tipo "A" e "B" Machos do cabo USB
Veja agora, que nos conectores dos cabos, a identificação dos pinos são
diferentes. Observem também que os dois extremos do cabo dispõem de Tipos "B"
macho.
O cabo USB é composto por 4 fios e uma malha para eliminação de ruídos
simples. Desses, 2 são fios que transportam energia para alimentar dispositivos.
Essa energia é fornecida pela controladora e gerenciada pelo Driver do Controlador
Host.
O Cabo USB usa cores padrão 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 Preta é o GND (0v). Este é o pino negativo de energia do Bus.
Os outros dois fios D+(dado+) e D-(dado-) são usados pelo sistema USB para
transferência de dados entre o Host, hub e dispositivos. Todos os sinais de dados
trafegam apenas por esses dois fios usando a codificação NRZI (No Return to Zero
Inverted). Ou seja, o bit 1 é codificado através de uma transição ocorrendo da maior
voltagem para a menor, ou também o inverso, da menor para a maior. Já o bit 0 é
codificado sem haver transição. Durante o intervalo de um bit a voltagem é
constante.
As duas figuras acima mostram as cores dos fios, associadas aos números dos
pinos dos conectores, tanto do Tipo "A" como do Tipo "B".
Tipos de interfaces
Veja que na figura acima o dispositivo está ligado a um Hub Bus-powered, nesta
configuração cada porta do hub fornece no máximo 100mA. Assim, o dispositivo só
poderá extrair 100mA da porta.
Dos 500mA fornecidos por uma porta do Root hub, 100mA são para alimentar
seu próprio circuito.
Protocolo USB
A largura de banda para esse tipo de transferência pode variar se houver outras
atividades concorrentes sendo executadas no barramento USB. Esse tipo de
transmissão garante a segurança no tráfego de dados, mas não garante velocidade
constante em que os mesmos são transmitidos.
Cada transação USB consiste dos seguintes pacotes mostrados na figura abaixo:
• SYNC - Todos os pacotes têem que começar com um campo de. Este campo
tem um tamanho de 8 bits para velocidades baixas e, 32 bits para altas
velocidades. É utilizado para sincronizar o relógio (clock) do transmissor com
o do receptor.
• PID - Representa Pacote ID (identificação). Este campo tem um tamanho de 8
bits, é usado para identificar o tipo de pacote que será enviado.
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 informações
sobre o tipo de pacote. Os bits (PID#0 a PID#3) são usados para checagem dos
dados (cálculo para verificação e prevenção de erros).
• DATA - São os dados propriamente dito para transferência. Este campo pode
armazenar até 1024 bytes.
• DATA0
• DATA1
• DATA2
• MDATA
DATA 0 e DATA 1 são utilizados nos modos low speed e full speed;
DATA 2 e MDATA são utilizados somente no modo de alta velocidade (High Speed).
Protocolo USB
Descritores
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.
http://www.hhdsoftware.com/download.html.
São através dos campos acima que o driver USB do Sistema Operacional
carrega os drivers USB do dispositivo corretamente, após a leitura de um arquivo
Dispositivos de
2
comunicação.
Dispositivos de Interfaces
humanas: Mouse,
3
Teclados, Joysticks, leitor
código de barras, etc.
Imagem: Scanner,
6
câmera.
7 Impressoras.
Amazenamento de
massa: Floppy disk
8 driver, CD-ROM, DVD,
ATAPI, SCSI, memória
flash.
9 Hub.
10 Interface de Dados.
11 Chip/Smart card.
Vendor-Specific:
dispositivos que não
entram em qualquer outra
255
classe.
Interface Serial RS232,
Rede ponto-a-ponto, etc.
Processo de enumeração
Principais características
Na figura acima temos uma visão geral em blocos do chipset FT323BM, onde
podemos ver a célula do regulador de tensão que fornece 3.3v no pino 3v3OUT do
chipset; a célula (USB transeiver) que trata diretamente os sinais D+ e D- através do
meio físico (cabo) , o USB DPL que trata da codificação NRZI; o multiplicador de
sinal de clock, que a partir de uma freqüência de 6Mhz gera 48Mhz; a Interface
Serial avançada (SIE); a UART que disponibiliza os dados seriais para comunicação
externa (RS232/RS422/RS485); célula EEPROM que gerencia uma memória
externa 93C56, 93C66 ou 93C46 opcional para personalizar o produto USB; célula
para controle dos Buffers FIFO; o USB Protocol Engine, que trata da pilha de dados
do protocolo USB em baixo nível, como Pipes, Endpoints, etc.
Numa interface Bus-powered o pino 14-PWRCTL deve ser levado a nível baixo
(0v). A ferreite é ligada em série ao pino 1-Vbus (+5v do Bus USB) para eliminar
ruídos que possam afetar o bom funcionamento do dispositivo.
Numa interface Self-powered o pino 14-PWRCTL deve ser levado a nível alto
(+5v). Deverão 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 8 - Oscilador com resonador cerâmico Figura 9 - Oscilador com cristal de quartzo
Usando um driver VCP, qualquer aplicação que se comunique com a porta serial
RS232 pode se comunicar naturalmente com o Bus USB, sem nenhuma modificação
no programa. Para se criar um novo programa que acesse o Bus USB através do
driver virtual, as funções são as mesmas da API do windows usadas para programar
a porta serial. Se não quiser usar a API do windows a FTDI também disponibiliza
uma biblioteca de funções para facilitar a programação por parte do desenvolvedor.
A FTDI informa em seu site que alguns usuários dos drivers D2XX, usando o
VID(0x0403) e PID(0x6001) padrão, tiveram problemas ao instalar o mesmo no
Windows XP com Service Pack 1.
3 Após se abrir a nova página, clique no link D2XX. Apos isso é exibida a
seção . Clique no link D10620 correspondente ao seu
sistema operacional.
Figura 3 - Janela exibida ao conectar o dispositivo pela primeira vez ao Host (PC)
Observação:
O Windows registra a instalação 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.
Na próxima aula irei explicar como instalar os drivers VCP, e também gravar a
memória 93Cxx para personalizar um dispositivo baseado no FT232BM para
comercialização.
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, também se comunicarem com uma Porta USB. Sendo assim, um programa já
existente de comunicação Serial, poderá se comunicar com o Bus USB sem ser
necessário nenhuma alteração no seu código fonte. Novos programas podem ser
criados usando a API do Windows para programação da porta Serial, para se
comunicarem com o Bus USB, usando a mesma facilidade de programação da Porta
Serial. Os programas também podem ser criados usando a biblioteca de funções da
FTDI.
3 Após se abrir a nova página, clique no link VCP. Apos isso é exibida a seção
. Clique no link R9052154 correspondente ao seu sistema
operacional.
Além dos arquivos de drivers de conversão Serial para USB (FTDIBUS), a FTDI
disponibiliza também um mini driver para controle de um mouse Serial.
Figura 2 - Janela exibida ao conectar o dispositivo pela primeira vez ao Host (PC)
Observação:
O Windows registra a instalação 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.
Na próxima aula irei explicar como gravar a memória 93Cxx para personalizar
um dispositivo baseado no FT232BM para comercialização.
Figura 1 - Tela parcial do MProg com dados padrão FTDI para o chipset FT232BM.
A - (Modo de edição). Quando um arquivo for aberto ou salvo e, após isso, for
necessário fazer uma alteração em um dos campos do MProg, é preciso clicar nesse
botão para habilitá-los;
2 - (USB VID/PID). Se você desejar gravar seu próprio VID e PID, selecione a
opção Own VID & PID. Se desejar manter o padrão FTDI (VID=0403 e PID=6001),
selecione a opção FTDI default;
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 máxima de correntente que ele consumirá. O valor
máximo permitido é 500mA.
7 - (USB Serial Number Control). Todo dispositivo USB poder ter um número
Serial. Nessa opção poderemos definir nosso próprio número Serial ou pedir que o
MProg crie um automaticamente, iniciando a partir de um prefixo de dois caracteres;
9 - (Disable USB Serial Number). Ao marcar essa opção o Número Serial não será
levado em conta. Ou seja, a opção 7 será desconsiderada;
11 - (USB Remote Wake Up). Se esta opção for habilitada na EEPROM, será
possível a partir do pino RI# (em nível lógico baixo) do FT232BM, retomar o
Controlador Host USB do estado de dormência (Sleep);
12 - (Enable Plug And Play). Windows plug and Play. Usada somente para chips
da série FT232. Ao selecionar um chip do tipo FT245 esta opção é automaticamente
desabilitada;
[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"
[ControlFlags]
ExcludeFromSelect=USB\VID_0403&PID_6001
[Strings]
USB\VID_0403&PID_6001.DeviceDesc="USB Serial Converter"
[Strings]
VID_0403&PID_6001.DeviceDesc="USB Serial Port"
Como exemplo, na próxima aula iremos criar um novo PID e VID, gravá-los na
EEPROM do dispositivo e fazermos as devidas alterações nos arquivos INF e INI
dos drivers D2XX.
Nesta aula iremos usar o aplicativo MProg para gravar a memória EEPROM
93C46, e assim personalizar o novo dispositivo criado. Iremos também aprender a
remover do sistema, os drivers D2XX e VCP.
Para executar na prática, 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á visível a tela de edição do MProg onde constam
alguns campos marcados. Esses campos foram alterados conforme as
características do dispositivo que se quer personalizar.
1 - Certifique-se se há uma pasta com os arquivos dos drivers D2XX em seu disco
rígido (HD):
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:
[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.
4 - Conecte o seu novo dispositivo FT232BM a uma das portas do Root Hub do
Host PC;
9 - Após o preenchimento dos dados, clique no botão (Save Template As...) para
salvar o template em um arquivo (DispResid1.ept);
Dicas:
- Se por algum motivo você não lembrar qual é o número do VID e PID que
estão gravados na memória EEPROM do dispositivo, execute o aplicativo
Usbview.exe (analisador de protocolo USB).
Download do Usbview.exe.
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 são 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.
Observação importante:
A figura acima mostra a tela de mensagem de erro, exibida quando o VID e PID
dos drivers são diferentes daqueles existentes na memória EEPROM do dispositivo.
A partir desta aula iremos começar nossos estudos sobre a comunicação serial,
especificamente o padrão RS232 que tem mais de 40 anos de existência, mas ainda
é muito usado em vários dispositivos atuais, como computadores Modems, Mouses,
Microcontroladores, Impressoras etc. Como objetivo principal pretendo deixar
informações suficientes para que possam compreender o funcionamento da porta
serial e, a partir dessa compreensão, tornarem-se capacitados a criar, tanto software
de controle como o hardware, e assim implementar seus novos projetos.
bit, tamanho dos dados de 5 bits, entre outras similaridades, iremos compreender
nesta aula.
LTRS F A D A FIGS !
11111 01101 00011 01001 00011 11011 01101
A figura acima mostra uma fita de papel com impressões dos códigos de
Baudot. O bit 1 (Marca) é associado a um furinho, e o bit 0 (Espaço), a ausência do
mesmo, ou seja, um espaço.
SIMPLEX
No modo Simplex, o fluxo de transmissão 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 Rádio, onde ela só transmite.
HALF-DUPLEX
No modo Half-duplex ambos os dispositivos transmitem nos dois sentidos, mas,
não simultaneamente. Ou seja, um transmite enquanto o outro espera e vise versa.
Esse modo usa um único canal bidirecional. Como exemplos, podemos citar um
rádio Walk-Talk, onde ambas as pessoas podem falar e escutar, mas não ao mesmo
tempo.
Figura 4 - HALF-DUPLEX
FULL-DUPLEX
No modo de transmissão 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 veículos rodam nos dois sentidos.
A porta Serial RS232 trabalha em modo Full-duplex, através das duas linhas TX-
RX.
Figura 5 - FULL-DUPLEX
DTE / DCE
Tipos de transmissão
Síncrona
No tipo de transmissão síncrona, o DTE fica constantemente enviando sinais
para o DCE, com o objetivo de manter a sincronização da comunicação. Esse tipo
de transmissão é mais rápido que a assíncrona, porque não necessita enviar sinais
de controle para cada byte transmitido, como, Start bit e Stop bits.
A figura acima mostra uma transmissão síncrona em nível físico (de hardware).
Observe que o DTE é quem envia o sinal de clock para manter o DCE em
sincronismo. Os bits dos pacotes são enviados um-a-um através da linha de Dados
a cada mudança do sinal de clock.
sinc sinc sinc... INICIO_BLOCO "Curso USB/Serial" FIM_BLOCO sinc sinc sinc...
Muitos chips de memória usam a transmissão síncrona para ler e gravar dados.
Assíncrona
No tipo de transmissão assíncrona, o relógio do DTE e DCE são configurados
para oscilarem na mesma freqüência (velocidade de transmissão).
A figura acima mostra uma transmissão assíncrona; DTE e DCE teem relógios
de temporização independentes; são configurados com a mesma velocidade (Baud);
mas para garantir a sincronização ideal, os dados teem tamanho máximo de 8 bits (9
quando utilizá-se o bit de paridade), e são precedidos e finalizados com bits de
sincronismos, respectivamente (Start bit e Stop bit).
Para saber o tempo de cada bit, divida o número 1 pela taxa de baud: 1/9600 =
104uS (arredondado). Este é o tempo de um bit.
Bit de Paridade
Se a transmissão não for usar bit de paridade, isso deve ser avisado na
configuração do DTE e DCE.
Os tipos de paridades que podem ser usadas para configurar os terminais são:
Nenhuma, Ímpar, Par, Marca ou Espaço. As paridades Marca e Espaço não são
mais usadas, e ainda constam nas configurações para manter compatibilidade com
os antigos sistemas de transmissão serial.
Interface RS232
O padrão RS232 foi criado em 1962 para conectar diretamente dois dispositivos.
Foi padronizado pela Associação de Indústria de Eletrônica (EIA). Originalmente era
usado para conectar dispositivos de teletipo que utilizavam o código ASCII para
transmitir dados de forma assíncrona. As letras "RS" quer dizer “Recomended
Standard” (padrão recomendado) e 232, é a versão. O padrão RS232 foi criado com
o objetivo de definir as características elétricas, temporização, mecânicas e funções
dos sinais da interface serial, para conectar dispositivos ponto-a-ponto.
Com o passar dos anos o padrão evoluiu e teve a terceira revisão em 1969 (RS-
232C) versão "C". EIA-232D e EIA-232E foram atualizadas respectivamente em
1987 e 1991.
Sinais elétricos
Algumas interfaces RS232 nos computadores atuais fornecem -12v e +12v, mas
suportam mínimas de -25v e máximas de +25v.
Conectores
Obs.: Alguns pinos do DB25 não foram descritos aqui, isso porque não são muito
utilizados. Alguns cabos seriais usam o pino 1 para ligar um fio de malha. No DB9
não há um pino para ligar a malha e pode ser soldado na própria carcaça do cabo. O
objetivo do fio de malha é eliminar ruídos na transmissão entre o DTE e o DCE,
quando a mesma se faz em altas velocidades.
Observe que no conector DB9 o pino 2 é RXD, e o pino 3 é TXD. No DB25 isso
não é o mesmo, veja na tabela acima que é o inverso. Fique atento quando for fazer
conversões de conectores DB9 para DB25 ou vice versa.
Quando o DTR for ligado ("0") prepara o modem para ser conectado ao telefone.
Após a conexão o sinal se mantém. Para desconectar o modem da linha telefônica,
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.
O CTS é habilitado em ("0") pelo DCE para avisar ao DTE (PC) que ele já pode
transmitir.
O DCD é habilitado em nível lógico ("0") pelo DCE quando a linha telefônica
estiver fora do gancho ou uma conexão for completada. Quando não houver tom de
resposta, o DCE envia um lógico ("1") para o DTE (PC).
O DSR é habilitado em ("0") lógico pelo DCE para avisar sucesso na operação. Se
houver um erro o DCE sinaliza com um ("1") lógico.
O RI é habilitado em nível lógico ("0") quando for detectado um sinal de chamada
na linha telefônica. É desabilitado em ("1") quando não houver tom de chamada.
A linha de saída >> TXD é utilizada para enviar bits de dados numa velocidade
controlada pelo hardware da porta serial. Como sabemos, através dessa linha
podemos enviar um byte no formato (Start bit, bits de dados, paridade, Stop bit). Mas
também é possível 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. Através dessa linha podemos
receber um byte no formato (Start bit, bits de dados, paridade, Stop bit).
Para implementar o controle de fluxo por hardware é preciso adicionar mais linhas
entre o DTE e o DCE. Numa comunicação 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.
Algumas vezes o controle de fluxo via hardware pode ser implementado através
dos sinais DTR/DSR da mesma forma como foi explicado usando os sinais
RTS/CTS. Veja na figura abaixo, a conexão das linhas para se confeccionar um
cabo serial com suporte a controle de fluxo via hardware, usando os sinais
DTR/DSR.
Os três cabos abaixo são usados para conectar dois dispositivos através de
controle de fluxo (handshaking) por Hardware. Veja que a diferença entre as três
figuras são os tipos de conectores:
Interligação LoopBack
UART
(Universal Asynchronous Receiver Transmitter)
Transmissor e Receptor Assíncrono Universal
Na figura acima temos uma visão geral da estrutura interna do chip UART
16550. No lado esquerdo da figura observamos os pinos que serão conectados ao
Host (CPU), e ao lado direito, os pinos que serão conectados ao circuito driver da
interface RS232.
Na tabela acima, temos nas duas primeiras colunas, os endereços das Portas:
COM1 e COM2. Esses endereços são fixos nos microcomputadores padrão IBM-PC
e similares. Observe também que um endereço está associado a um ou mais
Registradores do UART. Veja o endereço 3F8h, ele está associado aos
Registradores THR, RDR e DLL.
Quando uma aplicação 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). Após isso, o
Frame é movido para o registrador de deslocamento e depois transferido serialmente
pelo pino TXD da interface RS232.
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 recepção RDR.
Para saber se há um dado no buffer de recepção RDR, nossa aplicação 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.
Veja na tabela abaixo, alguns valores que podem ser passados como
parâmetros aos registradores DLH e DLL, para configurar a velocidade de
transmissão do UART:
Uma vez feita a configuração do UART e, uma conexão tenha sido estabelecida,
não é mais possível fazer mudanças, a não ser que se faça uma desconexão.
Depois é possível alterar as características e fazer uma nova conexão. Ou seja,
enquanto uma aplicação estiver conectada em uma porta serial COMx, não é
possível alterar as características da comunicação, pois ocorrerá erros.
Uma aplicação 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
transmissão.
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".
O registrador MSR é usado para obter informações sobre o estado das linhas do
Modem, ou seja, as linhas de handshaking (CTS, DSR, RI e DCD). Estas linhas são
todas entradas, e podem ser lidas no DTE ou no DCE como níveis lógicos um ("1")
ou zero ("0"). Já os bits de 0 a 3 registram se houve mudanças de estado nas linhas:
CTS, DSR, RI e DCD, desde o último acesso ao registrador MSR.
Comentário
No desenvolvimento de programas de comunicação serial RS232 para o
sistema operacional Windows, não precisamos manipular bit-a-bit os registradores
do UART para criar um aplicativo, programaremos em nível de API do Windows,
onde há um conjunto de funções que podem ser usadas com facilidade, para passar
parâmetros de configuração 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.
Para acessar a Porta Serial iremos utilizar algumas funções da API (Application
Programming Interface) - Interface de programação de aplicativos do Windows, que
tornam nossos programas compatíveis com as versões 95/98/Me/NT/2000 e XP.
Nesta aula, exemplos do uso das funções e programas estão escritos tanto em
Delphi com C++Builder. Como as funções da API são padronizadas, os exemplos
escritos em C++ são muito semelhantes aos do Delphi.
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 função.
hCom = CreateFile(
NomePorta, //Nome da porta.
GENERIC_READ | GENERIC_WRITE, //Para leitura e escrita.
0, //(Zero) Nenhuma outra abertura será permitida.
NULL, //Atributos de segurança. (NULL) padrão.
OPEN_EXISTING, //Criação ou abertura.
0, //Entrada e saída 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;
GetCommState() e SetCommState()
Essas duas funções são utilizadas para obter e alterar as configurações da Porta
Serial como: velocidade em que os dados são transmitidos, bit de dados, paridade,
bit de parada, etc.
Tabela 1 - Constantes e valores da API do Windows utilizadas para configurar a Porta Serial
BuildCommDCB()
Utilizada para preencher os campos da estrutura DCB com valores
especificados numa string de caracteres. O formato desta string deve ter esta
seqüência: 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 parâmetros do UART, use a função SetCommState() em vez da
BuildCommDCB().
GetCommTimeouts() e SetCommTimeouts()
Utilizadas para obter e alterar os parâmetros atuais dos Timeouts associados às
funções WriteFile() e ReadFile().
ReadFile()
Utilizada para lê dados através da Porta Serial. Para seu funcionamento, é
preciso que a função CreateFile() tenha retornado um identificador válido associado
com a Porta Serial especificada.
É através da função ReadFile() que é feita a leitura dos dados que chegam na
Porta Serial. Esta função aceita 5 parâmetros, sendo o primeiro (hCom), o
identificador da Porta Serial retornado na abertura da mesma através da função
CreateFile(). O segundo é um buffer (BufferRecebe), ou seja, é um local temporário
na memória onde os dados lidos da Porta Serial serão armazenados. O terceiro
(LEN_BUFFER), informa à função ReadFile() qual o tamanho do buffer de dados
(BufferRecebe). O quarto (BytesLidos), é uma variável do tipo ponteiro longo, onde a
função ReadFile() armazenará a quantidade exata de bytes lidos. O quinto e último é
um ponteiro para uma estrutura "overlapped", no nosso caso não será utilizada,
portanto, definimos este parâmetro com (nulo).
WriteFile()
Esta função é utilizada para enviar dados através da Porta Serial. Para seu
funcionamento é preciso que a função CreateFile() tenha retornado um identificador
(handle) válido, associado à Porta Serial especificada.
É através da função WriteFile() que nossos programas enviam dados pela Porta
Serial. Esta função aceita 5 parâmetros, sendo o primeiro (hCom) o identificador da
Porta Serial retornado na abertura da mesma através da função CreateFile(). O
segundo é um buffer de dados (BufferEnvia), ou seja, é um local na memória onde
deverá está armazenados os dados a serem enviados para a Porta Serial. O terceiro
(TamaString) informa à função WriteFile(), qual o tamanho do buffer de dados
(BufferEnvia). O quarto (BytesEscritos), é uma variável do tipo ponteiro longo, onde
a função WriteFile() retorna a quantidade exata de bytes escritos. O quinto e último é
um ponteiro para uma estrutura "overlapped", no nosso caso não será utilizada,
portanto, definimos este parâmetro com (nulo).
CloseHandle()
Esta função é utilizada para fechar a Porta Serial, aberta pela função
CreateFile().
EscapeCommFunction()
SetCommBreak() e ClearCommBreak()
TransmitCommChar()
Esta função e usada para transmitir um caracter através da linha TXD. Ela
coloca o caracter a ser transmitido a frente de quaisquer caracteres existentes no
buffer de transmissão. Se houver sucesso na transmissão, TransmitCommChar()
retorna um valor diferente de zero, caso contrário, retorna um valor igual a zero.
Ela é útil também para enviar caracter de interrupção de transmissão (como um
CTRL+C) diretamente para a porta serial.
GetCommModemStatus()
Os LEDs DTR e RTS são 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 botões for pressionado.
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 DELPHI;
Para o Max232A os valores dos capacitores são todos de 0.1uF / 50v. Para
qualquer outra versão do Max232, use capacitores com valores de 1uF / 50v.
Obs.: Os programas dessa aula foram gravados no PIC 16F877, usando o gravador
McFlash da Mosaico (www.mosaico-eng.com.br).
- 33 pinos de I/O;
- 8k de memória de programa FLASH;
- 368 bytes de memória RAM;
- 256 bytes de memória EEPROM;
- Velocidade máxima de trabalho 20Mhz;
- Watchdog timer (WDT);
- 3 Timers;
- 8 canais A/D de 10 bits;
- 1 USART síncrona/assíncrona;
- Porta Paralela escrava (PSP);
- Porta serial síncrona SSP, SPI e I2C;
Entre outras.
A figura acima mostra todos os pinos do PIC 16F877, com seus respectivos
nomes/funções. Os pinos (RA0 a RA5) estão 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 saída e são definidos na programação. Observe que a maioria dos
pinos teem mais de uma função. Como exemplo veja o pino 10 que teem as funções
de entrada/saída digital (RE2) e de selecionar um chip SPI (CS); ou a função de um
canal A/D (AN7).
Função set_timer0()
Altera o conteúdo interno do timer0. Esta função aceita como parâmetro uma
variável ou uma constante de 8 bits.
Exemplo:
set_timer0(131); //inicializa o valor do timer0 em 131.
Função get_timer0()
Obtém o valor interno do timer0. Ela retorna um valor de 8 bits.
Exemplo:
int8 valor;
valor = get_timer0();
Função set_tris_d()
Escrita e leitura na porta D. Ou seja, define se um ou vários pinos são entradas ou
saídas na porta D.
Um bit '1' indica que o respectivo pino associado a uma porta será usado como
entrada (Input). E um bit '0', saída (Output). O parâmetro pode ser passado à função
set_tris_d() também no sistema de numeração binário usando a constante 0b.
Exemplo:
set_tris_d(0b01000001); //Os pinos RD6 e RD0 são definidos como entradas e os demais como
saídas.
ou em hexadecimal:
set_tris_d(0x41);
Função setup_timer_0()
Configura o prescaler do timer0. O parâmetro passado é uma constante
predeterminada usada para dividir o sinal de contagem por um prescaler (divisor de
freqüência).
Exemplo:
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64); //Informa que o timer0() usa
interrupção interna, e que a freqüência é dividida por 64 (prescaler).
Função enable_interrupts()
Usada para habilitar uma interrupção.
Exemplos:
enable_interrupts( GLOBAL ); //Habilita o sistema de interrupção geral.
Função 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 variável estado for '0' (false), isso indica que o nível lógico do pino RD2
é baixo (low). Se for '1' (true), o nível lógico no pino RD2 é alto (high).
Função output_bit()
Liga ou desliga um determinado pino.
Essa função aceita dois parâmetros: o primeiro é o pino e o segundo é se ele será
ligado ou desligado.
Exemplos:
output_bit(pin_d0, 1); //Põe pino RD0 em nível alto (high). Pode-se usar a constante true em
vez de '1'.
output_bit(pin_d0, 0); //Põe pino RD0 em nível baixo (low). Pode-se usar a constante false em
vez de ' 0'.
Função output_high()
Liga (põe em nível alto) um determinado pino.
Exemplos:
output_high(pin_d2); //Põe o pino RD2 da porta D em nível Alto.
É o mesmo que usar:
output_bit(pin_d2, true);
Função output_low()
Desiga (põe em nível baixo) um determinado pino.
Exemplos:
output_low(pin_d2); //Põe o pino RD2 da porta D em nível Baixo.
É o mesmo que usar:
output_bit(pin_d2, false);
Função delay_ms()
Retarda o processamento do programa em milisegundos.
Exemplos:
delay_ms(15); //Aguarda 15 milisegundos.
delay_ms(1000); //Aguarda 1 segundo.
Função 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 variável valor.
Função printf()
Envia um ou mais caracteres formatados, pela porta serial (USART). Usa os
mesmos caracteres padrão de formatação da função printf() ANSI.
Exemplos:
printf("Curso USB/Serial.\r\n"); //Envia uma sting constante.
printf("%d", 85); //Envia um número decimal.
Diretivas
#int_rda
Usada para definir uma função de interrupção para leitura dos caracteres que
chegam no buffer da porta serial.
#include <16F877.h>
inclui o arquivo cabeçalho usado para se trabalhar com o PIC 16F877. Esse arquivo
contém várias constantes e definições úteis.
#use delay(clock=4000000)
Define o valor do relógio do PIC. Este valor tem que ser idêntico ao da freqüência do
cristal ou resonador externo. Para usar as funções delay_us(), delay_ms(),
delay_cycles() é necessário definir #use delay().
Tipo de osciladores:
Outros fusíveis:
WDT ---> (Watch Dog Timer) habilitado. O programa é resetado se por algum
motivo, travar;
NOWDT ---> (No Watch Dog Timer) desabilitado. Se travar, o programa não é
resetado;
BROWNOUT ---> Reset por queda de tensão habilitado. Sempre que a alimentação
cai a um valor mínimo;
NOBROWNOUT ---> Reset por queda de tensão desabilitado. O PIC não é
resetado;
LVP ---> Programação em baixa tensão habilitada;
NOLVP ---> Programação em baixa tensão desabilitada;
PROTECT ---> Protege todo o código do programa contra leitura;
NOPROTECT ---> Desabilita a proteção do código do programa contra leitura.
Obs.: É possível escolher outros pinos para XMIT e RCV, porém, todo o processo
de transmissão e recepção de dados ficará por conta do software.
No PIC, os pinos de I/O podem ser definidos tanto como entradas como saídas,
sendo assim, através de um único pino, podemos envia ou receber um sinal, para
isso, é preciso definir a direção do pino através da função 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 função set_tris_d(0b11111111). Para definirmos
todos os pinos da porta D como saídas, usamos set_tris_d(0b00000000) com todos
os bits zeros. Os bits estão 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.
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 saídas.
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.
#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 saídas.
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64); //Define
prescaler.
O circuito acima usa dois pinos do PIC: o pino 27 (RD4) é conectado ao botão
(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.
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 variável para controle do botão.
O programa acima deve ser compilado para gravar o PIC 16F877 e controlar o
circuito da Figura 5. O funcionamento é simples: quando o botão (interruptor K) é
mantido pressionado, o LED1 permanece aceso. Quando o interruptor é solto o
LED1 é apagado.
//---------------------------------------------------------------------------
//Interrupção 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 variável para controle do botão.
enable_interrupts(int_rda); //Habilita interrupção de recebimento.
enable_interrupts(GLOBAL); //Habilita registrador de interrupção.
Iremos usar o ambiente MPLAB® IDE da Microchip para editar o código fonte e
gravar o PIC. O MPLAB® chama automaticamente o compilador PCW da CSS para
compilar o código, desde que configuremos o mesmo adequadamente. Dessa forma
só precisamos de um único ambiente para: editar, compilar e gravar o PIC, tornando
mais fácil a tarefa de se programar um PIC.
3 - Após a abertura da página, preencha seu nome no campo Your Name, depois
clique no botão Download Demo. Salve o arquivo demoupd.exe em seu disco
rígido;
Obs.: antes de instalar uma nova versão do ambiente MPLAB®, remova do sistema
quaisquer versões antigas do mesmo.
É preciso que o Plug-In tenha sido instalado para que apareça o nome do
compilador CCS nos campos 1 e 2.
Depois clique no botão Avançar > para passar para o próximo passo...
Após clicar no botão 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.
Clique no botão OK e depois no botão Avançar > para passar para o próximo
passo...
3 - Vamos agora selecionar uma porta serial COMx no MPLAB, onde o gravador
McFlash ou outro será conectado para transferir o arquivo ".HEX" para gravar o
PIC16F877. Para isso, clique no menu Programmer e depois no item Settings;
Obs.: Após o processo de compilação, na guia Build da janela Output, são exibidas
algumas mensagens, onde podemos observar se ouve erro ou sucesso na
compilação. Se houve erro, mensagens esclarecedoras são exibidas. Também é
informado o número da linha onde ocorreu o erro, assim fica mais fácil corrigi-lo.
Veja abaixo algumas mensagens que são exibidas quando um dos botões
acima é pressionado.
Obs.: Se o driver VCP ainda não foi instalado, ou não saiba qual a Porta COMx deve
ser configurada no RComSerial, retorne a Aula 8 para obter informações.
Conversores RS232
Se o objetivo não for o de criar circuitos de Modem que utilizam todos os sinais
de handshaking, é possível usar um simples MAX232 para converter os sinais TTL,
em sinais padrão RS232. O MAX232 pode operar numa velocidade de até 115.200
baud. Ele dispõe de dois sinais de handshaking (RTS e CTS), usados por algumas
interfaces seriais para controle de fluxo por hardware.
Conversores RS485
Interfaces USB e RS232 não foram projetadas para transmitir dados a longas
distâncias. O padrão RS232 estabelece um cabo em torno de 15m de distância entre
dois pontos. Quanto maior for a distância e a velocidade, mais suscetível a erros fica
a transmissão.
A distância de um cabo USB não pode passar dos 5m, distâncias maiores
tornam o sistema inviável. Para solucionar esse problema poderemos usar drivers
RS485 para transmitir dados a uma distância de até 1200m.
No fim do cabo mais distante do circuito mestre, deve ser colocado um resistor
de terminação de 120 ohm, em paralelo com as duas linhas de dados TX/RX.
Para testar o circuito acima usando um único computador, faça assim: conecte
dois circuitos FT232BM e depois instale seus driveres VCP. Rode duas cópias do
RComSerial.exe e configure as duas com a mesma velocidade (460.800 baud). As
portas têem que ser diferentes (veja no Gerenciador de Dispositivos do Windows,
quais estão disponíveis após a instalação dos drivers VCP).
Figura 6 - Cópia (1) do programa RComSerial Figura 7 - Cópia (2) do programa RComSerial
O PIC 16F877-20/P pode ser configurado para trabalhar com um driver do tipo
MAX485 como se fosse uma comunicação RS232. Para isso é preciso especificar
Dowload do Programa 1.
//Comunicação RS485.
//---------------------------------------------------------------------------
//Interrupção 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 variável para controle do botão.
enable_interrupts(int_rda); //Habilita interrupção de recebimento.
enable_interrupts(GLOBAL); //Habilita registrador de interrupção.
printf("Transmissão USB<->RS485\r\n");
printf("Microcontrolador PIC16F877-20/P.\r\n");
printf("FT232BM.\r\n\r\n");
delay_ms(15); //bounce - retardo para eliminar ruído ao pressionar botão.
}
}
}
}
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.
O circuito acima pode ser usado para isolar eletricamente qualquer interface
(USB/232TTL, RS232, RS485, entre outras) de uma maneira simples. É possível
também 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 são usados para conectar uma linha
TX, e os terminais de "Saída" para conectar uma linha RX.
Essa aula explora muita das funções da dll FTD2xx para acesso direto ao Bus
USB. A partir de suas funções é possível saber se um dispositivo FT232BM está
conectado ao bus USB; quantos estão; obter os descritores, como: nome do
fabricante, identificação do fabricante, número serial; enviar e receber dados; gravar,
lê e apagar a EEPROM para personalizar o dispositivo. Há também um conjunto de
funções usadas para manipular a área de memória EEPROM do usuário (espaço
restante da EEPROM usado pelo usuário para gravar algumas configurações do seu
circuito, se desejar). A função FT_EE_UASize( ) retorna o tamanho em bytes do espaço
livre do usuário. As funções que manipulam a área livre do usuário não interferem
nos dados armazenados no restante da EEPROM. Quanto menos caracteres
escrever na descrição do produto, maior será a área livre do usuário.
Observação:
C++Builder:
Para compilar todos os exemplos em C++ usamos a biblioteca FTD2xx.LIB e o
arquivo cabeçalho 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:
Delphi:
Em Delphi só precisamos adicionar o arquivo FTD2xxUnit.pas para compilar os
exemplos.
FT_ListDevices( )
Obtém informações atualmente relativa aos dispositivos conectados. Esta função devolve o número
de dispositivos conectados, a descrição, o número serial e o ID local dos dispositivos conectados.
FT_STATUS FT_ListDevices(PVOID pvArg1, PVOID pvArg2, DWORD dwFlags)
Parâmetros:
pvArg1 - Significando depende de dwFlags.
pvArg2 - Significando depende de dwFlags.
dwFlags - Determina o formato da informação retornada.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
Em sua forma mais simples, pode ser usado para devolver o número de dispositivos conectados
atualmente. Se a constante de bit FT_LIST_NUMBER_ONLY é fixada em dwFlags, o parâmetro
pvArg1 é interpretado como um ponteiro do tipo DWORD para armazenar o número de dispositivos
atualmente conectados.
Pode ser usada para retornar informação string para um único dispositivo. Se FT_LIST_BY_INDEX e
FT_OPEN_BY_SERIAL_NUMBER ou FT_OPEN_BY_DESCRIPTION são setados em dwFlags, o
parâmetro pvArg1 é interpretado como o índice do dispositivo, e o parâmetro pvArg2 é interpretado
como um ponteiro para um buffer que contém uma string apropriada. Índices são iniciados em 0, e o
código de erro FT_DEVICE_NOT_FOUND é devolvido para um índice inválido.
Pode ser usada para retornar informação string de todos dispositivos conectados. Se FT_LIST_ALL e
FT_OPEN_BY_SERIAL_NUMBER ou FT_OPEN_BY_DESCRIPTION são setados em dwFlags, o
parâmetro pvArg1é interpretado como um ponteiro para uma array de ponteiros de buffers para conter
a string apropriada e, o parâmetro pvArg2 é interpretado como um ponteiro para uma variável do tipo
DWORD, onde é armazenado o número de dispositivos atualmente conectados. Note que para
pvArg1, a última entrada na ordem de ponteiros para array deverá ser um ponteiro NULL.
FT_Open() - Exemplos 1, 2, 3 e 4
Delphi C++
FT_Open( )
Abre um dispositivo e retorna um identificador (handle) para ser usado pela maioria das funções.
FT_STATUS FT_Open(int iDevice, FT_HANDLE *ftHandle)
Parâmetros:
iDevice - Zero (0) para abrir o primeiro dispositivo plugado, um (1) para o segundo e, para mais, siga
a seqüência numérica.
ftHandle - Ponteiro para uma variável de tipo FT_HANDLE onde a Handle será armazenado. Este
handle deve ser usado pelas funções para ter acesso ao dispositivo.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
FT_Open() - Exemplo 1
Delphi C++
FT_OpenEx( )
Abre um dispositivo e retorna um identificador (handle) para ser usado pela maioria das funções.
FT_STATUS FT_OpenEx(PVOID pvArg1, DWORD dwFlags, FT_HANDLE *ftHandle)
Parâmetros:
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 variável de tipo FT_HANDLE onde a Handle será armazenado. Este
handle deve ser usado pelas funções para ter acesso ao dispositivo.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
FT_OpenEx() - Exemplos 1, 2, 3 e 4
Delphi C++
FT_Close( )
Fecha um dispositivo aberto pelas funções FT_Open() ou FT_OpenEx().
FT_STATUS FT_Close(FT_HANDLE ftHandle)
Parâmetro:
ftHandle - Identificador do dispositivo.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
FT_SetDivisor( )
Esta função define a velocidade da comunicação com o dispositivo. Ela é usada para definir uma
velocidade em Baud rate não padronizada.
FT_STATUS FT_SetDivisor(FT_HANDLE ftHandle, USHORT usDivisor)
Parâmetros:
ftHandle - Identificador do dispositivo.
usDivisor - Divisor.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
FT_SetDivisor() - Exemplo 1
Delphi C++
FT_SetBaudRate( )
Esta função define a velocidade da comunicação com o dispositivo.
FT_STATUS FT_SetBaudRate(FT_HANDLE ftHandle, DWORD dwBaudRate)
Parâmetros:
ftHandle - Identificador do dispositivo.
dwBaudRate - Velocidade (Baud rate).
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
FT_SetBaudRate() - Exemplo 1
Delphi C++
FT_SetDataCharacteristics( )
Esta função define as características da comunicação com o dispositivo.
FT_STATUS FT_SetDataCharacteristics(FT_HANDLE ftHandle, UCHAR uWordLength, UCHAR
uStopBits, UCHAR uParity)
Parâmetros:
ftHandle - Identificador do dispositivo.
uWordLength - Tamanho do dado: FT_BITS_7 ou FT_BITS_8.
uStopBits - Número 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 função não teve êxito.
FT_SetDataCharacteristics() - Exemplo 1
Delphi C++
FT_SetTimeouts( )
Esta função seta os timeouts de leitura e escrita do dispositivo.
FT_STATUS FT_SetTimeouts(FT_HANDLE ftHandle, DWORD dwReadTimeout, DWORD
dwWriteTimeout)
Parâmetros:
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 função não teve êxito.
FT_SetTimeouts() - Exemplo 1
Delphi C++
FT_Purge( )
Esta função limpa os bufferes de transmissão e recepção no dispositivo. Use-a antes de uma
transmissão ou recepção, dependendo dos bits setados em dwMask.
FT_STATUS FT_Purge(FT_HANDLE ftHandle, DWORD dwMask)
Parâmetros:
ftHandle - Identificador do dispositivo.
dwMask - podem ser usadas as constantes FT_PURGE_RX ou FT_PURGE_TX. Ou uma
combinação das duas.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
FT_Purge() - Exemplo 1
Delphi C++
FT_GetStatus( )
Obtém o estado do dispositivo, inclusive o número de caracteres recebidos na fila, número de
caracteres transmitidos na fila, e o estado atual do evento.
FT_STATUS FT_GetStatus(FT_HANDLE ftHandle, LPDWORD lpdwAmountInRxQueue, LPDWORD
lpdwAmountInTxQueue, LPDWORD lpdwEventStatus)
Parâmetros:
ftHandle - Identificador do dispositivo.
lpdwAmountInRxQueue - Ponteiro para uma variável do tipo DWORD para obter o número de
caracteres da fila de recepção.
lpdwAmountInTxQueue - Ponteiro para uma variável do tipo DWORD para obter o número de
caracteres da fila de transmissão.
lpdwEventStatus - Ponteiro para uma variável 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 função não teve êxito.
FT_Read( )
Lê dados de um dispositivo.
FT_STATUS FT_Read(FT_HANDLE ftHandle, LPVOID lpBuffer, DWORD dwBytesToRead,
LPDWORD lpdwBytesReturned)
Parâmetros:
ftHandle - Identificador do dispositivo.
lpBuffer - Ponteiro para um buffer armazenar os dados lidos do dispositivo.
dwBytesToRead - Número de bytes que será lido do dispositivo.
lpdwBytesReturned - Ponteiro para uma variável do tipo DWORD, para obter o número de bytes lidos
no dispositivo.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
Delphi C++
FT_Write( )
Escreve dados para um dispositivo.
FT_STATUS FT_Write(FT_HANDLE ftHandle, LPVOID lpBuffer, DWORD dwBytesToWrite,
LPDWORD lpdwBytesWritten)
Parâmetros:
ftHandle - Identificador do dispositivo.
lpBuffer - Ponteiro para um buffer onde contém os dados a serem escritos no dispositivo.
dwBytesToWrite - Número de bytes a serem escritos no dispositivo.
lpdwBytesWritten - Ponteiro para uma variável do tipo DWORD, para obter o número de bytes
escritos no dispositivo.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
Exemplo 1 - FT_Write()
Delphi C++
FT_GetDeviceInfo( )
Obtém informações sobre o dispositivo.
FT_STATUS FT_GetDeviceInfo(FT_HANDLE ftHandle, FT_DEVICE *pftType, LPDWORD lpdwID,
PCHAR pcSerialNumber, PCHAR pcDescription, PVOID pvDummy)
Parâmetros:
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 Número de Série
do dispositivo.
pcDescription - Ponteiro para uma string terminada em null, para armazenar a Descrição.
pvDummy - Reservado para uso futuro. Atribuir NULL.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
Exemplo 1 - FT_GetDeviceInfo( )
Delphi C++
FT_CreateDeviceInfoList( )
Esta função cria uma lista de informações sobre os dispositivos e retorna o numero de dispositivos
conectados ao sistema. Esta lista contém informações sobres os dispositivos abertos.
FT_STATUS FT_CreateDeviceInfoList(LPDWORD lpdwNumDevs)
Parâmetros:
lpdwNumDevs - Ponteiro para uma variável do tipo DWORD para armazenar o número de
dispositivos conectados.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
Exemplo 1 - FT_CreateDeviceInfoList( )
Delphi C++
FT_GetDeviceInfoList( )
Esta função retorna uma lista de informações e o número de dispositivos conectados.
FT_STATUS FT_GetDeviceInfoList(FT_DEVICE_LIST_INFO_NODE *pDest, LPDWORD
lpdwNumDevs)
Parâmetros:
pDest - Ponteiro para uma estrutura de array FT_DEVICE_LIST_INFO_NODE.
lpdwNumDevs - Ponteiro para o número de elementos no array (número de dispositivos conectados).
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
Exemplo 1 - FT_GetDeviceInfoList( )
Delphi C++
FT_GetDeviceInfoDetail( )
Esta função devolve uma entrada da lista de informação de dispositivo.
FT_STATUS FT_GetDeviceInfoDetail(DWORD dwIndex, LPDWORD lpdwFlags, LPDWORD
lpdwType, LPDWORD lpdwID, LPDWORD lpdwLocId, PCHAR pcSerialNumber, PCHAR
pcDescription, FT_HANDLE *ftHandle)
Parâmetros:
dwIndex - Índice da entrada na lista de informações 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 Número de Série
do dispositivo.
pcDescription - Ponteiro para uma string terminada em null, para armazenar a Descrição.
ftHandle - Ponteiro para uma variável de tipo FT_HANDLE onde a Handle será armazenado.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
Exemplo 1 - FT_GetDeviceInfoDetail( )
Delphi C++
FT_GetModemStatus( )
Obtém o estado das linhas do modem do dispositivo.
FT_STATUS FT_GetModemStatus(FT_HANDLE ftHandle, LPDWORD lpdwModemStatus)
Parâmetros:
ftHandle - Identificador do dispositivo.
lpdwModemStatus - Ponteiro para uma variável 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 função não teve êxito.
Exemplo 1 - FT_GetModemStatus( )
Delphi C++
FT_ClrRts( )
Esta função limpa o sinal de controle RTS (Request To Send).
FT_STATUS FT_ClrRts(FT_HANDLE ftHandle)
Parâmetro:
ftHandle - Identificador do dispositivo.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
FT_SetRts( )
Esta função seta o sinal de controle RTS (Request To Send).
FT_STATUS FT_SetRts(FT_HANDLE ftHandle)
Parâmetro:
ftHandle - Identificador do dispositivo.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
FT_ClrDtr( )
Esta função limpa o sinal de controle DTR (Data Terminal Ready).
FT_STATUS FT_ClrDtr(FT_HANDLE ftHandle)
Parâmetro:
ftHandle - Identificador do dispositivo.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
FT_SetDtr( )
Esta função seta o sinal de controle DTR (Data Terminal Ready).
FT_STATUS FT_SetDtr(FT_HANDLE ftHandle)
Parâmetro:
ftHandle - Identificador do dispositivo.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
FT_SetBreakOn( )
Seta uma condição de BREAK para o dispositivo.
FT_STATUS FT_SetBreakOn(FT_HANDLE ftHandle)
Parâmetro:
ftHandle - Identificador do dispositivo.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
FT_SetBreakOff( )
Reseta uma condição de BREAK para o dispositivo.
FT_STATUS FT_SetBreakOff(FT_HANDLE ftHandle)
Parâmetro:
ftHandle - Identificador do dispositivo.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
Delphi C++
FT_EE_Program( )
Programa a EEPROM.
FT_STATUS FT_EE_Program(FT_HANDLE ftHandle, PFT_PROGRAM_DATA lpData)
Parâmetros:
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 função não 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)
Parâmetros:
ftHandle - Identificador do dispositivo.
pData - Pointer to a structure of type FT_PROGRAM_DATA.
Manufacturer - Ponteiro para uma string terminada em NULL, que contém o Nome do fabricante.
ManufacturerID - Ponteiro para uma string terminada em NULL, que contém o ID do fabricante.
Description - Ponteiro para uma string terminada em NULL, que contém a Descrição do dispositivo.
SerialNumber - Ponteiro para uma string terminada em NULL que contém o Número Serial do
dispositivo.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
FT_EE_ProgramEx() - Exemplo 1
Delphi C++
FT_EE_Read( )
Lê o conteúdo da EEPROM.
FT_STATUS FT_EE_Read(FT_HANDLE ftHandle, PFT_PROGRAM_DATA lpData)
Parâmetros:
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 função não teve êxito.
FT_EE_Read() - Exemplo 1
Delphi C++
FT_EE_ReadEx( )
Lê o conteúdo 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)
Parâmetros:
ftHandle - Identificador do dispositivo.
pData - Pointer to a structure of type FT_PROGRAM_DATA.
Manufacturer - Ponteiro para uma string terminada em NULL, que contém o Nome do fabricante.
ManufacturerID - Ponteiro para uma string terminada em NULL, que contém o ID do fabricante.
Description - Ponteiro para uma string terminada em NULL, que contém a Descrição do dispositivo.
SerialNumber - Ponteiro para uma string terminada em NULL que contém o Número Serial do
dispositivo.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
FT_EE_ReadEx() - Exemplo 1
Delphi C++
FT_ReadEE( )
Lê um valor num determinado endereço da EEPROM.
FT_STATUS FT_ReadEE(FT_HANDLE ftHandle, DWORD dwWordOffset, LPWORD lpwValue)
Parâmetros:
ftHandle - Identificador do dispositivo.
dwWordOffset - Endereço a ser lido na EEPROM.
lpwValue - Ponteiro para uma variável DWORD armazenar o valor lido na EEPROM.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
FT_EE_ReadEE() - Exemplo 1
Delphi C++
FT_WriteEE( )
Escreve um valor num determinado endereço da EEPROM.
FT_STATUS FT_WriteEE(FT_HANDLE ftHandle, DWORD dwWordOffset, WORD wValue)
Parâmetros:
ftHandle - Identificador do dispositivo.
dwWordOffset - Endereço 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 função não teve êxito.
FT_EE_WriteEE() - Exemplo 1
Delphi C++
FT_EraseEE( )
Apaga TODO o conteúdo da EEPROM, inclusive o espaço livre do usuário.
FT_STATUS FT_EraseEE(FT_HANDLE ftHandle)
Parâmetro:
ftHandle - Identificador do dispositivo.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
FT_EraseEE() - Exemplo 1
Delphi C++
FT_EE_UASize( )
Obtém o tamanho EEUA (área livre da EEPROM para uso pelo usuário).
FT_STATUS FT_EE_UASize(FT_HANDLE ftHandle, LPDWORD lpdwSize)
Parâmetro:
ftHandle - Identificador do dispositivo.
lpdwSize - Ponteiro para uma variável 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 função não teve êxito.
FT_EE_UAWrite( )
Escreve dados dentro da EEUA (área livre da EEPROM para uso pelo usuário).
FT_STATUS FT_EE_UAWrite(FT_HANDLE ftHandle, PUCHAR pucData, DWORD dwDataLen)
Parâmetros:
ftHandle - Identificador do dispositivo.
pucData - Ponteiro para um buffer que contém os dados a serem escritos.
dwDataLen - Tamanho em bytes do buffer que contém os dados a serem escritos.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
FT_EE_UARead( )
Lê o conteúdo da EEUA (área livre da EEPROM para uso pelo usuário).
FT_STATUS FT_EE_UARead(FT_HANDLE ftHandle, PUCHAR pucData, DWORD dwDataLen,
LPDWORD lpdwBytesRead)
Parâmetros:
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 variável do tipo DWORD que contém o número de bytes lidos.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
Delphi C++
Ao trabalhar com o FT232BM no modo bit bang, ficam disponíveis 8 pinos para
uso como entradas ou saídas.
FT_SetBitMode( )
FT_STATUS FT_SetBitMode(FT_HANDLE ftHandle, UCHAR ucMask, UCHAR ucEnable)
Parâmetros:
ftHandle - Identificador do dispositivo.
ucMask - Valor requerido para a máscara de bits.
ucEnable - Habilita valor, 0 = FALSE, 1 = TRUE.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve
êxito.
FT_GetBitMode( )
Obtém instantaneamente um valor do Bus de dados.
FT_STATUS FT_GetBitMode(FT_HANDLE ftHandle, PUCHAR pucMode)
Parâmetros:
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 função não teve êxito.
FT_SetLatencyTimer( )
Seta a latência do timer.
FT_STATUS FT_SetLatencyTimer(FT_HANDLE ftHandle, UCHAR ucTimer)
Parâmetros:
ftHandle - Identificador do dispositivo.
ucTimer - Valor em milisegundos da latência do timer. Limite válido: 2 - 255ms.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
FT_GetLatencyTimer( )
Obtém o valor corrente da latência do timer.
FT_STATUS FT_GetLatencyTimer(FT_HANDLE ftHandle, PUCHAR pucTimer)
Parâmetros:
ftHandle - Identificador do dispositivo.
pucTimer - Ponteiro para uma variável do tipo UCHAR (unsigned char) para armazenar o valor da
latência do timer.
Retorna:
Um valor FT_OK se teve sucesso. Qualquer outro valor retornado indica que a função não teve êxito.
No circuito acima, os pinos 25, 24, 23 e 22 são usados como saídas, e os pinos
21, 20, 19 e 18 como entradas. Os pinos estabelecidos como entradas ou saídas
são definidos no segundo parâmetro da função FT_SetBitMode() no programa.
http://www.ftdichip.com/Documents/ProgramGuides/D2XXPG30.pdf
Projetos práticos
Controlando Relês
Para esse projeto são necessários dois programas: um que irá rodar no
PIC16F877 e o outro no PC.
Download do programa:
Delphi C++
No circuito acima foi usado um driver ULN 2803 com 8 entradas TTL e 8 saídas
que podem controlar até 45v/500mA. No nosso caso o ULN2803 é alimentado com
12v para poder controlar os Relês também de 12v. Cada relê consome em torno de
50mA; quando todos os relês estiverem acionados o consumo total é de 400mA (8
relês x 50mA). Assim o ULN2803 trabalha com uma folga de 100mA.
O botão Reset e o LED1 são opcionais. O Reset serve para reiniciar o PIC e o
LED1 para informar que o programa gravado no PIC está em execução.
Os relês são acionados com 12v e seus contatos suportam até 10A/220v.
Observe com atenção, 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.
Fonte 1 CCS Compiler - Programa para ser compilado e gravado dentro do PIC16F877
//Controle de Relês
//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;
//--------------------------------------------------------------------------
//Interrupção de recebimento de caracter pela UART.
//---------------------------------------------------------------------------
#int_rda
void Serial_Recebe_Car()
{
static unsigned char ch;
static int 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 interrupção de recebimento.
enable_interrupts(int_timer0);
enable_interrupts(GLOBAL); //Habilita registrador de interrupção.
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 início 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)
{
Não era necessário usar o comando strcpy() no programa acima, mais foi
preciso pois a função strcmp() da CCS só compara duas variáveis e não constantes
" ". Poderiamos ter armazenado as constantes na memória para eliminar a função
strcpy() mas a versão Trial 30 dias da CCS só reserva o mínimo de memória RAM
para os programas.
Sensor de Temperatura
Para mais informações técnicas sobre o LM35, acesse o site do fabricante em:
http://www.national.com e faça download do Datasheet.
Download do programa:
Delphi C++
Fonte 2 - CCS Compiler - Programa que ler o canal 0 analógico 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 analógico 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)
set_timer0(131);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64);
enable_interrupts(int_timer0);
enable_interrupts(GLOBAL); //Habilita registrador de interrupção.