Merhabalar Arkadaşlar. Ne zamandır CCS C üzerine Çalışıyor. CCS de işimi görebilecek seviyeye geldikten sonra artık birşeyler yapayım dedim. Bu yazımda pic18f4550 ve USB haberleşmesi üzerine ufak bir uygulama yaptım. USB ile uğraşmayı gerçekten çok istiyordum.
Birazcık uğraştırsada çevremdeki örnek uygulamaların bol oluşunun etkisiyle kısa zamanda USB işini çözdüm. USB ile uğraşan kişilerde ortak bir fikir var sanırım. Çünkü bu konuda okumadığım yazı veya makale kalmadı. Şöyleki, USB ilk başta gözü korkutsada bir iki uygulama yaptıktan sonra gerçekten kolaylık açısından rs232 haberleşmesinden farklı kalmıyor.
Yaptığım uygulamaya bakalım şimdi,
Sistem çok basit. pic18f4550, RA5 pinine bağlı DS1820 sıcaklık sensöründen sıcaklık bilgisini okuyup USB Portu üzerinden Bilgisayara gönderir. Şimdilik sadece bilgisayara gönderiyor. Daha henüz C# da acemi olduğum için ufak bir form hazırlayıp pic ile haberleşmesini göstermek amacıyla sadece sıcaklığı formda gösterdim.
USB termometre proteus isis devre şeması
CCS de USB kullanırken Programımıza dahil etmemiz gereken 3 adet dosya var. Bunlar pic18_usb.h, USB_Driver.h, usb.c dosyalarıdır.
CCS de yazdığım kod bu şekilde;
#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 64 //Uçnokta1 için maksimum alınacak ve gonderilecek #define USB_EP1_RX_SIZE 64 #include <pic18_usb.h> #include <USB_Driver.h> //USB konfigurasyon bilgileri bu dosyadadır. #include <usb.c> #include <lcd_driver.c> #include <One_Wire.c> #include <DS1820.c> #use fast_io(a) #use fast_io(b) #use fast_io(c) #use fast_io(d) #define UcNokta1 1 unsigned int16 Term; unsigned int8 paket[64]; unsigned int8 Tam,Onda; float Sicaklik; void main() { setup_timer_3(T3_DISABLED | T3_DIV_BY_1); set_tris_a(0x00); set_tris_b(0x00); set_tris_c(0x00); set_tris_d(0x00); output_a(0x00); output_b(0x00); output_c(0x00); output_d(0x00); lcd_init(); output_high(pin_b7); delay_ms(100); output_low(pin_b7); printf(lcd_putc,"\f"); printf(lcd_putc,"USB Baglantisi"); lcd_gotoxy(1,2); printf(lcd_putc,"Bekleniyor"); delay_ms(100); usb_init(); usb_task(); usb_wait_for_enumeration(); //Cihaz, hazır olana kadar bekle if(usb_enumerated()) printf(lcd_putc,"\f"); printf(lcd_putc,"Baglanti Kuruldu"); lcd_gotoxy(1,2); printf(lcd_putc,"DS18B20 Okunuyor"); Sicaklik = ds1820_read(); //Sıcaklığı Oku.... printf(lcd_putc,"\f"); // Ekranı sil... lcd_gotoxy(5,1); printf(lcd_putc,"Mucit23"); while(TRUE) { while(usb_enumerated()) { if (usb_kbhit(1)) //Eğer pc'den yeni bir paket geldiyse { usb_get_packet(UcNokta1, paket, 64); //paketi oku output_high(pin_a0); } lcd_gotoxy(1,2); printf(lcd_putc,"SICAKLIK=%3.1f", Sicaklik); lcd_putc(223); lcd_putc("C "); Term=Sicaklik*10; Tam=Term/10; Onda=Term%10; paket[1]=Tam; paket[2]=Onda; usb_put_packet(UcNokta1, paket,64, USB_DTS_TOGGLE); // Datayı Gönder.. Sicaklik = ds1820_read(); } } }
Vendor ID ve ProductID bilgileri USB_Driver.h dosyasında belirleniyor. Ben ikisinide hex olarak 0x1111 yaptım.
CCS de yazdığımız program bu şekilde. Sıcaklık bilgisi float tipinde olduğu için, Sıcaklık değerini ilk başta 10 ile çarpıp virgülden kurtarıyorum. Ardından Sıcaklık bilgisini Tam sayı ve virgülden sonraki hane olarak iki parçaya ayırıp bu şekilde bilgisayara gönderiyorum.
CCS yazılımı bundan ibaret. Gelelim bilgisayar tarafında C# yazılımına..
Öncelikle şunu söylemek istiyorum C# çok çabuk öğrenilebilecek dillerden biri, Gerçekten C# da program yazmak çok zevkli 🙂
Programda Hikmet Şahin ve Kemal Serkan Dedeoğlu ‘nun birlikte hazırlamış olduğu MikroC ve PIC18F4550 Kitabından çok faydalandım. Buradan onlara teşekkür etmek istiyorum
C# da usb kullanmadan önce ilk başta UsbLibrary.dll Dosyasını C# kütüphanesine eklemeniz gerekmektedir. Bunu yapmak için Tools/Choose Toolbox Items..‘e Tıklayın aşağı resimdeki gibi bir sayfa açılacaktır.
Bu sayfada Browse seçeneğine tıklayarak UsbLibrary.dll dosyasını gösterin. Ok butonuna basıp çıktıktan sonra Tolbox üzerinde USBHidPort Elemanının eklendiğini göreceksiniz. Bu elemanı Form üzerine sürükleyerek Programımıza dahil edelim.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using UsbLibrary; namespace USB_Term { public partial class Form1 : Form { byte[] RecievedData = new byte[65]; byte Tam = 0; byte Onda = 0; bool durum = false; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.usbHidPort1.ProductId = Int32.Parse("1111", System.Globalization.NumberStyles.HexNumber); this.usbHidPort1.VendorId = Int32.Parse("1111", System.Globalization.NumberStyles.HexNumber); usbHidPort1.CheckDevicePresent(); if (durum) { toolStripStatusLabel1.ForeColor = Color.Green; toolStripStatusLabel1.Text = "USB Bağlantısı Kuruldu"; } else { toolStripStatusLabel1.ForeColor = Color.Red; toolStripStatusLabel1.Text = "USB Bağlantısı Bekleniyor"; } } protected override void OnHandleCreated(EventArgs e) { base.OnHandleCreated(e); usbHidPort1.RegisterHandle(Handle); } protected override void WndProc(ref Message m) { usbHidPort1.ParseMessages(ref m); base.WndProc(ref m); } private void usbHidPort1_OnDataRecieved(object sender, DataRecievedEventArgs args) { if (InvokeRequired) { try { Invoke(new DataRecievedEventHandler(usbHidPort1_OnDataRecieved), new object[] { sender, args }); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } // else { RecievedData = args.data; Tam = RecievedData[2]; Onda = RecievedData[3]; label2.Text = Tam.ToString() + "," + Onda.ToString()+"°C"; } } private void usbHidPort1_OnDataSend(object sender, EventArgs e) { } private void usbHidPort1_OnDeviceArrived(object sender, EventArgs e) { } private void usbHidPort1_OnDeviceRemoved(object sender, EventArgs e) { } private void usbHidPort1_OnSpecifiedDeviceArrived(object sender, EventArgs e) { toolStripStatusLabel1.ForeColor = Color.Green; toolStripStatusLabel1.Text = "USB Bağlantısı Kuruldu"; durum = true; } private void usbHidPort1_OnSpecifiedDeviceRemoved(object sender, EventArgs e) { toolStripStatusLabel1.ForeColor = Color.Red; toolStripStatusLabel1.Text = "USB Bağlantısı kesildi"; label2.Text = "--,-°C"; durum = false; } } }
Yazılım son derece basit. Gerçekten zor bir tarafı yok. Sizde bu şekilde farklı tasarımlar yapabilirsiniz.
PC Programının çalışma anındaki resmi bu şekilde.
Birde ufak bir video çektim. Buradan izleyebilirsiniz.
Yakın zamanda usb ile ilgili birkaç uygulama daha yapacağım. Şimdilik öyle ayak üstü anlatır gibi oldu.
Sağlıcakla kalın..
Şifre-Pass: 320volt.com
Yayım tarihi: 2012/09/01 Etiketler: ccs c projeleri, ccs c thermometer, ccs c usb, microchip pic projeleri, pic18f4550 projeleri, usb haberleşme, usb termometre, usb thermometer
merhaba,
Bu uygulama için “mikroc ve pic18f4550” kitabına bir gönderme veya teşekkür etseydiniz daha iyi olurdu. Teşekkürler.
teşekkürler,güzel uygulama. MikroC ve PIC18F4550 kitaptaki uygulamayı ccs c ye çevirmişsiniz sanırım.hemen hemen aynı gibi.
teşekkürler mucit
kraldan çok kralcı varmış yok mikroc yi ccs c ye çevişmişsiniz yok mikro c kitabına gönderme yapın
hanginiz kitabın yazarınız söyleyin bakalım 😀
@safir bilgi paylaşıldıkça çoğalır koçum! kitapta bu konuya yer vermeseydik, sen bu uygulamayı rüyanda görürdün ancak. Kitabın yazarlarından birisi benim ve adımla yazdım yorumu, ayrıca şunuda unutma ki, bu ülkede kitaptan para kazanılmaz, istersen araştırabilirsin. Ya da bir tanede sen yazarsın, alır bakarız.
@Hikmet Şahin
bilgi paylaştıkça çoğalır doğru ama mucit arkadaşımız bedava paylaşmış bilgisini daha ne yapsın.
Kitap için gönderme isteği de çok saçma geldi. adam parayı vermiş almış kitabı size destek olmuş içeriği öğrenmiş ve sevabına bedava paylaşmış.
sizin isteğinize göre o zaman bu projeyi yaparken kullandığım pic için microchip firmasına, kullandığım bilgisayar için başta icat eden John Atanasov ve bilgisayarın markası olan Asus’a projeyi yaparken içtiğim çay için başta Rize halkı olmak üzere Çaykur’a kullandığım elektrik için Tedaş’a malzeme temini için Karaköy’de Selanik Pasajı’ndaki Rüstem abiye teşekkürlerimi borç bilirim vs… gibi birçok şey daha yazılabilir.
peki siz kitapta kimlere yer verdiniz yoksa mcu, kağıt, matbaa, boya, latin harfleri, programlama dili vs… hepsini siz mi icaat ettiniz.
Kitabın yazarıda kendi adına yorum yazdığı için bu konuda yorum yazmayacaktım ama Mehmet Uludağ beyin fikirleri bana ters geldi.
Emeğe saygı diye birşey var değil mi? En basitinden eşinizin yada annenizin yaptığı yemeği yedikten sonra bile eline sağlık diyorsunuz değil mi? Belliki kitabın yazarı bu konuda hassas,anlayış göstermek gerekir çünkü o adamın emeği bu. Biz 3.şahıslara da bende dahil birşey söylemek düşmez gibi geliyor bana artık. Kendi adıma bu konuyu paylaşan arkadaştanda kitabın yazarı arkadaştan da özür dilerim.
Merhaba
Açıkçası Konuya yazılanları yeni gördüm. Bu duruma geleceğini bilseydim hiç yazmazdım.
Kontrol Sisteminin C# tarafında Hikmet beyin Hazırlamış olduğu MikroC ve 18F4550 Kitabından çok faydalandım. Hikmet Bey bu konuda Haklısınız. Sizden özür dilemek isterim. Kaynak Belirtmem gerekirdi.
merhabalar.
Ben de teşekkür ederim, emeğe saygı oldukça bilgi paylaşımı daha çok olacaktır eminim. İyi çalışmalar.
Merhaba,
Ben elektronik aşığı birisiyim.
Öncelikle bu siteyi hazırlayanlara ve Mucit23’e şimdiye kadar paylaştığı projelerden dolayı teşekür ederim. Ender insanlardansınız.
Hikmet ŞAHİN hocam kesinlikle çok haklısınız. “BİLGİ PAYLAŞILDIKÇA ÇOĞALIR.” Sizin gibi hocalarımıza ihtiyacımız var. Yayınlarınızı ben de aldım ve çok beğendim.
Siteye yorum yazan arkadaşlardan bir ricam olacaktı. Lütfen bu siteyi mahalle kahvesine çevirmeyelim. Birbirimize çamur atmak yerine eğer yapabiliyorsak daha iyisini yapıp paylaşalım. Teknolojiye ve gelişmeye ihtiyacımız var unutmayın…
İyi çalışmalar arkadaşlar.
İnsanoğlunun olduğu her yerde bir fesatlık mutlaka çıkar. Bırakın birbirinizden takdir beklemeyi artık bilime, ilime odaklanın birbirinize saygılı olun millet. Başarılar…
Sayın Mucit 23 öncelikle böyle bir devre yapıp bizlerle paylaştığınız için teşekkür ederim. Bu devrenin PC yazılımının açıldığı anda herzaman üstte kalmasını sağlamanın ve pencere olmadan sadece rakamlar kırmızı renkte görülecek şekilde ayarlamanın bir yolu varmıdır acaba?
merhabalar bu sistemi sıfırdan nasıl kurabilirim yardımcı olurmusunuz?
Çok yararlı bir çalışma olmuş teşekkürler yanlız C# kısmında aşşağıdaki kodları bağlayabileceğimiz eventları bulamadım uygulama sizin proje üstünden çalışıyor ama ben aynısını yeni birprojede yazınca çalışmıyor (usb den bağlantı kurmuyor) not usb için gerekli dll i de eklememe rağmen
yardımcı olabilirseniz sevinirim iyi çalışmalar
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
usbHidPort1.RegisterHandle(Handle);
}
protected override void WndProc(ref Message m)
{
usbHidPort1.ParseMessages(ref m);
base.WndProc(ref m);
}
programlar çalışmıyor hocam.
Paylaşım için teşekkürler.. Aşağıdaki eksikleri giderirmisiniz??Çünkü lcdde bile görüntü alınamıyor.. Şimdilik gözüme çarpan eksiklikler
1.pic18_usb.h, dosyasını paylaşmamışsınız…
2.C# da usb kullanmadan önce ilk başta UsbLibrary.dll Dosyasını C# kütüphanesine eklemeniz gerekmektedir. Bunu yapmak için Tools/Choose Toolbox Items..‘e Tıklayın aşağı resimdeki gibi bir sayfa açılacaktır.
bunu nerede yapılcağını anlatmamışsınız…
@Ayhan,
İlk önce Yazının Tamamını bir oku ondan sonra yorum yap!!
1-) pic18_usb.h dosyasını vermeme gerek yok çünkü bu dosya ccs ile birlikte zaten geliyor. CCS nin kendi driveri’dir ve Drivers klasörü içerisinde var.
2-) Tools/Choose Toolbox Items..
Söylemişimya burda, Daha ne yazdığından haberin Yok! Buraya girmeyi denedinmi?
hocam ben bu devreyi kurdum usb yi taktım 151.3 dereceyi gördüm usb yi hemen söktüm aşırı ısınıyor neden olabilir…
merhaba güzel uygulma usb konusunda size bikaç sorum olucak
bu projede eger usb haberleşmesi kesilirse sıcaklık ekranda gösteriliyormu yani usb haberlemşesş kesilip faklı bir kaynaktan verilen akım ile devreyi Çalıştırıp sıcaklık ölçüm kodları çalışıyormu ?
sıcaklık – basınç – nem ölçüm ve led kontrol devresi yapıyorum devrem de lcd ekranda ve usb haberleşmesiye pc ekranında görebiliyorum ve ledleri açıp kapata biliyorum ama usb bağlantısı olmayınca işlemci usb den veri bekliyor ve ölçüm işlemleri yapmıyor bunun için işlemcimde usb bağlantısının olup olmadığını nasıl anlarım
umarım anlatabilmişimdir
Tebrik ederim. En açıklayıcı Türkçe kaynak olmuş. Ayrıca teşekkür ederim.
mucit23 ağabey bu devreyi hocamız bize ödev olarak verdi ancak ben şuan proteus üzerinden devre çizimini yapabamıyorum bana ulaşır mısın bu konuda acil