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

Interrupt not firing on DATA Receive(INT_RDA,USB HID DEMO)

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



Joined: 24 Jul 2009
Posts: 21

View user's profile Send private message

Interrupt not firing on DATA Receive(INT_RDA,USB HID DEMO)
PostPosted: Sat Aug 22, 2009 12:35 am     Reply with quote

Code:
#include<18F2550.h>            //Microchip PIC18F2550 hardware layer
#define __USB_PIC_PERIF__ 1    //Only for PIC18f4550
#define LEDR PIN_B4            //Red LED is connected to Pin No:25             
#define LEDG PIN_B5            //Green LED is connected to Pin No:26
#define BUTTON PIN_C0          //A Button is connected to Pin No:11

#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#build(reset=0x1, interrupt=0x8)          // Necessary for Bootloader
//#ORG 0x0F00,0x0FFF {}                   // Necessary for Bootloader
#use rs232(stream=PC, baud=9600, xmit=PIN_C6, rcv=PIN_C7)

//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    8                      //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    8    //allocate 8 bytes in the hardware for reception   
 
// CCS USB Libraries
#include <pic18_usb.h>          //Microchip 18Fxx5x hardware layer for usb.c
#include <usb_desc_hid.h>       //USB Configuration and Device descriptors for this UBS device
#include <usb.c>                //handles usb setup tokens and get descriptor reports
//#include <usb_cdc.h>
#include <usb.h>
//#include <usbn960x.c>


#define LED_ON output_high      //output_high SETS GIVEN PIN TO HIGH
#define LED_OFF output_low      //output_low SETS GIVEN PIN TO LOW
#define DELAY 1000
int8 out_data[2]={1,2};   
int8 in_data[2]; 

//#PRIORITY RDA

#INT_RDA  //interrupt fires when receive data available
void serial_isr()
{      
      LED_ON(LEDG);
      if(usb_kbhit(1)){
         usb_get_packet(1,in_data,2);
         out_data[0]=in_data[0];
         out_data[1]=in_data[1];
              if (usb_put_packet(1, out_data, 2, USB_DTS_TOGGLE)){return;}
      }
   return;
}


void main() {
//  int8 out_data[2];   
//  int8 in_data[2];   
//  output_c(0x04);
//    set_tris_c(0x00);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   usb_init();
    usb_task();                  //Will call usb_attach().To attach USB Device to the bus.
    usb_wait_for_enumeration();
   if(usb_enumerated()){       //Checks if device Enumeration Successful or Not
      LED_ON(LEDR);
      delay_ms(DELAY);
      LED_OFF(LEDR);
        }
   else
      LED_OFF(LEDR);

  #if defined(AN0)                  //Enabling Port for Communication
   setup_adc_ports(AN0);
  #elif defined(AN0_AN1_AN3)
   setup_adc_ports(AN0_AN1_AN3);
  #else
   #error CONFIGURE ADC PORTS SO WE CAN READ CHANNEL 0
  #endif
  setup_adc(ADC_CLOCK_INTERNAL);
  set_adc_channel(0);
 
    
   while(TRUE) 
      {
      LED_ON(LEDR);
      delay_ms(100);
      LED_OFF(LEDR); 
      delay_ms(100);
      LED_OFF(LEDG);
      
      }
}

Please help. This is my code.
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sat Aug 22, 2009 12:42 am     Reply with quote

#int_rda is the UART receive interrupt. You must use getc() or fgetc()
to get the character from the UART in that interrupt routine.
ibsumith



Joined: 24 Jul 2009
Posts: 21

View user's profile Send private message

PostPosted: Sat Aug 22, 2009 1:07 am     Reply with quote

thank you for your reply....But i am not getting Interrupt....
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sat Aug 22, 2009 1:19 am     Reply with quote

Are you sending characters to the UART in the PIC, over a RS-232 cable ?
Do you have a MAX232-type chip connected to pins C6 and C7 of your PIC ?
What device is sending the characters to the PIC's UART ? Is it a terminal
program on a PC ?

Just make a small program that only tests the PIC's ability to receive
characters in its UART, using the #int_rda interrupt.

Example of simple program to test the operation of #int_rda:
http://www.ccsinfo.com/forum/viewtopic.php?t=27156&start=1
ibsumith



Joined: 24 Jul 2009
Posts: 21

View user's profile Send private message

PostPosted: Sat Aug 22, 2009 1:31 am     Reply with quote

I am trying to communicate through PC program....It is working well when I am using polling....i am connecting to PC using USB cable....C6 and C7 are not externally connected to anything....But when I am Using TBE interrupt is generating...I am using PIC2550....
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sat Aug 22, 2009 1:37 am     Reply with quote

I can't help any more.
sumith
Guest







PostPosted: Sat Aug 22, 2009 3:20 am     Reply with quote

thank you..........IS there any alternate way ......... to get an interrupt when a data is receive in Endpoint1
bela



Joined: 31 Aug 2008
Posts: 27
Location: Bedford, BEDS UK

View user's profile Send private message Visit poster's website

PostPosted: Sun Aug 23, 2009 3:08 am     Reply with quote

The usb.c driver uses the USB interrupt (#INT_USB) and it pulls in the data so you shouldn't need to use an interrupt. Simply use usb_kbhit(x) to check if there's data ready.
ibsumith



Joined: 24 Jul 2009
Posts: 21

View user's profile Send private message

PostPosted: Sun Aug 23, 2009 10:49 pm     Reply with quote

thank u
But where should i check it...Inside while loop.???there is no #int_usb in usb.c...It is in pic18_usb.h
broque



Joined: 03 Apr 2012
Posts: 2

View user's profile Send private message

PostPosted: Sun Apr 15, 2012 11:50 pm     Reply with quote

Using delay function disables the interrupts. Try not to use delay, you can create a for statement for it.
Ttelmah



Joined: 11 Mar 2010
Posts: 19328

View user's profile Send private message

PostPosted: Mon Apr 16, 2012 2:38 am     Reply with quote

Take a step back, and a deep breath.
Each interrupt in the system responds to a specific _hardware_ event.

INT_RDA, responds to a character being received by the hardware UART, _not_ anything to do with USB.

INT_USB, responds to all the USB stuff, but this doesn't imply a character has been send/received. For instance you will get USB interrupts for enumeration, and commands like 'set line coding', etc. etc..

The whole 'point' of the USB code, is it handles all this for you - automatically sorting out the transfers that contain/expect data, and sending/receiving these for you, allowing you to do other things, and just look whenever you want and see if anything is pending. If you want to respond to the USB interrupt, then you have several thousands of lines of code that need to be written....
Now, to emulate a serial port, you should really be using the USB CDC driver, not fiddling around.
Some comments apply:
For instance, you have the line:
Code:

#define USB_HID_DEVICE  TRUE              //Previously it was "DEFINE"

It only needs to be defined. the code does not care _what_ it is defined 'as'.
You seem to be trying to fiddle with things, without reading the documentation (the USB code has 90% of it's documentation _in_ the include files - read the headers of these).

However much simpler to just keep to CDC.
So, you could do a basic 'respond to a character received on the CDC device' routine, with:
Code:

#include<18F2550.h>           
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#build(reset=0x1, interrupt=0x8)          // Necessary for Bootloader

//Get into the _habit_ of putting all the system configuration _first_.
//Though it doesn't matter for basic 'defines', it does for some stuff
//and it'll 'catch' you one day.
#define __USB_PIC_PERIF__ 1    //Only for PIC18f4550
#define LEDR PIN_B4            //Red LED is connected to Pin No:25             
#define LEDG PIN_B5            //Green LED is connected to Pin No:26
#define BUTTON PIN_C0          //A Button is connected to Pin No:11

//Do you have a USB connection sense pin?. Use it if so.
#define USB_CON_SENSE_PIN PIN_B2 //remove otherwise

#include <stdlib.h>
#define __USB_PIC_PERIF__ 1
#include <usb_cdc.h>
//All that is needed to load the entire CDC driver....

int8 tick=0;
#INT_TIMER2
void tick_interrupt(void) {
   if (tick) --tick;
}
//Simple system clock called every 1/200th second

void main() {
    int16 temp_adc;
    int8 temp_ch;
    //The USB code enables it's interrupts automatically
    usb_init();
    setup_timer_2(T2_DIV_BY_16,249,15);
    enable_interrupts(INT_TIMER2); //system 'clock'
    setup_adc_ports(AN0);
    //Read the data sheet - is 'INTERNAL' a legal/recommended clock rate.....
    setup_adc(ADC_CLOCK_DIV_64);
    //
    set_adc_channel(0);
    delay_us(10);
   
    do {
      usb_init(); //change to init_cs if you have a sense pin
      if (usb_enumerated()) {
         if (usb_cdc_kbhit()) {
            //Here a character has been received on the USB
            temp_ch=usb_cdc_getc();
            switch (temp_ch) {
            case 'A':
            case 'a':
                //If I see an 'A' or 'a' respond with the analog voltage
                temp_adc=read_adc();
                printf(usb_cdc_putc,"Voltage :- %5.3f\n\r",temp_adc*0.0048828125*
                break;
            case 'T':
            case 't':
                //If I see 'T' or 't' 'toggle' the greed LED
                output_toggle(LEDG);
                break;
            } //Ignore every other character
         }
      }
      if (tick==0) {
         output_toggle(LEDR);
         tick=199; //Toggle the red LED every second
      }
   }
}


Now, 'no guarantees', have just typed this in as a demo, so could easily have a typing error or two, but this should wake up the USB (use the connection sense setting if you have it), thne sit waiting and flashing the green LED every second, then if you press 'T', toggle the green LED, or if you press 'A' read the analog voltage.
The point is you just ask the USB driver 'has anything arrived' (for the CDC 'kbhit'), at regular intervals. The driver has done all the donkey work of actually transferring the data, and storing it.

Best Wishes
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