Ir ao conteúdo

Posts recomendados

Postado

Caros colegas, fiz um projetinho com usb,testei no proteus e funcionou, quando fui montar o hardware e conectar no computador ele n reconhece, estou usando windows xp, qual seria a possivel causa??

Pode ser alguns desses fatores abaixo:

1- Coloquei um cristal de 8 mhz

2- coloquei um capacitor eletrolitico de 1 uf no pino vusb do pic.

estou colocando a imagem do circuito juntamente.

post-527532-13884959290343_thumb.jpg

Postado

Precisaria do seu código pra analisar. Está fazendo no CCS? Se sim: voce colocou o fuse PLL2? (Tem que ser 2 pra esse clock). Tá usando o fuse VREGEN? E o USBDIV?

Seu capacitor é de 1pF ou 1uF como no esquema do proteus? De qualquer forma, segundo o datasheet o valor ideal seria 220nF, então um valor estaria muito baixo e o outro muito alto.

O capacitor do cristal é ceramico? Utilizei um capacitor de poliester de mesma capacitancia e tive problemas, demorei um tempão pra descobrir... Só resolvi quando usei ceramico.

Tenta fazer um teste para debug, coloque na primeira linha do seu código pra jogar nivel logico alto, e teste um led nesse pino (com um resistor pra limitar a corrente). Aí voce pelo menos vai saber se ele está entrando na primeira linha do código (se for problema com o cristal por exemplo voce vai descobrir).

Postado


unsigned char userRD_buffer[64]; //Buffer de recepção serial

void main()
{
char recebe;
ADCON1 = 0x0F; //Configura os pinos de forma digital
trisa=1; //Configura o pino do led como saída
trisd=0; //configura portb como saida
trisb=0; //configura portb como entrada
portb=0;
portd=0;

HID_Enable(&userRD_buffer, &userWR_buffer); //Inicializa a USB

while (1)
{
if (porta.ra0==1)
{
userWR_buffer[0]= '1'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio
userWR_buffer[0]= 'L'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio
}

else
{
userWR_buffer[0]= '1'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio
userWR_buffer[0]= 'D'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio

}
if (porta.ra1==1)
{
userWR_buffer[0]= '2'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio do
userWR_buffer[0]= 'L'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio do
}

else
{
userWR_buffer[0]= '2'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio
userWR_buffer[0]= 'D'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio
}
if (porta.ra2==1)
{
userWR_buffer[0]= '3'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio do
userWR_buffer[0]= 'L'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio do
}

else
{
userWR_buffer[0]='3'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio
userWR_buffer[0]='D'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio
}
if (porta.ra3==1)
{
userWR_buffer[0]='4'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio do
userWR_buffer[0]='L'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio do
}

else
{
userWR_buffer[0]='4'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio do
userWR_buffer[0]='D'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio do

}
if (porta.ra4==1)
{
userWR_buffer[0]='5'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio do
userWR_buffer[0]='L'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio do
}

else
{
userWR_buffer[0]='5'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio do
userWR_buffer[0]='D'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio do
}
if (porta.ra5==1)
{
userWR_buffer[0]='6'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio do
userWR_buffer[0]='L'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio do
}

else
{
userWR_buffer[0]='6'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio do
userWR_buffer[0]='D'; //Carrega byte a ser enviado para o PC
while (!HID_Write(&userWR_buffer, 1)) ; //Envia e aguarda finalizar o envio do

}

recebe=hid_read(); //Verifica se há algum byte no
//buffer de recepção
if (recebe!=0) //Há algum byte para receber?
{


if(userRD_buffer[0]=='0')
portb.rb0=~portb.rb0;
if(userRD_buffer[0]=='1')
portb.rb1=~portb.rb1;
if(userRD_buffer[0]=='2')
portb.rb2=~portb.rb2;
if(userRD_buffer[0]=='3')
portb.rb3=~portb.rb3;
if(userRD_buffer[0]=='4')
portb.rb4=~portb.rb4;
if(userRD_buffer[0]=='5')
portb.rb5=~portb.rb5;
if(userRD_buffer[0]=='6')
portb.rb6=~portb.rb6;
if(userRD_buffer[0]=='7')
portb.rb7=~portb.rb7;
}
Delay_ms(1); //Delay para atualização
}
}
void interrupt(void)
{
HID_InterruptProc(); //Tratamento da interrupção de USB
}
unsigned char userWR_buffer[64]; //Buffer de transmissão serial

acho qe n tem problemas no código pois rodou no proteus legalzinho.

os fusiveis estão como na imagem, sera qe eu tenho qe alterar algo??

o capacitos é de 1u escrevi errado. o cristal é de oito e na programação coloquei oito também.

To fazendo no mikroc. os capacitores do cristal são cerâmicos.

Qual o capacitor ideal do vusb???

Eae ghost, fiz oqe você falou coloquei o led e funcionou, mas o computador ainda não reconhece, sera qe é o capacitor do pino 18? ou sera que tem que ter um capacitor em paralelo com a alimentação???

post-527532-13884959290909_thumb.jpg

Postado

Não sei usar o MikroC direito, mas tem coisa errada. Pro USB funcionar, ele precisa ter exatamente 3,3V no VUSB, então ou voce fornece os 3,3V, ou habilita o regulador interno. Como voce não está fornecendo, tem que habilitar o regulador interno, e isso é feito naquele fuse "USB Voltage Regulator" tá como Disabled, voce tem que colocar Enabled.

Além disso o indicado via datasheet é um capacitor de 220pF ali no VUSB... Mas não sei se utilizar outro seria algo tão critico.

Na alimentação é bom também ter um capacitor pra aumentar a estabilidade, se sua alimentação não for da porta USB é mais importante ainda.

Postado
Agora ele reconheceu qe eu conectei no computador mas da dispositivo desconhecido, o que pode ser?

Isso é normal, voce precisa fornecer o driver pra ele. Vai no painel de controle --> Gerenciador de dispositivos --> Portas COM deve aparecer seu dispositivo lá, clique com o botão direito e escolha a opção atualizar driver. Vá em escolher com disco (e não automaticamente) e indique a pasta aonde está seu driver).

Acho que ainda tem erro no seus fuses de qualquer forma. Ali aonde está 96MHz PLL Prescaller acho que teria que ser Divided by 2 ou algo assim, pois seu cristal é de 8MHz, não de 4... Do contrário, a velocidade do USB vai ficar maior que o USB 2.0 (full speed) de 48MHz, e acho que vai acabar dando algum problema...

Postado

Mas estou usando o modo HID, e n tenho o driver especifico, pois no meu entendimento o windows faz isso sozinho.

A msg aparece escrito : Dispositivo USB não foi reconhecido. e aparece aqele simbolo do triangulo amarelo com sinal de exclamçao no meio ao lado esquerdo da msg.

Postado

Para usar a função getc(), não tem que usar primeiro o kbhit() ? Pra verificação do buffer.

Você poderia fazer um exemplo por favor?

Grato

Postado
Mas estou usando o modo HID, e n tenho o driver especifico, pois no meu entendimento o windows faz isso sozinho.

A msg aparece escrito : Dispositivo USB não foi reconhecido. e aparece aqele simbolo do triangulo amarelo com sinal de exclamçao no meio ao lado esquerdo da msg.

Realmente o que eu falei foi imaginando modo CDC que usei atualmente. Nunca usei HID... Não posso te ajudar muito daqui pra frente... Mudou o fuse do PLL que falei? Qual VID e PID usou?

Postado

Seu problema é no Hardware.

Faça uma experiencia.

Conecte o dispositivo na porta USB e fique segurando o 'terra' do conector e veja se indentifica.

Postado

Como assim segurando o terra, você quer dizer tirar o fio terra que vem da usb do computador do circuito???

Alguem tem alguma sugestão?

Consegui arrumar galera, era um dos fusiveis que eu precisava alterar. valeu pela ajuda de todos agora ta funfando legalzinho.

Postado

Oi,

Estou trabalhando em um projeto na qual precisa de uma comunicação usb. No momento estou utilizando a comunicação usb CDC. Consigo enviar para o software supervisorio numa boa. Mas não colocar para funcionar a parte da recepção no microcontrolador.

Estou tentando usar a função get_long_usb que é uma função nativa do compilador CCS mas não funciona.

Estou importando usb_cdc.h, input.c mas mesmo assim dá erro: Function used but not defined.

Alguem poderia dar um help.

Grato

Postado

Vini,não é suficiente para voce usar HID ?

Não precisa de drivers.

Máximo de 64 kb/s.

Pode enviar pacotes de 64 bytes por vez.

O programa HOst/Pc é extremamente simples(sem DLL,aceso por API do Windows).

A não ser que esta planejando fazer um disco virtual ou pen drive,não veja a não utilidade de se usar HID.

Postado
Adicionado ao msn.

Falou

Matheus boa noite. Por favor veja se você consegue me ajudar, pois vi que você postou esta mesma imagem a algum tempo atrás em outro fórum, mas não cheguei a ver uma resposta clara para ela.

Estou com um projeto de iniciação científica que se parece muito com o seu projeto. No meu projeto irei controlar um microscópio via usb.

Consegui reproduzir o seu projeto aqui, mas tenho uma pergunta que não cala.

Por favor me diga como você resolveu o problema desta imagem abaixo sobre PInvokeStackImbalance:

erro-na-pilha-do-usb.html

post-866900-13884959341386_thumb.jpg

Postado
Por favor me diga como você resolveu o problema desta imagem abaixo sobre PInvokeStackImbalance.

E ae. Td bem?

Sim! Consegui resolver. Cara, como esse mundo é pqueno, você encontrou minha dúvida em outro fórum q nem me lembro mais qual é e me encontrou aqui.

Seguinte. Pela screenshot q você tirou, percebe-se que você utiliza windows 7. Correto?

Esse projeto apenas funciona no windows XP. Na verdade, eu até consegui fazer funcionar no windows 7 32bits mas depois d um tenpo começou a dar esse erro ai.

A única coisa que resolvou foi eu formatar o PC e instalar o windows XP enquanto estava desenvolvendo o projeto.

Caso você não queira formatar o PC, tenho outra solução para você. Já ouviu falar no Windows XP Mode? è um aplicativo que você baixa do site da microsoft e ele emula o windows XP sobre o windows 7. Com ele consegui faezr funcionar também.

você faz o download dele aqui ó:

Download windows XP Mode

São 3 arquivos. Tem uns 600MB mas vale a pena. Melhor usar ele doq formatar o PC né.

Se a dúvida resolver, posta aqui.

Falou

Postado

Muito obrigado por me responder tão rápido.

Como estou em casa estou usando meu notebook que é um Amazon L104 como o Win7 32 bits. Mas no trabalho eu uso um Dell Optplex 320 com XP 32 bits.

Primeiramente, li quase todos os tópicos que você postou então comecei a trabalhar com o XP, consegui reproduzir o que você fez no arquivo executável que veio na pasta "Aplicativo" do arquivo postado por você "Trabalho Final"

Inseri um trimpot para simular a o sensor de temperatura para visualizar a alteração no gráfico e voltímetros analisar os dados dos motores até aqui tudo certo, sem usar o C#, só usando o aplicativo gerado por você.

O meu próximo passo foi compilar o mesmo código do "PicUSB.cs" feito por você sem alterar nenhuma linha de programa, contudo quando clico em "Start Debugging ou (F5)" cai na mesma imagem que te enviei.

Sendo que o PC foi recentemente formatado justamente para esta aplicação.

Como você disse que resolveu formatando o PC caí em um impasse, pois achava que eu estava esquecendo de alguma coisa. Quanto tempo este erro te assombrou se você lembrar? Qual é a versão de USB que você está usando, pois percebi no código do pic "PicUSB.h" da pasta "Código_fonte_circuito_USB_e_transmiter_RS232" está denominado 1.1 como segue o trecho do código:

____________________________________________________________

//device descriptor

char const USB_DEVICE_DESC[] ={

USB_DESC_DEVICE_LEN, //the length of this report

0x01, //constant DEVICE (0x01)

0x10,0x01, //usb version in bcd

0x00, //class code (if 0, interface defines class. FF is vendor defined)

0x00, //subclass code

0x00, //protocol code

USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8)

0xD8,0x04, //vendor id (0x04D8 is Microchip)

0x11,0x00, //product id, me gusta el 11 ;)

0x01,0x00, //device release number

0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below)

0x02, //index of string descriptor of the product

0x00, //index of string descriptor of serial number

USB_NUM_CONFIGURATIONS //number of possible configurations

};

_______________________________________________________________

Se for possível gostaria de saber se sua versão do Visual Studio 2010 Express foi pego pela net? Caso positivo você poderia me passar este link, vai saber se não peguei um danificado pela net.

Na segunda postarei uma foto do pc com sistema XP

Para funcionar no Win7 percebi que o arquivo mpusbapi.dll estava antigo, então substitui por uma versão mais recente que retirei da Microchip Solutions v2010-10-19 e que o arquivo picusb.inf (informação de configuração) da pasta "PicUSB_Driver" necessitava de um upgrade também, sendo que utilizei como base o arquivo da Microchip "mchpusb.inf" para fazer o upgrade.

Obrigado pela atenção e boa noite, ou bom dia!!!!

Postado

Opa, baixei minha versão do Visual C# aqui ó:

http://www.microsoft.com/express/Downloads/

Só escolher a opção "All - Offline Install ISO image file". Tem 1.6GB. Ela vem com todos.

Atualizei minhas .dll como você fez. Mas no windows XP funciona normal.

você tem o proteus aí poder testar? você pode ao invéz de usar uma placa pronta, testa no proteus primeiro. você dá play no circuito o windows vai reconhecer, vai pedir driver e você usa o programa feito no c# p comandar o PIC do proteus.

Qualquer dúvida, estou por aqui.

Falou

  • Curtir 1
Postado

Salve Matheus bom dia,

Consegui reproduzir usando o Proteus 7.6 SP4 no Win7 sem problemas!!.

Neste momento estou trabalhando na interface gráfica, contudo quando eu começar a chamar funções do PIC no C# verei se ocorrerá o desbalanceamento da pilha USB, na verdade o que percebi é que ocorre um alerta por causa das assinaturas só não sei ainda de quais arquivos, pois no canto inferior esquerdo da tela do Visual Studio escreve: "Build Succeeded"

Ficarei uns 3 dias sem mexer neste projeto, contudo caso aparecer dúvidas postarei mais mensagens pedindo um help!! OK

Muito Obrigado!!

Postado

Boas notícias então.

você está fazendo correto. É melhor fazer o C# chamar funções no PIC do que fazer o PIC enviar valores e deixar o C# esperando por eles. Dessa forma fica mais estável o projeto.

Qualquer dúvida, só chamar.

Mas tenho um outro projeto igual a esse que funciona plenamente inclusive no windows 7 64 bits.

Mas o protocolo é totalmente diferente. Mas o esquema é o mesmo. Só muda a programação do C# e o driver que fizeram um novo.

Falou

  • 2 meses depois...
Postado

Matheus estou montando um projeto qe envolve comunicação usb e comunicação RF(serial) no mesmo pic 18f4550, montei um programa em C e a comunicação usb funcionou perfeitamente mas quando chega a hora da comunicação serial não funciona, n sei porque, como uso o mikroc acho este genérico e gostaria de saber quais as configurações do pic eu teria qe ter em antemão pra poder montar o programa, pois no mikroc basta habilitar as bibliotecas e chamalas, mas acho qe esta havendo conflito entre as mesma, mas n consigo descobrir o porque. Quero migrar para o ccs, será que você poderia me dar umas dicas, ou até mesmo me passar algum material???

Grato

Postado

Bem, o código para USB está na 1ª página.

Sobre o RF, p código é meio chato. Não funciona se você simplesmente escrever na serial.

Um exemplo funcional de um link RF você escontra aqui:

Link RF de exemplo

Ai depende de você "juntar" os dois.

Acredito que irá funcionar sem problemas.

Falou

Postado

Obrigado pelo exemplo do RF, mas como ainda sou leigo no ccs não consegui identificar a diferença de fazer uma comunicação serial e outra que utilize RF. fiquei com algumas dúvidas sobre o programa será que você poderia me explicar?

por exemplo essa parte:

#use rs232(baud=2400, xmit=WireTX, rcv=WireRX, ERRORS, STREAM=Wireless)

só entendi a primeira parte sobre a velocidade o resto não compreendi. é uma comunicação serial por software?

2º parte:

qual a função das interrupções nesse caso?

3º parte:

Qual a função da váriavel "flag"?

Desculpe se as perguntas são simplórias, mas é que como estou querendo migrar do mikroc (em que não precisava fazer muita coisa) para o ccs, estou sentindo muitas dificuldades.

Visitante
Este tópico está impedido de receber 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!