18f4550 USB ve Kesme Sorunu

Katılım
5 Haz 2009
Mesajlar
3
Puanları
1
Yaş
39
Merhaba arkadaşlar,

aşağıda vermiş olduğum kodlarda şöyle bir sıkıntı yaşıyorum, usb taktığım zaman programım bazen tanıyor bazen tanımıyor, ama #int_ext , #int_ext1 ve #int_timer2 kesme kod bloklarını kaldırdığım zaman sorunsuz çalışıyor,sizce nedendir?

Kod:
#include <18F4550.h>#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,PBADEN
#use delay(clock=20000000) // siempre ponemos (48000000)




// CCS Library dynamic defines
#DEFINE USB_HID_DEVICE  TRUE //Tells the CCS PIC USB firmware to include HID handling code.
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE    8  //Numero de byte de envio (maximo 64 bytes)
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_RX_SIZE    8  //Numero de byte de Recepcion (maximo 64 bytes)
int8 in_data[USB_EP1_RX_SIZE];  //Declaramos la variable de entrada y su tamañano de n bytes
int8 out_data[USB_EP1_TX_SIZE]; //Declaramos la variable de salida y su tamañano de 8 bytes


// CCS USB Libraries
#include <pic18_usb.h>   //Microchip 18Fxx5x hardware layer for usb.c
#include <hid n-byte.h>   //USB Configuration and Device descriptors for this UBS device
#include <usb.c>        //handles usb setup tokens and get descriptor reports
#zero_ram
#separate
void Motor_1(int8,int8,int8,int8);
#separate
void Motor_2(int8,int8,int8,int8);

#use fast_io(b)//Kullandığımız portu tanımlıyoruz
#byte PORTA = 0xF80
#byte PORTB=0xF81
#byte PORTD=0xF83

#bit  MOTOR1PULSEPORT =PORTD.0
#bit  MOTOR1ENABLEPORT =PORTD.1
#bit  MOTOR1YONPORT =PORTD.2
#bit  MOTOR2PULSEPORT =PORTD.5
#bit  MOTOR2ENABLEPORT =PORTD.6
#bit  MOTOR2YONPORT =PORTD.7

struct MOTOR
{
#zero_ram
int1 Enable;
int1 Yon;
//int1 AdimTuru;
int32 AdimSayisi;
int32 TamKisim;
int32 KalanKisim;
int Timersayac;
int8 Hiz;
} Motor1,Motor2;

#int_ext       //Motor1 Encoder RB0 
void Motor1EncoderKesmesi() 
{ 
if(Motor1.AdimSayisi>0)
{
Motor1.AdimSayisi--;
out_data[0]=1;
out_data[1]=2;
usb_put_packet(1, out_data, USB_EP1_TX_SIZE, USB_DTS_TOGGLE) ;
}
else
{
out_data[0]=2;
}
} 

#int_ext1       //Motor2 Encoder  RB1 
void Motor2EncoderKesmesi() 
{ 
if(Motor2.AdimSayisi>0)
{
 Motor2.AdimSayisi--;
out_data[0]=2;
out_data[1]=1;
usb_put_packet(1, out_data, USB_EP1_TX_SIZE, USB_DTS_TOGGLE) ;
}
else
{
out_data[1]=2;
}
}

#INT_TIMER2
void rtcc_timer2(void) 
{
if(Motor1.AdimSayisi>0)
{
Motor1.Timersayac++;
  if(Motor1.Timersayac==Motor1.Hiz)
 {  MOTOR1PULSEPORT=1;    }
 
 if(Motor1.Timersayac==(Motor1.Hiz*2))
 { 
 
  MOTOR1PULSEPORT=0;
  Motor1.Timersayac=0;
 
 }


}
else
 {
   MOTOR1PULSEPORT=0;
   Motor1.Timersayac=0;
  //MOTOR1ENABLEPORT=0;
 }
 
 
 
 if(Motor2.AdimSayisi>0){


Motor2.Timersayac++;
  if(Motor2.Timersayac==Motor2.Hiz)
   {MOTOR2PULSEPORT=1;  }
 
 if(Motor2.Timersayac==(Motor2.Hiz*2))
 { 


  MOTOR2PULSEPORT=0;
  Motor2.Timersayac=0;
 }


}
else{
  MOTOR2PULSEPORT=0;
   Motor2.Timersayac=0;
  //MOTOR2ENABLEPORT=0;
 } 
}

void main() 
{ 
 set_tris_a(0);          //d portu çıkış
 set_tris_d(0);          //d portu çıkış
 setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);


//set_tris_b(0xF0);//B portunu kullanacağımızı belirledik.
//output_b(0x00);//B portunu komple çıkış yaptık.


   //ext_int_edge(H_TO_L);      // init interrupt triggering for button press 
   enable_interrupts(INT_EXT);
  enable_interrupts(INT_EXT1);
  
  setup_timer_2(T2_DIV_BY_16,62,16);
  enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL); 


/////////////////////////////////////////////
     usb_init(); // Usb hazırlanıyor
      usb_task(); 
  /////////////////////////////////////////////  ,
     PORTA=0;
   while(1)
   {


    while(usb_enumerated())
      {
        if (usb_kbhit(1))             //Eğer pc'den yeni bir paket geldiyse
         {  
          usb_get_packet(1, in_data, USB_EP1_RX_SIZE);//  //paketi oku a[0];
          
          if(in_data[0]==0x01)
          {
          Motor_1(in_data[1],in_data[2],in_data[3],in_data[4]);//veri-tam-kalan
          }
            if(in_data[0]==0x02)
          {
         Motor_2(in_data[1],in_data[2],in_data[3],in_data[4]);//veri-tam-kalan
          }
       
         
      
         }
      }
    
   }
}


void Motor_1(int8 Kontrol, int8 TamKisim, int8 KalanKisim,int8 Hiz)
{
         Motor1.Yon=bit_test(Kontrol,0);     //0000000x 0.biti okudu
         MOTOR1YONPORT=Motor1.Yon;
         Motor1.Enable=bit_test(Kontrol,1);     //000000x0 1.biti okudu
         MOTOR1ENABLEPORT=Motor1.Enable;
         
         Motor1.Hiz=Hiz+3;
         Motor1.TamKisim  =TamKisim;
         Motor1.KalanKisim=KalanKisim;
         
         Motor1.TamKisim  =TamKisim;
         Motor1.KalanKisim=KalanKisim;
         if (Motor1.TamKisim==0)  { Motor1.AdimSayisi=Motor1.KalanKisim;}
         else if (Motor1.TamKisim>=1) {Motor1.AdimSayisi=(255*Motor1.TamKisim)+Motor1.KalanKisim; }


}


void Motor_2(int8 Kontrol, int8 TamKisim, int8 KalanKisim,int8 Hiz)
{
         Motor2.Yon=bit_test(Kontrol,0);     //0000000x 0.biti okudu
         MOTOR2YONPORT=Motor2.Yon;
         Motor2.Enable=bit_test(Kontrol,1);     //000000x0 1.biti okudu
         MOTOR2ENABLEPORT=Motor2.Enable;
         
         Motor2.Hiz=Hiz+3;
         Motor2.TamKisim  =TamKisim;
         Motor2.KalanKisim=KalanKisim;
         
         Motor2.TamKisim  =TamKisim;
         Motor2.KalanKisim=KalanKisim;
         if (Motor2.TamKisim==0)  { Motor2.AdimSayisi=Motor2.KalanKisim;}
         else if (Motor2.TamKisim>=1) {Motor2.AdimSayisi=(255*Motor2.TamKisim)+Motor2.KalanKisim; }


}
 
önce usb enumerate olaylarını hallet ondan sonra interruptları enable yap. Sen interruptları aktifleştiriyorsun ama daha usb bağlantısı oluşturulmamış olabilir. En sona bırak enable_interrupt satırlarını öyle dene bakalım
 

Forum istatistikleri

Konular
128,198
Mesajlar
915,766
Kullanıcılar
449,979
Son üye
schule48

Yeni konular

Geri
Üst