Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

usb_interrupt_proc()

Başlatan robomaster, 21 Şubat 2014, 23:14:54

robomaster

Arkadaşlar Usb hid uyulamalarında bu ifade interrupt rutini içinde tek kullanılıyor.
Başka bir interrupt mesela int0 gibi interrupt rutini altında kullanmaya çaıştığınızda usb işlevleride bozuluyor.
Aynı anda bir çok timer ve dahili ve harici interrupt kullanabilmeme rağmen usb işin içine girdimi flaglar ile bu iş çözülmüyor. Ya usb cihaz algılanmıyor ya da algılansada usb üzerinden veri gitmiyor.

Neyi gözden kaçırıyoruz sizce???

t2

Sorunu aşmak için usbinterrup kullanılmaz, bunun yerine USB ile ilgili  fonksiyon  uygun zamanlarda çağırılır. Çağırma aralığı  1-2ms den daha uzun olmamalıdır. Bazen 1 olur bazen 0.5ms Olur bu sorun değil. Bu sayede diğer işler aksamamış olur.

robomaster


@t2

ubs polling mi fiyorsunuz anlamadım

t2

#3
evet o. uygun gördüğün zaman çağırılır. Döngü içine, kodların arasına eklenir.
Bol bol ekleyin. fazlasının zararı olmaz.  tabi işler çok kritik zamanlı ise bunun harcadığı zaman sorun olabilir.
1 dakikada 32 bayt gönderiyorsanız  1000 kere çağırsanız zararı  olmaz. polling bazı register ları güncelliyor. gerekli değilse bir şey yapmıyor diye duymuştum. Mesela bilgisayar orda mısın? diye soruyor. bunşların cevaplarının hazır olmasını sağlıyor.

robomaster

her iki metodun farkı nedir tam olarak?

t2

polling istediğin zaman çağırılır. diğeri interrupttur. sen istemesen de periyodik olarak tetiklenir diğer işlerin bölünür. Aslında interrupt içinde yapılan iş pollingile aynıdır. periyodik olması için timer kullanılmış oluyor

robomaster

arama yaptırdım ama polling kullanımı örneği var mı? bulamadım

LukeSkywalker

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);
    }
  }
}

robomaster

#8
@LukeSkywalker
İyi oldu bu anladım konuyu.

Usb olayı acayip derin bir mevzu imiş. aslında hid olayı bile hazır kütüphane olmasa baya kasacak.
hid haricinde printer gibi cihazlar hangi aranirimi kullanıyor ? MicroC nin bu konuda bir kütüphaneside yok galiba

mesaj birleştirme:: 22 Şubat 2014, 00:14:37

Alıntı yapılan: t2 - 21 Şubat 2014, 23:25:42
Sorunu aşmak için usbinterrup kullanılmaz, bunun yerine USB ile ilgili  fonksiyon  uygun zamanlarda çağırılır. Çağırma aralığı  1-2ms den daha uzun olmamalıdır. Bazen 1 olur bazen 0.5ms Olur bu sorun değil. Bu sayede diğer işler aksamamış olur.

1-2 ms den uzun olsa ne olur ?

LukeSkywalker

#9
Printer gibi cihazlar için driver gerekiyor. Bu driverlar sayesinde haberleştirilebiliyorlar.  MikroC'nin bu konuda bir kütüphanesinin olması zor. Çünkü driverlar cihazlara özeldir, herkesin kendi driverını kendi yazması lazım. Fakat USB host ve device için mikroC'nin kütüphaneleri var. 
http://www.mikroe.com/news/view/565/new-usb-host-library-released/
http://www.mikroe.com/news/view/583/usb-device-library-for-pic-released/

Ayrıca MikroC'nin kütüphane açıklamalarında her 100 us'de bir çağırılmasının tercih edildiği yazılmış. 1-2 ms'de bir çağırılırsa veri kayıpları yaşanabilir.

robomaster

Usb host ve device HID den ne farkı var?
Veri iletişimi açısından nasıl bi rtercih yapılmalı?

LukeSkywalker

Bu bilgileri googledan elde etmek daha kolay sanırım...

robomaster

iyide her 100us de bir münümkün değil 10ms de bir PID döngüsündeki verileri pc de görüntülemek istiyorum

LukeSkywalker

Tamam görüntüle.
Kodun belli kısımlarında alt alta polling protokolünü çağırabilirsin sonuçta.

robomaster

#14
Alıntı yapılan: LukeSkywalker - 22 Şubat 2014, 00:26:26
Bu bilgileri googledan elde etmek daha kolay sanırım...

Her zaman değil

mesaj birleştirme:: 22 Şubat 2014, 00:34:23

Alıntı yapılan: LukeSkywalker - 22 Şubat 2014, 00:29:40
Tamam görüntüle.
Kodun belli kısımlarında alt alta polling protokolünü çağırabilirsin sonuçta.

O zaman sür hesabı baya bir karışır. ayrıca nasıl 100us o da saçma geldi. Bazı arkadaşlar zaten 64 byte veri aktarımı 2 3 ms sürüyor demiş. ?