Hazır Devreler
Her Türden Devreler indirebileceğiniz bölümler
Hazır Proteus Devreleri
İsis proteusta yapılmış hazır devre ve dosyaları
Kontrol Yazılımları
Çeşitli Cihazları Bilgisayar veya cepten kontrol edebileceğiniz yazılımlar
Araştırma Geliştirme Bölümü
Bu bölümde Çeşitli Cihazların Performansını Üst Düzeye Çıkarma Denemelerine Yer vereceğiz
This is default featured slide 5 title
Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.
26 Mart 2013 Salı
23 Mart 2013 Cumartesi
19 Mart 2013 Salı
Açıklamalı .asm örnekleri
15:25
1 comment
PICTEST1.ASM: Program ilk olarak PIC16F628A’ya B port’unun 8 ucunu da çıkış olarak tanıtacak. Daha sonra bu port’un ilk dört bit’ini lojik 1, sonraki dört bit’ini de lojik 0 yapacak. Son olarak program sonsuz bir döngüye girecektir.
PROG1.ASM : MOVLW ve MOVWF komutlarının çalışmasını gösteren örnek program. PIC’e enerji verildiğinde PORTB’ye bağlı 8 adet LED’i birer aralıklı olarak yakan program.
PROG2.ASM : MOVF komutunun çalışmasını gösteren örnek program. PortA’nın RA0, RA1, RA2 ve RA4 uçlarından girilen veriyi okuyup, PortB’de aynı numaralı bit’lere karşılık gelen LED’lerde gösteren program.
PROG3.ASM : PIC16F628A’nın 16 ucunu I/O ucu olarak kullanmaya örnek program. A port’unun tüm uçlarından (RA3 hariç) girilen gerilim “0” olduğu (butonlar basılı tutulduğunda) sürece, B port’unda o butona karşılık gelen LED’i söndüren program. B port’unun RB3 ucuna bağlı buton basılı tutulduğu sürece de RA3’e bağlı LED’i yakar. PROG2.ASM’de A port’unu devamlı olarak okumak için programı yeniden başlatmak amacıyla RESET butonuna basmak gerekiyordu. Programın bu eksikliğini gidermek için programın akışını “BASLA” etiketine gönderip, sonsuz döngüyü buraya kurmak gerekiyor.
PROG4.ASM : BTFSC ve BTFSS komutlarının çalışmasını gösteren program. PortA’nın 0. bitine bağlı butona basınca PortB’nin 0. bit’indeki LED’i söndürür, PortA’nın 4. bit’indeki butona basınca da aynı LED’i yakar.
PROG5.ASM : DECFSZ kullanılarak döngü düzenlemeye örnek program. A port’unun 0. bit’ine bağlı butona 10 defa bastıktan sonra B port’unun 0. bit’ine bağlı olan LED’i yakan program. NOT: PIC’e uygulanan saat frekansı çok yüksek olursa bu program istenilen biçimde çalışmayacaktır. Bunun nedeni işlem basamaklarında açıklanmıştır.
PROG6.ASM : DECFSZ komutu kullanarak zaman gecikme döngüsü düzenlemeye örnek program. A port’unun 0. bit’indeki butona bastıkça B port’undaki LED’leri binary 9?dan 0?a kadar azaltarak yakar. Butonda meydana gelebilecek arktan ve butona basış süresinin uzunluğundan oluşacak “0” seviyesine düşmeler DECFSZ komutu ile yapılan basit bir zaman gecikme döngüsü ile elenmiştir.
PROG7.ASM : SUBLW komutunun çalışmasını gösteren örnek program. Program h’05’ sayısından h’04’ sayısı çıkardıktan sonra STATUS saklayıcıda meydana gelen bit değişikliklerini portB’deki 8 LED’de gösterir.
PROG8.ASM : SUBWF komutu kullanılarak oluşturulan döngüye örnek program. Bu programda SAYAC adlı bir saklayıcının içerisine döngünün tekrar sayısı konulmuştur. Döngünün her tekrarında INCF komutuyla SAYAC içerisindeki değer bir arttırılır. SUBWF komutuyla W saklayıcı içerisindeki sabit sayı karşılaştırılır. Karşılaştırma sonunda etkilenen sıfır (Zero) bayrağı kontrol edilerek döngü sona erdirilir.
PROG9.ASM : Çift döngülü zaman geciktirme alt programına örnek program. PortB’ye bağlı olan tüm LED’leri belirli zaman aralıklarıyla yakıp-söndürür.
PROG10.ASM : RA0 ucuna bağlı butona basınca PORTB saklayıcısındaki sayıyı “1” arttıran, RA7 ucundaki butona basınca da “1” azaltan program. Program ilk çalışmaya başladığında PORTB’deki hiçbir LED yanmayacaktır. Butonlara bastıkça değişen sayılar PORTB’ye bağlı olan LED’lerde binary sayısal düzeninde yanacaktır. Bu programda gecikme alt programı buton arkını elemek ve butona basılma süresini kontrol etmek amacıyla kullanılmıştır.
PROG11.ASM : RLF komutunun çalışmasını gösteren program. PortB’ye bağlı 8 LED üzerindeki bir LED’in yanışını belirli aralıklarla kaydırır (D0?dan D7?ye doğru). Yanarak kayan LED en sona geldiğinde tüm LED’ler sönük kalır.
PROG12.ASM : RLF ve RRF komutlarını kullanılmasına örnek program. PortB’ye bağlı olan 8 LED üzerinde bir LED’in yanışını sürekli olarak sağa-sola kaydırır.
PROG13.ASM : COMF komutunun çalışmasına örnek program. PortB’deki LED’leri dönüşümlü olarak ilk önce ilk dört bit’indeki, sonra da son dört bit’indeki LED’leri yakar.
PROG14.ASM : ANDLW ve XORWF komutlarının kullanılmasına örnek program. PortA’nın 0. ve 4. bit’lerine bağlı olan RA0 ve RA4 butonlarının her ikisi birden basılı olduğunda PortB’nin 0. bit’ine bağlı LED’i yakar.
PROG15.ASM : ADDLW komutunun çalışmasını gösteren örnek program. W saklayıcı içerisindeki h’5A” sayısıyla, h’53? sayısını toplayıp, sunucu B port’undaki LED’lerde gösteren program. STATUS saklayıcının 0. bit’i (carry bit’i) “1” olduğunda RA3 ucuna bağlı LED yanar.
PROG16.ASM : 16 bit’lik iki sayının toplanmasına örnek program. h’61A3? ve h’2EE0? sayılarını toplar. Program çalıştığında toplamın alt bayt’ı PortB’deki LED’lerde görülür. Üst bayt’ın toplamını görmek için RA0 butonuna basılır.2 bayt’lık h’61A3? sayısına A, h’2EE0? sayısına da B dersek, bu sayıları 1 bayt’lık veri depolayabilen 2 tane saklayıcı kullanmamız gerekir.
PROG17.ASM : 8-bit’lik sayıların çıkarılmasına örnek program (büyük sayıdan küçük sayıyı çıkarma). PORTB saklayıcısı içerisindeki h’5A’ sayısından W saklayıcı içerisindeki h’53’ sayısını çıkarır, sonucu PORTB’ye bağlı LED’lerde gösteriri. Çıkarma sonucunun negatif veya pozitif olduğunu RA3’e bağlı LED’de gösterir.
PROG18.ASM : 8-bit’lik sayıların çıkarılmasına örnek program (küçük sayıdan büyük sayıyı çıkarma). PORTB saklayıcısı içerisindeki h’52’ sayısından W saklayıcısı içerisindeki h’53’ sayısını çıkaran, sonucu PORTB’ye bağlı LED’lerde gösteren program.
PROG19.ASM : 16-bit’lik sayıların çıkarılmasına örnek program (büyük sayıdan küçük sayıyı çıkarma). h’0004? sayısından h’0001? sayısını çıkaran program. Program çalıştığında çıkarma sonucunun alt bayt’ı PortB’deki LED’lerde görülür. Üst bayt’ı görmek için RA0 butonuna basılır.
PROG20.ASM : Çevrim tablosu kullanmaya örnek program. 7 segment display üzerinde “5? sayısını gösterir. NOT: Program 5 sayısına karşılık gelen h’6D’ sayısını seçmek için kullanılan PC ve çevrim tablolarının kullanılmasını açıklaması bakımından önemlidir.
PROG21.ASM : PORTB’nin uçlarına bağlı 7 segment display’de 0~F arasında saydıran program. Sayılar arasındaki duruş GECIKME alt programı tarafından sağlanmıştır.
PROG22.ASM : Bipolar (4 uçlu) bir step motoru bir yöne doğru RA0 butonuna bastıkça adım adım döndüren program. Step motor uçlarına gönderilecek gerilimler PORTB’deki RB0~RB3 uçlarına bağlanan LED’lerde görülür.
PROG23.ASM : Çevrim tablosunun kullanılmasına örnek program. Bir step motoru PORTA’nın 0. bit’ine bağlı RA0 butonuna basınca sağa doğru döndüren, RA7 butonu basılı tutularak RA0 butonuna basıldığında da sola döndürür. Step motor uçlarına gönderilecek olan gerilimler PORTB’deki LED’lerde görülür.
PROG24.ASM : RB0/INT ucundan girilen bir sinyal ile kesme oluşturulmasına örnek program. Akış diyagramında da görüldüğü gibi RB1 ucuna bağlı olan bir LED ana program içerisinde belirli aralıklarla yanıp söndürülmektedir. RB0/INT ucuna bağlı bir butona basınca kesme oluşturulur. Kesme alt programı çalışarak RB2 LED’inin yanma durumunu değiştirir (yanıksa söndürür, sönükse yakar.) Bu da ana program normal olarak çalışırken harici bir kesme meydana geldiğinde programın buna tepki verdiğini ve RB2 LED’nin durumunu değiştirdiğini gösterir.
PROG25.ASM : RB<4:7> lojik seviye değişiklik kesmesine örnek program. Ana program içerisinde RA3 ucuna bağlı bir LED belirli aralıklarla yakıp söndürülmektedir. RB4~RB7 uçlarına bağlı butonlardan birisine basınca oluşan kesme alt programıyla PORTB’nin üst 4 bit’i okunmaktadır. Okunan bu dört bit PORTB’nin alt dört bit’ine bağlı LED’lerde gösterilmektedir. Böylece RA3’teki LED’in yanıp sönmesi devam ederken, PORTB’nin üst 4 bit’i (RB<4:7>) okuyup, PORTB’nin alt 4 bit’ine gönderilerek kesme oluşturma yoluyla PIC’in işlem yapma kapasitesi arttırılmış olur.4:7>4:7>
PROG26.ASM : TMR0 zamanlayıcısının dahili komut frekansı ile saymasının sağlanmasına örnek program. RB0 ve RB1 uçlarına bağlı LED’leri 1’er sn aralıklarla birini yakıp diğerini söndüren ve bu işlemi her kesme oluştuğunda devamlı olarak tekrar eden program.
PROG27.ASM : TMR0 sayıcısının sinyal kaynağı olarak harici dijital sinyal (RA4/T0CKI ucu) kullanılmasına örnek program. Ayrıca TMR0?ın okunabilme ve sinyal sayıcı olarak kullanılabilme özelliğini de gösterir. Program, PORTA’nın 4. bit’ine bağlı olan butona (RA4) basıldığında PORTB’deki LED’lerde binary olarak artan sayıları gösterir. LED’lerin gösterdiği sayı 31’e ulaştıktan sonra bir daha butona basınca TMR0 saklayıcısını sıfırlar ve saymaya 0?dan itibaren tekrar başlatır.
PROG28.ASM : TMR1 sayıcısının kullanılmasına örnek program. Prog26.asm’de TMR0 ile yaptığımız programı bu defa TMR1 zamanlayıcısıyla yapılması. Timer-1 16 bit’lik bir sayıcı olduğundan önceki programda yaptığımız sapma hatasını bu programda sıfıra indirebileceğimizi göreceksiniz. Şimdi 10 mS’de bir kesme oluşması için TMR1’in hangi sayıdan başlatılacağını bulduktan sonra 8 bit’lik TMRH ve TMRL saklayıcılarına bu sayının program içerisinde nasıl yükleneceğini görelim. Programın akış diyagramı prog26.asm ile aynıdır.
PROG29.ASM : TMR2 zamanlayıcısının kullanılmasına örnek program. Prog26.asm ve prog28.asm’de yapılan programın aynısının TMR2 nasıl yapılacağını ve bu zamanlayıcının temel kullanım özelliklerini gösterir. Programda RB0 ve RB1 uçlarına bağlı LED’ler 1 sn aralıklarla yanarlar.
PROG30.ASM : WDT zamanlayıcısının kullanılmasına örnek program. RA0 butonuna 2.3 sn’yi geçmeyen aralıklarla basıldığında RB0’daki bir LED’in devamlı yanmasını sağlar, bu süreden daha uzun aralıklarla basıldığında WDT devreye girerek sistemi reset eder. Sistem reset olduğunda RB3’e bağlı bir buzzer’den uyarı sesi verilir ve program bu noktada sonsuz döngüye girer. Programı tekrar çalıştırmak için MCLR ucundaki butona basmak gerekir.
PROG31.ASM : Uyku (sleep) modununun kullanılmasına örnek program. PIC’e enerji verince PORTB’nin alt 4 bit’ine (RB0, RB1, RB2, RB3) bağlı LED’lerde H’00’dan h’FF’e kadar artan binary sayıları gösteren LED’lerin yanışı görülür. Sayı h’FF’e geldiğinde tekrar H’00’dan saymaya başlar. RA0’a bağlı bir butona basınca tüm LED’ler söner ve PIC uyku moduna girer. PIC’i uyku modundan çıkarmak için RB<4:7> değişiklik kesmesi kullanılır. RB4~RB7 butonlarından birisine basınca LED’ler uyku moduna girdiği anda kaldığı sayıdan itibaren saymaya devam eder.4:7>
PROG32.ASM : “Ortak referanslı iki karşılaştırıcı” moduna örnek program. Bu uygulamada ışığa duyarlı bir çeşit direnç olan LDR kullanılacaktır. Böylece sokak aydınlatmalarının otomatik olarak yapılmasına benzer işlem yaptırılacaktır. RA2 ucuna bağlı bir potansiyometre ile referans gerilimi sağlanmaktadır. RA0 ucuna bağlı bir LDR, RA1 ucuna da bir potansiyometre bağlanmıştır. Karşılaştırma iki ayrı karşılaştırıcıda (C1 ve C2) yapılmaktadır. LDR uçlarındaki ve RA1 potansiyometresindeki gerilim RA2 ucundaki referans gerilimiyle karşılaştırılmaktadır. Karşılaştırma sonucu RB6 ve RB7’deki LED’lerde gösterilmektedir.
PROG33.ASM : “Dahili ortak referanslı dört girişten seçimli iki karşılaştırıcı” moduna örnek program. Programın yaptığı işlem prog32.asm ile aynı olacaktır. Tek farkı, referans geriliminin RA2 potansiyometresinden değil de VREF biriminden alınacak olmasıdır. Bu uygulamada da karşılaştırıcılardan bir tanesine otomatik sokak aydınlatması yaptırılacaktır. LDR uçlarında düşen gerilim ile VREF gerilim karşılaştırılacaktır. Diğer karşılaştırıcıda da VREF gerilimi ile potansiyometre uçlarındaki gerilim karşılaştırılacaktır.
PROG34.ASM : Bar LED frekans sayıcı uygulaması. Bu program CCP1 biriminin yakalama moduna örnektir. RB3 ucuna bağlı bir osilatörün ürettiği kare dalga sinyalinin belirli aralıklardaki frekansını PORTB’deki LED’lerde gösterir.
PROG35.ASM : CCP biriminin karşılaştırma modunda çalıştırılmasına örnek program. CCPR1H:CCPR1L saklayıcılarına h’F0F0’=d’61680’ sayısı yüklendikten sonra TMR1 sayıcısı çalıştırılır. TMR1 sayıcısı bu sayıya her ulaştığında oluşan kesme ile PORTB’deki 8 LED belirli aralıklarla yakıp söndürülür.
PROG36.ASM : CCP biriminin PWM modunda çalıştırılmasına örnek program. Program çalıştırılınca RB3 ucuna bağlı bir LED’in parlaklığı çok küçük kademeli artışlarla artar, daha sonra azalır. Bu durum enerji kesilinceye kadar devam eder. Programı denemek için gerekli devrede sadece RB3 ucuna bağlı bir LED yeterli olmaktadır.
PROG37.ASM : USART arabirimi ile PIC16F628A’dan bilgisayara veri gönderme işlemine örnek program. Şekil 16-15’deki görülen devreye göre RA0 butonuna her basıldığında önceden tanımlanan 8 bit’lik veri paketleri ardı ardına gönderilerek bilgisayar ekranında “ALTAS” yazdırır.
PROG38.ASM : USART arabirimi ile bilgisayardan gönderilen verinin PIC16F628A’dan alınması işlemine örnek program. Şekil 16-19’da görülen devreye göre bilgisayar klavyesinden gönderilen karakterlerin ASCII kodu karşılığı olan sayı Hyper terminal programı ile gönderilir. Gönderilen bu sayı PIC16F628A’nın RX ucundan alınarak A port’unun alt dört bit’ine ve B port’unun üst dört bit’ine bağlı olan LED’lerde binary olarak gösterilir.
PROG39.ASM : PIC16F628A’nın dahili EEPROM veri belleğine veri yazdırma ve okuma işlemine örnek program. RA0 pin’ine bağlı butona basınca EEPROM’un h’05’ adresine h’8F’ verisini, RA4 pin’indeki butona basınca da EEPROM’un h’05’ adresine h’3D’ verisini yazan, RA7 pin’indeki butona basınca yine h’05’ adresindeki veriyi PortB’deki LED’lerde gösteren program.
.Asm Download
Pic Basic Öğreniyorum 3
11:37
No comments
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.
Pic Basic Öğreniyorum 2
11:22
No comments
5.ders:
Pic ile Analog – Digital Çevirici Kullanımı: Günlük hayatta kullandığımız cihazlar genelde Analog ve Dijital olarak ikiye ayrılmaktadırlar. Sayısal sistemle çalışan tüm cihazlar Dijital olarak nitelendirilmekte bunun dışındakiler ise Analog cihazlar olarak nitelendirilmektedirler. Mikroişlemcilerin tamamı dijital cihazlardır.
Zaman zaman mikroişlemci bazlı bazı cihazların Analog cihazları kontrol etmesi istenir. Zaman zamanda Analog sinyallerin işlenip değerlendirilmesi için bu sinyallerin dijital sinyaller haline getirilmesi gerekir.
İşte bu gibi durumlarda Analog – Digital çeviriciler kullanılır. Yalnızca A/D çevirici olarak üretilmiş entegreler olduğu gibi bazı Pic’ler de bu çeviriciler seçimli olarak hazır bulunurlar. Burada A/D çeviricisi bulunan Pic’ler incelenecek ve kullanımları konusunda örnekler verilecektir.
Bu konuda en çok kullanılan Pic’lerden birisi PIC16F877 entegresidir. 40 bacaklı olan bu entegrede 8 kanal ve 10 bit hassasiyette A/D çeviricisi bulunmaktadır.
A/D çevirim prensibi genelde bir kondansatörün belirli bir referans voltajı ile şarj edilip deşarj için geçen sürenin sayılması esasına dayanır. Elde edilen süre bilgisi ise Analog değere karşılık elde edilmiş olan dijital değer olarak verilir.
Üzerinde A/D çevirici bulunan bir Pic kullanılırken yapılacak işlerin başında hangi bacakların ANALOG hangilerinin DIGITAL olarak kullanılacağına karar vermektir. Sonra A/D çevirici için referans voltajı kaynağının seçimi yapılmalıdır. İki türlü referans voltajı vardır. Birincisi Pic’in kendi VDD beslemesi (+5V) diğeri ise harici bir voltaj kaynağıdır. Tabiiki harici kaynaklar referans voltajının 5 Volt’tan farklı olması durumunda seçilmelidir.
Şimdi gelelim bu seçimleri yaptıktan sonra bunları Pic’e nasıl vereceğimize. A/D çeviricisi olan Pic’lerdeADCON register’i denilen 8 bitlik bir yazmaç bulunmaktadır. Genellikle bu yazmaç ADCON1 adı ile isimlendirilir.
Şimdi PIC16F877 nin ADCON1 yazmaç’ını inceleyelim.
2: ADCON1 REGISTER (ADDRESS 9Fh)
Bit-7: A/D Sonuç Format Seçme biti dir.
1 olur ise sonuç sağa hizalanmış , ADRESH nin 6. uç bitleri 0 olarak okunur.
0 olur ise sonuç sola hizalanmış, ADRESL nin alt bitleri 0 olarak okunur.
1 olur ise sonuç sağa hizalanmış , ADRESH nin 6. uç bitleri 0 olarak okunur.
0 olur ise sonuç sola hizalanmış, ADRESL nin alt bitleri 0 olarak okunur.
Bit 6-4 arası kullanılmaz ve 0 olarak okunur.
Bit -3-0 arası PCFG3 – PCFG0 A/D portu ayarlama kontrol bitleridir. İşte bu bitleri ayarlayarak portların seçimleri yapılır. Aşağıdaki tabloya bakınız.
Şimdi tablo üzerinde biraz kafa yoralım.
Şayet PCFG3:PCFG0 bitlerini 0000 olarak verir isek bu durumda RA0-RA3 , RA5, RE0-RE2 bacaklarının tamamı ANALOG olarak ayarlanmış olacak ve artı referans Voltajı VDD den eksi referans voltajı ise VSS yani GND den alınacaktır.
Şimdi diyelim ki bize 3 adet Analog giriş lazım diğerleri Digital olabilir. +5V ve GND de referans voltajları olarak kullanılacak. Bu durumda tabloya bakar isek 0100 değeri tam istediğimiz ayarlamayı yapabiliyor. Tablonun en son hanesinde ilk değer kaç Analog giriş olduğunu / işaretinden sonraki değer ise harici referans voltaj girişi adedini gösteriyor. Seçtiğimiz değerde burası 3/0 olarak görülmektedir. Anlamı 3 adet Analog giriş ve sıfır referans voltajı var demek. Zaten biz Pic’in kendi voltaj girişlerini kullanmak istediğimizden gerçektende bize sıfır referans girişi lazımdır.
Pic’in voltaj girişleri referans voltajı olarak seçildiğinde Pic’e giren Analog voltaj değerinin 5 Volt’u aşmamasına dikkat edilmelidir.
Bu şekilde tablonun kullanılmasını anlattıktan sonra bu aşamada tüm girişlerin Digital seçilmesi konusunda değinmek isterim. Analog girişlerin Digital olarak kullanılması istenir ise tablodan sağ tarafta 0/0 değerinin bulunduğu satırda PCFG3:PCFG0 değeri 0111 (Desimal 7) olarak görülür. Demek ki ADCON1=7 veyaADCON1=%0111 dediğimiz zaman Pic 17F877 nin Analog girişleri iptal edilerek normal Digital giriş çıkışa dönüştürülmektedir. A/D çeviricisi bulunan Piclerde aksine bir komut bulunmaz ise ilk açılışta A/D pin’ler Analog olarak açılırlar. Dolayısıyla bu pinleri Digital kullanmak isterseniz mutlaka Adcon1=7 komutunu vermeniz gerekir.
Bu kadar bilgi bir örnek üzerinde çalışmamız için yeterlidir. Şimdi bir örnek program yapalım.
Örnek Program:
Bu programımız AN0 yani PORTA.0 bacağına bağlayacağımız bir potansiyometre üzerinden voltaj okuması yapılmasını sağlayacaktır.
Bu durumda 1 adet Analog giriş gerekiyor. PCFG3:PCFG0 değeri olarak tablodan 1110 değerini seçiyoruz. Bu seçenek tek Analog giriş (AN0-RA0) verdiği gibi Pic in voltaj girişlerini de referans voltajı olarak kullanmamızı sağlamaktadır. Devremiz aşağıdaki gibi olacaktır.
Bu durumda 1 adet Analog giriş gerekiyor. PCFG3:PCFG0 değeri olarak tablodan 1110 değerini seçiyoruz. Bu seçenek tek Analog giriş (AN0-RA0) verdiği gibi Pic in voltaj girişlerini de referans voltajı olarak kullanmamızı sağlamaktadır. Devremiz aşağıdaki gibi olacaktır.
Şimdi Programımızı yazalım
‘**************************************************************** ‘* Name : ADC.BAS * ‘* Author : [ETE] * ‘* Notice : Copyright (c) 2005 [ETE] * ‘* : All Rights Reserved * ‘* Date : 20.04.2005 * ‘* Version : 1.0 * ‘* Notes : * ‘* : * ‘**************************************************************** TRISA=%00000001 TRISB=0 TRISC=0 TRISD=0 ‘——————————————————————————- @ DEVICE pic16F877 @ DEVICE pic16F877, WDT_on @ DEVICE pic16F877, PWRT_ON @ DEVICE pic16F877, PROTECT_OFF @ DEVICE pic16F877, XT_OSC ‘——————————————————————————- DEFINE LCD_DREG PORTB ‘LCD data bacakları hangi Porta bağlı? DEFINE LCD_DBIT 4 ‘LCD data bacakları hangi bitten başlıyor? DEFINE LCD_EREG PORTB ‘LCD Enable Bacağı Hangi Porta bağlı? DEFINE LCD_EBIT 3 ‘LCD Enable Bacağı Hangi bite bağlı ? define LCD RWREG PORTB ‘LCD R/W Bacağı Hangi Porta bağlı? define LCD_RWBIT 2 ‘LCD R/W Bacağı Hangi bite bağlı ? DEFINE LCD_RSREG PORTB ‘LCD RS Bacağı Hangi Porta bağlı ? DEFINE LCD_RSBIT 1 ‘LCD RS bacağı Hangi Bite bağlı ? DEFINE LCD_BITS 4 ‘LCD 4 bit mi yoksa 8 bit olarak bağlı? DEFINE LCD_LINES 2 ‘LCD Kaç sıra yazabiliyor ‘——————————————————————————- DEFINE ADC_BITS 10 ‘A/D çevirim sonucu kaç bit olacak DEFINE ADC_CLOCK 3 ‘Clock kaynağı (3=rc) DEFINE ADC_SAMPLEUS 100 ‘Örnekleme zamanı mikro saniye cinsinden. ‘——————————————————————————- ADCON1=%10001110 ‘7. bit 1 yapıldı 10 bit sonuç almak için. ‘——————————————————————————- HAM var word ‘ADC den okunan ham Digital değer. VOLT var word ‘16 bit değişken tipi seçtik kullanacağımız değer 10 bit olacak. Mvolt var byte ‘——————————————————————————- Low PORTB.2 ‘ LCD R/W line Low (W), şemada direkt GND ye bağlanabilir. LCDOut $FE,1 ‘ LCD de CLS yapar pause 200 ‘ LCD nin açılması için gerekli süredir. ‘——————————————————————————- BASLA: ADCIN 0,HAM ‘0 nolu kanaldan Analog değeri oku ve RAW değişkenine aktar. BAK: IF ADCON0.2=1 THEN BAK ‘Çevirme işlemi tamamlanınca Adcon0.2=0 olacak. lcdout $FE,1,” HAM =”,# HAM Ham=ham+1 ‘Hesap kolaylığı açısından Ham değerini bir artırdık ‘Okunan değer 0-5 volt için 0-1024 olacağından okunacak değer başına volt değeri ‘ 5/1024 =0,0048828 olacaktır. Sayı çok küçük olduğundan bu değeri 1000 ile ‘çarpmalıyız. O halde (Okuma/V)= 4,8828 bu değeri 256 ile çarpar isek ‘4,8875 x 256 = 1250 değerini buluruz. Bu değeri kullanarak 32 bit işlem yapabiliriz. ‘1250 değeri (5/1024)*256 değerine karşılık gelmektedir. ’sonuçta ADC HAM değerini bu sayı ile çarpıp 256′ya bölersek sonucu elde etmiş oluruz. ‘ancak sonuç 32 bitlik sınırda olduğundan bu işi 32 bit çarpma ile yapıyoruz ve orta ‘baytı aldığımızda ise zaten sayının 256′ya bölünmüş halini aldığımızdan başka bir ‘işlem yapmadan sonucu elde etmiş oluruz. Volt=(ham */ 1250)/100 ‘Ham ile 1250 yi 32 bit olarak çarp ve 100′böl Mvolt=Volt // 10 ‘Mvolt= Volt MOD 10 ‘Burada yeni bir komut veya işlem şekli görüyorsunuz. MOD alma yani (//) kalan bulma ‘Bir sayını başka bir sayıya bölünmesinden sonra kalan miktarı bulma işlemine MOD ‘alma denir. Örnek W=A//1000 , A’yı 1000′e böl kalanı W değişkenine koy anlamındadır. ‘bizde yukarıda Mili volt değerini bulmak için volt (10 ile çarpılmış halini) 10′a ‘bölüp kalanı Mvolt değişkenine yerleştiriyoruz. Volt=Volt/10 LCDOUT $FE,$C0,” VOLT=”,#VOLT,”,”,# Mvolt PAUSE 500 GOTO BASLA
ADC işlemlerinde ölçümler genelde çok kararlı olmaz. Bir biri arkasına yapılan ölçümlerde ufak tefek farklılıklar görülebilir. Bu nedenle çoğunlukla ortalama alma metodu kullanılır. Aynı yerde birden fazla ölçüm alınır ve sonuçlar toplanır. Sonuçta kaç adet ölçüm yapılmış ise toplam, o sayıya bölünür. Örnek vermek gerekir ise;
For I=1 To 10
ADCIN 0,HAM
TOPLAM=TOPLAM+HAM
NEXT I
HAM=TOPLAM/10
ADCIN 0,HAM
TOPLAM=TOPLAM+HAM
NEXT I
HAM=TOPLAM/10
Sonuçta Ham değeri 10 adet ölçümün ortalamasını gösterecektir ve oldukça kararlı bir değer olacaktır.
ADC çevirme işlemlerinde en önemli husus elde edilen Ham değerin istenen değere çevrilmesi için oluşturulacak formülün bulunmasıdır. Örneğin bir sıcaklık ölçümü yapıyorsunuz ve bir ısı sensörü değerini ölçüyorsunuz. 8 bitlik bir işlemde 0-255 arası değerler , 10 bitlik bir işlemde 0-1023 arası değerler bulacaksınız. Peki bu değerleri nasıl sıcaklık değeri olarak göstereceksiniz. İşin önemli noktası burası.
Hemen şu hesaplamayı yapmalısınız. 8 bit hesaplama için , Sensör den okunabilecek en yüksek değer 255 olacaktır. Peki bu değer kaç derece sıcaklığa eşdeğerdir?. Yani Sensör ün gösterebileceği maksimum sıcaklık ne olacaktır. Bunu sensör bilgilerinden (bilgi formu veya üretici bilgilerinden) alacaksınız. Diyelim ki 120 dereceye eş değerdir. O halde birim okuma başına düşen sıcaklık değeri 120/255 =0,470 derece olacaktır.
Bunu Pic de kullanabilmek için 0,470 x100 = 47 olarak bir değer elde edilecektir. Demek ki ben okuduğum değeri 47 ile çarpıp sonucu 100 e bölersem sıcaklığı bulabilirim.
Bunu Pic de kullanabilmek için 0,470 x100 = 47 olarak bir değer elde edilecektir. Demek ki ben okuduğum değeri 47 ile çarpıp sonucu 100 e bölersem sıcaklığı bulabilirim.
O halde sensör den okunan 134 dijital değerinin sıcaklık karşılığı ne olacaktır diye sorduğumuzda formülümüz bize;
Sıcaklık =(134 x 47)/100=62,98 derece olarak bulunacaktır.
Sıcaklık =(134 x 47)/100=62,98 derece olarak bulunacaktır.
ADC konusunda söylenecek son söz olarak üzerinde ADC çevirici bulunan her Pic farklı özellikler taşıyabilir. En azından Analog pinlerinin ayarlanması işlemi farklı olabilir. Bu nedenle farklı Pic ler ile çalışırken mutlaka bilgi formlarında belirtilen ADC özelliklerine göz atmanızı tavsiye ediyorum.
Diğer bir husus da program başında verilen ADC DEFINE parametrelerinin ayarlanmasıdır.
Bunlar;
Bunlar;
DEFINE ADC_BITS 10 ‘A/D çevirim sonucu kaç bit olacak
DEFINE ADC_CLOCK 3 ‘Clock kaynağı (3=rc)
DEFINE ADC_SAMPLEUS 100 ‘Örnekleme zamanı mikro saniye cinsinden.
DEFINE ADC_CLOCK 3 ‘Clock kaynağı (3=rc)
DEFINE ADC_SAMPLEUS 100 ‘Örnekleme zamanı mikro saniye cinsinden.
Sırası ile tekrar gözden geçirirsek;
DEFINE ADC_BITS 10 ADC çevirim sonucunun kaç bitlik olacağını ayarlamaktadır. Sonuç 8 bit ise buraya 8 , 10 bit ise buraya 10 yazılmalıdır. Tabiiki kullanılacak değişken tespit edilen Bit değerine uygun olmalıdır.
DEFINE ADC_CLOCK 3 ‘Clock kaynağı (3=rc) Adc çevrim işlemlerinde her bit karşılığı bir Clock palsı ile belirlenir. Clock kaynağı olarak Pic in osilatörü veya dahili RC osilatör kullanılır. ADC işlemlerinde Bit başına çevirim süresi yaklaşık 1,6 mikro saniye olmalıdır. Pic in kendi osilatörü kullanılacak ise bu süreyi tutturmak için sistemi çalıştıran kristal frekansına göre bir hesap yapılıp gerekli parametre bulunmalı ve buraya yazılmalıdır. Şimdi örnek bir hesap yapalım.
Bu hesapta kullanabileceğimiz formül şöyledir;
Tçevirim= X/Fosc. Burada X değeri 2 veya 8 veya 32 olabilmektedir. Fosc ise kristal frekansı olup MHZ cinsindendir. Tçevirim=1,6 us. Olduğuna göre şimdi diyelim ki kristal frekansımız 4 Mhz ve Pic’in osilatörü nü kullanacağız. Hesaba göre ;
(00) Tcevirim=2/4 = 0,5 us çıkar 1,6 dan çok küçük olduğu için uygun değildir.
(01) Tcevirim=8/4 = 2 us çıkar 1,6 dan büyük ve yakın olduğu için kullanılabilir.
(10) Tcevirim=32/4 = 8 us çıkar 1,6 dan çok büyük olduğu için uygun değildir.
(01) Tcevirim=8/4 = 2 us çıkar 1,6 dan büyük ve yakın olduğu için kullanılabilir.
(10) Tcevirim=32/4 = 8 us çıkar 1,6 dan çok büyük olduğu için uygun değildir.
Kullanılabilir olan 8 değerinin Define komutundaki karşılığı (%01=1) 1 dir.O halde komut
DEFINE ADC_CLOCK 1 ‘olacaktır.
Aynı hesabı 20 MHz için yapar isek;
Aynı hesabı 20 MHz için yapar isek;
(00) Tcevirim=2/20 = 0,1 us çıkar 1,6 dan çok küçük olduğu için uygun değildir.
(01) Tcevirim=8/20 = 0,4 us çıkar 1,6 dan çok küçük olduğu için uygun değildir.
(10) Tcevirim=32/20 = 1,6 us çıkar 1,6 ile aynı olduğundan çok uygundur.
(01) Tcevirim=8/20 = 0,4 us çıkar 1,6 dan çok küçük olduğu için uygun değildir.
(10) Tcevirim=32/20 = 1,6 us çıkar 1,6 ile aynı olduğundan çok uygundur.
O halde komut; (%10=2)
DEFINE ADC_CLOCK 2 ‘olacaktır.
Kristal osilatör ün uygun olmadığı durumlarda (%11=3) bu komut 3 olarak verilerek dahili RC osilatör kullanılır. En çok kullanılan seçenek budur.
Son olarak;
DEFINE ADC_SAMPLEUS 100 komutunu inceleyelim.
ADC çevirim işleminin dahili bir kondansatörün önce şarj edilip sonra deşarj olma süresinin ölçüldüğünü söylemiş idik. Belirtilen ADC_SAMPLEUS süresi ADC işleminin başlatılmasını müteakip yani ADON bit inin set edilmesini müteakip uygulanan bir gecikme süresidir ve bir yerde kondansatörün şarj süresi olarak açıklanır. Genelde 50-100 us dolayındaki süreler çevirim için uygun gelmektedir.
Son bir örnek vererek ADC konusunu bitirelim.
Örneğimiz 5K değerinde bir termistör ün ısı sensörü olarak kullanımına ait bir örnek olacaktır. Termistör değerini ölçerek ekranda buna karşılık gelen sıcaklık değerini göstermeye çalışacağız. Kullanacağımız termistör NTC (Negative Temperature Coefficient) tipi bir termistör olacak yani sıcaklık arttıkça direnç değeri azalacak. Birde PTC tipleri mevcut olup bunlarda sıcaklık arttıkça direnç değeri de artmaktadır.
Örneğimiz 5K değerinde bir termistör ün ısı sensörü olarak kullanımına ait bir örnek olacaktır. Termistör değerini ölçerek ekranda buna karşılık gelen sıcaklık değerini göstermeye çalışacağız. Kullanacağımız termistör NTC (Negative Temperature Coefficient) tipi bir termistör olacak yani sıcaklık arttıkça direnç değeri azalacak. Birde PTC tipleri mevcut olup bunlarda sıcaklık arttıkça direnç değeri de artmaktadır.
Programa geçmeden önce bazı varsayımlarımız olacak. 5 K lık termistör ’ün değeri 25 oC de ölçülen değeridir. Varsayalım ki 0 oC de ki değeri 6 K olsun. 50 oC de ise 3 K olsun. Bu kriterleri kullanarak programımızı yazalım. Amacımız bu termistör ü kullanarak bir termometre yapmak olacaktır. Önce devremizi verelim
5 K lık termistör 0 derecede 6 K olacağı ve 50 derecede 3K ya düşeceği için yaklaşık 3K lık bir direnç sabit kalmakta yalnızca 3 K lık bölüm değişmektedir. O nedenle şemada 5 K lık termistör 3K (Pot) + 3K sabit Direnç olarak gösterilmiştir.
ÖRNEK PROGRAM : TERMISTOR.BAS
‘**************************************************************** ‘* Name : TERMISTOR.BAS * ‘* Author : [Erol Tahir Erdal] * ‘* Notice : Copyright (c) 2005 [ETE] * ‘* : All Rights Reserved * ‘* Date : 21.04.2005 * ‘* Version : 1.0 * ‘* Notes : * ‘* : * ‘**************************************************************** TRISA=%00000001 TRISB=0 TRISC=0 TRISD=0 ‘——————————————————————————- @ DEVICE pic16F877 @ DEVICE pic16F877, WDT_on @ DEVICE pic16F877, PWRT_ON @ DEVICE pic16F877, PROTECT_OFF @ DEVICE pic16F877, XT_OSC ‘——————————————————————————- DEFINE LCD_DREG PORTB ‘LCD data bacakları hangi porta bağlı? DEFINE LCD_DBIT 4 ‘LCD data bacakları hangi bitten başlıyor? DEFINE LCD_EREG PORTB ‘LCD Enable Bacağı Hangi Porta bağlı? DEFINE LCD_EBIT 3 ‘LCD Enable Bacağı Hangi bite bağlı ? DEFINE LCD RWREG PORTB ‘LCD R/W Bacağı Hangi Porta bağlı? DEFINE LCD_RWBIT 2 ‘LCD R/W Bacağı Hangi bite bağlı ? DEFINE LCD_RSREG PORTB ‘LCD RS Bacağı Hangi Porta bağlı ? DEFINE LCD_RSBIT 1 ‘LCD RS bacağı Hangi Bite bağlı ? DEFINE LCD_BITS 4 ‘LCD 4 bit mi yoksa 8 bit olarak bağlı? DEFINE LCD_LINES 2 ‘LCD Kaç sıra yazabiliyor DEFINE ADC_BITS 10 ‘A/D çevirim sonucu kaç bit olacak DEFINE ADC_CLOCK 3 ‘Clock kaynağı (3=rc) DEFINE ADC_SAMPLEUS 100 ‘Şarj zamanı mikro saniye cinsinden. ‘——————————————————————————- ADCON1=%10001110 ‘7. bit 1 yapıldı 10 bit sonuç almak için. ‘——————————————————————————- ISI VAR word HAM VAR WORD ONDA VAR BYTE ‘——————————————————————————- Low PORTB.2 ‘ LCD R/W line Low (W), şemada direkt GND ye bağlanabilir. LCDOut $FE,1 ‘ LCD de CLS yapar pause 200 ‘ LCD nin açılması için gerekli süredir. ‘——————————————————————————- BASLA: ADCIN 0,HAM ‘0 nolu kanaldan Analog değeri oku ve RAW değişkenine aktar. BAK: IF ADCON0.2=1 THEN BAK ‘Çevirme işlemi tamamlanınca Adcon0.2=0 olacak. lcdout $FE,1,”HAM =”,# HAM ‘50 derecede okunan ADC değeri 256 ve 0 derecede okunan 146 olduğundan ‘0-50 derece arası okunan değer farkı 110 dur (256-146) . O halde her bir derece ‘için okunması gereken değer 110/50=2,2 olacaktır. Pic e uyarlamak için ‘okunan değeri 10 ile çarpıp 22 ye bölersek direkt sıcaklığı bulmuş olacağız. ‘ondalık değeri de hesaplamak için 10 yerine 100 ile çarpıyoruz. ISI=((HAM-146)*100)/22 onda=ISI//10 ISI=ISI/10 LCDOUT $FE,$C0,” ISI=”,#ISI,”,”,#onda,”`C” pause 500 GOTO BASLA
6.ders:
KESME (INTERRUPT) KULLANIMI: Tüm bilgisayarlar ve mikroislemci sistemlerinde kullanılan bir özelliktir.Basitçe açıklamak gerekirse, bir mikroislemciye kesme anında neler yapması gerektigi bir program bölümü seklinde verilir. Açıkçası mikro islemci kesme oluştugu anda yaptıgı isi tamamen bırakarak kesme bölümüne gider ve orada gösterilen isleri yapar. Kesme bölümünün sonunda tekrar geriye dön komutunu alır ve önceden yaptıgı ise kaldıgı yerden devam etmek üzere döner.
Bu olayı günlük hayatımızda yasadıgımız bir örnekle açıklayalım isterseniz. Diyelim ki bir evde yasıyorsunuz ve bir gün tüm aileyi topladınız. Amacınız aileye bir yangın olması durumunda ne yapılması gerektigini ögreteceksiniz. Burada yangının meydana gelmesi bir kesme olayı olacaktır. Normal yasama düzeninde hiç yangın olmaz ise kesme oluşmayacak demektir. Ama oluşma ihtimali her zaman olacaktır. Simdi bir aksam yemegi esnasında yangın çıktıgını varsayalım. Kesme oluşacak ve herkes önceden ögretildigi gibi görevinin basına kosacak. Yangın söndürülecek ve her kes yemege geri dönecektir. iste tipik bir kesme olayına
örnek. Kesme olayını kısaca açıkladıktan sonra Pic islemcilerinde hangi olayların kesme yaratabilecegine bir göz atalım.
RB0/INT KESMESİ:
En çok kullanılanlardan birisi PortB.0 pininde meydana gelen lojik seviye degisikliginin oluşturacagı kesme dir. Option Yazmaçının 6. biti önceden ayarlanarak kesmenin sıfırdan – bir konumuna geçiste mi yoksa bir konumundan – sıfır konumuna geçiste mi oluşturulacagı belirlenir.
En çok kullanılanlardan birisi PortB.0 pininde meydana gelen lojik seviye degisikliginin oluşturacagı kesme dir. Option Yazmaçının 6. biti önceden ayarlanarak kesmenin sıfırdan – bir konumuna geçiste mi yoksa bir konumundan – sıfır konumuna geçiste mi oluşturulacagı belirlenir.
OPTION_REG.6=0 olur ise RB0 da düsen kenarda kesme oluşur.
OPTION_REG.6=1 olur ise RB0 da yükselen kenarda kesme oluşur.
OPTION_REG.6=1 olur ise RB0 da yükselen kenarda kesme oluşur.
Düsen veya yükselen kenar terimi bir clock palsının kenar sekli olarak anlasılmalıdır. Kesme isleminin aktif edilebilmesi için INTCON (interrupt control registeri) yazmaçı kullanılır.
Örnegin RB0 kesmesinin aktif hale getirilebilmesi için;
INTCON.4=1 yapılmalı ve daha sonra ;
INTCON.7=1 degeri 7 nolu bite verilerek tüm kesmeler açılmalıdır.
Bu iki deger tek bir komutlada verilebilir. Söyle,
INTCON=%10010000
INTCON.4=1 yapılmalı ve daha sonra ;
INTCON.7=1 degeri 7 nolu bite verilerek tüm kesmeler açılmalıdır.
Bu iki deger tek bir komutlada verilebilir. Söyle,
INTCON=%10010000
Bu kesme aktif hale getirildikten sonra sayet bir kesme oluşur ise INTCON yazmaçı nın 1 nolu biti 0 konumundan 1 konumuna geçer. Bu bit sayet tekrar 0 konumuna program içinde getirilmez ise yeniden bir kesme oluşmaz. Bu nedenle programın KESME bölümünde bu bit sıfırlanmalıdır. RB0/INT Kesme kullanımını toparlamak gerekir ise;
RB0/INT kesmesini kullanmak için yapılması gerekenler sırası ile;
- Programın bas kısmına ON INTERRUPT GOTO KESME komutu verilerek kesme oluştugunda programın gidecegi yer (KESME) belirlenir.
- Programın bas kısmına ON INTERRUPT GOTO KESME komutu verilerek kesme oluştugunda programın gidecegi yer (KESME) belirlenir.
- RB0 pini giris olarak ayarlanacak
- Gerekir ise Option Yazmaçının 7. biti 1 veya 0 yapılarak pullup dirençleri istege göre ayarlanacak.
- Gerekir ise Option Yazmaçının 7. biti 1 veya 0 yapılarak pullup dirençleri istege göre ayarlanacak.
- Option Yazmaçının 6 biti 1 veya 0 olarak ayarlanarak kesmenin düsen kenar veya yükselen kenardamı olacağına karar verilecek.
- Intcon yazmaçına INTCON=%10010000 degeri verilerek kesme aktif hale getirilecek.
- Kesme bölümüne baslarken DISABLE komutu verilerek kesme anında yeniden kesme oluşumuna imkan verilmeyecek.
- Kesme bölümünde INTCON.1=0 komutu verilerek kesmeden dolayı 1 olan bayrak tekrar sıfırlanır ve sonradan yeni kesme oluşmasına imkan tanınır.
- Kesme bölümünün sonunda RESUME komutu verilerek programın kesme oluşmasından önceki yerine dönmesi saglanır.
- En sona ENABLE komutu yazılarak kesmeden dönüldükten sonra tüm kesmeler aktif hale getirilir.
Simdi de ögrendiklerimizi bir örnek vererek açıklayalım. Örnek Programımız RB0 bacagına baglı bir tus yardımı ile RA.0 bacagına baglı olan bir led’i yakıp söndürsün. Program içinde tusa basıldı mı? seklinde bir komut vermeden direkt kesme özelliginden yararlanacagız.
Yani RB0 bacagını sürekli 1 konumunda tutacağız (pullu up ile). Dolayısıyla bu bacagı tusa basarak sıfıra çekersek kesme oluşacak ve kesme bölümünde de led’i toggle komutu ile yanıksa söndürecegiz, sönük ise yakacagız. Tabiiki seçim olarak RB0/INT bacagı düsen kenar da kesme oluşacak sekilde ayarlanacaktır. Önce semamızı verelim;
iste Programımız;
‘**************************************************************** ‘* Name : KESME-RB0.BAS * ‘* Author : [Erol Tahir Erdal] * ‘* Notice : Copyright (c) 2005 [ETE] * ‘* : All Rights Reserved * ‘* Date : 23.04.2005 * ‘* Version : 1.0 * ‘* Notes : * ‘* : * ‘**************************************************************** PORTA=0 TrisA=%00000000 TrisB=%00000000 ‘—————————————————————– @ DEVICE pic16F628 ‘islemci 16F628 @ DEVICE pic16F628, WDT_on ‘Watch Dog timer açık @ DEVICE pic16F628, PWRT_ON ‘Power on timer açık @ DEVICE pic16F628, PROTECT_OFF ‘Kod Koruma kapalı @ DEVICE pic16F628, MCLR_OFF ‘MCLR pini kullanılmıyor. @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT ‘Dahili osilatör kullanılacak ‘—————————————————————– ON INTERRUPT GoTo KESME ‘kesme oluşursa KESME adlı etikete git. OPTION_REG=%0000000 ‘dahili Pull up dirençleri aktif edildi ayrıca pullup direncine gerek yok INTCON=%10010000 ‘Tüm Kesmeler aktif ve RB0/INT kesmesi aktif TRISB=%00000001 ‘PortB.0 giris digerleri çıkıs yapıldı. TRISA=%00000000 ‘A portu tamamı çıkıs yapıldı. CMCON=7 ‘16F628 de komparatör pinleri iptal hepsi giris çıkıs ‘—————————————————————– SYMBOL TUS=PORTB.0 SYMBOL LED=PORTA.0 ‘——————————————————————- BASLA: ‘Ana program bölümünde program bir sey yapmayacak pauseus 100 ‘kesme oluşmadıgı müddetçe program goto basla ‘ bu satırlar arasında dolasır DISABLE ‘yeniden kesme oluşması önleniyor KESME: ‘program buraya geldiginde kesme oluşmus demektir. TOGGLE LED ‘LED konum degistirdi PAUSE 1 INTCON.1=0 ‘RB0/INT Bayragı (flag) silindi. Resume ‘geldigin yere dön Enable ‘kesmeler yeniden aktif. End ‘————————————————————————
B portunda dahili pullup dirençleri vardır ve OPTION Yazmaçının 7. biti bunların aktif olup olmamasını kontrol eder. Sayet bu bit 0 ise dirençler aktif, 1 ise dirençler devrede degildir. Sanırım örnek her seyi açıkça anlatıyor. Burada özellikle dikkat edilecek yer ana program bölümünde pauseus 100 komutundan baska bir komut olmadıgıdır. Normal olarak program kesme oluşuncaya kadar sürekli Basla etiketi ile Goto basla komutu arasında dönüp duracaktır. Buraya kadar açıklananlar yalnızca RB0/INT kesmesinin kullanımına örnektir.
PORTB (RB4-RB7) DEGİSİKLİK KESMESİ :
Bu kesme tipinde RB4-RB7 bacaklarının mevcut konumlarında oluşacak bir degisiklik sonucunda da kesme oluşturulmaktadır. Bu kesme PORTB nin RB4-RB7 arası bacaklarının tamamının giris yapılması halinde geçerlidir. Bacaklardan birisi çıkıs yapılır ise kesme iptal olur.
Kesme bir kere aktif hale getirilir ise bu 4 adet bacak degeri sürekli pic tarafından okunur. Okunan deger bir önceki ile karsılastırılır. Sayet fark var ise kesme oluşur. Kesme de oluşan RBIF bayragının silinmesi için PortB nin bir kere programcı tarafından mutlaka okutulması gerekir. Aksi taktirde bayrak silinemez ve sürekli kesme oluşur.
Tabiiki yalnızca PortB nin okunması bayragı silmeye yetmeyecektir. Ayrıca RBIF bayragının
kesme bölümünde silinmesi de gerekir. RB PORT (Rb4-Rb7) Degisiklik Kesmesinin oluşması İçin Gerekenler :
kesme bölümünde silinmesi de gerekir. RB PORT (Rb4-Rb7) Degisiklik Kesmesinin oluşması İçin Gerekenler :
Programın bas kısmına ON INTERRUPT GOTO KESME komutu verilerek kesme oluştugunda programın gidecegi yer (KESME) belirlenir.
- RB4-RB7 pinleri mutlaka giris olarak ayarlanacak
- Intcon yazmaçının 3 biti bu kesme için ayrılmıstır. Bu bit 1 yapılarak kesme aktif edilir.INTCON=%10001000 degeri verilerek kesme aktif hale getirilecek.
- Kesme bölümüne baslarken DISABLE komutu verilerek kesme anında yeniden kesme oluşumuna imkan verilmeyecek.
- Kesme Bölümünde DURUM=PORTB seklinde port degeri okunacak
- Kesme bölümünde INTCON.0=0 komutu verilerek kesmeden dolayı 1 olan bayrak tekrar sıfırlanır ve sonradan yeni kesme oluşmasına imkan tanınır.
- Kesme bölümünün sonunda RESUME komutu verilerek programın kesme oluşmasından önceki yerine dönmesi saglanır.
En sona ENABLE komutu yazılarak kesmeden dönüldükten sonra tüm kesmeler aktif hale getirilir
Bu kesmeyi bir örnekle açıklayalım. Bu defa yine PortA.0 pinine bir LED baglı olsun. PortB.7 pinine bir Tus baglayalım ve bu sefer tus, pulldown yani GND ye çekili olsun. Tusa basılınca PortB.7 pinine High
uygulayalım.
uygulayalım.
İste baglantı semamız;
Program RB (4-7) Degisiklik Kesmesi:
‘**************************************************************** ‘* Name : KESME-RBCH.BAS * ‘* Author : [Erol Tahir Erdal] * ‘* Notice : Copyright (c) 2005 [ETE] * ‘* : All Rights Reserved * ‘* Date : 23.04.2005 * ‘* Version : 1.0 * ‘* Notes : * ‘* : * ‘**************************************************************** PORTA=0:portb=0 TRISB=%11110000 ‘PortB tamamı giris yapıldı. TRISA=%00000000 ‘A portu tamamı çıkıs yapıldı. ‘—————————————————————– @ DEVICE pic16F628 ‘islemci 16F628 @ DEVICE pic16F628, WDT_on ‘Watch Dog timer açık @ DEVICE pic16F628, PWRT_ON ‘Power on timer açık @ DEVICE pic16F628, PROTECT_OFF ‘Kod Koruma kapalı @ DEVICE pic16F628, MCLR_off ‘MCLR pini kullanılmıyor. @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT ‘Dahili osilatör kullanılacak ‘—————————————————————– ON INTERRUPT GoTo KESME ‘kesme oluşursa KESME adlı etikete git. OPTION_REG=%10000000 ‘dahili Pull up dirençleri iptal edildi INTCON=%10001000 ‘Kesmeler aktif ve RB CHANGE kesmesi aktif CMCON=7 ‘16F628 de komparatör pinleri iptal hepsi giris çıkıs ‘—————————————————————– DURUM VAR BYTE SYMBOL TUS=PORTB.0 SYMBOL LED=PORTA.0 SYMBOL RBIF=INTCON.0 ‘——————————————————————- BASLA: ‘Ana program bölümü DURUM=PORTB PAUSEUS 100 GOTO BASLA DISABLE ‘yeniden kesme oluşması önleniyor KESME: ‘ burada kesme oluştu demektir. TOGGLE LED ‘LED konum degistirdi PAUSE 300 DURUM=PORTB ‘PortB degeri okundu RBIF=0 ‘INTCON.0=0 yapıldı yani RB CHANGE Bayragı (flag) silindi. RESUME ‘geldigin yere dön. ENABLE ‘kesmeler yeniden aktif. End
TMR0 KESMESİ : Ram bellegin 01 adresinde bulunan özel bir yazmaçdır. Genellikle adı üstünde zamanlayıcı olarak kullanılır. 8 bitlik bir sayıcıdır. Yazılabilir okunabilir. Programlanabilen bir özel bölücüsü (prescaler) vardır. Harici veya dahili clock palsları ile sayım yapabilir.
Sayma yönü daima artan yöndedir. Bu sayıcı veya zamanlayıcı 255 degerini astıgı zaman degeri tekrar sıfır olur ve bu anda bir kesme oluşturulabilir. Bu sayıcının diger önemli bir özelligi ise arka planda yani ana programdan bagımsız çalısmasıdır. Ana program çalısırken veya kesme oluştugu andan
itibaren saymasına devam eder.
itibaren saymasına devam eder.
OPTION Yazmacının ilk üç biti frekans bölme (prescaler) ayarlaması için kullanılır. Bu üç bitin aldıgı degerlere göre bölücünün aldıgı degerler asagıda gösterilmistir. Bu bölücü aynı zamanda WDT içinde kullanıldıgından tabloda WDT için bölücü degerleride gösterilmistir.
Tablodan da anlasılacagı üzere sinyal kaynagından gelen palsların TM0 sayıcısını 1/1 yani direkt saydıracagı bir konum mevcut degildir. Özellikle dısarıdan bir sinyal kaynagından gelen palsların sayılmasında lazım olacak olan bu husus için OPTION yazmacının 3. biti 1 (bir) yapılarak frekans bölme islemi WDT için yapılır.
Bu bir nevi aldatmadır. Bölme WDT için yapılınca Frekans bölücü TM0 için Bay-Pass edilmis yani atlanmıs olur. Dolayısıyla gelen sinyaller 1/1 olarak Timer0 tarafından sayılır. Bunu yapacagımız örnekte görecegiz.TM0 sayısının kullanılması için bazı parametrelerin önceden ayarlanması gerekiyor. Bunlar sırası ile;
1. Sayıcının sayabilmesi için gerekli olan clock sinyalinin kaynagı ne olacaktır?. Bu kaynak dahili osilatör olabilecegi gibi standart olarak PortA.4 /TOCKI bacagı kullanılarak dısarıdan bir sinyal kaynagı ile beslenebilir. Bu seçim OPTION yazmacının 5. biti olan TOCS biti ile yapılır.
TOCS biti = 0 ise sinyal kaynagı dahili osilatör dür. TOCS biti = 1 ise sinyal kaynagı PortA.4 pinin den giren harici sinyal kaynagıdır.
2. Harici sinyal kaynagı seçilir ise, sayacın düsen kenarda mı yoksa yükselen kenarda mı sayma isini yapacagı OPTION yazmacının 4. biti olan TOSE biti ile ayarlanır.
TOSE Biti = 0 ise düsen kenarda sayma
TOSE Biti = 1 ise Yükselen kenarda sayma yapılır.
TOSE Biti = 1 ise Yükselen kenarda sayma yapılır.
3. Frekans bölme islemi TMR0 için mi yoksa WDT için mi geçerli olacaktır? Bunu seçmek için OPTIONyazmacının 3. biti olan PSA biti kullanılır.
PSA Biti = 0 ise Frekans Bölme TMR0 için geçerli,
PSA Biti = 1 ise Frekans Bölme WDT için geçerli olur.
PSA Biti = 1 ise Frekans Bölme WDT için geçerli olur.
4. Son olarak da Frekans bölme kullanılacak ise degeri ayarlanır. Bunun içinde OPTION yazmacının ilk 3 bitinin kullanıldıgını söylemistik. Tabloda verdigimiz degerlerden biri seçilerek OPTION yazmacına yazılır.
5. Programın bas kısmına ON INTERRUPT GOTO KESME komutu verilerek kesme oluştugunda programın gidecegi yer (KESME) belirlenir.
6. INTCON yazmacının 5. biti bu kesme için ayrılmıstır. Bu bit 1 yapılarak kesme aktif edilir.
7. Kesme bölümüne baslarken DISABLE komutu verilerek kesme anında yeniden kesme oluşumuna imkan verilmeyecek.
8. Kesme bölümünde INTCON.2=0 komutu verilerek kesmeden dolayı 1 olan bayrak tekrar sıfırlanır ve sonradan yeni kesme oluşmasına imkan tanınır.
9. Kesme bölümünün sonunda RESUME komutu verilerek programın kesme oluşmasından önceki yerine dönmesi saglanır.
10. En sona ENABLE komutu yazılarak kesmeden dönüldükten sonra tüm kesmeler aktif hale getirilir. Burada bir konuyu açıklamakta fayda görüyorum. Dahili veya harici osilatör kullanılması durumunda, frekans degerinin Pic’e baglı kristal degerinin dörtte biri olacağını bilmeniz gerekiyor. Diyelimki Pic 4 MHz lik bir kristal ile çalısıyor. O halde TMR0 için kullanılacak sinyal kaynagı 1 MHz frekansa sahip olacaktır.
Dahili osilatör ve Frekans bölücü pek çok uygulamalarda kullanılır. Özellikle hassas zamanlama islerinde önemli bir kullanım alanı vardır. Bunların basında Pic’in bir saat olarak kullanılması gelir. Dahili veya harici ösilatör ve frekans bölücü kullanılarak pic’in her bir saniyede bir kesme oluşturmasını saglayabiliriz. Sayet bu zamanı hassas bir sekilde ayarlayabilir isek dogru çalısan bir saat yapabiliriz. Simdi bunu bir örnek ile açıklayalım.
Yapacagımız örnek de 4 MHz de çalısan bir PIC16F628 kullanacagız. Dahili sinyal kaynagını kullanarak gelen sinyali 64’e bölecegiz. Bu durumda pic, TMR0’ ile 0 dan baslayıp 255’e kadar sayıp kesme oluşturabilmesi için ;
1 us x 64 x 256 = 16384 us süre kullanacaktır. 1 sn = 1000 ms ve oda 1000.000 us ye esit oldugundan sayet 1.000.000 us degerini 16384’e bölersek 61 degerini buluruz. O halde her kesme oluştugunda bir baska degiskeni saydırır ve bunun degeri 61 den 62 ye geçtigi anda degerini sıfırlayıp saniye degerini bir artırırsak bir saniyelik saat palslarını yakalamıs oluruz. Bunu bir programda kullanarak da saat yapabiliriz.
Bu örnek için bir semamız asagıdadır.
Programa geçmeden önce gerekli parametrelerimizi tespit edelim; Tespitlerimizin etki alanı OPTIONYazmacı olacağından tüm tespitleri Binary olarak bu yazmaca isleyecegiz.
1. Sinyal kaynagımız dahili osilatör olacaktır. O halde TOCS (5.bit) 0 olacaktır.
OPTION_REG=%00000000
OPTION_REG=%00000000
2. Frekans Bölme islemi TMR0 için olacak olup 3. bit 0 olacaktır.
OPTION_REG=%00000000
OPTION_REG=%00000000
3. Frekans bölme (prescaler) degeri 64 olacak olup bunun TMR0 için bit karsılıgı 101 dir.
OPTION_REG=%00000101
4. TMR0 kesmesini kullanacagımızdan INCON yazmacının 5. biti high olacaktır. Tüm Kesmeleri açmak için INTCON 7. biti high olacağından bu iki durumu tek komutta toparlarsak, INTCON=%10100000 seklinde bir komut yazmamız gerekir. Bu asamadan sonra programımızı verelim.
‘**************************************************************** ‘* Name : KESMETMR0.BAS * ‘* Author : [Erol Tahir Erdal] * ‘* Notice : Copyright (c) 2005 [ETE] * ‘* : All Rights Reserved * ‘* Date : 23.04.2005 * ‘* Version : 1.0 * ‘* Notes : * ‘* : * ‘**************************************************************** PORTA=0:portb=0 TRISB=%00000000 ‘PortB tamamı çıkıs yapıldı. TRISA=%00000000 ‘A portu tamamı çıkıs yapıldı. ‘—————————————————————– @ DEVICE pic16F628 ‘islemci 16F628 @ DEVICE pic16F628, WDT_OFF ‘Watch Dog timer kapalı @ DEVICE pic16F628, PWRT_ON ‘Power on timer açık @ DEVICE pic16F628, PROTECT_OFF ‘Kod Koruma kapalı @ DEVICE pic16F628, MCLR_off ‘MCLR pini kullanılıyor. @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT ‘Dahili osilatör kullanılacak ‘—————————————————————– DEFINE LCD_DREG PORTB ‘LCD data bacakları hangi porta baglı? DEFINE LCD_DBIT 4 ‘LCD data bacakları hangi bitten baslıyor? DEFINE LCD_EREG PORTB ‘LCD Enable Bacagı Hangi Porta baglı? DEFINE LCD_EBIT 3 ‘LCD Enable Bacagı Hangi bite baglı ? define LCD RWREG PORTB ‘LCD R/W Bacagı Hangi Porta baglı? define LCD_RWBIT 2 ‘LCD R/W Bacagı Hangi bite baglı ? DEFINE LCD_RSREG PORTB ‘LCD RS Bacagı Hangi Porta baglı ? DEFINE LCD_RSBIT 1 ‘LCD RS bacagı Hangi Bite baglı ? DEFINE LCD_BITS 4 ‘LCD 4 bit mi yoksa 8 bit olarak baglı? DEFINE LCD_LINES 2 ‘LCD Kaç sıra yazabiliyor ‘————————————————————————- ON INTERRUPT GoTo KESME ‘kesme oluşursa KESME adlı etikete git. OPTION_REG=%10000101 ‘Pull up dirençleri İPTAL- Bölme oranı 1/64. INTCON=%10100000 ‘Kesmeler aktif ve TMR0 kesmesi aktif TMR0=0 CMCON=7 ‘16F628 de komparatör pinleri iptal hepsi giris çıkıs ‘—————————————————————————- SAYAC VAR BYTE SN VAR BYTE DAK VAR BYTE SAAT VAR BYTE GUN VAR BYTE ‘—————————————————————————– CLEAR ‘tüm degiskenler sıfırlandı PAUSE 200 LCDOUT $FE,1 LOW PORTB.2 ‘LCD -R/W bacagı LOW’a çekildi. ‘—————————————————————————– BASLA: LCDOUT $FE,$84,DEC2 SAAT,”:”,DEC2 DAK,”:”,DEC2 SN GOTO BASLA DISABLE KESME: SAYAC=SAYAC+1 ‘kesme sayacı 1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme) IF SAYAC=61 then ‘61 adet kesme olunca 1 sn. süre geçiyor.(999424 us) SAYAC=0 ’sayaç sıfırlanıyor SN=SN+1 ’saniye degeri bir artırılıyor IF SN=60 THEN ’saniye 60 olmus ise 1 dakika süre geçti o halde SN=0 ‘ saniye sıfırlanıyor DAK=DAK+1 ‘ dakika degeri bir artırılıyor IF DAK=60 THEN ‘dakika 60 olmus ise 1 saat süre geçti DAK=0 ‘ dakika sıfırlanıyor SAAT=SAAT+1 ‘ saat degeri bir artırılıyor IF SAAT=24 THEN ’saat 24 olmus ise 1 gün geçti SAAT=0 ’saat sıfırlanıyor GUN=GUN+1 ‘gün degeri bir artırılıyor IF GUN=365 THEN GUN=0 ‘gün 365 olmus ise ENDIF ‘gün sıfırlanıyor 1 yıl geçti ENDIF ENDIF ENDIF INTCON.2=0 ‘TMR0 Kesme bayragı sıfırlanıyor RESUME ENABLE END ‘———————————————————————————–
Her ne kadar hesap sonucunda kesmenin oluşturacagı gecikme yaklasık 1 sn hesaplanmıs isede pratikte program komutlarınında bir gecikmeye sebep olacağı unutulmamalıdır. Yukarıdaki programda KESME bölümünde bir çok komut bulunmaktadır. Makine dilinde her bir komut yaklasık (4MHz de) 1 us süre almaktadır. Bu nedenle hesaplama dogru olsa da saat ileri gidebilir veya geri kalabilir. Bunun için SAYAC degeri her 61 kesme yerine 60 – 59 -58 kesmede bir saniye artırımı yaptırılabilir. En iyisi programın yazılması tamamlanınca bir dogru çalısan bir saat yardımı ile süre karsılastırması yapılmalı ve gerekirse SAYAC degeri ile oynanarak hassas bir ayarlama yapılmalıdır.
Burada ikinci bir örnek daha verecegiz ve saat’in baska ilerde nasıl kullanılacagına bakacagız. Diyelim ki 4 adet tus ile kontrol edilen 4 adet rölemiz var ve bunlar bir takım sistemleri çalıstırıyorlar. Her bir röle ayrı bir sistemi çalıstırıyor ve biz hangi sistemin ne kadar çalıstıgını bilmek istiyoruz. İste yazacagımız program 4 adet tus yardımı ile 4 adet röleyi çalıstıracak ve arka planda ise TMR0 kesmesi yardımı ile saatimiz çalısacak.
Bu programda ayrıca yeni bir degisken tipi ile tanısacagız. Dizi degiskeni. Dizi degiskenleri aynı isimle açılırlar ancak her bir degiskenin bir indeks denilen parametresi vardır. Indeks ayrı bir degisken altında saklanabilir ve degeri degistirilerek istenilen dizi degiskenine kolaylıkla ulasılabilir. Kullanımı degisken tanımlarında söyle yapılmaktadır.
DEGER var Byte [4] burada deger adlı degiskenin 4 ayrı indeksli çesidi vardır. Bunlar ;
DEGER[0] – DEGER [1] – DEGER [2] ve DEGER [3] dür.
Önce programla ilgili semamızı verelim;
Dikkat edilirse semada röle yerine logic prop baglanmıstır. Bunların yerine asıl devrede birer role baglanacaktır. Ancak asıl amacımız programın islevini göstermek oldugundan detaya girilmemistir.
İste programımız;
‘**************************************************************** ‘* Name : KESME-R0LE.BAS * ‘* Author : [E.Erdal] * ‘* Notice : Copyright (c) 2005 [ETE] * ‘* : All Rights Reserved * ‘* Date : 23.04.2005 * ‘* Version : 1.0 * ‘* Notes : * ‘* : * ‘**************************************************************** PORTA=0:portb=0 TRISB=%00001111 ‘PortB (RB4-RB7) çıkıs digerleri giris yapıldı. TRISA=%00000000 ‘A portu tamamı çıkıs yapıldı. ‘—————————————————————– @ DEVICE pic16F628 ‘islemci 16F628 @ DEVICE pic16F628, WDT_OFF ‘Watch Dog timer kapalı @ DEVICE pic16F628, PWRT_ON ‘Power on timer açık @ DEVICE pic16F628, PROTECT_OFF ‘Kod koruma kapalı @ DEVICE pic16F628, MCLR_off ‘MCLR pini kullanılıyor. @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT ‘Dahili osilatör kullanılacak ‘—————————————————————– DEFINE LCD_DREG PORTA ‘LCD data bacakları hangi porta baglı? DEFINE LCD_DBIT 0 ‘LCD data bacakları hangi bitten baslıyor? DEFINE LCD_EREG PORTA ‘LCD Enable Bacagı Hangi Porta baglı? DEFINE LCD_EBIT 7 ‘LCD Enable Bacagı Hangi bite baglı ? DEFINE LCD_RSREG PORTA ‘LCD RS Bacagı Hangi Porta baglı ? DEFINE LCD_RSBIT 6 ‘LCD RS bacagı Hangi Bite baglı ? DEFINE LCD_BITS 4 ‘LCD 4 bit mi yoksa 8 bit olarak baglı? DEFINE LCD_LINES 2 ‘LCD Kaç sıra yazabiliyor ‘————————————————————————- ON INTERRUPT GoTo KESME ‘kesme oluşursa KESME adlı etikete git. OPTION_REG=%10000101 ‘Pull up dirençleri İPTAL- Bölme oranı 1/64. INTCON=%10100000 ‘Kesmeler aktif ve TMR0 kesmesi aktif TMR0=0 CMCON=7 ‘16F628 de komparatör pinleri iptal hepsi giris çıkıs ‘—————————————————————————- SAYAC VAR BYTE SN VAR BYTE[5] DAK VAR BYTE[5] SAAT VAR BYTE[5] GUN VAR BYTE DURUM var byte I VAR WORD ESKI VAR BYTE ROLE VAR BYTE ‘—————————————————————————– CLEAR ‘tüm degiskenler sıfırlandı PAUSE 200 LCDOUT $FE,1 ‘—————————————————————————– BASLA: LCDOUT $FE,$84,DEC2 SAAT[0],”:”,DEC2 DAK[0],”:”,DEC2 SN[0] DURUM=PORTB & %1111 IF DURUM>0 THEN PORTB=DURUM ESKI=PORTB | DURUM*16 ROLE=NCD ESKI ‘NCD KOMUTU SAYIDAKİ EN YÜKSEK HİGH OLAN BİTİ VERİR ROLE=((ROLE>0)&%1)*(ROLE-4) ‘BİR ÇOK İSİ GÖREN TEK BİR KOMUT LCDOUT $FE,$C0,”ROLE=”,#ROLE,” “,DEC2 SAAT[ROLE],”:”,DEC2 DAK[ROLE],”:”,DEC2 SN[ROLE] PORTB=ESKI FOR I=0 TO 2000 PAUSEUS 10 NEXT I GOTO BASLA DISABLE KESME: SAYAC=SAYAC+1 ‘kesme sayacı 1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme) IF SAYAC=61 then ‘61 adet kesme olunca 1 sn. süre geçiyor.(999424 us) SAYAC=0 ’sayaç sıfırlanıyor SN[0]=SN[0]+1 IF ROLE=0 then ATLA SN[ROLE]=SN[ROLE]+1 ’saniye degeri bir artırılıyor ATLA: IF SN[0]=60 THEN ’saniye 60 olmus ise 1 dakika süre geçti ohalde SN[0]=0 SN[ROLE]=0 ‘ saniye sıfırlanıyor DAK[0]=DAK[0]+1 DAK[ROLE]=DAK[ROLE]+1 ‘ dakika degeri bir artırılıyor IF DAK[0]=60 then ‘dakika 60 olmus ise 1 saat süre geçti DAK[0]=0 DAK[ROLE]=0 ‘ dakika sıfırlanıyor SAAT[0]=SAAT[0]+1 SAAT[ROLE]=SAAT[ROLE]+1 ‘ saat degeri bir artırılıyor IF SAAT[0]=24 THEN ’saat 24 olmus ise 1 gün geçti SAAT[0]=0 SAAT[ROLE]=0 ’saat sıfırlanıyor GUN=GUN+1 ‘gün degeri bir artırılıyor IF GUN=365 THEN GUN=0 ‘gün 365 olmus ise endif ‘gün sıfırlanıyor 1 yıl geçti ENDIF ENDIF ENDIF INTCON.2=0 ‘TMR0 Kesme bayragı sıfırlanıyor RESUME ENABLE END ‘—————————————————————————–
Sayac=61 satırında 61 sayısı 1 sn lik süreyi ayarlamaktadır. Program komutlarındaki gecikmeler nedeni daha hassas bir ayarlama gerekebilir. Bir saatle birlikte kontrol edilerek pic saati geri kalıyorsa degeri azaltılmalıdır. İleri gidiyor ise artırılmalıdır. Programla iligli genel açıklamalar; Bu programda ileri programlama teknikleri kullanılmıstır. Program satırlarını esas alarak açıklamaya çalısalım.
‘——————————————————————————————————–
LCDOUT $FE,$84,DEC2 SAAT[0],”:”,DEC2 DAK[0],”:”,DEC2 SN[0]
‘——————————————————————————————————–
Programda saat için 5 adet indeks li degisken kullanılmıs idi. Bunun amacı her bir röle için ayrı bir zaman tutmak ve sıfır ile çalısan indeks degerini de ana saat için kullanmaktır. Yani saat(0) sistemin ana saati olacak Saat(1-4) arası ise her bir röleye ait olacaktır. Yukarıdaki komutta görüldügü gibi [0] indeksi kullanılmıs ve dolayısıyla sistem ana saati LCD üst satırında ekrana verilmistir.
‘——————————————————————————————————–
DURUM=PORTB & %1111
‘——————————————————————————————————–
Bu komutta Tusların hangisine basıldıgını kontrol etmek için tek bir komut kullanılmıstır. PORTB degeri okunarak 15 (%1111) sayısı ile AND islemi uygulanmıstır. Dolayısıyla PortB nin ilk 4 biti filtre edilerek ayrılmıs olacak ve bu bitlerden hangisi 1 ise (tusa basılmıs ise) belirlenecektir.
‘——————————————————————————————————–
LCDOUT $FE,$84,DEC2 SAAT[0],”:”,DEC2 DAK[0],”:”,DEC2 SN[0]
‘——————————————————————————————————–
Programda saat için 5 adet indeks li degisken kullanılmıs idi. Bunun amacı her bir röle için ayrı bir zaman tutmak ve sıfır ile çalısan indeks degerini de ana saat için kullanmaktır. Yani saat(0) sistemin ana saati olacak Saat(1-4) arası ise her bir röleye ait olacaktır. Yukarıdaki komutta görüldügü gibi [0] indeksi kullanılmıs ve dolayısıyla sistem ana saati LCD üst satırında ekrana verilmistir.
‘——————————————————————————————————–
DURUM=PORTB & %1111
‘——————————————————————————————————–
Bu komutta Tusların hangisine basıldıgını kontrol etmek için tek bir komut kullanılmıstır. PORTB degeri okunarak 15 (%1111) sayısı ile AND islemi uygulanmıstır. Dolayısıyla PortB nin ilk 4 biti filtre edilerek ayrılmıs olacak ve bu bitlerden hangisi 1 ise (tusa basılmıs ise) belirlenecektir.
‘——————————————————————————————————–
IF DURUM>0 THEN PORTB=DURUM
‘——————————————————————————————————–
Burada herhangi bir tusa basılmıs ise eski basılmıs olanı iptal etmek ve yenisini devreye sokmak için bu komut kullanılmıstır.
‘——————————————————————————————————–
AKTIF=PORTB | DURUM*16
‘——————————————————————————————————–
Burada basılan tusa paralel olarak hangi rolelin aktif hale getirilecegi hesaplanmaktadır. Bir yerde basılan tuşun bit degeri 4 bit sola kaydırılarak PortaB ye verilmektedir. Hangi rölenin aktif oldugunu ise asagıdaki komut hesaplamaktadır.
‘——————————————————————————————————–
ROLE=NCD AKTIF ‘NCD KOMUTU SAYIDAKİ EN YÜKSEK HİGH OLAN BİTİ VERİR
‘——————————————————————————————————–
NCD komutu bir sayı içindeki en yüksek degerlikli high olan bitin konumunu verir. Örnek vermek gerekir iseSAYI=%00010000 ise NCD SAYI komutu bize 5 sayısını verecektir. En yüksek high 5. sıradaki 1 dir. Bu komut yardımı ile basılan tusa göre hangi rolenin aktif oldugunu belirliyoruz. Ancak bu belirleme bize PORTB deki sırayı verecektir.
IF DURUM>0 THEN PORTB=DURUM
‘——————————————————————————————————–
Burada herhangi bir tusa basılmıs ise eski basılmıs olanı iptal etmek ve yenisini devreye sokmak için bu komut kullanılmıstır.
‘——————————————————————————————————–
AKTIF=PORTB | DURUM*16
‘——————————————————————————————————–
Burada basılan tusa paralel olarak hangi rolelin aktif hale getirilecegi hesaplanmaktadır. Bir yerde basılan tuşun bit degeri 4 bit sola kaydırılarak PortaB ye verilmektedir. Hangi rölenin aktif oldugunu ise asagıdaki komut hesaplamaktadır.
‘——————————————————————————————————–
ROLE=NCD AKTIF ‘NCD KOMUTU SAYIDAKİ EN YÜKSEK HİGH OLAN BİTİ VERİR
‘——————————————————————————————————–
NCD komutu bir sayı içindeki en yüksek degerlikli high olan bitin konumunu verir. Örnek vermek gerekir iseSAYI=%00010000 ise NCD SAYI komutu bize 5 sayısını verecektir. En yüksek high 5. sıradaki 1 dir. Bu komut yardımı ile basılan tusa göre hangi rolenin aktif oldugunu belirliyoruz. Ancak bu belirleme bize PORTB deki sırayı verecektir.
Yani 4-8 arası bir deger. Halbuki biz 1. Role – 2. Role … 4.Role demek isteriz. Dolayısıyla bu degeri 1-4 arası degere indirgememiz gerekir. Burada islem aslında basit Hesaplanan degerden 4 çıkartır isek bize 1-4 arası degeri verir. Ancak ya deger 0 (sıfır) ise. Bu durumda 0-4 bize 65531 gibi bir deger verirki buda sistemin hata yapmasına sebep olur. Bu durumda sayet Role degeri sıfır ise bu hesabı yapmadan atlamamız gerekir. Akıllıca bir programlama mantıgı ile bu isi tek komutla halledebiliriz.
‘——————————————————————————————————–
ROLE=((ROLE>0) & %1)*(ROLE – 4) ‘BİR ÇOK İSİ GÖREN TEK BİR KOMUT
‘——————————————————————————————————–
Bu komut bizi birkaç defa if kullanmaktan kurtarır. Bu komut asagıdaki program satırlarının görevini yapmaktadır;
‘——————————————————————————————————–
IF ROLE=0 THEN Hesap yapma ve Ekrana bir sey yazma
IF ROLE>0 then ROLE= Role-4 hesabını yap
‘——————————————————————————————————–
Simdi komut nasıl çalısıyor bir bakalım;
(ROLE>0) & %1 komutunda (ROLE>0) ifadesi bir logik operatör kullanan bir aritmetik ifadesidir. Role>0 ise degeri 255, Role=0 ise degeri 0 dır. Dolayısıyla bunu %1 ile AND islemine tabi tutar isek Role 0 dan büyük olunca degeri 1, sıfıra esit olunca ise degeri 0 olarak gelir. Bu ifadeyi (ROLE-4) ile çarpar isek istedigimizi elde etmis oluruz.
‘——————————————————————————————————–
ROLE=((ROLE>0) & %1)*(ROLE – 4) ‘BİR ÇOK İSİ GÖREN TEK BİR KOMUT
‘——————————————————————————————————–
Bu komut bizi birkaç defa if kullanmaktan kurtarır. Bu komut asagıdaki program satırlarının görevini yapmaktadır;
‘——————————————————————————————————–
IF ROLE=0 THEN Hesap yapma ve Ekrana bir sey yazma
IF ROLE>0 then ROLE= Role-4 hesabını yap
‘——————————————————————————————————–
Simdi komut nasıl çalısıyor bir bakalım;
(ROLE>0) & %1 komutunda (ROLE>0) ifadesi bir logik operatör kullanan bir aritmetik ifadesidir. Role>0 ise degeri 255, Role=0 ise degeri 0 dır. Dolayısıyla bunu %1 ile AND islemine tabi tutar isek Role 0 dan büyük olunca degeri 1, sıfıra esit olunca ise degeri 0 olarak gelir. Bu ifadeyi (ROLE-4) ile çarpar isek istedigimizi elde etmis oluruz.
Yani:
1 x (Role-4) burada Role 0 dan büyük oldugundan role degeri 1-4 arası çıkacaktır.
0 x (Role-4) ki burada Role 0 oldugundan sonuç 0 olacaktır.
‘——————————————————————————————————–
LCDOUT $FE,$C0,”ROLE=”,#ROLE,” “,DEC2 SAAT[ROLE],”:”,DEC2 D
DAK[ROLE],”:”,DEC2 SN[ROLE]
‘——————————————————————————————————–
Komutu ile aktif olan role ile o röleye ait saat degeri ekrana getirilmektedir.
‘——————————————————————————————————–
PORTB=AKTIF
‘——————————————————————————————————–
Aktif olan role ekrana verilmektedir. Kesme oluşmasında kolaylık saglamak üzere 20 ms lik gecikme us cinsinden döngü kullanılarak verilmektedir.
‘——————————————————————————————————–
FOR I=0 TO 2000
PAUSEUS 10
NEXT I
‘——————————————————————————————————–
GOTO BASLA
‘——————————————————————————————————–
Goto basla ile program tekrar basa yönlendirilmektedir. Programın Kesme kısmında ise 1 sn lik süre Sayac=61 sayısı ile kontrol edilmekte ve bu süre sonunda Sn=Sn+1 komutu ile degeri bir artırılmaktadır. Sn degerinin 60’ı geçmesi halinde dakika ve paralel olarak saat ve gün degerleri artırılmaktadır.
1 x (Role-4) burada Role 0 dan büyük oldugundan role degeri 1-4 arası çıkacaktır.
0 x (Role-4) ki burada Role 0 oldugundan sonuç 0 olacaktır.
‘——————————————————————————————————–
LCDOUT $FE,$C0,”ROLE=”,#ROLE,” “,DEC2 SAAT[ROLE],”:”,DEC2 D
DAK[ROLE],”:”,DEC2 SN[ROLE]
‘——————————————————————————————————–
Komutu ile aktif olan role ile o röleye ait saat degeri ekrana getirilmektedir.
‘——————————————————————————————————–
PORTB=AKTIF
‘——————————————————————————————————–
Aktif olan role ekrana verilmektedir. Kesme oluşmasında kolaylık saglamak üzere 20 ms lik gecikme us cinsinden döngü kullanılarak verilmektedir.
‘——————————————————————————————————–
FOR I=0 TO 2000
PAUSEUS 10
NEXT I
‘——————————————————————————————————–
GOTO BASLA
‘——————————————————————————————————–
Goto basla ile program tekrar basa yönlendirilmektedir. Programın Kesme kısmında ise 1 sn lik süre Sayac=61 sayısı ile kontrol edilmekte ve bu süre sonunda Sn=Sn+1 komutu ile degeri bir artırılmaktadır. Sn degerinin 60’ı geçmesi halinde dakika ve paralel olarak saat ve gün degerleri artırılmaktadır.
Buradaki diger önemli nokta ise o andaki ROLE degeri ki burada indeks olarak kullanılmakta esas alınarak o roleye ait saat degeri ise ayrıca saydırılmaktadır. Tabiiki hiçbir role aktif degil ise role degeri 0 olacağından sistem ana saati saydırılmaktadır.
6.ders Proteus ve hex dosyaları Download
7.ders:
ARA=ARA+ERO ‘PROG=6 olsun ERO=%00011000 oldu
PORTB=ARA ‘ARA=Volum ABC + Prog ABC ve Selec değerleri toplamı
Write 1,PROG ‘Önce porta yazılıyor Prog değeri Eeproma kayıt ediliyor
Pause 74
GoTo START
BES: PROG=PROG-1
IF PROG=255 Then ‘PROGRAM ASAGI
PROG=7
EndIF
GoTo PORKAY
ALTI: Toggle PORTA.2 ’sabit program tuşlarından birine basılmıs
GoTo START
YEDI: Toggle PORTA.3
GoTo START
SEKIZ:Toggle PORTA.4
GoTo START
end
7.ders:
Bu dersimizin konusu Seri İletisim. Konuya seri iletişimin ne oldugunu açıklayarak baslayalım. Dijital bilgi bilindigi üzere bitlerden olusmaktadır. Her bir bit ya 0 (sıfır) yada 1 (bir) olabilmektedir. Bunlar yana yana gelince daha büyük digital bilgiyi olusturmaktadır. Örnegin 8 adet bit 1 adet BAYT bilgisini olusturmakta 16 adet bit ise 1 adet WORD bilgisini olusturmaktadır.
Simdi gelelim bu bilgilerin başka yerlere aktarılması isine. 8 bitlik bir bilginin tek bir seferde başka bir üniteye aktarılması için 8 adet bağlantı ucu kullanırsak yani her bir bit için bir uç kullanır isek bu bir paralel aktarma islemidir. Yine 8 bitlik bir bilgiyi başka bir üniteye tek bir uç kullanılarak aktarmak istersek bu bir seri aktarma islemidir. Her iki sistemde ilave uçlarda olacaktır. Ancak biz sadece bilginin aktarılması için gereken uçlardan bahsediyoruz. İste üzerinde duracagımız konu bu seri bilgi aktarma sistemidir.
Bu sistemde verici ve alıcı ünite bir birlerine tek bir data hattı ile bağlanırlar. Verici gönderdigi bitleri belirli bir formatta yani belirli zaman içinde belirli sayıda bit gönderir. Bu sekilde olusturulan senkronizasyon ile 8 adet bitin gönderilmesi yapılır ve alıcıda bu bitleri teker teker alır. Alıcı ile verici nin bireysel çalısma hızlarının farklılıgından dolayı seri iletişimde bir kural vardır.
Kural birim zaman içinde gönderilen veya alınan bit sayısı ile ifade edilen BAUD RATE yani haberlesme hızı dır. Alıcı ve vericinin aynı senkron içinde alıs verislerinin yapılabilmesi için bu hızın her iki taraf için aynı değere ayarlanması gerekir. Sistemin başka parametreleri de bulunmaktadır. Gönderilen bilginin invert edilmesi her baytın sonunda bir stop biti gönderilmesi , parite kontrolu vs. gibi. İsin teferruatına fazla girmeden konuyla ilgili komutların kullanımına geçecegiz. Basic de seri iletişim komutları birkaç tanedir. Bunları sırası ile açıklayacagız. İlk komutumuz;
SERIN Pin,Mode,{Timeout,Label,}{[Qual...],}{Item…}
Standart Asenkron Seri data giris komutudur. Yani başka bir seri data gönderebilen bir üniteden gelen bilgiyi almak için kullanacagımız komutlardan birisidir. Parametrelerine bakacak olur isek; SERINkomutundan hemen sonra seri datanın alındıgı pin yer almaktadır. Burada PortA.0 veya PortB.2 gibi port pinleri kullanılır. İkinci parametre Mode dir.
Standart Asenkron Seri data giris komutudur. Yani başka bir seri data gönderebilen bir üniteden gelen bilgiyi almak için kullanacagımız komutlardan birisidir. Parametrelerine bakacak olur isek; SERINkomutundan hemen sonra seri datanın alındıgı pin yer almaktadır. Burada PortA.0 veya PortB.2 gibi port pinleri kullanılır. İkinci parametre Mode dir.
Komut yukarıdaki hali ile Mod numaralarının kullanımına imkan tanımaktadır. Sayet komutu Mode isimleri ile kullanmak isterseniz programınızın bas tarafına ; Include “modedefs.bas” Komutunu ilave etmeniz gerekir. Her bir mod da bilginin düzmü yoksa inver edilmis hali ilemi alındıgı bellidir. Sistemin default olarak ayarlanmıs diğer parametreleri şöyledir.
8 data biti , no parity ve 1 stop biti seklindedir. Genel gösterim 8N1 seklindedir. diğer parametre olan ve gerektiginde kullanılmayan Timeout parametresi dir ve 1 ms (milisaniye) cinsinden belirlenir. Anlamı ise burada verilen süre içerisinde herhangi bir data alınmaz ise program Label parametresi ile belirlenen konuma atlar. Dolayısıyla Label’i de açıklamıs oluyoruz. Burada bir program bölümünün ismi (etiketi) verilir .
Bir sonraki parametre qualifier olup belirleyici anlamında kullanılır ve birden fazla olabilir. Genellikle dogru haberlesme yapılabilmesi için gönderilen bilgilerin basına belirli ifadeler yerlestirilir. Bu yerlestirilen bilgilere qualifier denir. Bu bilgiler rakam olabilecegi gibi bir karekter diziside olabilir. En son parametre ise gelen bilginin depolanacagı degisken simidir ve ITEM olarak gösterilmistir.
Buraya kullanacagınız degisken adı yazılacaktır. Örnek vermek gerekir ise ; SERIN PortA.0 , 0 , [“ERO”] , ISI Bu komutta qualifier olarak kullanılan bilgi “ERO” bilgisidir. Program gelen bilgilere sürekli bakacak ve önceden “ERO” bilgisini alır ise arkasından gelen ilk bilgiyi ISI degiskenine koyacaktır. Aksi taktirde ISI degiskeni oldugu gibi kalacaktır. Bu sistem, haberlesmede yanlıs data alımını önleyen güzel bir sistemdir.
Diğer Bir komut SERIN2 komutudur. Serin komutuna benzer bir komuttur. SERIN2 , GIRIS , 396 , [WAIT ("W"), DEC AL] Bu komutda da önce data alıs pini belirlenir ve pin otomatik olarak giris olarak ayarlanır. Daha sonra haberlesme hızı belirlenir.
Bu hız için değişik bir hesaplama mantığı kullanılmaktadır. Formül şöyledir. Haberlesme Hızı= (1.000.000/Baud Rate)-20 Örnek verecek olur isek , 2400 baud için hız hesaplayalım Hız= (1.000.000/2400)-20 = 396 olacaktır. (yukarıdaki komutta yazıldıgı gibi) Daha sonra belirli bir karakter veya karakter dizisinin alınması beklenir. Bu karekterlerden sonrada esas data Bin, hex veya dec formatlı olarak alınır.
diğer bir komut HSERIN komutu olup yalnızca Hardware Serial Port’u (USART) olan Pic’ler için kullanılabilir. Bu port PIC16F628 , PIC16F876, PIC16F877 gibi pic lerde bulunmakta 16F84/A da bulunmamaktadır. Dolayısıyla bu komutu kullanabilmemiz için öncelikle kullandıgımız Pic’in bu porta sahip olup olmadıgını ögrenmemiz gerekecektir. Komutun kullanım sekli şöyledir. HSERIN {ParityLabel,}{Timeout,Label,}[Item{,...}] Bu komutun parametreleri Define komutu ile belirlenir. Bunlar; DEFINE HSER_RCSTA 90h (alma yazmacının Enable edilmesi)
DEFINE HSER_TXSTA 20h (gönderme yazmacının Enable edilmesi)
DEFINE HSER_BAUD 2400 (Haberlesme hızının belirlenmesi)
DEFINE HSER_BAUD 2400 (Haberlesme hızının belirlenmesi)
Komutun kullanım sekli genelde asagıdaki sekilde dir HSERIN [BILGI, DEC ZX] Bu komutta tüm parametreler DEFINE komutu ile verilmistir. Dolayısıyla parametre olarak yalnızca Bilgi isimli bir degisken ve arkasından Desimal olarak alınacak olan ZX degiskeni görülmektedir.
Bu komutun en önemli özelligi giris pinlerinin USART özelligine bağlı olarak önceden belirlenmis olmasıdır. Bu pinlerin hangisi oldugu Datasheetler de gösterilmektedir ve kullanıcı tarafından degistirilemez. Dolayısıyla komutun kullanımında pin adı görmezsiniz. Komutun başka bir kullanılıs sekli asagıda gösterilmektedir.
HSERIN 300,ATLA,[WAIT ("ER"),AL]
Bu komutta Timeout süresi 300 ms olarak verilmis ve bu süre sonunda programın ATLA isimli etikete gitmesi saglanmıstır. Komut gelen bilgiler arasında ER karakterlerini arayacak buldugu anda pesinden gelen bilgiyi AL degiskenine yerlestirecektir. Simdiye kadar vermis oldugumuz komutlar data alıs komutları idi. Aynı komutların bir de Data gönderme komutları vardır ve tek fark datanın gönderilmesi dir. Bu komutlarda bir data gönderme pini belirlenir.
HSEROUT komutunda bu pin standart olup degistirilemez. Ancak Serout veya serout2 komutlarında kullanıcı tarafından istenildigi sekilde tanımlanır. Seri haberlesme konusunda son olarak önemli bir konuya dikkatinizi çekmek istiyorum. Pic ve benzeri cihazlarda lojik seviyeler TTL seviyesindedir. Yani bir (1) sinyali +5V , sıfır (0) sinyali ise GND seviyesindedir.
Bu cihazlar kendi aralarında haberlesir iken arada herhangi bir seviye düzenleyici sistem gerekmez. Zira high olarak gönderilen sinyal her iki taraf için +5V dur. Low olan ise GND seviyesindedir. Ancak pic ve benzeri cihazlar bir PC ile haberlesmesi gerektiginde gönderilen veya alınan sinyallerin seviyelerinin düzeltilmesi gerekir. Zira PC lerde High sinyali -12V , low sinyali ise +12 V dur.
Bu is için RS232 çevirici entegresi kullanılması gerekiyor. Genellikle adı MAX 232 veya CP232 olarak geçer. Bu entegrenin RS232 giris ve çıkıs bacakları bulunmaktadır. Dolayısıyla Pic den gelen sinyali (+5V veya 0V – High veya Low) PC nin anlayacagı seviyelere (-10V veya +10v) çevirir. Aynı sekilde PC den gelen sinyalleri de Pic’in anlayacagı seviyelere çevirmektedir.
Dolayısı ile Pic-PC arası yapılacak seri haberlesme devrelerinde bu çeviricinin kullanılması
gerekir. Komutlarla ilgili bu kadar bilgi verdikten sonra örneklerimize geçelim; İlk örnegimiz basit bir Seri iletişim örnegi olacak. SERIN ve SEROUT komutlarını kullanarak bir rolenin çalıstırılmasını gerçeklestirecegiz.
gerekir. Komutlarla ilgili bu kadar bilgi verdikten sonra örneklerimize geçelim; İlk örnegimiz basit bir Seri iletişim örnegi olacak. SERIN ve SEROUT komutlarını kullanarak bir rolenin çalıstırılmasını gerçeklestirecegiz.
Bunun için 2 adet Pic li devre kullanacagız. Birinci devremiz verici olarak çalısacak ve üzerinde yalnızca iki adet tus bulunacaktır. diğer devremiz ise alıcı olarak çalısacak ve üzerinde 2 adet LED ve 2 adet Role bağlı olacaktır. Önce şemamızı verelim;
Proje 7/1 : Seri – Ver – Al
İlk programımız SERI-VER.BAS
‘**************************************************************** ‘* Name : SERI-VER.BAS * ‘* Author : [Erol Tahir Erdal] * ‘* Notice : Copyright (c) 2005 [ETE] * ‘* : All Rights Reserved * ‘* Date : 11.05.2005 * ‘* Version : 1.0 * ‘* Notes : SERI-AL.BAS programının vericisidir. * ‘* : * ‘**************************************************************** @ DEVICE pic16F628 ‘islemci 16F628 @ DEVICE pic16F628, WDT_on ‘Watch Dog timer kapalı @ 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 giris çıkıs OPTION_REG.7=0 ‘Dahili pull-up lar AKTİF yapıldı ayrıca pull-up direncine gerek yok PortA=0 TrisA=%00000000 PortB=0 TrisB=%00000011 ‘—————————————————————————— SYMBOL CIKIS=PORTA.0 SYMBOL TUSA=PORTB.0 SYMBOL TUSB=PORTB.1 VER VAR BYTE ‘—————————————————————————— PAUSE 200 VER=0 ‘—————————————————————————— BASLA: VER=0 IF TUSA=0 THEN VER=88 gosub gonder WHILE TUSA=0 WEND endIF IF TUSB=0 THEN VER=66 gosub gonder WHILE TUSB=0 WEND endif PAUSE 100 GOTO BASLA ‘—————–ALT PROGRAMLAR——————————- GONDER: SEROUT2 CIKIS,396,["E","T","E",ver] SEROUT2 CIKIS,396,["E","T","E",ver] return END
İkincisi ise SERI-AL.BAS ,
‘***************************************************************** ‘* Name : SERI-AL.BAS * ‘* Author : [E.T.E] * ‘* Notice : Copyright (c) 2005 [ETE] * ‘* : All Rights Reserved * ‘* Date : 13-02-2005 * ‘* Version : 41.00 * ‘* Notes : SERI-VER.BAS PROGRAMININ ALICISIDIR* ‘* : * ‘***************************************************************** PORTA=0 PORTB=0 TRISA=%00000001 ‘A portu A.0 giris diğerleri çıkıs yapıldı. TRISB=%00000000 ‘B portu tamamı çıkıs yapıldı. ‘—————————————————————– @ DEVICE pic16F628 ‘islemci 16F628 @ DEVICE pic16F628, WDT_on ‘Watch Dog timer açık @ DEVICE pic16F628, PWRT_ON ‘Power on timer açık @ DEVICE pic16F628, PROTECT_OFF ‘Kod Koruma kapalı @ DEVICE pic16F628, MCLR_OFF ‘MCLR pini kullanılıyor. @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT ‘Dahili osilatör kullanılacak ‘—————————degiskenler—————————— AL VAR BYTE GIRIS VAR PORTA.0 ROLEA VAR PORTB.0 ROLEB VAR PORTB.1 LEDA VAR PORTB.6 LEDB VAR PORTB.7 ‘—————————–B A S L A N G I Ç ————————— CMCON=7 CLEAR PAUSE 500 PORTB=0 ‘tüm çıkıslar low seviyesinde ‘——————————————————————————- BASLA: SerIn2 GIRIS,396,[WAIT ("ETE"),AL] IF AL=88 THEN TOGGLE LEDA TOGGLE ROLEA ENDIF IF AL=66 THEN TOGGLE LEDB TOGGLE ROLEB ENDIF PAUSE 200 GOTO BASLA END
Seri haberlesme isinde en önemli faktörlerin basında alıcı ile vericiyi aynı anda karşı karşıya getirmektir. Bunun muhtelif yolları vardır. Senkronizasyon denilen bu islem için genelde kullanılan yöntem önden bir uyandırma sinyalinin gönderilmesi arkasından belirleme datası ve onun arkasından ise esas gerekli olan data nın gönderilmesidir.
Uyandırma sinyali nedir diyeceksiniz buna genellikle preambl sinyali denilmektedir. Uyandırma sinyali bir sinyal kombinasyonudur. Muhtelif sekillerde olabilir. Benim kullandıgım ve olumlu netice aldıgım kombine sinyal asagıdaki sekildedir.
- İlk sinyal %10101 seklinde bir sinyal arkasından %00000 ve onun arkasından ise %11111 seklinde bir sinyal dir. Bunun komut karşılıgı; SEROUT2 CIKIS,396,[REP$AA5,REP$005,REP$FF5]
Haberlesmeye baslamadan önce bu komut verilerek karşı taraftaki devrenin alıs moduna geçmesi saglanır. Bu komutun arkasından esas göndermek istediginiz bilgiler gönderilir. Önce belirleme bilgisi yani; (”E”),(”T”),(”E”) bilgisi burada bir belirleme bilgisidir.
Örnek;
SerOut2 CIKIS,396,[("E"),("T"),(”E”),EKLE]
Pesinden esas göndermeniz gereken bilgi veya bilgiler dizisi gönderilir. Sonuçta yukarıdaki örnekte EKLE adlı degisken de yer alan değer göndermek istedigimiz bilgi olmaktadır.
SerOut2 CIKIS,396,[("E"),("T"),(”E”),EKLE]
Pesinden esas göndermeniz gereken bilgi veya bilgiler dizisi gönderilir. Sonuçta yukarıdaki örnekte EKLE adlı degisken de yer alan değer göndermek istedigimiz bilgi olmaktadır.
Senkron konusunda hata yapılmaması için genelde gönderme komutu birkaç defa arka arkaya tekrarlanır. Sayet yazılan program satırı çok az ise tek komut da yeterli olabilir. Ancak uzun programlarda gönderme komutunun artırılması gerekir.
Örnek olarak;
SerOut2 CIKIS,1646,[("E"),("R"),EKLE]
SerOut2 CIKIS,1646,[("E"),("R"),EKLE]
SerOut2 CIKIS,1646,[("E"),("R"),EKLE]
SerOut2 CIKIS,1646,[("E"),("R"),EKLE]
SerOut2 CIKIS,1646,[("E"),("R"),EKLE]
SerOut2 CIKIS,1646,[("E"),("R"),EKLE]
SerOut2 CIKIS,1646,[("E"),("R"),EKLE]
SerOut2 CIKIS,1646,[("E"),("R"),EKLE]
SerOut2 CIKIS,1646,[("E"),("R"),EKLE]
Örnekte görüldügü gibi en az 5 defa tekrarlanmasında yarar vardır. Bir mahsuru olmadıgı gibi yararı vardır.
Alma komutu tek olabilir. Çünkü senkron saglandıktan sonra gelen sinyallerden birini mutlaka görüp alacaktır. Bu kadar açıklama dan sonra daha komplike bir Seri haberlesme programına geçelim.
Diyelim ki bir televizyona uzaktan kumanda devresi yapmak istiyoruz. Bu devre ile televizyonu açıp kapatmak, volum kontrolu yapmak ve hem Kanal+ ve Kanal- tuşlarını kullanarak kanallar arasında gezinmek hemde sabit kanal (1-5) tuşlarını kullanarak kanal seçmek istiyoruz. İki adet pic kullanacagız. Bu sefer 16F84A kullanalım. Çünki devrenin aslı 16F84 ile yapılmıs idi. Devre şemasını vermeden önce bazı konulara açıklık getirmek gerekiyor.
Volum kontrolu ve program gezinmesi yapacagız. Volum kontrolu için digital pot kullanabilirdik. Ancak program kontrolü açısından bu iside kendimiz yapalım istiyoruz. Hem Volum kontrolu hemde program
gezinmesi için 4051 (Analog swich) kullanacagız.
gezinmesi için 4051 (Analog swich) kullanacagız.
4051’in ABC adres bacakları 1 adet giris-çıkıs bacagı ve bu bacagın seçilen adrese göre Analog olarak bağlanabildigi 8 adet giris-çıkıs bacagı bulunmaktadır. Volum kontrolu için 16 kademe volum elde etmek üzere 2 adet (2×8=16) 4051 kullanacagız ve toplamda 16 adet volum seviyemiz olacak. Program gezinme için toplam 8 adet kanal çıkısımız olacak.
Bahsini ettigim projeyi bizzat uygulama fırsatım oldu. Sistem hala basarı ile çalısmaktadır. İsin mantıgını izah edecek olur isek, verici olarak çalısan pic üzerinde bulunan ;
- açma / kapama tusuna basıldıgında karşı taraftaki pic de bir pin high / low olacak. (toggle çalısma)
- Volum+ tusuna basıldıgında volum artacak yani 2 adet 4051 çıkısları sırası ile konum degistirecek.
- Aynı sekilde Volum- tusuna basıldıgında yapılan isin tersi yapılacak.
- Program+ tusuna basıldıgında program kademesi bir artacak. Basılı tuttukça artam devam edecek.
- Program- tusuna basıldıgında bu sefer seçim isi terse dönecek.
- Sabit program seçme tuşlarından birine basıldıgında ise ilgili tusa karşılık gelen pin karşı tarafta toggle olarak çalısacak. Ancak bu pin açık olan diğer pinleri iptal edip yanlıca kendisi çıkıs verecek. Bir ayrıntıyı daha izah etmekte fayda görüyorum. İki pic arasındaki bağlantıda bir inverter (NOT) kullanılmıstır. Aslında gerekli olmayan bu elemanı Seri haberlesme komutlarında alıcı veya vericiden birini invert edilerek kullanılmasını göstermek amacı ile yaptım.
İste şemamız. Biraz karısık gibi gelebilir ama iyice takip edilirse kimin nereye bağlı oldugu kolaylıkla görülecektir.
Önce Verici Kısmına ait programı verelim;
‘**************************************************************** ‘* Name : Verici4.BAS * ‘* Author : [Erol Tahir Erdal] * ‘* Notice : Copyright (c) 2005 [ETE] * ‘* : All Rights Reserved * ‘* Date : 11.05.2005 * ‘* Version : 1.0 * ‘* Notes : ALICI4.BAS programının vericisidir. * ‘* : * ‘**************************************************************** INCLUDE “MODEDEFS.BAS” TRISA=%11110 TRISB=255 OPTION_REG.7=1 ‘pull-up lar iptal ‘——————————————————————————- CIKIS VAR PORTA.0 VER VAR BYTE TUS VAR BYTE POZ VAR BIT poz=0 ‘——————————————————————————- START : VER=0 TUS=PORTB IF TUS =1 Then BIR ‘basılan veya basılı tutulan tusun değeri IF TUS =2 Then IKI ‘burada okunuyor IF TUS =4 Then UC IF TUS =8 Then DORT IF TUS =16 Then BES IF TUS =32 Then ALTI IF TUS =64 Then YEDI IF TUS =128 Then SEKIZ POZ=0:GoTo START BIR: IF POZ=1 Then START ‘on/off tusu basılı tutuluyor ise islem yapma POZ=1 VER=11 GoTo EXIT ‘On/off tusuna ilk basıldı tus değeri=11 gönder. IKI: VER=22 GoTo EXIT ‘Volum+ tusuna basıldı tus değeri=22 , gönder UC: VER=33 GoTo EXIT ‘Volum- tusuna basıldı tus değeri=33, gönder DORT: VER=44 GoTo EXIT ‘Program+ tusuna basıldı Tus değerini gönder BES: VER=55 GoTo EXIT ‘Program- tusuna basıldı tus değerini gönder ALTI: IF POZ=1 Then START ‘Sabit Program tuşları toggle yapacak POZ=1 VER=66 GoTo EXIT YEDI: IF POZ=1 Then START ‘Sabit program tuşları toggle yapacak. POZ=1 VER=77 GoTo EXIT SEKIZ:IF POZ=1 Then START ’sabit program tuşları toggle yapacak POZ=1 VER=88 EXIT: SerOut CIKIS,T2400,[("A"),VER,13,10] ‘tus değerini gönder, değer ters çevrilmemistir GoTo START END
Program kısa oldugu için preambl sinyali kullanmadık. Simdi Alıcı Kısmını verelim;
‘**************************************************************** ‘* Name : Alıcı4.BAS * ‘* Author : [Erol Tahir Erdal] * ‘* Notice : Copyright (c) 2005 [ETE] * ‘* : All Rights Reserved * ‘* Date : 11.05.2005 * ‘* Version : 1.0 * ‘* Notes : Verici4.BAS programının alıcısıdır. * ‘* : * ‘**************************************************************** TRISA=%00001 TRISB=0 GIRIS VAR PORTA.0 VOLUM VAR BYTE ARA VAR BYTE PROG VAR BYTE ERO VAR BYTE KON VAR BYTE NE VAR BIT SES VAR BYTE POZ VAR BYTE AL VAR BYTE ‘——————————————————————————- INCLUDE “MODEDEFS.BAS” PORTB=0 PORTA=0 Read 0,VOLUM ‘volum değeri Pic’in eepromundan sıfır nolu adresten okunuyor IF VOLUM=255 Then ’sayet herhangi bir değer önceden kayıt edilmemis ise VOLUM=3 ‘default volum seviyesini 3 kabul ediyoruz. EndIF Read 1,PROG ‘hangi programın seçili bırakıldıgını yine eeprom 1 adresten IF PROG=255 Then ‘okuyoruz ve herhangi bir program kayıtlı degil ise PROG=0 ‘default program=0 kabul ediyoruz. EndIF KON=VOLUM>>3 ‘Volum konumu ara değer SES=VOLUM-(KON*8): ‘volum esas değeri ARA=(SES+PROG*8)+128-(KON*64) ‘hem program hemde ses değeri 8 bit olarak PORTB=ARA ‘toparlanıp PortB ye yazılıyor. ‘——————————————————————————- START : AL=0 Serin GIRIS,N2400,[ "A" ],AL ‘Basılan tus bilgisini al IF AL=11 Then BIR ‘basılan tus değeri 11 ise Bir’e git IF AL=22 Then IKI ‘22 ise IKI ye git IF AL=33 Then UC ‘33 ise UC e git IF AL=44 Then DORT ‘44 ise DORT’ e git IF AL=55 Then BES IF AL=66 Then ALTI IF AL=77 Then YEDI IF AL=88 Then SEKIZ POZ=0 GoTo START BIR: Toggle PORTA.1 ‘ON / OFF ‘On/off çıkısı toggle yapıldı CIK:GoTo START IKI:VOLUM=VOLUM+1 ‘ volum tusuna basılmıs volum bir artırıldı IF VOLUM>15 Then ’sayet 15 den büyük ise 15 de kal VOLUM=15 EndIF ‘Volum<8 1.4051="" ise="">8> ‘8 ise 2.ci 4051 devrede olacak VOLKAY:KON=VOLUM>>3 ‘Kon=%00001101 ise Kon=%00000001 oluyor SES=VOLUM-(KON*8) ‘Ses=13-(8×1)=5 bulunuyor. ARA=PORTB & 56 ‘ARA değeri program seçimi için 4051′in adresi ARA=ARA+SES+128-(KON*64) ‘Volum ABC değeri + Prog ABC değeri + PORTB=ARA ‘Volum 4051 seçim değeri tamamı PortB ye yazılıyor Write 0,VOLUM ‘yeni Volum değeri EEPROM’a yazılıyor Pause 44 GoTo START UC: VOLUM=VOLUM-1 ‘Volum- tusuna basılmıs değer bir azaltılıyor IF VOLUM=255 Then ‘değer sıfırı geçerse tekrar sıfırda kalıyor. VOLUM=0 EndIF GoTo VOLKAY ‘degisen volum değerini kayıt et DORT: PROG=PROG+1 ‘program tusuna basılmıs bir artır. IF PROG>7 Then PROG=0 EndIF PORKAY: ARA=PORTB & 199 ‘199=%11000111 olup 4051 select ve adres değerini al ERO=PROG<<3 span="" style="color: green; margin: 0px; padding: 0px;">‘yeni program değerini hesapla ve kayıt et3>
Programlarda özellikle Alıcı programında bazı hesap satırları var bunların açıklanmasında fayda görüyorum.
şemadan görülecegi üzere, B portu B0-B1-B2 pinleri ile Volum için çalısan 2 adet 4051 entegresini adreslemektedir. Adres değeri 0-15 arasında degismekte olup 0-7 arasındaki değerler ilk 4051’i adreslemekte 8-15 arasındaki değerlerde ise otomatik olarak ikinci 4051 seçilerek adres değeri bu entegrenin kullanacagı (0-7) değerine indirgenerek kullanılmaktadır.
B portunun B3-B4- ve B5 nolu pinleri ise program seçimi için kullanılan 4051 entegresini adreslemektedir. Kalan B6 ve B7 pinleri ise Volum entegrelerinden hangisi seçilecek ise onu aktif hale getirmek için kullanılmaktadır (chip Select). Simdi hesap sistemini inceleyelim. Önce Volum kayıt bölümüne bakalım;
KON=VOLUM>>3 ilk satırda bu komut bulunmaktadır. Volum değerini 3 bit saga kaydırıp yeni değeri KONadlı degiskene yerlestir anlamındadır. Neden bu isi yaptıgımızı bir sonraki satırda açıklayacagız. Sonra gelen satırda ;
SES=VOLUM-(KON*8) seklinde bir islem var. 2 adet 4051 entegremiz var ama her ikiside aynı adreslemeyi kullanıyor. Dolayısıyla adres olarak verecegimiz değer 0-7 arasında olacaktır. Halbuki bizim Volum değerimiz 0-15 arasında değişiyor. Bu hesap ile Ses seviye adreslemesini volum değerine bağlı olarak 0-7 seviyesine düsürmekteyiz.
Diyelim ki Volum seviyemiz 14 olsun. Bu durumda KON= 14 >> 3 = %00001110 değeri %0000001olacaktır. Yani KON=1 olacaktır. SES=14 – (1*8) = 6 yani volum için 4051 adres değeri 6 (%00000110 )olacaktır. ARA=PORTB & 56 (56=% 00111000 dir ve bu program seçme adres değeridir)ARA=ARA+SES+128-(KON*64) Volum için hangi 4051 seçili olacak buna 128-(Kon*64) hesabı karar vermektedir.
Örnegimizde Kon=1 idi 64*1=64 olup 128-64=64 olacaktır. Dolayısıyla B6 veya B7 den hangisi Low ise ona bağlı entegre seçilmis olmaktadır. Bu hesap sonucunda B7’ye bağlı olan entegre seçilmis olacak çünki volum değeride 14 idi yani 7 den büyük idi. Volum değeri 8 den küçük olur ise yukarıdaki hesap 128 olarak çıkacak olup böylece ilk 4051 seçilmis olur otomatikman. Böylece PortB deki tüm bitlerin durumunu hesap etmis oluyoruz.
Bunları toplar isek; ARA= ARA + 6 + 64 = ARA+70 olarak bulunan değer direkt Port B ye yazılarak islem
tamamlanır. Benzer bir hesap Program tusuna basılınca da yapılmaktadır. Bu hesabın çözümünüde size
bırakıyorum.
tamamlanır. Benzer bir hesap Program tusuna basılınca da yapılmaktadır. Bu hesabın çözümünüde size
bırakıyorum.
Bu program içinde geçen ara komutlara bir göz atmakta fayda var. Bunların basında READ ve WRITEkomutları geliyor.
Pic lerin pek çogunda eeprom hafızası oldugunu hepimiz biliyoruz. Bazı durumlarda bu hafızaları kullanmak gerekir. Elektrik ile yazılıp silinen bir hafıza oldugundan yazılan bir değer özellikle silinmedikten sonra Pic’in voltajını da kesseniz silinmez. Bu yüzden saklanması gereken bilgiler burada saklanabilir. Bu programda da Volum ve Program değerleri bu hafıza da saklanmıstır. Bu sayede televizyonu kapattıgınız anda hangi programda kaldınız ise ve volum seviyeniz ne ise tekrar açtıgınızda aynı seviyelere ulasmıs oluyorsunuz.
Simdi gelelim komutlar nasıl kullanılıyor.Pic hafızaları 8 bitlik yani 1 baytlık hafızadır. Her hafızanın 0 (sıfır) dan baslayan bir adres numarası vardır. Bu adres numarası kullanılarak istenilen bir adresteki hafızaya ulasılabilir.Hafıza ya yazma için kullandıgımız komut WRITE dır. Parametreleri Adres ve yazılacak değerdir. Yani komut;
WRITE 0 (adres), BILGI (yazılacak değer) olarak çalısmaktadır. Hafıza dan okuma yapmak için kullandıgımız komut ise READ komutudur. Aynı sekilde adres ve değer parametresi vardır.
Kullanılıs sekli;
READ 0(adres), BILGI (okunacak değer) olarak dır. Yazma ve okuma islemi yaklasık 10 ms kadar bir sürede yapılır. Sayet program içinde kesme kullanılıyor ise hatalar ortaya çıkabilir. Bunu önlemek için bu komutlardan önce kesme iptal edilmelidir (disable ile degil direkt iptal) . İslemden sonra kesme tekrar açılmalıdır.
8.ders:
Bu dersimizde Pic mikro işlemcilere dışarıdan bağlanan aletleri inceleyeceğiz. Dışarıdan bağlanabilen aletler olarak;
1. Tuş takımları (keyboard)
2. LED display ler
3. Port Çoğullayıcılar
1. TUŞ TAKIMI KONTROLU:
Tuş takımları matriks bağlantı şeklinde çalışırlar. Yatay ve dikey hatları vardır. Tuşun birisine basıldığı zaman tuşun bağlı olduğu yatay hat ile dikey hat tuş üzerinden kısa devre edilir. Hatlardan birisini siz lojik olarak kontrol edersiniz diğerine ise lojik olarak bakarsınız. Bir örnekle açıklamak daha uygun olacak sanırım Diyelim ki aşağıdaki şekilde bir tuş takımını kontrol etmek istiyoruz.
Amacımız basılan tuşun değerini ekranda göstermek tabii ki sonra bu değerleri bir işte kullanmak. Tuş takımında 1-2-3 numaralarla işaretlenen dikey hatları PortB de 1-2-3 nolu pinlere bağlayıp bunları giriş olarak ayarlıyoruz. A-B-C-D olarak işaretlenen yatay sıraları ise PortB de 4-5-6 ve 7 nolu pinlere bağlayıp bu pinleri de çıkış olarak ayarlıyoruz.
Burada önemli olan bir nokta var. Giriş olarak ayarlanmış pinlerin ya pull-up veya pull-down yapılması gerekmektedir. Biz örneğimizde PortB nin kendisinde olan Pull-Up dirençlerini kullanarak giriş pinlerini Pull-Up’lı olarak kullanacağız. Şimdi gözünüzde canlandırmanızı isteğim bir durum var. Dikey hatlar pull-up lı olarak High seviyesinde bekliyorlar.
Yatay hatların hepsinde çıkış olarak ayarlandı ve bunların hepsine de High uyguluyoruz. Sonuçta tuş takımına baktığımız anda yatay ve dikey hatların tamamı lojik-1 seviyesinde olduğunu görüyoruz. Şimdi basılan tuşu tespit etme işine başlayabiliriz. A ile isimlendirilen Yatay hattı (çıkış olarak ayarlanmış idi) LOW yapıyoruz. Tuş takımında şimdi yalnızca A yatay hattı LOWLOW olur. seviyesindedir. Şimdi bakalım, şayet ben 1 nolu tuşa basar isem ne olur? Tabiiki yatay hat ile dikey hat kısa devre olacağından 1 nolu dikey hat hemen
Şayet 2 nolu tuşa basar isem bu defada 2 nolu dikey hat LOW olur. Aynı şekilde 3 nolu tuşa basar isem 3 nolu dikey hat LOW olur. işte bu özellikten yararlanarak basılan tuşu tespit edebiliriz.
işe şöyle başlarız;
LOW YATAY-A ‘Önce A yatay hattını LOW yaparız. IF Dikey-1=0 Then TUS=1 ‘Şayet Dikey-1 LOW ise demek ki basılan Tuş=1 dir. IF Dikey-2=0 Then TUS=2 ‘Şayet Dikey-2 LOW ise demek ki basılan Tuş=2 dir. IF Dikey-3=0 Then TUS=3 ‘Şayet Dikey-2 LOW ise demek ki basılan Tuş=3 dür.
Buraya kadar 1. yatay sıradaki tuşları kontrol etmiş olduk. Şimdi 2. yatay sıradakileri kontrol edelim,
LOW YATAY-B IF Dikey-1=0 Then TUS=4 ‘Şayet Dikey-1 LOW ise demek ki basılan Tuş=4 dir. IF Dikey-2=0 Then TUS=5 ‘Şayet Dikey-2 LOW ise demek ki basılan Tuş=5 dir. IF Dikey-3=0 Then TUS=6‘Şayet Dikey-2 LOW ise demek ki basılan Tuş=6 dür.
Buraya kadar 2. yatay sıradaki tuşları da kontrol etmiş olduk. Şimdi 3. yatay sıradakileri kontrol edelim,
LOW YATAY-C IF Dikey-1=0 Then TUS=7 ‘Şayet Dikey-1 LOW ise demek ki basılan Tuş=7 dir. IF Dikey-2=0 Then TUS=8 ‘Şayet Dikey-2 LOW ise demek ki basılan Tuş=8 dir. IF Dikey-3=0 Then TUS=9‘Şayet Dikey-2 LOW ise demek ki basılan Tuş=9 dür.
Buraya kadar 3. yatay sıradaki tuşları da kontrol etmiş olduk. Şimdi 4. yatay sıradakileri kontrol edelim,
LOW YATAY-D IF Dikey-1=0 Then TUS=11 yani ( * ) tuşu‘Şayet Dikey-1 LOW ise demek ki basılan Tuş=11 dir. IF Dikey-2=0 Then TUS=0 ‘Şayet Dikey-2 LOW ise demek ki basılan Tuş=0 dır. IF Dikey-3=0Then TUS=12 yani ( # ) tuşu‘Şayet Dikey-2 LOW ise demek ki basılan Tuş=12 dir.
Bu şekilde tuşların tamamını kontrol etmiş oluyoruz. işin temeli bu kadardır. Kısaca tekrarlamak gerekir ise ya dikey yada yatay hatların tamamını giriş olarak ayarlayın. Bunları giriş yaptınız ise , Pull-up (veya Pull-down) dirençleri ilave edin.
Matriks in diğer ucundaki hatları ise çıkış olarak ayarlayın. Sonra sıra ile çıkış olarak ayarladığınız sıraları lojik seviyesini değiştirerek girişte aynı değişikliği arayın. Olan var ise aynı hatlara bağlı tuş basılmış demektir.
Şimdi tuş konusu ile ilgili program örneğimizi verelim.
‘********************************************** ‘* Name : TUSTAKIMI.BAS * ‘* Author : [E.T.E] * ‘* Notice : Copyright (c) 2005 Ete] * ‘* : All Rights Reserved * ‘* Date : 24.06.2005 * ‘* Version : 1.0 * ‘* Notes : * ‘* : * ‘**************************************************** trisa=%00000000 trisb=%00001110 @ device pic16f628a @ device pic16f628a, wdt_off @ device pic16f628a, pwrt_on @ device pic16f628a, protect_off @ device pic16f628a, mclr_off @ DEVICE pic16F628a, INTRC_OSC_NOCLKOUT CMCON=7 OPTION_REG.7=0 ‘pull-up dirençleri aktif tus var word Define LCD_DREG PORTA Define LCD_DBIT 0 Define LCD_RSREG PORTA Define LCD_RSBIT 4 Define LCD_EREG PORTA Define LCD_EBIT 6 Define LCD_BITS 4 Define LCD_LINES 2 Symbol YATAY_A= PORTB.4 Symbol YATAY_B= PORTB.5 Symbol YATAY_C= PORTB.6 Symbol YATAY_D= PORTB.7 Symbol DIKEY_1= PORTB.1 Symbol DIKEY_2= PORTB.2 Symbol DIKEY_3= PORTB.3 Tus=0 Pause 200 Lcdout $fe, 1 BASLA: PORTB =254 YATAY_A=0 If DIKEY_1=0THEN Tus=1:GOSUB EKRAN While DIKEY_1=0 Wend Endif If DIKEY_2=0 Then Tus=2:GOSUB EKRAN While DIKEY_2=0 Wend Endif If DIKEY_3=0 Then Tus=3:GOSUB EKRAN While DIKEY_3=0 Wend Endif High YATAY_A YATAY_B=0 If DIKEY_1=0 Then Tus=4:GOSUB EKRAN While DIKEY_1=0 Wend Endif If DIKEY_2=0 Then Tus=5:GOSUB EKRAN While DIKEY_2=0 Wend Endif If DIKEY_3=0 Then Tus=6:GOSUB EKRAN While DIKEY_3=0 Wend Endif High YATAY_B YATAY_C=0 If DIKEY_1=0 Then Tus=7:GOSUB EKRAN While DIKEY_1=0 Wend Endif If DIKEY_2=0 Then Tus=8:GOSUB EKRAN While DIKEY_2=0 Wend Endif If DIKEY_3=0 Then Tus=9:GOSUB EKRAN While DIKEY_3=0 Wend Endif High YATAY_C YATAY_D=0 If DIKEY_1=0 Then Tus=11:GOSUB EKRAN While DIKEY_1=0 Wend Endif If DIKEY_2=0 Then Tus=0:GOSUB EKRAN While DIKEY_2=0 Wend Endif If DIKEY_3=0 Then Tus=12:GOSUB EKRAN While DIKEY_3=0 Wend Endif High YATAY_D pause 100 Goto BASLA EKRAN: Lcdout $fe,1,”Tus= “,#tus pause 50 RETURN END
2. LED DISPLAY KONTROLU:
Led display ler 7 segment display ler olarak piyasada isimlendirilmektedirler. Genelde ortak Anot ve ortak Katot bağlantılı tipleri mevcuttur. Ortak Anot olanlar ortak şase olarak + beslemeyi, Ortak Katot olanlar ise ortak şase olarak GND yi kullanırlar. Biz örneklerimizde ortak katot display’i inceleyeceğiz. Tercihimiz yalnızca anlatım kolaylığı açısındandır. 7 segment display in A-B-C-D-E-F-G olarak adlandırılan pin uçları vardır. Her bir pin’e High uygulanır ise bağlı olduğu segment ışıldar.
Bu sistemle display üzerinde sayılar oluşturulur. Normal olarak her bir display in (Ortak Anot veya Katot) kendi sürücüleri vardır. Bu sürücüler genelde ABCD olarak BCD (Binary Coded Desimal) olarak sürülürler. Yani siz ABCD girişlerine bir rakam verirseniz yonganın diğer ucu display’e bağlı olduğundan verdiğiniz rakam display’de görülür. Ancak bu sürücüler yalnızca 0-9 arası rakamları görüntüleyebilirler. Bunun dışında displayin gösterebileceği karakterleri gösteremezler. Bu nedenle Pic işlemcilerle birlikte bu sürücüler genelde kullanılmaz.
Bu kadar teorik bilgi verdikten sonra konunun Pic işlemcilerle olan alakasına geçelim. Pic işlemcilerle bu tip display leri kullanırken birkaç teknik kullanılır. Şayet özel karakter yazdırılmayacak ise genelde 4511 tipi bir sürücü kullanılır. Bu sürücünün çıkışları LATCH yani kilitli olduğundan pic ile kullanmaya ve mültipleks çalışmaya son derece elverişlidirler. Özel karakterlerin kullanılması durumunda yine Latch (kilit) leri olan shift register (seriden paralele çevirici) kullanmak en uygunu olacaktır. Bu konuda da en iyi yongalardan biriside 74HC595 tir.
Öncelikle 4511 li bir uygulamayı inceleyelim. işin temelinde görüntülenmesi gereken her bir bilgi (dijit) ortak bilgi hatta verilir. Sonradan bu bilginin istenen led display’de görüntülenmesini sağlamak amacı ile yalnızca o displayin latch (kilidi) açılarak ortak hattan gelen bilginin çıkışa aktarılması sağlanır. Bu bilgi tekrar değiştirilinceye kadar çıkışta kalacağı için display’de bir titreme (yanma¬sönme) olmadan istenen bilgi görüntülenmiş olur.
Şekilde görülen devre bir encoder den gelen palsları sayan bir devredir. Sayılan değer led display den görüntülenmektedir. Şekilde görüldüğü gibi, 4511 lerin ABCD girişleri ortak hatlar olarak kullanılmış ve bu girişler Pic 16F628 ‘in PortA da 0-1-2 ve 3 nolu port uçlarına bağlanmıştır. 4511 lerin segment çıkışları led display’lere bağlanmış ve en önemlisi 4511 lerin LatchEnable (LE) uçlarının her biri pic in bir pinine bağlanmıştır.
Şimdi, 4511 lerin tüm ABCD girişleri ortak bağlantı şeklinde olduğundan Pic den ABCD bilgisi olarak bir bilgi çıkarırsak ve latch ları enable (LOW a çekilir ise) yaparsak verdiğimiz bilgi tüm displaylarda görülür. Örneğin 2 bilgisini oluşturacak şekilde ABCD girişlerine %0010 bilgisini verirsem tüm display’lerde 2 rakamını görürüm.
Şayet ben 2 rakamının yalnızca ilk (soldan birinci) displayda görülmesini ister isem o zaman yalnızca ilk 4511’in LE ucunu (normalde sürekli HiGH da duruyor) önce Low yapar sonra tekrar High yaparım. Diğerlerine dokunmam. Bu durumda ilk display de 2 rakamını okurum. Diğerleri önceden ne kayıtlı ise o rakamları göstermeye devam ederler. işte bu teknik ile son derece hızlı bir şekilde ve ekranda titreme olmaksızın rakamlar görüntülenebilir.
Şimdi konuyla ilgili program örneğimizi yapalım. Aşağıdaki programda iki tane buton var. Ayrıca 2 adet Led display göreceksiniz. Tuşlardan üstte olana basılınca sayı bir artırılacak ve artırılan sayı ekranda görülecek. Alttakine basılınca da sayı bir azaltılacak ve yine sayı display de gözlenecek. Önce devremiz;
Kodlar:
Daha öncede belirttiğim gibi 4511 kullanarak yalnızca sayıları display da görüntüleyebiliriz. Aynı display bize C veya
(0) şeklini de gösterebilir veya (-) eksi işaretini gösterebilir. Örnek olarak bir sıcaklık göstergesi yaptık ve display de 23,3 0C şeklini görmek istiyoruz. işte bu durumda 4511 display sürücüsünü kullanamayız. Bu durumda kullanılacak en uygun yonga 74HC595 shift registerdir.
Şimdi bu yonganın kullanımına bir örnek verelim,
Şimdi aynı ekranın diğer karakterler ile nasıl göründüğüne bakalım.
Görüldüğü üzere 74HC595 bize istediğimiz görüntü imkanlarını sağlayabiliyor. Şimdi bu yonganın nasıl çalıştığına ve kontrol edildiğine bir bakalım.
16 Pin li bir yonga olan 74HC595 in en önemli özelliği data bacağı (14 nolu pin) ile Clock bacağı (11 nolu pin) kullanılarak seri yoldan bilgi registerine yazılabiliyor. Ancak yazılan bu bilgi hemen çıkışta görülemiyor. Görülebilmesi için bilgi aktarma bacağı olan (12 nolu pin) pine bir clock palsının uygulanması gerekiyor. Bu özellik bize bu yonganın display sürücüsü olarak kullanılması imkanını veriyor. Basic de Shiftout komutunun olduğunu biliyorsunuz. Bu komut bize datapin, clockpin, mode , (değişkenler) şeklinde kullanılarak 8 bitlik bir bilginin seri olarak gönderilmesini sağlar. Komutun parametrelerinden biri olan Mode ise bilgi göndermede aşağıdaki işlemler için kullanılır;
0. Önce 0 nolu data bitini çıkışa ver ve en sonda 7. biti gönder. Sonuçta Clock Low da kalsın.
1. Önce 7. biti , en sonda 0. biti gönder ve Clock Low da kalsın.
4. Önce 0. Biti, en sonda 7. biti gönder Clock High da kalsın
5. Önce 7. biti ve en sonda 0. biti gönder ve Clock High da kalsın.
74HC595 Shift Register de işlemler kontrol pinleri LOW da iken yapılmaktadır. Bu nedenle biz mode olarak 2. seçeneği seçeceğiz. Bunun Mode değeri 1 dir.
Yonganın kullanımına geçmeden bir LED display de karakterler nasıl oluşuyor bu konuyu biraz incelememiz gerekecek. Sıfır rakamının displayda oluşması için , segmentlere kontrol eden bitlerden,
olması gerekiyor. Aynı şekilde 1 rakamını görebilmek için sağda yer alan 1 ve 2. bitlerin bir diğerlerinin sıfır olması gerektiğini hemen anlamışsınızdır. Yine 3 rakamını oluşturmak için 0,1,2,3 ve 6. bitlerin bir diğerlerinin sıfır olması gerekir. Aynı mantık ile sayılar veya karakterlere göre bitlerin durumunun ne olması gerektiğini aşağıda belirtmekteyiz.
Şimdi 74hc595 yongasına yukarıda belirtilen karakterlerin görüntülenebilmesi için karakterlerin sayı karşılığının nasıl verileceğini inceleyelim.
Önce bir LOOKUP tablosu yapıyoruz. Lookup bir Basic komutudur. indeks kullanılarak indeks değerine karşılık gelen sıradaki değerin tablodan alınmasını sağlar. Bizim Lookup tablomuz aşağıdaki gibi olacaktır. Burada X bizim indeksimiz olacak ve tablodaki sayılarda sırası ile 0,1,2,3,4,5,6,7,8,9, 0,C karakterlerine karşılık gelmektedir. Şimdi X=3 şeklinde X (indeks) değişkenine 3 sayısını verip Lookup tablosuna gönderir isek, 3. sıradaki değer SAYI değişkenine koyularak geri dönecektir. Yani ; X=3:GOSUB LOOKUP şeklinde bir program komutu verir isem dönüşte SAYI=79 olarak gelecektir. Bunu öğrendikten sonra şayet ben göstereceğim karakterlerin sayı karşılıklarını bu tablodan alıp Shift Registere verir isem ve registerin çıkışlarına display bağlar isem istediğim karakteri görüntüleme şansım olacaktır. işte 74HC595 kullanmanın mantıksal temeli budur. Şimdi bir Lookup tablosu oluşturup, bu tablodan aldığımız değeri 74HC595 yongasına yazalım.
X=5 ‘yani görüntülemek istediğim karakter “5” olacaktır. GOSUB TABLO ‘Tabloya git ve 5 indeksine karşılık gelen 109 sayısını SAYI değişkenine koy ve dön SHIFTOUT DataPin , ClockPin ,1, [SAYI] ‘sayı değerini bit-bit clock ve data pinleri kullanarak ilet. HiGH AktarPini (Latch) : PAUSEUS 2 : LOW AktarPini ‘burada registere yazılan sayı bilgisinin aktarma pinine bir
‘pals verilerek yani önce HiGH ve sonra LOW yapılarak çıkışa verilmesi sağlanıyor. TABLO: LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN
Kısaca özetler isek, görüntülemek istediğimiz karakterin sayısal karşılığını tespit edip bu sayıyı Shiftout komutu ile Shift registere yazıyoruz. Sonra, registerin aktarma pinine bir pals uyguluyoruz (HiGH – LOW) ve böylece registere yazdığımız bilgi register çıkışlarına aktarılmış oluyor. Bu bilgi değiştirilinceye kadar çıkışta kalmaktadır. Böylece sürekli olarak display’e verilen bu bilgi sayesinde display de istediğimiz karakterin sürekli görülmesini sağlamış olmaktayız.
işin görüntüleme kısmını öğrendikten sonra geriye istediğimiz display de istediğimiz bir karakterin görüntülenmesini sağlamak kalıyor. Bu işlem bir önceki konuda bahsettiğimiz mantıkla yapılmaktadır. Yani hangi display’e yeni karakter verecek isem sadece onu süren Shift Registerdeki bilgiyi yenilerim . Böylece istediğim display de istediğim görüntüyü elde etmiş olurum. Açıklamalarımızı bir örnek ile pekiştirelim. Konunun başında vermiş olduğumuz devre bir Saat + Termometre devresidir. Program ekranda hem saati hemde sıcaklık değerini görüntülemektedir.
Bu sistemin programı aşağıda verilmektedir.
3. PORT ÇOĞULLAMA :
Bildiğiniz gibi pic işlemcilerin sınırlı sayıda giriş ve çıkış pinleri bulunmaktadır. Bazı durumlarda bu pinler ihtiyacımızı karşılamaz ve daha fazla çıkış veya giriş pinine ihtiyaç duyarız. işte bu gibi durumlarda kullanabileceğimiz yongalar mevcuttur. ilk inceleyeceğimiz konu çıkış çoğullama olacaktır. Diyelim ki birkaç tane port pini kullanarak daha fazla çıkış pinine sahip olmak istiyoruz.
Bu gibi durumlarda kullanabileceğimiz güzel bir yonga var adı 74HC595 shift register. Bu yongayı daha önce saat örneğimizde incelemiş idik. Burada kısaca tekrar nasıl çalıştığını ve bu yongadan nasıl yararlanacağımız açıklayalım. 16 Pin li bir yonga olan 74HC595 in en önemli özelliği, data bacağı (14 no lu pin) ile Clock bacağı (11 no lu pin) kullanılarak seri yoldan bilgi registerine yazılabiliyor.
Ancak yazılan bu bilgi hemen çıkışta görülemiyor. Görülebilmesi için bilgi aktarma bacağı olan (12 no lu pin) pine bir Clock palsının uygulanması gerekiyor. Bu durumda 3 adet pin kullanarak 8 adet çıkış elde edebiliriz demektir. Zira 74HC595 çıkış pinlerini sanki pic’e ait çıkış pinleri olarak kullanabilirim. Bunun için önce hangi pinden High , hangi pinden Low çıkarmak istiyor isem bununun binary karşılığını bulurum.
Örnek vermek gerekir ise; Çıkarmak istediğim bilginin bit karşılığı şöyle olsun %11001100 bu binary sayının desimal karşılığı 204 dür. Demek ki ben 74HC595’e 204 bilgisini seri olarak verirsem ve registere yazılan bu bilgiyi sonradan çıkışa aktarırsam çıkışta %11001100 bilgisini görebilirim.
ilk örneğimiz bahsini ettiğimiz basit örnek olacaktır. Yalnızca 3 adet bacak kullanarak 8 adet çıkış elde edeceğiz. Programda BILGI adında bir değişken tanımlayıp sırasıile 1 – 2 – 4 – 8 – 16 – 32 – 64 – 128değerlerini almasını sağlayacağız. Bu değerler 8 bitlik bir sayının bitlerinin rakam karşılıklarıdır. Bu değerleri verdiğimizde 74 HC 595’in çıkışlarının sırası ile HiGH olduğunu göreceksiniz.
Önce devremizi verelim;
ve programımız;
Burada bir soru sormak isterim. 74HC595’in çıkışlarını 1-8 arası numaralandırırsak, Diyelim ki 3 ve 6. pinlerden High çıkarmak istiyorum. Ne yapmalıyım?.
Cevap basit tabii ki. isteğimin binary karşılığı %00100100 ve desimal karşılığı ise 36 rakamıdır. Dolayısı ile programı aşağıdaki şekilde verir isek istediğimiz yerine gelecektir.
BILGI=36
SHIFTOUT DTA,CLK,1,[BILGI]
HIGH AKTAR
PAUSEUS 5
LOW AKTAR
Bu satırların sonunda istediğim bitler High olacaktır.
Görüldüğü üzere yalnızca 3 bit (pin) kullanarak 8 adet çıkış elde ettik. O halde 6 adet pin kullanır isek toplam 16 adet çıkış yapabiliriz. Bunu da size ödev olarak bırakıyorum.
Giriş Çoğullama için 74165 yongasını kullanacağız. Bu bir paralel yüklemeli 8 bit seri shift Registerdir. Şimdiye kadar gördüğümüz shift registerlerinde data seri girilip çıkış 8 bit paralel olarak alınıyor idi. Şimdi bu işlemin tersini yapacağız.
Yani datayı 8 bit paralel girip bu bilgiyi 8 bit seri bilgi haline çevireceğiz. Girişleri input olarak kullanabileceğimiz için yine 3 adet pin kullanarak 8 adet giriş elde etmiş olacağız. Öncelikle 74165 yongasını biraz incelememiz gerekiyor.
8 adet (D0-D7) data girişi bulunmakta 1 adet Clock girişi (2 nolu pin) 1 adet Data çıkışı (9 nolu pin) ve 1 adet Paralel Load pini (1 nolu pin) bulunmaktadır. Girişler D0-D7 data pinlerinden yapılmakta, Paralel load pinine bir pals uygulanarak giriş bilgilerinin dahili registere yazılması sağlanmakta ve sonradan Clock ve Data pini kullanılarak registerdeki bilgi D7-D0 olarak yani tersten başa doğru seri olarak alınmaktadır. Açıklamalarımızı bir programla uygulayalım.
Önce Devremiz,
Devremiz ve yazacağımız programda amacımız tuşlardan hangisine basarsak karşılığı olan biti PortB de High yapmak. Yani 1 nolu tuşa basmış isem PortB.0 High olacak. Aynı şekilde şayet 8 nolu tuşa basmış isem PortB.7 High olacak.
Şimdi programımızı inceleyelim.
Aslında gördüğünüz gibi program gayet basit ve kısa. Tuşlardan birine bastığım anda bilgi registere aktarılıyor ve seri olarak okunup PortB ye veriliyor. Hepsi bu kadar.
Bir programda hem giriş hemde çıkış çoğullama sı yapabilirsiniz. Bunun için iki ayrı Clock ve iki ayrı data pini sembol olarak tanımlanmalıdır. Tabiiki aktarma pinleri de farklı olacaktır. Bunlara dikkat ettikten sonra program yukarıda verilenler örnek alınarak kolaylıkla yapılabilir.
Kaydol:
Kayıtlar (Atom)