3 Eylül 2012 Pazartesi

PIC18F4550 CCS C USB Termometre


PIC18F4550 CCS C USB Termometre

pic18f4550-ccs-c-usb-termometre
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 basitpic18f4550, 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 0×1111 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 :)
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

Hiç yorum yok: