mikroc usb hid library

Başlatan Karamel, 23 Ağustos 2015, 06:08:17

Karamel

merhaba. ethernet ile parallel olarak usb hid deneylerime basladim. bildigimiz uzere mikroelektronika first application olarak hid codelarini gosteriyor. 10 satir code ile usb iletisimi kurulabiliyor. hemen bu codelarimiza bakalim.

char cnt;
char kk;
char readbuff[64];
char writebuff[64];

unsigned long int i = 0;
void main(void){
  HID_Enable(&readbuff,&writebuff);

  while(1){
    USB_Polling_Proc();               // Call this routine periodically
    kk = HID_Read();
    if(kk != 0){
      for(cnt=0;cnt<64;cnt++)
        writebuff[cnt]=readbuff[cnt];
      HID_Write(&writebuff,64);
    }
  }
}



eger oscillator setting ini duzgun bir sekilde ayarladiysak. code lar hemencicik calisiyor.

simdi usb benim suan icin anlayamayacagim kadar karmasik bir unit. tamam ama en azindan birazcicikta olsa. system nasil calisiyor anlayabilirim. bu function USB_Polling_Proc(); icersinde neler yapiliyor?



ben gerekli deneyleri yaptim. while icersine led blink code u yerlestirip. logic analyzerim ile testleri yaptim. 4.5usn icersinde bir loop oluyor. yani bu function yaklasik 4usn de isleniyor.(microcontroller is running at 72mhz)

daha sonra help file dan edindigim bilgilerle. bu functionin 100 usn de bir cagirilmasi oneriliyor. ben bunun icinde deneyleri yaptim. 200 usn den sonra pc hid devide i taniyamiyor. deneyleri 100-200-300 seklinde 100 un katlari seklinde yaptim. belki 220 de belkide 290 da bozuluyordur bilemiyorum. ama 100usn oneriliyor.

bende hemen tim2 yu 100 usn ye ayarlayip. bu function i tim2 interrupt function icersine yerlestirdim. main ede 1 sn arayla yanip sonen led blink codelari yerlestirdim. hem pc iletisimi kuruluyor. hemde main islemleri hallediliyor.

simdi. tim2 ile yaptigim bu sey bana hicte mantikli gelmedi. pc den birsey gondermezken. tim2 icersinde yaklasik 5usn vakit kaybediliyor. geriye 95usn kaliyor. main saniyede yaklasik 10000 kere interrupt ediliyor? bu nederece mantikli?

usb nin tipki usart gibi. sadece iletisim varken interrupt oldugu. diger zamanlarda main i kesmedigi bir durum yokmu? cunku microcontrollerin usb hardware unit i var. biz neden surekli bir function ile hasir nesir olmak zorunda kaliyoruz?  :-\


LukeSkywalker

Hid interrupt ile kullanirsin olur biter.

Karamel

#2
hocam. herhalde compiler yeninlenince syntax lar degismis olmali ki. interrupt assistant ta hid ile ilgili bir secenek yok.

bu arada sorunda birazda benim microcontroller da. mikroc ile ugrasan herkes. bilindik microcontrollerlar ile calismislar simdiye kadar. bazi seyleri benim microcontroller ile yaparken. example lara bakip faydalanamiyorum.

mesela surada https://www.mikroe.com/forum/viewtopic.php?f=178&t=50721 bu konuyu soran kisi. cozumunude bulmus ama compiler bu cozume olmaz diyor  :-\

mesaj birleştirme:: 23 Ağustos 2015, 11:05:12

hocam asagidaki sekil calistiramadim.

void USB_Interruptimiz() iv IVT_INT_OTG_FS_WKUP ics ICS_AUTO {
    USB_Polling_Proc();
       kk = HID_Read();
       if(kk != 0){
         for(cnt=0;cnt<64;cnt++)
            writebuff[cnt]=readbuff[cnt];
          HID_Write(&writebuff,64);
       }
}


void main(void){

    GPIO_Digital_Output(&GPIOB_BASE, _GPIO_PINMASK_8);

    HID_Enable(&readbuff,&writebuff);
    
    NVIC_IntEnable(IVT_INT_OTG_FS_WKUP);

    while(1)
    {
      Heart_Led = ~Heart_Led; Delay_ms(1000);
    }
}


mesaj birleştirme:: 23 Ağustos 2015, 11:26:04

hocam sizin buradaki http://www.mikroe.com/forum/viewtopic.php?f=178&t=53332&view=previous code lara yazdiginiz aciklamalardan faydalanarakta deneyler yaptim :) hic biri tutmadi.

bu arada sizin orada IVT_INT_OTG_FS seklinde tanimlanmis benim microcontroller da boyle birsey yok. sadece IVT_INT_OTG_FS_WKUP secenegi var ve baska birseyide kabul etmiyor.

LukeSkywalker

IVT_INT_USB_LP_CAN_RX0


Bunu kullan

Karamel

Hocam compiler bunu kabil etmiyor?  :-\

LukeSkywalker

sen hangi işlemciyi kullanıyordun?

Karamel


LukeSkywalker

void USB_Interruptimiz() iv 36 ics ICS_AUTO


Şöyle yapıp deneyip hemen cevap yazar mısın?

Karamel

#8
Hocam misafirler geldi yine :-\ anca birkac saat sonra deney yapabilecegim...

mesaj birleştirme:: 23 Ağustos 2015, 23:41:47

hocam deneyleri yaptim. asagidaki gibi yapinca calisti ama bir gonderimden sonra microcontroller hep interrupt function icersinde cakilip kaliyor. sanirim usb interrupt flag ini silmemiz gerekli?

birde hocam biz tam olarak ne yaptik simdi?  :-\

void USB_Interruptimiz() iv 36 ics ICS_AUTO {
    USB_Interrupt_Proc();//USB_Polling_Proc();
       kk = HID_Read();
       if(kk != 0){
         for(cnt=0;cnt<64;cnt++)
            writebuff[cnt]=readbuff[cnt];
          HID_Write(&writebuff,64);
       }
}


void main(void){

    GPIO_Digital_Output(&GPIOB_BASE, _GPIO_PINMASK_8);

    HID_Enable(&readbuff,&writebuff);
    
    NVIC_IntEnable(36);

    while(1)
    {
      Heart_Led = ~Heart_Led; Delay_ms(1000);
    }
}



Karamel

#9
hocam interrupt icersinde read yapmayinca calisti.

simdi calismasi benim icin pek bir anlam ifade etmiyor. neden calismadigini ve aslinda nasil calistigini ogrenmek istiyorum ::)

neden interrupt icersinde read yapinca interrupt function icersinden cikamadi? eger usb den bir bilgi gelse bunu gelir gelmez okumak istemezmiyiz?

birde bu satir ile biz ne yaptik? iv 36 ics ICS_AUTO nvic interrupt registerinda bu rakam baska interruptlara denk geliyor?  :-\

LukeSkywalker

Usbdesc dosyasinda gerekli düzenlemeyi yapıtın mı interrupt icin?

Karamel

yaptim hocam. bu sekil const char USB_INTERRUPT = 1; degistirdim. zaten boyle yapmayinca usb nin interrupt ile mi yoksa normal mi calismasi gerektigini library algilayamaz.

suan istedigimiz gibi calismakta. main icersinde usb buffer i read yapinca oluyor. bunu bir timer icersine yerlestirip. timer i istedigimiz frequance a ayarlayip. yine read yapabiliyoruz ama usb function icersinde bu islemi yapamiyoruz.

birde hocam usb buffer i read eden code parcalari 1.25usn gibi mini minnacik bir zaman diliminde process edilebiliyor. yani interrupt function icersinde bu islemi yapmak cokta sakincali olmamali?

LukeSkywalker

Bunu yapabilmek için usb registerlarına biraz göz atmak lazım.