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

usb_cdc interrupt?

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



Joined: 10 Dec 2011
Posts: 376
Location: Sofiq,Bulgariq

View user's profile Send private message

usb_cdc interrupt?
PostPosted: Fri Feb 21, 2014 6:45 am     Reply with quote

Hello!
I want to interrupt my main routine when I receive data trough usb_cdc equivalent to INT_RDA.
I am using usb_cdc.
Is there interrupt handler for usb_cdc?
#int_usb doesnt work for me, I dont know why. . .
_________________
A person who never made a mistake never tried anything new.
Ttelmah



Joined: 11 Mar 2010
Posts: 19539

View user's profile Send private message

PostPosted: Fri Feb 21, 2014 9:21 am     Reply with quote

Because INT_USB is being used all the time by the driver.....

Key to remember is that USB, does not involve just the characters you send arriving.
If you look at the USB driver, it provides the ability to do what you want.

pic18_usb.c

#INT_USB is the main interrupt handler.

You will see that it has to handle USB errors, attached/detached, stall, reset, idle, start of frame etc. etc.. If you want to handle the USB interrupt, your handler has to handle all of these....

However the key is the define 'USB_CDC_ISR'.

If you declare a function with this name, the compiler automatically adds the code to call _this_ when data is available.

So:
Code:

void USB_CDC_ISR(void);
//Then the USB includes after this is prototyped
#include <usb_cdc.h>
void USB_CDC_ISR(void)
{
    //do what you want here when data arrives - use the usb_getc
    //function to get the data etc.
}


Your USB_CDC_ISR function will then be _added_ to the INT_USB function, and will only be called when data is available.
It needs to be prototyped before the USB code is loaded, but only defined afterwards (otherwise it can't call things like usb_cdc_getc....)

Best Wishes
rikotech8



Joined: 10 Dec 2011
Posts: 376
Location: Sofiq,Bulgariq

View user's profile Send private message

PostPosted: Sat Feb 22, 2014 6:21 am     Reply with quote

First, Thank you again, now it works! The information you pointed me is available in usb_cdc.h
Quote:

//// USB_CDC_ISR()can be defined if you want a specific routine to ////
//// be called when there is incoming CDC (virtual com port) data. ////
//// This is useful if you want to update legacy RS232 code that ////
//// was using #int_rda to handle incoming data in the RS232 ISR.

BTW, in pic18_usb.h I found something new for me. It is
Code:
     #if defined(USB_CDC_ISR)
USB_CDC_ISR is the interrupt handler function, right?
I wasn't able to see #if defined(my_func) explanation in CCS Manual. I also made a google search for #if defined and the result was this:
Quote:
#ifdef MACRO.

defined is useful when you wish to test more than one macro for existence at once. For example,

#if defined (__vax__) || defined (__ns16000__)

So, if
Code:
#if defined
can be used only for macros, then what I saw(#if defined(USB_CDC_ISR)) in pic18_usb.h is not interrupt handler verification, but macros verification. Let me make the question simpler. Is it legal in C to check if my_func exist this way:
Code:
#if defined(my_func)
?
I know it is C programming issue, but after long search I wasn't able to see the relation to my code.
_________________
A person who never made a mistake never tried anything new.
Ttelmah



Joined: 11 Mar 2010
Posts: 19539

View user's profile Send private message

PostPosted: Sat Feb 22, 2014 7:52 am     Reply with quote

Actually well done, on spotting this.... Smile

The 'defined' test, will test for a 'label' being defined, as well as a #define. So provided the function is prototyped before you load the usb_cdc driver, the #if returns true. I agree it 'disagrees' with the manual, so I tried it (always the safest thing), and proved that #if defined, does return true if a function with the name exists.

Best Wishes
rikotech8



Joined: 10 Dec 2011
Posts: 376
Location: Sofiq,Bulgariq

View user's profile Send private message

PostPosted: Sat Feb 22, 2014 1:59 pm     Reply with quote

It is very useful and applicable operation. It should has been described into the "manual". Anyway, you did clarify "the picture" for me. I am very grateful!
_________________
A person who never made a mistake never tried anything new.
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