usb-pc-veri-aktarim
Transkript
usb-pc-veri-aktarim
PIC18F4550 MİKRODENETLEYİCİSİ İLE USB-PC VERİ AKTARIM ARABİRİMİ GERÇEKLENMESİ Adil Fatih KİREMİTCİ Y.Lisans Tezi Elektrik ve Elektronik Mühendisliği Anabilim Dalı Yrd. Doç. Dr. Tevhit KARACALI 2007 Her hakkı saklıdır ÖZET Y.Lisans Tezi PIC18F4550 MİKRODENETLEYİCİSİ İLE USB-PC VERİ AKTARIM ARABİRİMİ GERÇEKLENMESİ Adil Fatih KİREMİTCİ Atatürk Üniversitesi Mühendislik Fakültesi Elektrik ve Elektronik Mühendisliği Anabilim Dalı Danışman: Yrd. Doç. Dr. Tevhit KARACALI Günümüz teknolojisinde veri toplama elektroniğindeki hızlı gelişim, aynı zamanda daha hızlı ve uyumlu veri iletişim metotlarına olan ihtiyacı da beraberinde getirmiştir. Bununla beraber kullanıcılar farklı tiplerde elektronik cihazlarla bilgisayar arasında bir arabirime ihtiyaç duymuşlar ve bu cihazların bilgisayar tarafından kontrolünü sağlamayı amaçlamışlardır. Bu çalışmada, çevrebirimlerden alınacak elektriksel büyüklüklere ait verilerin bilgisayar ortamına aktarılması ve bu verilerin görsel bir şekilde kullanıcıya sunularak çevrebirimlerin kontrolünü sağlayacak bir arabirim devresinin tasarlanması ve gerçekleştirilmesi amaçlanmıştır. Son zamanlarda veri iletişiminde yaygın olarak kullanılan en popüler standart USB standardıdır. Günümüz elektronik teknolojisinin vazgeçilmezleri arasında yerini alan PIC mikrodenetleyicilerden PIC18F4550 kullanılarak, çevrebirimler ile bilgisayar arasındaki veri toplama işlemi USB üzerinden gerçekleştirilmiştir. 2007, 95 sayfa Anahtar Kelimeler: PIC18F4550, USB, Veri Toplama, A/D Dönüştürücü i ABSTRACT MS Thesis REALIZING OF PC-USB DATA TRANSFER INTERFACE WITH PIC18F4550 MICROCONTROLLER Adil Fatih KİREMİTCİ Atatürk University Faculty of Engineering Department of Electrical and Electronic Engineering Supervisor: Asst. Prof. Dr. Tevhit KARACALI With the rapid growth of data acquisition electronics in today’s technology, there also comes a need for faster and compatible data transfer methods. Although, users need an interface for various types of electronic devices and a computer, and aimed that controlling of these devices via computer. In this thesis it is aimed transferring electrical quantities data which is taken from peripherals to computer medium and visually presenting these data to user, and designing and realizing of an interface circuit to control these peripherals. Nowadays, most popular and widely used method of data transfer utilizes the USB standard. Using one of the today’s electronic technology’s indispensable PIC microcontrollers PIC18F4550, data acquisition is provided via USB standard. 2007, 95 pages Keywords: PIC18F4550, USB, Data Acquisition, A/D Converter ii TEŞEKKÜR Yüksek Lisans tezi olarak sunduğum bu çalışma, Atatürk Üniversitesi Mühendislik Fakültesi Elektrik ve Elektronik Mühendisliği Bölümü ve Erzincan Üniversitesi Kelkit Aydın Doğan Meslek Yüksekokulu’nda yapılmıştır. Çalışmalarımda her türlü desteği sağlayan çok değerli hocam Sayın Yrd. Doç. Dr. Tevhit KARAÇALI’ya en içten teşekkürlerimi sunarım. Erzincan Üniversitesi Kelkit Aydın Doğan Meslek Yüksekokulu’nda gerekli yardımı ve ilgiyi esirgemeyen yüksekokulumuz müdürü Sayın Yrd. Doç. Dr. Sebahattin KARANLIK’a ve uygulama aşamasında yardımlarını esirgemeyen yüksekokulumuz personeline çok teşekkür ederim. Çalışmalarım sırasında ailemden görmüş olduğum destek ve teşvikten dolayı kendilerine de sonsuz teşekkürlerimi sunarım. Adil Fatih KİREMİTCİ Ağustos 2007 iii İÇİNDEKİLER ÖZET ……………………………………………………………………………... i ABSTRACT ………………………………………………………………………. ii TEŞEKKÜR ………………………………………………………………………. iii SİMGELER ve KISALTMALAR DİZİNİ ……………………..…………………. vii ŞEKİLLER DİZİNİ ……………………………………………………….............. ix ÇİZELGELER DİZİNİ ……………………………………………………………. xi 1. GİRİŞ ……………………………………………………………………........ 1 1.1. Çalışmanın Amacı ve Kapsamı …………………………………..………..... 1 1.2. Çalışmanın Anahatları ……………………………………………...…...….. 2 2. KURAMSAL TEMELLER …………………….…………………………... 3 2.1. USB ……………………………………………………………………...….. 3 2.1.1. Giriş …………………………………………………………………......... 3 2.1.2. USB protokolü …………………………………………………………..... 8 2.1.2.a. USB bileşenleri ………………………………………………….…........ 8 2.1.2.b. USB cihazlarda veri akışı ………...……………………………………...8 2.1.2.c. USB veri transfer tipleri …………………………………………............ 10 2.1.2.d. USB sürücüleri ………………………………………………….............. 12 2.1.2.e. USB konfigürasyonu ……………………….……………….................... 13 2.2. PIC Mikrodenetleyiciler …………………………………………………......15 2.2.1. PIC nedir? …………………….………………………………………....... 15 2.2.2. Neden PIC? ……………………………………………………………...... 16 2.2.3. Neden PIC18F4550? ………………………………………………............ 17 2.3. PIC18F4550 özellikleri ve yapısı ………..………………………………......19 2.3.1. PIC18F4550 ……………………………………………………………..... 19 2.3.1.a. USB desteği ..……………………………………………………….........21 2.3.1.b. Çoklu osilatör seçenekleri ve özellikleri ……………...………………… 22 2.3.1.c. Hafıza özellikleri .……………………………………………………….. 22 2.3.2. PIC18F4550 giriş / çıkış portlarının fonksiyonları …...…………………... 23 2.3.3. PIC18F4550 osilatör özellikleri ……..………………………………......... 28 iv 2.3.3.a. Osilatör kontrolü ….……………………………………………….......... 29 2.3.3.b. PIC18F4550’de reset (sıfırlama) işlemi ………………………………. 31 2.3.3.c. PIC18F4550 hafıza organizasyonu ……………………………………... 33 2.3.3.d. PIC18F4550 CCP (Capture/Compare/PWM) modülleri …….................. 36 2.3.4. 10-bit analog/dijital dönüştürme modülü …….……………………............ 37 2.3.4.a. A/D dönüşüm için gereksinimler …..…………………………................ 40 2.3.4.b. Elde edim zamanının seçimi ve yapılandırılması …………………......... 41 2.3.4.c. A/D dönüşümü için saat kaynağı seçimi ………………………………... 41 2.3.4.d. Analog port bacaklarını yapılandırma ………………….…………......... 42 2.3.4.e. A/D dönüşümü ………………….…………………………………......... 42 2.3.5. PIC18F4550 USB modülü ….………...…………………………………... 44 2.3.5.a. USB durum ve kontrolü ……..………………………………………….. 44 2.3.5.b. USB kontrol kaydedicisi (UCON) …..………………………………….. 45 2.3.5.c. USB konfigürasyon kaydedicisi (UCFG) ……………..………………... 46 2.3.6. PIC18F4550 komut seti …….…………………………………………….. 47 2.3.7 I/O portlarının konfigürasyonu ………….………………………………… 47 3. MATERYAL ve YÖNTEM …………………..…………………………….. 48 3.1. Paralel ve USB Programlama Devresi ……………………….……………... 48 3.1.1. Donanım (Hardware) ……………………………………………………... 48 3.1.2. Devre elemanları ………………………….………………………………. 51 3.1.2.a. PIC18F4550 …………………………………………………………...... 51 3.1.2.b. Osilatör ………………………………………………………………...... 52 3.1.2.c. USB konektör …………….……………………………………………... 52 3.1.2.d. Güç göstergesi ………….……………………………………………......53 3.1.2.e. Sıfırlama ve program butonları ………….……………………………… 54 3.1.3. Güç ………………………………………………………………………... 54 3.2. Yazılım (Software) …………………………………………….…….............55 3.2.1 PIC18F4550’nin önyüklemesi (Bootload) ….……………………………... 55 3.3 Kodlama (Firmware) ………………………………………………................ 58 3.4 Görsel arabirim(GUI) ……………………..………………………………….59 4. ARAŞTIRMA BULGULARI …………………………………..……………60 5. TARTIŞMA ve SONUÇ …………………..………………………………… 67 v KAYNAKLAR ……………………………………………………………………. 69 EKLER …………………………………………………………………………….. 70 EK 1 ……………………………………………………………………………... 70 EK 2 ……………………………………………………………………………... 71 EK 3 ……………………………………………………………………………... 72 EK 4 ……………………………………………………………………………... 73 EK 5 ……………………………………………………………………………... 74 EK 6 ……………………………………………………………………………... 75 EK 7 ……………………………………………………………………………... 76 EK 8 ……………………………………………………………………………... 78 EK 9 ……………………………………………………………………………... 82 EK 10…………………………………………………………………………….. 90 EK 11 ……………………………………………………………………………. 93 EK 12 ……………………………………………………………………………. 94 EK 13 ……………………………………………………………………………. 95 ÖZGEÇMİŞ ……………………………………………………………..………… 96 vi SİMGELER ve KISALTMALAR DİZİNİ CHOLD Örnekle/tut kondansatörü RS Kaynak direnci RSS Örnekleme anahtarı iç direnci TACQ Analog sinyali minimum algılama zamanı TAD Bit başına A/D dönüşüm zamanı TAMP Yükseltme gecikme zamanı TC Örnekle/tut kondansatörü şarj zamanı TCOFF Sıcaklık katsayısı TOSC Osilatör periyodu VDD Kaynak gerilimi Kısaltmalar A/D Analog/Digital (Analog/Dijital) ADC Analog to Digital Converter (Analog/Dijital Dönüştürücü) API Application Program Interface (Uygulama Programı Arayüzü) BOR Brown-Out Reset (Gerilim Düşmesi Sıfırlaması) CCP Capture/Compare/PWM (Yakalama/Karşılaştırma/Darbe Genlik Modülasyonu) CPU Central Processing Unit (Merkezi İşlem Birimi) CRC Cyclic Redundancy Check (Çevrimsel Artıklık Kodlaması) DLL Dynamic Link Library (Dinamik Link Kütüphanesi) ECCP Enhanced Capture/Compare/PWM (Geliştirilmiş Yakalama/Karşılaştırma/Darbe Genlik Modülasyonu) EEPROM Electrically Erasable Programmable Read-Only Memory (Elektrikle Silinebilir Salt Okunabilir Bellek) EUSART Enhanced Universal Synchronous Asychronous Receiver Transmitter (Geliştirilmiş Evrensel Senkron Asenkron Alıcı Verici) GPR General Purpose Registers (Genel Amaçlı Kaydediciler) GUI Graphical User Interface (Grafik Kullanıcı Arayüzü) I/O Input/Output (Giriş/Çıkış) vii I2C Inter-Integrated Circuit (Tümleşik Devre Arabirimi) ICSP In-Circuit Serial Programming (Devre Üzerinden Seri Programlama) IRP Input/Output Request Packets (Giriş/Çıkış İstek Paketleri) LIN Local Interconnected Network (Yerel Bağlantılı Ağ) MSSP Main Sychronous Serial Port (Ana Senkron Seri Port) PEEC Positive Channel Metal-Oxide Electrically Erasable Cell (Pozitif Kanal Metal-Oksit Yarıiletken Tip Elektrikle Silinebilir Pil) PIC Peripheral Interface Controller (Çevresel Arabirim Denetleyicisi) PID Product Identity (Ürün Kimliği) PLL Phase Locked Loop (Faz Kilitlemeli Döngü) PMOS Positive Channel Metal-Oxide Semiconductor (Pozitif Kanal Metal-Oksit Yarıiletken) POR Power-On Reset (Enerji Verildiğinde Sıfırlama) PWM Pulse Width Modulation (Darbe Genişlik Modülasyonu) RAM Random Access Memory (Rasgele Erişimli Bellek) RISC Reduced Instruction Set Computer (Komut Seti Azaltılmış Bilgisayar) SFR Special Function Registers (Özel Fonksiyon Kaydedicileri) SIE Serial Interface Engine (Seri Arabirim Motoru) SPI Serial Peripheral Interface (Seri Çevresel Arabirim) SPP Streaming Parallel Port (Duraksız Paralel Port) SRAM Static Random Access Memory (Statik Rasgele Erişimli Bellek) ST Schmitt Trigger (Schmitt Tetiklemesi) TTL Transistor-Transistor Logic (Transistör-Transistör Lojik) USART Universal Synchronous Asynchronous (Evrensel Senkron Asenkron Alıcı Verici) USB Universal Serial Bus (Evrensel Seri Yol) USB-IF Universal Serial Bus-Implementers Forum (Evrensel Seri Yol Gerçekleştiricileri Forumu) VID Vendor Identity (Üretici Kimliği) WDM Win32 Driver Model (Win32 Sürücü Modeli) viii Receiver Transmitter ŞEKİLLER DİZİNİ Şekil 2.1. USB boruları ve son uç kavramı …………………………………..……. 9 Şekil 2.2. USB veri hareketi ……………………………………………………....10 Şekil 2.3. USB veri iletişim tiplerinin teorik olarak taşıyabilecekleri maksimum veri büyüklüğü ……………………………………………………...... 12 Şekil 2.4. USB sürücü modeli ……………………………………………………... 13 Şekil 2.5. Tanımlayıcı hiyerarşisi ……….………………………………………….14 Şekil 2.6. PIC18F4550 bacak yapısı …………………………………………..……23 Şekil 2.7. PIC18F4550 saat diyagramı ………………………………….………… 28 Şekil 2.8. POR sıfırlama devresi …………………………………………………... 32 Şekil 2.9. PIC18F4550 program hafızası …………….…..………………………... 34 Şekil 2.10. PIC18F4550 veri hafızası ………………………………..……………. 75 Şekil 2.11. PWM blok diyagramı ..………..………………………………………. 36 Şekil 2.12. A/D dönüştürücü modülü blok diyagramı ...…………………………... 38 Şekil 2.13. A/D dönüştürücü modülü analog giriş modeli …………………………40 Şekil 2.14. A/D dönüşüm TAD zaman diyagramı (ACQT<2:0> = 000, TACQ = 0) ………………………………………... 43 Şekil 2.15. A/D dönüşüm TAD zaman diyagramı (ACQT<2:0> = 010, TACQ = 4 TAD) ………………………………….. 43 Şekil 3.1. Programlama devresi paralel programlama kısmı ……………………… 49 Şekil 3.2. Önyükleme için minimum donanım …….……………………………… 50 Şekil 3.3. Paralel ve USB programlama devresi ………….……………………….. 51 Şekil 3.4. B tipi USB konektör …….……………………………………………… 53 Şekil 3.5. Winpic paralel programlama ayarları ……………….………………….. 56 Şekil 3.6. Wzab2.ini tanımlama dosyası………………….. ………………………. 56 Şekil 3.7. Winpic’de cihaz konfigürasyonu………………………………………... 58 Şekil 4.1. main.c kaynak kodlarının bir bölümü …………………………………... 61 Şekil 4.2. boot.h kaynak kodlarının bir bölümü ……………………………………61 Şekil 4.3. boot.c kaynak kodlarının bir bölümü …………………………………… 63 Şekil 4.4. boot.c kaynak kodlarının bir bölümü …………………………………… 63 ix Şekil 4.5. Uygulama GUI kullanıcı formu ……………….………………………... 64 Şekil 4.6. Uygulama kartı açık devre şeması ……………………………………… 66 Şekil 4.7. Uygulama kartı ……………….………………………………………… 66 x ÇİZELGELER DİZİNİ Çizelge 2.1. USB kronolojisi ……………………………………….……………... 3 Çizelge 2.2. USB ile diğer arabirimlerin karşılaştırılması …………...……………. 5 Çizelge 2.3. PORTA bacak fonksiyonları ..………………………………………...70 Çizelge 2.4. PORTB bacak fonksiyonları ..………………………………………... 71 Çizelge 2.5. PORTC bacak fonksiyonları ..………………………………………... 72 Çizelge 2.6. PORTD bacak fonksiyonları ..………………………………………...73 Çizelge 2.7. PORTE bacak fonksiyonları ..………………………………………... 74 Çizelge 2.8. TAD zamanları için maksimum işlem frekansları …...…………..……. 42 Çizelge 2.9. Bayt yönlendirmeli işlemler komut seti ………………………………93 Çizelge 2.10.Bit yönlendirmeli işlemler, kontrol işlemleri ve sade işlemler komut seti ………………………………………….. 94 Çizelge 2.11.Hafıza işlemleri komut seti ve geliştirilmiş komut seti ……………... 95 Çizelge 3.1. USB bacak tanımlamaları ……..……………………………………... 53 xi ATATÜRK ÜNİVERSİTESİ FEN BİLİMLERİ ENSTİTÜSÜ Y.LİSANS TEZİ PIC18F4550 MİKRODENETLEYİCİSİ İLE USB-PC VERİ AKTARIM ARABİRİMİ GERÇEKLENMESİ Adil Fatih KİREMİTCİ ELEKTRİK VE ELEKTRONİK MÜHENDİSLİĞİ ANABİLİM DALI ERZURUM 2007 Her hakkı saklıdır. Yrd.Doç.Dr. Tevhit KARACALI danışmanlığında, Adil Fatih KİREMİTCİ tarafından hazırlanan bu çalışma 22/08/2007 tarihinde aşağıdaki jüri tarafından. Elektrik ve Elektronik Mühendisliği Anabilim Dalı’nda Yüksek Lisans tezi olarak kabul edilmiştir. Başkan : Doç. Dr. İrfan KAYMAZ İmza : Üye : Yrd. Doç. Dr. Tevhit KARACALI İmza : Üye : Yrd. Doç.Dr. Birol SOYSAL İmza : Yukarıdaki sonucu onaylarım Prof.Dr. Mehmet ERTUĞRUL Enstitü Müdürü 1 1. GİRİŞ Elektronik ve bilgisayar endüstrisindeki gelişmeler, günlük hayatta kullandığımız birçok cihazın daha hızlı, daha güvenilir ve daha kullanışlı olmasını gerektirmektedir. Bu amaç doğrultusunda mikrodenetleyici olarak tanımlanan küçük bilgisayarlardan oldukça sık yararlanılmaktadır. Özellikle elektronik ölçme ve enstrumasyon alanında bilgisayar ve mikrodenetleyici destekli cihazların sayısı her geçen gün artmaktadır. Bilgisayar kullanan her kullanıcı yazıcı, fare, klavye, modem, tarayıcı, joystick, dijital kamera gibi çevrebirimlerini sıklıkla kullanmaktadır. Bunun yanı sıra bilgisayar kontrolü gerektiren bilimsel çalışmalarda arabirim desteği önemli bir problem olarak görülmektedir. USB (Universal Serial Bus) protokolünün teknolojinin kullanımına sunulmasıyla bu sıkıntılar önemli ölçüde azaltılmıştır. Bu çalışmada, PIC (Peripheral Interface Controller) mikrodenetleyicilerin diğer mikrodenetleyicilere ve USB iletişimin paralel ve seri iletişime olan üstünlükleri bir araya getirilmiştir. USB protokolünün temelleri, kullanılan PIC18F4550 mikrodenetleyicisinin özellikleri ve uygulamaları ayrıntılı olarak ele alınacaktır. 1.1. Çalışmanın Amacı ve Kapsamı Bu çalışmanın amacı, özellikle enstrumantasyon alanında çevrebirimlerden alınan verilerin USB portu üzerinden bilgisayara hızlı ve güvenli bir biçimde aktarımını sağlamaktır. Microchip firmasının üretmiş olduğu PIC mikrodenetleyicilerden PIC18F4550, USB destekli üretilmiş bir mikrodenetleyici olup alınan sinyallerin işlenerek USB aracılığıyla bilgisayara gönderilmesi işlevini yerine getirmesi amacıyla kullanılmıştır. Özellikle analog sinyallerin dijitale çevrilerek bilgisayar ortamında kullanıcıya görsel bir şekilde sunulması için Visual Basic programlama dili ile yazılmış bir arayüz tesis edilmiştir. 2 1.2. Çalışmanın Anahatları Bu çalışma; giriş, kuramsal temeller, materyal ve yöntem, uygulama ve sonuç olmak üzere beş ana bölümden oluşmaktadır. Bölüm 2’de, USB seçiminin nedenleri, USB protokollerinin temelleri, PIC mikrodenetleyici seçiminin nedenleri, PIC18F4550 mikrodenetleyicisinin özellikleri ve PIC18F4550 A/D dönüştürücü modülü hakkında bilgi verilmektedir. Bölüm 3’te, PIC18F4550 mikrodenetleyicisi için geliştirilen programlama devresinin donanım ve yazılım kısımları hakkında ayrıntılı bilgi verilmektedir. Bölüm 4’te, uygulama için hazırlanan yazılım ve donanım yapılandırmaları anlatılmaktadır. Uygulama devresinin özellikleri, C dilinde yazılan programlar, PIC tarafında yazılan komutlar hakkında bilgi verilmektedir. Bölüm 5’te, uygulamanın değerlendirilmesi ve tez uygulamasının pratikte kullanılması ile ilgili bazı hususlar ve son olarak uygulamanın geliştirilmesi ile ilgili düşünceler hakkında bilgi verilmektedir. 3 2. KURAMSAL TEMELLER 2.1. USB 2.1.1. Giriş USB, Evrensel Seri Yol, bilgisayarlara çeşitli çevrebirimlerin takılabilmesi için geliştirilmiş bir veri yolu standardıdır. Bilgisayar endüstrisinin ileri gelen firmalarından Compaq, HP, IBM, Intel ve Microsoft firmaları tarafından Kasım 1994’de 0,7 sürümü ile başlayan süreç, Nisan 2000’de 2,0 sürümü ile devam etmiştir. USB’nin kısa tarihçesi Çizelge 2.1’de özet olarak gösterilmiştir (Axelson 2005). Çizelge 2.1. USB kronolojisi Sürüm Tarih 0,7 11 Kasım 1994 0,8 30 Aralık 1994 0,9 13 Nisan 1995 0,99 25 Ağustos 1995 1,0 FDR 13 Kasım 1995 1,0 15 Ocak 1996 1,1 23 Eylül 1998 2,0 (0.79 tasarısı) 5 Ekim 1999 2,0 (0.9 tasarısı) 21 Aralık 1999 2,0 27 Nisan 2000 USB’nin kullanım alanlarının başında ölçme ve kontrol gelmektedir. USB, kullanıcıya ve tasarımcıya sağladığı avantajları ile günümüz teknolojisinin vazgeçilmez veri yolu standartlarından biri olmuştur. USB tasarımının 127 adet çevrebirimin bağlanabilmesine 4 izin vermesi ve diğer avantajları göz önüne alındığında bu proje için en uygun veri yolu standardı olarak karşımıza çıkmıştır. USB’nin kullanıcıya sağladığı avantajlar: • Kullanım kolaylığı: USB’nin tasarımındaki başlıca neden kullanım kolaylığıdır. Otomatik tespit etme, tak çalıştır özelliği ile ayar gerektirmemesi, istenildiği anda takılıp sökülebilmesi ve harici güç kaynağı gerektirmemesi gibi özellikleriyle kullanıcıya kullanım kolaylığı sağlamaktadır. • Güvenilirlik: USB’nin güvenilirliği donanım tasarımından ve transfer protokollerinden kaynaklanır. Programlamaya ya da manüel bir müdahaleye gerek kalmadan hatalar tespit edilerek, vericiyi yeniden gönderim yapabileceği konusunda bilgilendirmektedir. • Maliyet: Önceki arabirimlerden daha kompleks bir yapıya sahip olmasına rağmen, USB’nin devre elemanları pahalı sayılmazlar. Özellikle düşük hız gerektiren cihazlar için son derece düşük maliyetlerle çalışmak mümkündür. • Esneklik: USB, dört transfer tipi ve üç farklı hızı ile birçok cihaz için uygulanabilirlik kazanmaktadır. USB sayesinde transferler gerçek zamanlara yakın düzeyde gerçekleşir. USB protokolünde diğer iletişim standartlarından farklı olarak sinyallere fonksiyonlar yüklenmez. • Güç Tüketimi: USB harici bir güç kaynağı gerektirmez. Tasarruflu devreler ve kodlar yardımıyla kullanılmayan cihazların gücü kesilir ve uyku moduna alınır. • Hız: USB, geleneksel seri ve paralel iletişime oranla çok daha yüksek bir veri iletişimi sağlamaktadır. USB üç hızı destekler: Yüksek hız (480Mb/s), Tam hız (12Mb/s) ve 5 Düşük Hız (1,5Mb/s). Çizelge 2.2’de çeşitli arabirimlerle USB’nin hız karşılaştırılması gösterilmiştir: Çizelge 2.2. USB ile diğer arabirimlerin karşılaştırılması (Axelson 2005) Arabirim Format Cihaz sayısı (max.) USB asenkron Seri 127 RS–232 (EIA/TIA–232) asenkron Seri 2 RS–485 (EIA/TIA–485) asenkron Seri asenkron seri infrared senkron Seri IrDA Microwire 32 Hız (max.) bit/saniye 1,5M, 12M, 480M 20K (115K bazı cihazlarda) 10M Kullanım Fare, klavye, modem, audio vb. Modem, fare, enstrumantasyon Veri toplama ve kontrol sistemi 2 115K Yazıcı, dizüstü 8 2M Mikrodenetleyici haberleşmesi SPI senkron Seri 8 2,1M Mikrodenetleyici haberleşmesi I 2C senkron Seri 40 3,4M Mikrodenetleyici haberleşmesi IEEE–1394 (FireWire) Seri 64 400M (IEEE– 1394b için 3,2G) Video, toplu kayıt IEEE–488 (GPIB) Paralel 15 8M Enstrumantasyon Seri seri akım döngüsü Paralel 1024 10M/100M/1G 2 31,5K 2 8M Ethernet MIDI Paralel printer port PC Network Müzik, görüntü kontrolü Yazıcı, tarayıcı, disk sürgüleri USB’nin tasarımcıya sağladığı avantajlar: • İşletim Sistemi Desteği: USB’ye destek veren bir sitemin üç asgarisi vardır: Sisteme takılan/sökülen cihazı algılamak, takılan cihazlarla haberleşmek ve son olarak yazılım sürücülerinin ve uygulamaların USB ile senkronize çalışmasını sağlamaktır. 6 • Çevrebirim Desteği: USB’li cihazların donanımında bir kontrolör bulunur, istekleri yanıtlamak ise çevrebirimine düşer. • USB–IF Forum: USB–IF kâr amaçlı olmayan, bilgi, yazılım ve donanım aletleri ile test olanakları sağlayan bir kuruluştur. USB’nin gerek kullanıcıya gerekse tasarımcıya sağladığı avantajların yanı sıra dezavantajlarından da kısaca bahsetmek gerekir. Bu dezavantajlar kullanıcı ve tasarımcı açısından maddeler halinde aşağıdaki gibi sıralanabilir: • Kullanıcıya yönelik sorunlar: Eski donanımlar ve işletim sistemleriyle uyumlu olmaması en temel handikaptır. Bundan başka, hız ve mesafe sınırlamaları nedeniyle USB kullanımı bazı durumlarda pratik olmamaktadır. • Eski Donanımlarla Uyumsuzluk: Eski donanımlarda USB portu yoktur. USB olmayan bir cihazı USB porta bağlamanın yollarından biri konvertör kullanmaktır. Ancak bu çözüm sadece konvertör sürücüsünün tanıdığı konvansiyonel protokollerin kullanıldığı çevrebirimlerinde olumlu sonuç verir. • Sürat Limitleri: USB çok yönlü bir arabirim olmasına rağmen, USB ile her şeyi halletmeye çalışmak doğru değildir. Çizelge 2.1’e göre rakibi FireWire’dır. Yüksek hızlı USB, IEEE–1394 ile yarışabilirken IEEE–1394b ile yarışabilecek bir seçenek sunamamaktadır. Ancak FireWire’a göre yavaş olmasına rağmen daha ucuz olması USB’nin bir avantajı olarak görülebilir. • Mesafe Sınırlamaları: USB masaüstü yol olarak tasarlanmıştır. USB için kablo boyu 5 metreye kadar çıkabilir. Oysa RS–232, RS–485 veya Ethernet daha büyük mesafelere izin verir. Bununla birlikte beş adet göbek (hub) kullanarak mesafeyi 30 metreye çıkarmak olanaklıdır. 7 • Cihazlar Arası Haberleşme: Masaüstü tasarımın bir sonucu haberleşmenin karargâh tarafından denetlenmesidir. Yani cihazlar doğrudan haberleşemezler. • Tasarımcıya yönelik sorunlar: Programlamanın karmaşıklığı başlıca handikaptır. Gerek PC’nin ve gerekse cihazın donanımında gözden kaçan noktalar (bug’lar) ciddi sorunlar yaratır. • Protokolün Karmaşıklığı: USB çevrebiriminin programlanması, protokoller hakkında ayrıntılı bilgi sahibi olmayı gerektirir. Haberleşmenin büyük kısmı yonga tarafından otomatik olarak halledilir. Ancak sürücü yazanlar, protokolleri ve sürücünün işlevini iyice anlamış olmaları gerekmektedir. • İşletim Sistemi Desteğinin Artırılması: Windows sınıf sürücüleri, uygulamaların cihazlarla haberleşmesini sağlar. Cihaz bu sürücülerle çalışmadığı takdirde bir sürücü yazma problemi ortaya çıkabilir. • Donanım Sorunları (Bug’lar): İlk karargâh denetleyicilerinin donanımları sorunlu olabiliyordu ve aynı şekilde çevrebirimlerinde de sorunlarla karşılaşılabiliyordu. Bundan kaçınmanın en iyi yolu donanım seçiminde gereken dikkati göstermek ve son bilgileri elde etmektir. • Bedeller: USB–IF tarafından sunulan belirtim (spesifikasyon), web sitesinden ücretsiz olarak alınabilir ve USB yazılımı geliştirmek için lisans bedeli ödemek gerekmez. Ancak USB arabirimi satışlarında durum farklıdır. Belirli bir Üretici Kimliğine sahip olmayı gerektirir ve bunun da belli bir bedeli vardır (Axelson 2005). 8 2.1.2. USB protokolü USB seri, paralel vb. gibi diğer arabirimlere göre daha karmaşık bir iletişim protokolüne sahiptir. Bu yüzden USB arabirimi ile dizayn edilecek bir cihazın belirli gereksinimlerinden söz edilecektir. 2.1.2.a. USB bileşenleri USB’nin başlıca bileşenleri şunlardır: • USB Karargâhı (Host): USB karargâh platformu, USB karargâh denetleyicisinin kurulduğu yer ile alıcı yazılım/cihazın çalıştığı yerdedir. USB Karargâh Denetleyicisi, karargâh ile USB çevrebirimleri arasında bir arabirimdir. Karargâh; USB cihazların takılıp sökülmesi, karargâh ile cihazlar arasındaki veri akışının ve kontrolünün yönetimi, takılan cihazlara güç sağlanması ve daha birçok işlemi yürütmekle görevlidir. • USB Göbek (Hub): Birçok USB cihazın tek bir USB portuna takılarak, USB karargâhıyla haberleşebilmesi için kullanılan cihazlara göbek (hub) denir. Karargâhın arka alanında bulunan göbekler kök göbek (root hub) olarak adlandırılır. Diğer göbekler ise harici göbekler (external hubs) olarak adlandırılır. • USB Cihaz (Device): USB yolu üzerinden veri ya da kontrol bilgisi ileten veya alan aygıtlara USB cihaz adı verilir (Şahin vd 2006). 2.1.2.b. USB cihazlarda veri akışı USB, karargâhla cihazların birbirleri arasında haberleşebilmeleri için bir protokol sağlar. Karargâh belirli bir zamanda sadece bir USB cihazı ile haberleşebilir, yani aynı anda birden çok cihazla haberleşme durumu söz konusu değildir. USB cihazların 9 karargâhla olan haberleşmeleri, karargâh üzerindeki yazılım hafıza tamponları ile cihazların son uçları arasına kurulan sanal borular yordamıyla birebir gerçekleştirilir. USB yolundaki veri akışı yarı çift-yönlüdür (half-duplex), yani belirli bir zaman zarfında veri sadece bir yönde taşınabilir (Tan 1997). Büyük USB borusu (12 Mb/s) USB Karargâh Küçücük borular Son uçlar Bağlanacak her USB cihaz için küçük borular (maksimum 127 adet) USB Cihaz Şekil 2.1. USB boruları ve son uç kavramı (Tan 1997) Şekilde, USB karargâhının kendisine bağlanacak USB çevrebirimlerinin her birine (127 adete kadar) küçük borular gönderdiği şematiksel olarak gösterilmiştir. USB alıntısı (token) içerisinde 7 adet adres bit’i bulunmaktadır. Ancak, USB varsayılan (default) adresi olarak adlandırılan, 0000 000B adresi yeni takılan her aygıt için onu yapılandırmak ve kontrol etmek için kullanılır. Şekil 2.1.’de gösterilen her küçük boru, 16 çift (16 adet IN ve 16 adet OUT) toplamda 32 küçücük boruya (son uç) kadar ayrılabilir. Küçük borular, duraksız (stream) ve mesaj (message) boruları olmak üzere iki çeşittir. Duraksız borular eşzamanlı, kesme ve yığın tipi veri iletişiminde kullanılırken, mesaj boruları sadece kontrol veri iletişiminde kullanılır. Her USB alıntısı 4 adet son uç bitine sahiptir ve bu alıntı IN (giriş) veya OUT (çıkış) alıntısı olarak tanımlanır. Eğer bir USB cihazı; karargâhtan bir IN alıntısı alırsa, karargâha veri gönderecektir, karargâhtan OUT alıntısı alırsa, karargâh veri gelmesini bekleyecektir (Tan 1997). 10 USB Alıntısı (Token) PC USB Karargahı — Hedef cihaz adresi — Son uç numarası — Veri iletişim yönü USB Cihaz Şekil 2.2. USB veri hareketi Son uç, karargâhla cihaz arasında yapılan haberleşmede veri akışının kaynak tarafında ya da sonlanma tarafında bulunan bir tampon olarak düşünülebilir. Her USB cihazı birbirinden bağımsız son uç koleksiyonlarından oluşur. USB’nin tüm hız opsiyonları için (düşük, tam ve yüksek) bir çift-yönlü kontrol son uç (Son Uç 0) ve 15 tek yönlü son ucu destekler. Her tek-yönlü son uç gelen veya giden transfer işleminde kullanılabilir. 2.1.2.c. USB veri transfer tipleri USB cihaz, karargâh üzerindeki hafıza tamponu ile cihaz üzerindeki son uç arasındaki boru üzerinden karargâh ile haberleşir. USB spesifikasyonu dört veri transfer tipini desteklemektedir. Belirli bir son uç için veri transfer tipi seçimi cihazın ve yazılımın gereksinimlerine göre seçilmektedir. Bu seçim son uç tanımlayıcıda seçilmektedir (Axelson 2005). Eşzamanlı (Isochronous) transfer Büyük miktarlardaki verinin (1023 bayt’a kadar), bilgisayar ile çevrebirim arasında periyodik ve sürekli bir şekilde iletilmesini sağlayan transfer tipidir. Zaman açısından kritik olan ama hataya karşı hassas olmayan akan veri (streaming data) iletiminde kullanılır. Örneğin USB kamera ya da ses kartları gibi. Sabit bir bant genişliği sağlanarak küçük hatalara izin verilirken veri akışının kesilmemesi sağlanır. 11 Eşzamanlı borusu tek yönlü bir borudur, yani belirli bir son uç sadece veri iletir veya veri alır. İki yönlü bir eşzamanlı iletişim isteniyorsa, her iki yön için birer adet son uç kullanılmalıdır (Axelson 2005). Yığın (Bulk) tipi transfer Yığın tipi transfer ise büyük miktarlardaki verinin aktarımı için kullanılan bir veri transfer tipidir. Taşınacak verinin alıcı kısmında doğru bir biçimde alınması garanti edilirken, verinin iletim zamanı konusunda garanti verilemez. Tipik olarak, yazıcı ve tarayıcı haberleşmesinde yığın tipi iletişim kullanılır. Diğer akış borularında olduğu gibi, yığın boruları da tek yönlüdür, yani çift yönlü bir yığın iletişimi için iki adet yığın son ucuna ihtiyaç vardır. Yığın tipi iletişim diğer iletişim tiplerinden farklı olarak sadece tam-hız ve yüksek-hız USB cihazlarda kullanılabilir. Yığın son uçları için maksimum veri paketi boyutu, tam hızlı cihazlar için 8, 16, 32 veya 64 bayt, yüksek hızlı cihazlar için ise sadece 512 bayttır (Axelson 2005). Kesme (Interrupt) tipi transfer Ani reaksiyon gerektiren fare ya da klavye ile iletişimde kullanılır. Diğer veri transferlerine göre daha düşük miktarlardaki verinin, zaman ve verinin doğruluğu garanti altına alınarak iletilmesi için kullanılır. Örneğin, bilgisayara bağlı bir fare ile yapılan veri iletişiminde kullanılabilir. Kesme borusu da eşzamanlı boru gibi tek yönlü ve periyodik bir borudur. Kesme son uçları için maksimum veri paketi boyutu, düşük hızlı cihazlar için 8 bayt veya daha az, tam hızlı cihazlar için 64 bayt veya daha az ve yüksek hızlı cihazlar için ise sadece 1,024 bayt veya daha azdır (Axelson 2005). 12 Kontrol (Control) tipi transfer PC ile USB arasında kurulum, ilk değerlerin atanması ve konfigürasyon bilgilerinin taşınmasında kullanılır. Bu bilgiler önemli olduğundan CRC denilen kontrol kodları eklenir. Kontrol borusu çift-yönlü bir boru olup, her iki yönde veri akışını desteklemektedir. Kontrol son uçları için maksimum veri paketi boyutu, düşük hızlı cihazlar için 8 bayt, tam hızlı cihazlar için 16, 32 veya 64 bayt ve yüksek hızlı cihazlar için ise sadece 64 bayttır. 1400 1216 1200 1000 1023 832 800 Tam Hız KByte/s 600 Düşük Hız 400 200 24 64 0,8 0 Kontrol Kesme Yığın Eşzamanlı Şekil 2.3. USB veri iletişim tiplerinin teorik olarak taşıyabilecekleri maksimum veri büyüklüğü USB veri iletişim tiplerinin taşıyabilecekleri veri miktarı açısından karşılaştırılması Şekil 2.3’te grafiksel olarak verilmiştir (Axelson 2005). 2.1.2.d. USB sürücüleri Win32 sürücü modeli (WDM, Win32 Driver Model) Windows sürücü sisteminin temelini oluşturur. Bu modelde donanım ile iletişim işlemi çeşitli katmanlara ayrılmıştır. Uygulama katmanında yazılım ile ilgilenenlerin tanıdığı API (Application Program Interface) çağrıları yer alır. API çağrıları WDM içerisinde yer alan hazır tanımlanmış sınıfları ya da kullanıcının tanımlamış olduğu sürücü fonksiyonlarını 13 çağırır. Buradan da daha alt seviye giriş-çıkış istek paketleri (I/O request packets, IRP) kullanarak gerçekleştirilir. Bir alt kademede bulunan USB yol sürücüsü ise USB cihazlarına ilişkin güç, sayma (enumeration) ve çeşitli bilgi alışverişi işlemlerini meydana getirir. Daha aşağıdaki USB denetleyici sürücüsü ise bilgisayar içerisindeki USB donanımına doğrudan erişimi sağlar. Bu sürücüler Windows içerisinde mevcuttur (Soydaş 2002). Uygulama Kodu Kullanıcı Tanımlı Sürücüler Sınıf Sürücüleri USB Yol Sürücüsü USB Denetleyici Sürücüsü USB Donanımı Şekil 2.4. USB sürücü modeli 2.1.2.e. USB konfigürasyonu Bir USB fonksiyonu başlatılmadan önce, cihaz konfigürasyonu yapılmalıdır. Karargâh, yapılandırmayı, USB cihaz üzerinden veri sağlama yoluyla almış olduğu bilgilerle gerçekleştirir. USB cihazlar, işlevlerini tanımlayıcılar (decriptors) ile karargâha rapor ederler. Tanımlayıcı, hangi verinin hangi formatta transfer edileceğini belirtir. USB tanımlayıcılar hiyerarşik bir yapı içerisinde dört kısımda incelenebilir: • Cihaz tanımlayıcıları 14 • Konfigürasyon tanımlayıcıları • Arabirim tanımlayıcıları • Son uç tanımlayıcıları Her USB cihaz için sadece bir adet cihaz tanımlayıcısı vardır. Şekil 2.5’te gösterildiği gibi her cihaz bir veya daha çok konfigürasyona, her konfigürasyon bir veya daha çok arabirime ve her arabirim sıfır veya daha çok son uca sahiptir (Microchip Technology Inc. 2004). Cihaz Tanımlayıcı Konfigürasyon Tanımlayıcı Arabirim Tanımlayıcı Son Uç Tanımlayıcı Konfigürasyon Tanımlayıcı Arabirim Tanımlayıcı Son Uç Tanımlayıcı Şekil 2.5. Tanımlayıcı hiyerarşisi Cihaz tanımlayıcısı Cihaz tanımlayıcısı, üretici kimliği (VID, Vendor Identity), ürün kimliği (PID, Product Identity), seri numarası, cihaz sınıfı ve konfigürasyon sayısı gibi genel bilgiler verir. Daha önce de belirtildiği gibi her cihaz için sadece bir cihaz tanımlayıcı vardır. 15 Konfigürasyon tanımlayıcısı Konfigürasyon tanımlayıcı, cihazın güç gereksinimleri ve belirli bir konfigürasyonda kaç farklı arabirimin destekleneceği bilgilerini verir. Bir cihaz için birden fazla konfigürasyon olabilir, örneğin düşük-güç ve yüksek-güç konfigürasyonu gibi. Arabirim tanımlayıcısı Arabirim tanımlayıcısı, arabirimin sınıfı yanında arabirimde kullanılacak son uç sayısının detaylarını da verir. Bir konfigürasyon için birden fazla arabirim olabilir. Son uç tanımlayıcısı Son uç tanımlayıcı, son ucun transfer tipi ve yönü ile diğer spesifik özelliklerini verir. Bir USB cihazı birçok son uca sahip olabileceği gibi, son uçlar farklı konfigürasyonlar tarafından paylaşılmış olabilir. 2.2. PIC Mikrodenetleyiciler 2.2.1. PIC nedir? Microchip Technology firması tarafından üretilen mikrodenetleyici yongaları PIC “Çevresel Arabirim Denetleyicisi” olarak adlandırılmaktadır ve programlanabilen arabirim kontrolörü olarak görev yapmaktadır. İlk olarak 1994 yılında 16 bitlik ve 32 bitlik büyük işlemcilerin giriş ve çıkışlarındaki yükü azaltmak ve denetlemek amacıyla çok hızlı ve ucuz bir çözüme ihtiyaç duyulduğu 16 için geliştirilmiştir. Çok geniş bir ürün ailesinin ilk üyesi olan PIC16C54, bu ihtiyacın ilk meyvesidir. PIC mikrodenetleyiciler hızlı çalışmaları amacıyla RISC (Reduced Instruction Set Computer) işlemciler olarak tasarlanmışlardır. Bu mimari biçiminde program kodları ve veriler farklı bellek blokları içerisinde bulunmaktadır. Her bir komut çevriminde hem program hem de veri hücresine erişilebilmektedir. Bu nedenle işlem hızı yüksektir. RISC işlemcilerde bir komutun icra edilmesi için 1 dâhili saat çevrimi gerekir. Yazılan programların verileri işlemesi için çok az sayıda komut gerekir (Şahin vd 2006). 2.2.2. Neden PIC? PIC mikrodenetleyicilerinin tercih edilmesi noktasında, PIC’lerin diğer mikrodenetleyicilere göre olan avantajları göz önüne alınmıştır. Bu avantajlar maddeler halinde incelenmiştir: • Kod verimliliği: PIC, Harvard mimarisi temelli 8 bit'lik bir mikrodenetleyicidir. Bu, bellek ve veri için ayrı yerleşik bus'ların bulunduğu anlamına gelir. Böylelikle akış miktarı veriye ve program belleğine anında erişim sayesinde arttırılmış olur. Geleneksel mikrodenetleyicilerde veri ve programı taşıyan bir tek yerleşik bus bulunur. Bu, PIC ile karşılaştırıldığında işlem hızını en az iki kat yavaşlatır. • Güvenilirlik: Tüm komutlar 12 veya 14 bitlik bir program bellek sözcüğüne sığar. Yazılımın, programın veri kısmına atlamaya ve veriyi komut gibi çalıştırmasına gerek yoktur. Bu 8 bit'lik bus kullanan ve Harvard mimarisi temelli olmayan mikrodenetleyicilerde gerçekleşmektedir. • Komut Seti: 1980’lerin başından itibaren kullanılan RISC mimarisine sahip olmaları nedeniyle, çok az sayıda ve basit komutlar kullanıldığından öğrenilmesi kolay mikrodenetleyicilerdir. 17 • Hız: PIC’ler oldukça hızlı mikrodenetleyicilerdir. Her bir komut döngüsü sadece 1ms’lik zaman zarfında gerçekleştirilebilmektedir. Örneğin 5 milyon komutluk bir programın, 20 MHz bir kristalle adımlanması yalnızca 0,25 saniye sürer. Bu süre 386 SX 33 işlemcisinin hızının neredeyse iki katıdır. • Statik İşlem: PIC tamamıyla statik bir mikrodenetleyicidir. Başka bir deyişle saati durdurduğunuzda, tüm kaydedici içeriği korunur. Pratikte bunu tam olarak gerçekleştirmeniz mümkün değildir. PIC' i uyutma moduna getirdiğinizde, saat durur ve PIC' e uyutma işleminden önce hangi durumda olduğunu size hatırlatacak çeşitli bayraklar kurar. PIC uyuma modunda yalnızca 1 mA'dan küçük değere sahip bekleme akımı çeker. • Yazılım: PIC mikrodenetleyicileri programlamak için gerekli yazılım Microchip firması tarafından internet vasıtasıyla ücretsiz olarak sağlanmaktadır. Bunun yanı sıra Basic ve C dili benzeri (PicBasic, Pic–C, JAL vb.) dillerle programlanabilmeleri nedeniyle karmaşık sistem dizaynında programlamayı kolaylaştırmaktadırlar (Kızılbey 2005). PIC mikrodenetleyicilerinin bu avantajlarının yanı sıra kolay bulunabilmeleri, ucuz olmaları, geniş bir kullanıcı kitlesinin bulunması nedeniyle bol miktarda örnek programın internet aracılığıyla paylaşılması, Microchip firmasının web sitesinden elde edilebilecek uygulama kullanılabilmesi gibi programlarının avantajları, bu yazılım geliştirmede projede PIC örnek olarak mikrodenetleyicilerinin kullanılmasındaki diğer etkenler olmuştur. 2.2.3. Neden PIC18F4550? PIC18F4550, Microchip Technology firması tarafından üretilen en gelişmiş mikrodenetleyicilerden biridir. PIC18F Tam Hız ailesi olarak adlandırılan gruptaki 18 PIC18F2455/2550/4455/4550 mikrodenetleyicilerden biri olan PIC18F4550, birçok özelliğiyle kendi üretim grubundaki mikrodenetleyicilerden de üstündür. PIC18F Tam Hız ailesi mikrodenetleyiciler çok geniş bir kullanım alanına sahiptir : • Endüstriyel uygulamalar (üretim cihazları, veri günlükleyicileri, tarayıcılar, akıllı göstergeler, mikro yakıt pilleri, robot kontrolör arabirimleri, endüstriyel zamanlayıcılar, kablo-test cihazları, gaz-akış analizörleri vb.), • Medikal uygulamalar (sese duyarlı uygulamalar, gelişmiş tekerlekli sandalyeler, araştırma cihazları otomasyonu vb.), • Otomotiv uygulamaları (araç arıza tanıma sistemleri, kara kutu uygulamaları, ultrasonik uygulamalar), • Pille çalışan aletler (portatif aletler, sensörler, güvenlik uygulamaları, uzaktan kumanda kontrol sistemleri, ev otomasyonu) • Tüketici elektroniği (elektronik kartvizit tarayıcıları, ses kaydedicileri, UPS sistemleri, MP3 çalarlar, yangın alarm sistemleri, güvenlik sistemi programlayıcıları) (Chandler 2004). USB aracılığıyla veri toplama (data acquisition) amacıyla elektronik piyasasına sürülen PIC18F4550, 48 MHz’lik hızıyla diğer mikrodenetleyicilere göre öne çıkmaktadır. Bunun yanı sıra PIC18F4550’nin USB desteği, çalışma frekans aralığı, haberleşme hızı, hafıza desteği, güç tüketimi, osilatör özellikleri, A/D çevirici desteği gibi avantajları ayrıntılarıyla incelenecektir. USB aracılığıyla veri toplama amaçlı üretilen tek mikrodenetleyici PIC18F4550 değildir. Atmel AVR-USB, Cypress EZ-USB, Cypress EnCoRe II, Freescale MC68HC908JB16, Freescale MCF5482 ColdFire, Microchip 16C745/765 ve Texas Instruments, Silicon Laboratories firmalarının üretmiş olduğu birçok mikrodenetleyici mevcuttur. Ancak bunlardan bazıları USB 2.0 versiyonunu desteklememekte, bazıları hız açısından yetersiz kalmakta, bazıları nispeten pahalı veya PIC kadar yaygın kullanılmayan ürünlerdir. 19 PIC mikrodenetleyicilerinin avantajları ile PIC18F4550’nin avantajları bir araya getirildiğinde, proje için en uygun seçimin PIC18F4550 mikrodenetleyici olduğu sonucuna varılmıştır. 2.3. PIC18F4550 Özellikleri ve Yapısı 2.3.1 PIC18F4550 PIC18F4550 diğer tüm PIC18 ailesi mikrodenetleyicilerinin sahip olduğu gibi ucuz olmasının yanında yüksek hesaplama performansı ile birlikte yüksek dayanıklılığa ve geliştirilmiş Flash program hafızasına sahiptir. Aynı zamanda PIC18F4550’nin dizaynında yapılan geliştirmelerle, yüksek performanslı ve güç hassasiyetli uygulamalarda seçilmesi sağlanmıştır (Microchip Technology Inc. 2004). PIC18F4550 mikrodenetleyicisinin genel olarak özellikleri şu şekilde özetlenebilir (Microchip Technology Inc. 2004): USB Özellikleri • USB 2,0 versiyonu ile uyumludur. • Düşük Hız ve Tam Hız desteğine sahiptir. • Kontrol, Kesme, Eşzamanlı ve Yığın tipi veri transfer tiplerini destekler. • 32 uç noktasına kadar destek verir. (16 iki-yönlü) • USB için çift erişimli 1 Kbayt’lık RAM’e sahiptir. • Yonga üzeri USB alıcı-vericisi ve voltaj regülatörüne sahiptir. • Harici USB alıcı-vericileri için arabirime sahiptir. • USB duraksız transferler için Duraksız Paralel Port’a (SPP) sahiptir. 20 Güç Tasarruf Modları: • Çalışma modu: CPU açık, çevrebirimler açık • Boşta modu: CPU kapalı, çevrebirimler kapalı. • Uyku modu: CPU kapalı, çevrebirimler kapalı. • Boşta modunda çekilen akım tipik olarak 5,8 μA seviyelerindedir. • Uyku modunda çekilen akım tipik olarak 0,1 μA seviyelerindedir. • Timer1 osilatörü: 1,1 μA tipik, 32 kHz, 2 V Esnek Osilatör Yapısı: • Yüksek Duyarlıklı PLL içeren Dört kristal modu. • 48 MHz’e kadar iki farklı Harici Saat modu • Dâhili osilatör bloğu: • 31 kHz – 8 MHz arası kullanıcının seçebileceği frekanslar • Frekans sapmasını kompanze etmek için kullanıcı tarafından ayarlanabilme özelliği • 32 kHz’lik Timer1 kullanılarak oluşturulan ikincil osilatör • Çiftli osilatör seçenekleri, mikrodenetleyici ve USB modülünün farklı saat hızlarında çalışabilmesini sağlar. • Arıza-güvenli saat monitörü, herhangi bir saatin durması halinde güvenli kapanmayı sağlar. Çevrebirim Özellikleri: • Yüksek alıcı/kaynak akımı; 25 mA/25 mA • Üç harici keme • Dört Zamanlayıcı Modülü; Timer0:Timer3 • 2 adet Yakalama (Capture)/Karşılaştırma (Compare)/Darbe Genişlik Modülasyonu (PWM) modülü (CCP) 21 • Geliştirilmiş Yakalama/Karşılaştırma/Darbe Genişlik Modülasyonu modülü (ECCP) • Geliştirilmiş USART (Universal Synchronous Asynchronous Receiver Transmitter/Evrensel Senkron Asenkron Alıcı Verici) modülüne sahiptir. Bu sayede LIN (Local Interconnect Network/Yerel Bağlantılı Ağ) Yol’u destekler. • MSSP (Master Synchronous Serial Port/Ana Senkron Seri Port) modülü 3–tel SPI (Serial Peripheral Interface/Seri Çevrebirim Arabirimi) (dört modun tamamı) ve I2C (Inter–Integrated Circuit) ana–uydu modlarını desteklemektedir. • 13 adet elde etme zamanı programlanabilir 10–bitlik Analog/Dijital çevirici girişine sahiptir. • Giriş çoğullayıcılı çift analog karşılaştırıcıya sahiptir. Özel Mikrodenetleyici Özellikleri: • Genişletilmiş komut setiyle C derleyicileri için mükemmel bir mimariye ulaştırılmıştır. • 100 000 yazma/silme kapasitesine sahip geliştirilmiş Flash program hafızasına sahiptir. • yazma/silme kapasitesine sahip Data EEPROM’a sahiptir. • Flash/Data EEPROM’u 40 senelik uzun bir ömre kadar dayanıklıdır. • Yazılım kontrolü ile kendi kendisini programlayabilme özelliğine sahiptir. • Kesmeler için öncelik seviyelerine sahiptir. • 8 x 8 tek–döngülü donanım çarpanına sahiptir. • İki bacağından verilecek 5 Voltluk tek bir kaynakla ICSP (In-Circuit Serial Programming) sağlanır. • Geniş bir çalışma voltaj aralığına sahiptir. (2,0 V–5,5 V) 2.3.1.a. USB desteği PIC18F4550, USB 2,0 versiyonu ile çalışabilecek şekilde tam donanımlı bir haberleşme modülüne sahiptir. Bu modül, tüm desteklenen veri transfer tiplerinde hem düşük – hız 22 hem de tam–hızda çalışabilecek şekilde dizayn edilmiştir. Kendi üzerindeki USB alıcıvericisi ve 3,3 Volt regülatör ile harici USB alıcı-vericileri ve regülatörleri desteklemektedir. PIC18F4550’nin projede kullanılmasının temel nedeni USB desteğidir. Microchip Technology firması tarafından PIC18F ailesi olarak adlandırılan gruptaki PIC18F2455/2550/4455/4550 tüm mikrodenetleyicilerin USB desteği bulunmaktadır (Microchip Technology Inc. 2004). 2.3.1.b. Çoklu osilatör seçenekleri ve özellikleri PIC18F4550, kullanıcıların uygulama donanımı geliştirme işlemlerinde on iki farklı osilatör seçeneğiyle geniş bir çalışma aralığı sunmaktadır. Bunlar; kristallerle veya seramik rezonatörlerle gerçekleştirilebilecek olan dört kristal modu, dört harici saat modu, 8 MHz’lik dâhili osilatör (±%2 doğruluk), 31 kHz’lik INTRC kaynak, 125 kHz– 4 MHz arasında kullanıcının seçebileceği 6 farklı saat seçeneği, PLL frekans çoğullayıcısı sayesinde 4 MHz–48 MHz arası saat hızına sahiptir. 2.3.1.c. Hafıza özellikleri PIC18F4550 mikrodenetleyicisi 32 kbayt’lık Flash memory’e, 2 kbayt’lık SRAM’e ve 256 bayt’lık EEPROM’a sahiptir. Ayrıca, Microchip Technology firması tarafından geliştirilmiş olan PEEC sayesinde, 100 000 yazma/silme kapasitesine sahip geliştirilmiş Flash program hafızası ve 1 000 000 yazma/silme kapasitesine sahip EEPROM’u ile verileri 40 yıla kadar hafızasında tutabilmektedir. PIC18F4550’nin en önemli avantajlarından biri de 32 kbayt’lık kendisini programlayabilme özelliğine sahip Geliştirilmiş Flash hafızasıdır. Bu sayede USB port üzerinden gerçekleştirilen sonlandırma uygulamalarında alan yükseltmelerine izin verilmiş olur (Microchip Technology Inc. 2004). 23 2.3.2. PIC18F4550 giriş/çıkış portlarının fonksiyonları Şekil 2.6’da gösterildiği gibi PIC18F4550 5 adet giriş/çıkış portuna sahiptir. Birkaç amaç için kullanılan mikrodenetleyici portlarının tümünde hangi amaç için kullanılacaksa bacağı oraya yönlendiren multiplexer (çoklayıcı) bulunmaktadır. Giriş/çıkış portlarının bazı bacakları kullanılan çevrebirimin özelliklerine göre alternatif bir fonksiyonla çoklanabilir. Genel olarak, bir çevrebirim seçilir kılındığında, mikrodenetleyicinin ilgili bacağı artık sadece genel amaçlı bir giriş/çıkış bacağı olmayacaktır (Microchip Technology Inc. 2004). Şekil 2.6. PIC18F4550 bacak yapısı Her port kendi işlemi için üç kaydediciye sahiptir. Bunlar; • Port Kaydedici (denetleyicinin bacaklarındaki seviyeleri okur) • TRIS Kaydedici (veri yönünü belirleyen yazmaçtır) • LAT Kaydedicisi (çıkış mandalı) 24 I/O portlarının tipleri analog, dijital, TTL veya Schmitt Trigger (ST) yapıda olabilir. Schmitt Trigger yapı ile TTL (Transistor-Transistor-Lojik) yapı arasındaki farklar şunlardır: • ST yapılı uçlarda ‘0’dan ‘1’e veya ‘1’den ‘0’a geçiş süresi daha kısadır. Bu nedenle daha yüksek frekanslı veri giriş/çıkışı yapılmasına uygundur. • ST yapılı uçlarda ‘0’ ve ‘1’i belirleyen gerilim aralıkları birbirinden uzaktır. Bir uçtan girilen 0 – 1 Volt arasındaki gerilimler “0”, 4–5,5 Volt arasındaki gerilimler “1” olarak algılanır. • TTL yapılı uçlarda ‘0’dan ‘1’e veya ‘1’den ‘0’a geçiş süresi daha uzundur. • TTL yapılı uçlarda ‘0’ ve ‘1’i belirleyen gerilim aralıkları birbirine daha yakındır. Bir uçtan girilen 0–2 Volt arasındaki gerilimler “0”, 2–5,5 Volt arasındaki gerilimler “1” olarak algılanır. PORTA PORTA, 8–bit genişliğinde hem giriş hem çıkış özelliğine sahip iki–yönlü bir porttur. Hangi bit’in giriş hangi bit’in çıkış olacağı TRISA kaydedicisi tarafından belirlenir. TRISA kaydedicisinde “1” olarak belirlenen bit’lerin karşılığındaki PORTA bacakları giriş, “0” olarak belirlenen bit’lerin karşılığındaki PORTA bacakları çıkış olarak belirlenir. PORTA tamponlanmıştır, yani bir veri gönderilene kadar eski veri PORTA kaydedicisinde tutulur. LATA kaydedicisi de hafıza eşlemelidir. LATA kaydedicisi, PORTA için mandallanmış çıkış verilerini okur ve yazar. RA4 bacağı Timer0 girişi ile çoklanmıştır ve RA4/TOCKI bacağı haline gelmiştir. RA4 aynı zamanda USB modülü ile de çoklanmış olup, harici bir USB alıcı-vericisinden gelen bilgiyi alacak bir alıcı gibi kullanılabilir. Yine RA6 bacağı ana osilatör girişi ile çoklanmış olup, konfigürasyon kaydedicisi vasıtasıyla bir giriş/çıkış bacağı veya ana osilatör girişi olarak seçilebilir. 25 PORTA bacaklarının çoğu, VREF+, VREF- ve karşılaştırıcı referans çıkış voltajı gibi analog girişler olarak kullanılabilmektedir. RA0, RA1, RA2, RA3 ve RA5 bacakları analog/dijital çevirici ile çoklanabilmektedirler. Tüm PORTA bacakları TTL giriş seviyelerine ve tam CMOS çıkış sürücülerine sahiptir. A Portuna ait bacaklar ve işlevleri Çizelge 2.3’te verilmiştir (EK 1). PORTB PORTB, 8–bit genişliğinde hem giriş hem çıkış özelliğine sahip iki–yönlü bir porttur. Hangi bit’in giriş hangi bit’in çıkış olacağı TRISB kaydedicisi tarafından belirlenir. TRISB kaydedicisinde “1” olarak belirlenen bit’lerin karşılığındaki PORTB bacakları giriş, “0” olarak belirlenen bit’lerin karşılığındaki PORTB bacakları çıkış olarak belirlenir. LATB kaydedicisi de hafıza eşlemelidir. LATB kaydedicisi, PORTB için mandallanmış çıkış verilerini okur ve yazar. PORTB bacaklarından dördü (RB4, RB5, RB6 ve RB7) giriş olarak seçildiklerinde kesme değiştirme özelliğine sahip olurlar. RB2 ve RB3 bacakları harici USB alıcıvericileri için fark sinyali çıkışları olarak çoklanmışlardır. RB4 bacağı aynı zamanda Duraksız Paralel Port için yonga seçim fonksiyonu (CSSPP) olarak çoklanmıştır. B Portuna ait bacaklar ve işlevleri Çizelge 2.4’te verilmiştir (EK 2). PORTC PORTC 8–bit genişliğinde hem giriş hem çıkış özelliğine sahip iki–yönlü bir porttur. Hangi bit’in giriş hangi bit’in çıkış olacağı TRISC kaydedicisi tarafından belirlenir. TRISC kaydedicisinde “1” olarak belirlenen bit’lerin karşılığındaki PORTC bacakları giriş, “0” olarak belirlenen bit’lerin karşılığındaki PORTC bacakları çıkış olarak 26 belirlenir. LATC kaydedicisi de hafıza eşlemelidir. LATC kaydedicisi, PORTC için mandallanmış çıkış verilerini okur ve yazar. PORTC öncelikle EUSART, MSSP ve USB modüllerini de içine alan seri haberleşme modülleri ile kullanılmak üzere çoklanmıştır. RC4 ve RC5 bacakları dışında PORTC Schmitt Trigger giriş tamponları kullanır. RC4 ve RC5 bacakları USB modül ile çoklanmıştır. USB modülünün konfigürasyonuna bağlı olarak, entegre üzerindeki USB alıcı-vericisi için fark veri hatları olarak ya da harici bir USB alıcı-vericiden gelen veri girişleri olarak kullanılabilirler. RC4 ve RC5 diğer PORTC bacaklarından farklı olarak TTL giriş tamponlarına sahiptirler ve aynı zamanda TRISC bitleriyle durum değiştirmezler. Dijital portlar gibi sadece dijital giriş olarak kullanılırlar. USB işlemi için yapılandırıldıklarında; veri yönü, konfigürasyon tarafından ve USB modülünün belirlenen bir zamandaki durumuna göre belirlenir. Eğer harici bir USB alıcı-verici kullanılmışsa, RC4 ve RC5 her zaman vericiden gelen girişler olarak görev yaparlar. Eğer entegre üzerindeki alıcı-verici kullanılmışsa, veri yönü USB modülü tarafından işlemin gerçekleştirildiği anda belirlenir. C Portuna ait bacaklar ve işlevleri Çizelge 2.5’te verilmiştir (EK 3). PORTD PORTD, 8–bit genişliğinde hem giriş hem çıkış özelliğine sahip iki–yönlü bir porttur. Hangi bit’in giriş hangi bit’in çıkış olacağı TRISD kaydedicisi tarafından belirlenir. TRISD kaydedicisinde “1” olarak belirlenen bit’lerin karşılığındaki PORTD bacakları giriş, “0” olarak belirlenen bit’lerin karşılığındaki PORTD bacakları çıkış olarak belirlenir. LATD kaydedicisi de hafıza eşlemelidir. LATD kaydedicisi, PORTD için mandallanmış çıkış verilerini okur ve yazar. 27 PORTD’ye ait tüm bacaklar Schmitt Trigger giriş tamponları ile gerçekleştirilmiştir. Her bacak giriş veya çıkış olarak ayrı ayrı yapılandırılabilir. PORTD bacaklarından üçü (RD5, RD6 ve RD7) Geliştirilmiş CCP (Capture/Compare/PWM) modülünün çıkışları ile çoklanmışlardır. PORTD aynı zamanda 8–bit genişliğinde Duraksız Paralel Port (Streaming Paralel Port, SPP) olarak yapılandırılabilir. Bu moda, giriş tamponları TTL’dir. D Portuna ait bacaklar ve işlevleri Çizelge 2.6’da verilmiştir (EK 4). PORTE PORTE, 4–bit genişliğinde bir porttur. Üç bacağı (RE0, RE1 ve RE2) ayrı ayrı giriş veya çıkış olarak yapılandırılabilir. Bu üç bacak Schmitt Trigger giriş tamponlarına sahiptir. Bu bacaklar analog giriş olarak seçildiklerinde ‘0’ları okuyacaklardır. Hangi bit’in giriş hangi bit’in çıkış olacağı TRISE kaydedicisi tarafından belirlenir. TRISE kaydedicisinde “1” olarak belirlenen bit’lerin karşılığındaki PORTE bacakları giriş, “0” olarak belirlenen bit’lerin karşılığındaki PORTE bacakları çıkış olarak belirlenir. TRISE RE bacakları analog girişler olarak kullanıldıklarında yönlerini kontrol eder. LATE kaydedicisi de hafıza eşlemelidir. LATE kaydedicisi, PORTE için mandallanmış çıkış verilerini okur ve yazar. PORTE’nin dördüncü bacağı (MCLR/VPP/RE3) sadece giriş bacağıdır. Bu bacağın işlevi MCLRE kontrol biti tarafından kontrol edilir. Eğer MCLRE = 0 seçilirse bu bacak dijital giriş olur ve TRIS veya LAT kaydedicilerinin bitlerine sahip olmaz, MCLRE = 1 seçildiğinde ise görevi cihazın Master Clear (Ana Temizleme) girişi olur. Her iki konfigürasyonda da, RE3 aynı zamanda programlama esnasında programlama voltaj girişi olarak görev yapar (Microchip Technology Inc. 2004). E Portuna ait bacaklar ve işlevleri Çizelge 2.7’de verilmiştir (EK 5). 28 2.3.3. PIC18F4550 osilatör özellikleri PIC18F4550’nin de içinde bulunduğu PIC18F Tam Hız ailesi, daha önceki PIC18F tipi cihazlardan farklı bir osilatör ve mikrodenetleyici saat sistemine sahiptirler. USB modülünün eklenmesiyle, USB alçak-hız ve tam-hız için dengeli bir saat kaynağına ihtiyaç duyulmuştur. Bu gereksinimleri karşılamak üzere, PIC18F4550 ve içinde bulunduğu ailedeki tüm mikrodenetleyicilere, USB tam-hız işlemini gerçekleştirebilecek 48 MHz bir saat kısmı eklenmiştir. Diğer tüm osilatör özellikleri PIC18 geliştirilmiş mikrodenetleyicilerindekilerle aynı bırakılmıştır. Şekil 2.7’de PIC18F4550’nin saat diyagramı görülmektedir (Microchip Technology Inc. 2004). Şekil 2.7. PIC18F4550 saat diyagramı (Microchip Technology Inc. 2004) 29 2.3.3.a. Osilatör kontrolü PIC18F4550’nin osilatörü iki konfigürasyon kaydedicisi (CONFIG1L ve CONFIG1H) ile iki kontrol kaydedicisi (OSCCON ve OSCTUNE) tarafından kontrol edilir. Osilatör Tipleri PIC18F4550 on iki farklı osilatör modunda çalıştırılabilir. Kullanıcılar FOSC3:FOSC0 konfigürasyon bitlerini ayarlayarak bu on iki osilatör tipinden birini seçebilir: 1. XT Kristal/Rezonatör 2. XTPLL Kristal/Rezonatör (PLL seçili) 3. HS Yüksek – Hız Kristal/Rezonatör 4. HSPLL Yüksek – Hız Kristal/Rezonatör (PLL seçili) 5. EC Harici Saat FOSC/4 çıkışı ile 6. ECIO Harici Saat RA6 üzerindeki I/O ile 7. ECPLL Harici Saat (PLL seçili) ve RA6 üzerindeki FOSC/4 ile 8. ECPIO Harici Saat (PLL seçili) RA6 üzerindeki I/O ile 9. INTHS Dâhili Osilatör (mikrodenetleyici saat kaynağı olarak kullanılır, HS osilatör USB saat kaynağı olarak kullanılır.) 10. INTXT Dâhili Osilatör (mikrodenetleyici saat kaynağı olarak kullanılır, XT osilatör USB saat kaynağı olarak kullanılır.) 11. INTIO Dâhili Osilatör (mikrodenetleyici saat kaynağı olarak kullanılır, EC osilatör USB saat kaynağı olarak kullanılır, RA6 üzerindeki dijital I/O ile.) 12. INTCKO Dâhili Osilatör (mikrodenetleyici saat kaynağı olarak kullanılır, EC osilatör USB saat kaynağı olarak kullanılır, RA6 üzerindeki FOSC/4 ile.) 30 Harici saat girişi EC, ECIO, ECPLL ve ECPIO Osilatör modları OSC1 bacağına bağlanabilmek için harici bir saat kaynağına ihtiyaç duyarlar. EC ve ECPLL Osilatör modlarında, OSC1 bacağı üzerindeki osilatör frekansı 4’e bölünür. ECIO ve ECPIO modları da EC ve ECPLL’e benzerler, ancak sadece bu modlarda OSC2 bacağı genel amaçlı bir giriş/çıkış bacağı haline gelir (Microchip Technology Inc. 2004). PLL frekans çarpıcı PIC18F4550 bir PLL (Phase Locked Loop/Faz Kilitlemeli Döngü) devresi içerir. Bu devre, özellikle USB’nin daha alçak hızlı osilatörleri ile olan uygulamalarında ve mikrodenetleyici için bir saat kaynağı olarak kullanılabilmektedir. PLL; HSPLL, XTPLL, ECPLL ve ECPIO Osilatör modlarında aktiftir. Sabitlenmiş 4 MHz’lik girişten sabitlenmiş 96 MHz’lik referans saati üretmek üzere dizayn edilmiştir. Çıkış daha sonra hem USB hem de mikrodenetleyici çekirdek saati tarafından bölünür ve kullanılır (Microchip Technology Inc. 2004). Dâhili osilatör bloğu PIC18F4550 mikrodenetleyici, saat kaynağı olarak kullanılmak üzere iki farklı saat sinyali üretilmesi için dizayn edilmiş bir dâhili osilatör içerir. Ana çıkış (INTOSC), cihazın saatini direk olarak sürebilecek 8 MHz’lik bir kaynaktır. Aynı zamanda 125 kHz ila 8 MHz arasında saat frekansı üretmek üzere seçilebildiği gibi, 31 kHz ila 4 MHz arasında ürettiği saat frekansları ile de kullanıcıya opsiyonlar sunmaktadır (Microchip Technology Inc. 2004). 31 Diğer saat kaynağı olan dâhili RC osilatör (INTRC) ise nominal 31 KHz’lik bir çıkış sağlar. INTRC cihaz saat kaynağı olarak seçildiğinde aktif olur. USB için osilatör ayarları PIC18F4550’nin kullanıldığı bir işlemde, alçak–hız için 6 MHz, yüksek–hız için 48 MHz’lik bir saat frekansı gerekmektedir. Bu nedenle osilatör frekansının seçimi ve cihazın programlanması noktalarına dikkat edilmelidir. Alçak–Hız modu için gereken USB saati, direkt olarak PLL’den değil birincil osilatör zincirinden elde edilir ve 4’e bölünerek 6 MHz’lik saat darbesi üretilir. Bu yüzden, USB modül aktifken ve denetleyici saat kaynağı birincil osilatör modlarından (XT, HS veya EC, PLL ile birlikte veya değil) biri iken, mikrodenetleyici sadece 24 MHz’lik saat frekansını kullanabilir. Bu kısıtlama mikrodenetleyici ikincil osilatör veya dâhili osilatör bloğunu saat kaynağı olarak kullanıyorsa uygulanamaz. 2.3.3.b. PIC18F4550’de reset (sıfırlama) işlemi PIC18F4550’de birçok farklı Reset (Sıfırlama) yapma özelliğini bünyesinde barındırır. RCON kaydedicisi PIC18F4550 için sıfırlama işlemlerini yürüten kaydedicidir. Sıfırlama işlemleri arasında en çok kullanılanlar MCLR ile sıfırlama ve POR (Power– On Reset/Enerji Verildiğinde Sıfırlama) dur. Diğer tüm sıfırlama durumları bu iki sıfırlamadan türetilmiştir (Microchip Technology Inc. 2004). MCLR ile sıfırlama MCLR bacağı cihazı dışarıdan sıfırlama için geliştirilmiş metotlarından birisidir. MCLR girişine 5 Volt uygulandığı sürece program normal akışına devam eder. MCLR’ye 0 32 Volt uygulandığı anda sıfırlama gerçekleşir. MCLR girişinde bulunan bir filtreleme ile parazit gerilimlerin programı sıfırlaması engellenmiştir. Yine de girişin bir kondansatör ile daha kararlı hale getirilmesi parazitlerin yoğun olduğu durumlarda gereklidir. Enerji verildiğinde sıfırlama (POR, Power–On Reset) PIC, VDD geriliminde gerilim yükselmesi algılandığında kaydedicileri hazır hale getirmek için kendi kendisine sıfırlama yapar. POR devresinin avantajı, MCLR bacağının bir direnç (1kΩ–10 kΩ) üzerinden VDD’ye bağlanmasıdır. Bu sayede harici RC elemanlarının sıfırlama yapma sıkıntısını ortadan kaldırmaktadır. Şekil 2.8. POR Sıfırlama Devresi Şekil 2.8’de gösterilen POR devresinde kullanılan diyot kondansatörün hızlı bir şekilde boşalması için kullanılmıştır. R direnci, cihazın elektriksel karakteristiklerinde bir bozulmaya sebep olmaması açısından 40 kΩ’dan küçük seçilmelidir. R1 direnci ise, kondansatörden gelecek akımı, MCLR/VPP bacağının bozulmasını ve elektrostatik boşalmayı engellemek amacıyla 1 kΩ veya biraz büyük olacak şekilde seçilmelidir. Gerilim düşmesi sıfırlaması (BOR, Brown–Out Reset) Ani gerilim düşmelerinde kaydedicilerin içerikleri, program sayacının içeriği hatalı değerler alabilir. Bu gibi durumlarda programın kontrolünü sağlayabilmek için 33 sıfırlanması en iyi çözümdür. BOR, BORV1:BORV0 ve BOREN1:BOREN0 konfigürasyon bitleri tarafından kontrol edilmektedir(Microchip Technology Inc. 2004). 2.3.3.c. PIC18F4550 hafıza organizasyonu PIC18F Tam Hız ailesindeki tüm mikrodenetleyicilerde olduğu gibi PIC18F4550 de üç farklı hafızaya sahiptir: • Program Hafızası • Veri RAM Hafızası • Veri EEPROM Hafızası Harvard mimarisine sahip cihazlarda veri ve program hafızalarına ulaşım ayrı ayrı yollardan yapıldığından, her iki hafızaya da aynı anda ulaşmak mümkündür. EEPROM hafıza pratik olması açısından bir çevrebirim cihazı olarak kabul edilir, çünkü adreslenmesi ve ulaşılması bir takım kontrol kaydedicileri tarafından gerçekleştirilir. PIC18F4550 2 MBayt’lık program hafıza alanını adresleyebilecek 21-bitlik bir sayıcı içerir. Aynı zamanda 32 KBayt’lık bir Flash belleğe sahiptir. Bu Flash Bellek sayesinde 16 384 adet tek-kelimelik komutu hafızasında saklayabilir. PIC18F4550 iki adet kesme vektörüne sahiptir. Sıfırlama vektör adresi 0000h ve kesme vektörleri adresleri 0008h ve 0018h’dır. PIC18F4550 mikrodenetleyicisi için program hafıza haritası Şekil 2.9’da gösterilmiştir: 34 Şekil 2.9. PIC18F4550 program hafızası Veri RAM Hafızası PIC18 ailesi mikrodenetleyicileri için statik hafıza olarak adlandırılır. Data hafızasındaki her kaydedici 12-bitlik bir adrese sahiptir, böylece 4096 baytlık bir veri hafızasına izin verirler. Hafıza alanı 256 baytlık 16 sıraya bölünebilir. PIC18F4550’nin RAM hafızası, 2048 baytlık toplamda 8 tam sıraya bölünmüştür. Data hafızası, Özel Fonksiyon Kaydedicileri (SFR) ve Genel Amaçlı Kaydedicileri (GPR) olmak üzere iki farklı kaydedici ihtiva eder. SFR tipi kaydediciler, denetleyici ve 35 çevrebirimlerin kontrol ve durum kaydedicileri olarak kullanılırken, GPR tipi kaydediciler veri saklama ve kullanıcı uygulamalarında karalama bloknotu gibi işlemlerde kullanılır. PIC18F4550 mikrodenetleyicisi için veri hafızası haritası Şekil 2.10’da gösterilmiştir (EK 6). Flash Program Hafızası normal işlem sırasında okunabilir, yazılabilir ve silinebilir bir bellektir. PIC18F4550, 32768 adet 16-bitlik program verisi alabilecek Flash program hafızasına sahip bir mikrodenetleyicidir (Microchip Technology Inc. 2004). 2.3.3.d. PIC18F4550 CCP (Capture/Compare/PWM) modülleri Capture/Compare/PWM (CCP) modülleri; yakalama, karşılaştırma ve Darbe Genişlik Modülasyonu işlemlerini gerçekleştirmek üzere bazı özelliklerle donatılmışlardır. PIC18F Tam Hız ailesindeki tüm mikrodenetleyiciler iki CCP modülüne sahiptir. Her bir CCP modülü;16 bit’lik yakalama kaydedicisi, 16 bitlik karşılaştırma kaydedicisine veya PWM kaydedicinse sahiptir. PIC18F Tam Hız ailesindeki 28-bacaklı cihazlar iki standart CCP modülüne (CCP1 ve CCP2) sahip iken, PIC18F4550 gibi 40/44-bacaklı cihazlar ise bir standart CCP modülü (CCP2) ve bir geliştirilmiş CCP modülüne (CCP1 veya ECCP) sahiptir. ECCP modülü ayrıca incelenecektir. Bu bölümde incelenecek CCP ise standart CCP modülüdür (Microchip Technology Inc. 2004). PWM (Darbe Genişlik Modülasyonu) modu PWM modunda, CCPx bacağı 10-bit çözünürlükte PWM çıkışı üretir. Bilindiği gibi CCP2 bacağı PORTB veya PORTC veri mandallarından biriyle çoklandığından, PWM modunda işlem yapabilmek için uygun TRIS bit’i sıfırlanmalı ve CCP2 bacağı çıkış olarak seçilmelidir (Microchip Technology Inc. 2004). 36 Şekil 2.11’de PIC18F4550 için basitleştirilmiş PWM blok diyagramı gösterilmiştir: Şekil 2.11. PWM blok diyagramı PIC18F4550 ECCP (Enhanced Capture/Compare/PWM) modülü PIC18F4550 için CCP1 modülü, Geliştirilmiş CCP modülü olarak belirlenmiştir. CCP1 modülü geliştirilmiş PWM yetenekleri sayesinde kullanıcıya 2 veya 4 çıkış kanalı, kullanıcı seçimli polarite imkanı, ölü-bant kontrolü, otomatik kapanma ve açılma gibi olanaklar sağlamaktadır. Standart Yakalama/Karşılaştırma/PWM modu olan CCP2’den farkı, PWM modunun geliştirilmiş olmasıdır. ECCP modülünün Yakalama, Karşılaştırma ve tek çıkış PWM özellikleri standart CCP modülüyle tamamen aynıdır. ECCP modülü CCP1CON kontrol kaydedicisi tarafından kontrol edilmektedir ve yapı itibarıyla standart CCP modülü için kullanılan kontrol kaydedicisinden farklı bir yapıya sahiptir. ECCP modülü ayrıca, Geliştirilmiş PWM işlemi ve otomatik kapanma özelliklerini yerine getirebilmesi amacıyla geliştirilmiş olan ECCP1DEL (Ölü-Bant 37 Gecikmesi) ve ECCP1AS (Otomatik Kapanma Konfigürasyonu) kaydedicilerine sahiptir (Microchip Technology Inc. 2004). 2.3.4. 10-bit analog/dijital dönüştürme modülü PIC18F4550 13 adet A/D dönüştürücü girişine sahiptir (AN12:AN0). A/D dönüştürücü modülü, analog giriş sinyallerinin 10-bitlik dijital bilgi haline dönüştürülmesine izin verir. Modül, beş kaydediciye sahiptir (Microchip Technology Inc. 2004) : • A/D Yüksek Sonuç Kaydedicisi (ADRESH) • A/D Düşük Sonuç Kaydedicisi (ADRESL) • A/D Kontrol Kaydedicisi 0 (ADCON0) • A/D Kontrol Kaydedicisi 1 (ADCON1) • A/D Kontrol Kaydedicisi 2 (ADCON2) ADCON0 kaydedicisi, A/D dönüştürücü modülünün işlemlerini kontrol eder. ADCON1 kaydedicisi, port bacaklarının işlevlerini yapılandırır. ADCON2 kaydedicisi, A/D saat kaynağını, programlanmış kazanım zamanını ve gerekçeleme durumunu yapılandırır. Analog referans gerilimi yazılımla, cihazın pozitif veya negatif gerilim kaynağı (VDD ve VSS) olarak veya RA3/AN3/VREF+ ve RA2/AN2/VREF-/CVREF bacaklarında gerilim seviyesi olarak seçilebilir. A/D modülünün en önemli özelliklerinden biri de işlem yapmazken uyku moduna geçmesidir. Uyku modunda iken A/D modülü için saat sinyali dâhili RC osilatöründen sağlanır. A/D çevirici için kullanılan her port bacağı analog giriş veya dijital giriş/çıkış olarak yapılandırılabilir. Dijital bilgiye dönüşen analog sinyalin karşılığı ADRESH ve 38 ADRESL kaydedicilerine yazılır. A/D çevirme işlemi bittiğinde sonuçlar ADRESH:ADRESL kaydedici çiftine yüklenir, GO/DONE biti (ADCON0 kaydedicisi) sıfırlanır ve A/D Kesme Bayrağı biti ADIF set edilir. Analog/Dijital Dönüştürücü modülüne ait blok diyagram Şekil 2.12’de gösterilmiştir. Şekil 2.12. A/D Dönüştürücü Modülü Blok Diyagramı ADRESH:ADRESL kaydedicilerinin içindeki değer POR (Power-On Reset, Enerji verildiğinde Sıfırlama) için değiştirilmemiştir. Bu yüzden ADRESH:ADRESL kaydedicileri POR tipi bir sıfırlama işleminden sonra bilinmeyen bir veri içereceklerdir. A/D modülünün isteğe göre yapılandırılmasından sonra, dönüştürme işlemi başlamadan önce seçilen kanallar mikrodenetleyiciden devralınmalıdır. Bu işlem, analog giriş 39 kanallarının TRIS bitlerinin set edilmesiyle gerçekleştirilir. Elde edim zamanı sona erdikten sonra A/D dönüştürme işlemi başlatılabilir. A/D dönüştürme işlemi şu adımlar uygulanarak gerçekleştirilir (Microchip Technology Inc. 2004): 1.A/D modülünü yapılandır: • Analog girişleri, referans gerilimini ve giriş/çıkış bacaklarını yapılandır (ADCON1) • A/D giriş kanalını seç (ADCON0) • A/D elde edim zamanını seç (ADCON2) • A/D dönüştürme saatini seç (ADCON2) • A/D modülünü aç (ADCON0) 2.A/D kesmesini yapılandır (eğer istenirse): • ADIF bitini sıfırla • ADIE bitini set et • GIE bitini set et 3.Gerekli elde edim zamanını bekle (eğer gerekiyorsa): 4.Dönüştürmeyi başlat: • GO/DONE bitini set et (ADCON0) 5.A/D dönüştürmenin tamamlanmasını bekle: • GO/DONE bitinin ‘0’ olup olmadığını kontrol et veya • A/D kesmesinin bitip/bitmediğini kontrol et. 6.A/D Sonuç Kaydedicilerini oku (ADRESH:ADRESL); eğer gerekiyorsa ADIF bitini sıfırla. 7.Eğer gerekiyorsa, yeni bir dönüştürme için 1.veya 2.adıma geri dön 40 2.3.4.a. A/D dönüşüm için gereksinimler Belirlenmiş doğruluğu karşılaştırmak için A/D çeviricinin CHOLD kondansatörü giriş gerilimine şarj olması beklenmelidir. CHOLD kondansatörü kaynak empedansı (RS) ve örnekleme anahtarı iç direnci (RSS) üzerinden şarj olur. Anahtar iç direnci, kaynak geriliminin (VDD) değerine göre değişir. Analog kaynaklar için tavsiye edilen maksimum empedans 2,5 kΩ’dur. Analog giriş bacağı seçildikten sonra dönüştürme işlemine geçilmeden, kanal en az elde edim zamanı kadar örneklenmelidir. Analog giriş modeli Şekil 2.13’de gösterilmiştir. Şekil 2.13. A/D dönüştürücü modülü analog giriş modeli Mikrodenetleyicinin analog sinyali minimum algılama zamanı şu şekilde hesaplanır: TACQ = TAMP + TC + TCOFF TACQ TAMP TC TCOFF = Analog sinyali minimum algılama zamanı = Yükseltme gecikme zamanı = CHOLD şarj zamanı = Sıcaklık katsayısı 41 2.3.4.b. Elde edim zamanının seçimi ve yapılandırılması ADCON2 kaydedicisi kullanıcılara, GO/DONE bit’inin her set edilmesiyle elde edim zamanını seçme izni verir. Aynı zamanda kullanıcılara otomatik olarak hesaplanan elde edim zamanı seçeneğini de sunar. Elde edim zamanı ACQT2:ACQT0 bit’lerinin (ADCON2<5:3>) set edilmesiyle ayarlanabilir. TAD bit başına A/D dönüşüm zamanı olarak tanımlandığında, bu bitler 2 TAD’den 20TAD’ye bir aralık sağlar. GO/DONE bit’i set edildiği zaman, A/D modülü girişi seçilen elde edim zamanı için örneklemeye devam eder ve dönüşüm otomatik olarak başlar. ACQT2:ACQT0 = 000 yapıldığı zaman manüel olarak elde edim seçilmiş olur. GO/DONE bit’i set edildiğinde örnekleme durur ve dönüşüm başlar. Dönüşüm sona erdiğinde GO/DONE bit’i sıfırlanır, ADIF bayrağı set edilir ve A/D modül o anda seçili olan kanalı tekrar örneklemeye başlar (Microchip Technology Inc. 2004). 2.3.4.c. A/D dönüşümü için saat kaynağı seçimi TAD, bit başına A/D dönüşüm zamanı olarak tanımlanmıştır. 10-bit A/D dönüşümü için 11 TAD periyodu gerekir. A/D dönüşümü saat kaynağı yazılımla seçilebilmektedir. TAD seçimi için mümkün olan yedi farklı seçenek vardır:2 TOSC, 4 TOSC, 8 TOSC, 16 TOSC, 32 TOSC, 64 TOSC ve Dâhili A/D modülü RC Osilatörü. A/D dönüşümünün doğru olarak yapılabilmesi için, TAD zamanı mümkün olduğunca kısa fakat minimum TAD değerinden büyük seçilmelidir. Çizelge 2.8’de TAD zamanları için maksimum işlem frekansları verilmiştir (Microchip Technology Inc. 2004): 42 Çizelge 2.8. TAD zamanları için maksimum işlem frekansları A/D Saat Kaynağı (TAD) Maksimum İşlem İşlem ADCS2:ADCS0 Frekansı 2 TOSC 000 2.86 MHz 4 TOSC 100 5.71 MHz 8 TOSC 001 11.43 MHz 16 TOSC 101 22.86 MHz 32 TOSC 010 40.0 MHz 64 TOSC 110 40.0 MHz RC(2) x11 1.00 MHz(1) (1) İşlemci çalışma frekansı 1 MHz’den büyük olduğunda, cihaz tüm dönüşüm boyunca uyku modunda olmalıdır veya A/D doğruluğu belirtimlerin dışında olmalıdır. (2) RC kaynağı için tipik TAD zamanı 4 ms’dir. 2.3.4.d. Analog port bacaklarını yapılandırma ADCON1, TRISA, TRISB ve TRISE kaydedicileri, tüm A/D port bacaklarını yapılandırırlar. Port bacakları, bağlı bulundukları analog girişlerin TRIS bit’lerinin set edilmesine (giriş) ihtiyaç duyarlar. TRIS bit’i sıfırlanmış ise (çıkış), dijital çıkış seviyesine (VOH veya VOL) dönüştürme yapılmış demektir. 2.3.4.e. A/D dönüşümü Şekil 2.14’te bir analog sinyalin, GO/DONE bitinin (ADCON<2>) set edilmesi ve ACQT2:ACQT0 bit’lerinin sıfırlanmasıyla, nasıl dijital bilgiye dönüştürüldüğünün zamanlama diyagramı verilmiştir. Şekilden de anlaşılacağı gibi A/D dönüşüm işlemi, 100ns’lik bir gecikme sonrasında başlar. Bu işleme başlarken, donanım tarafından CHOLD kondansatörünün analog girişle olan bağlantısı, A/D dönüşüm işlemi bitene kadar kesilir. 43 Şekil 2.14. A/D dönüşüm TAD zaman diyagramı (ACQT<2:0> = 000, TACQ = 0) Şekil 2.15’te ise, dönüşüm başlamadan GO/DONE biti set edilmiş, ACQT2:ACQT0 bitleri ‘010’a set edilmiş ve 4 TAD’lik elde edim zamanı için A/D dönüştürücünün işlemini göstermektedir. Şekil 2.15. A/D dönüşüm TAD zaman diyagramı (ACQT<2:0> = 010, TACQ = 4 TAD) GO/DONE bit’inin dönüşüm işlemi sırasında sıfırlanması, geçerli işlemi durduracaktır. Bu durumda, ADRESH:ADRESL kaydedicileri son tamamlanmış dönüşümün bilgilerini içereceklerdir. Yeni bir veri sağlama işleminin başlatılabilmesi için, A/D dönüşümün tamamlanmasından veya durdurulmasından itibaren 2 TAD süresi kadar beklemek gerekir. Bu beklemeden sonra, seçili kanaldan veri sağlama otomatik olarak başlayacaktır (Microchip Technology Inc. 2004). 44 2.3.5. PIC18F4550 USB modülü PIC18F4550, USB karargâh ile PIC mikrodenetleyicisi arasında hızlı bir iletimi sağlamak amacıyla, alçak–hız ve tam–hız uyumlu USB Seri Arabirim Motoruna (Serial Interface Engine, SIE) sahiptir. SIE, dâhili USB alıcı-vericisi üzerinden veya bağlanabilecek harici bir USB alıcı-vericisi üzerinden USB için direk bir arayüz olarak kullanılabilir. Aynı zamanda 3,3 V’luk dâhili regülatör, 5 V’luk uygulamalarda dâhili alıcı-verici için güç kaynağı olarak mevcuttur (Microchip Technology Inc. 2004). Performansı artırmak için bazı özel donanım özellikleri bulunmaktadır. Cihazın veri hafıza alanında bulunan çiftli port hafızası (USB RAM), mikrodenetleyici ile SIE arasında direkt hafıza erişiminin paylaşımını sağlayacaktır. USB RAM alanındaki son uç hafıza kullanımının, kullanıcı tarafından serbestçe programlanabilmesi için tampon tanımlayıcılar sağlanmıştır. Ayrıca SPP desteği sayesinde, eşzamanlı transferde olduğu gibi büyük miktarlardaki verinin kesintisiz biçimde harici hafıza tamponlarına iletilmesi sağlanabilmektedir. 2.3.5.a. USB durum ve kontrolü USB modülünün çalışması, üç kontrol kaydedicisi tarafından yapılandırılır ve yönetilir. Ayrıca, gerçek USB işlemleri için toplamda 19 kaydedici kullanılmaktadır. Bu kaydediciler: • USB Kontrol kaydedicisi (UCON) • USB Konfigürasyon kaydedicisi (UCFG) • USB Transfer Durum kaydedicisi (USTAT) • USB Cihaz Adres kaydedicisi (UADDR) • Çerçeve Numarası kaydedicisi (UFRMH:UFRML) • Son Uç Seçim kaydedicileri 0’dan 15’e kadar (UEPn) 45 2.3.5.b. USB kontrol kaydedicisi (UCON) USB Kontrol kaydedicisi, transfer işlemleri sırasında modülün davranışını kontrol edecek bit’leri içerir. Kaydedicinin içerdiği konfigürasyon bitlerinin kontrol ettiği olgular şunlardır: • Ana USB Çevrebirim Seçili kılınması • Pinpon Tampon İşaretleyici Sıfırlaması • Askı (duraklatma) modu kontrolü • Paket transfer Seçili kılınmaması USB Kontrol kaydedicisi aynı zamanda, veri yolunda oluşabilecek tekli-sonlanmış sıfırı işaret etmek için kullanılan durum biti içerir, SE0 (UCON<5>). USB modülünün tüm işlemleri USBEN bit’i (UCON<3>) tarafından kontrol edilir. Bu bit’in set edilmesi ile modül aktif hale gelir ve aynı zamanda yonga üzerindeki voltaj regülatörünü aktif hale getirir. Kısaca bu bit, USB modülünün sisteme takılıp çıkarılmasını sağlar ve bit değerinin ‘0’ olması durumunda tüm durum ve konfigürasyon bitleri ihmal edilir. PPBRST biti (UCON<6>), Çiftli-Tamponlama modunda (pinpon modu) çalışılırken Sıfırlama durumunu kontrol etmek için kullanılır. PPBRST biti set edildiğinde tüm pinpon tampon işaretçileri çift tampon olarak set edilir. PPBRST biti kodlama kısmında sıfırlanabilir. PKTDIS biti (UCON<4>) SIE’nin paket iletimi ve alımı için kullanılamaz durumda olduğunu işaret eden bayraktır. Bu bit kurulum işlemine izin verilmesi amacıyla SIE tarafından set edilir, mikrodenetleyici tarafından set edilemez. RESUME biti (UCON<2>), USB çevrebirimin Resume sinyalinin uzaktan kumanda edilerek uyandırma (wake-up) işlemini gerçekleştirebilmesi için kullanılır. Geçerli bir 46 uzaktan kumanda uyandırma işlemi için, kodlama RESUME bitini 10ms için set etmeli ve sonra sıfırlamalıdır. SUSPND biti (UCON<1>), USB modülün ve desteklediği devrenin (örneğin voltaj regülatör devresi) düşük-güç modunda çalışmasını sağlar. Aynı zamanda SIE giriş saat darbesi seçilemez kılınır. SUSPND biti yazılımla set edilip, mikrodenetleyici kodlaması ile sıfırlanabilir. Bu bit aktif edildiğinde, cihaz yola bağlı kalır ancak alıcı/verici çıkışları halen boştadır (Idle Modu). VUSB bacağındaki gerilim bu bitin değerine bağlı olarak değişir. 2.3.5.c. USB konfigürasyon kaydedicisi (UCFG) USB üzerinden haberleşmenin önceliğine göre USB modülünün ilişkili olduğu dâhili ve/veya harici donanım yapılandırılmalıdır. Yapılandırma işleminin büyük çoğunluğu UCFG kaydedicisi ile gerçekleştirilmektedir. Ayrı USB voltaj regülatörü konfigürasyon kaydedicileri tarafından kontrol edilmektedir. UCFG kaydedicisi, USB modülünün sistem seviye davranışını kontrol eden birçok bit içermektedir. Sistem seviye davranışını etkileyen durumlar şu şekildedir: • Yol (bus) hızı (tam-hıza karşılık alçak-hız) • Yonga üzeri çekme (pull-up) dirençlerinin seçili kılınması • Yonga üzeri alıcı/vericinin seçili kılınması • Pinpon tamponunun kullanımı (PPB1:PPB0) 47 2.3.6. PIC18F4550 komut seti PIC18F4550, PIC18 serisi mikrodenetleyicilerin standart 75 komutluk setine sahipken, bunun yanı sıra kodların optimizasyonu veya yazılım yığınının kullanımını sağlamak amacıyla genişletilmiş 8 yeni komuta sahiptir. PIC18 serisi mikrodenetleyicilerin komut setleri, bir önceki PICmicro denetleyicilerinin komut setlerinin üzerinde birçok geliştirmeler yapılarak oluşturulmuştur. Ancak bu geliştirmeler yapılırken, PICmicro komut setlerinden yenilere geçişin kolay olması göz önünde tutulmuştur. Komut setleri dört ana kategoride incelenebilir: • Bayt yönlendirmeli işlemler • Bit yönlendirmeli işlemler • Yalın (sade) işlemler • Kontrol işlemleri Çizelge 2.9’da Bayt yönlendirmeli işlemler komut seti (EK 11), Çizelge 2.10’da Bit yönlendirmeli işlemler, kontrol işlemleri ve sade işlemler komut seti (EK 12) ve Çizelge 2.11’de Hafıza işlemleri komut seti ve geliştirilmiş komut setine ait komutlar ve açıklamaları verilmiştir (EK 13) (Microchip Technology Inc. 2004). 2.3.7. I/O portlarının konfigürasyonu Devrenin donanımsal olarak yapılandırılmasından sonra, öncelikle PIC18F4550’nin giriş/çıkış (I/O) portlarının yapılandırılması gerekmektedir. PIC18F4550’nin I/O portlarının isim ve fonksiyonları EK 1-5’te çizelgeler halinde verilmiştir. 48 3. MATERYAL ve YÖNTEM 3.1. Paralel ve USB Programlama Devresi Paralel ve USB programlama devresi, PIC18F4550 mikrodenetleyicisi ile analog sinyallerin ölçülmesi, sayısal giriş-çıkışların kontrolü ve bilgisayar ortamında gösterilmesi için geliştirilmiştir. Devrenin geliştirilmesi işlemi dört ana kısımda incelenecektir: • Donanım (hardware) • Yazılım (software) • Kodlama (firmware) • Görsel arabirim (GUI) 3.1.1. Donanım (Hardware) Donanım bölümünde, PIC18F4550 mikrodenetleyicisinin boot edilmesi için gerekli devreler ile Microchip firmasının sunmuş olduğu programlama yazılımı ile PIC’in nasıl programlandığı hakkında bilgiler verilmiştir. Genellikle PIC18F4550 mikrodenetleyicisinin programlanması için üretici firma Microchip’in geliştirdiği PICDEM FS USB geliştirme kartı kullanılmasına rağmen, bu çalışmada kendi geliştirdiğimiz programlama kartı kullanılmıştır. Projede kullanılan elektronik devrelerinin açık devre şemaları Proteus ISIS programında çizilmiş ve devrelerin çalışıp çalışmadığı bu program aracılığıyla test edilmiştir. Programlama ve uygulama devreleri için Proteus ARES programı kullanılarak baskı devreleri çıkartılmış ve bakır plaketlere baskı devreleri gerçekleştirilmiştir. 49 Programlama devresinin programlama kısmının açık devre şeması Şekil 3.1’de verilmiştir. Şekil 3.1. Programlama devresi paralel programlama kısmı Paralel programlama konektörü, her proje devresi için sadece bir defa kullanılır. Bu konektörün amacı, bir defaya mahsus olmak üzere PIC18F4550 hafızasının içine önyükleme programının yazılmasıdır. Paralel portu kullanan paralel programlama devresi, 7407 tampon entegresi ve transistor sürücü devreleri ile PIC’in seri olarak programlanması için kullanışlı hale getirilmektedir. PIC’in önyüklemesinde ICSP (InCircuit Serial Programming) kullanılmaktadır. Bu programlamada MCLR girişi Vpp olarak davranır (PIC’in 1 nolu bacağı). Vpp için 13 Vdc den daha yüksek gerilime ihtiyaç duyulur. Bu gerilimi sağlamak için 7812 regülatörünün şase bacağına iki adet seri diyot bağlanarak ekstra 1,2 Vdc elde edilir. Böylece 7812 regülatörünün 12 V’luk dc çıkışına iki adet 1N4148 diyotunun 0,6 V’luk dc çıkışlarının eklenmesiyle toplamda 13,2 V’luk 50 dc bir gerilim elde edilmiş olur. Bu gerilim PIC’in programlanabilmesi için yeterlidir. Bilgisayarın paralel portunun 8 nolu bacağı (D6 biti) Vpp için tahsis edilmiştir. PIC’in önyükleme işlemi için Winpic yazılımı kullanılmıştır. PIC18F4550, USB’den gelen 5V ile 11. ve 32. bacaklar olan VDD üzerinden beslenmekte ve 12. ve 32. bacaklar olan VSS bacaklarıyla toprağa bağlanmaktadır. Devrede kullanılan elemanlar ve kullanım amaçları ayrı ayrı incelenmiştir. Şekil 3.2. Önyükleme için minimum donanım Şekil 3.2’de verilen devrede PIC’in önyüklemesinin yapılabilmesi için gerekli asgari donanım gösterilmiştir. Devrede kullanılan elemanların özellikleri ve kullanım amaçları Bölüm 3.1.2’de ayrı ayrı açıklanmıştır. 51 Hem paralel konektör programlayıcı hem de Şekil 3.2’de verilen minimum önyükleme donanımı bir araya getirilerek, Şekil 3.3’deki programlama devresi elde edilmiştir. Şekil 3.3. Paralel ve USB programlama devresi 3.1.2. Devre elemanları 3.1.2.a. PIC18F4550 PIC18F4550 tüm USB işlevlerini içermesi, analog sinyallerin dijitale çevrilmesi, dönüştürülen sinyallerin işlenmesi vb. gibi özelliklerinden dolayı devrenin tam manasıyla kalbidir. 52 3.1.2.b. Osilatör USB modülünün ihtiyaçları yüzünden, saat işlemine farklı bir yaklaşım gereği ortaya çıkmıştır. Daha önceki PIC’lerde tüm çekirdek ve çevrebirim saatleri tek bir osilatör kaynağı ile sürülüyordu. PIC18F4550 de ise birincil osilatör USB modülünün bir parçası durumuna gelmiştir ve diğer saat kaynakları için kaynak olarak kullanılamamaktadır. Böylece, USB modülü birincil osilatör kaynağı tarafından tetiklenirken, mikrodenetleyici çekirdeği ve diğer çevrebirimler ikincil veya dâhili osilatörler tarafından tetiklenmişlerdir. USB’nin zamanlama ihtiyaçları göz önüne alındığında, USB modülü aktif edildiğinde 6 MHz’ den 48 MHz’e kadar dâhili bir saate ihtiyaç vardır. İşin güzel yönü, mikrodenetleyici ve diğer çevrebirimlerin birincil osilatörü kullanırken bu saat hızında çalışmaya ihtiyaç duymamalarıdır. Bu çalışmada 20 MHz’lik (HS tip) kristal osilatör OSC1/CLKI (13.bacak) ile OSC2/CLKO/RA6 (14.bacak) arasına bağlanmıştır. PIC18F4550 bu osilatörü kullanarak, USB Seri Arabirim Motoru (Serial Interface Engine) ve denetleyici çekirdeği için gerekli sat darbelerini üretmektedir. Osilasyonun düzgün bir biçimde yürütülebilmesi için, 20 MHz’lik HS tipi kristal osilatör için kullanılması gereken 15pF’lık kondansatörler ve 1MΩ’luk direnç devreye eklenmiştir. 3.1.2.c. USB konektör Devrede kullanılan USB konektör, standart B-tipi konektördür. Konektörün dört ucundan ikisi güç iletimi için kullanılan VCC ve GND (toprak) bacakları, diğer ikisi ise veri iletimi için kullanılan D+ ve D- bacaklarıdır. USB portu, PIC ile bilgisayarın haberleşmesini sağlaması ve çevrebirimlerden gelen kodlama verilerinin alınıp gönderilmesinde önemli rol oynamaktadır. Şekil 3.4’te USB-B tipi dişi konektörün resmi ve bacak durumları gösterilmiştir. Çizelge 3.1’de ise USB için bacak tanımlamaları verilmiştir. 53 Şekil 3.4. B tipi USB konektör Çizelge 3.1. USB bacak tanımlamaları Bacak İsim Açıklama Kablo rengi 1 VCC + 5V DC Kırmızı 2 D– Data – Beyaz 3 D+ Data + Yeşil 4 GND Toprak Siyah 3.1.2.d. Güç göstergesi USB üzerinden devreye güç geldiğinde, güç göstergesi olarak kullanılan kırmızı LED yanar. USB üzerinden gelebilecek akımın 100 mA ile sınırlı olmasından dolayı, daha fazla akım çeken uygulamalar için LM7805 regülatörü kullanılması uygun olacaktır. LM7805, güç kaynağından +5V sabit bir DC gerilim sağlarken 1 000 mA’e kadar akım çekilmesine olanak sağlayacaktır. Ayrıca LM7805’in kullanımıyla 9V’luk bir pil kullanılarak, devre kendi başına kullanılabilecektir (Overholt 2005). 54 3.1.2.e. Sıfırlama ve program butonları Devrede kullanılan iki buton, PIC18F4550’nin programlanması işlemi sırasında kullanılır. PIC18F4550’nin MCLR bacağına (bacak 1) bağlı olan Reset butonuna basılması, devrenin USB kablosunun bilgisayardan çıkartılıp tekrar takılması işlevini görür. Böylece bilgisayar, arabirim devresini tanır ve gerekli sürücüyü kullanıma alır. Eğer RB5/KBI1/PGM bacağına (bacak 38) bağlı olan Program butonuna basılı tutarken, Reset butonuna basılırsa devre önyükleme moduna geçer ve böylece PIC’e yeni bir uygulamanın yüklenmesine izin verilmiş olur (Overholt 2005). 3.1.3. Güç Programlama devresi 5V DC gerilim ile çalışır. Bu gerilim direkt olarak USB’den sağlanabileceği gibi harici bir güç kaynağı da kullanılabilir. Ancak devrede, güç kaynağı seçimi için bir atlama kablosu (jumper) bulunmamaktadır. Çünkü güç devresi her iki güç kaynağı aynı anda mevcut olduğunda otomatik olarak harici güç kaynağını seçecektir. Birçok USB çevrebiriminin kullanımında olduğu gibi, arabirim devresi USB kablosundan gelen 5 Voltluk gerilim ile beslenebilir. USB veri yolunda bir cihazın çekebileceği minimum akım 100 mA, maksimum akım ise 500 mA’dir. Başka bir cihazın kullanılmadığı durumlarda 500 mA’lik akımın tamamı kullanılabilir durumda olsa da, bu limitlerin zorlanması bilgisayar ve devre donanımına zarar verebilir. 500 mA’den daha fazla akım gereksinimi duyulan uygulamalarda harici bir güç kaynağı kullanılması gerekmektedir. Hem programlama devresinde hem de uygulama kartında USB’den sağlanan ve harici güç kaynağından yapılan beslemelerin durumu LED gösterge ile gerçeklenmiştir. 55 3.2. Yazılım (Software) 3.2.1. PIC18F4550’nin önyüklemesi (Bootload) Bootloader, mikrodenetleyicinin hafızasına yüklenen ve genellikle bu yonganın USB aracılığıyla bilgisayarla haberleşmesini sağlayan hex dilinde yazılmış bir programdır. Her mikrodenetleyici yongasının kendisine özgü bir önyükleme programı bulunmaktadır. Bu programlar, yonganın üretici firması tarafından yazılarak kullanıcıların ve tasarımcıların hizmetine sunulur. Önyükleme kullanılan programlayıcının bilgisayarla olan haberleşmesine göre farklılıklar göstermektedir. Bu çalışmada, PIC’in önyüklenmesi paralel port üzerinden gerçekleştirilmiştir. Paralel programlama konektörü üzerinden ön yükleme şu şekilde gerçekleştirilmektedir (Overholt 2005) : • Öncelikle internetten ücretsiz olarak sağlanabilen ve PIC mikrodenetleyicilerinin tamamına yakınını programlayabilme özelliğine sahip olan Winpic programı çalıştırılır. Programın içerisindeki menülerden cihaz seçimi gerçekleştirilerek kullanacak olduğumuz PIC18F4550 mikrodenetleyici seçilir. • Cihaz seçimi gerçekleştirildikten sonra, programlama kartı bilgisayara paralel porttan bağlandığı için Winpic programı paralel programlama konektörü ile uyumlu hale getirilir. Şekil 3.5’te bu ayarların nasıl yapıldığı gösterilmiştir. 56 Şekil 3.5. Winpic paralel programlama ayarları [Info] Purpose=Sample PIC programmer interface for the parallel port [ProgrammerControlLines] DataIn=ack OkButton=nc VppOnOff=!D6 VddOnOff=nc Connect=nc ClockOut=D4 DataOut=D3 DataOutWhileReading=1 PullMclrDown=nc ClkEnable=nc OutEnable=nc RedLed=nc GreenLed=nc Şekil 3.6. Wzab2.ini tanımlama dosyası “Özel arabirim tanımlama dosyası” (Custom interface definition file) olan Wzab2.ini dosyası Şekil 3.1’de verilen programlama devresi ile Winpic arasında tanımlama bilgisi sunar. Şekil 3.6’da Wzab2.ini tanımlama dosyasının paralel portun hangi bacaklarının kullanıldığını tanımlayan program gösterilmiştir. 57 • Şekil 3.7’de gösterilen PIC18F4550 için cihaz konfigürasyonu, program içinde yapılabileceği gibi Winpic programı içindeki cihaz konfigürasyon seçeneği kullanılarak da yapılabilmektedir. Bu konfigürasyonda yonganın çalışma saat frekansı, kullanılan osilatör tipi ve frekansı, çalışma bölgesi ayarlandığı gibi yonga bacaklarının ne amaçla kullanılacağı, Watchdog Timer’ın kullanılıp kullanılmayacağı, kullanıldığında ise hangi zamanlarda devreye gireceği ayarları yapılmaktadır. PIC18F4550’de bir bacağa birden çok fonksiyon yüklendiğinden, bacak konfigürasyonun önemi bir kez daha artmaktadır. • Microchip firması tarafından, PIC18F4550 için özel olarak yazılmış olan MCHPUSB.hex (C:\MCHPFSUSB\fw\Boot\_output\ MCHPUSB.hex) dosyası PIC’e yüklenerek yonganın önyüklemesi tamamlanmış olur. • Önyükleme işlemi tamamlandıktan sonra programlayıcı devre, üzerinde bulunan mikro anahtarın yönleri değiştirilerek, USB moduna alınır ve bilgisayarın USB portuna bağlanır. Önyükleme her mikrodenetleyici için sadece bir kez yapılması gerektiğinden, programlayıcı devrenin paralel port üzerinden haberleşen kısmı artık kullanılmayacaktır. • Cihazın USB portuna bağlanmasıyla “Yeni donanım bulundu” bilgisi ekrana gelince C:\MCHPFSUSB\Pc\MCHPUSB Driver\Release\ mchpusb.inf sürücü dosyası ile MCHPUSB.SYS sistem dosyası Windows işletim sistemine kurularak PIC sisteme tanıtılmış olur. • Microchip firması tarafından yazılımış olan C:\MCHPFSUSB\Pc\Pdfsusb\ PDFSUSB.exe programı ile, Winpic programına ihtiyaç duymadan USB portundan PIC’e firmware yazılımları atılabilir konuma gelinir. 58 Şekil 3.7. Winpic’de cihaz konfigürasyonu 3.3. Kodlama (Firmware) PIC’in kodlaması Assembler dili ile yapılabilirken PIC18XXXX serisi PIC’ler için Microchip firması tarafından geliştirilmiş C18 dili yaygın olarak kullanılmaktadır. Yine Microchip firmasının yayınlamış olduğu çekirdek programlar başlangıç olarak kullanılarak, USB tabanlı HID veya DAQ uygulamaları için kod geliştirilmesi yapılmaktadır. Bu çekirdekte temel USB yapılandırılmaları ve PORT konfigürasyonları bulunmaktadır (typedefs.h, usb9.c, usbdsc.c vb. ). Kullanıcı amacına göre bu konfigürasyonlara ekleme yada çıkarma yaparak programını geliştirebilmektedir (iocfg.h, main.c, user.c, user.h vb.). 59 3.4. Görsel arabirim (GUI) Görsel program geliştirme araçları ve USB aracılığı ile PIC18F4550 arasında iletişim kurabilmek için, Microchip firmasının yayınladığı API uygulama kütüphanesi MPUSBAPI.DLL kullanılır. Bu dosya aşağıdaki fonksiyon ve alt yordamları bulundurur. Public Declare Function MPUSBGetDLLVersion Lib "mpusbapi" () As Long Public Declare Function MPUSBGetDeviceCount Lib "mpusbapi" (ByVal pVID_PID As String) As Long Public Declare Function MPUSBOpen Lib "mpusbapi" (ByVal instance As Long, ByVal pVID_PID As String, ByVal pEP As String, ByVal dwDir As Long, ByVal dwReserved As Long) As Long Public Declare Function MPUSBRead Lib "mpusbapi" (ByVal handle As Long, ByVal pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As Long) As Long Public Declare Function MPUSBWrite Lib "mpusbapi" (ByVal handle As Long, ByVal pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As Long) As Long Public Declare Function MPUSBReadInt Lib "mpusbapi"(ByVal handle As Long, ByVal pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As Long) As Long Public Declare Function MPUSBClose Lib "mpusbapi"(ByVal handle As Long)As Long Bu fonksiyonlar modül olarak uygulama programına eklenen VBMPUSBAPI.BAS dosyasında bulunan aşağıdaki uygulamaları yerine getirir. • Initialize: Değişkinleri başlangıçta tanımlamak için kullanılır. • OpenMPUSBDevice: Uygulamanın veri borularını açmak için kullanılır. • CloseMPUSBDevice: Açık veri borularını kapamak için kullanılır. • SendReceivePacket: Uygulama verilerinin transferinde kullanılır. 64 elemanlı gönderme ve alma dizileri ile verilerin gönderiliş ve geri alınışı izlenilebilir. 60 4. ARAŞTIRMA BULGULARI Materyal ve Yöntem bölümünde tanıtılan ve tasarım ile gerçeklemesi yapılan PIC programlama devresi yardımıyla, Microchip firmasının yayınlamış olduğu USB boot önyükleme programı PIC18F4550 mikrodenetleyicisine aktarıldı. Ancak aktarım gerçekleştirilmeden önce Microchip MPLAB IDE programı ile io_cfg.h, boot.c, boot.h, main.c dosyaları bu çalışmaya özel tasarlanmış GUI uygulaması için yeniden yapılandırıldı. io_cfg.h dosyasında A/D dönüştürme işlemi için A portunun birinci bacağı en yavaş dönüşüm zamanına göre tanımlandı (TRISAbits.TRISA0=1; ADCON0=0x01;ADCON2=0x3C;). Aynı şekilde D portu sayısal çıkış (LATD &= 0x00; TRISD &= 0x00;) ve B portunun 4. ve 5. bitleri sayısal giriş olarak tanımlandı (TRISBbits.TRISB4=1;TRISBbits.TRISB5=1). main.c dosyası ise USB, giriş/çıkış ve A/D dönüştürme için başlatma tanımlamalarını yapacak şekilde yapılandırıldı. Şekil 4.1’de main.c kaynak dosyası içerisinde yapılan değişikliklerden bir bölüm gösterilmiştir. main.c dosyasının tamamı ise EK 7’de verilmiştir. 61 Şekil 4.1. main.c kaynak kodlarının bir bölümü boot.h dosyası Visual Basic ile yazılan GUI programı ile iletişim kuracak tanımlamaları içermektedir. GUI programında kullanılan versiyon okuma, potansiyometre yordamıyla gerilim okuma ve devrenin sıfırlanması gibi komutların gerçekleştirilebilmesi için kullanılan adresler boot.h dosyasında tanımlanmaktadır. boot.h kaynak kodlarının bir kısmı Şekil 4.2’de gösterilmiştir. boot.h dosyasının tamamı ise EK 8’de verilmiştir. Şekil 4.2. boot.h kaynak kodlarının bir bölümü 62 boot.c dosyası ise GUI programında “SendReceivePacket” altyordamı ile gönderilen adres,durum ve özellik bilgilerine göre PIC’i çalıştırarak eğer geriye bilgi dönmesi gerekiyorsa bu bilgileri döndürmektedir. Şekil 4.3’te boot.c kaynak kodlarının bir bölümü gösterilmiştir. boot.c dosyasında, Visual Basic’de yazılan GUI programıyla kullanılan üç LED’in yakılıp söndürülmesi durumunda gönderilen veri paketinin durumu ayarlanmaktadır. UPDATE_LED case’i GUI yazılımının send_data dizisi ile 0x32 (onluk tabanda 50) yazma talebi, hangi LED’in seçileceği ve LED'in yanıp yanmayacağını belirler. Yine PIC’in RA0/AN0 bacağına bağlanmış olan potansiyemetre ile dışarıdan alınan analog sinyalin (gerilim), PIC18F4550 mikrodenetleyicisi tarafından A/D dönüştürme işlemine tabi tutulması için gerekli ayarlar bu dosyanın içerisinde gerçekleştirilmektedir. READ_POT case’i GUI yazılımının send_data dizisi ile 0x37 (onluk tabanda 55) okuma talebi, ADC veya sayısal bilgi girişi dizinin 2. elemanı ile belirlenir. Eğer ADC işlemi yapılmış ise geriye iki bilgi döndürülür. ReadPOT() alt yordamı ile ADC çevrimin başlaması ve çevrim bitene kadar beklemesini içerir. Şekil 4.4’te boot.c kaynak kodlarının bir bölümü gösterilmiştir. boot.c dosyasının tamamı ise EK 9’da verilmiştir. io_cfg.h dosyasının tamamı EK 10’da verilmiştir. 63 Şekil 4.3. boot.c kaynak kodlarının bir bölümü Şekil 4.4. boot.c kaynak kodlarının bir bölümü MPLAB programı ile bütün header ve c dosyaları derlenerek hex dosyası oluşturulur. Oluşturulan hex dosyası Winpic programı ile programlama devresi kullanılarak PIC18F4550 mikrodenetleyicisine yüklenir. 64 GUI yazılımı Visual Basic 6.0’da gerçeklendi. Şekil 4.5’te gösterilen kullanıcı formu DLL versiyonu, LED’lerin yakıp söndürülmesi, anahtara basılıp basılmadığını kontrol ederken aynı zamanda 1. kanaldan ADC okuması yapabilmektedir. Şekil 4.5. Uygulama GUI kullanıcı formu GUI formunda Voltaj Oku olarak kullanılan komutla, potansiyometre üzerinden mikrodenetleyiciye uygulanan gerilim değerlerinin değiştirilerek dijitale çevrilmesi işlemi gerçekleştirildi. Burada uygulaması yapılan A/D dönüştürme işlemi için gerekli olan PIC hex dosyaları derlendikten sonra Visual Basic 6.0’da ayarlamaları yapıldı. PIC18F4550, daha önce de belirtildiği gibi, 10 bitlik A/D dönüştürücü işlemi gerçekleştirmektedir. Dönüştürme işlemi başlamadan önce TRIS bitleri ilgili bacağı analog giriş olarak seçmek üzere set edilir. Bu uygulamada PORTA’nın RA0 bacağı analog giriş olarak seçildiğinden TRISA0=1 olarak seçildi. A/D dönüştürme işleminde dijital bilgiye dönüşen analog sinyalin karşılığı ADRESH ve ADRESL kaydedicilerine 65 yazılmaktadır. Bu yazım sırasında gelen 16 bitlik verinin düşük anlamlı ilk sekiz biti ADRESL kaydedicisine, geri kalan sekiz bitlik veri ise ADRESH kaydedicisine yazılır. ADRESH kaydedicisinin öncelikle sola kaydırma işlemine tabi tutulduktan sonra, bu iki kaydedicinin lojik VEYA işlemine tabi tutulmasıyla bu veriler birleştirilmiş olur. Adres kaydedicilerine yazılan dijital gerilim bilgisinin çözünürlüğünü ayarlamak için sonuç 5 ile çarpıldıktan sonra onaltılı (hexadecimal) sayı sisteminde H3FF sayısına bölünür. 5 ile çarpılmasının nedeni, devreye güç kaynağından verilen gerilimin 7805 regülatörü ile potansiyometreye 5V olarak verilmesidir. H3FF onaltılı sayısı ikili sayı sisteminde 10 bitlik 1111111111 sayısına karşılık gelmektedir. Bu da PIC18F4550’nin A/D dönüştürme kapasitesine denk gelmektedir. Anahtar durumunun kontrolü ise sadece giriş/çıkış portundan “SendReceivePacket” altyordamı ile gönderilen adres, durum ve özellik bilgilerine göre PIC’i çalıştırarak, PIC’den geriye dönen bilgileri göstermektedir. Kısaca, anahtarın basılı olması durumu Lojik 1 ve basılı olmaması durumu ise Lojik 0 ile değerlendirilmektedir. Son olarak kullanılan LED’lerin bilgisayardan kontrolü yapılırken, send_data dizisi ile 0x32 (onluk tabanda 50) yazma talebi, hangi LED’in seçileceği ve LED'in yanıp yanmayacağını belirler. Uygulama GUI’nin kontrol ettiği uygulama kartının açık devre şeması Şekil 4.6’da verilmiştir. Uygulama kartının baskı devresi ise Şekil 4.7’de verilmiştir. 66 Şekil 4.6. Uygulama kartı açık devre şeması Şekil 4.7. Uygulama kartı 67 5. TARTIŞMA ve SONUÇ Elektronik ölçme sektöründeki hızlı gelişmeler ve bilgisayar tabanlı sistemlerin ölçme sistemlerindeki yerinin her geçen gün artması, hızlı ve güvenilir veri iletişim metotlarına olan ihtiyacı arttırmaktadır. Özellikle gömülü sistemlerde sıklıkla kullanılan mikroişlemci ve mikrodenetleyiciler ise elektronik alanındaki gelişmelerde lokomotif görevi üstlenmişlerdir. Programlanabilme özellikleri ile gerek üreticiye gerekse de kullanıcıya yönelik hayal gücü ile sınırlı opsiyonlar sağlanmıştır. Sonuç olarak üzerinde çalışılan projede, çevrebirimlerin PIC18F4550 mikrodenetleyicisi ile USB üzerinden bilgisayarla haberleştirilmesi sağlanmıştır. USB protokolünün karmaşıklığı bir takım zorluklara yol açsa da, kullanılan mikrodenetleyici üretici firması olan Microchip’in internet ortamında sunmuş olduğu Kernel’ler ile uygulamanın yazılım kısmının hazırlanmasını kolaylaştırmıştır. Kullanılan mikrodenetleyicinin bir kaç yıl öncesinde kullanılan bilgisayar işlemcilerinden bile daha üstün bir yonga olması, uygulama alanlarını oldukça genişletmektedir. Endüstriyel elektronik, medikal, otomotiv, tüketici elektroniği vb. gibi genel başlıklarıyla verilen birçok alanda çeşitli uygulamalar için kullanılabilecek bir proje hazırlanmıştır. Projede kullanılan uygulama kartı genel amaçlı bir arabirim olarak tasarlandığından uygulaması yapılacak sisteme adapte edilerek kullanılabilecektir. Üzerinde çalışılan projede, PIC18F4550’nin ICSP yöntemiyle paralel porttan önyüklenmesi ve USB portu üzerinden programlanabilmesi için yeni bir kart geliştirilmiştir. Böylelikle kullanıcının önyükleme ve programlama için ayrı kartlar kullanma ihtiyacı ortadan kaldırılarak, Microchip firmasının üretmiş olduğu programlayıcı kartına göre daha kullanışlı bir sistem oluşturulmuştur. 68 Uygulama kartı olarak düzenlenen devre ile analog bir sinyalin dijitale çevrilmesi, giriş/çıkış portlarının kullanılarak bilgisayarın verilen girişleri algılayabilmesi ve yine giriş/çıkış portlarına bağlanmış olan devre elemanlarının bilgisayarla kontrolü sağlanmıştır. Bu çalışma temel alınarak PIC18F4550 mikrodenetleyicisi ile gerçekleştirilebilecek yeni projelerde, programlama kartında herhangi bir değişikliğe gidilmeden sadece uygulama kartına yapılabilecek revizyonlar yeterli olacaktır. Bu bağlamda, mikrodenetleyici temelli tüm uygulamalar için prototip sayılabilecek bir uygulama gerçekleştirilmiş ve yeni tasarımcılar için bir yol açılmıştır. 69 KAYNAKLAR Axelson, J., 2005, USB Complete:Everything You Need to Develop Custom USB Peripherals, 3rd ed., Labview Research, 572 p, Madison, USA Chandler, A., 2006, New 48 MHz Microchip PIC18 Microcontrollers with USB 2.0, http://www.microcontroller.com/news/microchip_pic18_usb2.asp (21.09.2006) Kızılbey, O., 2005, Deniz Suyu Termometresi, İstanbul Teknik Üniversitesi ElektrikElektronik Fakültesi Bitirme Ödevi, 77 s, İstanbul Microchip Technology Inc., 2004, DS39632B, PIC18F2455/2550/4455/4550 Data Sheet, Microchip Technology Incorporation Overholt, D., 2005, The Create USB Interface, Massachusetts Institute of Techology, http://www.create.ucsb.edu/~dano/CUI/ (05.08.2006) Soydaş, R., 2002, USB Port ve Dahası, Marmara Üniversitesi Teknik Bilimler MYO Araştırma Ödevi, 13 s, İstanbul Şahin, C., Dayanık, A. ve Altınbaşak, C., 2006, PIC Programlama Teknikleri ve PIC16F877A, 1. baskı, Altaş Yayınları, 526 s, İstanbul Tan, W.M., 1997, Developing USB PC Peripherals Using The Intel 8x930Ax USB Microcontroller, Annabooks, 189 p, San Diego, USA 70 EKLER EK 1 Çizelge 2.3. PORTA bacak fonksiyonları Bacak RA0/AN0 TRIS Ayarı 0 1 1 0 1 1 I/O I/O tipi Açıklama Çıkış Giriş Giriş Çıkış Giriş Giriş Dijital TTL Analog Dijital TTL Analog 0 Çıkış Dijital 1 Giriş TTL AN2 1 Giriş Analog VREF- 1 Giriş Analog CVREF x Çıkış Analog AN3 0 1 1 Çıkış Giriş Giriş Dijital TTL Analog VREF+ 1 Giriş Analog Çıkış Giriş Giriş Çıkış Dijital TOCKI C1OUT 0 1 1 0 Dijital RCV x Giriş TTL 0 1 1 1 1 0 Çıkış Giriş Giriş Giriş Giriş Çıkış Dijital TTL Analog TTL Analog Dijital 0 Çıkış Dijital 1 Giriş TTL OSC2 x Çıkış Analog CLKO x Çıkış Dijital LATA<0> dijital veri çıkışı. PORTA<0> veri girişi A/D analog giriş kanalı 0 ve karşılaştırıcı C1 - girişi LATA<1> dijital veri çıkışı PORTA<1>veri girişi; POR’da ‘0’ okur. A/D analog giriş kanalı 1 ve karşılaştırıcı C2 - girişi LATA<2> dijital veri çıkışı. CVREF çıkışı etkinleştirildiğinde kullanılmaz. PORTA<2> veri girişi; CVREF çıkışı veya analog fonksiyonlar etkinleştirildiğinde kullanılmaz. A/D analog giriş kanalı 2 ve karşılaştırıcı C2 + girişi A/D analog girişi ve karşılaştırıcı düşük giriş voltaj referans girişi. Karşılaştırıcı voltaj referans çıkışı. Bu özellik seçildiğinde dijital giriş kullanılamaz. LATA<3> dijital veri çıkışı. PORTA<3> veri girişi A/D analog giriş kanalı 3 ve karşılaştırıcı C1 + girişi A/D analog girişi ve karşılaştırıcı yüksek giriş voltaj referans girişi. LATA<4> dijital veri çıkışı. PORTA<4> veri girişi Timer1 saat girişi Karşılaştırıcı 1 çıkışı Harici USB alıcı-vericisi (Fark alıcısından gelen giriş) girişi LATA<5> dijital veri çıkışı. PORTA<5> veri girişi A/D analog giriş kanalı 4 SSP için uydu seçme girişi (MSSP modülü için) Yüksek/Alçak – Voltaj Tespit Girişi Karşılaştırıcı 2 çıkışı LATA<6> dijital veri çıkışı; ECIO, ECPIO ve INTIO modlarında kullanılır, yoksa ‘0’ okunur. PORTA<6> veri girişi; ECIO, ECPIO ve INTIO modlarında kullanılır, yoksa ‘0’ okunur. Ana osilatör geri besleme çıkışı bağlantısı (tüm XT ve HS modları için) Sistem döngü saati çıkışı; EC, ECPLL ve INTCKO modlarında kullanılır. Fonksiyon RA0 AN0 RA1/AN1 RA1 RA1 RA2 RA2/AN2/ VREF-/CVREF RA3 RA3/AN3/ VREF+ RA4 RA4/TOCKI /C1OUT /RCV RA5/AN4/ SS/ HLVDIN/ C2OUT RA5 AN4 SS HLVDIN C2OUT ST ST RA6 OSC2/ CLKO/RA6 71 EK 2 Çizelge 2.4. PORTB bacak fonksiyonları Bacak I/O I/O tipi Açıklama AN12 INT0 TRIS Ayarı 0 1 1 1 Çıkış Giriş Giriş Giriş Dijital TTL Analog ST FLT0 1 Giriş ST SDI 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 0 1 1 0 1 0 0 1 1 1 0 0 1 1 x 0 1 1 x 0 1 1 x x Giriş Çıkış Giriş Çıkış Giriş Giriş Giriş Çıkış Giriş Çıkış Giriş Çıkış Giriş Giriş Giriş Çıkış Çıkış Giriş Giriş Çıkış Giriş Çıkış Çıkış Giriş Giriş Giriş Çıkış Çıkış Giriş Giriş Giriş Çıkış Giriş Giriş Giriş Çıkış Giriş Giriş Çıkış Giriş ST Dijital I2C/SMB Dijital TTL Analog ST Dijital ST Dijital I2C/SMB Dijital TTL Analog ST Dijital TTL Analog Analog Dijital ST Dijital Dijital TTL Analog TTL Dijital Dijital TTL TTL ST Dijital TTL TTL ST Dijital TTL TTL Dijital ST LATB<0> dijital veri çıkışı. PORTB<0> veri girişi A/D analog giriş kanalı 12. Harici Kesme 0 girişi Geliştirilmiş PWM Hata girişi (ECCP1 modülü); yazılımla etkinleştirilir. SPI veri girişi (MSSP modülü) I2C veri çıkışı (MSSP modülü) I2C veri girişi (MSSP modülü) LATB<1> dijital veri çıkışı. PORTB<1> veri girişi A/D analog giriş kanalı 10. Harici Kesme 1 girişi SPI saat çıkışı (MSSP modülü) SPI saat girişi (MSSP modülü) I2C saat çıkışı (MSSP modülü) I2C saat girişi (MSSP modülü) LATB<2> dijital veri çıkışı. PORTB<2> veri girişi A/D analog giriş kanalı 8. Harici Kesme 2 girişi Harici USB alıcı-vericisi VMO veri çıkışı LATB<3> dijital veri çıkışı. PORTB<3> veri girişi A/D analog giriş kanalı 9. CCP2 Karşılaştırma ve PWM çıkışı CCP2 Yakalama girişi Harici USB alıcı-vericisi VPO veri çıkışı LATB<4> dijital veri çıkışı. PORTB<4> veri girişi A/D analog giriş kanalı 11. Bacak değiştirme üzerinde kesme. SPP yonga seçim kontrol çıkışı LATB<5> dijital veri çıkışı. PORTB<5> veri girişi Bacak değiştirme üzerinde kesme. Tek-Kaynak Programlama modu girişi (ICSP) LATB<6> dijital veri çıkışı. PORTB<6> veri girişi Bacak değiştirme üzerinde kesme. ICSP saat girişi LATB<7> dijital veri çıkışı. PORTB<7> veri girişi Bacak değiştirme üzerinde kesme. ICSP veri çıkışı ICSP veri girişi Fonksiyon RB0 RB0/AN12/ INT0/FLT0/ SDI/SDA SDA RB1 RB1/AN10/ INT1/SCK/ SCL AN10 INT1 SCK SCL RB2 RB2/AN8/ INT2/VMO AN8 INT2 VM0 RB3 RB3/AN9/ CCP2/VPO AN9 CCP2 VPO RB4 RB4/AN11/ KBI0/CSSPP RB5/KBI1/ PGM RB6/KBI2/ PGC AN11 KBI0 CSSPP RB5 KBI1 PGM RB6 KBI2 PGC RB7 RB7/KBI3/ PGD KBI3 PGD 72 EK 3 Çizelge 2.5. PORTC bacak fonksiyonları Bacak TRIS Ayarı 0 1 I/O I/O tipi Açıklama Çıkış Giriş Dijital ST T1OSO x Çıkış Analog T13CKI 1 0 1 Giriş Çıkış Giriş ST Dijital ST T1OSI x Giriş Analog CCP2 0 1 Çıkış Giriş Dijital ST UOE 0 Çıkış Dijital 0 1 0 1 0 - Çıkış Giriş Çıkış Giriş Çıkış Giriş - Çıkış - Giriş Dijital ST Dijital ST Dijital TTL USB Vericisi USB Vericisi LATC<0> dijital veri çıkışı. PORTC<0> veri girişi Timer1 osilatör çıkışı;Timer1 seçildiğinde seçili duruma gelir. Dijital giriş/çıkışlar seçilemez. Timer1/Timer3 sayıcı girişi LATC<1> dijital veri çıkışı. PORTC<1> veri girişi Timer1 osilatör girişi;Timer1 seçildiğinde seçili duruma gelir. Dijital giriş/çıkışlar seçilemez. CCP2 Karşılaştırma ve PWM çıkışı CCP2 Yakalama girişi Harici USB alıcı-verici OE (çıkış seçilir kılınmış) çıkışı LATC<2> dijital veri çıkışı. PORTC<2> veri girişi ECCP1 Karşılaştırma ve PWM çıkışı ECCP1 Yakalama girişi ECCP1 Geliştirilmiş PWM çıkışı PORTC<4> veri girişi; USB seçili iken seçilemez. VM - Giriş TTL RC5 - Giriş - Çıkış - Giriş TTL USB Vericisi USB Vericisi VP - Giriş TTL RC6 0 1 Çıkış Giriş Dijital ST TX 0 Çıkış Dijital 0 1 0 1 1 0 1 1 Çıkış Giriş Çıkış Giriş Giriş Çıkış Giriş Giriş Dijital ST Dijital ST ST Dijital ST Dijital Fonksiyon RC0 RC0/T1OSO /T13CKI RC1 RC1/T1OSI /CCP2 /UOE RC2 RC2/CCP1/ P1A CCP1 P1A RC4 RC4/D – / VM RC5/D + / VP RC6/TX/ CK D– D+ CK RC7 RC7/RX/ DT/SDO RX DT SDO USB yolu fark eksi hat çıkışı (dâhili alıcı-verici) USB yolu fark eksi hat girişi (dâhili alıcı-verici) Harici USB alıcı-verici VM (D – ‘den gelen giriş hattı) girişi PORTC<5> veri girişi; USB seçili iken seçilemez. USB yolu fark artı hat çıkışı (dâhili alıcı-verici) USB yolu fark artı hat girişi (dâhili alıcı-verici) Harici USB alıcı-verici VP (D + ‘dan gelen giriş hattı) girişi LATC<6> dijital veri çıkışı. PORTC<6> veri girişi Asenkron seri gönderme veri çıkışı (EUSART modülü) Senkron seri saat çıkışı (EUSART modülü) Senkron seri saat girişi (EUSART modülü) LATC<7> dijital veri çıkışı. PORTC<7> veri girişi Asenkron seri alma veri girişi (EUSART modülü) Senkron seri veri çıkışı (EUSART modülü) Senkron seri veri girişi (EUSART modülü) SPI veri çıkışı (MSSP modülü) 73 EK 4 Çizelge 2.6. PORTD bacak fonksiyonları Bacak Fonksiyon RD0 RD0/SPP0 SPP0 RD1 RD1/SPP1 SPP1 RD2 RD2/SPP2 SPP2 RD3 RD3/SPP3 SPP3 RD4 RD4/SPP4 SPP4 RD5 RD5/SPP5/ P1B SPP5 P1B RD6 RD6/SPP6/ P1C SPP6 P1C RD7 RD7/SPP7/ P1D SPP7 P1D TRIS Ayarı 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 I/O I/O tipi Açıklama Çıkış Giriş Çıkış Giriş Çıkış Giriş Çıkış Giriş Çıkış Giriş Çıkış Giriş Çıkış Giriş Çıkış Giriş Çıkış Giriş Çıkış Giriş Çıkış Giriş Çıkış Giriş Çıkış Çıkış Giriş Çıkış Giriş Çıkış Çıkış Giriş Çıkış Giriş Çıkış Dijital ST Dijital TTL Dijital ST Dijital TTL Dijital ST Dijital TTL Dijital ST Dijital TTL Dijital ST Dijital TTL Dijital ST Dijital TTL Dijital Dijital ST Dijital TTL Dijital Dijital ST Dijital TTL Dijital LATD<0> dijital veri çıkışı. PORTD<0> veri girişi SPP<0> dijital veri çıkışı. SPP<0> dijital veri girişi. LATD<1> dijital veri çıkışı. PORTD<1> veri girişi SPP<1> dijital veri çıkışı. SPP<1> dijital veri girişi. LATD<2> dijital veri çıkışı. PORTD<2> veri girişi SPP<2> dijital veri çıkışı. SPP<2> dijital veri girişi. LATD<3> dijital veri çıkışı. PORTD<3> veri girişi SPP<3> dijital veri çıkışı. SPP<3> dijital veri girişi. LATD<4> dijital veri çıkışı. PORTD<4> veri girişi SPP<4> dijital veri çıkışı. SPP<4> dijital veri girişi. LATD<5> dijital veri çıkışı. PORTD<5> veri girişi SPP<5> dijital veri çıkışı. SPP<5> dijital veri girişi. ECCP1 Geliştirilmiş PWM çıkışı, kanal B LATD<6> dijital veri çıkışı. PORTD<6> veri girişi SPP<6> dijital veri çıkışı. SPP<6> dijital veri girişi. ECCP1 Geliştirilmiş PWM çıkışı, kanal C LATD<7> dijital veri çıkışı. PORTD<7> veri girişi SPP<7> dijital veri çıkışı. SPP<7> dijital veri girişi. ECCP1 Geliştirilmiş PWM çıkışı, kanal D 74 EK 5 Çizelge 2.7. PORTE bacak fonksiyonları Bacak RE0/AN5/ CK1SPP RE1/AN6/ CK2SPP RE2/AN7/ OESPP MCLR/VPP/ RE3 I/O I/O tipi Açıklama AN7 OESPP TRIS Ayarı 0 1 1 0 0 1 1 0 0 1 1 0 Çıkış Giriş Giriş Çıkış Çıkış Giriş Giriş Çıkış Çıkış Giriş Giriş Çıkış Dijital ST Analog Dijital Dijital ST Analog Dijital Dijital ST Analog Dijital MCLR - Giriş ST VPP - Giriş ST RE3 - Giriş Analog LATE<0> dijital veri çıkışı. PORTE<0> veri girişi A/D giriş kanalı 5 SPP saat 1 çıkışı (SPP seçili kılındığında) LATE<1> dijital veri çıkışı. PORTE<1> veri girişi A/D giriş kanalı 6 SPP saat 2 çıkışı (SPP seçili kılındığında) LATE<2> dijital veri çıkışı. PORTE<2> veri girişi A/D giriş kanalı 7 SPP seçme çıkışı (SPP seçili kılındığında) PORTE<2> veri girişi; MCLRE konfigürasyon biti ‘0’ seçildiğinde. Harici Ana Temizleme girişi; MCLRE konfigürasyon biti ‘1’ seçildiğinde. Yüksek-voltaj denetleme, ICSP modunda giriş denetlemesi için kullanılır. Bacak modundan bağımsız olarak her zaman mevcuttur. Fonksiyon RE0 AN5 CK1SPP RE1 AN6 CK1SPP RE2 75 EK 6 Şekil 2.10. PIC18F4550 veri hafızası 76 EK 7 /********************************************************************* * * Microchip USB Bootloader Version 1.0 * ********************************************************************* * FileName: main.c * Dependencies: See INCLUDES section below * Processor: PIC18 * Compiler: C18 2.30.01+ * Company: Microchip Technology, Inc. * * Software License Agreement * * The software supplied herewith by Microchip Technology Incorporated * (the “Company”) for its PICmicro® Microcontroller is intended and * supplied to you, the Company’s customer, for use solely and * exclusively on Microchip PICmicro Microcontroller products. The * software is owned by the Company and/or its supplier, and is * protected under applicable copyright laws. All rights are reserved. * Any use in violation of the foregoing restrictions may subject the * user to criminal sanctions under applicable laws, as well as to * civil liability for the breach of the terms and conditions of this * license. * * Author Date Comment *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Rawin Rojvanit 11/19/04 Original. ********************************************************************/ /** I N C L U D E S **********************************************************/ #include <p18cxxx.h> #include "system\typedefs.h" // Required #include "system\usb\usb.h" // Required #include "io_cfg.h" // Required #include "system\usb\usb_compile_time_validation.h" // Optional /** V A R I A B L E S ********************************************************/ #pragma udata /** P R I V A T E P R O T O T Y P E S ***************************************/ /** V E C T O R R E M A P P I N G *******************************************/ #pragma code _HIGH_INTERRUPT_VECTOR = 0x000008 void _high_ISR (void) { _asm goto RM_HIGH_INTERRUPT_VECTOR _endasm } #pragma code _LOW_INTERRUPT_VECTOR = 0x000018 void _low_ISR (void) { 77 _asm goto RM_LOW_INTERRUPT_VECTOR _endasm } #pragma code /** D E C L A R A T I O N S **************************************************/ #pragma code /****************************************************************************** * Function: void main(void) * * PreCondition: None * * Input: None * * Output: None * * Side Effects: None * * Overview: Main program entry point. * * Note: None *****************************************************************************/ void main(void) { byte temp; temp = ADCON1; ADCON1 |= 0x0F; //TRISBbits.TRISB4 = 1; // Reset value is already '1' //Check Bootload Mode Entry Condition if(PORTBbits.RB4 == 1) // If not pressed, User Mode { ADCON1 = temp; // Restore reset value _asm goto RM_RESET_VECTOR _endasm }//end if //Bootload Mode mInitAllLEDs(); mInitAllSwitches() mInitPOT(); ADCON2bits.ADFM = 1; // ADC result right justified mInitializeUSBDriver(); // See usbdrv.h USBCheckBusStatus(); // Modified to always enable USB module while(1) { USBDriverService(); // See usbdrv.c BootService(); // See boot.c }//end while }//end main #pragma code user = RM_RESET_VECTOR /** EOF main.c ***************************************************************/ 78 EK 8 /********************************************************************* * * Microchip USB C18 Firmware - USB Bootloader Version 1.00 * ********************************************************************* * FileName: boot.h * Dependencies: See INCLUDES section below * Processor: PIC18 * Compiler: C18 2.30.01+ * Company: Microchip Technology, Inc. * * Software License Agreement * * The software supplied herewith by Microchip Technology Incorporated * (the “Company”) for its PICmicro® Microcontroller is intended and * supplied to you, the Company’s customer, for use solely and * exclusively on Microchip PICmicro Microcontroller products. The * software is owned by the Company and/or its supplier, and is * protected under applicable copyright laws. All rights are reserved. * Any use in violation of the foregoing restrictions may subject the * user to criminal sanctions under applicable laws, as well as to * civil liability for the breach of the terms and conditions of this * license. * * Author Date Comment *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Rawin Rojvanit 11/19/04 Original. ********************************************************************/ #ifndef BOOT_H #define BOOT_H /** I N C L U D E S **********************************************************/ #include "system\typedefs.h" /** D E F I N I T I O N S ****************************************************/ /****** Compiler Specific Definitions *******************************/ #if defined(HI_TECH_C) #define HITECH_C18 #else #define MCHP_C18 #endif #if defined(MCHP_C18) && defined(HITECH_C18) #error "Invalid Compiler selection." #endif #if !defined(MCHP_C18) && !defined(HITECH_C18) #error "Compiler not supported." #endif #if defined(MCHP_C18) #define EECON1_RD EECON1bits.RD 79 #define EECON1_WR #endif EECON1bits.WR /****** Processor Specific Definitions ******************************/ #if defined(__18F2455) || defined(__18F2550) ||\ defined(__18F4455)|| defined(__18F4550) /****** Remapped Vectors ******************** * _____________________ * | RESET | 0x000000 * | LOW_INT | 0x000008 * | HIGH_INT | 0x000018 * | TRAP | 0x000028 * | Bootloader | 0x00002E * . . * . . * | USER_RESET | 0x000800 * | USER_LOW_INT | 0x000808 * | USER_HIGH_INT | 0x000818 * | USER_TRAP | 0x000828 * | | * | Program Memory | * . . * |___________________| 0x0005FFF / 0x0007FFF */ #define RM_RESET_VECTOR 0x000800 #define RM_HIGH_INTERRUPT_VECTOR 0x000808 #define RM_LOW_INTERRUPT_VECTOR 0x000818 #else "Processor not supported." #endif /* Bootloader Version */ #define MINOR_VERSION 0x00 //Bootloader Version 1.00 #define MAJOR_VERSION 0x01 /* State Machine */ #define WAIT_FOR_CMD 0x00 //Wait for Command packet #define SENDING_RESP 0x01 //Sending Response /****************************************************************************** * Macro: (bit) mBootRxIsBusy(void) * * PreCondition: None * * Input: None * * Output: None * * Side Effects: None * * Overview: This macro is used to check if the bulk OUT endpoint is * busy (owned by SIE) or not. * Typical Usage: if(mBootRxIsBusy()) * * Note: None 80 *****************************************************************************/ #define mBootRxIsBusy() BOOT_BD_OUT.Stat.UOWN /****************************************************************************** * Macro: (bit) mBootTxIsBusy(void) * * PreCondition: None * * Input: None * * Output: None * * Side Effects: None * * Overview: This macro is used to check if the bulk IN endpoint is * busy (owned by SIE) or not. * Typical Usage: if(mBootTxIsBusy()) * * Note: None *****************************************************************************/ #define mBootTxIsBusy() BOOT_BD_IN.Stat.UOWN /** S T R U C T U R E S ******************************************************/ /********************************************************************* * General Data Packet Structure: * ACCESS RAM: Buffer Starting Address is assigned by compiler. * __________________ DATA_PACKET.FIELD * | COMMAND | 0 [CMD] * | LEN | 1 [LEN] * | ADDRL | 2 [ ] [ADR.LOW] * | ADDRH | 3 [ADR.pAdr]: [ADR.HIGH] * | ADDRU | 4 [ ] [ADR.UPPER] *| | 5 [DATA] *| | * . DATA . *. . *| | 62 * |________________| 63 * ********************************************************************/ #define OVER_HEAD 5 //Overhead: <CMD_CODE><LEN><ADDR:3> #define DATA_SIZE (BOOT_EP_SIZE - OVER_HEAD) typedef union _BOOT_DATA_PACKET { byte _byte[BOOT_EP_SIZE]; //For Byte Access struct { enum { READ_FLASH = 0x01, WRITE_FLASH = 0x02, ERASE_FLASH = 0x03, READ_EEDATA = 0x04, WRITE_EEDATA = 0x05, 81 READ_CONFIG = 0x06, WRITE_CONFIG = 0x07, READ_VERSION = 0x00, UPDATE_LED = 0x32, READ_POT = 0x37, RESET = 0xFF }CMD; byte len; union { rom far char *pAdr; //Address Pointer struct { byte low; //Little-indian order byte high; byte upper; }; }ADR; byte data[DATA_SIZE]; }; struct { unsigned :8; byte led_num; byte led_status; }; } BOOT_DATA_PACKET; /** E X T E R N S ************************************************************/ /** P U B L I C P R O T O T Y P E S *****************************************/ void BootInitEP(void); void BootService(void); #endif //BOOT_H 82 EK 9 /********************************************************************* * * Microchip USB C18 Firmware - USB Bootloader Version 1.00 * ********************************************************************* * FileName: boot.c * Dependencies: See INCLUDES section below * Processor: PIC18 * Compiler: C18 2.30.01+ * Company: Microchip Technology, Inc. * * Software License Agreement * * The software supplied herewith by Microchip Technology Incorporated * (the “Company”) for its PICmicro® Microcontroller is intended and * supplied to you, the Company’s customer, for use solely and * exclusively on Microchip PICmicro Microcontroller products. The * software is owned by the Company and/or its supplier, and is * protected under applicable copyright laws. All rights are reserved. * Any use in violation of the foregoing restrictions may subject the * user to criminal sanctions under applicable laws, as well as to * civil liability for the breach of the terms and conditions of this * license. * * Author Date Comment *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Rawin Rojvanit 11/19/04 Original. USB Bootloader ********************************************************************/ /****************************************************************************** * -boot.c* This file contains functions necessary to carry out bootloading tasks. * The only 2 USB specific functions are BootInitEP() and BootService(). * All other functions can be reused with other communication methods. *****************************************************************************/ /** I N C L U D E S **********************************************************/ #include <p18cxxx.h> #include "system\typedefs.h" #include "system\usb\usb.h" #include "io_cfg.h" /** V A R I A B L E S ********************************************************/ #pragma udata byte counter; byte byteTemp; byte trf_state; word big_counter; /** P R I V A T E P R O T O T Y P E S ***************************************/ void BlinkUSBStatus(void); void ReadPOT(void); BOOL Switch3IsPressed(void); 83 void Exercise_02(void); /** D E C L A R A T I O N S **************************************************/ #pragma code /** C L A S S S P E C I F I C R E Q ****************************************/ /** U S E R A P I ***********************************************************/ /****************************************************************************** * Function: void BootInitEP(void) * * PreCondition: None * * Input: None * * Output: None * * Side Effects: None * * Overview: BootInitEP initializes bootloader endpoints, buffer * descriptors, internal state-machine, and variables. * It should be called after the USB host has sent out a * SET_CONFIGURATION request. * See USBStdSetCfgHandler() in usb9.c for examples. * * Note: None *****************************************************************************/ void BootInitEP(void) { trf_state = WAIT_FOR_CMD; BOOT_UEP = EP_OUT_IN|HSHK_EN; // Enable 2 data pipes /* * Do not have to init Cnt of IN pipes here. * Reason: Number of bytes to send to the host * varies from one transaction to * another. Cnt should equal the exact * number of bytes to transmit for * a given IN transaction. * This number of bytes will only * be known right before the data is * sent. */ BOOT_BD_OUT.Cnt = sizeof(dataPacket); // Set buffer size BOOT_BD_OUT.ADR = (byte*)&dataPacket; // Set buffer address BOOT_BD_OUT.Stat._byte = _USIE|_DAT0|_DTSEN;// Set status BOOT_BD_IN.ADR = (byte*)&dataPacket; // Set buffer address BOOT_BD_IN.Stat._byte = _UCPU|_DAT1; // Set buffer status }//end BootInitEP void ReadPOT(void) { ADCON0bits.GO = 1; // Start AD conversion while(ADCON0bits.NOT_DONE); // Wait for conversion 84 return; }//end ReadPOT void StartWrite(void) { /* * A write command can be prematurely terminated by MCLR or WDT reset */ EECON2 = 0x55; EECON2 = 0xAA; EECON1_WR = 1; }//end StartWrite void ReadVersion(void) //TESTED: Passed { dataPacket._byte[2] = MINOR_VERSION; dataPacket._byte[3] = MAJOR_VERSION; }//end ReadVersion void ReadProgMem(void) //TESTED: Passed { for (counter = 0; counter < dataPacket.len; counter++) { //2 separate inst prevents compiler from using RAM stack byteTemp = *((dataPacket.ADR.pAdr)+counter); dataPacket.data[counter] = byteTemp; }//end for TBLPTRU = 0x00; // forces upper byte back to 0x00 // optional fix is to set large code model }//end ReadProgMem void WriteProgMem(void) //TESTED: Passed { /* * The write holding register for the 18F4550 family is * actually 32-byte. The code below only tries to write * 16-byte because the GUI program only sends out 16-byte * at a time. * This limitation will be fixed in the future version. */ dataPacket.ADR.low &= 0b11110000; //Force 16-byte boundary EECON1 = 0b10000100; //Setup writes: EEPGD=1,WREN=1 //LEN = # of byte to write for (counter = 0; counter < (dataPacket.len); counter++) { *((dataPacket.ADR.pAdr)+counter) = \ dataPacket.data[counter]; if ((counter & 0b00001111) == 0b00001111) { StartWrite(); }//end if }//end for }//end WriteProgMem void EraseProgMem(void) //TESTED: Passed 85 { //The most significant 16 bits of the address pointer points to the block //being erased. Bits5:0 are ignored. (In hardware). //LEN = # of 64-byte block to erase EECON1 = 0b10010100; //Setup writes: EEPGD=1,FREE=1,WREN=1 for(counter=0; counter < dataPacket.len; counter++) { *(dataPacket.ADR.pAdr+(((int)counter) << 6)); //Load TBLPTR StartWrite(); }//end for TBLPTRU = 0; // forces upper byte back to 0x00 // optional fix is to set large code model // (for USER ID 0x20 0x00 0x00) }//end EraseProgMem void ReadEE(void) //TESTED: Passed { EECON1 = 0x00; for(counter=0; counter < dataPacket.len; counter++) { EEADR = (byte)dataPacket.ADR.pAdr + counter; //EEADRH = (BYTE)(((int)dataPacket.FIELD.ADDR.POINTER + counter) >> 8); EECON1_RD = 1; dataPacket.data[counter] = EEDATA; }//end for }//end ReadEE void WriteEE(void) //TESTED: Passed { for(counter=0; counter < dataPacket.len; counter++) { EEADR = (byte)dataPacket.ADR.pAdr + counter; //EEADRH = (BYTE)(((int)dataPacket.FIELD.ADDR.POINTER + counter) >> 8); EEDATA = dataPacket.data[counter]; EECON1 = 0b00000100; //Setup writes: EEPGD=0,WREN=1 StartWrite(); while(EECON1_WR); //Wait till WR bit is clear }//end for }//end WriteEE //WriteConfig is different from WriteProgMem b/c it can write a byte void WriteConfig(void) //TESTED: Passed { EECON1 = 0b11000100; //Setup writes: EEPGD=1,CFGS=1,WREN=1 for (counter = 0; counter < dataPacket.len; counter++) { *((dataPacket.ADR.pAdr)+counter) = \ dataPacket.data[counter]; StartWrite(); }//end for TBLPTRU = 0x00; // forces upper byte back to 0x00 // optional fix is to set large code model }//end WriteConfig void BootService(void) 86 { BlinkUSBStatus(); if((usb_device_state < CONFIGURED_STATE)||(UCONbits.SUSPND==1)) return; if(trf_state == SENDING_RESP) { if(!mBootTxIsBusy()) { BOOT_BD_OUT.Cnt = sizeof(dataPacket); mUSBBufferReady(BOOT_BD_OUT); trf_state = WAIT_FOR_CMD; }//end if return; }//end if if(!mBootRxIsBusy()) { counter = 0; switch(dataPacket.CMD) { case READ_VERSION: ReadVersion(); counter=0x04; break; case READ_FLASH: case READ_CONFIG: ReadProgMem(); counter+=0x05; break; case WRITE_FLASH: WriteProgMem(); counter=0x01; break; case ERASE_FLASH: EraseProgMem(); counter=0x01; break; case READ_EEDATA: ReadEE(); counter+=0x05; break; case WRITE_EEDATA: WriteEE(); counter=0x01; break; case WRITE_CONFIG: WriteConfig(); counter=0x01; break; 87 case RESET: //When resetting, make sure to drop the device off the bus //for a period of time. Helps when the device is suspended. UCONbits.USBEN = 0; big_counter = 0; while(--big_counter); Reset(); break; case UPDATE_LED: if(dataPacket.led_num == 3) { mLED_3 = dataPacket.led_status; counter = 0x01; }//end if if(dataPacket.led_num == 4) { mLED_4 = dataPacket.led_status; counter = 0x01; }//end if if(dataPacket.led_num == 5) { mLED_5 = dataPacket.led_status; counter = 0x01; }//end if break; case READ_POT: if(dataPacket.led_num == 6) { dataPacket._byte[1] = sw3; counter=0x02; } else { ReadPOT(); dataPacket._byte[1] = ADRESL; dataPacket._byte[2] = ADRESH; counter=0x03; }//end Switch3IsPressed break; default: break; }//end switch() trf_state = SENDING_RESP; if(counter != 0) { BOOT_BD_IN.Cnt = counter; mUSBBufferReady(BOOT_BD_IN); }//end if }//end if }//end BootService /****************************************************************************** * Function: void BlinkUSBStatus(void) 88 * * PreCondition: None * * Input: None * * Output: None * * Side Effects: None * * Overview: BlinkUSBStatus turns on and off LEDs corresponding to * the USB device state. * * Note: mLED macros can be found in io_cfg.h * usb_device_state is declared in usbmmap.c and is modified * in usbdrv.c, usbctrltrf.c, and usb9.c *****************************************************************************/ void BlinkUSBStatus(void) { static word led_count=0; if(led_count == 0)led_count = 20000U; led_count--; #define mLED_Both_Off() #define mLED_Both_On() #define mLED_Only_1_On() #define mLED_Only_2_On() {mLED_1_Off();mLED_2_Off();} {mLED_1_On();mLED_2_On();} {mLED_1_On();mLED_2_Off();} {mLED_1_Off();mLED_2_On();} if(UCONbits.SUSPND == 1) { if(led_count==0) { mLED_1_Toggle(); mLED_2 = mLED_1; // Both blink at the same time }//end if } else { if(usb_device_state == DETACHED_STATE) { mLED_Both_Off(); } else if(usb_device_state == ATTACHED_STATE) { mLED_Both_On(); } else if(usb_device_state == POWERED_STATE) { mLED_Only_1_On(); } else if(usb_device_state == DEFAULT_STATE) { mLED_Only_2_On(); } else if(usb_device_state == ADDRESS_STATE) { if(led_count == 0) 89 { mLED_1_Toggle(); mLED_2_Off(); }//end if } else if(usb_device_state == CONFIGURED_STATE) { if(led_count==0) { mLED_1_Toggle(); mLED_2 = !mLED_1; // Alternate blink }//end if }//end if(...) }//end if(UCONbits.SUSPND...) }//end BlinkUSBStatus /** EOF boot.c ***************************************************************/ 90 EK 10 /********************************************************************* * * Microchip USB C18 Firmware Version 1.0 * ********************************************************************* * FileName: io_cfg.h * Dependencies: See INCLUDES section below * Processor: PIC18 * Compiler: C18 2.30.01+ * Company: Microchip Technology, Inc. * * Software License Agreement * * The software supplied herewith by Microchip Technology Incorporated * (the “Company”) for its PICmicro® Microcontroller is intended and * supplied to you, the Company’s customer, for use solely and * exclusively on Microchip PICmicro Microcontroller products. The * software is owned by the Company and/or its supplier, and is * protected under applicable copyright laws. All rights are reserved. * Any use in violation of the foregoing restrictions may subject the * user to criminal sanctions under applicable laws, as well as to * civil liability for the breach of the terms and conditions of this * license. * * Author Date Comment *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Rawin Rojvanit 11/19/04 Original. ********************************************************************/ /****************************************************************************** * -io_cfg.h* I/O Configuration File * The purpose of this file is to provide a mapping mechanism between * pin functions and pin assignments. This provides a layer of abstraction * for the firmware code and eases the migration process from one target * board design to another. * *****************************************************************************/ #ifndef IO_CFG_H #define IO_CFG_H /** I N C L U D E S *************************************************/ #include "autofiles\usbcfg.h" /** T R I S *********************************************************/ #define INPUT_PIN 1 #define OUTPUT_PIN 0 /** U S B ***********************************************************/ #define tris_usb_bus_sense TRISAbits.TRISA1 // Input #if defined(USE_USB_BUS_SENSE_IO) 91 #define usb_bus_sense #else #define usb_bus_sense #endif #define tris_self_power PORTAbits.RA1 1 TRISAbits.TRISA2 // Input #if defined(USE_SELF_POWER_SENSE_IO) #define self_power PORTAbits.RA2 #else #define self_power 1 #endif /** L E D ***********************************************************/ #define mInitAllLEDs() LATD &= 0x00; TRISD &= 0x00; #define mLED_1 #define mLED_2 #define mLED_3 #define mLED_4 #define mLED_5 LATDbits.LATD0 LATDbits.LATD1 LATDbits.LATD2 LATDbits.LATD3 LATDbits.LATD4 #define mLED_1_On() #define mLED_2_On() #define mLED_3_On() #define mLED_4_On() #define mLED_5_On() mLED_1 = 1; mLED_2 = 1; mLED_3 = 1; mLED_4 = 1; mLED_5 = 1; #define mLED_1_Off() #define mLED_2_Off() #define mLED_3_Off() #define mLED_4_Off() #define mLED_5_Off() mLED_1 = 0; mLED_2 = 0; mLED_3 = 0; mLED_4 = 0; mLED_5 = 0; #define mLED_1_Toggle() #define mLED_2_Toggle() #define mLED_3_Toggle() #define mLED_4_Toggle() #define mLED_5_Toggle() mLED_1 = !mLED_1; mLED_2 = !mLED_2; mLED_3 = !mLED_3; mLED_4 = !mLED_4; mLED_5 = !mLED_5; /** S W I T C H *****************************************************/ #define mInitAllSwitches() TRISBbits.TRISB4=1;TRISBbits.TRISB5=1;TRISBbits.TRISB5=1; #define mInitSwitch2() TRISBbits.TRISB4=1; #define mInitSwitch3() TRISBbits.TRISB5=1; #define sw3 PORTBbits.RB4 #define sw2 PORTBbits.RB5 /** P O T ***********************************************************/ #define mInitPOT() TRISAbits.TRISA0=1;ADCON0=0x01;ADCON2=0x3C; /** S P I : Chip Select Lines ************************************* #define tris_cs_temp_sensor TRISBbits.TRISB2 // Output #define cs_temp_sensor LATBbits.LATB2 #define tris_cs_sdmmc #define cs_sdmmc TRISBbits.TRISB3 LATBbits.LATB3 // Output 92 /** S D M M C *******************************************************/ #define TRIS_CARD_DETECT TRISBbits.TRISB4 // Input #define CARD_DETECT PORTBbits.RB4 #define TRIS_WRITE_DETECT TRISAbits.TRISA4 #define WRITE_DETECT PORTAbits.RA4 #endif //IO_CFG_H // Input 93 EK 11 Komut Alanı Türkçe Açıklama W ile f ’yi topla ADDWF ADDWFC ANDWF CLRF COMF f,d,a f,d,a f,d,a f,a f,d,a CPFSEQ f,a WREG ile f ' yi karşılaştır. Eşitse alttaki komuta atla CPFSGT f,a WREG ile f ' yi karşılaştır. WREG küçükse alttaki komuta atla CPFSLT f,a WREG ile f ' yi karşılaştır. WREG büyükse alttaki komuta atla W ile f ' yi topla elde bitini f ' ye ekle W ile f ’yi VE işlemine tabi tut. f ’yi sıfırla. f ’nin tersini al DECF f,d,a f’deki sayıyı bir azalt. DECFSZ f,d,a f’deki sayıyı bir azalt, sonuç 0’sa altındaki komutu atla. DCFSNZ f,d,a f’deki sayıyı bir azalt, sonuç 0’dan farklı ise altındaki komuta atla. INCF f,d,a f’deki sayıyı bir arttır. INCFSZ f,d,a f’deki sayıyı bir arttırır, sonuç 0’sa altındaki komuta atla INFSNZ f,d,a f’deki sayıyı bir arttırır, sonuç 0 değilse altındaki komuta atla IORWF MOVF f,d,a f,d,a W ile f’yi VEYA işlemine tabi tut. f’deki sayıyı hedefe taşı. MOVFF fs, fd f’deki sayıyı ikinci word’e taşı MOVWF MULWF NEGF f,a f,a f,a W’deki sayıyı f’de hedefe taşı. f 'deki sayıyı WREG ile çarp f 'yi negatif yap f’deki 8 biti başa Status 0 bitini ekleyerek sola kaydır, RLCF f,d,a RLNCF f,d,a RRCF f,d,a RRNCF f,d,a f’deki 8 biti başa Status 0 bitini ekleyerek sağa kaydır. SETF SUBFWB SUBWF SUBWFB SWAPF TSTFSZ XORWF f,a f,d,a f,d,a f,d,a f,d,a f,a f,d,a f 'yi 1 yap Elde kullanarak WREG den f 'yi çıkart W’deki sayıyı f’deki sayıdan çıkart. W’deki sayıyı f’deki sayıdan çıkart. Eldeyi değiştir. İlk dört bitle son dört bitin yerlerini değiştir. f 'yi test et 0 ise sonraki komuta atla W ile f’i XOR işlemine tabi tut. Dokuzuncu bitteki değeri sıfırıncı bite ata. f’deki 8 biti başa Status 0 bitini ekleyerek sola kaydır. f’deki 8 biti başa Status 0 bitini ekleyerek sağa kaydır, Dokuzuncu bitteki değeri sıfırıncı bite ata. Çizelge 2.9. Bayt yönlendirmeli işlemler komut seti 94 EK 12 Komut Alanı Türkçe Açıklama Bit yönlendirmeli işlemler BCF BSF BTFSC BTFSS BTG f, b, a f, b, a f, b, a f, b, a f, d, a f’deki bir biti sıfırla. f’deki bir biti set et. f’deki sayı 0’sa altındaki komutu atla f’deki sayı 1’se altındaki komutu atla. f’deki biti tersle Kontrol İşlemleri BC BN BNC BNN BNOV BNZ BOV BRA BZ CALL CLRWDT DAW GOTO NOP NOP POP PUSH RCALL RESET RETFIE RETURN SLEEP n n n n n n n n n n,s n n s s - Elde varsa n adresine gidilir. Sayı negatif ise n adresine gider Elde yoksa n adresine gidilir. Sayı Negatif değilse n adresine gider Taşma yoksa n adresine gidilir. Z=0 ise n adresine gidilir. Taşma varsa n adresine gidilir. n adresine gidilir. Z=1 ise n adresine gidilir. Alt programı çağır WDT’deki değeri sıfırla. WREG’i desimal düzelt Programda istenilen yere atla. İşlem yapma İşlem yapma 2 word Yığına AT Yığından AL n kadar ilerdeki komutu Göreli Çağır. Yazılımla sıfırlama Kesme sonunda yapılan işlemden normal programa dön. Çağır’la çağırılan alt programın sonu. Uyku moduna geç. kk kk kk r,kk k kk kk kk kk kk Verilen sabit sayıyı W’deki sayıya ekle. Verilen sabit sayıyla W’deki sayıyı VE işlemine tabi tut. Verilen sabit sayıyla W’deki sayıyı VEYA işlemine tabi tut. 1.Word değeri 2.Word e kopyele k Bank Seçme kaydedicisine yazılır Verilen sabit sayıyı W’nin içine ata. WREG i kk ile çarp Tablolama sırasında sayı değerini W’ye ata W’deki sayıyı verilen sabit sayıdan çıkart. Verilen sabit sayıyla W’deki sayıyı ÖZELVEYA işlemine tabi tut Sade İşlemler ADDLW ANDLW IORLW LFSR MOVLB MOVLW MULLW RETLW SUBLW XORLW Çizelge 2.10. Bit yönlendirmeli işlemler, kontrol işlemleri ve sade işlemler komut seti 95 EK 13 Komut Alanı Türkçe Açıklama Hafıza işlemleri - TBLRD* TBLRD*+ TBLRD*TBLRD+* TBLWT* TBLWT*+ TBLWT*TBLWT+* Tabloyu oku Sonrakini arttırarak tabloyu oku Sonrakini azaltarak tabloyu oku Öncekini arttırarak tabloyu oku Tabloya yaz Sonrakini arttırarak tabloya yaz Sonrakini azaltarak tabloya yaz Öncekini arttırarak tabloya yaz Geliştirilmiş Komut Seti ADDFSR ADDULNK CALLW MOVSF MOVSS PUSHL SUBFSR SUBULNK f, k k zs, fd zs, fd k f, k k Verilen sabit sayıyı FSR’ye ekle Verilen sabit sayıyı FSR2’ye ekle ve geri dör WREG’i kullanarak altprogramı çağır Kaynağı birinci kelimeye taşı Hedefi ikinci kelimeye taşı Verilen sabit sayıyı FSR2’de sakla, FSR2’yi azalt Verilen sabit sayıyı FSR2’den çıkart Verilen sabit sayıyı FSR2’den çıkart ve geri dön Çizelge 2.11. Hafıza işlemleri komut seti ve geliştirilmiş komut seti 96 ÖZGEÇMİŞ 1978 yılında Karabük’te doğdu. İlk ve ortaöğretimini bu şehirde tamamladıktan sonra 1995 yılında Gaziantep Üniversitesi Mühendislik Fakültesi Elektrik-Elektronik Mühendisliği Bölümünü kazandı. Lisans öğreniminden sonra, 2003 yılında Erzincan Üniversitesi Kelkit Aydın Doğan Meslek Yüksekokulu Endüstriyel Elektronik Programında Öğretim Görevlisi olarak göreve başladı. 2004 yılında Atatürk Üniversitesi Fen Bilimleri Enstitüsü Elektrik ve Elektronik Mühendisliği Anabilim Dalı’nda yüksek lisans öğrenimine başladı. Erzincan Üniversitesi Kelkit Aydın Doğan Meslek Yüksekokulu Endüstriyel Elektronik Programı Koordinatörü ve Müdür Yardımcısı olarak görevine devam etmektedir. Evli ve bir çocuk babasıdır. İngilizce bilmektedir.