Elektronik

ANALOG / DİJİTAL ÇEVİRİCİ

adc1Projemizin amacı ADC özelliği bulunmayan bir mikroişlemci ile ADC özelliği bulunan bir devre tasarlamaktır. Bunun için 5V’luk bir gerilimi temel alacağız ve bu gerilimi belirli çözünürlükte dijital bilgiye çevireceğiz. Potansiyometre yardımıyla 5V’luk gerilimi 0V ile 5V arasında değiştirebileceğiz.Sonrasında bu gerilimi ADC0831 entegresine giriş olarak vereceğiz.Bu entegre ve serisindeki entegrelerin çalışması referans gerilimine dayanmaktadır. Entegreye verdiğimiz referans gerilimini temel alır ve bu kıstasa göre giriş gerilimimizin durumunu karşılaştırarak bir çıkış verir. Bizim kullandığımız entegre olan ADC0831’in bir başka özelliği 8 bitlik çıkış bilgisini 8 uçtan değil tek bir uçtan vermesidir. Bu sayede hem mikroişlemcimizden fazla pin kullanmamış olacağız hem de çizimimiz daha rahat bir şekilde olacaktır. Ayrıca kullandığımız entegrelerin küçük olması bir diğer avantajımızdır. Bütün bunlara rağmen tek uçtan 8 bitlik veriyi alıp mikroişlemciye kaydetmek sorun olabilir fakat bu durum programlama bilgimize bağlı olarak sorun teşkil edecektir. Veriyi mikroişlemciye aktarırken programsal olarak senkronize bir zamanlayıcı, kaydırıcı, kaydedici, bit okuyucu gibi birimler oluşturmamız ve bir sistem dâhilinde bunları çalıştırmamız gerekecektir. Aldığımız dijital veriyi mikroişlemcimize kaydettikten sonra oluşturduğumuz hesaplama fonksiyonu ile 0 ile 255 arasında bir sayısal değere dönüştüreceğiz ve ardından bu değerden ölçülen voltajı da hesaplattırıp LCD ekranımızda sonuç olarak göstereceğiz. Program anlık değişimlerde           anlık    olarak  sonuç   vermektedir.

 

     Analog / Dijital (A/D) çeviriciler özel bir kodlayıcı tipidir.

 

Analog Giriş

(Volt)

                                DijitalÇıkış
        D         C        B       A
         0         0         0         0        0
         0.2         0         0         0        1
         0.4         0         0         1        0
         0.6         0         0         1        1
         0.8         0         1         0        0
         1.0         0         1         0        1
         1.2         0         1         1        0
         1.4         0         1         1        1
         1.6         1         0         0        0
         1.8         1         0         0        1
         2.0         1         0         1        0
         2.2         1         0         1        1
         2.4         1         1         0        0
         2.6         1         1         0        1
         2.8         1         1         1        0
         3.0         1         1         1        1

Şekil 1: Analog/Dijital (A/D) Çevirici blok diyagramı

A/D çeviricilerde giriş sinyali analog olarak değişen bir gerilimdir. Yukarıdaki blok diyagramda ki giriş gerilimi 0 volt ile 3 volt arasında değişmekte ve bu arada bulunan herhangi bir değeri alabilmektedir. Çıkışta ise girişteki analog değere göre bir binary sayı elde edilmektedir. Aşağıda ki tabloda, çeşitli analog giriş gerilimlerine göre, devre çıkışında elde edilen binary sayılar görülüyor. Tablodan da anlaşıldığı gibi girişe uygulanan gerilim 0 volt iken çıkıştaki dijital değer “0000“, girişe uygulanan gerilim +3 volt olduğunda ise çıkışta “1111” binary sayısı elde edilmektedir. Girişteki gerilim 2.4 volt olduğunda çıkışta “1100” binary sayısı oluşmaktadır.

 

1.3.   NİÇİN A/D ÇEVİRİCİ

Dış dünyanın daha çok analog değerlerden oluşmasına karşılık , bilgi işleyen cihazlar (dijital sistemler, mikroişlemciler, bilgisayarlar) dijitaldir. Çünkü, dijital sistemler, bilgiyi daha güvenli, daha hızlı işler ve değerlendirir. Elde edilen bilginin tekrar dış dünyaya aktarılması da (örneğin görüntülenmesi) analog veya dijital biçimde olabilir. Bütün bu nedenlerle analog değerlerin dijitale, dijital değerlerin de analog değerlere çevrilmesi gerekir.

 

Dış dünyadaki fiziksel değişiklikler (ısı, basınç, ağırlık), sensör (algılayıcı) ve transduser’ler (çeviriciler) kullanılarak elektrik gerilimine çevrilir. Bu gerilim analog bir gerilimdir. Daha sonra bu analog gerilim Analog/Dijital (A/D) çevirici Yardımı ile dijitale çevrilir. Dijital sistem bu bilgiyi istenilen bir biçimde işler ve bir sonuç elde eder. Bu sonuç dijital veya analog olarak olarak değerlendirilmek istenebilir. Eğer elde edilen sonuç analog olarak değerlendirilecekse (örneğin bir hoparlörün sürülmesi) tekrar analoğa çevrilmesi gerekebilir. Dijital işareti analog işarete çevirme işlemini Dijital/Analog (D/A) çeviriciler
yapar.

 

Şekil 2: A/D ve D/A çeviriciler

     Yukarıdaki şekilde analog bir değerin dijitale çevrilip, işlendikten sonra tekrar analog değere çevrilmesi sürecinin blok diyagramı görülmektedir. Girişteki gerilim bir transduser yardımı ile elektriksel büyüklüğe çevrilmiş bir fiziksel büyüklüğü temsil etmektedir. Bu gerilim daha sonra Analog/Dijital Çevirici vasıtası ile dijitale çevrilir ve dijital olarak işlenir. Daha sonra elde edilen sonuç Dijital/Analog Çevirici vasıtası ile  tekrar analog bilgiye çevrilir ve çıkışa aktarılır. Çıkışta kullanılan eleman ise elektriksel büyüklüğü (gerilim) fiziksel büyüklüğe (ses, ısı, ağırlık vs) çevrilir. Örneğin hoparlör elektriksel büyüklüğü sese çeviren bir aygıttır.

Eğer birden fazla analog bilgiyi aynı anda dijital olarak işlemek istiyorsak tekrar şekil 1.1’de görülen sistemden kullanmamıza gerek yoktur. Transduserden sonra multiplexer kullanarak giriş işaretlerini çoklayıp A/D Çeviriciye veririz. Bilgiler işlenip D/A Çevirici vasıtası ile analoğa çevrildikten sonra Demultiplexer vasıtası ile girişteki analog işaretleri elde ederiz. Böylece birden fazla analog bilgiyi aynı anda tek bir sistem kullanarak işlemiş oluruz.

 

2.1.   İDEAL A/D  ÇEVİRİCİ  VE ÇÖZÜNÜRLÜK

İdeal 8 bit bir ADC’nin çıkışışındaki çözünürlük için Vin’nin 0 volt ile tam skala voltajı Vfs=5  volt arasında sürekli değiştiğini düşünelim; 8 bit ADC 28=255  muhtemel çıkışa sahip olacaktır. Bunlar binary 00000000 ile 11111111 arasındadır. Her bir ilave volt dijital çıkışı 1 LSB (Düşük değerlikli bit) arttıracaktır. Şimdi ADC’nin çözünürlüğünü tanımlayalım.

Çözünürlük; dijital çıkışı 1 LSB değiştirmek için giriş voltaj değerinde meydana gelen değişikliktir.O halde 8 bit bir ADC entegresi 2^8=255 bitlik bir çözünürlüğe sahiptir ve biz 0 ile 5 aralığında bir voltaj ölçeceğimizden

   her  19.6 mV için 1bit artış olacaktır ve 255. Bitte  255×19.6=5000 mV = 5V bize verecektir.

2.2.   A / D ÇEVİRME ÇEŞİTLERİ

Analog / Dijital Çevirme işleminin gerçekleştirilebilmesi için düzinelerce işlemler gurubu tasarlanmıştır. Ancak standart olarak 3 gruba ayrılırlar. Çevirme süresine (bir A/D çevirinin tamamlama süresi) göre yavaş, hızlı ve çok hızlı olarak sınıflandırılırlar.

Tamamlamalı A/D çevirici yavaş, art arda yaklaşık çevirici hızlı, flaş çevirici ise çok hızlıdır. Tablo 2.1’de  bu çeviricilerle ilgili karşılaştırmalar görülmektedir.

 

   ÇeviriciTipi    GöreceliHız     ÇeviriZamanı Tipik       Uygulama             Alanı
İntegralli Yavaş Milisaniye DC  Voltmetreler
Ardışıl Yaklaşımlı           ADC Hızlı Mikrosaniye Ses
Flaş Çok Hızlı Nanosaniye Video

 

Tablo 2: Çeşitli A/D çeviricilerin karşılaştırılması

     Tamamlamalı A/D Çevirici çok yavaştır fakat DC voltaj ölçümleri ve hat frekans gürültüsünün izolesi için çok uygundur. Uzun çeviri zamanı çok yüksek çözünürlüğe imkan sağlar. Art arda çevirici hızlı ve doğrudur ve 1 mikrosaniye’nin altında çeviri zamanına sahiptir. Flaş çevirici çok hızlıdır ve sürekli çevirileri gerçekleştirmek için gereklidir. Çeviri zamanı 50 nano saniye’nin altına inebilir. Özellikle 8 bitin üstünde ki çözünürlüklerde çok pahalıdırlar.
ADC entegreleri yukarıdaki sistemlerden birisi üzerinden çalışırlar ancak mikroişlemci ile yapacağımız adc çeviri işlemlerinde bazı mikroişlemcilerde adc özelliği bulunduğundan işimiz oldukça kolaydır.Bu mikroişlemcilerde programsal olarak özellik açılır, analog sinyal girişine verilir ve adc değeri elde edilmiş olur.Bizim yapacağımız devredeki mikroişlemcide adc özelliği bulunmadığından dışarıdan herhangi bir adc entegresi ile dijital 8 bit veriyi alıp pic programı ile hesaplatıp çıkış verebiliriz.Giriş gerilimini kare sinyale çevirip sinyalin genliğini mikroişlemciye hesaplatarak işlem yaptırabiliriz ya da kendi algoritmamızı programsal olarak oluşturup yine bir adc entegresi ile fakat tek pinden 8 bitlik veriyi kaydıran bir entegreden veriyi alarak işlem yaptırabiliriz.

2.3.   ADC0831 HAKKINDA BİLGİ

ADC08XX serisi 1,2,4 ve 8 dijital data pinli olarak gruplandırılmaktadır.Çalışma akımı 15mA, çalışma gerilim aralığı 4.5V ile 6.5V arasındadır. Channel MUX Dual-In-Line Package (N) kılıfında entegredir.0 C den 70C ye kadar çalışma aralığındadır.ADC devrelerinde genel olarak tercih edilen bir entegredir.

 

2.4.  NEDEN ADC0831?

ADC0831 kullanmamızın sebepleri arasında öncelikle kılıf olarak küçük olmasını söyleyebiliriz.8 bacaklı bir entegredir.Ayrıca dijital bilgiyi 8 pinden değil tek pinden seri olarak vermesi en önemli ayırt edici özelliğidir.Bu avantajı sayesinde pinden tasarruf etmiş olmaktayız.CS, CLK ve DO pin bağlantılarını pice yaparak haberleşmeyi bitirmiş oluyoruz.Aksi takdirde 10 veya 11 pin kullanmamız gerekebilirdi.Karşılaştırma işlemini dahili olarak yapmaktadır.Fiyat olarak 4$ veya 5$ aralığındadır.Bulunabilirliği sıkıntı olan bir entegre değildir.Bu entegreyi kullanmak için sadece program bilginizin iyi olması gerekmektedir.

3.MİKROİŞLEMCİLER VE PIC16F84A

3.1.   MİKROİŞLEMCİLER VE KULLANIMLARI

Sürekli başarı elde edilen ilk mikroişlemci INTEL’ in ürettiği 8080 işlemcisidir. Bunun geliştirilmiş versiyonu ise 8085 olarak tanınmaktadır. Z80 adıyla anılan daha da geliştirilmiş bir işlemci ise ZILOG tarafından üretilmiştir.  MOTOROLA’ nın ilk işlemcisi 6800 olup, bu, kendi saat devresi ve RAM’ i olmayan 6802ye eşdeğerdir. MOTOROLA’nın geliştirilmiş versiyonu 6809’dur. ROCKWELL ise MOS teknoloji ile basitçe geliştirilmiş olan 6502yi piyasaya sürmüştür. Bütün bunlar 8 bitle işlem gören, 16 bit adresleme yapabilen mikroişlemcilerdir.

        6800 ismi, içerdiği tümleşik eleman sayısı göz önüne alınarak verilmiştir. 3 durumlu (Tristate) çalışan adres barasına sahip olması, kendinden RAM’ i olmaması ve 2 fazlı bir saat sinyaline ihtiyaç duyması hususları dışında 6802 le aynıdır.,

        6502, 1975 yılında bir grup 6800 tasarımcısı tarafından tasarımlanmış ve 5802’ye çok benzer bir işlemcidir. Kendinden bir saat devresi olup RAM’ i yoktur. En çok göze çarpan farkı adresleme durumları ve program!ama esnekliğidir. MOS teknolojisi ile tasarımlanmıştır.

        6809, 6800’ün oldukça geliştirilmiş bir versiyonu olup MOTOROLA tarafından 1978 yılında dünyaya tanıtılmıştır. Bir adet çarpma ve 16 bitlik veriler için bazı komutları içeren oldukça güçlü ve karmaşık bir komut setine sahiptir. Dahili bir saat devresi vardır, ancak RAM’ i yoktur. 6809E versiyonu, birkaç ek kontrol fonksiyonu içermekte ve harici bir saat devresine ihtiyaç duymaktadır.

        6805, MOTOPOLA’ nın  tek-yongalı mikrobilgisayarlarının bir ailesidir. 1 veya 4 Kbyte’lık bir program belleği, 64 veya 112 byte’lık PAM, bir saat ve 16 veya 32 1/0 hattını 28 veya 40 bacaklı bir yongada toplamıştır. Güç işleme ve çalışma bakımından 6800’e benzerdir. Program belleği maskeli ROM olduğundan, sabit programlı ve büyük miktarlarda sipariş edilmek zorundadır. Adres ve veri babaları, bacaklara taşınmadığından deneme yapmak için uygun değillerdir.

     6801, MOTOR0LA’nın daha ilerlemiş bir mikrobilgisayarıdır. 2 Kbyte’lık maskeli ROM’a ve 31 I/O hattına sahiptir. ILO hatları adres ve veri hattı olarak programlanabilir ve böylece harici belleklere erişilebilir. 6803, 6801 ‘in ROM’suz versiyonudur. Bu bilgisayarlar ayni komut setini kullandıklarından 6800 ve 6802 ile ayni programları çalıştırabilirler. Çarpma ve l6 bitlik veri işleme gibi komutları da içerirler.(2)

8080′ in 6800’den farkı donanımdan .çok komutlarda ve programlamadadır.
8080, şimdiye kadar anılan tüm mikroişlemcilerden önde olup hızla geniş bir takip kazanmıştır. Komut seti bazı hususlarda 6800den daha güçlü fakat kesinlikle daha az güvenilirdir. Özel bir harici saat yongasına ve 3 adet güç kaynağına (-5 V, +5V ve +12V) gereksinimi vardır.
Z80, 1976’da bir grup 8080 tasarımcısı tarafından tasarımlanmış ve ZILOG tarafından piyasaya sürülmüştür. 8080’in komut setini takip eden ancak ek olarak bazı güçlü komutlar ve çoklu görevlerin kullanımını kolaylaştıran bir çok yeni yazmaç eklenmiştir. Z80 basit bir TTL saat üretecine ve standart +5V güç kaynağına gereksinim duymaktadır.

        8085, INTEL’ in 1976’da çıkardığı ve 8080m gelişmiş bir versiyonu olan mikroişlemcidir. Kendinden bir saat devresine sahip olup sadece 5V’luk bir güç kaynağına ihtiyaç duymaktadır. Seri giriş ve çıkış hatları mevcuttur. Veri barası, adres barasının düşük byte’ı ile ortak (multiplex) olarak kullanılmaktadır. Yani bu hatlar aynı bacaklara bağlıdır ve makine dönüşünün ilk kısmında adres bilgisi ve ikinci kısmında veri bilgisi çıkışa verilmektedir. Bellek ve çevre yongaları kullanılacaksa, bunlar ya INTEL’ in multiplex barasına eşdeğer yapıya sahip olmalı yada bir adres tutucu arabirim kullanılmalıdır.

            8051, INTEL’ in dahili ROM ve saat devresine ayrıca 1/0 hattına sahip mikro denetim (microcontroller) tüm devresidir. 4KByte’lık bir ROM’a ve 32 1/0 hattına sahiptir. Ayrıca 8O32BASIC adı altında bir de Basic programları çalıştırabilen versiyonu vardır. Kendi üzerinde bir Basic yorumlayıcısı vardır. Program, kısmen Basic ve kısmen de makine dili ile yazılabilir. 8080’ in 6800’ den farkı donanımdan çok komutlarda ve programlamadadır.

        8080, şimdiye kadar anılan tüm mikroişlemcilerden önde olup hızla geniş bir takip kazanmıştır. Komut seti bazı hususlarda 6800’den daha güçlü fakat kesinlikle daha az güvenilirdir. Özel bir harici saat yongasına ve 3 adet güç kaynağına (-5V,+5V ve +12V) gereksinimi vardır.(4)

Z80, 1976’da bir grup 8080 tasarımcısı tarafından tasarımlanmış ve ZILOG tarafından piyasaya sürülmüştür. 8080’in komut setini takip eden ancak ek olarak bazı güçlü komut!ar ve çoklu görevlerin kullanımını kolaylaştıran bir çok yeni yazmaç eklenmiştir. Z80 basit bir TTL saat üretecine ve standart +5V güç kaynağına gereksinim duymaktadır.

       8085, INTEL’ in 1976da çıkardığı ve 8080m gelişmiş bir versiyonu olan mikroişlemcidir. Kendinden bir saat devresine sahip olup sadece 5V’luk bir güç kaynağına ihtiyaç duymaktadır. Seri giriş ve çıkış hatları mevcuttur. Veri barası, adres barasının düşük byte’ı ile ortak (multiplex) olarak kullanılmaktadır. Yani bu hatlar aynı bacaklara bağlıdır ve makine dönüşünün ilk kısmında adres bilgisi ve ikinci kısmında veri bilgisi çıkışa verilmektedir. Bellek ve çevre yongaları kullanılacaksa bunlar ya INTEL’ in multiplex barasına eşdeğer yapıya sahip olmalı yada bir adres tutucu arabirim kullanılmalıdır.

             8051, INTEL’ in dahili ROM ve saat devresine ayrıca I/O hattına sahip mikro denetim (microcontroller) tüm devresidir. 4KByte’lık bir ROM’ a ve 32 1/0 hattına sahiptir. Ayrıca 8O32BASIC adı altında bir de Basic programları çalıştırabilen versiyonu vardır. Kendi üzerinde bir Basic yorumlayıcısı vardır. Program, kısmen Basic ve kısmen de makine dili ile yazılabilir.
Bütün bu mikroişlemci üretimlerine rağmen pic serisi (microchip) en çok kullanılan serilerden birtanesidir.Bir çok özelliği bir arada barındırması, kolay bulunabilirliği gibi etkenler yaygın kullanımının temel sebeplerindendir.


3.2.   MİCROCHİP PİC SERİSİ HAKKINDA BİLGİ

PIC’ in kelime anlamı PERIPHERAL INTERFACE CONTROLLER giriş-çıkış işlemcisidir.   İ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 için geliştirilmiştir.
Güvenirlik: PIC komutları bellekte çok az yer kaplarlar. Dolayısıyla bu komutlar 12 veya 14 bitlik bir program bellek sözcüğüne sığarlar. Harvard mimarisi teknolojisi kullanılmayan mikro kontrolörler de yazılım programının veri kısmına atlama yaparak bu verilerin komut gibi çalıştırılmasını sağlamaktadır. Bu da büyük hatalara yol açmaktadır. PIC’ ler de bu durum engellenmiştir.

Hız : PIC oldukça hızlı bir mikro kontrolör’ dür. Her bir komut döngüsü 1µsn’ dır. Örneğin 5 milyon komutluk bir programın 20Mhz’ lik bir kristalle işletilmesi yalnız 1sn sürer. Bu süre 386SX33 hızının yaklaşık 2 katıdır. Ayrıca RISC mimarisi işlemcisi olmasının hıza etkisi oldukça büyüktür.

Komut seti : PIC’ in 16C5X ailesinde bir yazılım yapmak için 33 komuta ihtiyaç duyarken 16CXX araçları için bu sayı 35’ tir. PIC tarafından kullanılan komutların hepsi yazmaç (register) temellidir. Komutlar 16C5X ailesinde 12 bit, 16CXX ailesindeyse 14 bit uzunluğundadır. PIC’ te CALL, GOTO ve bit test eden BTFSS ve INCFSZ gibi komutlar dışında diğer komutlar 1 saykıl çeker. Belirtilen komutlar ise 2 saykıl çeker.

Statik İşlem : PIC tamamıyla statik bir işlemcidir. Yani saat durdurulduğunda da tüm yazmaç içeriği korunur. Pratikte bunu tam olarak gerçekleştirebilmek mümkün değildir.
PIC mikrosu programı işletilmediği zaman uyuma (sleep) moduna geçirilerek mikronun çok düşük akım çekmesi sağlanır. PIC uyuma moduna geçirildiğinde , saat durur ve
PIC uyuma işleminden önce hangi durumda olduğunu çeşitli bayraklarla ifade eder. (elde bayrağı, 0 (zero) bayrağı … vb.) PIC uyuma modunda 1µA’den küçük değerlerde akım
çeker. (Standby akımı).

Sürme özelliği (Sürücü kapasitesi): PIC yüksek bir çıktı kapasitesine sahiptir. Tek bacaktan 40mA akım çekebilmekte ve entegre toplamı olarak 150mA akım akıtma kapasitesine
sahiptir. Entegrenin 4mHz osilatör frekansında çektiği akım çalışırken 2mA, stand-by durumunda ise 2µA kadardır.
Seçenekler : PIC ailesinde her türlü ihtiyaçların karşılanacağı çeşitli hız, sıcaklık, kılıf, I/O hatları, zamanlama (Timer) fonksiyonları, seri iletişim portları, A/D ve bellek kapasite
seçenekleri bulunur.

Çok yönlülük : PIC çok yönlü bir mikrodur ve ürünün içinde, yer darlığı durumunda birkaç mantık kapısının yerini değiştirmek için düşük maliyetli bir çözüm bulunur.

Güvenlik : PIC endüstride en üstünler arasında yer alan bir kod koruma özelliğine sahiptir. Koruma bitinin programlanmasından itibaren, program belleğinin içeriği, program  kodunun yeniden yapılandırılmasına olanak verecek şekilde okunmaz.

Geliştirme: PIC program geliştirme amacıyla programlanabilip tekrar silinebilme özelliğine sahiptir. (EPROM, EEPROM) Aynı zamanda seri üretim amacıyla bir kere programlanabilir (OTP) özelliğine sahiptir.

Liste dosyası : Assembler tarafından yaratılan ve kaynak dosyadaki tüm komutları hexadecimal sistemdeki değerleri ve tasarımcının yazmış olduğu yorumlarıyla birlikte içeren bir dosyadır. Bir programı bug’lar dan arındırırken araştırılacak en yararlı dosya budur. Çünkü bu dosyayı izleyerek yazılımlarda neler olup bittiğini anlama şansı kaynak

dosyasından daha fazladır. Dosya uzantısı .LST dir.

Diğer dosyalar : Hata dosyası ( Error file: uzantısı .ERR) hataların bir listesini içerir ancak bunların kaynağı hakkında hiç bir bilgi vermez. Uzantısı .COD olan dosyalar emülatör
tarafından kullanılırlar.

Bug ‘ lar : Tasarımcının farkında olmadan yaptığı hatalardır. Bu hatalar, basit yazılım hatalarından, yazılım dilinin yanlış kullanımına kadar uzanır. Hataların çoğu derleyici tarafından  bulunur ve bir .LST dosyasında görüntülenir. Kalan hataları bulmak ve düzeltmek  te geliştiriciye düşer.

3.3.   PİC16F84 VE PİC16F84A

PIC 16C84 veya F84 düşük maliyetli, yüksek performanslı, CMOS,  full-statik, 8 bit mikrodenetleyicidir.
Tüm PIC 16/17 mikrodenetleyiciler RISC mimarisini kullanmaktadır.  PIC16CXX mikroları birçok esas özelliklere sahiptir. 8 seviyeli, derin  küme ve çoklu iç ve dış kesme kaynaklarına sahiptir. Harward Mimarisinin ayrı komut ve veri taşıyıcısıyla ayrı 8 bitlik geniş veri taşıyıcılı, 14 bitlik geniş  komut kelimesine imkan vermektedir. 2 aşamalı komut hattı tüm komutların tek bir saykıl’ la (çevrimle) işlenmesini sağlamaktadır. Yalnızca bazı  özel komutlar 2 saykıl çekerler. Bu komutlar dallanma komutlarıdır.

PIC16CXX mikrodenetleyicileri tipik olarak 2:1 oranında kod sıkıştırmasına  erişmektedir ve sınıflarındaki 8 bit mikrodenetleyicilerden 2:1 oranında hız erişmektedir ve sınıflarındaki 8 bit mikrodenetleyicilerden 2:1 oranında hız  arttırılmasına olanak sağlanmaktadır. (10MHZ)

PIC16C84 microchip’ i 36 bitlik RAM belleğine, 64 bayt EEPROM  belleğine ve 13 I/O pin’ ine sahiptir. Bunun yanı sıra, timer ve sayaç  ta mevcuttur.

PIC16CXX ailesi dış elemanları azaltacak spesifik özelliklere sahiptir  ve böylece maliyet minimuma inmekte, sistemin güvenirliği artmakta,  enerji sarfiyatı azalmaktadır. Bunun yanı sıra tüm PIC ler de 4 adet osilatör seçeneği mevcuttur. Bunlarda tek pin li RC osilatör, düşük  maliyet çözümünü sağlamakta (4 MHZ) , LP osilatör (Kristal veya  seramik rezonatör) , enerji sarfiyatını minimize etmekte (asgari akım) (40 KHZ), XT kristal veya seramik rezonatör osilatörü standart hızlı  ve HS kristal veya seramik rezonatörlü osilatör çok yüksek  hıza sahiptir (20 MHZ).

PIC mikrokontrolörlerinin en büyük özelliği sleep modu özelliğidir..  Bu mod ile PIC işlem yapılmadığı durumlarda uyuma moduna geçerek çok düşük akım çeker. (5m A).

Kullanıcı bir kaç iç ve dış  kesmelerle PIC’ i uyuma modundan çıkarabilmektedir. Yüksek  güvenilirlikli Watchdog Timer kendi bünyesindeki chip üstü RC  osilatörü ile yazılımı kilitlemeye karşı korumaktadır.

PIC16C84 (16F84) EEPROM program belleği , aynı aygıt paketinin  orjinali ve üretimi için kullanılmasına olanak vermektedir. Yeniden  programlanabilirliği mikroyu uygulamanın sonundan kaldırmadan  kodu güncelleştirmeye izin vermektedir.

Bu aygıtın kolayca erişilemediği, fakat prototipinin kod güncelleştirmesi  gerekli olduğu durumlarda, bir çok uygulamanın geliştirilmesinde  yararlıdır. Bunun yanı sıra bu kodun güncelleştirilmesi diğer ayrı  uygulamalarda da yararlıdır.

Aşağıda tablo 2.1 de PIC16F8X’ ailesinin özellikleri ve şekil 2.1’ de  de basitleştirilmiş iç yapısı gösterilmektedir.

 

PIC’ ler özellikle de PIC16C84 veya 16F84  yüksek hızlı otomobillerden, motor  kontrolü uygulamaları, düşük enerji sarfiyatlı uzaktan çalışan sensörler,  elektronik kilitler, güvenlik aygıtları ve akıllı kartlara kadar bir çok  uygulamalarda kullanılırlar. EEPROM teknolojisi uygulama programların  (Transmitter kodları, motor hızları, alıcı frekansları, güvenlik kodları vb.)  uygulamasını son derece hızlı ve uygun hale getirmektedir.  Küçük boyutlarıyla bu mikrodenetleyiciler alan sınırlaması bulunan  uygulamalarda kusursuzdur. Düşük maliyet, düşük enerji sarfiyatı,  yüksek performans, kullanım kolaylığı ve I/O esnekliği özellikle de  PIC 16C84 mikrosunun daha önce kullanılması hiç düşünülmeyen  alanlarda kullanılmasını sağlamaktadır. (Bunlar ; timer fonksiyonları,  seri kominikasyon, PWM fonksiyonları ve birlikte işlemci uygulamaları)

Seri sistem içi programlama özelliği (iki pinin üzerinden) ürünün  tamamen toplanması ve test edilmesinden sonra ürünün alıştırılmasının  esnekliğine olanak vermektedir. Bu özellik sayesinde ürün  serileştirilebilmekte ve veriler saklanabilmektedir.
Tekrar silinip kullanılabilen EPROM hafızasına sahiptirler.Bazı donanımsal özellikler kapatıldığında kullanılabilen PORTA ve PORTB uçları (16 pin) bulunmaktadır.Fakat bu entegrelerde ADC özelliği donanımsal olarak mevcut değildir.Donanımsal özellikleri sınırlı olan bu mikroişlemciler birçok temel devrede kullanılmaktadır.Programsallığın ön planda olduğu işlemlerde tercih edilmektedir.HPWM uygulamaları bazı seri iletişim uygulamaları vb. donanımsal bazı yapılar içeriğinde bulunmamaktadır.

3.4.   PİC PROGRAMLAMA

Pic programlama işlemi programsal bilginize, tecrübenize, hayal gücünüze ve analitik düşünme kabiliyetinize bağlı olarak oluşturabileceğiniz sistem dahilindeki komutlardır.Programala için ihtiyacınız olacak bazı programlar ve araçlar vardır.Bunlar yazılım olarak hangi dili kulanıyorsanız sizin programlama dilinizi destekleyecek bir yazılım, bilgisayar, programlama kartı ve derleme yazılımıdır.Programcılar asseambly, basic, pic c, ccs, jal, delphi, micro basic, basic plus gibi farklı diller kullanabilirler fakat tüm bu dillerde yazılan programların derlendikten sonraki halleri aynı işlevleri yapmaktadır.Bu sebeple programlama yaptığınız bir dili çok iyi bilmek  2,3 farklı dili bilmekten çok daha iyidir.Biz devremizde assembly, basic, micro basic veya basic plus kullanabiliriz.Assembly dili genel olarak programlama mantığını kavratmak amacıyla verildiğinden programcı ilerleyen mesleğinde farklı diller tanıdıkça bu dili arkaplana itmektedir.

      3.4.1.   PROGRAMLAMA DİLLERİ

Program yazmak için kullanılan diller amaçları, kullanımları ve işlevsilliğine göre tercih edilmektedir.Assembly en yaygın dillerden olmasına rağmen programlama mantığını bütün olarak içerir ama programlaması en zor ya da en kaba dillerden birisidir diye tabir edebiliriz.Bu yüzden benim gibi birçok programcının da tercih etmediğini biliyorum ama genel olarak tüm programcıların bildiği bir dildir.
Pic Basic dili komutlarının işlevselliği, komut sayısının az olması, matematiksel işlemlerdeki kolaylıkları sebebiyle tercih edilen diller arasındadır.Bu dili takip eden micro basic ve basic plus dilleri de bu dil üzerine kurulmuştur.
Pic C dili en gelişmiş pic programlama dili olarak bilinir ve İngilizce komutları, aritmetik işlemlerde programcının önünü açması ve bazı donanımsal yapıları tek komut ile (özel komutlar) çalıştırması tercih sebeplerindendir.
Delphi, Jal ve CSS programlama dilleri ise sonradan geliştirilen alternatif dillerdie fakat belirli noktalarda yetersiz kaldıkları bilindiklerinden tercih sebebi değillerdir. Amatör programcılar ve öğrenciler tarafından kullanılırlar.

      3.4.2.   KISACA NASIL PROGRAM YAZILIR

Kısaca program yazmayı açıklayalım.Yazacağımız mikroişlemciyi belirledikten sonra tasarımımıza uygun ve mikroişlemcimize uygun programlama mantığında algoritmamızı hazırlarız.Algoritmanın hazırlanması programlamada kolaylık sağlamanın yanı sıra hata payını azaltır ve sağlıklı bir program oluşmasını sağlar.Fakat algoritma çıkarmadan da yapabiliriz.Program yazacağımız yazılımı açtıktan sonra ilgili yazılımdan mikroişlemci modelimizi seçeriz.

                                                       Resim 2:Pic Seçimi
Yazılımsal olarak picimizi tanımlarız.I/O yani giriş çıkış tanımlamalarımızı yaparız.Kullanacağımız donanımları açıp/kapatma işlemlerini yaparız.Ana program kısmında programımızı yazıp elde  ettiğimiz veriyi çıkış işlemine tabi tutarız ve programımızı bitiririz.
Aşağıda yukarıda anlatılanlara örnek verilmiştir.

‘PIC KONFİGRASYON ATAMALARI**************

@ DEVICE pic16F628A

@ DEVICE pic16F628A, LVP_off

@ DEVICE pic16F628A, WDT_OFF

@ DEVICE pic16F628A, PWRT_ON

@ DEVICE pic16F628A, PROTECT_OFF

@ DEVICE pic16F628A, MCLR_off

@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT

‘I/O TANIMLAMALARI***********************

TRISA=%00000100

TRISB=%00000000

PORTA=0

PORTB=0

OPTION_REG.7=0

CMCON=7

‘LCD TANIMLAMALARI***********************

DEFINE  OSC 4

DEFINE LCD_DREG     PORTB   ‘LCD DATA

DEFINE LCD_DBIT     4       ‘

DEFINE LCD_EREG     PORTB
DEFINE LCD_EBIT
DEFINE LCD_RSREG
DEFINE LCD_RSBIT
DEFINE LCD_BITS     4
DEFINE LCD_LINES

INCLUDE “Modedefs.Bas”

‘TANIMLAMALAR*****************************

VERI    VAR WORD
VOLTAJ  VAR WORD
TEMP    VAR WORD
VOLT    VAR BYTE

SYMBOL  CS=PORTA.0

SYMBOL  CLK=PORTA.1

SYMBOL  D0=PORTA.2

SYMBOL  VOLT1=PORTA.7

SYMBOL  VOLT2=PORTB.1

SYMBOL  VOLT3=PORTB.0

SYMBOL  VOLT4=PORTA.6

SYMBOL  VOLT5=PORTA.3

‘PIC ÇALIŞMA LEDİ***********************

PORTA.3=1 : PORTB.0=1 : PORTA.7=1

PAUSE   500

PORTA.3=0 : PORTB.0=0 : PORTA.7=0

PAUSE   500

‘ANA PROGRAM**********************   

BASLA:

Ana Program Döngüsü Burada Yer Alır

GOTO    BASLA

RETURN

‘LCD EKRANDA SONUC GÖSTERME*****************

LCD:

lcdout $fe, 2,”ADC:”,#VERI,”            ”

lcdout $fe, $c0,”VOLTAJ=”,#volt,”V          ”

return

‘PROGRAM SONU*************************

END

 

3.5.  PİC BASİC HAKKINDA BİLGİ

 

Farklı Mikroişlemcilerin farklı Assembler kodları olması genellikle sorun olmuştur. Bu dezavantajdan kurtulmak için compiler lar geliştirilmiştir. C++ ve Basic dillerinde yazılanlar bunların en çok kullanılanlarındandır. Microchip in kendi işlemcileri için geliştirdiği assembler dilde 34 adet komut bulunuyor. Bu komutların işlevlerini ve daha çoğunu yapan PicBasicPro dili bu yazıda tanıtılacaktır.

PicBasic Editörünü creative contraptions sitesinden ücretsiz indirebilirsiniz.Genelde program yazımı ve derleme için MicroCode Studio isimli programı öneririm. Assembler ile PicBasic Komutlarının Karşılaştırılması:

@ Insert one line of assembly language code.
ADCIN Read on-chip analog to digital converter.
ASM..ENDASM Insert assembly language code section.
BRANCH Computed GOTO (equiv. to ON..GOTO).
BRANCHL BRANCH out of page (long BRANCH).
BUTTON Debounce and auto-repeat input on specified pin.
CALL Call assembly language subroutine. CLEAR Zero all variables.
CLEARWDT Clear (tickle) Watchdog Timer.
COUNT Count number of pulses on a pin.
DATA Define initial contents of on-chip
EEPROM. DEBUG Asynchronous serial output to fixed pin and baud.
DEBUGIN Asynchronous serial input from fixed pin and baud.

 

DISABLE Disable ON DEBUG and ON INTERRUPT processing.
DISABLE DEBUG Disable ON DEBUG processing.

DISABLE INTERRUPT Disable ON INTERRUPT processing.

DTMFOUT Produce touch-tones on a pin.

EEPROM Define initial contents of on-chip EEPROM.

ENABLE Enable ON DEBUG and ON INTERRUPT processing.

ENABLE DEBUG Enable ON DEBUG processing.

ENABLE INTERRUPT Enable ON INTERRUPT processing.

END Stop execution and enter low power mode.

FOR..NEXT Repeatedly execute statements.

FREQOUT Produce up to 2 frequencies on a pin.

GOSUB Call BASIC subroutine at specified label.

GOTO Continue execution at specified label.

HIGH Make pin output high.

HSERIN Hardware asynchronous serial input.

HSEROUT Hardware asynchronous serial output.

I2CREAD Read bytes from I2C device.

I2CWRITE Write bytes to I2C device.

IF..THEN..ELSE..ENDIF Conditionally execute statements.

INPUT Make pin an input.

LCDIN Read from LCD RAM.

LCDOUT Display characters on LCD.

{LET} Assign result of an expression to a variable.

LOOKDOWN Search constant table for value.

LOOKDOWN2 Search constant / variable table for value.

LOOKUP Fetch constant value from table.

LOOKUP2 Fetch constant / variable value from table.

LOW Make pin output low.

NAP Power down processor for short period of time.

ON DEBUG Execute BASIC debug monitor.

ON INTERRUPT Execute BASIC subroutine on an interrupt.

OUTPUT Make pin an output.

PAUSE Delay (1mSec resolution).

PAUSEUS Delay (1uSec resolution).

PEEK Read byte from register. (Do not use.)

k Write byte to register. (Do not use.)

POT Read potentiometer on specified pin.

PULSIN Measure pulse width on a pin.

PULSOUT Generate pulse to a pin.

PWM Output pulse width modulated pulse train to pin.

RANDOM Generate pseudo-random number.

RCTIME Measure pulse width on a pin.

READ Read byte from on-chip EEPROM.

READCODE Read word from code memory.

RESUME Continue execution after interrupt handling.

RETURN Continue at statement following last GOSUB.

REVERSE Make output pin an input or an input pin an output.

SERIN Asynchronous serial input (BS1 style).

SERIN2 Asynchronous serial input (BS2 style).

SEROUT Asynchronous serial output (BS1 style).

SEROUT2 Asynchronous serial output (BS2 style).

SHIFTIN Synchronous serial input.

SHIFTOUT Synchronous serial output.

SLEEP Power down processor for a period of time.

SOUND Generate tone or white-noise on specified pin.

STOP Stop program execution.

SWAP Exchange the values of two variables.

TOGGLE Make pin output and toggle state.

WHILE..WEND Execute statements while condition is true.

WRITE Write byte to on-chip EEPROM.

WRITECODE Write word to code memory.

XIN X-10 input.

XOUT X-10 output.

 

Pic Basic programlama dili birçok programı rahat bir şekilde yazmanızı sağlar.İçerdiği komutlar ve aritmetiksel olarak sağladığı kolaylıklar ve mikroişlemci ile beraber kullanacağınız diğer yardımcı elemanlara komutsal olarak vereceği karşılıkların bulunması ayrıca bir editörünün olması ve çok fala kaynağa ulaşabilmemiz bir diğer iyi yanıdır.Bizde programımızda pic basic profesyonel kullanacağız.

4.LCD (HD44780 SERİSİ

4.1.   LCD VE KULLANIM ALANLARI

Görselliğin ön planda olduğu sistemlerde kullanılırlar.Ekran boyutları ve renk seçenekleri olarak farklı çeşitleri vardır.Standart olan LM016 ve LM032 serisi yeşil ve mavi renkleri piyasada çok rahat şekilde bulunabilmektedir.Seri iletişimle haberleşirler.Arkaplan ışığı parlaklık ayarı mevcuttur.Kendi kod çözücüsü üzerindedir.Genel olarak devrelerde kullanılan LCD çeşididir

 

 

5.ADC ÖZELLİĞİ OLMAYAN PİC İLE ADC YAPIMI

5.1.   ANALOG DEĞERİN BELİRLENMESİ VE DERECELENDİRİLMESİ

        Ölçümünü yapacağımız analog değer için biz 5V’luk bir gerilimi baz alacağız.Buraya istenildiği takdirde herhangi bir transdüser bağlanabilir ve işlem yapılabilir.Burada 5V gerilimi potansiyometre ile kademeli olarak azaltıp artırma işlemi yapabileceğiz.Böylece 0V ile 5V arasında bir gerilimi ADC0831 entegremize göndereceğiz.Burada potansiyometre dışında farklı yöntemler de kullanılabilir.Yapmamız gereken ölçülecek

Resim 3:Pot ve ADC0831 Bağlantısı

gerilimi tespit etmek.Herhangi bir fiziksel özelliği gerilime çeviren yardımcı malzemeleri kullanarak ta bu devre ile birçok fiziksel özelliği ölçebilen ölçü aletlerini kolaylıkla tasarlayabiliriz.Bunları örneklersek; hız, asitlik oranı, rüzgar, yoğunluk, sıcaklık, mesafe, basınç gibi fiziksel büyülükler olarak sıralayabiliriz.Bu fiziksel büyüklükleri ölçecek özelliğe sahip transduseri ADC0831 in Vin(+) girişine bağladığımızda transdüser çıkışında oluşan elektriksel büyüklüğü adc entegresi ile dijital veriye çevirip pic ile işleyebilir ve bu konuyla ilgili birçok çalışma yapabiliriz.

5.2.   ANALOG DEĞERİ DİJİTAL BİLGİYE ÇEVİRMEK

Elde ettiğimiz analog bilgiyi ADC0831 ile dijital 8 bitlik veriye dönüştüreceğiz.Bu işlemi yapacak olan adc entegremizin bazı farklı özellikleri mevcuttur.8 bacaklı entegremizde CS, VIN(+), VIN(-), GND, DO, CLK, VREF, VCC bacakları bulunmaktadır.8 bitlik dijital veriyi DO bacağından vermektedir.Yani çıkış bilgisini alabileceğimiz 8 adet çıkış pini mevcut değildir.Diğer  ADC08XX serisinde çıkış bilgisini 8 farklı pinden veren entegreler mevcuttur ama biz bu entegreyi özellikle seçtik çünkü farklı bir çalışma şekli var ve pinlerden tasarruf etmemizi sağlayacak.Ayrıca çıkış bilgisini seri olarak tek bir uçtan göndermesi programsal çalışmamıza olanak sağlayacaktır.Entegre pinlerinin özelliklerini şu şekilde tanımlayalım:

CS: Bu pinimiz ADC entegremizden veri almamız için aktifleştirmemiz gereken uçtur.Entegrenin CS pinine Lojik 0 (0V) bilgisini gönderdikten sonra dijital veriyi alabiliriz.
VIN(+): Ölçülecek gerilimin giriş ucudur.Sadece pozitif (+) gerilimler için kullanılır.
VIN(-): Ölçülecek gerilimin giriş ucudur.Sadece negatif (-) gerilimler için kullanılır.
GND: Entegrenin beslemesi için gerekli şase ucudur.
VREF: Referans gerilimi giriş ucudur.Entegre VIN ucundan gelen gerilim ile VREF ucundan gelen gerilimleri karşılaştırarak bir çıkış verir.Buraya bağlanacak referans geriliminin tam dc olması gerekmektedir.
DO: Dijital verinin alınacağı uçtur.
CLK: Clock ucudur ve data alımı işlemi sırasında kullanılır.Her palsde 1 bitlik veriyi DO ucundan gönderir.
VCC: Entegrenin beslmesi için gerekli pozitif uçtur.

     5.2.3.   ALTERNATİF YÖNTEMLERİ

Herhangi bir ADC entegresi kullanmadan da ADC ölçme işlemi yapabiliriz.Bunun için daha önceden kullandığımız yöntemler dışında kendi yöntemlerimizi de geliştirebiliriz.Mikroişlemci ile çalışacağımızdan öncelikle mikroişlemcimizin donanımsal olarak desteklediği özeliklere bakacağız.Pic16f84 sersi kullandığımız için bu entegrenin pals genliği ölçme ve pals sayma işlemi yapabilecek donanımsal özellikler mevcuttur.

Resim 4 : Alternatif ADC Yöntemi

Yukarıdaki devrede potansiyometre ile gerilim oynanarak sonrasına bağlanan C1 kondansatörü ile basit bir şekilde RC devresi oluşturulmuş ve pals elde edilmiştir.Oluşan palsler de picin RA4/T0CKI ucundan giriş verilerek donanımsal özellikten faydalanılmış ve pals ölçme işlemi yapılarak analog değer dijital değere dönüştürülmüştür.Fakat bu yöntem geriliminizin istikrarlı durumuna, transduser malzemenin kalitesine ve programsal olarak yaptığınız çalışmaya bağlı olarak değişecek kalitede bir sonuç verir.Bu sebeplerden dolayı alternatif yöntemi tercih etmedik.

  5.2.4.   ÇALIŞMA PRENSİBİ

 

ADC0831 entegresi ölçme işlemi yaparken VREF pinindeki gerilimi baz alır.Öncelikle ölçeceğimiz değerin min 0V ve max 5V olduğunu hatırlayalım.Bu aralıktaki gerilimVin(+) pinine girmekte.Giren Vin gerilimi ile VREF gerilimi karşılaştırılarak işlem yapmaktadır.8 bitlik bir ADC çevirici olduğundan
2^8=255 yapmaktadır.Yani Vref=255 olmaktadır.Burada Vref in 255 e eşit olması Vref değerinin 255 olması değildir.Vref=5V ise bu 5V 255 dijital bilgisine eşitlenmektedir.Daha sonra ise Vin
Resim  5
:ADC0831 Pin Diagramı

gerilimine bakmaktadır.Diyelim ki Vin gerilimi yani ölçülecek gerilimimiz 3V( örnek olarak).Bu durumda şu denklemi kullanarak entegremiz bize çıkış vermektedir.
Vref=5V = 255 ise
Vin=3V   =  ?   nedir?  Bu doğru orantı ile elde edilen dijital veri bizim 3V luk gerilimimize karşılık olan 8 bitlik dijital bilginin 16’lık sisteme yani hexedecimal sayı sistemine çevrilmiş halidir.Analog bilgiyi dijitale çevirdikten sonra ADC entegresi ile mikroişlemcimizi haberleştirip veriyi pice çekeceğiz.Bununiçin öncelikle CS ucumuza Lojik 0 gönderiyoruz.Bu işlem ADC entegremizden veri alacağımızı gösteriyor.Ardından CLK bacağına 9 pals

  Resim 6: ADC0831 ve Pic Bağlantısı

göndereceğiz.Bu palsler MSB veya LSB olabilir ama palslerin burada önemli olmayan bu özelliği pic programımızda büyük önem arz edecek.8 bitlik veri için 9 pals göndermemizin sebebi ise ilk palsin veri göndermeyi aktifleştirmesidir.Yani ilk palste DO pininin kilidi açılmış olur ve ardından gönderdiğimiz her palste bize 1 bitlik veriyi sırasıyla çıkış verir ve bu işlem 8. Bit sonuna kadar devam eder.Bitleri gönderirken otomatik olarak kaydırma işlemi yapar.Bitleri 7. Bitten 0. Bite doğru yani tersten gönderir.Her biti gönderdikten sonra kaydırma işlemi yapar ve gelen palsle sıradaki biti gönderir.
5.3.   DİJİTAL VERİYİ MİKROİŞLEMCİYE AKTARMAK

Tabiki bu işlemlerin aynısını mikroişlemci tarafından programsal olarak bizde yaptırmalıyız ki senkronize olarak çalışsın ve veri alma işlemi başarı ile tamamlansın.Bunun için yazacağımız program zamanlaması adc nin veri gönderme zamanlaması ile eşdeğer olarak çalışmalı ki sorunsuz şekilde işlem yapılsın.Bunun için mikroişlemcimizin bir pinini CS ucunu aktifleştirme pini olarak belirliyoruz.

SYMBOL  CS=PORTA.0,    SYMBOL  CLK=PORTA.1,  SYMBOL  D0=PORTA.2 komutlarıyla CS, CLK ve DO uçlarımızı belirlemiş olduk.Veriyi almak için önce CS ucumuza Lojik 0 gönderiyoruz.Ardından pic basic proffesionel programlama dilinin özelliği olan SHIFTIN komutunu kullanacağız.Bu komut belirlenen sürede, belirlenen pinden, belirlenen sayıda clock pals gönderir ve pals sonucunda gelen veriden belirlediğimiz sayıda okur ve registera kaydeder.

SHIFTIN D0, CLK, 2, [VERI\9]  bu şekilde tanımladığımız kodun anlamı ise D0 bacağından veri alınacağını, CLK bacağından clock pals gönderileceğini, buradaki 2 rakamı ise özel bir anlam içermektedir.Özel tablosundan baktığımızda MSBPOST karşılığını görürüz.Bunun anlamı ise yükselen kenar pals göndermesidir.Sonrasında ise 9 pals göndereceği ve gelen bilgiyi VERI isimli registere kaydedeceğini göstermektedir.Bu kod ile veri alma işlemini seri ve senkronize şekilde yapabiliriz.son olarak ise yine CS=1 yapıp kod alma işleminin bittiğini belirtiyoruz.Bu yöntem pic basic dilinin bize sağladığı kolaylıktır.

5.4.   PİC16F84A İLE ALINAN DİJİTAL VERİNİN İŞLENMESİ

ADC0831 den aldığımız 8 bitlik dijital veriyi mikroişlemcimizin içinde programsal olarak bir registere kaydettik.Öncelikle bu 8 bitlik veriyi hexedecimal veriye dönüştürüp giriş voltajımıza 0 ile 255 arasında hangi değerin eşit olduğunu görmek için yine bize basic professionel dilinin tanıdığı bir olanak olan ”#” işaretini kullanarak hexedecimale çevirme işlemini yapacağız.Basicde sayı dönüşümleri gayet kolay bir şekilde yapılabilmektedir.Tek bir işaretle sayı sistemi değiştirilebilmektedir.Bizde bunun için #VERI komutunu LCD ekranımıza bilgi gönderecek komutun sonrasına yerleştirilerek çıkış alınmış olunur.Yani LCD ekranımızda 8 bitlik değeri değil karşılığı olan hexedecimal sayıyı görmüş oluruz.Değerimizi hexedecimale dönüştürdükten sonra yapacağımız şey ise adc değerimizi voltaja dönüştürüp LCD ekranda onu da göstermek.Böylece hem ADC değerimizi hem de voltaj değerini aynı anda görüp daha kolay devremizin çalışmasını değerlendirebiliriz.Bunun için ADC entegremizin çözünürlüğünü bilmemiz gerekiyor.Bizim ADC miz 2^8=255 çözünürlüğündeydi ve 5V max ölçüm yapacaktık.O halde 5000mV/255=19.6mV oluyordu ve bu değer bize her 19.6mV artışta ADC değerimizin hexedecimal olarak 1 arttığını gösteriyordu.Voltajı tekrar bulmak için ise 19.6mVxADC=Voltaj şeklinde bir basit denklem bizi sonuca götürecektir.Aynı şekilde LCD de gösterme işlemini de yaptığımızda ADC değerini de voltaj değerini de görmüş oluruz.

      5.4.1.   VERİYİ  İŞLEYEN PROGRAM VE ÇALIŞMA MANTIĞI

‘PIC KONFİGRASYON ATAMALARI**************************************
(Bu kısımda mikroişlemcimizi tanıtıyoruz ve LVP,WDT,PWRT,MCLR özelliklerini açık veya kapalı olarak tanımlayıp içeriden osilatör yani dahili osilatör kullanmak istediğimizi belirtiyoruz.Devremize osilatör bağlantısı yapmak zorunda değiliz.)
@ DEVICE pic16F628A
@ DEVICE pic16F628A, LVP_off
@ DEVICE pic16F628A, WDT_OFF
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16F628A, MCLR_off
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT

‘I/O TANIMLAMALARI***********************************************
(Input ve Output tanımlamalarımızı bu kısımda yapıyoruz.Mikroişlemcimizin giriş ve çıkış uçlarını belirleyip bu uçları sıfırlama, temizleme işlemi yapıyoruz.)
TRISA=%00000100
TRISB=%00000000
PORTA=0
PORTB=0

‘LCD TANIMLAMALARI***********************************************
(Lcd kullanacağımız için LCD yi mikroişlemcimize tanıtıyoruz.Yazmaç uçları, data uçları gibi.)
DEFINE  OSC 4
DEFINE LCD_DREG     PORTB   ‘LCD DATA BACAKLARI PORTB’YE BAĞLI
DEFINE LCD_DBIT     4       ‘LCD DATA BACAKLARI PORTB.4 BAĞLI
DEFINE LCD_EREG     PORTB   ‘LCD ENABLE PİNİ PORTB’YE BAĞLI
DEFINE LCD_EBIT     3       ‘LCD ENABLE PİNİ PORTB.3 BAĞLI
DEFINE LCD_RSREG    PORTB   ‘LCD RS PİNİ PORTB’YE BAĞLI
DEFINE LCD_RSBIT    2       ‘LCD RS PİNİ PORTB.2 BAĞLI
DEFINE LCD_BITS     4       ‘LCD 4 BIT BAĞLI
DEFINE LCD_LINES    2       ‘LCD 2*20

INCLUDE “Modedefs.Bas” (Bu komut SHIFTIN komutumuzun ne anlama geldiğini mikroişlemcimize anlatacak olan kütüphane kodu kısmı)

‘TANIMLAMALAR***************************************************
(Programımız boyunca bize gerekli olabilecek register tanımlamalarını bu kısımda yazıyoruz.WORD ve BYTE cinsinden tanımlamalar içermektedir.Ayrıca SYMBOL komutu ile sık kullanacağımız pinlere etiket ataması yapmak istersek tanımlama için uygun bir bölümdür.)
VERI    VAR WORD
VOLTAJ  VAR WORD
TEMP    VAR WORD
VOLT    VAR BYTE
SYMBOL  CS=PORTA.0
SYMBOL  CLK=PORTA.1
SYMBOL  D0=PORTA.2
SYMBOL  VOLT1=PORTA.7    (Örneğin; artık PORTA.7 yerine VOLT1 diyebiliriz)
SYMBOL  VOLT2=PORTB.1
SYMBOL  VOLT3=PORTB.0
SYMBOL  VOLT4=PORTA.6
SYMBOL  VOLT5=PORTA.3

‘PIC ÇALIŞMA LEDİ************************************************
(Bu kısmı programcı kendi isteğine göre koyabilir.Sadece ilk enerji verdiğimizde programımızın ve mikroişlemcimizin düzgün bir şekilde çalışmaya başladığını gösterecek olan kısımdır.Zaten devremizde yer alan LED lerden bir tanesini yakıp söndürüyoruz.)
PORTA.3=1 : PORTB.0=1 : PORTA.7=1
PAUSE   500
PORTA.3=0 : PORTB.0=0 : PORTA.7=0
PAUSE   500

‘ANA PROGRAM*****************************************************
(Ana program kısmında çağırma işlemleri yapıyoruz.Yani bu kısımda diyoruz ki önce veriyi al gel, sonra git hesaplama bölümüne voltajı hesaplattır ve gel, sonra git LCD bölümünde çıkış olarak işlem yap, sonra git ledleri yak gel ve bu işlemleri sürekli tekrarla)
BASLA:
CALL    VERIAL
CALL    HESAPLA
CALL    LCD
GOTO    LED
PAUSEUS 200
GOTO    BASLA   

‘ADC0831 DEN SEKRONİZE VERİ ALMA*******************************
(Verialma kısmında SHIFTIN komutunu kullanıyoruz.Yukarıda alternatif programlar kısmında anlatılanlar gibi bir program da kullanabilirz ama biz bunu seçtik.Önce CLK yani clock ucunu sıfırlıyoruz.CS ucumuzu lojik 0 yapıp ADC ye veri alma isteğimizi belirtiyoruz.Sonraki işlem ise özel komutumuza kalıyor.D0 pinimizden veri alınacağı, CLK etiketli pinimizden clock gönderileceği, 2 rakamıyla MSBPOST yani yükselen kenarlarda işlem yapacağımızı ve VERI registerine gelen dijitlerin kaydedileceğini ve toplamda 9 pals göndereceğimizi gösteren komut yer almaktadır.CS ucumuzu 1 yapıp dönüyoruz.)
VERIAL:
CLK=0
cs=1
CS=0
SHIFTIN D0, CLK, 2, [VERI\9] CS=1
PAUSE   100
RETURN

‘ADC VERİSİNİ VOLTAJA DÖNÜŞTÜRME*******************************
(Elde ettiğimiz adc değerimizden voltaj değerini hesaplatıyoruz.Buradaki mantığımız ise basic pro nun bir olanağı olan */ işlemi ile 32 bitlik işlem yaptırmamız.Bu işlemi çok farklı yöntemlerle yaptırabiliriz.(5000/255)xADC şeklinde de yaptırılabilir ama elde edeceğimiz değer 8 digitten uzun olacaktır.Çünkü 4.78V diyelimki binary olarakbize sıkıntı oluşturacaktır.Sadece 0V dan 5V a kadar 1 er 1 er artış ve azalışı ekrana yansıtmak için gerekli formulü kullandık.)
HESAPLA:
temp=VERI.byte0
volt=(Temp+1) */5
RETURN

‘VOLTAJA UYGUN LEDLERİ YAKMAK**********************************
(Bu kısım boş kalan pinlerimizi değerlendirdiğimiz kısım.Her 1V luk artışta 1 ledin yanacağını ve toplamda 5 led olduğunu gösteriyor.Verı registeri karşılaştırma ile farklı durumlara gönderilmiştir.)
LED:
IF  VERI=>0        and     VERI=<50   THEN    DURUM0
IF  VERI=>51      and     VERI=<101  THEN    DURUM1
IF  VERI=>102    and     VERI=<152  THEN    DURUM2

IF  VERI=>153    and     VERI=<203  THEN    DURUM3
IF  VERI=>204    and     VERI=<254  THEN    DURUM4
IF  VERI=>255    and     VERI=<300  THEN    DURUM5
DURUM0:
VOLT1=0 : VOLT2=0 : VOLT3=0 : VOLT4=0 : VOLT5=0
GOTO    BASLA
DURUM1:
VOLT1=1 : VOLT2=0 : VOLT3=0 : VOLT4=0 : VOLT5=0
GOTO    BASLA
DURUM2:
VOLT1=1 : VOLT2=1 : VOLT3=0 : VOLT4=0 : VOLT5=0
GOTO    BASLA
DURUM3:
VOLT1=1 : VOLT2=1 : VOLT3=1 : VOLT4=0 : VOLT5=0
GOTO    BASLA
DURUM4:
VOLT1=1 : VOLT2=1 : VOLT3=1 : VOLT4=1 : VOLT5=0
GOTO    BASLA
DURUM5:
VOLT1=1 : VOLT2=1 : VOLT3=1 : VOLT4=1 : VOLT5=1
GOTO    BASLA

RETURN

‘LCD EKRANDA SONUC GÖSTERME************************************
(Lcd ekranda sonuç işlemek için gerekli olan LCDOUT komutumuzu kullandık.Sonraındaki ifadeler ise bize ekranımızı silmeyi ve nereden yazmaya başlayacağını ifade ediyor.sonrasında ise çıkış işlemimizi yukarıda bahsettiğimiz # sembolünü kullanarak gerçekleştiriyoruz.)
LCD:
lcdout $fe, 2,”ADC:”,#VERI,”            ”
lcdout $fe, $c0,”VOLTAJ=”,#volt,”V          ”
return

‘PROGRAM SONU**************************************************
END

      5.4.2.   OLUŞTURABİLECEĞİMİZ ALTERNATİF  PROGRAMLAR

Diğer bir veri alma yöntemi ise SHIFTIN komutunun yapacağı işlemleri sırası ile yine programsal olarak bu komutu kullanmadan yapmaktır. Aşağıda aynı işlevi yerine getiren program örnek olarak verilmiştir.

ADC:
low cs enable ‘ENABLE 0
PAUSEUS 10 ‘BEKLE
‘veri Yİ OKUMAYA BAŞLAMADAN ÖNCE 2 CLOCK GÖNDERME KISMI……..
for i=0 to 1 ‘2 DEFA
high clock ‘CLOCK 1
PAUSEUS 1 ‘BEKLE
low clock ‘CLOCK 0
PAUSEUS 1 ‘BEKLE
next i
‘MSB BİTİ OKUMA VE BİR SONRAKİ BİT İÇİN CLOCK GÖNDERME KISMI
for i=7 to 0 STEP -1 ‘8 DEFA DÖN
digital.0[i]=veri ‘veri PİNİNİN DEĞERİNİ digital İÇİNE YAZ
‘veri DEN ÖNCE MSB BİT GELİR…. ( 7 TO 0 STEP -1 )
high clock ‘CLOCK 1
PAUSEUS 1 ‘BEKLE
low clock ‘CLOCK 0
PAUSEUS 1 ‘BEKLE
next i
‘veri Yİ OKUDUKTAN SONRA veri SONU İÇİN 2 SON CLOCK DARBESİ
for i=0 to 1 ‘2 DEFA
high clock ‘CLOCK 1
PAUSEUS 1 ‘BEKLE
low clock ‘CLOCK 0
PAUSEUS 1 ‘BEKLE
next i
PAUSEUS 10 ‘BEKLE
high csenable ‘veri Yİ OKUDUKTAN SONRA ENABLE 1
PAUSE 200 ‘BEKLE
RETURN ‘ALT PROGRAM SONU

Yukarıdaki  eşdeğer program da SHIFTIN komutunun yapmış olduğu işlemleri yaparak veriyi almaktadır.Bu program veya buna benzer programlar yazarak ta veriyi alabiliriz.İzlememiz gereken yol belirli olduğundan sonuca ulaşmamız için alternatif yöntemler oluşturmamız yeterlidir.Ancak tüm bu işlemleri içinde barındıran SHIFTIN komutu işimizi çok daha kolaylaştıracaktır.
5.5.   ELDE ETTİĞİMİZ VERİLERİN LCD EKRANDA GÖSTERİLMESİ

Sağdaki örnek görüntümüzdeki gibi ADC ve VOLTAJ değerlerini bir arada gösterip hem göreselliği hem de işlevselliği artırmak için birkaç pic basic pro kodu gereklidir.LCD ekran tanımlamalarını yaptıktan sonra veri göndermememiz gerekmektedir.Bunu için ise LCDOUT komutunu kullanacağız.Bu komut Lcd ye yazdırmak istediğimiz verileri gönderen komuttur.    lcdout $fe, 2,”ADC:” bu komutumuzun anlamı ise “$fe” satırı sil, “2” ise 2.
          

              Resim 10: LCD Ekran

karakterden yazmaya başla anlamındadır.Sonrasındaki ise Lcd de yazdırmak istediğimiz veridir.O komut dizisi sonunda ekranımızda sadece “ADC:” yazacaktır.Biz “:” işaretinden sonra birde ADC değerimizi yazdırmalıyız.Onun için de komut dizemizin sonuna #VERI yazmamız yeterlidir. lcdout $fe, 2,”ADC:”,#VERI,”            ” ve son olarak komutta gördüğünüz  ,“       “ ekliyoruz ki boş kalan kısımlar boş görünsün bazı durumlarda random rakamlar görünebilir ve bizi yanıltabilir.

 

5.8.   KULLANDIĞIMIZ MALZEMELER

 

Direnç KONDANSATÖR ENTEGRE LED LCD KONNEKTÖR
R1=330R C1=10uF U1=ADC0831 D1=LED LCD1=LM016L J1=CONN–2
R2=330R C2=100nF U2=PIC16F84A D2=LED
R3=330R U3=7805 D3=LED
R4=330R D4=LED
R5=330R D5=LED
POT=1K

adc2

 
                                                 Tablo 4 : Kullanılan Malzemeler

Devre malzemelerinin dışında baskı aşamasında ve montaj aşamasında gerekli olan plaket, asit,kuşe kağıt, matkap, lehim makinesi ve lehim teli gibi malzemelere de ihtiyaç duyulacaktır.
*       KULLANILAN SEMBOL VE KISALTMALAR

ADC : Analog Dijital Converter
R :       Ohm
K :      Kilo ohm
uF:      Mikro Farad
nF:      Nano Farad
PCB: Baskı Devre
LCD: Liquit Cyristal Display
CLK: Clock palse
RC:     Resistor ve Capasitor
V:        Volt
I/O:     Input / Output ( Giriş – Çıkış )
PIC:    Perıpheral Interface Controller

 

Tasarım&Yazılım: Müslüm Horzum

 

 

Yorum Yaz