Elektronik Devreler Projeler Elektronik ve biraz daha fazlası İletişim - Araçlar - Dikkat - Topluluk
Elektronik / Mikrodenetleyici Projeleri/

PIC18F4550 CCS C USB Termometre

Sponsorlu Bağlantılar

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ı

proteus-isis-pic18f4550-ccs-c-usb

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.

ccs-ccs-usblibrary-dll-pic18f4550-usb

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.

ccs-c-usb-thermometer-c-microchip-circuit

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.

UsbLibrary.dll Dosyasını ve diğer tüm dosyalar: pic18f4550-ccs-c-usb-termometre.rar

Sağlıcakla kalın..

  • hikmet şahin

    merhaba,
    Bu uygulama için “mikroc ve pic18f4550” kitabına bir gönderme veya teşekkür etseydiniz daha iyi olurdu. Teşekkürler.

  • mete

    teşekkürler,güzel uygulama. MikroC ve PIC18F4550 kitaptaki uygulamayı ccs c ye çevirmişsiniz sanırım.hemen hemen aynı gibi.

  • safir

    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 :D

  • hikmet şahin

    @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.

  • Mehmet Uludağ

    @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.

  • mete

    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.

  • Ferhat YOL

    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.

  • hikmet şahin

    merhabalar.
    Ben de teşekkür ederim, emeğe saygı oldukça bilgi paylaşımı daha çok olacaktır eminim. İyi çalışmalar.

  • Engin

    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.

  • ender

    İ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…

  • Selçuk

    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?

  • cihan

    merhabalar bu sistemi sıfırdan nasıl kurabilirim yardımcı olurmusunuz?

  • emre

    Ç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);
    }

  • burak

    programlar çalışmıyor hocam.

  • ayhan

    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…

  • Ferhat YOL

    @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?

  • gökhan tamgacı

    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…

  • mc29

    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

  • Yusuf

    Tebrik ederim. En açıklayıcı Türkçe kaynak olmuş. Ayrıca teşekkür ederim.