PIC 18F2550 ile USB İletişim

pic-18f2550

Son sınıfta Kontrol Lab dersi projesi çalıştığım konunun rapor formatını sizlerle paylaşmak istedim. Sırf usb iletişimi desteklediği için 18f4550 ve 18f2550 serilerine karşı aşırı derecede bir sempatim var :)

Benim tüm robotlarımda uyguladığım gibi, siz de robotunuzu USB ile bilgisayara bağlayabilir, PIC’e .hex dosyalarınızı yükleyebilir veya debugging yapabilirsiniz.  Özellikle PID optimizasyon gibi uygulamalarda oldukça işinize yarayacaktır. Kolay gelsin.

PIC İLE PC ARASINDA USB İLETİŞİM

PIC ile PC arasında USB iletişimin sağlanması için öncelikle Vusb bacağına sahip bir mikrodenetleyici seçilmelidir. PIC 18F serisine ait birçok mikrodenetleyicide bu bacak bulunmaktadır. Proje için gerekli toplam pin sayısı göze alındığında, 18F2550 kullanılması uygun görülmüştür.

USB iletişimin yazılıma kolaylıkla adapte edilebilmesi için PCWHD derleyicisi içerisinde bulunan “USB Communication Device Class” kütüphanesi kullanılmıştır. Bu sayede, PC’de USB portu üzerinden sanal bir COM port oluşturulur. Kütüphane içerisinde gerekli tüm USB kodları, kesmeler ve açıklamalar mevcuttur. USB CDC ile bilgi alışverişini gerçekleştirmek için kullanılan komutlar, standart UART alışveriş için kullanılan komutlara oldukça benzerdir.

Aşağıda, bu projede kullanılan temel kod ve açıklamalarına yer verilmiştir:

usb_cdc_init();  Bitrate, Parity, DataBits, CharFormat gibi RS232 iletişimden tanıdık iletişim ayarlarını bulunduran fonksiyondur. USB ile ilgili tüm komutlardan önce kullanılması gerekmektedir.

usb_init();  USB donanımını hazırlar. USB aygıt PC’ye takılana kadar sonsuz bir döngü içinde yazılım bekler. Bunun için USB kesmesini aktif eder ve kullanır. Bu fonksiyonu USB  kodlarını kullanmadan önce çağırmak gerekir.

usb_cdc_connected();  Bu fonksiyon, Eğer “Set_Line_Coding” aldıysak 1 verir. Hyperterminal, SecureCRT gibi çoğu terminal programı, program başladığında ve sanal COM portunu açtığında “Set_Line_Coding” mesajı gönderirler. Bu, PC’nin seri terminal programında data göstermeye hazır olup olmadığını bilmek için basit bir yoldur.

usb_task();  Bu komut ile, PIC PC’ye USB ile bağlandığında, USB aygıt hazır duruma getirilir. PIC ile PC iletişimi kesildiğinde, bu fonksiyon USB stack ve aygıtı resetler. Fonksiyon, USB kesmesini kullanır.

usb_enumerated();  Herhangi bir USB aygıt bilgisayara bağlandığında, USB alt sistemi tarafından aygıt numaralandırılır.  1-127 arası bir aygıt numarası verilir ve aygıt tanımlayıcısı okunur. Tanımlayıcı (descriptor), aygıt ve özelliklerini barındıran bir data yapısıdır. Bu fonksiyon, aygıt PC tarafından numaralandırıldığında 1 verir. Eğer aygıt, PC tarafından numaralandırılmışsa, bu demektir ki aygıt normal operasyon modundadır ve paket alışverişi yapılabilir durumdadır.

get_int_usb();  Kullanıcıdan 8 bitlik bir sayı okur. (stdlib.h kullanımına ihtiyaç duyar)

get_long_usb(); Kullanıcıdan 16 bitlik bir sayı okur (stdlib.h kullanımına ihtiyaç duyar)

printf(usb_cdc_putc, “\r\nMerhaba\n !”); Terminale “Merhaba!” yazar ve alt satıra geçer.

usb_cdc_getc(); Kullanıcıdan 8 bitlik bir karakter okur.

Derleyiciden elde edilen .Hex dosyasının mikrodenetleyiciye, kendisini soketinden sökmeden USB üzerinden programlamak için PCWHD examples klasötür içerisinde bulunan “ex_usb_bootloader.c” ve “usb_bootloader.h” kütüphanesi kullanılmıştır.  Açıklamak gerekirse:

  • ex_usb_bootloader.c

Herşeyden önce, bu dosya derlenip .hex olarak mikrodenetleyiciye programlayıcı yardımıyla yüklenmelidir. Fakat derlemeden önce dosya üzerinde birkaç değişiklik yapılması gerekmektedir:

 

  1. “///only ccs’s 18F4550 development kit has this pin” yazan satırın hemen altında bulunan 3 satırın silinmesi gerekmektedir. Bunun nedeni, proje için 18F4550 geliştirme kiti kullanmıyor olmamızdır. Silinmesi gereken satırlar aşağıdaki gibidir:

#if __USB_PIC_PERIF__ && defined(__PCH__)

#define USB_CON_SENSE_PIN PIN_B2

#endif

  1. 312. satırda bulunan “if(!input(PIN_A4))” komutunda PIN_A4 kısmı devre şemasına göre değiştirilmelidir. Bahsi geçen pine bootloader butonu koyulacaktır. Projede bu pine bağlı bir mikro switch bulunmaktadır. Basıldığında ilgili bacağı topraklar, bırakıldığında bacağa 5 volt gelir. PIC’e enerji gitmeden önce bootloader butonuna basılı tutulduğunda devre bootloader moduna geçer. Artık herhangi bir terminal programı aracılığı ile USB hızında .Hex dosyası atılabilir.

Projede bootloader butonu PIN_B4’e bağlı olduğundan dolayı, 312. satır buna göre değiştirilmiştir.

  • usb_bootloader.h

#include <usb_cdc.h>  satırının hemen üzerinde include edilmesi gerekir. Bu dosya sayesinde yazılan kodlar ROM’da, PIC’e daha önce yüklenmiş olan ex_usb_bootloader.hex in ROM’da kullandığı son adresten hemen sonra yer alır. Böylece bootloader ile PIC içerisine .Hex dosyası atılırken, bootloader üzerine yazılım yazılması engellenmiş olur.

USB iletişim için gerekli tüm kodlar doğruca kullanılmış bir yazılıma sahip aygıt, PC’ye ilk kez bağlandığında, PC, sanal COM Port yaratabilmek için bir sürücünün yüklenmesine ihtiyaç duyacaktır. Bu sürücü  www.Microchip.com adresinde bulunan Microchip Application Libraries v2009-08-31kütüphanesi içerisinde mevcuttur. Bu kütüphane harddiske kurulduktan sonra “USB Device – CDC – Serial Emulator/inf” klasörü içerisinde bulunan “mchpcdc.inf” dosyası NotePad ile açılır. Bu noktada, inf içerisinde bulunan VID ve PID değerlerinin değiştirilmesi gerekmektedir. Bunun nedeni, her bir mikrodenetleyici çeşidinin farklı VID ve PID değerlerine sahip olmasıdır.  Projede 18F2550 kullanıldığı için, VID ve PID değerleri sırasıyla 0461 ve 0033 olarak değiştirilir.

Aygıt PC’ye takıldıktan sonra bu inf dosyası kullanılarak USB_CDC sürücüsü bilgisayara kurulması gerekmektedir.

USB aygıtın PC ile iletişimi sağlamak için terminal programı olarak SecureCRT kullanılmıştır. USB CDC sürücüsü hangi COM porta kurulduysa, aygıt PC ye takıldıktan sonra SecureCRT’den ilgili COM porta bağlantı gerçekleştirilir. Bu projede COM7 kullanılmıştır.

Aygıt PC ye USB ile takıldığında, B4 e bağlı switch bootloader modunda ise, SecureCRT den COM7 ye bağlantı gerçekleştilir. Transfer sekmesinden Send ASCII butonuna basılarak, .Hex dosyaları PIC e yüklenebilir.

B4’e bağlı switch, bootloader modunda değil ise, Aygıt PC’ye bağlandığında, SecureCRT’den COM7’ye bağlantı gerçekleştilir. Ekranda “Merhaba!” yazar.

–          PWMin hangi kanaldan gönderilmek istendiği sorulur. CCP1 için 1, CCP2 için 2 ye basılır.

–          CCP Port numarasının ardından Frekans bilgisi girilir. Devrede 20 Mhz kristal kullanıldığından dolayı minimum 1260 hz girilebilir.

–          Duty Cycle bilgisi % olarak girilir. Duty Cycle’ın 0-100 arası girilmesi gerekmektedir.

–          Motorun dönüş yönü seçilir, ileri için i, geri için g tuşlanır.

–          Motoru istenen açı kadar döndürüp durdurmak için 1’e basılır ve açı değeri girilir.

–          Motora bağlı enkoder bilgisini 1 saniye boyunca okumak için 2’e basılır ve enkoder değeri ekranda gözükür.

%65 ile %100 arası duty cycle değerleri girildiğinde alınan encoder değerleri aşağıdaki gibidir:

Duty %65 %70 %75 %80 %85 %90 %95 %100
Encoder 824 1241 1995 2742 3127 3790 4203 4581

 

Bu değerler alınırken frekans olarak 10khz girilmiştir. Matlab yardımıyla çizilen Duty-Encoder grafiği aşağıki gibidir:

Devre şeması ve PCB Tasarımı aşağıdaki gibidir. Büyütmek için üstlerine tıklayınız. 

CCS C Kodları:

Proteus Dosyaları:

14 Yorum
  1. Profile photo of Emrah BUDAK
    Emrah BUDAK 6 sene önce

    Gerçekten eline sağlık Mert. Şu usb işini bi öğrenebilseydim iyi olacaktı da :D Artık elimdeki işler bi bitsin seni rahatsız edecem :)

  2. Profile photo of Hasan Akgün
    Hasan Akgün 6 sene önce

    Yazınız çok açıklayıcı olmuş, teşekkürler. Sizi daha öncesinden yarışmalardan da tanıyorum. Başarılar dilerim.

  3. Profile photo of Engin YILMAZ
    Engin YILMAZ 6 sene önce

    Güzel paylaşım için teşekkürler. Mert bey Pic den USB den gelen bilgileri okumak ve pic veri göndermek için api varmıdır. kendimiz bir terminal yazılımı geliştirmek için kullanılmak üzere SecureCRT yerine.

  4. Profile photo of Mert Öztoprak Yazar
    Mert Öztoprak 6 sene önce

    CDC nin güzelliği, RS232 iletişim komutlarını kullanarak size USB veri alışverişi imkanı sunması. Dolayısıyla, Cdc sürücüsünü yüklediğiniz sanal Com port üzerinden Matlab, C#, C++ vb gibi herhangi bir ortamı kullanarak data alışverişi sağlayabilirsiniz. Yalnızca seri iletişim için gerekli kütüphaneleri kullanarak (örn c# için “using System.IO.Ports;”) kendi terminal yazılımınızı geliştirebilirsiniz.

  5. Profile photo of Göksel AKPINAR
    Göksel AKPINAR 6 sene önce

    Çok güzel bir çalışma olmuş. Ellerinize sağlık Mert Bey.

  6. Profile photo of Engin YILMAZ
    Engin YILMAZ 6 sene önce

    Teşeşkür ederim. Aslında ben bi ara Sensör ve motorlara bağlı bir Pic le Freebook (Sıfırı 200TL ikinci eli 90TL civarı -Windows Ce yüklü) vasıtası ile kontrol düşünmüştüm.(yeni olduğum için düşündüm sadece uygulama olurmu bilmiyorum) Freebook larda wireless , usp portlar , Ekran , Hdd herşey var. Wifi ile hatta wıınn ile uzaktan kontrol edilebilir. ucuz bir webcam ile görüntü alınabilir hatta çoğu webcam ( apileride var ) yüz tanıma ve nesne takibi yapabiliyor . görüntü işleyip yönlendirme yapılabilir. diye düşündüm :) Bir üniversitenin Robot forumuna bunu yazdım ama fikir alıyım diye ,adamlar siz önce ne yapcanıza karar verin sonra donanıma bakın gibi birşeyler yazdılar. ben sadece olurmu olmazmı diye fikir sunmuştum :) Eğer bi donanım olacaksa ona göre bir fikirde üretebilirim aslında. Bugün bi wifi modul , kamera modulu , v.s. alayım robot için deseniz dünyanın parası tutuyor. ama bu Freebook gibi bir Pc ile çok daha uygun fiyata daha esnek şeyler yapılabilir diye düşünüyorum.

  7. Profile photo of Serkan Kara
    Serkan Kara 6 sene önce

    Öncelikle bu yazınız için size teşekkür ederim en kısa sürede deneyeceğim.Fakat birkaç sorum olacak;
    – pcden string veri alabiliyormuyuz?hep sayı almışsınız?yollarken problem yok fakat almada bir sıkıntımı var?
    -18f4550 ile en fazla ne kadarlık baudrate le habereşebiliriz?
    -Son olarakta kodu yazdıktan sonra bilgisayara bağlayınca sistemi direk tanıyormu bilgisayar?driver v.s yüklemek gerekiyormu?gerekiyorsa nerden bulabilirim?

    • Profile photo of Mert Öztoprak Yazar
      Mert Öztoprak 6 sene önce

      -Pc den “get_string_usb(char *s, int max)” komutu ile string, yani karakter dizisi alabilirsiniz. Hiçbir problem yok. Ben proje gereği string alma gereği duymamıştım.
      – USB_CDC de baudrate mantığı anlamsız oluyor. Serial terminal de hızı 9600 de yapsanız, 115200 de yapsanız, iletişim hızı sabit olacaktır. Teorikte iletişim hızının en fazla 700kb/s olabileceği söyleniyor, 8 bitlik bir mcu ile daha fazlasını beklemek yanlış olacaktır.
      – Bilgisayar hemen tanımaz,driver yüklemeniz lazım, yazımda bahsettiğim gibi yeni versiyon olarak “Microchip Solutions v2011-07-14” paketini bilgisayarınıza kurmanız lazım. Bunun içerisinde “USB\Device – CDC – Serial Emulator\inf” klasöründeki inf dosyası ile sürücüyü yükleyebilirsiniz. .inf dosyasında hiçbir değişiklik yapmanıza gerek yok,direk gösterin çalışıyor.

      • Profile photo of Serkan Kara
        Serkan Kara 6 sene önce

        klavye=get_string…. gibi mi kullanacağız? *s stringi int max da en çok kaç bytelık olacağını gösteriyor heralde yanlışmıyım?
        ileitşim hızı sabit olacak demişsiniz bunu biraz daha açabilirmisiniz yani ben ftdi kulanıyordum bundan önce(eğer bunu çalıştırırsam bunu kullanacağım) orada baudu 1.25 mb v.s ayarlayabiliyorduk.

        • Profile photo of Mert Öztoprak Yazar
          Mert Öztoprak 6 sene önce

          hayır, şu şekilde;

          char klavye[10];
          get_string_usb(klavye,10);

          bu komut çalıştırıldıktan sonra terminalden 10 karakter string gönderebilirsiniz.

          USB Cdc için 2 farklı hız var, Low Speed (1.5 Mb/s) ve Full Speed (12 Mb/s). Pic i 48mhz de çalıştırırsanız Full Speed, 8 mhz de çalıştırırsanız Low speed e ulaşırsınız. Low veya high speed hızları, ulaşılabilecek maksimum hızları temsil ediyor. Alışveriş hızının, USB ile transfer tipine göre değiştiğini söylüyorlar, (Interrupt,bulk veya control). Bundan ötesi hakkında geniş çaplı bir bilgim olmadığını söyleyebilirim. Belki aşağıdaki link bu konu hakkında size yardımcı olabilir;

          http://forum.sparkfun.com/viewtopic.php?t=12604

  8. Profile photo of Tugce Candan
    Tugce Candan 5 sene önce

    Devre Şemasını yükleyebilir misin ? yani resim olarak değil de, proteus dosyası olarak..

  9. Profile photo of Tugce Candan
    Tugce Candan 5 sene önce

    merhaba,
    pic18f4550 ile çalışmaya yeni başladım. bir sorum olacak, daha doğrusu örnek koda ihtiyacım var, nette araştırdım ama pek sonuç alamadım. işlem basit: microdenetleyici pcden INTERRUPT ile data alacak. int_USB kesmesi yazmaya çalıştım ama olmadı

    teşekkür ederim

  10. Profile photo of ferdi gürtekin
    ferdi gürtekin 4 sene önce

    iyi günler
    iki pic arasında basit bir usb veri iletişimini gösteren örnek dosya paylaşmanız mümkün mü?
    teşekkürler….

Kimliğiniz ile giriş yapın

veya    

Ayrıntılarınızı unuttunuz mu?

Create Account