usb_interrupt_proc()

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

984sami

Alıntı yapılan: t2 - 21 Şubat 2014, 23:39:10
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.

Aygıt suspend pozisyonuna geçtiğinde, yani 0,5 mili amper güç tüketmek zorundayken kodu nasıl işleteceksiniz ? mikroc hiç kullanmadım ama eğer durum böyleyse biran önce mikroc yi rafa kaldırın.

18F serisinde tüm işlemler SIE tarafından halledilir ve ilgili bayrak çekilir; Örneğin host reset talebinde bulunduysa URSTIF, bir işlem tamamlandıysa TRNIF, veri yolunda idle oluştuysa (suspend için) IDLEIF ve hareketlilik başladıysa (resume için) ACTVIF, çerçeve başlangıcında SOFIF vs. vs. bitleri set edilir. İletişimle ilgili ve daha fazla kural USB-IF tarafından konmuştur.

Eğer kullandığınız dil bu kesmeleri kullanamıyorsa hiç bir işe yaramaz. Eğer böyleyse bu durum; PortB 0. girişteki INT0 kesmesini kurup, uykuda beklemek yerine PortB.0 da değişiklik varmı diye sürekli kontrol etmeye benziyor.

Alıntı yapılan: robomaster - 22 Şubat 2014, 00:26:59
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

Bunun için aygıt tarafında bir uçnoktayı IN yönünde kesme tipi transfer için tanımlamalısınız. PC donanımı; aygıtınız tarafından bildirilen ve 1-255ms aralığında ayarlanabilen bir zaman aralığında otomatik olarak iletişimi başlatır ve veriyi alır (kesme tipi transferde aygıt tarafında TRNIF, ve PKTDIS vb. bitler kurulur) ve PC belleğinde ayrılmış (genelde 100 dataset gibi) alana yazar.

LukeSkywalker

device, hid, host kavramları ile ilgili sorduğunuz soru çok basit bir araştırma sonucunda anlaşılabilecek kavramlar. Bunu belirtmiştim google kısmında. Mesela:http://en.wikipedia.org/wiki/USB
bu link'in device kısmında bulabilirsiniz aradığınız bilgileri.
2-3 ms'yi bulması biraz zor. USB 2.0'ın hızı 480 Mbit/s. Yani her milisaniyede yaklaşık 600 byte veri gönderip alabilir.
Her 100us denmesinin sebebi verinin 100 us'lik süreç içerisinde gelmesi sonrasında kaybolmasının önüne geçmek.

Ramiz

#17
Herhangi bir timer kurup, orada bu fonksiyonu cagirin. oncelikle 100 usn ye kurun. Sonra bunu 200-300-500-1000 diye arttirin. Nereye kadar sikintisiz calisabilecegini simdi bende merak ettim dogrusu.
Electrical & Electronics Engineering -> Step one

robomaster

@984sami

Kafa oldu allak bullak. suspend moda niye geçsin yahu? geçmesin

10ms de bir 64 byte göndericem altı üstü en fazla.  süre uzayınca mı bağlantı mı kesiliyor.
Bir de usb ye derinlemesine dalarsam iyice boğulacam yahu!!!!

t2

#19
Alıntı yapılan: 984sami - 22 Şubat 2014, 00:48:00
Eğer kullandığınız dil bu kesmeleri kullanamıyorsa hiç bir işe yaramaz. Eğer böyleyse bu durum; PortB 0. girişteki INT0 kesmesini kurup, uykuda beklemek yerine PortB.0 da değişiklik varmı diye sürekli kontrol etmeye benziyor.
USB Kesmeleri kullanırsın. bu durumda sadece USB portunu mutlu etmekle uğraşırsın. Halbuki polling sayesinde işin bittiğinde, müsait olduğunda kesme kullanmadan usb işleri halledilmiş oluyor.  interrupt kullanmak isterseniz sizi tutan yok. Ana  döngü içinde hiç bir şey olmaz. usb interruptla, diğer işlerin hepsi interruptla olur.  interruptlar  hangisi daha önemliydi..  gibi konular gündeme gelir. yani yapılacak aygıt başka iş yapmayacak USBye bağlı kalsın yeter diyorsanız interrupt kullanılır.  Yok düğmeye basınca ledi yaksın diyorsanız yine kullanılır. 1 düğmeye değil 5 düğmeye baksın 5 ledi yaksın derseniz yine USB interrupt kullanılır. hiç de sorun olmaz. 

ne zaman sorun olur? kritik zaman içinde tamamlanması gereken iş var. bu sırada interrupt oluşmaması gerek. iş aksamasın.  BU iş nasıl bir işse sadece yazılımla oluyor. interruptla yapılabileek iş değil.  işte ozaman usb interrupt kullanılmaz ki işimiz, kritik zaman içinde tamamlanabilsin. ( yada beceremedik diyelim )

984sami, burada usb interrupttan kasıt usb polling işlerinin interrupt ile yapılmasıdır. Yani geldi gitti error bilmemne flagı bunlarla biz uğraşmıyoruz. gonderme komutu  onu zaten yapıyor( olsa gerek) polling fonksiyonu ise usb kopmasın bağlantı canlı kalsın diye.

Ramiz

İki sene once usb hid li bir projede calisirken, usb interrupt, mcu nun calisma performansindan cok caliyordu.. Su yukarida bahsi gecen fonksiyonu yeni ogrendim.. yarin vakit ve donanim bulabilirsem bende denemeler yapacagim. Su bahsi gecen fonksiyonda mcu kac cycle vakit kabediyor?
Electrical & Electronics Engineering -> Step one

robomaster

#21
tek başına sorun yok. başka kesmelerle ve özellikle işini bitirmden oluşan kesmelerde sorun.
bu sefer polling mantıklı çözüm onda da 100us de bir diyolar ki microc de öyle diyor:)
buda saçmalığın daniskası.

benim değerlerim başka kesmeler kullanıp 10ms de hesaplanıyorsa neyi göndericem 100us de bir .

mesaj birleştirme:: 22 Şubat 2014, 01:20:29

Alıntı yapılan: Ramiz - 22 Şubat 2014, 01:15:58
İki sene once usb hid li bir projede calisirken, usb interrupt, mcu nun calisma performansindan cok caliyordu.. Su yukarida bahsi gecen fonksiyonu yeni ogrendim.. yarin vakit ve donanim bulabilirsem bende denemeler yapacagim. Su bahsi gecen fonksiyonda mcu kac cycle vakit kabediyor?

Sonuçları paslaşalım.

Ramiz

Eski degerleri gondereceksin robomaster. 100 kerede bir, degerleri yenileyeceksin. Onunde donanimin varsa vede uykun yoksa, su sordugum sorulari test edebilirmisin?

Tekrar yaziyorum:
-100 usn yi arttirmayi dene. Mili saniye mertebelerine sorunsuz ulasabilecekmi bak.
-Birde su fonksiyonda mcu ne kadar vakit kaybediyor. Ona bak.
Electrical & Electronics Engineering -> Step one

robomaster

#23
Ancak yarın deneme imkanım olabilir.

Aklıma şu geliyor. Bir timer ile 100 usb bir boş değerler göndermek. (düzeltme : polling ile değer göderilmiyor)

10ms de bir asıl değerler

t2

100uS diyen arkadaş yanlış biliyor alakası yok. 900uS ye ye kadar ben denedim sorun olmuyor. yani 900uS de poling göndersen de olur. 1.1 msde göndersen de olur. ama 2 olmuyor galiba. belki de 2 kritik sınırdır. 2yi geçmemek gerekebilir.

984sami

Alıntı yapılan: robomaster - 22 Şubat 2014, 00:57:51
@984sami

Kafa oldu allak bullak. suspend moda niye geçsin yahu? geçmesin

10ms de bir 64 byte göndericem altı üstü en fazla.  süre uzayınca mı bağlantı mı kesiliyor.
Bir de usb ye derinlemesine dalarsam iyice boğulacam yahu!!!!

USB aygıtları için hattın 3ms boş kalması durumunda suspend pozisyonuna geçmeleri bir kuraldır. Aygıt maksimum 500uA akım çekmek zorundayken mcu nasıl kod işletecek ?

www.usb.org

7.1.7.6 Suspending
All devices must support the Suspend state. Devices can go into the Suspend state from any powered state.
They begin the transition to the Suspend state after they see a constant Idle state on their upstream facing bus
lines for more than 3.0 ms. The device must actually be suspended, drawing only suspend current from the bus
after no more than 10 ms of bus inactivity on all its ports.


7.2.3 Power Control During Suspend/Resume
Suspend current is a function of unit load allocation. All USB devices initially default to low-power. Lowpower
devices or high-power devices operating at low-power are limited to 500 μA of suspend current. If the
device is configured for high-power and enabled as a remote wakeup source, it may draw up to 2.5 mA during
suspend.
When computing suspend current, the current from VBUS through the bus pull-up and pull-down
resistors must be included.



LukeSkywalker

#26
Burada usb polling protocolü çağırınca gönderim yapılmıyorki.
Siz onu 100 us'de bir çağırın fakat göndermeyi isterseniz 5 saniye sonunda yapın.
Bir de @t2 ben illa 100us olacak demedim. MikroC 100us tercih edilir demiş.  Kütüphanelerin help dosyalarını açıp bakarsanız orada bulursunuz bu bilgiyi. Ben 100ms'de de denedim sıkıntı çıkarmadı.  Fakat bu sıkıntı çıkmayacağı anamına gelmez. Özellikle de PC'den veri beklerken..

robomaster

#27
@984sami

Arkadaş cihaz usb den beslenmiyor ki

mesaj birleştirme:: 22 Şubat 2014, 15:25:04

Alıntı yapılan: LukeSkywalker - 22 Şubat 2014, 01:22:57
Burada usb polling protocolü çağırınca gönderim yapılmıyorki.
Siz onu 100 us'de bir çağırın fakat göndermeyi isterseniz 5 saniye sonunda yapın.

Madem gitmiyor neden çağırıyoruz. :) Çok özür dilerim yam komedi bu usb işi. polling göndermiyorsa polling gönderen ne o zaman.

LukeSkywalker

Hid_Write ile veri gönderiyorsunuz polling ile değil.

984sami

#29
Alıntı yapılan: Ramiz - 22 Şubat 2014, 01:15:58
usb interrupt, mcu nun calisma performansindan cok caliyordu

Allahını seversen şu "iki sene once usb hid li projenin" hex kodunu paylaşta bir bakalım "mcu nun calisma performansindan" çalmak ne demek ? Bu ne saçmalıktır, "calisma performansi" nedir ? Bu cümleniz fare ile oynadıkça PC nin çalışma performansı düşüyor demek kadar saçma !

mesaj birleştirme:: 22 Şubat 2014, 01:32:19

Alıntı yapılan: robomaster - 22 Şubat 2014, 01:23:41
Arkadaş cihaz usb den beslenmiyor ki

O zaman şu anlaşılıyor; MicroC ile kendi güç kaynağı olmayan bir USB aygıtı tasarlanamaz ! Yani yazılım donanımı kullanmaya imkan vermiyor.