Ana içeriğe git

Haberler

Konu: PC ile PIC Kontrolü (C# ve CCS C) (3083 Kez okunmuş) önceki konu - sonraki konu

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.
PC ile PIC Kontrolü (C# ve CCS C)
Merhaba hazır aklımdayken pc ve pic arasında iletişimle ilgili biraz bilgi vermek istiyorum.Bir proje üzerinde giderk açıklayacağım elimden geldiğince.18F4550 ile baglantı kurarak led yakıp sondurmeyı yapmaya çalışacağız

PC Arayüzünü C# da hazırladım. ilk olarak C# programınında USB yi kullanabilmemiz için gerekli bir dll kullandık.C# kısmında ayrı bır konuda anlatmak ıstıyorum cunku her koldan gırersek konu cok dagılacak :)

Ben hazırladığım projeyi burada verdim istediğiniz gibi değiştirip kendinize göre ayarlayabilirsiniz
Dosyalar

Proteus, C# ve CCS C dosyaları içindedir

Şimdi CCS C de yazılan kodlara gelelim

Kod: [Seç]

#include <18F4550.h>
#device ADC=10
//#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CPUDIV1,VREGEN,NOBROWNOUT // 8MHZ
#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,PLL1,CPUDIV1,VREGEN,NOPBADEN //4 MHZ
#use delay(clock=48000000)


Öncelikle sigorta ayarları ve çalışma frekansını seçiyoruz gördüğünüz üzere PLL1 yani 4 MHZ lik bir kristal takılı siz isteğe göre değişebilir 8 ve 20 için ayrı ayarlar gerekli

PLL1 4MHZ
PLL2 8MHZ
PLL5 20MHZ

USB Kesmesi, paket boyutu ve kullanacağımız dosyaların eklemelerini yapıtık (Bu ayar kısmı standart kalabilir ben ek olarak flexy lcd kütüphanesi ekledim)

Kod: [Seç]

#define USB_HID_DEVICE     TRUE            
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT 
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   
#define USB_EP1_TX_SIZE    64                    //Ucnokta1 için maksimum alinacak ve gonderilecek
#define USB_EP1_RX_SIZE    64                    //veri boyutu (64 byte)

#include "flex_lcd.c"
#include <pic18_usb.h>    
#include <USB_Konfigurasyon.h>
#include <usb.c>   

#use fast_io(b)
#use fast_io(d)

#define use_portb_lcd true

#define UcNokta1       1
#define kactane        gelen_paket[0]
#define isaret         gelen_paket[1]
#define kontrol        gelen_paket[2]
#define giden          giden_paket[3]

int8 x;
int8 gelen_paket[64];  //gelen ve giden paket uzunluğunu belirttik
int8 giden_paket[32];


Şimdi diğer port ayarları , usb bağlantısını hazırlama lcd yi hazırlama gibi bir takım zamazingo işlerini hallediyoruz.Bir takım açıklamaları kod içerisinde yaptım.

Kod: [Seç]


void main(void)
{
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);  
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_ccp1(CCP_OFF);    
   setup_vref(FALSE);
   setup_CCP1(CCP_OFF);       
   setup_CCP2(CCP_OFF); 
  
   set_tris_b(0x00);
   set_tris_d(0x00);
   output_b(0x00);
   output_d(0x00);
  
   lcd_init();
   usb_init(); 
   usb_task();
  
   printf(lcd_putc,"USB BAGLANTISI");  //USB baglantisi kurulduysa LCD'de göster
   lcd_gotoxy(1,2);
   printf(lcd_putc,"KURULUYOR...");    //USB baglantisi kurulduysa LCD'de göster
   // usb ilk takıldıgında burada baglantı kuruluyor yazcak alttaki fonksiyonda (usb_enumerated) usb baglantısını kontrol edıyor yanı usb hazır olursa Baglantı kuruldu yazacak sekılde ayarlıyoruz
   usb_wait_for_enumeration();         //Cihaz, hazir olana kadar bekle
   if(usb_enumerated())   
   lcd_gotoxy(1,1);
   printf(lcd_putc,"\fUSB BAGLANTISI");//USB bağlantisi kurulduysa LCD'de göster
   lcd_gotoxy(1,2);
   printf(lcd_putc,"KURULDU !");       //USB baglantisi kurulduysa LCD'de göster


Bağlantı kurma işlemini tamamladık tabi nasaıl yaptık usb yi bilgisayara taktıgımızda Windows 7 bu aygıtı tarayacak sonra otomatık olarak buna bır sürücü kuracak (Eğer kurmassa D+ VE D- Pinlerini değiştirin) aygıtı tanıdıktan sonra arayüzü acabiliriz.Tabi asıl olay şimdi başlıyor ne alıp ne göndericez baglantı acıp kapamayı nasıl yapıcaz ?

Onlardan önce bilgisayardan bir veri gelip gelmediğiniz kontrol etmeliyiz bunu

if(usb_kbhit(1))   //Eger pc'den yeni bir paket geldiyse

Fonksiyonunu kullanarak kontrol edebiliriz paket gelmiş ise kod akışı bu bloğa girecektir
Kod: [Seç]

for (;;) //sonsuz döngü
   {
      while(usb_enumerated()) //usb baglantısı hazır oldugu surece burada dön
      {
         if(usb_kbhit(1))             //Eger pc'den yeni bir paket geldiyse
         {        
            usb_get_packet(UcNokta1, gelen_paket, 64); //paketi oku  gelen paketi burada okuyoruz
           
            if(isaret == 'Q')
            {
               switch(kontrol)    // Paketin ilk elemanindaki komutu oku ve ilgili göreve git
               {
                  case 'a':
                  printf(lcd_putc,"\fPROGRAM BAGLANDI !");//PC deki program baglandiginda LCD'ye yaziliyor...
                  break;
                 
                  case 'b':
                  printf(lcd_putc,"\fPROGRAM AYRILDI !");
                  break;
                 
                  case 'c':
                  output_high(pin_b6);
                  printf(lcd_putc,"\fLED AKTIV !");
                  giden=1;
                  usb_put_packet(1, giden_paket, 64, USB_DTS_TOGGLE); // Geri veri gönderiliyor...
                  break;
                 
                  case 'd':
                  output_low(pin_b6);
                  printf(lcd_putc,"\fLED PASIV !");
                  giden=0;
                  usb_put_packet(1, giden_paket, 64, USB_DTS_TOGGLE); // Geri veri gönderiliyor...
                  break;            
                 
                  case 'e':
                  printf(lcd_putc,"\fLED EFFECT");
                  Led_Effect();
                  break;
                 
                  case 'f':
                  printf(lcd_putc,"\fLED BLINK");
                  Led_Blink();
                  break;
                 
                  case 'x':
                  printf(lcd_putc,"\fBAGLANTI KESILDI !");
                  break;
               }
           }       
         }
      }
   }


C# arayüzünde 4 buton olacak baglan ,baglantı kapat , led yak, sondur dıye her butona bastıgımız zaman paket içerisinde bir adet işaret bir adet de kontrol karakteri göderiyor işaretimiz Q olarak ayarlandı Örneğin Bağlan butonuna basınca paket içerinde Q ve a gönderir buda pice gelir okunur ve switch içerisinde değerlendirilir.Gördüğümüz üzere lcd de Baglantı acıldı seklınde bır yazı yazar.Eğer disconnect butonuna basarsak q ve b onderecek oda baglantıyı kapatacak.Tabi gönderdiğimiz veriden cevap almak da gerekiyor pic de durumlar ne alemde bir başına buyruk kalmasın demi:)

Şimdi led yakma butonuna bastıgımızda neler oluyor ınceleyıp toparlayalım artık

led yak butonuna bastık arayüzde q ve c karakterini göderdi pıc bunu alıp degerlendırdı ve swıtch ıcınden alttakı bloğa yoneldı

Kod: [Seç]

case 'c':
                  output_high(pin_b6);
                  printf(lcd_putc,"\fLED AKTIV !");
                  giden=1;
                  usb_put_packet(1, giden_paket, 64, USB_DTS_TOGGLE); // Geri veri gönderiliyor...
                  break;

Led yandı
LCD de ledin aktıv oldugu yazıldı
usb_put_packet fonksiyonu ile geri bir paket gönderdik
ve switchden cıktık

led yanmıs pc de bunu gormus olduk

Böylelikle PİC ile PC arasında veri alışverişi yapmış olduk.Herkese kolay gelsin elimden geldiğince anlatmaya calıstım.Çünkü ben çok uğraştım ilk seferimde ben cektım sız cekmeyın mısalı :) yeni arkadaslara yol gostermıs olur.

Dikkat edilmesi gereken bir kaç nokta;

- D+ ve D- uçlarını dikkatli baglıyoruz yoksa pc tanımaz
- krıstalı tanımladıgımız gıbı takıyoruz cok problem cıkartır yoksa
-devre usb gerilimi le beslenir ama ben lcd siz denedim
-Olabildiğince koruyucu elemanlar kullanmaya bakım cunku bazı anakartlar usb ddekı en kucuk bır kısa devre ıle arıza yapabılıyor.
-Proteusda devreyi deneyecek arkadaşlar proteusun ek yazılımını kurmaları gerekıyor Virtual USB isimli .Bu program proteus 8 ile birlikte geliyor dosyaları icinde bulup kurabılırsınız dıger surumlerı hakıında bilgim yok

Proteus 8 ve ccs c 18f4550 ile denedim çalıştırdım hem simülasyon hemde prototipde

Herkese iyi çalışmalar esen kalın.

  • Şeriban
  • [*]
Ynt: PC ile PIC Kontrolü (C# ve CCS C)
Yanıt #1
merhaba ben pıcle dc motor kontrollü yapmaya çalısıyorum bunun icim ayrıca c#ile usb üzerindan bir arayuz hazırlamam gerekiyor  ama kütüphaneleri ve gerkli kaynağı bulamadım yardım eder misiniz

Ynt: PC ile PIC Kontrolü (C# ve CCS C)
Yanıt #2
Sevgili @seriban bütün dosyaları ve proje içeriğini yazıda paylaştım.
Daha nasıl bir yardım istiyorsun anlamadım ?
Detay verirsen yardımcı olabilirim.

  • Şeriban
  • [*]
Ynt: PC ile PIC Kontrolü (C# ve CCS C)
Yanıt #3
Ben projemin c# kısmını oluşturamadim usb ile bağlantı sağlaması için bazı kütüphaneler eklemem gerekiyor ama ben kütüphaneleri ekleyemiyorum aslında nasıl eklediğini bilmiyorum bi kaç haftadır bununla uğraşıyorum .bi yardımcı olursanız çok mutlu olurum
  • Son Düzenleme: Mayıs 13, 2018, 00:10:44 - seriban

Ynt: PC ile PIC Kontrolü (C# ve CCS C)
Yanıt #4
Kütüphane eklemek oldukça kolay.
"Add reference" kısmını inceleyin.
Yada internetten C# harici kütüphane eklemek diye araştırırsanız tutorial videoları görürsünüz.

  • Şeriban
  • [*]
Ynt: PC ile PIC Kontrolü (C# ve CCS C)
Yanıt #5
toolStripStatusLabel1 hatası  veriyor şimdi de
  • Son Düzenleme: Mayıs 13, 2018, 21:34:36 - Şeriban

Ynt: PC ile PIC Kontrolü (C# ve CCS C)
Yanıt #6
Ne hatası verdiğini yazıp bir ekran görüntüsü koyarsan o zaman sorunu çözebiliriz.
Ayrıca yazdığın kodu da paylaşırsan daha iyi olur.

  • Şeriban
  • [*]
Ynt: PC ile PIC Kontrolü (C# ve CCS C)
Yanıt #7
Kod: [Seç]
//#include <18F4550.h>
//#device ADC=10
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CPUDIV1,VREGEN,NOBROWNOUT // 8MHZ
#use delay(clock=48000000)

#define USB_HID_DEVICE     TRUE            
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT //Uçnokta1'de Kesme transferi aktif
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   
#define USB_EP1_TX_SIZE    32                 //Uçnokta1 için maksimum alınacak ve gonderilecek
#define USB_EP1_RX_SIZE    32                //veri boyutu (64 byte)

//#i<nclude <lcd.c>
#include <pic18_usb.h>

#include <USB_Konfigurasyon.h>                //USB konfigurasyon bilgileri bu dosyadadır.
#include <usb.c>  
//////////////
#use fast_io(b)
#use fast_io(d)
/////////////
#define low   output_low(PIN_B0)
#define high  output_high(PIN_B0)

#define UcNokta1       1
#define servono        paket[0]
#define hata           paket[1]
#define port_durum     paket[2]
#define sure           paket[3]
/////////////
unsigned int8 paket[32];
int8 x,y,z;
////////////
void soladon();
void ortayagel();
void sagadon();

void main(void)
{    
   set_tris_b(0x00);
   output_b(0x00);
   set_tris_c(0x00);
  output_c(0x00);
  
  
   usb_init();                     
   usb_task();                     
   usb_wait_for_enumeration();         //Cihaz, hazır olana kadar bekle
     
   if(usb_enumerated())   
      output_high(pin_d0);

   for (;;)
   {
      while(usb_enumerated())
      {
 
         if (usb_kbhit(1))             //Eğer pc'den yeni bir paket geldiyse
         {        
         usb_get_packet(UcNokta1, paket, 64); //paketi oku 
            //MOTORU SAG-SOL-ORTA HAKARET ETTIRIYORUZ
switch(sure)    // Paketin ilk elemanındaki komutu oku ve ilgili göreve git
{
case 'i':
      soladon();
     
      output_low(PIN_B3);
      output_high(PIN_B4);
      delay_us(20000-500);
      break;
     
                          
case 'o':
      ortayagel();
          output_low(PIN_B3);
      output_high(PIN_B4);
      break; 
                 
case 'g':
      sagadon();
     
       output_high(PIN_B3);
        output_low(PIN_B4);
      delay_us(20000-2500);
      break;
  • Son Düzenleme: Mayıs 14, 2018, 21:45:59 - Baran Ekrem

  • Şeriban
  • [*]
Ynt: PC ile PIC Kontrolü (C# ve CCS C)
Yanıt #8
ama ekren görntüsü gönderemiyorum

  • Şeriban
  • [*]
Ynt: PC ile PIC Kontrolü (C# ve CCS C)
Yanıt #9
 mailinize atsam olur mu