CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Request: USB HID Test code for 18LF14K50 12MHz [Solved]
Goto page 1, 2, 3, 4  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
FFT



Joined: 07 Jul 2010
Posts: 92

View user's profile Send private message

Request: USB HID Test code for 18LF14K50 12MHz [Solved]
PostPosted: Mon Oct 18, 2021 1:58 pm     Reply with quote

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: 9225
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Mon Oct 18, 2021 2:02 pm     Reply with quote

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

View user's profile Send private message

PostPosted: Mon Oct 18, 2021 2:32 pm     Reply with quote

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: 142

View user's profile Send private message

PostPosted: Mon Oct 18, 2021 3:10 pm     Reply with quote

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: 19506

View user's profile Send private message

PostPosted: Tue Oct 19, 2021 12:35 am     Reply with quote

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

View user's profile Send private message

PostPosted: Tue Oct 19, 2021 11:36 am     Reply with quote

@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: 142

View user's profile Send private message

PostPosted: Tue Oct 19, 2021 6:27 pm     Reply with quote

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: 19506

View user's profile Send private message

PostPosted: Tue Oct 19, 2021 10:50 pm     Reply with quote

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

View user's profile Send private message

PostPosted: Wed Oct 20, 2021 9:26 am     Reply with quote

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: 19506

View user's profile Send private message

PostPosted: Wed Oct 20, 2021 9:32 am     Reply with quote

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

View user's profile Send private message

PostPosted: Wed Oct 20, 2021 11:13 am     Reply with quote

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

View user's profile Send private message

PostPosted: Thu Oct 21, 2021 1:04 pm     Reply with quote

Any help?
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Thu Oct 21, 2021 2:16 pm     Reply with quote

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

View user's profile Send private message

PostPosted: Thu Oct 21, 2021 2:50 pm     Reply with quote

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

View user's profile Send private message

PostPosted: Sat Oct 23, 2021 4:24 am     Reply with quote

Nobody has a test code?
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2, 3, 4  Next
Page 1 of 4

 
Jump to:  
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