USB artık gündelik hayatımızda çok sık olarak karşılaştığımız bir araç. Bilgisayardan alacağımız ya da bilgisayara kaydedeceğimiz bilgilerin neredeyse hepsi USB üzerinden veri transferine tabi tutulmakta.  USB nin açılımı Universal Serial Bus(Evrensel Seri Veri Yolu)dur.  USB veri aktarımında senkron seri haberleşme gerçekleştirilir. Fakat kullanılan protokol bilinen senkron haberleşmenin biraz dışındadır.

Type_A_USB_Connecter_altimages (3)

USB nin veri aktarım hızına göre sınıflandırılmış çeşitli versiyonları vardır.

  • USB 1.0 ve 1.1 : Hız 12 Mbit/sn (1.5 MByte/sn) (fullspeed)
  • USB 2.0 : Hız 480 Mbit/sn (60 Mbyte/sn) (highspeed)
  • USB 3.0 : Hız 4,80 Gbit/sn (600 MByte/sn) (superspeed)
  • USB 3.1 : Hız 10 Gbit/sn (1,22 GByte/sn) (superspeed 10 Gbps)

USB kablosu 4 adet iç hat içerir. Bunlardan kırmızı ve siyah olan 5V ve ground iken beyaz ve yeşil olan ise data hatlarıdır.   Fakat biz usb yi senkron seri haberleşmenin en basiti ile de kullanabiliriz.

 Senkron Nedir?

Senkron seri iletişimde gönderilen bit ile alınan veri bitleri arasında bir uyum olmalıdır. Yani senkron ifadesi alıcı devre ile verici devrenin eş zamanlı çalışması anlamına gelir.  Bu alış-veriş sırasında uyumu sağlamak için data hattının  yanında birde clock(senkron) hattı bulunur. Clock sinyalinin periyodu seri iletişimdeki her bir bitin iletim süresini belirtir. Böylece bilgi iletişimi için start ve stop bitlerine gerek kalmaz.  Senkron sinyali  gönderilen data bilgisinin alınıp alınmadığını kontrol etmek amacı ile ardışık olarak 101010101 şeklindeki bitler içerir.  Senkron sinyalinin logic-1 olan bitinde gönderilen data alınır.  Yani şöyle;

senkron

Burada da görüldüğü gibi clock sinyalinin her logic-1 durumu için data hattından bir değer alınmıştır.  Alınan bu değerler iletilmek istenen verilerdir.

İsterseniz bununla ilgili simülasyon üzerinde bir örnek uygulama yapalım.  Konunun mantığını anlayabilmek için çok sade ve basit bir örnek olsun. Bunun için bir alıcı ve bir veriye ihtiyacımız olacak.  Vericiden gönderdiğimiz 4 bitlik data ile alıcıya bağladığımız ledi yakıp söndürelim.

Adsız4

Alıcıdan vericiye “0001” gönderdiğimizde ledimiz yansın, “0010” bilgisi gönderdiğimizde ledimiz sönsün.  Bu işlem için verici denetleyicinin b0 pini senkron hattı olarak kullanılmış ve alıcının a0 pinine,  vercinin b1 pini data hattı olarak kullanılmış ve alıcının a1 pinine bağlanmıştır.

O halde ledi yakmak için göndereceğimiz sinyal şu şekilde olacaktır;

Adsız1

Alttaki kare dalga senkron, üstteki sarı kare dalga ise data sinyalidir.

Aynı şekilde ledi söndürmek için göndereceğimiz sinyallerin şu şekilde olması gerekiyor;

Adsız2

Bu durumda programlarımız şu şekilde olacak;

  Verici Programı

 

#include 

#fuses xt,nowrt,nowdt,nobrownout,nolvp,nocpd,nodebug,noprotect,noput

#use delay(clock=4M)

#use fast_io(b)
#use fast_io(a)

void main()

{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı
   setup_timer_1(T1_DISABLED); // Timer1 ayarları yapılıyor

   set_tris_a(0xff);
   set_tris_b(0x00);

   output_b(0x00);

while(1)

{
  if(input(pin_a0)==1)
  {
 
  // yak datası 0001
 
     output_high(pin_b0); // senkron logic−1
     output_high(pin_b1);  // 1.bit
     delay_ms(50);    
     output_low(pin_b0); // senkron logic−0
     delay_ms(50);
    
     output_high(pin_b0); // senkron logic−1
     output_low(pin_b1);  //  2.bit
     delay_ms(50);    
     output_low(pin_b0); // senkron logic−0
     delay_ms(50);
    
     output_high(pin_b0); // senkron logic−1
     output_low(pin_b1);  //  3.bit
     delay_ms(50);    
     output_low(pin_b0); // senkron logic−0
     delay_ms(50);
    
     output_high(pin_b0); // senkron logic−1
     output_low(pin_b1);  //  4.bit
     delay_ms(50);    
     output_low(pin_b0); // senkron logic−0
     delay_ms(50);
    
      while(TRUE){
       if(input(pin_a0)==0){break;} // butondan parmağı çekinceye kadar bekle
       }
}

if(input(pin_a1)==1)
  {
     //söndür datası 0010
 
     output_high(pin_b0); // senkron logic−1
     output_low(pin_b1);  //  1.bit
     delay_ms(50);    
     output_low(pin_b0); // senkron logic−0
     delay_ms(50);
    
     output_high(pin_b0); // senkron logic−1
     output_high(pin_b1);  // 2.bit
     delay_ms(50);    
     output_low(pin_b0); // senkron logic−0
     delay_ms(50);
    
     output_high(pin_b0); // senkron logic−1
     output_low(pin_b1);  //  3.bit
     delay_ms(50);    
     output_low(pin_b0); // senkron logic−0
     delay_ms(50);
    
     output_high(pin_b0); // senkron logic−1
     output_low(pin_b1);  //   4.bit
     delay_ms(50);    
     output_low(pin_b0); // senkron logic−0
     delay_ms(50);
    
       while(TRUE){
       if(input(pin_a1)==0){break;}  //butondan parmağı çekene kadar bekle
       }
}

}
}

 

 

 Alıcı Programı

#include 

#fuses xt,nowrt,nowdt,nobrownout,nolvp,nocpd,nodebug,noprotect,noput

#use delay(clock=4M)

#use fast_io(b)
#use fast_io(a)

int data[4]={0,0,0,0};
int i=0;

void main()

{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı
   setup_timer_1(T1_DISABLED); // Timer1 ayarları yapılıyor

   set_tris_a(0xff);
   set_tris_b(0x00);

   output_b(0x00);

while(1)
{
    
  
  if(input(pin_a0)==1)// senkron logic−1 olduğunda
  {

    data[i]=input(pin_a1);
 
   
    i++;
   
    if(i==4) { // data dizisi tamamen alındıysa
   
    i=0;
   
    if(data[3]==0){
     if(data[2]==0){
      if(data[1]==0){
       if(data[0]==1){   // alınan data 0001 ise ledi yak
      
       output_high(pin_b0);
       }}}}
   
    if(data[3]==0){
     if(data[2]==0){
      if(data[1]==1){
       if(data[0]==0){  
      
       output_low(pin_b0);
      
       }}}} // alınan data 0010 ise ledi sondur
    } 
      while(TRUE){
      if (input(pin_a0)==0){break;} // senkron logic−0 olmadan data kabul etme
      }       
  }

   
   
} 
}

 


   

Dökümanları şuradan indirebilirsiniz;    usb

CEVAP VER

Please enter your comment!
Please enter your name here