9.ders:
10.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.
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.
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 13>100>
Ö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 return32001>6501>651>217> 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 1000>1000>
Program içinde bazı kapatılmış bölümler vardır. Bunlar test amaçlı koyulmuştur. Gerekirse tamamını kaldırabilirsiniz.
0 yorum:
Yorum Gönder