
Bom, entre uma obra e outra e depois de algumas especificações, consegui tempo para a simulação das placas de controle de entrada e saídas, mais rápido do que imaginado por usar como base uma simulação que achei na internet, não me lembro o site, mas com algum tempo dedicado a pesquisar é possível achar muita coisa sobre conexão usb utilizando pic, principalmente 18f4550 e 18f2550, além de uma infinidade de possibilidades.
Fiz uma modificação na simulação que utiliza o proteus para o hardware e o ccs para a programação do pic, como a intenção é utilizar todas os pinos possíveis como entradas e saídas digitais foram necessárias duas simulações independentes, uma só para as entradas utilizando chaves e outra só para as saídas utilizando leds, mas nada complicado.
Então fiz duas programações, para a comunicação usb utilizei a Human Interface Device - HID(http://en.wikipedia.org/wiki/Human_interface_device), dá trabalho para conseguir compilar a primeira vez e entender como tudo funciona, mas depois que consegue compilar a primeira, tudo fica mais fácil e funciona perfeitamente.
Código básico:
#include <18F4550.h>
//achei melhor configurar os fuses de forma individual
#FUSES HSPLL
#FUSES WDT//Habilita o Watchdog Timer(WDT) - Não tive problemas usando o WDT
#FUSES NOPROTECT
#FUSES NODEBUG
#FUSES NOLVP
#FUSES PLL5
#FUSES CPUDIV1
#FUSES USBDIV
#FUSES VREGEN
#FUSES WDT128 //Período do WDT
#use delay(clock=48000000) //valor do clock obrigatório
#define USB_HID_DEVICE TRUE //Utilizando a classe HID
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK //Habilitando o(EndPoint1) para In bulk
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK //Habilitando o(EndPoint1) para OUT bulk
#define USB_EP1_TX_SIZE 32 //tamanho reservado para a transferência
#define USB_EP1_RX_SIZE 32
//Declarações necessárias
#include
#include
#include
//Função para conexão, serve para a numeração do dispositivo
void USB_debug() {
static int8 last_connected;
static int8 last_enumerated;
int8 new_connected;
int8 new_enumerated;
new_connected=usb_attached();
new_enumerated=usb_enumerated();
usb_wait_for_enumeration();
last_connected=new_connected;
last_enumerated=new_enumerated;
}
void main(void) // Função principal
{
//Declarando as variáveis e especificando seu tamanho
int8 envia[USB_EP1_TX_SIZE];
int8 recebe[USB_EP1_RX_SIZE];
usb_init(); // Inicializa a comunicação USB.
setup_wdt(wdt_ON); //Reinicia o WDT
while (TRUE) // while infinito.
{
//Funções de comunicações devem ser constantemente executadas para evitar a desconexão do dispositivo
usb_task();
USB_debug();
if(usb_enumerated()) //se o dispositivo está numerado, está conectado.
{
//Pronto, agora é só mandar ou receber informações e reiniciar o WDT
usb_put_packet(1, envia, 32, USB_DTS_TOGGLE); //enviando pacote de dados
if (usb_kbhit(1)) //testa se um pacote foi recebido
{
usb_get_packet(1, recebe, USB_CONFIG_HID_RX_SIZE); //as informações recebidas são colocadas na variável "recebe"
}
restart_wdt();//Reinicia o WDT
}
}

Pronto, depois foi apenas necessário programar como necessário e compilar, utilizei a IDE CCS 4.057.
E depois modifiquei o software, fiz com que identifica-se automaticamente o dispositivo e por meio de PictureBox e CheckBox identifiquei as chaves acionadas e acionei os leds... e funcionou perfeitamente como as imagens.

Então é isso, agora vamos para a parte mais complicada, o controle central e a IHM...
Eae cara, tudo bem! Tem como você disponibiliza para download este material? Estou fazendo um projeto e essas informações iriam ser muito boas...até por que pelo o que eu vi que você postou no site está tudo comentado o que já me ajudou a entender bastante. Qualquer coisa meu e-mail é lcnpj@hotmail.com
ResponderExcluirobrigado.
Eae cara, tudo bem! Tem como você disponibiliza para download este material? Estou fazendo um projeto e essas informações iriam ser muito boas...até por que pelo o que eu vi que você postou no site está tudo comentado o que já me ajudou a entender bastante. Qualquer coisa meu e-mail é lcnpj@hotmail.com
ResponderExcluirOi amigo, desculpe a demora, muito trabalho e pouco tempo para o blog, então só agora vi seu comentário, eu usei como base esse aqui http://www.downtronica.org/2012/08/projeto-tcc-pic-18f4550-via-usb.html, quem incorpora algumas funcionalidades que não foram necessárias no meu... mas se precisar de ajuda, estou a disposição...
ResponderExcluirOpa, bão demais? Então eu venho tentando usar esse projeto ai do TCC do downtronica mas quando vou compilar ele diz USB_EP1_TX_SIZE não é declarada... so que essa é definida na easyHID.h
ResponderExcluirqueria saber o que vc fez pra ele compilar certinho e se usou a easyhid.h
Obrigado
Oi Diego, tudo tranquilo, mais uma vez me desculpe a demora. Diego, ela é definida no main.c, por exemplo:
ResponderExcluir#define USB_HID_DEVICE TRUE //We are not using HID class
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE 32 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE 32
é possível que tenha esquecido de declarar a variável para envio logo que entra no main:
void main(void) // Función Principal.
{
int8 envia[USB_EP1_TX_SIZE]; // Declaramos la variable envía de 32 bytes.
Deve declarar tanto para o envio, quanto para receber dados, se tiver os dois casos, uma variável para cada. Outra coisa, confira se os nomes dentro das chaves, bate com os nomes que foram definidos anteriormente.
Precisa ter cuidado com o tamanho que definiu pra ela(32) e a quantidade de dados que envia.
Estou usando sim a easyhid.h, você está usando o ccs? e instalou as bibliotecas da Microchip no pc? precisa ver se não está utilizando uma biblioteca errada, porque existem várias no pacote da Microchip para dispositivos diferentes.
Então meu código ficou com as seguintes declarações e definições:
#include <18F4550.h>
#FUSES HSPLL
#FUSES WDT//Habilita o Watchdog Timer(WDT)
#FUSES NOPROTECT
#FUSES NODEBUG
#FUSES NOLVP
#FUSES PLL5
#FUSES CPUDIV1
#FUSES USBDIV
#FUSES VREGEN
#FUSES WDT128 //Período do WDT equivalente a
#use delay(clock=48000000)
#define USB_HID_DEVICE TRUE //We are not using HID class
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE 32 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE 32
#include //Microchip 18Fxx5x hardware layer for usb.c
#include //USB Configuration and Device descriptors for this UBS device
#include
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
void USB_debug() {
static int8 last_connected;
static int8 last_enumerated;
int8 new_connected;
int8 new_enumerated;
new_connected=usb_attached();
new_enumerated=usb_enumerated();
usb_wait_for_enumeration();
last_connected=new_connected;
last_enumerated=new_enumerated;
}
void main(void) // Función Principal.
{
int8 envia[USB_EP1_TX_SIZE]; // Declaramos la variable envía de 32 bytes.