Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
Genilson mm

Usb com pic18f2550

Recommended Posts

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.

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 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

    Compartilhar este post


    Link para o post
    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.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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.

    Editado por Genilson mm

    Compartilhar este post


    Link para o post
    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?

    Editado por CeDahmer

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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.

    Compartilhar este post


    Link para o post
    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.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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...

    Compartilhar este post


    Link para o post
    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.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Ola Genilson,

    Vou iniciar agora um projeto com o mesmo PIC para descarregar alguns dados do PIC para o PC. Minha primeira duvida é sobre a diferença entre usar CDC ou HID. Você ( ou alguem ) poderia me dar uma luz? grato, Ricardo

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×