Hallo,

Ik ben bezig met een project. Hiervoor maak ik gebruik van een pic18f2450, deze wil ik via USB als een HID device gebruiken.
Ik programmeer in c en gebruik de css compiler.
Ik maak gebruik van de volgende includes:
USB.c, pic18_usb.h(ge-update op 30-10-08) en usb_desc_hid.h(laatste update:20-06-05), ik heb niks in deze files veranderd.
Dit is mijn code:

Mod-edit: Zet je code ergens op een server, te veel voor op een forum

Nu mijn probleem:
Ik krijg een melding in Vista: "Het USB-apparaat word niet herkend".

[Bericht gewijzigd door Henry S. op (0%)]

Is alles in de USB descriptor wel goed ingevuld?

Dit staat in usb_desc_hid.h.
Het is mijn eerste project met een usb interface en zie veel voorbeelden. Ik weet niet wat goed of fout is.

Mod-edit: Zet je code ergens op een server, te veel voor op een forum, en dit is btw ook nog eens een standaard file.

[Bericht gewijzigd door Henry S. op (36%)]

Je kan ook eens je vraag posten op het forum van ccs. De mensen daar werken allemaal met ccs, hier op het forum wordt voornamelijk picbasic gebruikt volgens mij.

ik schat zo'n (van de PIC gebruikers) 50% picbasic, en 50% rest (C/assembler)waarvan denk ik zo'n handjevol CCS gebruikers.

Misschien is proberen op XP ipv Vista ook een optie? Ik weet niet of vista nog anders om gaat met USB dan XP. Aangezien de ccs voorbeelden al een aantal jaartjes oud zijn.

XP of Vista maakt niet uit.
Heb op XP net getest en het zelfde verhaal.

Hij word nu herkend als zijnde een USB-HID device, alleen staat erbij dat het apparaat niet start. De oplossing zat in pic18_usb.h. Hier moest een recentere versie voorkomen.

[Bericht gewijzigd door Henry S. op (55%)]

Hoe ziet het er hardware matig uit (kan je een schema posten) ?

Als je bijvoorbeeld geen condensator van 100nf dicht bij de PIC plaatst krijg je ook dit probleem is mijn ervaring.

Het geheel zit nu nog op een breadbord. Bij de controller zit een 100nF over de VDD en VSS, de D- en D+ zitten rechtstreeks op de usb kabel geen weerstanden of condensatoren of zo. Verder werk de controller op een 20MHz kristal en timer1 word "aangedreven" door een 32768 kristal. Alle beide kristallen zitten via een 33nF condensator naar de ground. Op pin B0 en A0 zitten leds op aangesloten via 333 ohm weerstanden.

[Bericht gewijzigd door microchipper op (96%)]

Op 25 september 2009 10:52:40 schreef microchipper:
...
usb_task(); //hoort ook bij de init
...

Nee, usb_task() hoort in je while(1) loop te staan. Hij moet regelmatig worden aangeroepen, niet slechts eenmalig bij init.

Dat klopt ik heb er met die 3 regeltjes wat "gespeeld". ik heb de usb_taks() en de usb_debug_task(); nu in de while(1) staan. Staan ze daar buiten dan krijg ik weer: "USB apparaat word niet herkend".

update van de code:

#include <18f2450.h>
//#define __USB_PIC_PERIF__ 1    //Only for PIC18f4550 

#fuses HSPLL
#fuses NOWDT
#fuses NOPROTECT
#fuses NOLVP
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode) 
#fuses NODEBUG    // if this isn't there - things don't work !!!
#fuses USBDIV
#fuses PLL5 // 20 MHz crystal
#fuses CPUDIV1 // to support slow speed 6 mhz
#fuses VREGEN
#fuses NOPBADEN
//#build(reset=0x1, interrupt=0x8)          // Necessary for Bootloader 
#use delay(clock=48000000) 
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)

/*
//Tells the CCS PIC USB firmware to include HID handling code. 
#define USB_HID_DEVICE  TRUE              //Previously it was "DEFINE"

//the following defines needed for the CCS USB PIC driver to enable the TX endpoint 1   
// and allocate buffer space on the peripheral   
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers   
#define USB_EP1_TX_SIZE    64                      //allocate 8 bytes in the hardware for transmission   
   
//the following defines needed for the CCS USB PIC driver to enable the RX endpoint 1   
// and allocate buffer space on the peripheral   
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for OUT bulk/interrupt transfers   
#define USB_EP1_RX_SIZE    64    //allocate 8 bytes in the hardware for reception   
*/
//void knipper(void);
void usb_debug_task(void);

#include <usb_desc_hid.h>
#include <pic18_usb2.h>
#include <usb.c>
#include <usb.h>

int a = 0;

/////////////////////////////////////////////////////////////////////////////
//
// usb_debug_task()
//
// When called periodically, displays debugging information over serial
// to display enumeration and connection states.  Also lights LED1 based upon
// enumeration and status.
//
/////////////////////////////////////////////////////////////////////////////
void usb_debug_task(void)
{
   static int8 last_connected;
   static int8 last_enumerated;
   int8 new_connected;
   int8 new_enumerated;

   new_connected=usb_attached();
   new_enumerated=usb_enumerated();

   if (new_connected && !last_connected)
      printf("\r\n\nUSB connected, waiting for enumaration...");
   if (!new_connected && last_connected)
      printf("\r\n\nUSB disconnected, waiting for connection...");
   if (new_enumerated && !last_enumerated)
      printf("\r\n\nUSB enumerated by PC/HOST");
   if (!new_enumerated && last_enumerated)
      printf("\r\n\nUSB unenumerated by PC/HOST, waiting for enumeration...");

   last_connected=new_connected;
   last_enumerated=new_enumerated;
}

void main(void)
{
  	SET_TRIS_A( 0x00 );
    SET_TRIS_B( 0x00 );
    output_high(PIN_B0);
    output_a(0);
    setup_timer_0(RTCC_INTERNAL);
    setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_CLK_OUT); 
    //enable_interrupts(GLOBAL);
    enable_interrupts(INT_TIMER1);
    //enable_interrupts(INT_USB);
    set_timer1(0);

	#ifdef __PCH__
   		printf("\r\nPCH: v");
   		printf(__PCH__);
  	#else
   		printf("\r\n\PCM: v");
  		printf(__PCM__);
  	#endif

   	usb_init_cs();
	
  	//usb_wait_for_enumeration();      //wacht op herkenning door de host PC 
  	
   	while(1)
   	{
	   	usb_task();                      
   		usb_debug_task();
      	if (usb_enumerated()) 
	  	{
         	output_b(0);	
      	}   
   }
}

#INT_TIMER1
void knipper()
{
   clear_interrupt(int_timer1);
   if (a == 0)
      {
         a=1;
         output_high(PIN_A0);
      }
      else
      {
         a=0;
         output_low(PIN_A0);
      }

Hij word nu gezien als een HID compliant spelbesturing. Er staat geen error code meer bij.
Ik had een andere versie van usb_desc_hid.h nodig.

[Bericht gewijzigd door Henry S. op (2%)]

Op 25 september 2009 22:31:50 schreef microchipper:
Alle beide kristallen zitten via een 33nF condensator naar de ground.

Dat is een hele vreemde waarde.

Heb ze vervangen door 18pF condensatoren.