Ir ao conteúdo
  • Cadastre-se

Usb com pic18f2550


Genilson mm

Posts recomendados

Bom dia amigos, já estou a 2 semanas tentando conectar um pic 18f2550 a uma porta UBS. estou usando o CCS para tal projeto. Peguei diversos programas prontos e reproduzir exatamente igual aos originais (código e circuito). O problema é que o windows não detecta o circuito. Se alguem já fez esse tipo de projeto por favor me ajude! so preciso de inicio ligar um led.

Link para o comentário
Compartilhar em outros sites

Também começei isso a duas semanas, mas o problema que tenho é outro, mas posso ajudar com a parte que deu certo para mim. Apesar de usar o 4550, mas o princípio é o mesmo.

Descreva mais sobre o que você está fazendo. Se está usando por Control, ou interrupt. Se usou as bibliotecas prontas do CCS, provavelmente tentou por CDC ou HID, e também descreva como configurou os fuses, cristal usado, o capacitor que ligou no pino VUSB.

Link para o comentário
Compartilhar em outros sites

estou usando:

pic18f2550

crystal de 20Mhz

capacitor de 47uF

já tentei com cdc e/ou bibliotecas protas do ccs. Ainda não consegui fazer o windows detectar meu circuito.

#include <18F2550.h>

#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN

#use delay(clock=48000000)

#include <usb_cdc.h>

void main()

{

usb_cdc_init(); // Inicia protocolo cdc

usb_init(); // Inicia USB

for(;;)

{

usb_task(); // Testa comunicaçao usb

if (usb_enumerated())

{

printf(usb_cdc_putc,"Testando Conexao USB->Serial!\n\r");

delay_ms (100);

}

}

}

ja tentei também sem "usb_cdc.h". Estranho porque o windows não detecta meu circuito.

Por favor amigo me ajude

Link para o comentário
Compartilhar em outros sites

Quando eu começei usei extamente esse código que você usa, e o windows reconheceu perfeitamentamente.

O que eu percebi é que voc~e está usando um capacitor de 47 uf, no datasheet, a recomendação é de 470 nF, ou seja 0,47 uF, são 100 vezes a menos, sei que ele é responsável pela estabilidade da comunicação, procure trocá-lo, mas acredito que não deva ser esse o problema por ele não ser reconhecido.

Esplique melhor o que acontece quando voc~e pluga na porta USB do PC, aparece dispositivo desconhecido, ou não aparece nada. Pois não sei se você sabe como o CDC é reconhecido pelo o Windows, de qualquer forma, vai lá: O microcontrolador será reconhecido como uma nova porta Com, pode ser visializada em Dispositivos de hardware, e pode ser lida com o programa Hyperterminal do próprio Windows.

Talvéz o problema possa estar no circuito, se tiver como poste ou esqueva como fez as ligações, verifique o cabo D+ e D- se está ligado corretamente ao PIC, e também o GND, precissa estar ligado, mesmo que a alimentação seja externa, para equilibrar o terra. Tem certeza de que o PIC está funcionando? Tente colocar um led em uma porta acrescente o código para ele piscar nesse seu código, e teste.

Link para o comentário
Compartilhar em outros sites

ok,

1° - vou substituir o cap de 47uf por um de 470 nF

2° - Quando eu plugo meu circuito não acontece nada o windows não detecta

3° - Descrição do circuito:

3.1 pic18f2550

3.2 circuito segue abaixo

http://img412.imageshack.us/i/imagemop.jpg/

EM SEGUIDA FIZ ALGUNS TESTES SEGUE PROGRAMA ABAIXO:

#include <18F2550.h>

#fuses HSPLL, NOWDT, NOPROTECT, NOLVP, NODEBUG, USBDIV, PLL5, CPUDIV1, VREGEN

#use delay(clock=48000000)

#include<usb_cdc.h>

void main()

{

output_high(PIN_B7);

delay_ms(1000);

output_low(PIN_B7);

usb_cdc_init();

usb_init();

for(;;)

{

usb_task();

if(usb_enumerated())

{

printf(usb_cdc_putc, "Testando conexão! \n");

delay_ms(100);

}

}

}

COLOQUEI PARA LIGAR E APAGAR UM LED SÓ PARA VE SE O PIC ESTAVA FUNCIONANDO, E ISSO OCORREU O LED FUNCIONOU MAS O WINDOWS CONTINUA NÃO DETECTANDO O DISPOSITIVO.

O led funcionou, porém se eu colocar para acender depois de usb_cdc_init(); usb_init(); ele não funciona, então chegamos a conclusão que o problema está entre esses dois comandos. Mas o que pode ser? Estou usando o CCS 4.013 acredito que é o mais novo. Ja estei continuidade no meu cabo USB e ele está funioando perfeitamente, esto ligando o fio branco (d-) no pino 15 e o fio verde (d+) no pino 16.

Link para o comentário
Compartilhar em outros sites

Uma pergunta: Está testando só no Proteus ou montou o circuito?

1- Verifiquei que os capacitores montados junto ao cristal são de 15nF pelo esquemático, e o correto é de 15pF, isso faz uma grande diferença, pode não fazer com que o cristal oscile.

2- As configurações dos fuses estão para um cristal de 20 MHz, é esse mesmo que está usando? Essa configuração trabalhará a USB em full-speed.

3 - O local para o led piscar está errado, precisa estar dentro do for(; ; ) pois é ali que se realiza o loop infinito, o que estiver dentro so main e antes dele é só executado uma vez.

4 - Se for reconhecido é precisso tirar esses delays pois será desconectado da usb, mas isso é outro assunto.

5 - para testar remova o resistor de pull-up que está ligado ao pino 2

Mais uma coisa que eu estava esquecendo, a fonte que está usando é boa? fornece os 5V? tem muitos ruídos? ligou algum capacitor eletrolítico em curto entre o positivo e o 0V para estabilizar?

Link para o comentário
Compartilhar em outros sites

1 - Tenho o circuito montado no Proteus e no real (no proteus funciona normal mas na real não funciona)

2 - vou verificar se eu coloquei o 15nF ou 15pF no circuito montado

3 - Enqundo ao led a intenção é só saber se o microcontrolador e o gravador estão funcionando, valeu pela dica.

4 - Ja tirei o resistor do pino 2, o problema continua.

5 - Estou usando a propria alimentação da USB, algum problema? tem que ser fonte externa? (já tentei colocar um capacitor do VCC ao GND da USB - que é minha alimentação)

PS.: acredito que o problema esta na inicialização do usb_init(); porque todo código acima funciona, mas quando chega no usb_init() para baixo do código nada mais funciona.

Link para o comentário
Compartilhar em outros sites

1 - Tente substituir usb_cdc_init(); por usb_init_cs(); Isso não vai resolver mas de qualquer forma não custa tentar.

2 - A corrente eelétrica pode ser sim fornecida pelo barramento USB, a não ser que esteja consumindo mais que 500 mA, no meu caso com os relês o consumo máximo é de 550mA (tudo teoricamente). A alimentação pode ser tanto USB, Externa, ou até mesmo mista, usando as duas ao mesmo tempo, mas para isso precisa ter uma proteção, no caso de um regulador de tensão LM7805, já bloqueia que a corrente fuga para a fonte externa, o problema, esta justamente em proteger a porta USB, pois poderiamos colocar um diodo, mas o problema que ele baixa a tensão dependendo do modelo em torno de 0,7V, e nesse caso temos de projetar bem a fonte externa, garantindo que não haja falhas.

3 - o capacitor de 15pF, geralmente apresenta o código 150, outros pelo tamanho, não tem nada indicado, isso complica.

4 - Tente conectar em outro PC, pode ser problema na USB, pois pelo menos teria de ser reconhecido como dispositivo desconhecido, ou falha no dispositivo, ou algo assim, pois é claro os drivers não são nativos, e precissam serem instalados. Qual o sistema operacional. Windows? 98? XP? 7? Vista? Eu estou usando o XP, pelo que li alguns não conseguem no Vista e 7.

5 - Pode ser problema com a USB do PIC, se tiver como substituí-lo para testar. Qual o tamanho do cabo?

Desculpe não poder ajudar muito, pois entendo pouco, e a poucos dias apenas consegui fazer a USB funcionar, e ainda tenho alguns problemas.

Link para o comentário
Compartilhar em outros sites

Já testei com 2 pic´s e também em 2 computadores, a minha unica suspeita seria o cap 470nF na porta Vusb que eu não estou usando corretamente porque não encontrei aqui na minha cidade, mas mesmo assim esperava que o windows desse alguma memensagem nem que fosse de erro! também não acredito que o problema seja na programação já que no proteus tudo funcionou perfeitamente. Ai meu Deus ... n quero desistir...

Link para o comentário
Compartilhar em outros sites

Está testando na protoboard de testes?

Se for isso pesquise aqui no fórum mesmo sobre esse assunto que vai encontrar informações, de vários casos que não funcionam principalmente com cristal de 20 MHz, mas no seu caso, o led chegou a ligar, então acho que não é esse o problema. Mas não custa pesquisar. Verifique também se o resistor do MLCR, é de 10K. Se o valor for muito diferente o uC pode ficar resetando.

Link para o comentário
Compartilhar em outros sites

Boa noite amigos,

É com muito prazer e felicidade que venho aqui para lhes informar que o meu pequeno projeto funcionou, se não fosse a motivação que vocês me passaram aqui no forum teria desistido, muito obrigado a todos. Agora estou aqui disponivel para ajudar aqueles te estão com as mesmas dificuldades que eu estava, o que aconteceu foi uma seguencia de erros que comete e que fui eliminando com a dica de todos, com isso acabei queimando um dos meus PIC´s, bom chega de papo e segue abaixo os dois programas que eu testei e ambos funcionaram perfeitamente.

código 1

#include <18F2550.h>

#fuses HSPLL, NOWDT, NOPROTECT, NOLVP, NODEBUG, USBDIV, PLL5, CPUDIV1, VREGEN, NOXINST

#use delay(clock=48000000)

#define USB_HID_DEVICE FALSE //deshabilitamos el uso de las directivas HID

#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 1 //size to allocate for the tx endpoint 1 buffer

#define USB_EP1_RX_SIZE 3 //size to allocate for the rx endpoint 1 buffer

#include <pic18_usb.h> //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver

#include <PicUSB.h> //Configuración del USB y los descriptores para este dispositivo

#include <usb.c> //handles usb setup tokens and get descriptor

#define LED_VERDE PIN_B6

#define LED_VERMELHO PIN_B7

#define LED_ON output_high

#define LED_OFF output_low

#define modo recibe[0]

#define param1 recibe[1]

#define status send[0]

void main(void) {

int8 recibe[3]; //declaramos variables 8 bits

int8 send[1];

LED_OFF(LED_VERDE);

LED_ON(LED_VERMELHO); //Acendemos led vermelho

usb_init(); //inicializamos el USB

usb_task(); //habilita periferico usb e interrupciones

usb_wait_for_enumeration(); //esperamos hasta que el PicUSB sea configurado por el host

LED_OFF(LED_VERMELHO);

LED_ON(LED_VERDE); //Acendemos led verde

while (TRUE)

{

if(usb_enumerated()) //si el PicUSB está configurado

{

if (usb_kbhit(1)) //si el endpoint de salida contiene datos del host

{

usb_get_packet(1, recibe, 4); //cojemos el paquete de tamaño 3bytes del EP1 y almacenamos en recibe

//O 3 india a quantidade de param

if (modo == 1) // Modo_Led

{

if (param1 == 0) {LED_OFF(LED_VERDE); LED_OFF(LED_VERMELHO);} //apagamos los leds

if (param1 == 1) {LED_ON(LED_VERDE); LED_OFF(LED_VERMELHO);} //encendemos led verde

if (param1 == 2) {LED_OFF(LED_VERDE); LED_ON(LED_VERMELHO);} //encendemos led vermelho

if (param1 == 3) {LED_ON(LED_VERDE); LED_ON(LED_VERMELHO);} //encendemos led vermelho

}

if (modo == 2) //Modo envio do Status do PIC para PC

{

status=1;

usb_put_packet(1, send, 1, USB_DTS_TOGGLE);

}

}

}

}

}

codigo 2

#include <18F2550.h>

#fuses HSPLL, NOWDT, NOPROTECT, NOLVP, NODEBUG, USBDIV, PLL5, CPUDIV1, VREGEN, NOXINST

#use delay(clock=48000000)

#include<usb_cdc.h>

void main()

{

usb_cdc_init();

usb_init();

for(;;)

{

usb_task();

if(usb_enumerated())

{

//output_high(PIN_B7);

printf(usb_cdc_putc, "Testando conexão! \n\r");

// delay_ms(100);

}

}

}

como disse os dois funcionam perfeitamente

segue link da foto do circuito

http://img560.imageshack.us/i/fotocircuito.png/

qualquer dúvida é só perguntar e mais uma vez obrigado a todos que me ajudaram

Link para o comentário
Compartilhar em outros sites

  • 2 meses depois...

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...