  | 
	  | 
		 
	 
	
		| View previous topic :: View next topic   | 
	 
	
	
		| Author | 
		Message | 
	 
	
		
			FFT
 
 
  Joined: 07 Jul 2010 Posts: 92
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				| Request: USB HID Test code for 18LF14K50 12MHz [Solved] | 
			 
			
				 Posted: Mon Oct 18, 2021 1:58 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Hello,
 
 
I'm having trouble getting running the full speed or low speed USB HID.
 
Currently my code has no effect when device is plugged into USB.
 
I generated the USB code using CCS Wizard.
 
(PIC and the PCB work properly, it can read ADC and set LEDs successfully)
 
I use HID Terminal GUI for testing but I don't see my device there.
 
 
I need a working USB HID test code for 18LF14K50, can somebody help me?
 
 
* 12MHz external crystal connected to RA4(2), RA5(3)
 
* VCC is 3.3V
 
* USB power detect pin is PIN_C0(16)
 
* VUSB(17) pin is connected to 3.3V directly and a 1uF next to the pin
 
* D+(19) and D-(18) pins are connected to USB socket over 33R resistors
 
* MCLR ON
 
* All other pins are inputs
 
 
I cannot understand what is wrong with it.
 
 
I'm sure it will be useful for other people as well.
 
 
Thanks
  Last edited by FFT on Thu Dec 16, 2021 11:01 am; edited 2 times in total | 
			 
		  | 
	 
	
		  | 
	 
	
		
			temtronic
 
 
  Joined: 01 Jul 2010 Posts: 9589 Location: Greensville,Ontario 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Mon Oct 18, 2021 2:02 pm     | 
				     | 
			 
			
				
  | 
			 
			
				| It may not be a PIC problem, what are you connected to ? If a Windows based PC, run USBView or similar program to CONFIRM the USB port the PIC is connected to is configured for high speed mode... | 
			 
		  | 
	 
	
		  | 
	 
	
		
			FFT
 
 
  Joined: 07 Jul 2010 Posts: 92
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Mon Oct 18, 2021 2:32 pm     | 
				     | 
			 
			
				
  | 
			 
			
				 	  | temtronic wrote: | 	 		  | It may not be a PIC problem ., what are you connected to ? If a Windows based PC, run USBView or similar program to CONFIRM the USB port the PIC is connected to is configured for high speed mode... | 	  
 
I did it, all seems good. I can run an STM32 USB HID device on the same port. | 
			 
		  | 
	 
	
		  | 
	 
	
		
			vtrx
 
 
  Joined: 11 Oct 2017 Posts: 144
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Mon Oct 18, 2021 3:10 pm     | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Quote: | 	 		  | * VBUS(17) pin is connected to 3.3V directly and a 1uF next to the pin  | 	  
 
Is this connection correct? | 
			 
		  | 
	 
	
		  | 
	 
	
		
			Ttelmah
 
 
  Joined: 11 Mar 2010 Posts: 19967
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Oct 19, 2021 12:35 am     | 
				     | 
			 
			
				
  | 
			 
			
				The connection is OK, but the capacitor is wrong. It requires a 0.22 to 0.47uF ceramic capacitor. If the 1uF is electrolytic, it won't have a low enough ESR. 
 
 
To the original poster, post your setup lines. Clock setting etc..
 
 
With a 12MHz crystal, you need something like:
 
 	  | Code: | 	 		  
 
#include <18LF14K50.h>
 
#device ADC=10
 
 
#FUSES NOWDT                    
 
#use delay(clock=48MHz,crystal=12MHz,USB_FULL)
 
 
#define USB_CABLE_IS_ATTACHED()  input(PIN_C0)
 
#define USB_CONFIG_BUS_POWER 500
 
#include "ex_usb_common.h"
 
#define USB_CONFIG_HID_TX_SIZE 2
 
#define USB_CONFIG_HID_RX_SIZE 2
 
//these need to be set if you intend to use the hiddemo code
 
#include "pic18_usb.h" //hardware layer for PIC18
 
#include "usb_desc_hid.h" //now the HID descriptor
 
#include "usb.c" //and the basic handlers
 
 
//Then your code. Remember this must call usb_init_cs or the 
 
//unit will not be seen.
 
 
 | 	 
  | 
			 
		  | 
	 
	
		  | 
	 
	
		
			FFT
 
 
  Joined: 07 Jul 2010 Posts: 92
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Oct 19, 2021 11:36 am     | 
				     | 
			 
			
				
  | 
			 
			
				@Ttelmah, I just tested the code snippet you provided but nothing happens. It does not enumerate at all.
 
 
The VBUS pin is connected to 3.3V and I have few 10uF capacitors on the 3.3V line. So the 1uF is not alone there. Do you think the 1uF is the problem?
 
 
Could you supply a working test code if you have the PIC?
 
 
 
BTW I get those warnings:
 
 	  | Quote: | 	 		  >>> Warning 216 "main.c" Line 177(1,2): Interrupts disabled during call to prevent re-entrancy:  (@READ_PROGRAM_MEMORY)
 
>>> Warning 216 "main.c" Line 177(1,2): Interrupts disabled during call to prevent re-entrancy:  (usb_token_reset)
 
>>> Warning 216 "main.c" Line 177(1,2): Interrupts disabled during call to prevent re-entrancy:  (usb_tbe)
 
>>> Warning 216 "main.c" Line 177(1,2): Interrupts disabled during call to prevent re-entrancy:  (usb_flush_in)
 
 | 	 
  | 
			 
		  | 
	 
	
		  | 
	 
	
		
			vtrx
 
 
  Joined: 11 Oct 2017 Posts: 144
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Oct 19, 2021 6:27 pm     | 
				     | 
			 
			
				
  | 
			 
			
				| The 18LF14K50 microcontroller not use the standard scheme for the Vusb pin, connected to ground in series with the capacitor(470n)? | 
			 
		  | 
	 
	
		  | 
	 
	
		
			Ttelmah
 
 
  Joined: 11 Mar 2010 Posts: 19967
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Oct 19, 2021 10:50 pm     | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Quote: | 	 		  
 
@Ttelmah, I just tested the code snippet you provided but nothing happens. It does not enumerate at all. 
 
 | 	  
 
 
Of course it won't. That is a header, not the code.
 
 
I use the chip for CDC, not HID, and it runs fine. Different crystal, and 
 
I followed the Microchip wiring for all the pins. Including decoupling 
 
right by the chip.
 
 
Have you proved the chip is actually running, and running at the expected
 
clock rate?. Needs to be done before anything else. | 
			 
		  | 
	 
	
		  | 
	 
	
		
			FFT
 
 
  Joined: 07 Jul 2010 Posts: 92
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Wed Oct 20, 2021 9:26 am     | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Ttelmah wrote: | 	 		  | Of course it won't. That is a header, not the code. | 	  
 
I use a main loop with usb send packets, so I didn't use your header only.
 
 
 	  | Ttelmah wrote: | 	 		  | I use the chip for CDC, not HID, and it runs fine. | 	  
 
Can you share the code?
 
Topic is created for a USB test code. It can be CDC, no problem.
 
 
 	  | Ttelmah wrote: | 	 		  | Have you proved the chip is actually running, and running at the expected clock rate? | 	  
 
The chip is running, I tested ADC, I2C and GPIO (Leds, Buttons).
 
How to test the clock rate?
 
 
 
VBUS:
 
VBUS pin is connected to VCC which is 3.3V
 
If it was not LF chip, it would have it's own regulator, but LF chip has no regulator. | 
			 
		  | 
	 
	
		  | 
	 
	
		
			Ttelmah
 
 
  Joined: 11 Mar 2010 Posts: 19967
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Wed Oct 20, 2021 9:32 am     | 
				     | 
			 
			
				
  | 
			 
			
				Testing speed is easy. You just run a loop set a pin high delay for
 
1000mSec, set it low, delay again, and loop. Attach an LED to the pin. if it
 
does flash 5 times in 10 seconds, the the clock rate is right. If not
 
there is a clock problem. USB will never work if the clock is wrong.
 
I asked right at the beginning for you to post the header stuff you are
 
using. I repeat this. | 
			 
		  | 
	 
	
		  | 
	 
	
		
			FFT
 
 
  Joined: 07 Jul 2010 Posts: 92
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Wed Oct 20, 2021 11:13 am     | 
				     | 
			 
			
				
  | 
			 
			
				I tested the clock rate using LEDs, it looks exact.
 
 
Here is my test code:
 
 
 	  | Code: | 	 		  #include <18LF14K50.h>
 
#device ADC=10
 
 
#fuses WDT
 
#fuses WDT128
 
#fuses NOIESO
 
#fuses NOFCMEN
 
#fuses PCLKEN
 
#fuses NOPUT
 
#fuses NOBROWNOUT
 
#fuses MCLR
 
#fuses NOHFOFST
 
#fuses NOLVP
 
#fuses NOXINST
 
// configure 12MHz clock for USB operation and 48Mhz CPU operation
 
#fuses HS
 
#fuses PLLEN   //enable pll, we can now use CPUDIVx fuses
 
#fuses CPUDIV1 //CPU clock set to 48MHz
 
//#fuses USBDIV2 //when using low speed USB, need to divide 12MHz by 2.  this fuse has no effect when using full speed.
 
 
 
#use delay(clock=48MHz,crystal=12MHz,USB_FULL,restart_wdt)
 
 
#use FIXED_IO( C_outputs=PIN_C4 )
 
 
//#define USB_ISR_POLLING // Comment to use interrupt
 
#define USB_CABLE_IS_ATTACHED() input(PIN_C0)
 
#define USB_CONFIG_BUS_POWER    100
 
//#define USB_USE_FULL_SPEED      1
 
//#define USB_MAX_EP0_PACKET_LENGTH 64 // 8 bytes buffer
 
#define USB_CONFIG_HID_TX_SIZE  8
 
#define USB_CONFIG_HID_RX_SIZE  8
 
#define USB_STRINGS_OVERWRITTEN
 
 
//!char USB_STRING_DESC_OFFSET[]={0,4,28};
 
 
 
char const USB_STRING_DESC[]={
 
   //string 0 - language
 
      4,  //length of string index
 
      0x03,  //descriptor type (STRING)
 
      0x09,0x04,  //Microsoft Defined for US-English
 
   //string 1 - manufacturer
 
      4,  //length of string index
 
      0x03,  //descriptor type (STRING)
 
      'E',0,
 
   //string 2 - product
 
      4,  //length of string index
 
      0x03,  //descriptor type (STRING)
 
      'S',0
 
};
 
 
#include <pic18_usb.h> // HID
 
#include <usb_desc_hid.h>
 
#include <usb.c>
 
 
bool Tick = FALSE;
 
 
#INT_TIMER0
 
void  TIMER0_isr(void) 
 
{
 
    Tick = TRUE;
 
}
 
 
void main()
 
{
 
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16);      //87,4 ms overflow
 
 
   setup_wdt(WDT_128MS);
 
 
   usb_init_cs();
 
 
   enable_interrupts(INT_TIMER0);
 
   enable_interrupts(GLOBAL);
 
 
   for(;;)
 
   {
 
      restart_wdt();
 
      usb_task();
 
      if(Tick == TRUE)
 
      {
 
         if(usb_enumerated())
 
         {
 
              char u[USB_CONFIG_HID_TX_SIZE];
 
              strcpy(u, "test");
 
              usb_put_packet(USB_HID_ENDPOINT, u, USB_CONFIG_HID_TX_SIZE, USB_DTS_TOGGLE);
 
         }
 
         Tick = FALSE;
 
      }
 
   }
 
} | 	 
  | 
			 
		  | 
	 
	
		  | 
	 
	
		
			FFT
 
 
  Joined: 07 Jul 2010 Posts: 92
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Thu Oct 21, 2021 1:04 pm     | 
				     | 
			 
			
				
  | 
			 
			
				| Any help? | 
			 
		  | 
	 
	
		  | 
	 
	
		
			PCM programmer
 
 
  Joined: 06 Sep 2003 Posts: 21708
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Thu Oct 21, 2021 2:16 pm     | 
				     | 
			 
			
				
  | 
			 
			
				You didn't copy Ttelmah's fuse setup.  There are many differences
 
between his compiled fuses and yours:
 
 
Your fuses:
 
 	  | Code: | 	 		  Configuration Fuses:
 
   Word  1: 3220   CPUDIV1 USBDIV2 HS PLLEN PCLKEN NOFCMEN NOIESO
 
   Word  2: 0F19   NOPUT NOBROWNOUT BORV19 WDT WDT128
 
   Word  3: 8000   NOHFOFST MCLR
 
   Word  4: 0089   STVREN NOLVP BBSIZ2K NOXINST NODEBUG
 
   Word  5: C003   NOPROTECT NOCPB NOCPD
 
   Word  6: E003   NOWRT NOWRTC NOWRTB NOWRTD
 
   Word  7: 4003   NOEBTR NOEBTRB
 
 | 	  
 
 
Ttelmah's fuses:
 
 	  | Code: | 	 		  Configuration Fuses:
 
   Word  1: F220   CPUDIV1 USBDIV2 HS PLLEN PCLKEN FCMEN IESO
 
   Word  2: 1E1E   PUT BROWNOUT BORV19 NOWDT WDT32768
 
   Word  3: 8800   HFOFST MCLR
 
   Word  4: 0089   STVREN NOLVP BBSIZ2K NOXINST NODEBUG
 
   Word  5: C003   NOPROTECT NOCPB NOCPD
 
   Word  6: E003   NOWRT NOWRTC NOWRTB NOWRTD
 
   Word  7: 4003   NOEBTR NOEBTRB
 
 | 	  
 
 
Your #fuses code:
 
 	  | Code: | 	 		  #include <18LF14K50.h>
 
#device ADC=10
 
 
#fuses WDT
 
#fuses WDT128
 
#fuses NOIESO
 
#fuses NOFCMEN
 
#fuses PCLKEN
 
#fuses NOPUT
 
#fuses NOBROWNOUT
 
#fuses MCLR
 
#fuses NOHFOFST
 
#fuses NOLVP
 
#fuses NOXINST
 
// configure 12MHz clock for USB operation and 48Mhz CPU operation
 
#fuses HS
 
#fuses PLLEN   //enable pll, we can now use CPUDIVx fuses
 
#fuses CPUDIV1 //CPU clock set to 48MHz
 
//#fuses USBDIV2 //when using low speed USB, need to divide 12MHz by 2.  this fuse has no effect when using full speed.
 
 
 
#use delay(clock=48MHz,crystal=12MHz,USB_FULL,restart_wdt) | 	  
 
Ttelmah's #fuses code:
 
 	  | Code: | 	 		  
 
#include <18LF14K50.h>
 
#device ADC=10
 
 
#FUSES NOWDT                   
 
#use delay(clock=48MHz,crystal=12MHz,USB_FULL)
 
 | 	 
  | 
			 
		  | 
	 
	
		  | 
	 
	
		
			FFT
 
 
  Joined: 07 Jul 2010 Posts: 92
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Thu Oct 21, 2021 2:50 pm     | 
				     | 
			 
			
				
  | 
			 
			
				 	  | PCM programmer wrote: | 	 		  | You didn't copy Ttelmah's fuse setup. | 	  
 
İf you check out this line below, you will see that the other fuses are added.
 
#include "ex_usb_common.h"
 
 
I also tested without ex_usb_common.h with the header and fuses you just mentioned but nothing happens.
 
 
Can somebody give me a working test code for USB as I requested on my first message? I have created the topic for just a test code.
 
I will find the issue if I get a working test code. It may be a HW issue.
 
 
Thanks | 
			 
		  | 
	 
	
		  | 
	 
	
		
			FFT
 
 
  Joined: 07 Jul 2010 Posts: 92
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Sat Oct 23, 2021 4:24 am     | 
				     | 
			 
			
				
  | 
			 
			
				| Nobody has a test code? | 
			 
		  | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
  | 
   
 
  
Powered by phpBB © 2001, 2005 phpBB Group
  
		 |