18F45K50 ile usb hid uygulaması

Başlatan enteresan10, 03 Mayıs 2021, 20:40:46

enteresan10

#define LCD_RS    PIN_D0
#define LCD_E     PIN_D2
#define LCD_DB4   PIN_D4
#define LCD_DB5   PIN_D5
#define LCD_DB6   PIN_D6
#define LCD_DB7   PIN_D7
#define USB_CONFIG_HID_TX_SIZE 16                
#define USB_CONFIG_HID_RX_SIZE 16                
#define USB_CONFIG_PID 1                      
#define USB_CONFIG_VID 1234                   
#define USB_STRINGS_OVERWRITTEN
#include <18F45K50.h>                    
#use delay(internal=48MHz)               
#include <lcd1.c>
#define USB_STRING(x)  (sizeof(_unicode(x))+2), 3, _unicode(x)
rom char USB_STRING_DESC[]={4, 3, 9, 4,USB_STRING("CCS"),USB_STRING("USB HID"),USB_STRING("123456789")};
#include <usb_desc_hid.h>
#include<pic18_usb.h>
#include<usb.c>
char data[16];
void main()
{
  lcd_init();                                
  lcd_putc('\f');                                
  lcd_gotoxy(1, 1);
  lcd_putc("USBHID");
  usb_init_cs();                                 
  delay_ms(1000);
  while(TRUE)
  {
    usb_task();
    if(usb_enumerated())
    {                
      if(usb_kbhit(1))
      {                  
        lcd_gotoxy(1, 2);
        lcd_putc("                ");           
        usb_get_packet(1, data, 16);
        lcd_gotoxy(1, 2);
        printf(lcd_putc, data);                  
        delay_ms(1000);                     
        usb_put_packet(1, data, 16, USB_DTS_TOGGLE);
      }
    }
  }
}

Arkadaşlar 18F45K50 ile usb hid uygulaması yapmaya çalışıyorum. Uygulama çalışıyor fakat ara ara iletişim kopuyor. Üstatlar bu konuda yardımcı olursanız sevinirim. Teşekkürler...

esensoy

ilk gözüme çarpan;
delay_ms(1000);

1000ms boyunca beklerken pc usb den kontrol edip cevap alamıyorsa iletişimi kesiyordur.
En tehlikeli an "zafer" anıdır.

enteresan10

Alıntı yapılan: esensoy - 04 Mayıs 2021, 10:01:07ilk gözüme çarpan;
delay_ms(1000);

1000ms boyunca beklerken pc usb den kontrol edip cevap alamıyorsa iletişimi kesiyordur.

Hocam iletişimi kesmemesi için ne yapmamm lazım? Çok teşekkürler hocam.

esensoy

ben olsam;
10ms lik bir timer kurardım,
timerın içinde bir değişkeni artırırdım,
main içinde de o değişken 100 olduğunda gerekli satırları çalıştırır değişkeni sıfırlardım,
En tehlikeli an "zafer" anıdır.

z

USB rutinleri periyodik ilgi ister. Aklimda 2mS gibi kalmis ama emin degilim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

HID sınıfını pek bilmiyorum ama bildiğim kadarıyla en azından bir Interrupt IN Endpoint olması gerekiyor. Bazılarında aynısının OUT karşılığı da olabiliyor ama şart değil diye biliyorum.

Bilgisayar bu IN endpoint'i belli aralıkla sorgular. Bunun en kötü ihtimalle ne sıklıkta olacağını endpoint descriptor'da duyrulur. Atıyorum 10 ms olsun. Bu demektir ki bilgisayar en geç 10 ms içinde sorgu atacak. Daha erken de atabilir, onun keyfine kalmış.

Sorgu geldiğinde IN endpoint kurulu (yani veri göndermeye hazır) ise veri gönderilir. Ancak hazır değilse, NAK gönderilir. Bu bir hata durumu değildir. Kısaca bilgisayara, "Yeni bir şey yok, buralar bildiğin gibi..." demektir. Gerçi bilmiyorum, belki cihaz sınıfına göre uzun süre veri gelmemesi durumu olağan dışı olabilir ve hataya sebep olabilir. Ama örneğin bir klavyenin uzun süre NAK göndermesi son derece doğal olabilir, kimse bir tuşa basmamıştır.

Bu arada yukarıda anlattığım interrupt endpoint'leri için geçerli. Yarım kalan bir bulk veya control transferde bilgisayar çok daha yüzsüz ve ısrarcı olabiliyor. Ben lojik analizörle bakmıştım USB FS hattına. IN endpoint'inden NAK aldığı sürece aklımda yanlış kalmadıysa 30 us'de bir falan sorgu atıyordu.

OUT endpoint'lerde de durum benzer. İşlemcinin veri gelince endpoint buffer'ını boşaltıp endpoint'i yeniden kurması gerekir. Bu yapılmazsa, endpoint yeni gelen OUT paketlerine NAK ile cevap verir. Uygulamaya göre bu durum doğal olabileceği gibi, timeout hatasına da sebep olabilir. Yani mesela timeout süresi 500 ms ise, bu süre boyunca bilgisayar sürekli OUT paketi atıp NAK alır. 500 ms sonra pes edip timeout hatası verir. Bu süre boyunca, IN token'larının aksine OUT paketleri veri de içerdiğinden hattı boş yere şişirirler. USB 2.0 HS hatlarında bu soruna başka bir yolla çözüm bulmuşlar, ama sanırım zaten fazla uzattım bu mesajı...
Gökçe Tağlıoğlu

esensoy

#6
Alıntı yapılan: z - 04 Mayıs 2021, 21:24:29USB rutinleri periyodik ilgi ister. Aklimda 2mS gibi kalmis ama emin degilim.
Şöyle demek istemiştim;
int i=0;
void timer_interupt(){ // 10ms interrupt
i++;
}
int main (){

  .
  .
  .

  while(1){
    .
    .
    .

    usb_task();
    
    if(i>99){
      .      
      . 1000ms'de bir yapılacaklar
      .
      i=0;
    }
  }

}
En tehlikeli an "zafer" anıdır.

Fighter119

#7
Merhaba bu kodları ccs c de derlemeye çalışıyorum ama hata alıyorum, neden olabilir?


#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_ENABLE_PIN PIN_D2
#define LCD_DATA4 PIN_D3
#define LCD_DATA5 PIN_D4
#define LCD_DATA6 PIN_D5
#define LCD_DATA7 PIN_D6

#define USB_CONFIG_HID_TX_SIZE 16              
#define USB_CONFIG_HID_RX_SIZE 16              
#define USB_CONFIG_PID 000B                        
#define USB_CONFIG_VID 2405                      
#define USB_STRINGS_OVERWRITTEN


#include <18F4550.h>
#fuses HSPLL,PLL3,USBDIV,CPUDIV1,VREGEN,NOMCLR
#use delay(clock = 48000000)
#include <lcd.c>
#define USB_STRING(x)  (sizeof(_unicode(x))+2), 3, _unicode(x)
rom char USB_STRING_DESC[]={4, 3, 9, 4,USB_STRING("CCS"),USB_STRING("USB HID"),USB_STRING("123456789")};
    
#include <usb_desc_hid.h>
#include<pic18_usb.h>
#include<usb.c>

char data[16];
void main(){
  lcd_init();                                  
  lcd_putc('\f');                                
  lcd_gotoxy(1, 1);
  lcd_putc("USB HID Example");
  usb_init_cs();                                
  delay_ms(1000);
  while(TRUE){
    usb_task();
    if(usb_enumerated()){                
      if(usb_kbhit(1)){                  
        lcd_gotoxy(1, 2);
        lcd_putc("                ");            
      
        usb_get_packet(1, data, 16);
        lcd_gotoxy(1, 2);
        printf(lcd_putc, data);                  
        delay_ms(1000);                          
        
        usb_put_packet(1, data, 16, USB_DTS_TOGGLE);
      }
    }
  }
}