Bilgi Paylaşıldığında güzeldir

19 Mart 2013 Salı

Pic Basic Öğreniyorum 3

9.ders:
EEPROM VE SENSÖR KULLANIMI Bu dersimizde Pic ile birlikte dışarıdan bağlı hafıza ünitelerinin kullanılmalarını inceleyeceğiz. Ayrıca pic ile birlikte kullanabileceğimiz bazı sensörler ’in haberleşme sistemlerini inceleyeceğiz.
Önce Eeprom Kullanımına bir göz atalım.
Normal olarak sıklıkla kullandığımız pic modellerinde flash tipi eeprom bulunmaktadır. Ancak bazen kendi hafızlarının yetmediği durumlarda pic ile birlikte dışarıdan bağlı hafıza üniteleri kullanılır.
Önce pic’ in kendi eeprom’ u ile nasıl haberleşiyoruz biraz inceleyelim sonra harici eeprom konusuna gireceğiz.
Pic’ in dahili eepromu’ nun kullanımı ile ilgili birkaç komut var öğrenmeniz gereken. Bunların başında ;
DATA @konum, data, data, data ……
Komutu gelmektedir. Data, pic’ in programlanması esnasında hafızasının belirli konumlarına önceden belirli olan sabit bazı bilgilerin yazılması için kullanılır. Örneğin şifre kullanan bazı programlarda ilk (default ) şifrenin girilmesi bu yolla yapılır.
Komutun ilk parametresi @Konum ilk bilginin yazılacağı eeprom adresine aittir. Şayet bilgiler birbirini takip eden hafıza adreslerine yazılacak ise her seferinde adres verilmesi gerekmez. Bir kere başta adres verirsiniz sonra yazılacak bilgileri aralarına virgül koyarak sıralarsınız.
Burada dikkat edilecek husus şudur. Pic’ i her çalıştırdığınızda bu bilgilerin ilgili hafıza birimlerine yeniden yazılacak olmasıdır. Dolayısıyla şifre girişi gibi işlemlerde şayet şifreyi program içinden değiştirmiş iseniz ve pici yeniden çalıştırırsanız şifreniz tekrar eskiye dönecektir.
Aslında yeri gelmişken bu gibi konuları aşmanın bir tekniğini belirtmek isterim. Ancak bunu diğer hafıza komutlarını inceledikten sonra açıklayacağım. Dahili hafızaya bir bilgi yazmak için;
Write adres,Bilgi
Şeklinde bir komut kullanırız. Örneğin 0 nolu adrese 12 bilgisini yazmak istersek;
Write 0,12 dememiz yeterli olacaktır.
Diğer komut eepromdan bir bilgi okuma komutudur.
Read adres,Bilgi
Şeklinde kullanılır. Yine örnek olarak 0 nolu adreste yazılı olan bilgiyi okuyalım
Read 0,Sayı
Okunan değer Sayı isimli değişkene yerleştirilmiş oldu.
Yeni programlanmış bir pic’ den okunacak hafıza değeri kesinlikle $FF yani 255 olarak gelir. Bu hafızaya henüz bir şey kayıt edilmediği anlamına gelir. Diyelim ki hafızaya şifre yazacaksınız şöyle yapabilirsiniz.
Read 0,Sifre ‘ilk hafıza okundu ve değeri Sifre isimli değişkene yerleşti.
if sifre=255 then ‘henüz hafızada kayıtlı bir şey yok ise
Sifre=2 ‘yeni sifre=2 olsun
Write 0,sifre ‘yeni sifre yi sıfır no’ lu adrese yaz. Endif
Kısaca önce hafızayı okudunuz. Sonra baktınız hafızaya herhangi bir şey kayıt edilmemiş ise şifreyi belirleyip hafızaya yazdınız. Pic’ i ilk defa çalıştırınca 0 nolu adrese 2 bilgisi yazılır. Daha sonra program içinden şifrenizi değiştirdiniz. Pic’ i yeniden çalıştırınca ilgili hafızada 255 den farklı bir sayı olacağı için yeni sifre olarak 2 yazılmayacaktır. Dolayısıyla mevcut şifrenizi korumuş olacaksınız.
Son olarak dahili eeprom’ ların 8 bit çalıştıklarını ve her bir hafıza adresine 8 bitlik bilgi yazılması gerektiğini hatırlatmak isterim. Kullandığınız bilgi Word tipi yani 16 bit bir değişken ise bilgiyi Değişken.Lowbayt ve Değişken.Highbyte veya Değişken.Byte0 ve Değişken,Byte1 şeklinde 8 er bitlik iki kısma ayırıp o şekilde yazmanız gerekir. Aslında direkt word değişkeni olarak yazabilirsiniz. Bu durumda pic sizin için değişkeni lowbyte ve highbyte
olarak ayırıp öyle kayıt edecektir. Ancak okuma yaparken kesinlikle sayının 8’er birlik iki kısım halinde okunması gerekir. Örnek olarak vermek gerekir ise aşağıdakiler doğrudur.
SAYI VAR WORD
Sayı=12345 ‘Sayımız 16 bit.
WRITE 0,SAYI ‘sayıyı 16 bit olarak eeproma yazdık aslında 0 ve 1 nolu adreslere yazıldı
READ 0,SAYI.Lowbyte ‘say’ nın lowbyte nı okuduk. READ 1,SAYI.Highbyte ‘say’ nın highbyte’ ını okuduk
HARiCi EEPROMLARIN KULLANIMI
Dışarıdan bağlanabilen eepromlar genelde uzun depolama ömürleri (yaklaşık 200 yıl) nedeni ile tercih edilirler. Bunların tamamı Seri Senkron haberleşme arabirimi kullanır. Üreticilere göre haberleşme şekilleri farklıdır. Piyasada genelde 3 ayrı tip eeprom bulunmaktadır. Bunlar;
1. Microwire tipi (Atmel firmasının üretmiş olduğu) 93Cxx (93C66 gibi) eepromlar
2. SPI tipi haberleşme yapan eepromlar 24LCxxx serisi
3. I2C tipi haberleşme yapan eepromlar. 24Cxx serisi
Şimdi bunları sırası ile inceleyelim,
1. Microwire Eeprom Kullanımı;
Bu eeprom’ ların 2 adet Data pini DI (data-in) ve DO (Data-out) clock input CI veya SK ile Chip Select CS pinleri bulunmaktadır. Genelde 3 wire interface yani 3 kablolu veya hatlı arabirim şeklinde tanımlansa da haberleşme için 4 adet hat gerekiyor. Aslında 3 hatlı arabirim denmesinin bir sebebi’ de DI ve DO uçlarının Pic’ de aynı ucun kullanılabilmesinden kaynaklanır. DI (Data Giriş)işini yapmak istediğinizde yani Eeproma Data girişi (yazma) yapmak istediğinizde pic deki pin Output yapılmalı, DO yani eepromdan data okuma yapıldığında ise aynı pin Input yapılmalıdır. Böylece Eeprom ile pic arasında 3 hat bağlı olabilmektedir.
Eeprom ile haberleşmede 7 adet komut kullanılabilir. Bunlar;
Her bir haberleşme işi bir START işlemi ile başlamalıdır. Start işleminde; -CS High ve DI High yapılır ve Clock ucu low dan High a dönerken start konumu sağlanmış olur. Bu yüzden bir işlem yapıldıktan sonra DI ucu daima High da bırakılır. Pic den gelen her bir işlem komutundan sonra CS low’a çekilmelidir. Yalnızca birbirinin ardı sıra (sequential) okuma durumlarında bu işlem yapılmaz.
Eeproma yazmak için -önce DI hattından ERASE/WRITE ENABLE komutu gönderilir. Bunun rakam karşılığı %10011 dır. -Arkasından bir Write komutu gönderilir (%101) -Sonra Adres bilgisi -Ve arkasından yazılacak bilgi gönderilir. -En sonunda CS Low’a çekilir.
ERASE/WRITE ENABLE komutu bir çalışma döneminde yalnızca bir kere verilen bir komuttur. Bunun anlamı şudur. Pic ilk çalıştırıldığında bu komut bir defa verilir ise sonraki okuma yazma işlemlerinde yeniden bu komutun verilmesi gerekmez. Ne zaman gerekir, pic’ in voltajını dolayısıyla eepromun besleme voltajını kesip yeniden çalıştırdığınızda bu gereklidir.
Aynı şekilde Eepromdan okuma yapmak için
-Önce DI hattından bir READ komutu gönderilir (%110) -Arkasından okunacak adres bilgisi gönderilir
-Şayet okuma yapıldıktan sonra CS Low yapılmaz ise yani High da tutulur ise okumanın devam edeceği anlamına gelir . Şayet CS low yapılır ise ondan sonraki okuma komutu yine READ-ADRES bilgisi ile başlamalıdır.
Bu hafıza ile ilgili olarak simülasyon imkanımız olmadığı için yalnızca bir örnek program vermekle yetineceğim. Bu tip eepromlar ile haberleşme yapabilmek için SHIFTIN ve SHIFTOUT komutlarını kullanıyoruz. Komutların nasıl kullanıldıklarını görebilmek için örneğimizi yazalım.
Örneğimizde Eepromun ilk 8 adresine bir şifreli kilit için gerekli şifre bilgisi yazdıracağımızı varsayacağız. Şifremiz 8 haneli bir rakam olacak. Ancak biz bunu 2 adet Word değişkeninde saklayacağız. Kolay anlaşılması açısından şifremizi ;
SIFRE_A=1234
SIFRE_B=5678
 ‘tamamı Şifre=12345678 olarak tanımladık Şeklinde tanımlıyoruz.
Örnek Program:
‘****************************************************************
‘* Name : Microwire Eeprom.BAS *
‘* Author : [E.T.E] *
‘* Notice : Copyright (c) 2005 Ete] *
‘* : All Rights Reserved *
‘* Date : 30.06.2005 *
‘* Version : 1.0 *
‘* Notes : *
‘* : *
‘****************************************************************
Include “Modedefs.Bas”
PORTA=0
TRISB=%00000000 ‘PortB.0 giriş diğerleri çıkış yapıldı.
TRISA=%00000000 ‘A port’ u  tamamı çıkış yapıldı.
‘—————————————————————-
@ DEVICE pic16F628 ‘işlemci  16F628
@ DEVICE pic16F628, WDT_on ‘Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON ‘Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF ‘Kod Protek kapalı
@ DEVICE pic16F628, MCLR_OFF ‘MCLR  pini kullanılıyor.
@ DEVICE pic16F628,  INTRC_OSC_NOCLKOUT ‘Dahili osilatör kullanılacak
‘——————————————————————–
SYMBOL CS=PortB.0 ‘ Chip Select  pin
SYMBOL SK=PortB.1 ‘ Clock pin
SYMBOL DI=PortB.2 ‘ Data in pin
SYMBOL DO=PortB.2 ‘ Data out pin
SIFRE_A
VAR BYTE
SIFRE_B
VAR BYTE
ADRS
VAR word
E_GIRIS
Var Byte‘ Eeprom’ a yazılacak bilgi
E_CIKIS
Var Byte‘ Eeprom’ dan  okunacak Bilgi
EWEN Con %10011 ‘  Erase/Enable kodu
EWDS Con %10000 ‘ Disable  Kodu
ERAL Con %10010 ‘ Erase-All  Tamamını sil Kodu
WRAL Con %10001 ‘ Tamamına  yaz kodu
ERD Con %1100 ‘ Read Kodu
EWR Con %1010 ‘ Write Kodu
ERASE Con %1110 ‘ Erase  Kodu

 
‘———ÖNCE EEPROM WRITE ENABLE YAPILDI———————–


High CS ‘ Enable eeprom
Shiftout DI,SK , 1 ,[EWEN5,07]‘  WRITE ENABLE kodu gönder
Low CS ‘ Disable eeprom
SIFRE_A=1234
SIFRE_B=5678

BASLA:


‘—————–önce ilk sekiz adrese bilgi yazalım—————-


ADRS=0
E_CIKIS=SIFRE_A DIG 0
GOSUB E_YAZ
ADRS=1
E_CIKIS=SIFRE_A DIG 1
GOSUB E_YAZ
ADRS=2
E_CIKIS=SIFRE_A
DIG 2 GOSUB E_YAZ
ADRS=3
E_CIKIS=SIFRE_A DIG 3
GOSUB E_YAZ ’sifre 2. kısım yazılıyor
ADRS=4
E_CIKIS=SIFRE_B DIG 0
GOSUB E_YAZ
ADRS=5
E_CIKIS=SIFRE_B DIG 1
GOSUB E_YAZ
ADRS=6
E_CIKIS=SIFRE_B DIG 2
GOSUB E_YAZ
ADRS=7
E_CIKIS=SIFRE_B DIG 3
GOSUB E_YAZ

 ‘———-Şimdide ilk 8 adresteki bilgileri okuyalım——————-


ADRS=0
GOSUB E_OKU
SIFRE_A=E_GIRIS
ADRS=1
GOSUB E_OKU
SIFRE_A=SIFRE_A+E_GIRIS*10
ADRS=2
GOSUB E_OKU
SIFRE_A=SIFRE_A+E_GIRIS*100
ADRS=3
GOSUB E_OKU
SIFRE_A=SIFRE_A+E_GIRIS*1000


‘———–Sifre 2. kısım okunacak——————-


ADRS=4
GOSUB E_OKU
SIFRE_B=E_GIRIS
ADRS=5
GOSUB E_OKU
SIFRE_B=SIFRE_B+E_GIRIS*10
ADRS=6
GOSUB E_OKU
SIFRE_B=SIFRE_B+E_GIRIS*100
ADRS=7
GOSUB E_OKU
SIFRE_B=SIFRE_B+E_GIRIS*1000  ‘buraya kadar olan satırlarda Sifre_A=1234 , Sifre?B=5678 olarak okundu


END ‘PROGRAM BURADA SONA  ERECEK!!!!!!!!!!!!!!!!!

‘————————ALT PROGRAMLAR—————————-
E_YAZ:
High CS ‘ Eeprom Enable yapıldı
Shiftout DI,SK,  1,[EWR4,ADRS,E_CIKIS] ‘
Low CS ‘ Disable the eeprom Pause 10 Return
E_OKU:
High CS ‘ Eeprom Enable yapıldı
Shiftout DI,SK, 1,[ERD4,ADRS] ‘  READ komutu ve Adres verildi
Shiftin DO,SK, 2,[E_GIRIS] ‘  Okunan data E_Giris içinde Low CS ‘ Disable eeprom Return
END
SPI TIPI EPROMLARIN KULLANIMI:
Aslında Microwire tipi eepromlar ile çok benzerlikleri vardır. Bazı ufak tefek farklılıklar ile haberleşme Microwire ile çok benzeşir. Bu yüzden burada açıklama vermek yerine bir örnek program üzerinden açıklamamızı vereceğiz.
Microwire tipi eepromlar bölümünde vermiş olduğumuz programı bu sefer SPI tipi ile yapacağız. Böylece izleyenler aralarındaki farkı kolaylıkla görmüş olacaklardır.
Örneğimizde Eepromun ilk 8 adresine bir şifreli kilit için gerekli şifre bilgisi yazdıracağımızı varsayacağız. Şifremiz 8 haneli bir rakam olacak. Ancak biz bunu 2 adet Word değişkeninde saklayacağız. Kolay anlaşılması açısından şifremizi ; SIFRE_A=1234 SIFRE_B=5678 ‘tamamı Şifre=12345678 olarak tanımladık Şeklinde tanımlıyoruz.
Programımız;


I2C TiPi EEPROMLARIN KULLANIMI:
Senkronize seri bus sitemi ile çalışan bu haberleşme şekli yalnızca hafızalar değil diğer bazı cihazların birbirleri veya bu cihazların MCU üniteleri ile haberleşmesinde de kullanılmaktadır. Haberleşme, her biri çift yönlü (bi-directional) 2 hat üzerinden yapılır. Bunlar SDA Serial Data, ve SCL, Serial Clock olarak tanımlanırlar. Protokolü her zaman olduğu gibi burada incelemeyeceğiz. Yalnızca eeproma nasıl bilgi yazılır ve nasıl okunur bu konuyu açıklığa kavuşturacağız. Pic BASIC de I2C haberleşmesi için direkt komut vardır. Yazma için;
I2CWRITE DPIN, CPIN, $A0, 0, [SAYI]
Okuma için
I2CREAD DPIN,CPIN,$A0,0,[SAYI]
Şeklinde komutlar kullanılır.
DPIN burada Data pin’ini , CPIN ise Clock pin’ini göstermektedir. Bu pinleri belirledikten sonra Kontrol kodu verilir. Cihazlara göre değişiklik arz eden bu kod eepromlar için genelde %1010 dır. Adres eepromda yazılacak veya okunacak adresi belirler. Okunacak veya yazılacak bilgi 8 veya 16 bit olabilir (Byte-Word). Bu durumda Adres değişkeni de bilgi değişken tipine göre seçilmelidir. Word tipi bir bilgi yazılması veya okunması halinde adres de word tipinde seçilmelidir.
BASIC de diğer eeprom tiplerine göre daha kolay bir kullanım şekli sunan I2C tipi eeprom’ larla ilgili örneğimiz yine aynı olacaktır. Önceden yazmış olduğumuz programı bu seferde I2C tipi eepromlar için yazacağız.
işte programımız,

PIC iLE BiRLiKTE SENSÖR KULLANIMI
Sensörler hayatımız kolaylaştıran ve zaman zamanda hayranlık duyduğum cihazlardır. Pek çoğu pic ile haberleşebilmektedir. Burada piyasada en çok kullanılan sensörler den bazılarının pic ile olan haberleşme konusunu işleyeceğiz.
işe sıcaklık sensörler’ inden başlamak istiyorum. Bu konuda en çok kullanılanlardan birisi olan DS18B20 sensör ünü ele alacağız. TO92 kılıfında imal edilmiş bulunan sensör one-wire (tek hat veya tek-tel) haberleşme sistemine sahiptir. Üç bacaklı olan sensör ün iki bacağı besleme ve kalan son bacağı da Data in ve out bacağı olarak çalışmaktadır. Okunan değerler dijital olarak alınıp formül kullanılarak ısı’ya çevrilmektedir.
Konuyu yine bir örnek ile açıklayalım.
Örneğimizde Pic 16F628’e bağlı bir sensör ün değerlerini okuyacak ve ısı göstergesi şeklinde LCD ekranda göstereceğiz.
Önce şemamızı verelim,
Program,


Programdan da görüleceği üzere sensör okunduktan sonra önce sıcaklığın sıfırın altında mı yoksa üstünden mi anlamak için okunan ham değerin 11. bitine bakıyoruz. Bu bit şayet 1 ise sıcaklık eksi demektir. Bu bitin değerine göre program ayrı hesaplama bölümlerine gitmektedir. Bu programda 32 bit hesaplama işlemi kullanılmaktadır. Kısaca mantığını izah etmek istiyorum. Hesapla isimli alt programda;
TEMP=($FFFF -HAM+1)*625 şeklinde bir satır mevcuttur. Burada TEMP değişkeni içine 32 bit hesaplama yapacağımız değer yerleştirilmektedir. 32 bitlik hesap komutu bu satırın hemen altında verilmektedir. Bir örnek hesapla işi daha kolay anlayacağınızı umuyorum. -25 dereceye karşılık gelen ham değer $FE6F dir. Bu formüle göre TEMP= ($FFFF-$Fe6F+1) x 625 = 250.625 , görüldüğü gibi bu hesabın sonucunda TEMP isimli değişkende 250.625 sayısı yer alması gerekir. Ancak bu sayı WORD formatından büyüktür ve 32 bit büyüklüğündedir. Bu yüzden pic bu değişken değerini kendi içinde geçici bir yerde tutar ve bir sonraki satırda verilen hesap da kullanır. Bir sonraki satırda;
ISI = DIV32 10
Şeklinde bir ifade yer alır. Bu ifadenin anlamı; ISI = TEMP /10 şeklindedir. Yani temp hesabında elde edilen değer 32 bitişlemi ile 10’a bölünmektedir. Dolayısıyla elde edilecek sonuç bizim örneğimize göre;
250.625 / 10 = 25.062 olacaktır. BU sonuç 16 bit dir ve işlemlerimizde kullanabileceğimiz hale gelmiştir.
SHT-11 (SENSIRION) DIGITAL ISI ve NEM SENSÖRÜ
Sensirion firmasının üretimi olan bu sensörler I2C prensibine benzer bir mantık ile haberleşme yapmakla beraber tam anlamı ile birebir değildir. Sensör tamamı ile dijital bir sensör olup aynı kılıf içinde hem ısı hem de rutubet sensör ünü taşımaktadır. Sıcaklık aralığı -40 ile +123 derece arasında dır. Rutubet ölçümlerinde 0-ile %99,999 hassasiyette ölçüm yapabilmektedir. Ayrıca rutubet ölçümünde sıcaklık kompanizasyonu bulunmaktadır.
Örnek programımız aşağıdadır.


9.ders  Proteus ve hex dosyaları  

10.ders:

PROGRAM ÖRNEKLERi 10 derslik Pic Basic derslerimizin sonuna gelmiş bulunuyoruz. (13 bölüm oldu) Bu bölüme kadar verilen bilgilerde Pic MCU ların alternatifli olarak kullanım örneklerini dış ünitelerle bağlantılarını haberleşmelerini öğrendik. Arada da bazı kullanılan komutları işledik. Bu son dersimizde program örnekleri göreceğiz.

ÖRNEK PROGRAM: 1 LED ANiMASYONU

işe fantezi ile başlayalım ve bir LED-ANiMASYON projesi verelim. Bu projede PortA ve PortB nin tamamı kullanılarak 16 led’den oluşan bir görsel gösteri ünitesi yapacağız. Ledler değişik şekillerde yanarak bize bir gösteri sunacaklar.
Önce Şemamız;

Aslında PIC16F628 de PortA.5 (MCLR bacağı) çıkış olarak kullanılamaz. Ancak sırf görsel amaçlı olarak bu projede simulasyon olarak denedim ve çalıştığını gördüm. Gerçekte çalışmaması gerekir. Devreyi yapacaklar için kısa bir açıklama olarak vereyim istedim.
Diğer taraftan gerçek devrede Pic pinleri ile Led ler arasında 330 Ohm direnç kullanılması gerekmektedir. Aksi halde Pic bozulur. BU açıklama da devreyi fiilen yapmak isteyenler içindir.


ÖRNEK PROGRAM : 2 OTO CAM KONTROLU

ikinci örneğimiz enteresan bir örnek olacak. 16F628 de komparatör kullanımına güzel bir örnekdir. Projenin amacı otomobillerde motor kontrollu yan camların açılıp kapanmasını otomatik olarak kontrol etmekdir. Cam açma butonuna kısa süreli basılır ise cam basılan süre kadar aşağı veya yukarı hareket edecek, butona biraz uzun basılması halinde ise cam otomatik olarak açılacak veya kapanacaktır. Tabiiki nereye kadar, cam son noktada gidecek yeri olmadığı için motor sıkışacak ve normalde 2 Amper dolayında motordan çekilen akım 3 amper veya daha fazlasına yükselecektir. işte bu aşamada komparatörler devreye girerek motorun akımını keseceklerdir.
Motorun sıkışmasını simule edebilmek için çalışan motora paralel ikinci bir motor daha devreye sokulmaktadır. Bu sayede normalde 2 A dolayında olan çekilen akım iki katına çıkmaktadır ve sistem çekilen fazla amperi algılayıp motorları durdurmaktadır. Sistemin çekilen hangi amper seviyesinde durmasını sağlayacak ince ayarlar devrede bulunan 2 adet 220 Ohm ayarlı dirençler ile yapılmaktadır.
Önce şemamızı verelim;




ÖRNEK PROGRAM : 3 DTMF iLE CiHAZ KONTROLU

Bu örneğimizde Telefonla cihaz kontrol sistemini inceleyeceğiz. Kısaca DTMF kontrol ismi verilen program ile bir telefon hattına bağlayacağımız sistemimizle 5-6 adet cihazı istediğimiz zaman açıp kapatabileceğiz. Arada mesafe olduğundan yapılan işlerin onayı sesli olarak hattan verilmektedir. Bu aleti fiziki olarakda yaptım ve kullanıyorum. Bu devrede simulasyon imkanımız olmadığı için devre şeması vermekle yetineceğiz.;
Programa geçmeden kullanımla ilgili bazı açıklamalar vermek istiyorum.
Program öncelikle çalan telefon zilini saymakta ve önceden ayarlanmış adedi bulduğunda hattı otomatik olarak açmaktadır. Zilin çalma sayısı program içinden değiştirilebilmektedir.
Hat açıldıktan sonra program şifre girmenizi beklemektedir. Şifre 4 haneli bir rakam olup default olarak 1111 şeklinde ayarlanmıştır. Ayrıca birde master şifre vardır. Ana şifrenin unutulması durumunda master şifre girilerek şifrenin default şifre ye dönüştürülmesi sağlanmıştır.
Şifre girişini takiben program role kontrol bölümüne atlamaktadır. Burada ;
-önce # tuşu sonra 1-2-3-4-5 rakamlarından herhangi birisi girildiği tatirde girilen rakama karşılık gelen role çıkışı aktif edilmekte bu durum ilgili led in yanması ile anlaşılmaktadır. Açılan rolenin sayısı kadar da hatta beep sesi verilmektedir. Örneğin 2 nolu role açılmış ise Beep – Beep şeklinde 2 adet beep sesi alınmaktadır.
-Önce # tuşu ardından 8 tuşu girilir ise Zil çalma adedi değiştirilebilir. 8 rakamının hemen ardından yeni zil adedi girilmelidir. -Önce # sonra 9 rakamı girilir ise şifre değiştirilecek demektir. Burada önce eski şifre ardından yeni şifre
girilmelidir. -Önce # ve ardından 0 rakamı girilir ise sistemden çıkış yapılır. Hat kapatılır. -Önce * tuşu ve ardından 0 rakamı girilir ise açık olan tüm roleler kapatılmaktadır. -Önce * ardından 1-2-3-4-5 rakamlarından biri girilir ise ilgili rakama karşılık gelen role kapatılır.
Devrede kullanılan trafo 600/600 sarımlı telefon hat trafosudur. Eski modemlerin üzerinde bulunmaktadır.
‘****************************************************************
‘*  Name    : UNTITLED.BAS                                      *
‘*  Author  : [E.T.E]                                           *
‘*  Notice  : Copyright (c) 2005 Ete]                           *
‘*          : All Rights Reserved                               *
‘*  Date    : 02.06.2005                                        *
‘*  Version : 1.0                                               *
‘*  Notes   :                                                   *
‘*          :                                                   *
‘****************************************************************
PORTA=0:PORTB=0
TRISB=%00000001 ‘PortB.0 giriş diğerleri çıkış yapıldı.
TRISA=%00111111 ‘A portu  tamamı çıkış yapıldı.
‘—————————————————————–
@ DEVICE pic16F628 ‘işlemci  16F628
@ DEVICE pic16F628, WDT_OFF  ‘Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON  ‘Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF  ‘Kod Protek kapalı
@ DEVICE pic16F628, MCLR_OFF  ‘MCLR pini kullanılıyor.
@ DEVICE pic16F628,  INTRC_OSC_NOCLKOUT ‘Dahili osilatör kullanılacak
‘—————————————————————–
CMCON=7 ‘16F628 de  komparatör pinleri iptal hepsi giriş çıkış
‘—————————————————————–
SIFRE  VAR WORD
RAKAM  var WORD
TEMP   VAR WORD
BASKA  VAR WORD
ZAMAN  VAR WORD
SURE   VAR word
SAYAC  VAR BYTE
SAYI   VAR BYTE
DURUM  VAR BYTE
BIRLER VAR BYTE
ONLAR  VAR BYTE
YUZLER VAR BYTE
BINLER VAR BYTE
ZIL    VAR BYTE ‘ÇALACAK ZİL ADEDİ
X      VAR BYTE
CIK    VAR BIT
SYMBOL HAT=PORTB.0
SYMBOL CIKIS1=PORTB.1
SYMBOL CIKIS2=PORTB.2
SYMBOL CIKIS3=PORTB.3
symbol CIKIS4=PORTB.4
SYMBOL CIKIS5=PORTB.5
SYMBOL ISD =PORTB.6
SYMBOL ROLE=PORTB.7
SYMBOL VALDAT=PORTA.0
SYMBOL BUZZER=PORTA.7

‘————————————————————————–
‘DATA @ 0,1,2,3,4
‘data @ 0,255,255,255,255,255
DATA @ 16,5
PAUSE 200
CLEAR
read 0,SAYI: PAUSE 10
IF SAYI=$FF THEN
SIFRE=1234
GOSUB SIFREYAZ
endIF
READ 0,BINLER
READ 1,YUZLER
READ 2,ONLAR
READ 3,BIRLER
SIFRE=BINLER*1000+YUZLER*100+ONLAR*10+BIRLER
READ 16,ZIL
IF ZIL=255 THEN
ZIL=5
WRITE 16,ZIL
ENDIF 

‘————————————–ANA————————————–
BASLA: Sayac=0
‘——————————-PORTB.0=HIGH————-
ILK:    IF HAT=1 THEN ILK
‘——————————PORTB.0=LOW—————
BAK:     SAYAC=SAYAC+1
BIR:     IF HAT=0 THEN BIR
‘——————————PORTB.0=LOW—————–
IF SAYAC=ZIL THEN
PAUSE 1800
HIGH ROLE
pause 300
GOTO BIRINCI
ENDIF
SURE=0
WHILE HAT=1
SURE=SURE+1
IF SURE=300 THEN ILK
PAUSE 1
WEND
IF SURE<100 50="" 600="" :="" :sayac="0:GOSUB" atla:="" b="" bak="" basla="" bir="" birinci:="" bitir="" cik="1" endif="" exit="" gosub="" goto="" if="" pause="" rakam="SIFRE" rolekontrol="" sayac="3" sayma="" ses1:="" ses1:gosub="" ses1="" ses2:gosub="" ses2="" ses3="" sifre="1234" sifreal="" sifreyaz="" sleep="" strong="" then="" yine:="" yine="">

ROLEKONTROL:    GOSUB  ALBILGI
IF CIK=1 THEN BITIR
IF SAYI=12 THEN ACMA  ‘#
IF SAYI=11 THEN KAPAT ‘*
gosub ses2
‘                GOSUB EXIT
GOTO BASLA
ACMA:
GOSUB ALBILGI
IF CIk=1 THEN BITIR
IF SAYI=0 THEN
gosub ses3
GOSUB EXIT
GOTO BASLA
ENDIF 

 DURUM=PORTB 

 IF SAYI=1 THEN
IF durum.1=0 THEN
GOSUB SES1
PORTB=DURUM | %00000010
goto ROLEKONTROL
ENDIF
ENDIF

 IF SAYI=2 THEN
IF durum.2=0 THEN
GOSUB SES1:GOSUB SES1
PORTB=DURUM | %00000100
goto ROLEKONTROL
ENDIF
ENDIF 

 IF SAYI=3 THEN
IF durum.3=0 THEN
FOR X=1 TO 3:GOSUB SES1:NEXT
PORTB=DURUM | %00001000
goto ROLEKONTROL
ENDIF
ENDIF

 IF SAYI=4 THEN
IF durum.4=0 THEN
FOR X=1 TO 4:GOSUB SES1:NEXT
PORTB=DURUM | %00010000
goto ROLEKONTROL
ENDIF
ENDIF

 IF SAYI=5 THEN
IF durum.5=0 THEN
FOR X=1 TO 5:GOSUB SES1:NEXT
PORTB=DURUM | %00100000 ‘#5
goto ROLEKONTROL
ENDIF
ENDIF

 IF SAYI=8 THEN                          ‘#8
GOSUB SES2
GOSUB ALBILGI
GOSUB SES1:gosub ses2
IF CIK=1 THEN BITIR
IF SAYI>0 AND SAYI<13 10="" 16="" endif="" goto="" pause="" rolekontrol="" strong="" then="" zil="SAYI:WRITE">

 IF SAYI=9 THEN         ‘#9
GOSUB SIFREAL
GOSUB SES1:gosub ses2
IF CIK=1 THEN BITIR
IF RAKAM=SIFRE THEN
GOSUB SES1:GOSUB SES1:GOSUB SES2
GOSUB SIFREAL
IF CIK=1 THEN BITIR
SIFRE=RAKAM
GOSUB SES1:gosub ses2
gosub SIFREYAZ
ENDIF
ENDIF
GOTO ROLEKONTROL 

KAPAT:     GOSUB ALBILGI
IF CIK=1 THEN BITIR
durum=PORTB

 IF SAYI=0 THEN
GOSUB SES3
PORTB=DURUM & %11000001  ‘*0
ENDIF 

 IF SAYI=1 THEN
IF durum.1=1 THEN
GOSUB SES2
PORTB=DURUM & %11111101
goto ROLEKONTROL
ENDIF
ENDIF 

 IF SAYI=2 THEN
IF durum.2=1 THEN
GOSUB SES2:GOSUB SES2
PORTB=DURUM & %11111011
goto ROLEKONTROL
ENDIF
ENDIF 

 IF SAYI=3 THEN
IF durum.3=1 THEN
FOR X=1 TO 3:GOSUB SES2:NEXT
PORTB=DURUM & %11110111
goto ROLEKONTROL
ENDIF
ENDIF

 IF SAYI=4 THEN
IF durum.4=1 THEN
FOR X=1 TO 4:GOSUB SES2:NEXT
PORTB=DURUM & %11101111
goto ROLEKONTROL
ENDIF
endif

 IF SAYI=5 THEN
IF durum.5=1 THEN
FOR X=1 TO 5:GOSUB SES2:NEXT
PORTB=DURUM & %11011111  ‘*5
ENDIF
ENDIF
GOTO ROLEKONTROL 

SIFREAL:  GOSUB ALBILGI
IF CIK=1 THEN RETURN
RAKAM=SAYI*1000
GOSUB ALBILGI
IF CIK=1 THEN RETURN
RAKAM=RAKAM+SAYI*100
GOSUB ALBILGI
IF CIK=1 THEN RETURN
RAKAM=RAKAM+SAYI*10
GOSUB ALBILGI
IF CIK=1 THEN RETURN
RAKAM=RAKAM+SAYI
RETURN 

ALBILGI:
SURE=0:ZAMAN=0
WHILE VALDAT=0
SURE=SURE+1
PAUSEus 270
IF SURE=65500 THEN
CIK=1:RETURN
ENDIF
WEND 

SAYIAL: SAYI=0
WHILE VALDAT=1
SAYI.0=PORTA.4
SAYI.1=PORTA.3
SAYI.2=PORTA.2
SAYI.3=PORTA.1
WEND
IF SAYI=10 THEN SAYI=0
RETURN

SIFREYAZ:TEMP=SIFRE
BINLER=TEMP DIG 3
YUZLER=TEMP DIG 2
ONLAR =TEMP DIG 1
BIRLER=TEMP DIG 0
WRITE 0,BINLER: PAUSE 10
WRITE 1,YUZLER: PAUSE 10
WRITE 2,ONLAR : PAUSE 10
WRITE 3,BIRLER: PAUSE 10
RETURN

SES1: SOUND  BUZZER,[110,12]: pause 30:RETURN
SES2: SOUND BUZZER,[95,12] : PAUSE 30:RETURN
SES3: SOUND BUZZER,[85,25] : PAUSE 30:RETURN 

BITIR:  GOSUB EXIT:GOTO  BASLA:RETURN
EXIT :  SURE=0
HAT=0
CIK=0
SAYAC=0
RAKAM=0
LOW ROLE
LOW ISD
gosub ses2
gosub ses2
GOSUB SES3
GOSUB SES3
RETURN 

End

ÖRNEK PROGRAM : 4 ***********DiJiTAL POT (DS1868) KONTROLÜ**********

Dallas firmasının DS1868 kodlu dijital potansiyometre kullanımına ait bir örnek vermek istiyorum. Söz konusu potansiyometrenin model dosyası bulunmadığından dolayı simulasyon bir shift register kullanılarak yapılmıştır.
Neticede DS1868 in içinde bir shift register bulunmaktadır ve pot değeri bu registere yazılarak sağlanmaktadır. Önce şemamız;
‘****************************************************************
‘*  Name    : PIC-DIGIPOT.BAS                                      *
‘*  Author  : [E.T.E]                                           *
‘*  Notice  : Copyright (c) 2004 [ETE]                          *
‘*          : All Rights Reserved                               *
‘*  Date    : 25.08.2004                                        *
‘*  Version : 1.0                                               *
‘*  Notes   :                                                   *
‘*          :                                                   *
‘****************************************************************

 RAW    VAR   BYTE
ZAMAN  VAR   WORD
RST     VAR   PORTA.0
CLK     VAR   PORTA.2
BILGI   VAR   PORTA.1
TUSA     VAR   PORTB.0
TUSB     var   PORTB.1
KONUM   VAR   BYTE
I       VAR   BYTE
STK     VAR   BYTE

 TRISA=%00000000
TRISB=%00000011

 PORTB=0
PORTA=0
ZAMAN=0
STK=1
‘	ADCON1 = %00000010 ‘AN0 VE AN1 Analog,Ref =VDD
PAUSE 500
konum=0
raw=0
I=0

 BASLA:
IF TUSA=0 THEN
IF I=1 THEN BASLA
if konum=255 then basla
konum=konum+1:I=1:GOTO CIK
ENDIF 

 IF TUSb=0 THEN
IF I=1 THEN BASLA
if konum=0 then basla
konum=konum-1:I=1:GOTO CIK
ENDIF 

 IF RAW<>KONUM  THEN GOSUB POTYAZ
I=0
CIK:        GOTO BASLA

 POTYAZ:     HIGH  RST: PAUSE 1
HIGH BILGI
PULSOUT CLK,1
SHIFTOUT BILGI,CLK,1,[KONUM]
SHIFTOUT BILGI,CLK,1,[KONUM]
LOW RST: PAUSE 1
RAW=KONUM
RETURN

 end
ÖRNEK PROGRAM : 5 **************FREKANSMETRE – PALS SAYICI*******************
Bu örneğimizde Bir Frekansmetre yapacağız. Bu programda Pic16F628 kullanacağız. PIC16F628 de 16 bitlik TMR1 sayacını dışarıdan gelen palsleri sayacak şekilde ayarlayıp sonuçta belirli örnekleme süreleri kullanarak frekans veya pals sayacı olarak kullanacağız. Frekans ölçme aralığımız kullandığımız örnekleme süresine bağlı olarak 1 Hz ile yaklaşık 40 MHz arasında olacaktır. Teorik olarak üst sınır 65 MHz dolayındadır.
Ancak kullanılan malzemeler bu frekanslara çıkmadığı için denemelerle sabit olan ölçülebilecek maksimum frekans yaklaşık 40 MHz dolayındadır. Ancak frekans kaynağından Pic’e direkt giriş yapabilirseniz bu durumda üst sınır yükselebilmektedir. Frekansmetre’nin üst ölçüm sınırını daha da yukarı çekebilmek için arada birde 64’e bölücü (U664) kullanılmaktadır.
Bu durumda üst ölçüm sınırı 1,2 GHz ye kadar çıkabilecektir. Program PicBasicPro ile birlikte ASM nin kullanılmasına iyi bir örnekdir. BU programda frekans ölçümünde kullanılacak olan örnekleme süreleri için ASM kullanılmıştır. Zira, 1ms – 10 ms – 100 ms ve 1000 ms lik süreleri hassas olarak elde etmenin en iyi yolu ASM kullanmaktır. Temel mantık olarak düşük frekanslarda büyük süre yüksek frekanslarda ise düşük süre kullanılarak ölçüm yapılmaktadır.
Programı isis de simule edebilmek için basit bir devre kullanıyoruz. Önce bu devremizi verelim;
Programda TMR1 kullanıldığını söylemiş idik. TMR1 şayet dışarıdan gelen pals leri sayacak ise giriş bacağı olarak yalnızca PortB.6 pini kullanılmaktadır. Dolayısıyla programda da bu bacak kullanılmıştır.
Program girilen frekansa bağlı olarak ölçüm modu (örnekleme süresi) seçimini otomatik yapmaktadır. Bunu anlayabilmek için önce bir kısa süreli ölçüm yapmakta ve bulduğu değere bağlı olarak mod seçmektedir.
işte Programımız;
‘****************************************************************
‘*  Name    : Frekans-Roleli.BAS                                    *
‘*  Author  : [Erol Erdal]                                      *
‘*  Notice  : Copyright (c) 2004 [Erolec]                       *
‘*          : All Rights Reserved                               *
‘*  Date    : 29.11.2004                                        *
‘*  Version : 1.6                                               *
‘*  Notes   : 10MHz Kristal ile çalışır, U664 (64'de bölücü)    *
‘*          : ile çalışır, Otomatik 4 Mod (0-3) seçer           *
‘****************************************************************

@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_off
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, PROTECT_OFF
@ DEVICE pic16F628, MCLR_ON
@ DEVICE pic16F628, HS_OSC
DEFINE  OSC  10
DEFINE  LCD_DREG     PORTA
DEFINE  LCD_DBIT     0
DEFINE  LCD_RSREG    PORTB
DEFINE  LCD_RSBIT    2
define  LCD_RWREG    PORTB
DEFINE  LCD_RWBIT    1
DEFINE  LCD_EREG     PORTB
DEFINE  LCD_EBIT     0
DEFINE  LCD_BITS     4
DEFINE  LCD_LINES    2
DEFINE LCD_COMMANDUS 4000
DEFINE LCD_DATAUS	 250

TRISA=0
TRISB=%11111000
low PORTB.1

‘——————————————————————————-
Frekans     var word
FrekansL    var Frekans.byte0
FrekansH    var Frekans.byte1
sure     VAR WORD
sureL    var SURE.Byte0
sureH    var SURE.Byte1

TOPLAM   var  word
sayac    var  word
counter  var  byte
HAS      VAR  BYTE
I        var  byte

X        var  bit
Z        VAR  BIT
ilk      var  bit
SEC      VAR  PORTB.7
‘——————————————————————————-
Z=0
CMCON=7
has=0:ilk=0
lcdout $FE,1
lcdout “***EROL ERDAL***”
lcdout $FE,$C0,”**FREKANSMETRE**”: PAUSE 300

‘*******************************  FREKANSMETRE***********************************
START:
‘         gosub olc
‘         gosub modsec
‘         lcdout $FE,1,”fre:”,#frekans,” mod=”,#has,”S=”,#SEC
‘         pause 500:goto start
ATLA:    IF SEC=1 THEN
HAS=4:goto birinci
else
gosub MODSEC
endif
pause 200

Birinci: SELECT CASE has
‘———-bölücüsüz ölçüm— Mode=0——-0 Hz - 65 KHz.———————-
CASE 0
gosub binms
Lcdout $FE,$80,”0-65 KHz : MOD=”,#has
if frekans<1000 1="" 500="" 650="" :="" atla="" ayac="" b="" c="" case="" dec3="" endif="" frekans="" gosub="" goto="" has="" hz="" khz.-="" khz="" l="" lcdout="" mler="" mod="”,DEC" ode="1——-65" oplam="" pause="" re:="" s="" sayac="frekans/100:Toplam=(frekans//100)" strong="" then="" toplam="" tus="" yuzms="" z:="" z="">

‘——BÖLÜCÜSÜZ ÖLÇÜMLER—-Mode=2——650 KHz - 6,5 MHz————–
CASE 2
gosub onms
sayac=frekans/10:Toplam=(frekans//10)
Lcdout $FE,$80,”065-6 MHz: MOD=”,#has
if sayac<1000 atla="" dec3="" endif="" fe="" gosub="" goto="" khz="" lcdout="" mhz="" oplam="" re:="" sayac="" strong="" then="" toplam="" tus:goto="" tus="">

 ‘——-BÖLÜCÜSÜZ ÖLÇÜMLER——Mode=3——6,5 MHz - 30 MHz————
CASE 3
gosub Birms
sayac=frekans
toplam=sayac/1000
Lcdout $FE,$80,”6,5-50MHz: MOD=”,#has
lcdout $fe,$C0,”Fre:”,#toplam,”,”,#(sayac//1000),” MHz    ”
gosub tus
‘         pause 500
goto ATLA

‘——BÖLÜCÜ İLE ÖLÇME BÖLÜMÜ—-Mode=4——30 mhZ - 1200 mhZ——–
case 4
gosub birms
sayac=Frekans**64
frekans=div32 10
sayac=frekans/100:Toplam=(frekans//100)
Lcdout $FE,$80,”50 MHz>:   MOD=”,#has
Lcdout $FE,$C0,”Fre:”,#Sayac,”,”,dec3 (Toplam*10),” MHz   ”
gosub tus
‘         pause 500
Goto ATLA
‘————modların sonu ——————————————–
case 5
HAS=0:GOTO START
END SELECT
Z=0
GOTO START
‘
TUS:      if PortB.3=1 then
IF Z=1 THEN CIK
has=has+1: PAUSE 1
IF has=5 THEN has=0
Z=1
RETURN
ENDIF
Z=0
CIK:      RETURN
‘———————MODSEC——————————–
MODSEC:  ‘pause 5:gosub  olc’:return
pause 100
‘         if frekans>340 then
‘           has=4:RETURN
‘         endif
‘         if (frekans>43) and(frekans<217 birms="" endif="" frekans="" gosub="" has="0" if="" then="">65 and frekans<651 frekans="" has="1" if="" then="">650 and frekans<6501 frekans="" has="2" if="" then="">6500 and Frekans<32001 frekans="" has="3" if="" then="">50000 THEN HAS=4
return

OLC:
asm
movlw	0×01
movwf	_SureL
movlw	0×03
movwf	_SureH
delay_0
btfss  portb,6
goto   tamamolc
decfsz	_SureL, f
goto	$+3
decfsz	_SureH, f
goto	Delay_0
Goto    son
tamamolc
call   zaman
movlw	0×01
movwf	_SureL
movlw	0×01
movwf	_SureH
Delay_1
decfsz	_SureL, f
goto	$+2
decfsz	_SureH, f
goto	Delay_1
goto	$+1
Goto    son
zaman
bcf  STATUS,RP0
bcf  STATUS,RP1
clrf TMR1L
clrf TMR1H
movlw  7
movwf  T1CON
return
endasm
Binms:
ASM
movlw	0×20    ;19 idi
movwf	_SureL
movlw	0×80    ;74 idi
movwf	_SureH
movlw	0×06
movwf	_Counter
delay_2
btfsc   portb,6
goto tamambin
decfsz	_SureL, f
goto	delay_2
decfsz	_SureH, f
goto	$+2
decfsz	_Counter, f
goto	Delay_2
goto son
tamambin
call    zaman
movlw	0×19    ;19 idi
movwf	_SureL
movlw	0×74    ;74 idi
movwf	_SureH
movlw	0×06
movwf	_Counter
Delay_3
decfsz	_SureL, f
goto	$+2
decfsz	_SureH, f
goto	$+2
decfsz	_Counter, f
goto	Delay_3
Goto son
endasm

Yuzms:
ASM
movlw	0×4e       ;4e idi
movwf	_SureL
movlw	0xCa       ;c4 idi
movwf	_SureH
Delay_4
btfsc   portb,6
goto tamamyuz
decfsz	_SureL, f
goto	delay_4
decfsz	_SureH, f
goto	$+2
goto son
tamamyuz
movlw	0×4f       ;4e idi
movwf	_SureL
movlw	0xC4       ;c4 idi
movwf	_SureH
call   zaman

Delay_5
decfsz	_SureL, f
goto	$+2
decfsz	_SureH, f
goto	Delay_5
goto	$+1
Goto    Son
endasm

Onms:
asm
movlw	0×86
movwf	_SureL
movlw	0×20
movwf	_SureH
Delay_6
btfsc   portb,6
goto   tamamon
decfsz	_SureL, f
goto	delay_6
decfsz	_SureH, f
goto	$+2
goto   son
Tamamon
movlw	0×87
movwf	_SureL
movlw	0×14
movwf	_SureH
call    zaman
Delay_7
decfsz	_SureL, f
goto	$+2
decfsz	_SureH, f
goto	Delay_7
goto	$+1
goto   son
endasm
Birms:
ASM
movlw	0xf2
movwf	_SureL
movlw	0×04
movwf	_SureH
Delay_8
btfsc   portb,6
goto    tamambir
decfsz	_SureL, f
goto	delay_8
decfsz	_SureH, f
goto	$+2
goto	son
tamambir
call     zaman
movlw	0xf2
movwf	_SureL
movlw	0×02
movwf	_SureH

Delay_9
decfsz	_SureL, f
goto	$+2
decfsz	_SureH, f
goto	Delay_9
goto	$+1
son
nop
movlw  6
movwf  T1CON
movf TMR1L,0
movwf _FrekansL
movf TMR1H,0
movwf _FrekansH
endasm
RETURN

 END
Program içinde bazı kapatılmış bölümler vardır. Bunlar test amaçlı koyulmuştur. Gerekirse tamamını kaldırabilirsiniz.






10.ders  Proteus ve hex dosyaları   Download

0 yorum: