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 support@ccsinfo.com

PIC16F1455 USB Bootloader & HID Enumeration issue

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
drnewbury



Joined: 21 May 2018
Posts: 2

View user's profile Send private message

PIC16F1455 USB Bootloader & HID Enumeration issue
PostPosted: Mon May 21, 2018 2:13 am     Reply with quote

Hi

I am trying to use either the Microchip MLA USB bootloader or the USB DFU Bootloader.
(https://www.microchip.com/mplab/microchip-libraries-for-applications or https://github.com/majbthrd/PIC16F1-USB-DFU-Bootloader)

Both seem to be functioning correctly when I compile a program in CCS using the following headers:
Code:

///////////////////////////////////////////////////////////////////////////
//// USB_BOOTLOADER.H ////
//// ////
//// ////
///////////////////////////////////////////////////////////////////////////
//how big is the bootloader?
//the bootloader will reside from address 0x0000 to this location. the
//application will then sit at this location+1 to the end of program memory.
#define LOADER_SIZE (0x903)
#define LOADER_START (0)
#define LOADER_END (LOADER_SIZE)
#define APPLICATION_START (LOADER_SIZE+1)
#define APPLICATION_END (getenv("PROGRAM_MEMORY")-1)
#define APPLICATION_ISR (APPLICATION_START+8)


#ifndef _bootloader
//in the application, this moves the reset and isr vector out of the bootload
//space. it then reserves the loader space from being used by the application.
#build(reset=APPLICATION_START, interrupt=APPLICATION_ISR)
#org 0, LOADER_END {}
#endif

or
Code:

/* --- BEGIN: changes required for bootloader ------------------------------ */
/* ------------------------------------------------------------------------- */
/* map reset vector and interrupt vector */
/* 0x000-0x7FF is used by the bootloader. The bootloader maps the original */
/* reset vecotr (0x000) to 0x800 and the reset vector (0x008) to 0x800. */
/* ------------------------------------------------------------------------- */
#build (reset=0x201, interrupt=0x209)
/* ------------------------------------------------------------------------- */
/* reserve boot block area */
/* This memory range is used by the bootloader, so the application must not */
/* use this area. */
/* ------------------------------------------------------------------------- */
#org 0, 0x200 {}
/* --- END: changes required for bootloader -------------------------------- */


However, when I use usb_init(); something strange is happening.
If the while loop of the program is empty the USB device enumerates correctly, but if I include anything inside the while loop the USB device no longer enumerates and shows as "USB Device (Device Descriptor Request Failed)"

I have attempted this with the unaltered output from the CCS Project Wizard.
I generated the project with nothing but the USB functionality, compiled it, and loaded it using a pickit and it functioned perfectly.
Then I added one of the above headers, compiled it and loaded it with the bootloader, and with both bootloaders, I get the same issue, it appears to function until I add anything inside the while loop, then it fails.

I also attempted to mirror the fuses in the project to those in the bootloader:
Code:

#fuses INTRC_IO, WDT_SW, PUT, NOMCLR, PROTECT, BROWNOUT, NOIESO, NOFCMEN, WRT, NOCPUDIV, LS48MHZ, PLL3X, PLLEN, STVREN, LPBOR, NODEBUG, NOLVP

Again, using these the program functions correctly when loaded directly but not when loaded using the bootloader.

Finally, when I create a project not using the USB functionality there seems to be no issue with the program compiled by CCS functioning after loading with the bootloaders.

Has anyone got any thoughts on what I am doing wrong?

P.S. this is the c generated by the project wizard that I am using:
main.c:
Code:

#include <main.h>

/* TODO: Use usb_put_packet() to transmit data to USB HID,
using USB_HID_ENDPONT for the endpoint and the payload size
needs to match USB_CONFIG_HID_TX_SIZE. Use usb_get_packet()
to read incomming data, using USB_HID_ENDPOINT for the
endpoint. usb_enumerated() can be used to see if connected to
a host and ready to communicate. */

void main()
{
   usb_init();

   while(TRUE)
   {


      //TODO: User Code
   }

}

main.h:
Code:

#include <16F1455.h>
#device ADC=10

#FUSES NOWDT                    //No Watch Dog Timer

#use delay(internal=48MHz,USB_FULL,ACT=USB)

#define USB_CONFIG_BUS_POWER 500
#define USB_STRINGS_OVERWRITTEN

char USB_STRING_DESC_OFFSET[]={0,4,12};

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
      8,  //length of string index
      0x03,  //descriptor type (STRING)
      'f',0,
      'o',0,
      'o',0,
   //string 2 - product
      8,  //length of string index
      0x03,  //descriptor type (STRING)
      'b',0,
      'a',0,
      'r',0
};

#define USB_CONFIG_HID_TX_SIZE 0
#define USB_CONFIG_HID_RX_SIZE 0
#include <pic16f_usb.h>
#include <usb_desc_hid.h>
#include <usb.c>
[/url]
Ttelmah



Joined: 11 Mar 2010
Posts: 19195

View user's profile Send private message

PostPosted: Mon May 21, 2018 7:30 am     Reply with quote

Bootloaders must end on page boundaries. Not odd sizes like 0x903.
Now your two different headers are for very different bootloader sizes. The GitHub one is optimised to fit in 0x1FF bytes, so should use:

#build (reset=0x200, interrupt=0x204)
#org 0, 0x1FF {}

On your chip the block size is 32 instruction words. The main code must be on a boundary of this count.

The interrupt vector on a PIC16, is four bytes up the ROM, not 8 bytes up as you seem to be trying to use. 8 bytes up, is the location for a PIC18.

You can build your run time code with

#FUSES NONE

However your code must be designed to run with the fuses the bootloader is setting.
drnewbury



Joined: 21 May 2018
Posts: 2

View user's profile Send private message

Thankyou
PostPosted: Tue May 22, 2018 10:12 am     Reply with quote

Thank you so much!
Everything is running perfectly now.

I fundamentally did not understand the significance of the byte difference between the PIC16 chip and the PIC18 examples I was using.

Also, in all honesty, I have been trying to find an explanation and I think I am still failing to fully understand the boundaries and interrupt vectors.
This showed up in my rss feed today and seems very timely:
https://www.designnews.com/design-hardware-software/soon-be-extinct-embedded-software-engineer/39152617858743

Anyway, thanks again for taking the time to reply.
David
Ttelmah



Joined: 11 Mar 2010
Posts: 19195

View user's profile Send private message

PostPosted: Tue May 22, 2018 11:55 am     Reply with quote

Well done. Smile

A few little hints and you've got it. Very impressive.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
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