1.ders:
‘bu satırda sayı=100 olacaktır . Burada sayı değişkenini tekrar sıfırlıyoruz.
SAYI=0
ARA: LCDOUT “ SAYI = “,#SAYI ‘ilk satıra Sayı Desimal olarak yazıldı
LCDOUT $FE,$C0,” Hex = “,HEX2 SAYI ‘ikinci sıraya Hex olarak yazıldı.
PAUSE 500
SAYI=SAYI+10 ‘Sayı değeri 10 artırıldı
IF SAYI<250 ara="" span="" style="color: green; margin: 0px; padding: 0px;" then=""> ‘sayı değeri 250 den küçük ise ARA’ ya git
END ‘SAYI=250 olunca programı bitir.250>
Pic Micro işlemciler hakkında kısa bilgi:
Pic mikro işlemciler teknik özellikleri ve kılıfları açısından farklılıklar gösterirler. Her şeyden önce birden fazla bacağa (pin) sahip olan işlemcilerin bacakları giriş veya çıkış olarak çalıştırılabilirler. Özellikleri açısından da bir kere programlanabilenler (C serisi) programları ultraviyole ile silinip yeniden programlanabilenler ve birden fazla silinip programlanabilenler olarak sınıflandırılabilirler. Biz genelde FLASHolarak tarif edilen birden fazla silinip programlanabilen tipler üzerinde çalışacağız.Pic’ler taşıdığı ekstra özellikler açısından da bir kaç kategoriye ayrılırlar. Örnek olarak üzerin de;
1) Analog-Digital Çeviricisi olanlar,
2) Komparatör olanlar,
3) Donanımsal olarak seri haberleşme ünitesi olanlar,
4) HPWM ünitesi olanlar gibi Pic’ler mevcuttur. İleriki bölümlerde bunların kullanımına ait örnekler vereceğiz.
2) Komparatör olanlar,
3) Donanımsal olarak seri haberleşme ünitesi olanlar,
4) HPWM ünitesi olanlar gibi Pic’ler mevcuttur. İleriki bölümlerde bunların kullanımına ait örnekler vereceğiz.
Pic işlemcilerin pinlerinin hem giriş hem de çıkış olarak çalıştırılabildiğinden bahsetmiş idik. Açıklamalarımızla ilgili uygulamalarımıza “Proje” adını vereceğiz ve her projemizin bir numarası olacaktır. Şimdi Pic lerinin organizasyonu işlemlerine kısa bir göz atalım.
Kullanacağımız Pic 16F84A olacak. Bu işlemcinin toplam 18 bacağı vardır.5 nolu bacak(-),ve 14 nolu bacak(+) besleme ,15-16 nolu bacaklar (XTAL) osilatör bacakları ve PortA (0-4 arası 5 adet pin) < 17,18,1,2,3 nolu bacaklar > ve PortB (0-7 arası 8 adet pin) <6 bacaklar="" nolu=""> olmak üzere toplam 13 adet (Giriş-Çıkış) pin’e sahip bir işlemcidir.6>
PIC16F84 Pin Bilgileri
İlk projemize geçmeden, anlatımda lazım olacak olan BASIC de kullanılan sayı gösterim formatları konusunda biraz bilgi vermek istiyorum. Bildiğiniz gibi kullanacağımız 3 tür sayı formatı vardır. Formatlar ve gösterim şekilleri aşağıda verilmiştir.
1) Desimal Sayılar (10 tabanına göre düzenlenmiş sayılar):direkt kullanılırlar 12 -23 gibi
2) Hexadesimal Sayılar (16 tabanına göre düzenlenmiş sayılar) : başlarına $ işareti koyularak gösterilirler. $1F , $31 gibi
3) Binary Sayılar (2 tabanına göre düzenlenmiş sayılar) : ise başlarına % işareti koyularak gösterilirler. %111000 , %0001 gibi.
Sıklıkla kullandığımız sayı sistemi desimal olduğundan diğer sayıların kolayca anlaşılabilmesi için zaman zaman bu sayıların 10 tabanına çevrilmesi gerekir. Aşağıda bu işlemin nasıl yapıldığını basitçe göreceksiniz. Bu işlemde temel formül; aynı on tabanına göre sayılarda olduğu gibidir. Sağdan sola doğru haneler sayı tabanının katları şeklinde değer alırlar. Yani değişen tek şey taban çarpım değeridir. Örnekle daha iyi anlayacaksınız.
Hexadesimal sayılar : 0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F: Örnek sayımız <3f> olsun. 16 tabanlı sayı formatı olduğundan;16′lar hanesi olan 3 sayısı 16 ile çarpılıp F sayısının desimal karşılığı bu sayıya eklenir. Dolayısıyla; 3F = 3 x 16 + 15 = 63 olarak bulunur. Şayet sayı 23F olsa idi sayımız= 2 x 256 + 16 x 3 + 15= 575 olarak bulunacak idi.3f>
Binary sayılar; 0-1 , örnek sayımız %11101101 olsun. Hanelerin taban sayısının katları şeklinde gittiğini biliyoruz. O halde sağdan itibaren ilk sayımız hane değerleri şöyle olacaktır. sayı sırasına göre verir isek 128 – 64 – 32 – 16 – 8 – 4 – 2 – 1 Bu sisteme göre sayımızı desimal değere çevirelim; %11101101: 128×1 + 64×1 + 32×1 + 16×0 + 8×1 + 4×1 + 2×0 + 1= 128+64+32+8+4+1=237 olarak bulunacaktır.
En çok kullanacağımız sayı formatlarından birisi olan Binary sayı formatının kullanım yerine bir örnek vermek bu aşamada iyi olacaktır sanırım. Bir Pic’in B portuna bağlı olan Led lerden 0-3-4-6-ve 7 nolu pinlere bağlı olanları bir seferde yanar hale getirebilmek için porta verilecek değeri desimal olarak hesaplayalım. Bu durumda PortB=%11011001 olacaktır.Desimal değeri = 128+64+16+8+1= 217 olarak bulunur.
İlk projemiz, PIC16F84A işlemcinin Tüm bacaklarını çıkış olarak ayarlamak ve bu çıkışlara bağlanacak LEDlerin değişik aralıklar ile yanmasını gösteren bir program olacaktır. Bu arada amaç, Pic lerin bacaklarının nasıl çıkış olarak ayarlandığını öğrenmek olacaktır.
Pic lerde bacakların giriş veya çıkış olarak ayarlanmasını üstlenen bir REGISTER (Türkçe’si YAZMAÇ) vardır. Her bir port için ayrı olan bu registerler A portu için TRISA , B portu için ise TRISB olarak adlandırılır. Tris yazmaçları aslında Pic’in hafızasında 8 bitlik birer hafızadırlar. Buraya yerleştirilen sayının Binary formatındaki şekline bağlı olarak Pic bacaklarını giriş veya çıkış olarak ayarlar.8 bitlik değer sırası ile port’a ait pinleri temsil etmektedir.
Şöyle ki;
A) %00000000, ifadesi 8 bitlik Binary bir sayıdır. Desimal karşılığı 0 (sıfır) dır. Bu değeri herhangi bir TRIS registerine verir isek tüm pinlerin OUTPUT yani çıkış olarak ayarlanacağını ifade eder.
B) Şayet değer %11111111 olur ise tüm bacakların INPUT yani giriş olarak ayarlanacağını ifade eder.
Binary değerin bazılarının sıfır (0) bazılarının bir(1) olması ise bazı pinlerin çıkış bazılarının ise giriş olarak ayarlandığını gösterir. Şimdi açıklamamızı program şeklinde verelim.
TRISA=%00000 ‘A portu Çıkış olarak ayarlandı
TRISB=%00000000 ‘B portu Çıkış olarak ayarlandı
TRISB=%00000000 ‘B portu Çıkış olarak ayarlandı
Çıkış olarak belirlediğim portun çıkış değerini Low (0) olarak ayarlamak için şu şekilde bir ifade yazabilirim.
PORTA=0 ‘A portu tüm çıkışlar Low (0)
PORTB=0 ‘B portu tüm çıkışlar Low (0) Eğer High yapmak isteseydim
(PORTA=1),(PORTB=1)şeklinde yazacaktım.
PORTB=0 ‘B portu tüm çıkışlar Low (0) Eğer High yapmak isteseydim
(PORTA=1),(PORTB=1)şeklinde yazacaktım.
Gördünüz mü ne kadar basit. Pinleri çıkış olarak ayarladım ve tüm çıkışları Low yaptım.
Herhangi bir portun bir pin’inin gösterilme şekli port ismi devamında nokta ve pin numarası verilerek yapılır.
Herhangi bir portun bir pin’inin gösterilme şekli port ismi devamında nokta ve pin numarası verilerek yapılır.
Örnek A portunun 2 nolu pini için PORTA.2 şeklinde bir gösterim kullanılır.
Şimdi diyelim ki PORTA.0 yani A portunun sıfır biti yani ilk pin’e bağlı LED‘i yakalım ;Komutumuz bir kaç mantıklı şekilde olabilir. Sırası ile;
Şimdi diyelim ki PORTA.0 yani A portunun sıfır biti yani ilk pin’e bağlı LED‘i yakalım ;Komutumuz bir kaç mantıklı şekilde olabilir. Sırası ile;
PORTA.0=1 ‘PortA.0 High yani 1 oldu ve LED yandı.veya
HIGH PORTA.0 ‘PortA.0 High oldu yani LED yandı,
HIGH PORTA.0 ‘PortA.0 High oldu yani LED yandı,
Komutu mümkün olduğu sürece şeklinde kullanmayı tercih edin.
Şimdi de birden fazla pin’e bağlı Led lerin aynı anda yakılmasını gerçekleştirelim.
PortA=%10101 şeklin de bir komut yazarsam, sağdaki ilk değer olan 1 (Bir) PortA.0′a verilir. Sonra sırası ile yani soldan sağa doğru olan Binary değerler PORTA nın 0-4 nolu pinlerine verilirler. Değer sıfır ise pin Low, değer bir ise pin High olur.
PortA=%10101 şeklin de bir komut yazarsam, sağdaki ilk değer olan 1 (Bir) PortA.0′a verilir. Sonra sırası ile yani soldan sağa doğru olan Binary değerler PORTA nın 0-4 nolu pinlerine verilirler. Değer sıfır ise pin Low, değer bir ise pin High olur.
Sonuçta bu komut ;
TRISA=%00000 ‘A portu Çıkış olarak ayarlandı
PortA.0=1
PortA.1=0
PortA.2=1
PortA.3=0
PortA.4=1 ‘( Bu pin diğerlerinden farklıdır.Open kollektör olduğu için “pullup” direnci kullanılır.Aksi halde istediğimiz çıkışı alamayız.)şeklinde karşılık gelen Binary değerleri port pinlerine verir.
PortA.0=1
PortA.1=0
PortA.2=1
PortA.3=0
PortA.4=1 ‘( Bu pin diğerlerinden farklıdır.Open kollektör olduğu için “pullup” direnci kullanılır.Aksi halde istediğimiz çıkışı alamayız.)şeklinde karşılık gelen Binary değerleri port pinlerine verir.
Demek ki bir port’a bağlı pinlerin birden fazlasına hükmetmek için port’a sekiz bitlik bir Binary veya desimal değer verilir.Şimdi port pinlerinin ne amaçlı çıkış olarak kullanıldığı üzerine biraz bilgi verelim.
Diyelim ki port pin’ine bağlı bir Role yi bir transistor aracılığı ile çalıştırmak istiyorsun. İşte yolu, pin çıkışını bir direnç ile (1K-2k2) bir transistor ün (B)eys’ine bağla. NPN tipi bir transistör kullanırsan transistör ün (E)mitterini GND ye bağla. Port Pin’inden High (1) çıkartırsan transistör iletime geçecek ve (C) kollektör ünden GND çıkaracaktır. Bunu bir role ye bağla ve rölenin diğer ucunu +5V‘a bağlar isen pinden röleyi çalıştırıp kapatabilirsin.
Bunu bir örnekle açıklayalım;
Diyelim ki PortB.1 pinine bir transistör üzerinden role bağladık ve bu röleyi açıp kapayacağız.İşte basit programımız;
Proje 1b :
1 TRISB=%00000000 ‘B portu çıkış yapıldı
2 PortB=0 ‘B portunun çıkışı Low(0) yapıldı.
3 ROLEAC:
4 HIGH PORTB.1
5 PAUSE 1000 ‘1000 ms lik bir gecikme yaratır.
6 LOW PORTB.1
7 PAUSE 500
8 GOTO ROLEAC
2 PortB=0 ‘B portunun çıkışı Low(0) yapıldı.
3 ROLEAC:
4 HIGH PORTB.1
5 PAUSE 1000 ‘1000 ms lik bir gecikme yaratır.
6 LOW PORTB.1
7 PAUSE 500
8 GOTO ROLEAC
1. Satırda PortB yi çıkış olarak ayarladık.
2. Satırda PortB pinlerinin tamamını LOW yaptık.
3. cü satırda ROLEAC isimli bir etiket yarattık.(Yaptırmak istediğimiz diğer komutlar için ismini kendimizin koyduğu başka etiketler yaratıp programın daha fazla işlem yapmasını sağlarız.)
4. satırda PortB.1 pinini High yaptık.
5. satırda 1000 ms lik bir gecikme yarattık. Yani role 1000 ms süresince çekili kaldı.
6. Satırda PortB.1 pinini LOW yaptık. Yani role bıraktı.
7. satırda tekrar 500 ms lik bir gecikme yarattık.
Sonra programı tekrar aynı işleri yapması için ROLEAC etiketine yönlendirdik.
Buraya kadar öğrendiklerimizi toparlar isek;
- Sayı gösterim formatlarını öğrendik.
- Port pinlerinin nasıl giriş nasıl çıkış yapılacağını öğrendik.
- Port ve port pinlerine nasıl ulaşabileceğimizi öğrendik.
- Milisaniye cinsinden gecikmenin nasıl yaratıldığını öğrendik.
- Program içinde etiket kullanarak aynı işlemlerin nasıl tekrarlanabileceğini öğrendik.
2. Satırda PortB pinlerinin tamamını LOW yaptık.
3. cü satırda ROLEAC isimli bir etiket yarattık.(Yaptırmak istediğimiz diğer komutlar için ismini kendimizin koyduğu başka etiketler yaratıp programın daha fazla işlem yapmasını sağlarız.)
4. satırda PortB.1 pinini High yaptık.
5. satırda 1000 ms lik bir gecikme yarattık. Yani role 1000 ms süresince çekili kaldı.
6. Satırda PortB.1 pinini LOW yaptık. Yani role bıraktı.
7. satırda tekrar 500 ms lik bir gecikme yarattık.
Sonra programı tekrar aynı işleri yapması için ROLEAC etiketine yönlendirdik.
Buraya kadar öğrendiklerimizi toparlar isek;
- Sayı gösterim formatlarını öğrendik.
- Port pinlerinin nasıl giriş nasıl çıkış yapılacağını öğrendik.
- Port ve port pinlerine nasıl ulaşabileceğimizi öğrendik.
- Milisaniye cinsinden gecikmenin nasıl yaratıldığını öğrendik.
- Program içinde etiket kullanarak aynı işlemlerin nasıl tekrarlanabileceğini öğrendik.
Bütün bu öğrendiklerimizi tek program üzerinde göstermeye çalışalım.
Proje 1c :
Program PortA.0 pinine bağlı LED i kontrol edecek ve ayrıca PortB.0 pin’ine bağlı röleyi açıp kapayacaktır. Role çekildiğinde PortA.0 pinine bağlı LED yanacak. Role bırakınca LED’de sönecektir. Role çekili kalma süresi 1 sn. yani 1000 ms. olacaktır.
TRISA=0 ‘bu ifade “TrisA=%00000”e eşdeğerdir.
TRISB=0
PortA=0
PortB=0
TRISB=0
PortA=0
PortB=0
ROLEAC:
HIGH PORTB.0 ‘role çektirildi
PAUSE 500 ‘500 ms bekleme
HIGH PORTA.0 ‘Led yandı
PAUSE 500 ‘500 ms bekleme
LOW PORTA.0 ‘Led söndü
PAUSE 500 ‘500 ms bekleme
LOW PORTB.0 ‘Role bıraktı
PAUSE 500 ‘500 ms bekleme
GOTO ROLEAC ‘Roleac etiketine git
END ‘programın burada bittiğini ifade eder.
HIGH PORTB.0 ‘role çektirildi
PAUSE 500 ‘500 ms bekleme
HIGH PORTA.0 ‘Led yandı
PAUSE 500 ‘500 ms bekleme
LOW PORTA.0 ‘Led söndü
PAUSE 500 ‘500 ms bekleme
LOW PORTB.0 ‘Role bıraktı
PAUSE 500 ‘500 ms bekleme
GOTO ROLEAC ‘Roleac etiketine git
END ‘programın burada bittiğini ifade eder.
1.ders Proteus ve hex dosyaları Download
2.ders :Bu dersimizde pic pinlerinin nasıl input yani giriş olarak ayarlandığını ve bu işlemin nerelerde kullanıldığını öğreneceğiz. Hazırlanan programlarda pic in zaman zaman dış ortamdan bilgi alması ve bu bilgiye göre karar vermesi istenir. Örnek olarak bir tuşa basılması halinde git şu işi yap şeklinde bir program en basitinden yazılabilir.
Yada bir anahtar kapalı ise bir iş yap. Aynı anahtar açık ise başka bir iş yap gibi. Bir önceki dersimizde Port pinlerinin giriş olarak ayarlanması için Port’a ait TRIS yazmaç’ına 1 yani high verilmesi gerektiğini öğrenmiş idik. Bu kaide her bir pin için gerekli. Portun tamamı giriş yapılacak ise 8 bitlik 255 ($FF – %11111111) değerinin TRIS yazmacına verilmesi gerekir.Bir örnek programla bunu açıklayalım.
Varsayımlarımız; Pic’in PortB.0 pinine bir anahtar bağlı. Anahtar açık iken pin low da (pull down direnci ile) anahtar kapalı iken pin High da olsun. Burada Pull down şeklinde bir terim geçiyor. Port pinlerinin sıfıra yani Low’a çekilebilmesi için pin ile GND arasına 10K lık bir direnç bağlanır. Buna Pull-Down işlemi denir. Aynı işin tersi olarak Pin şayet 10K lık bir direnç ile +5V‘a bağlanır ise bu dirence de Pull-Up direnci denir.
Şimdi PortB.0 10K ile GND ye bağlı yani bu direnç ile sürekli LOW da tutuluyor. İki ucu olan Anahtarın bir ucu pin’e bağlı diğer ucu da +5V‘a bağlı olsun. Anahtarı kapadığımız zaman pin’e +5V yani High gelsin. Anahtarın durumunu bir LED ile izlemeye çalışalım. Anahtar kapalı iken PortA.0‘a 470 Ohm dirençle bağlı bir LED yansın. Anahtar açık iken Led sönsün.
İşte programımız ve açıklamaları;
Proje 2a :
TRISA=0 ‘A portu çıkış olarak ayarlandı
TRISB=%00000001 ‘B.0 pini giriş diğerleri çıkış olarak ayarlandı.
TRISB=%00000001 ‘B.0 pini giriş diğerleri çıkış olarak ayarlandı.
SYMBOL TUS= PORTB.0 ‘ PortB.0 pinine sembol ismi olarak TUS adı verildi.
SYMBOL LED= PORTA.0 ‘ PortA.0 pinine sembol ismi olarak LED adı verildi.
SYMBOL LED= PORTA.0 ‘ PortA.0 pinine sembol ismi olarak LED adı verildi.
BASLA:
IF TUS=1 THEN ‘ Anahtar kapalı ise
HIGH LED ‘ LED’i yak
ELSE ‘ Değilse
LOW LED ‘ LED’i söndür
ENDIF ‘ IF sorgulaması sonu
GOTO BASLA ‘ BASLA isimli etikete git.
END
IF TUS=1 THEN ‘ Anahtar kapalı ise
HIGH LED ‘ LED’i yak
ELSE ‘ Değilse
LOW LED ‘ LED’i söndür
ENDIF ‘ IF sorgulaması sonu
GOTO BASLA ‘ BASLA isimli etikete git.
END
Bu programda bazı yeni komutlar gördünüz. Sırası ile inceleyelim. Önce SYMBOL komutunu görelim. Bu komut tanımlanmış bir değişkeni başka isimle yeniden tanımlamak veya herhangi bir port pinine bir isim vermek için kullanılır. Burada komutu port pinlerine isim vermek için kullandık. Aynı işi port pinini değişken olarak tanımlayarak da yapabilirdik. Şöyle;
TUS VAR PORTB.0
LED VAR PORTA.0
LED VAR PORTA.0
şeklinde yapılan tanımlama fonksiyon olarak SYMBOL tanımlaması ile aynı işlevi görür.Burada VAR isimli bir ifade görüyorsunuz. Sırası gelmişken bu ifadenin ne olduğunu açıklayalım. VAR İngilizce VARIABLEkelimesinden kısaltılarak türetilmiş olup Türkçesi DEĞİŞKEN dir. Program içinde değişken tanımlamanıza imkan tanır. Program içinde muhtelif değişkenler kullanılmaktadır. PBP genel olarak 5 tip değişken tanımlamanıza olanak tanır. Bunları örneklerle açıklayalım;
Bit tipi değişken;
TUS VAR BIT (veya TUS VAR PORTA.0) değişkenin boyutu bit dir.
TUS VAR BIT (veya TUS VAR PORTA.0) değişkenin boyutu bit dir.
BYTE tipi değişken;
AL VAR BYTE ,burada AL isimli değişken 8 bitlik bir değişken olup alabileceği en büyük rakam 255 değeridir. Böylece bu değişken 0-255 arasında herhangi bir değer alabilir.
AL VAR BYTE ,burada AL isimli değişken 8 bitlik bir değişken olup alabileceği en büyük rakam 255 değeridir. Böylece bu değişken 0-255 arasında herhangi bir değer alabilir.
WORD Tipi Değişken;
TOPLAM VAR WORD , burada TOPLAM isimli değişken çift baytlık yani 16 bitlik bir değişken olup alabileceği rakam değerleri 0 – 65535 arasında olacaktır.
TOPLAM VAR WORD , burada TOPLAM isimli değişken çift baytlık yani 16 bitlik bir değişken olup alabileceği rakam değerleri 0 – 65535 arasında olacaktır.
Dizi Tipi Değişkenler ;
ISIM VAR BYTE [10] ‘isim adı altında 11 adet değişken tanımlar. Bu değişkenlere değişken numarası verilerek ulaşılabilir. Sıralama sıfırdan başlar. Örneğin ISIM[4] beşinci değişken olmaktadır. Son olarak Sabit değerli değişkenleri tanımlayacağız.
TA CON 3 ‘ Burada TA isimli değişkene 3 değeri sabit olarak verilmektedir. Program içinde bir daha değiştirilemez veya sadece ilk tanımlandığı yerde değiştirilebilir.
Tekrar programımızdaki komutlara dönersek IF (Şayet veya Eğer) komutunu göreceğiz.IF komutu sorgulama yapılması gereken veya şarta bağlı işlerde kullanılan bir komuttur.Şayet PORTA.0 pini Low ise PORTB.0 daki Led yansın şeklinde bir şarta bağlı bir işlemin program halinde yazılımı şu şekilde olacaktır;
IF PortA.0=0 then HIGH PortB.0 IF komutunun içinde kullanılan birde ELSE isimli ilavesi vardır. Bu komut birinci şart doğru değilse ikinci şart olarak kullanılır.
IF PortA.0=0 then HIGH PortB.0 IF komutunun içinde kullanılan birde ELSE isimli ilavesi vardır. Bu komut birinci şart doğru değilse ikinci şart olarak kullanılır.
Şayet PORTA.0=0 ise LED‘i yak değil ise (yani PortA.0=0 değil ise) LED‘i söndür şeklinde verilen bir tanımlamayı program olarak yazacak olur isek;
IF PORTA.0=0 THEN
HIGH LED
ELSE
LOW LED
ENDIF
HIGH LED
ELSE
LOW LED
ENDIF
Else komutunu kullanacağımız zaman mutlaka birinci satırda THEN den sonra bir şey yazmamamız gerekir. (Yukarıda olduğu gibi) Devam eden ifade alta yazılır.
Yeni bir program yazacağız ve öğrendiğimiz yeni komutları bu programda kullanacağız.
Programın konusu şöyle;
Programın konusu şöyle;
Proje 2b:
- PortB.0 pinine bir Tuş bağlı ve Pull-Up yapılmış vaziyette. Yani pin sürekli High da duruyor. Tuşa basılıncaLOW olacaktır.
- PortB.1 pinine bir Led bağlı.
- Tuşa basıldığı zaman LED yanacak , tuşa tekrar basıldığı zaman LED sönecek. Bir nevi on/off anahtar gibi çalıştıracağız tuşu.
Görüldüğü gibi yalnızca B portunu kullanıyoruz. Sıfır nolu pin (B.0) tuş bağlı olduğu için giriş olacak, bir nolu pin (B.1) ise Led bağlı olduğu için çıkış olacak.
Şimdi programımıza geçelim ;
TRISB=%00000001
SYMBOL TUS=PORTB.0
SYMBOL LED=PORTB.1
SYMBOL TUS=PORTB.0
SYMBOL LED=PORTB.1
BASLA:
IF TUS=0 THEN
IF LED=1 THEN
LOW LED
ELSE
HIGH LED
ENDIF
ENDIF
GOTO BASLA
END
IF TUS=0 THEN
IF LED=1 THEN
LOW LED
ELSE
HIGH LED
ENDIF
ENDIF
GOTO BASLA
END
Burada programı kısaltmak için başka bir komut kullanabiliriz. TOGGLE komutu. Toggle bit bazında
çalışan bir komut olup bit şayet 1 ise 0 yapar. Bit şayet 0 ise 1 yapar.
çalışan bir komut olup bit şayet 1 ise 0 yapar. Bit şayet 0 ise 1 yapar.
Aynı programı şimdi Toggle kullanarak yazalım;
Proje 2c : (şema 2b ile aynı)
TRISB=%00000001
SYMBOL TUS=PORTB.0
SYMBOL LED=PORTB.1
SYMBOL TUS=PORTB.0
SYMBOL LED=PORTB.1
BASLA:
PAUSE 70
IF TUS=0 THEN TOGGLE LED
GOTO BASLA
END
PAUSE 70
IF TUS=0 THEN TOGGLE LED
GOTO BASLA
END
Gördüğünüz gibi program bayağı kısaldı. Toggle komutu byte tipi değişkenlere tatbik edilmez. Örneğin TOGGLE PORTB diyemeyiz. Ancak TOOGLE PORTB.2 diyebiliriz.
Biraz da matematik yapalım. Programlarda matematik dört işlem komutları normal matematik yapılır gibi kullanılmaktadır. Gerektiğinde işlemler değişkenler yardımı ile de kullanılabilir.
Örnek vermek gerekir ise;
A=24
B=12
C=A+B şeklinde bir ifade kullanılabilir.
C=A-B veya C=A/B veya C=A*B şeklinde ifadeler kullanılabilmektedir.
A=24
B=12
C=A+B şeklinde bir ifade kullanılabilir.
C=A-B veya C=A/B veya C=A*B şeklinde ifadeler kullanılabilmektedir.
Sonuçlar konusunda programcıların dikkatli olması gerekir. 8 bitlik değişkenler kullanılarak yapılacak hesapların sonuçları da 8 bit sınırı içinde olması gerekir. 8 biti
aşan sonuçlar için WORD değişkeni kullanılmalı, 16 biti aşan hesaplamalarda ise bölme için DIV32 komutu kullanılmalıdır. Bu konuda ileriki derslerimizde örnekler üzerinde çalışacağız.
Bu arada bit bazında yapılan işlemlerde bazı önemli noktalara işaret etmek istiyorum. Bir kısmı giriş bir kısmı çıkış olarak ayarlanmış portlarda işlem yapmak genellikle problemlere sebep olur. Bu yüzden bit bazında yapılan işlemleri çok iyi öğrenmek gerekir. Bunun için Mantıksal Operatörler (Logical Operators) konusunu inceleyeceğiz. Çoğunuzun mantık konusunda bilgi sahibi olduğunu düşünüyorum. Yinede mantık genel konularına burada değinmekte yarar var.
a) AND (ve) Operatörü:
Mantıksal operatörlerin anlaşılmasının en kolay yönlerinden birisi lamba devreleridir. İki adet anahtar ile bir adet lambayı yakacağımızı düşünürsek, ve şart olarak da her iki anahtar kapalı olunca lamba yansın der isek bir AND işlemine ihtiyacımız var demektir. Bu durumda eşitlik aşağıdaki gibi olmalıdır.
IF (SW-1=1) AND (SW-2=1) THEN HIGH LAMBA bu eşitliğin mantık modeli ise 1 AND 1 = 1 olumsuz hali olarak 1 AND 0 = 0 yazılabilir. Tabii ki 0 AND 0=0 olduğunu söylemeye gerek yok sanırım.
Lamba olayına geri döner isek, lambanın yanabilmesi için her iki anahtarın (1) yani kapalı olması gerektiği ortadadır. Anahtarlardan birisi açık olur ise olumsuz hal meydana gelir ve lamba sönük kalır. AND operatörü bit bazındaki işlemlerde genellikle aşağıdaki şekillerde kullanılır.
- 8 bitlik bir ifadeden bazı bitleri izole edip ayırmak için;
PORTB= %11100100 olsun ve bu bilginin ilk 4 adet bitini başka bir değişkene vermek isteyelim.
A=PORTB AND %00001111
PORTB= %11100100 olsun ve bu bilginin ilk 4 adet bitini başka bir değişkene vermek isteyelim.
A=PORTB AND %00001111
A= %0100 olacaktır. yani ilk 4 adet bit A değişkenine eşitlenmiş olur. Temel kaide izole edilecek bitlerin tamamı 1 ile AND lenir.
- Yine 8 bitlik bir ifadede istenen bazı bitleri low yapmak için kullanılabilir.
PORTB=%11100100 olsun ve biz high olan 2 biti low yapmak isteyelim. İşte çözüm;
PORTB=PORTB AND %11111011
PORTB=%11100100 olsun ve biz high olan 2 biti low yapmak isteyelim. İşte çözüm;
PORTB=PORTB AND %11111011
PORTB nin yeni değeri %11100000 olacaktır. Temel kaide low yapılacak bit sıfır diğer bitler 1 ile AND lenir.
b) OR (veya) Operatörü :
Yine lamba devresini örnek verecek olursak, bir lambanın yanabilmesi için iki anahtardan birisinin kapalı olması yeterli ise bu durumda karşımızda bir OR işlemi var demektir. Bunun şartlı ifadesi şöyledir;
IF (SW-1=1) OR (SW-2=1) THEN HIGH LAMBA mantık modeli ise
1 OR 1 = 1
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0
Or işlemi şartlı ifadelerde kullanılır. yukarıdaki lamba örneğinde olduğu gibi. Bundan daha fazla olarak istenen bir bit’in high yapılmasında kullanılmaktadır.
IF (SW-1=1) OR (SW-2=1) THEN HIGH LAMBA mantık modeli ise
1 OR 1 = 1
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0
Or işlemi şartlı ifadelerde kullanılır. yukarıdaki lamba örneğinde olduğu gibi. Bundan daha fazla olarak istenen bir bit’in high yapılmasında kullanılmaktadır.
Örnek;
PortB=%11001100 ise ve 1. bit High yapılmak isteniyor ise;
PortB=%11001100 ise ve 1. bit High yapılmak isteniyor ise;
PortB=PortB OR %00000010 şeklindeki ifade ile 1. bit High yapılır. Sonuç PortB=%11001110 olur.High yapılmak istenen bit 1 diğerleri 0 ile OR lanır.
c) XOR (Özel Veya) :
Genellikle bitleri ters çevirme işlemlerinde kullanılır. Mantıksal model şöyledir.
1 XOR 1 = 0
0 XOR 0 = 0
1 XOR 0 = 1
0 XOR 1 = 1
1 XOR 1 = 0
0 XOR 0 = 0
1 XOR 0 = 1
0 XOR 1 = 1
A=%11100011 , B=%01010101 olsun
C= A XOR B eşitliğine bakalım ve C nin alacağı değeri hesaplayalım
A= %11100011
B= %01010101
C= A XOR B eşitliğine bakalım ve C nin alacağı değeri hesaplayalım
A= %11100011
B= %01010101
XOR
C= %10110110 sonucu elde edilecektir. Şimdi C nin bitlerini ters çevirmek istersek şöyle
yapılacaktır;
C=%10110110
%11111111
C= %10110110 sonucu elde edilecektir. Şimdi C nin bitlerini ters çevirmek istersek şöyle
yapılacaktır;
C=%10110110
%11111111
——XOR——-
C=% 01001001 görüldüğü gibi C nin yeni değeri öncekinin ters çevrilmiş halidir. Demek ki bir sayının bitlerini ters çevirmek için o sayıyı tamamı 1 lerden oluşan bir sayı ile XOR lamak gerekir.Bir sayının yalnızca bir bitini ters çevirmek için TOGGLE komutu kullanılmaktadır. Ancak aynı işi XOR ile de yapabiliriz.
C=% 01001001 görüldüğü gibi C nin yeni değeri öncekinin ters çevrilmiş halidir. Demek ki bir sayının bitlerini ters çevirmek için o sayıyı tamamı 1 lerden oluşan bir sayı ile XOR lamak gerekir.Bir sayının yalnızca bir bitini ters çevirmek için TOGGLE komutu kullanılmaktadır. Ancak aynı işi XOR ile de yapabiliriz.
A=%11111110 olsun bu sayının 7. bitini ters çevirecek olur isek A.7=A.7 XOR %1 Bu durumda A sayısı%011111110 olacaktır.
Daha öncede belirttiğimiz gibi aritmetik işlemlerinde kullandığımız değişken tipine bağlı olarak işlem yapmaya dikkat etmeliyiz. Özellikle vurgulamaya çalıştığım konu 8 bitlik sayılarla çalışırken elde edilecek neticenin de 8 bit sınırları içinde olmasına özen göstermeliyiz. Şayet hesap sonucu 8 biti aşacak ise veya aşma ihtimali var ise mutlaka sonucu yerleştireceğimiz değişken Word tipinde seçilmelidir.
2.ders Proteus ve hex dosyaları Download
3.ders:
3.ders:
LCD Kullanımı: Yazığımız programlardan elde edeceğimiz neticeleri görsel olarak takip edebilmek amacı ile Pic’lere muhtelif büyüklüklerde LCD ekranlar bağlandığını biliyorsunuz. Şimdi Pic ile LCD kullanımı konusunda detaylı bir uygulama yapacağız ve LCD kullanımını her yönü ile öğreneceğiz.
Önce biraz LCD leri tanıyalım. Bu konuda en çok kullanılan LCD 2 sıra ve her sırada 16 karakter yer alanLCD ler kullanılır. Bunların 4 sıralı olanları olduğu gibi her sırada karakter adedi 40 ‘a kadar olanlarda mevcuttur. LCD ler standart olarak 14 bacaklı (pinli) ekranlardır. Bacak numaralarına göre fonksiyonları aşağıda belirtilmektedir.
1. Nolu Pin : GND bacağıdır.
2. +5V giriş bacağı
2. +5V giriş bacağı
3. Kontrast ayara bacağı olup genelde 22 K lık trimpot’un bir bacağı GND ye diğer uç bacağı +5V’a ve orta bacağı da bu kontrast bacağına bağlanarak trimpot ile ekran koyuluk açıklık ayarı yapılır.
4. RS – Reset Bacağı
5. R/W yazma okuma set etme bacağı.
6. E – Enable bacağı.
7. D0 – Data Bacağı sıfır nolu bit.
8. D1 – Data Bacağı 1 nolu bit.
9. D2 – Data Bacağı 2 nolu bit.
10. D3 – Data Bacağı 3 nolu bit.
11. D4 – Data Bacağı 4 nolu bit.
12. D5 – Data Bacağı 5 nolu bit
13. D6 – Data Bacağı 6 nolu bit
14. D7 – Data Bacağı 7 nolu bit.
5. R/W yazma okuma set etme bacağı.
6. E – Enable bacağı.
7. D0 – Data Bacağı sıfır nolu bit.
8. D1 – Data Bacağı 1 nolu bit.
9. D2 – Data Bacağı 2 nolu bit.
10. D3 – Data Bacağı 3 nolu bit.
11. D4 – Data Bacağı 4 nolu bit.
12. D5 – Data Bacağı 5 nolu bit
13. D6 – Data Bacağı 6 nolu bit
14. D7 – Data Bacağı 7 nolu bit.
Bazı modellerinde 15. ve 16. cı bacaklarda mevcuttur. Bunlar back light denilen arkadan ekran aydınlatması için kullanılan Led ışığının voltaj besleme uçlarıdır. Bu uçlar ayrı verildiği gibi 15 ve 16. cı bacaklar olarak da verilebilir.
LCD nin kullanımı ile ilgili protokol’e biz burada girmeyeceğiz. Bu işi bize BASIC yapacak. Yalnızca LCDnin 8 adet (8 bitlik) Data giriş bacakları olduğunu ve istenirse LCD ile 8 yerine 4 bit üzerinden haberleşme yapılabileceğini belirtmek istiyorum. Aslında 8 bit’in tek seferde verilmesi yerine ince ilk 4 bit sonrada ikinci 4 bit verilerek 8 bitlik bilgi tamamlanmaktadır ve bu işi yine BASIC yapmaktadır. Faydası ile 8 adet yerine 4 adet Data bacağı kullanarak Pic’de bize 4 adet fazladan bacak bırakmasıdır ve bu yüzden kullanım açısından daima tercih edilmektedir.
LCD nin Pic ile birlikte kullanılması için bazı kurallar vardır. Bunların başında DEFINE komutu gelmektedir. Bu komut LCD nin hangi porta bağlı, Kaç data bacağı kullanıyor gibi bilgileri Pic’e vermekte kullanılır.
Kısa bir örnekle açıklayalım.
Vereceğimiz örnekte LCD tanımlama için kullanılması gereken tüm DEFINE komutlarını ve ne amaçla kullanıldıklarını göreceksiniz.
Vereceğimiz örnekte LCD tanımlama için kullanılması gereken tüm DEFINE komutlarını ve ne amaçla kullanıldıklarını göreceksiniz.
DEFINE LCD_DREG PORTB ‘LCD data bacakları hangi porta bağlı? Bu örnekte LCD Data bacaklarınınPortB ye bağlı olduğu belirtiliyor.
DEFINE LCD_DBIT 4 ‘LCD data bacakları hangi bitten başlıyor? Bu örnekte Data bacaklarının PortB nin 4. bitinden itibaren başladığı belirtiliyor.
DEFINE LCD_EREG PORTB ‘LCD Enable Bacağı Hangi Porta bağlı? Bu örnekte LCD Enable bacağınınPortB ye bağlı olduğu belirtiliyor.
DEFINE LCD_EREG PORTB ‘LCD Enable Bacağı Hangi Porta bağlı? Bu örnekte LCD Enable bacağınınPortB ye bağlı olduğu belirtiliyor.
DEFINE LCD_EBIT 3 ‘LCD Enable Bacağı Hangi bite bağlı ? Bu örnekte LCD Enable bacağının PortB.3(3.bit) e bağlı olduğu belirtiliyor.
DEFINE LCD_RWREG PORTB LCD RW Bacağı PortB de bağlı Bu örnekte LCD RW bacağının PortB de bağlı olduğu belirtiliyor.
DEFINE LCD_RWBIT 2 LCD RW Bacağı 2. bite bağlı Bu örnekte LCD RW bacağının 2 bite bağlı olduğu belirtiliyor.
Şayet LCD den geriye karakter okuması yapılmayacak ise RW bacağı daima GND ye bağlı durabilir. Bu durumda 1 bacaktan tasarruf edilebilir. İleride buna ait örnekler görülecektir. Burada komutun anlaşılması için biz bu bacağı da PortB ye bağlı kabul edeceğiz.
DEFINE LCD_RSREG PORTB ‘LCD RS Bacağı Hangi Porta bağlı ? Bu örnekte LCD RS bacağının Bportuna bağlı olduğu belirtiliyor.
DEFINE LCD_RSBIT 1 ‘LCD RS bacağı Hangi Bite bağlı ? Bu örnekte LCD RS bacağının PortB.1 (1. bit) e bağlı olduğu belirtiliyor.
DEFINE LCD_BITS 4 ‘LCD 4 bit mi yoksa 8 bit olarak bağlı? Bu örnekte LCD nin PortB ye kaç data bacağı ile bağlandığını açıklıyor.
DEFINE LCD_LINES 2 ‘LCD Kaç sıra yazabiliyor Bu örnekte LCD nin Kaç sıra çalıştığı açıklanıyor.
Standart kullanımlarda buraya kadar olan DEFINE tanımlamaları yeterlidir. Ancak bazen yüksek frekanslı 10 MHz ve üzeri çalışma frekanslarında LCD ekranına yazılan karakterler hızdan dolayı izlenemez hale gelebilirler. Bunu önlemek için gerek komut verildikten sonra ve gerekse DATA verildikten sonra standart bir bekleme süresi tanımlanır ve karakterler izlenebilir hale gelir.
Bu komutlarda sırası ile
DEFINE LCD_COMMANDUS 1000 ‘1000 değer mikro saniye cinsinden gecikme süresi olup isteğe bağlı olarak artırılıp azaltılabilir. Komut sonrası gecikme süresini belirler.
‘DEFINE LCD_DATAUS 225 ‘Data bilgisinden sonraki gecikmeleri tanımlar.
Buraya kadar verdiğimiz örneklerle LCD nin Pic’e bağlantısını tanımlamış olduk. Program içinde LCD nin kullanımına ait bazı açıklamaları verdikten sonra örnek programımıza geçeceğiz.
LCD ye bir bilgi (emir) veya Data (karakter) göndermek için kullanılan komut; LCDOUT dır. Bu komut şayetLCDOUT $FE eklentisi ile birlikte kullanılır ise LCD ye bir komut gönderileceği anlamına gelir. Örneğin Ekranın silinmesi için LCDOUT $FE,1 komutunu verdiğimizde tüm ekrandaki bilgiler silinir. Program içinde sıklıkla kullandığımız bazı komutlar vardır. Bunlar, Yazma konumunu (imleç in yeri) ekranın en başına almak LCDOUT $FE,2 , Yazma konumunu (imleç in yerini) İkinci satır başına almak için LCDOUT $FE,$C0gibi komutlar verilir. Ayrıca yazma konumunu ekranın herhangi bir yerine almak için ekran adresi kullanılır.
İlk satır birinci karakterin adresi $80, ikinci karakterin adresi $81, ve 7. karakterin adresi ise $86 dır. İkinci sırada bu adresler ilk karakter için $C0, ikinci için $C1 ve sırası ile $C2-$C3-$C4… şeklinde gitmektedir. Örnek olarak ilk sıra 7. karakterden itibaren “MERHABA” yazmak istersek şu komutu vermeliyiz.
LCDOUT $FE,$86,”MERHABA”
Öğrendiklerimizi artık bir programla kullanalım isterseniz.
Örnek Program 3a:
Ekranda ilk satırdan itibaren “BASIC DERSLERI” yazıp ikinci satıra ise “DERS No:3” ifadesini yazabileceğimiz programı gerçekleştirelim. Mikroişlemcimiz yine 16F84 olsun. LCD B portuna bağlı olacak ve 4 bit data bağlantısı olacaktır. Enable pini 3 nolu bit’e , R/ W pini 2 nolu bit’e ve RS pini ise 1 nolu bite bağlı olacaktır. İşte Programımız.
DEFINE LCD_DREG PORTB ‘LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 4 ‘LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTB ‘LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 3 ‘LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTB ‘LCD RW Bacağı PortB de bağlı
DEFINE LCD_RWBIT 2 ‘LCD RW Bacağı 2. bite bağlı
DEFINE LCD_RSREG PORTB ‘LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 1 ‘LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 ‘LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2 ‘LCD 2 sıra olarak çalışıyor.
DEFINE LCD_DBIT 4 ‘LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTB ‘LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 3 ‘LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTB ‘LCD RW Bacağı PortB de bağlı
DEFINE LCD_RWBIT 2 ‘LCD RW Bacağı 2. bite bağlı
DEFINE LCD_RSREG PORTB ‘LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 1 ‘LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 ‘LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2 ‘LCD 2 sıra olarak çalışıyor.
TRISA=0 ‘A portu çıkış olarak ayarlandı.
TRISB=0 ‘B portu çıkış olarak ayarlandı.
TRISB=0 ‘B portu çıkış olarak ayarlandı.
LOW PORTB.2 ‘RW bacağı ekrana yazmaya imkan vermek için LOW yapıldı.
PAUSE 200 ‘LCD nin kullanıma hazır hale gelebilmesi için gerekli süre
LCDOUT $FE,1 ‘Önce Ekranı siliyoruz.
LCDOUT “BASIC DERSLERI” ‘ilk sıra baştan itibaren yazdırıyoruz. Aslında bu komutu başka bir şekilde de yazabiliriz, şöyle
‘LCDOUT $FE,2,”BASIC DERSLERI”
LCDOUT “BASIC DERSLERI” ‘ilk sıra baştan itibaren yazdırıyoruz. Aslında bu komutu başka bir şekilde de yazabiliriz, şöyle
‘LCDOUT $FE,2,”BASIC DERSLERI”
LCDOUT $FE,$C0,”DERS No: 3” ‘ikinci satıra yazdırıldı.
End ‘Program sonu
Aynı programı RW bacağını direkt GND ye bağlıyarak da çalıştırabiliriz. Bu durumda ; LOW PortB.2komutuna ihtiyaç yoktur.
Devre Şeması :
Ekran kullanımında en çok karşılaşılan şekillerden birisi sabit bir karakter dizisinden sonra bir değişkene bağlı olarak değer gösterme işi dir. Diyelim ki ortam sıcaklığını ölçüyorsunuz ve bunu ekranda gösteriyorsunuz.
Bu durumda ekranda “SICAKLIK : 23,3 oC” ibaresine benzer bir görüntü olacaktır. Genelde 23 değeri bir değişkende tutulur ve 0,3 değeri ise ayrı bir değişkende tutulur. Şimdi ISI=23 ve ONDA=3 olduğunu kabul ederek bunun ekranda gösterilme şeklini inceleyelim.
LCDOUT “SICAKLIK :” komutu ekrana SICAKLIK : ibaresini yazacaktır. Devamı için LCDOUT “ SICAKLIK : “,#ISI şeklinde bir ifade yazılır ise;
Ekrana çıkan şekli < SICAKLIK : 23 > olacaktır. Geriye ondalık kısmını yazdırmak kalıyor. Bunun içinLCDOUT “SICAKLIK : “,#ISI,”,”,DEC1 ONDA ifadesini yazmamız gerekiyor.
#ISI komutundan sonra gelen virgül peşine ikinci bir komut geleceğini gösteriyor. Arkasında yer alan “,”ifadesi ekrana 23 rakamından sonra bir virgül koyacaktır. Peşinden gelen DEC1 ise sonraki gelen ifadenin Desimal bir sayı olduğunu ve 1 hanesinin yazılacağını gösterir. Daha sonraki ise zaten ONDA değişkeni olup
3 sayısını tutmaktadır. Sonuç olarak ekranda; SICAKLIK : 23,3 olarak görülür. Bu ifadelerin devamına derece işareti ve C karakterini ilave edince işlem tamam olacaktır. Ancak LCD karakterleri içinde derece işareti yoktur. Bunun nasıl oluşturulduğunu ileride göreceğiz. Şimdilik yalnızca C karakterini koymaya çalışalım. Komutun tamamı; LCDOUT “SICAKLIK : “,#ISI,”,”,DEC1 ONDA, “ C” şeklinde verilir.
Ekranda gösterilecek sayı formatlarını verdikten sonra ikinci örneğimize geçeceğiz. Sayılarımız Desimal ,Hexadesimal ve Binary olarak gösteriliyorlardı. Bunları LCD de göstermek için aşağıdaki formatları kullanıyoruz.
Desimal Sayılar :
Sayıyı direkt olarak göstermek için başına # ilave edilir. #ISI gibi. Çok haneli sayılarda hane sayısını kısıtlamak için DEC komutu kullanılır. DEC1 tek hane, DEC2 iki hane DEC3 üç hane gösterir. Olmayan haneler yerine akrana sıfır çıkar. Örneğin ISI=23 ise ve biz ekrana DEC3 ISI yazmış isek ekrandaki görüntüsü 023 olarak izlenir.
Sayıyı direkt olarak göstermek için başına # ilave edilir. #ISI gibi. Çok haneli sayılarda hane sayısını kısıtlamak için DEC komutu kullanılır. DEC1 tek hane, DEC2 iki hane DEC3 üç hane gösterir. Olmayan haneler yerine akrana sıfır çıkar. Örneğin ISI=23 ise ve biz ekrana DEC3 ISI yazmış isek ekrandaki görüntüsü 023 olarak izlenir.
HEX Sayılar.:
Değişken veya sayı başına HEX veya HEX1 veya HEX2 gibi ifadeler yazılır. Rakamlar gösterilecek hane sayısını ifade etmektedir.
Değişken veya sayı başına HEX veya HEX1 veya HEX2 gibi ifadeler yazılır. Rakamlar gösterilecek hane sayısını ifade etmektedir.
Binary Sayılar:
Binary sayılar başların BIN (veya BIN1-BIN2 – BIN3..) ifadesi koyularak gösterilirler.
Binary sayılar başların BIN (veya BIN1-BIN2 – BIN3..) ifadesi koyularak gösterilirler.
Proje 2b :
Bu örneğimizde değişkenlere bağlı sayıların ekranda gösterilmesi konusunu işleyeceğiz. PIC16F84 işlemci ve 2X16 LCD kullanarak Bazı sayı formatlarını ekranda izleyelim. Program önce bir SAYI değişkenini kullanacak ve sıfırdan başlayıp sayı değerini her seferinde bir artırarak oluşan yeni SAYI değerini üst satırda Desimal alt Satırda Binary olarak gösterecek. İkinci adımda ise Yine sıfırdan başlayarak bir SAYI değişkeni değeri 10’ar artırılacak ve elde edilen yeni değer üst satırda Desimal, alt satırda ise HEX olarak gösterilecektir. İzleyelim.
DEFINE LCD_DREG PORTB ‘LCD data bacakları PortB de bağlı DEFINE LCD_DBIT 4 ‘LCD data bacakları 4. bitten başlıyor DEFINE LCD_EREG PORTB ‘LCD Enable Bacağı PortB de bağlı DEFINE LCD_EBIT 3 ‘LCD Enable Bacağı 3. bite bağlı DEFINE LCD_RWREG PORTB ‘LCD RW Bacağı PortB de bağlı DEFINE LCD_RWBIT 2 ‘LCD RW Bacağı 2. bite bağlı DEFINE LCD_RSREG PORTB ‘LCD RS Bacağı PortB de bağlı DEFINE LCD_RSBIT 1 ‘LCD RS bacağı 1. Bite bağlı DEFINE LCD_BITS 4 ‘LCD 4 bit olarak bağlı DEFINE LCD_LINES 2 ‘LCD 2 sıra olarak çalışıyor. TRISA=0 ‘A portu çıkış olarak ayarlandı. TRISB=0 ‘B portu çıkış olarak ayarlandı. SAYI VAR BYTE ‘Sayı değişkenini Byte olarak ayarladık . Maksimum 255 değeri LOW PORTB.2 ‘RW bacağı ekrana yazmaya imkan vermek için LOW yapıldı. PAUSE 200 ‘ LCD nin kullanıma hazır hale gelebilmesi için gerekli süre LCDOUT $FE,1 ‘ Ekran silindi SAYI=0 ‘SAYI ilk değeri sıfır olarak verildi. ‘————-ANA PROGRAM BAŞLANGICI —————- BASLA: LCDOUT “ SAYI = “,#SAYI ‘ilk satıra Sayı Desimal olarak yazıldı LCDOUT $FE,$C0,” Binary = “,BIN SAYI ‘ikinci sıraya Binary olarak yazıldı. PAUSE 500 ‘500 ms bekliyoruz. SAYI=SAYI+1 ‘SAYI bir artırıldı. IF SAYI<100 basla="" span="" style="color: green; margin: 0px; padding: 0px;" then=""> ‘SAYI mız 100 den küçük ise tekrar başla100>
Bu kadar LCD bilgisi yeterli olur sanırım. Birazda özel karakterlerin yaratılması işini inceleyelim. LCD lerde 8 adet yeni karakter yaratmamıza izin verilir. Karakterler 5 x 7 formatında oluşturulur ve 8 adet data halinde özel karakter hafızasına yerleştirilirler. Normalde LCD de Türkçe karakterlerin olmadığını biliyorsunuz. İşte bu karakterleri toplam 8 adet olmak şartı ile kendimiz oluşturup kullanabiliriz. Önce özel karakter hafıza adreslerini verelim sonra karakterlerin nasıl yaratıldığını açıklayalım.
LCD de 1 . karaktere ait adresin başlangıcı $40 dır. Bu adresten itibaren sırası ile 8 adet adrese 8 bitlik karakter dataları yerleştirilir ise bu karakterin numarası 0 (sıfır) olur ve datalara bağlı olarak yeni karakter ekranda gösterilir.
LCD de 2. karakter hafızası $48, üçüncü $50, dördüncü $58, beşinci $60, altıncı $68, yedinci $70 ve sonuncu da $78 adresinde yer almaktadır. Oluşturulacak karakterler soldan sağa 5 ve yukardan aşağıya 7 olmak üzere 5X7 matriks te oluşturulmaktadır. Son data (8.ci) daima sıfırdır.
Şimdi ilk Türkçe karakterimizi oluşturalım. Oluşturacağımız karakter Ö harfi olacaktır. Önce kendimize 5 x 7 ebadında bir matriks çizelim. Çizdiğimiz matriks içine ü harfini oluşturacak şekilde Kareleri kapatalım veya açalım. Sonuçta aşağıdaki sisteme göre dataların değerlerini satır satır hesaplayalım.
Görüldüğü gibi 1 olan bitlere karşılık gelen bit değerleri soldan sağa doğru toplanarak o sıraya ait data elde edilmektedir. İşte ilk sıradaki Binary değeri olan %10001 değeri nin Desimal karşılığı için 16 + 1 değerleri toplanarak 17 değeri bulunmaktadır.
İşte bu şekilde elde edilen datalar daha sonra programın başında bir yerde LCDye verilir. Nasıl mı şöyle;
LCDOUT $FE,$40,0,17,0,17,17,17,31,0
Böylece sıfır nolu karakteri oluşturmuş oluyoruz. Data adedinin 8 adet olmasına dikkat ediniz. Son data daima sıfır olmalı.
LCDOUT $FE,$40,0,17,0,17,17,17,31,0
Böylece sıfır nolu karakteri oluşturmuş oluyoruz. Data adedinin 8 adet olmasına dikkat ediniz. Son data daima sıfır olmalı.
Şimdi Derece işaretini oluşturalım
Hesapladığımız Data lar ise LCDOUT $FE,$40, 6,9,9,6,0,0,0,0 Şeklinde olacaktır.
Şimdi Derece işaretini 1. karakter olarak oluşturalım.
LCDOUT $FE,$48, 6, 9, 9, 6, 0, 0, 0, 0
Yeniden Karakter üretmeyi öğrendik. Şimdi bunların program içinde nasıl kullanıldıklarına bakalım.
Diyelim ki Sıcaklık göstergesi örneğimize geri dönelim ve ekrana; SICAKLIK : 23,3 oC şeklinde bir ifade yazmaya çalışalım. Derece işareti 1 nolu karakterimiz olduğunu varsayıyoruz.
Komut şöyle olacaktır;
LCDOUT “SICAKLIK : “,#ISI,”,”,DEC1 ONDA,” “,1,”C” ONDA isimli değişkeni verdikten sonra tırnak içinde 2 karakterlik boşluk bırakıyoruz. Daha sonra virgül koyup 1 yani 1. karakteri yazdırıyoruz. Sonra tekrar virgül koyup tırnak içinde C karakterini yazdırıyoruz. Buradan şu sonuç çıkmaktadır. Oluşturulan karakterler ekrana karakter numarası ile getirilirler.
İkinci örneğimiz 0 (sıfır) nolu karakterimizi ilk satır 5. haneye yazdıralım. LCDOUT $FE,$84,0 Buraya kadarLCD kullanımını her yönü ile öğrenmiş olduk. İleriki programlarımızda bol bol LCD kullanacağız ve bilgimizi geliştireceğiz.
3.ders Proteus ve hex dosyaları Download
4.ders:
Program Oluşturma Genel Kuralları Bu bölümde bir program yazılırken nelere dikkat etmeliyiz, hangi bilgi nerede verilmeli bunları öğreneceğiz. Ayrıca program oluşturmak için kullanacağımız yazılımlara bir göz atacağız. Daha sonrada oluşturduğumuz programı derleyip Hex file (Hex Dosyası) haline getirip Pic’e yüklemeyi öğreneceğiz.
Basic programları yazılırken bir editör programından yararlanılır. Bu herhangi bir editör programı olabileceği gibi BASIC ler için yaratılmış özel editör programları da olabilir. Tabii ki özel editörlerin görsellik ve program takibi açısından büyük avantajları vardır. Bu nedenle bizde Özel editör programlarından olan Micro Code Studio programını kullanacağız.
Program yazma işinde ilk önerimiz programlarınızın başına bir başlık mutlaka yerleştirin. Bu aynı zamanda program sırasında ilk olarak yazılacak bölümü kapsamaktadır.
Örnek başlık;
**************************************************************** ‘* İsim : Program Adı.BAS * ‘* Yazar : [İsminiz] * ‘* Not : Copyright (c) 2004] * ‘* : Tüm Hakları Saklıdır * ‘* Tarih : 21.12.2004 * ‘* Sürüm : 1.0 * ‘* Notlar : * ‘* : * ‘****************************************************************
Hiçbir program ilk yazıldığı hali ile çalışır hale gelmez. Sürekli olarak düzeltmeler yapıldıktan bir müddet sonra program yerine oturur. Bu nedenle her program değişikliğinde sürüm numarasını mutlaka değiştirmeye çalışın. Aksi taktirde programın hangisi olduğu konusunda tereddüde düşersiniz.
Bu başlık verildikten sonra , şayet program içinde interrupt (kesme) kullanılacak ise ikinci öncelik sırası olarak kesme tanımlaması yapılmalıdır. Tanımlama şöyle olabilir.
ON INTERRUPT GOTO KESME
Şayet kesme kullanılmayacak ise Giriş çıkış pinleri ayarlanmalıdır.
TRISA=0
TRISB=255 gibi
TRISA=0
TRISB=255 gibi
Daha sonra kullanılan mikro işlemciye ait Device tanımlamaları ve Config bilgileri verilmelidir. Burada @ (at) işareti ile başlayan ve aslında ASM (assembly) komutlarının Basic satırlarında kullanılmasına olanak tanıyan bir komuttan yararlanıyoruz. Çünkü bu komutlar ASM komutları olarak verilmektedirler. Örnek kullanım şekli aşağıdaki gibi olacaktır.
@ DEVICE pic16F628 @ DEVICE pic16F628, WDT_ON @ DEVICE pic16F628, PWRT_ON @ DEVICE pic16F628, PROTECT_OFF @ DEVICE pic16F628, MCLR_ON @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT ‘XT_OSC - HS_OSC –
Yukarıdaki örnekte program için ilk sırada PIC16F628 mikro işlemcisinin kullanılacağı tanımlanıyor . İkinci sırada Config değerini oluşturmak üzere, Watch Dog Timer On yani açık yapılıyor. Üçüncü sırada Power on Timer açık olarak ayarlanıyor. Dördüncü sırada Kod Protek kapalı olarak ayarlanıyor.
Beşinci sırada MCLR pini kullanılacak deniyor. Bu 16F628’in bir özelliği olup MCLR pini gerektiğinde bir INPUT pini olarak kullanılabilmektedir. Burada MCLR ON yani açık olarak ayarlanıp pin’in MCLRfonksiyonu şeklinde kullanılacağını gösteriyor. Şayet bu OFF yapılırsa MCLR pini bir INPUT pini olarak kullanılabilir.
Son satırda ise yine 16F628’e özel bir komut görülüyor. Bu komut 16F628 içinde bulunan dahili osilatör ün kullanılıp dışarıya ayrıca Clock çıkışı yapılmayacağını göstermektedir. Bu komuta yazılabilecek diğer alternatifler satır sonunda XT_OSC veya HS_OSC olarak verilmiştir.
Bu işlemler yerine getirildikten sonra yine mikro işlemci tipine bağlı olarak gerekirse bir emir daha verilir. Bazı işlemcilerde Komparatör bazılarında ise Analog-Digital çeviriciler bulunur. Bu sistemler açılışta önseçimli (default) olarak açık çalışırlar. Yani Komparatör ’ü olan bir Pic de aksine bir emir koymaz iseniz Komparatör önseçimli olarak çalışır. Şayet bu Komparatör bacaklarını iptal edip onları normal giriş-çıkış pin lerine dönüştürmez iseniz programınız hatalı çalışacaktır. Bu yüzden programın bu sırasında var ise bu komutlar yer alır. Komparatör lerin iptali için genelde; CMCON=7 şeklinde bir komut yazılır. Analog Digital çeviricilerin iptali için ise; ADCON1=7 bilgisi verilir.
Verilen değerler pic tipine göre değişiklik arz edebilir. Bu nedenle işlemcilerin Data Sheet’ lerine bakarak doğru bilgiler verilmelidir.
Bu bölümden sonra programda LCD kullanılacak ise LCD tanımlamaları yapılır. Örnek tanımlama bir önceki derste verilmiştir. Görsel olarak unutulmaması için burada yeniden tanımlama yapıyoruz.
DEFINE LCD_DREG PORTB ‘LCD data bacakları PortB ye bağlı
DEFINE LCD_DBIT 4 ‘LCD data bacakları 4. bit den başlıyor
DEFINE LCD_RSREG PORTB ‘LCD RS Bacağı PortB ye bağlı
DEFINE LCD_RSBIT 1 ‘LCD RS bacağı 1. Bite bağlı
DEFINE LCD_EREG PORTB ‘LCD Enable Bacağı PortB ye bağlı
DEFINE LCD_EBIT 3 ‘LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTB ‘LCD RW Bacağı PortB ye bağlı
DEFINE LC_RWBIT 2 ‘LCD RW Bacağı 2. bite bağlı
DEFINE LCD_BITS 4 ‘LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2 ‘LCD 2 sıra yazabiliyor
DEFINE LCD_DBIT 4 ‘LCD data bacakları 4. bit den başlıyor
DEFINE LCD_RSREG PORTB ‘LCD RS Bacağı PortB ye bağlı
DEFINE LCD_RSBIT 1 ‘LCD RS bacağı 1. Bite bağlı
DEFINE LCD_EREG PORTB ‘LCD Enable Bacağı PortB ye bağlı
DEFINE LCD_EBIT 3 ‘LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTB ‘LCD RW Bacağı PortB ye bağlı
DEFINE LC_RWBIT 2 ‘LCD RW Bacağı 2. bite bağlı
DEFINE LCD_BITS 4 ‘LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2 ‘LCD 2 sıra yazabiliyor
Bu aşamadan sonra sıra, Değişkenlerin tanımlanmasına gelir. Programın bu bölümünde program içinde kullanacağımız değişken isimleri ve tipleri belirlenir. Değişkenler büyüklüklerine göre Bit – Byte ve Word tipinde belirlenebilirler. Gerekirse port pinleri için Symbol tanımlaması kullanılabilir. Dolayısıyla Symbol tanımlaması da değişken tanımlama bölümünde yapılmalıdır.
Örnek vermek gerekir ise
Örnek vermek gerekir ise
SIRA VAR BYTE TOPLAM VAR WORD X VAR BYTE DOGRU VAR BIT TUS VAR PORTB.0 CLK VAR PORTA.1 DATA VAR PORTA.2 SYMBOL BUTON=PORTB.7 SYMBOL LED = PORTB.6
Değişken tanımlamaları verildikten sonra, program için gerekli olan ilk değerler ayarlanır. Genelde değişkenler sıfırlanır (sıfıra eşitlenir). Varsa LCD için Türkçe karakterler tanımlanır.
SIRA=0
TOPLAM=0
X=0
LOW CLK
TOPLAM=0
X=0
LOW CLK
Artık sıra programın ana bölümüne gelir. Genellikle programlar bir etiket ile başlatılır. Çünkü işlemlerin tekrarlanması amacı ile tekrar bu başlangıç bölümüne geri gelinmesi gerekebilir. Etiket adı olarak geneldeBASLA veya START veya ILK veya BIRINCI gibi isimler kullanılır.
Şimdi buraya kadar öğrendiklerimizi bir Örnek programla tekrarlayalım.
Proje 4a :
Bu örneğimizde PortB ye LCD bağlayacağız. PortA.0 ve PortA.1 pinlerine Pull-Up yapılmış iki tuş bağlayacağız. PortA.0 daki tuş Yukarı , PortA.1 deki tuş ise Aşağı tuşu olarak çalışacaktır. Başlangıçta Ekranda Sayı adı altında bir değişken’ verilen sıfır değeri görülecek ve yukarı tuşuna basılınca sayı bir artırılacaktır. Aynı şekilde Aşağı tuşuna basılınca sayımız bir azaltılacaktır. Sayıların artırılma ve eksiltme durumlarında maksimum ve minimum değerlerinden sonra aldıkları değerleri görerek öğrenmeniz için sayı değişkeni için bir sonlandırma fonksiyonu kullanılmayacaktır. Şimdi Programımıza geçelim.
‘**************************************************************** ‘* Name : TUSBAS.BAS * ‘* Author : [Erol Tahir Erdal] * ‘* Notice : Copyright (c) 2005 [ETE] * ‘* : All Rights Reserved * ‘* Date : 07.04.2005 * ‘* Version : 1.0 * ‘* Notes : * ‘* : * ‘**************************************************************** TrisA=255 Trisb=0 ‘—————————————————————– @ 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_ON ‘MCLR pini kullanılıyor. @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT ‘Dahili osilatör kullanılacak ‘——————————————————————- 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_RSREG PORTB ‘LCD RS Bacağı Hangi Porta bağlı ? DEFINE LCD_RSBIT 1 ‘LCD RS bacağı Hangi Bite bağlı ? DEFINE LCD_RWREG PORTB DEFINE LCD_RWBIT 2 DEFINE LCD_EREG PORTB ‘LCD Enable Bacağı Hangi Porta bağlı? DEFINE LCD_EBIT 3 ‘LCD Enable 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 ‘——————————————————————- CMCON=7 ‘16F628 de komparatör pinleri iptal hepsi giriş çıkış OPTION_REG.7=1 ‘portB deki dahili PULL-UP lar iptal edildi. ‘——————————————————————- SYMBOL YUKARI=PORTA.0 SYMBOL ASAGI=PORTA.1 SAYI VAR BYTE ‘——————————————————————- LOW PORTB.2 SAYI=0 PORTB=0 LCDOUT $FE,1 PAUSE 200 ‘——————————————————————- BASLA: IF YUKARI=0 then SAYI=SAYI+1 IF ASAGI=0 THEN SAYI=SAYI-1 ‘ LCDOUT $FE,1,” SAYI = “,#SAYI LCDOUT $FE,2,” SAYI = “,DEC3 SAYI LCDOUT $FE,$C0, ” LCD ORNEK PROG.” PAUSE 100 GOTO BASLA END
Yukarıdaki örnekte LCDOUT $FE,2,” SAYI = “,DEC3 SAYI şeklinde bir komut satırı görüyoruz. Ekranda sayı gösterimine örnek olması açısından bu satır bir önceki ile alternatifli olarak koyulmuştur. Burada DEC3komutu sayı değerinin 3 hane olarak ekrana geleceğini göstermektedir. 3 hane olmayan sayılarda hane sayısını doldurmak için 0 kullanıldığını daha önce söylemiş idik. Bir satırın başına koyulan tek tırnak satırın komut olarak icrasını önler. Genellikle açıklama satırları bu şekilde verilir ve derleyici tarafından değerlendirilmezler.
Programda önce Yukarı tuşuna basılarak sayı artırılmalı sonra Aşağı tuşuna basılarak sayı azaltılmalıdır. Sayı 0’a ulaştığında azaltmaya devam edilir ise geriye doğru 255’e dönüldüğü ekrandan izlenmelidir. Aynı şekilde 250 den yukarı doğru sayıyı artırırsanız 255’e kadar gelinip 255 den sonra 0 a geçildiği yine ekrandan izlenmelidir.
Bundan sonraki örneğimiz 2X16 LCD kullanarak Ekran Mönüsü oluşturma ile ilgili olacaktır. Genellikle Mönü ler bir den fazla seçenekli işlerde kullanılmaktadır.
Şimdi kendimize bir örnek belirleyelim ve bunu program şekline getirelim.
Diyelim ki Yine bir ısı kontrol programı yapıyoruz. Program bir evin ortam ısısını kontrol edecek. Kendimiz bir set değeri tayin ediyoruz ve bu işi hem gündüz hem de gece için ayrı yapıyoruz. Gerekçemizde gece oda sıcaklıklarının gündüze göre birkaç derece daha düşük olması.
Şimdi yazacağımız program Ekrana önce bir seçenek getirecek Gündüz veya Gece. Bunlardan birini seçtikten sonra seçtiğimiz şayet Gündüz ise Gündüz Sıcaklığı Set etme bölümüne , seçimimiz şayet Gece ise Gece Sıcaklığı Set etme bölümüne geçecek ve sıcaklık değerini ayarlayıp programdan çıkacağız. Tabii ki normal çalışma modunda ekranda yalnızca ortam sıcaklığını göreceğiz. Şayet seçim tuşuna basarsam mönü ye gireceğim.
Proje 4c :
A portuna 3 adet tuş bağlı olacak. Pull-Up’lı olarak PortA.0 da Seçim tuşu, PortA.1 de Yukarı tuşu (+) ve PortA.2 de ise Aşağı tuşu (-) yer alacak. Yine PortB de 2×16 LCD bağlı olacak ve işlemcimiz 16F628olacaktır.
İşte Programımız ve açıklamaları;
‘**************************************************************** ‘* Name : MENU.BAS * ‘* Author : [Erol Tahir Erdal] * ‘* Notice : Copyright (c) 2005 [ETE] * ‘* : All Rights Reserved * ‘* Date : 07.04.2005 * ‘* Version : 1.0 * ‘* Notes : * ‘* : * ‘**************************************************************** TrisA=255 Trisb=0 ‘—————————————————————– @ 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_ON ‘MCLR pini kullanılıyor. @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT ‘Dahili osilatör kullanılacak ‘——————————————————————- 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_RSREG PORTB ‘LCD RS Bacağı Hangi Porta bağlı ? DEFINE LCD_RSBIT 1 ‘LCD RS bacağı Hangi Bite bağlı ? define LCD_RWREG PORTB define LCD_RWBIT 2 DEFINE LCD_EREG PORTB ‘LCD Enable Bacağı Hangi Porta bağlı? DEFINE LCD_EBIT 3 ‘LCD Enable 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 ‘——————————————————————- CMCON=7 ‘16F628 de komparatör pinleri iptal hepsi giriş çıkış OPTION_REG.7=1 ‘portB deki dahili PULL-UP lar iptal edildi. ‘——————————————————————- SYMBOL SEC=PORTA.0 SYMBOL YUKARI=PORTA.1 SYMBOL ASAGI= PORTA.2 ISIGUN VAR BYTE ‘gündüz ısı değeri ISIGECE VAR BYTE ‘ gece ısı değeri ISIODA VAR BYTE ‘oda sıcaklığı ‘——————————————————————- LOW PORTB.2 ISIGUN=22 ISIGECE=18 ‘Bunlar default değerler olacak ISIODA= 21 PORTB=0 LCDOUT $FE,1 PAUSE 200 ‘——————————————————————- BASLA: LCDOUT $FE,1,” SEC => MENU “ ‘Menu ye nasıl girileceği açıklanıyor BIR: LCDOUT $FE,$C0,”ODA SICAKLIGI=”,#ISIODA ‘ODA sıcaklığını ekrana getiriyoruz. PAUSE 150 IF SEC=0 THEN MENU ‘Şayet SEC tuşuna basılırsa Menu ye git GOTO BIR ‘Tekrar başa git. MENU: LCDOUT $FE,1, “GUNDUZ => YUKARI” IKI: LCDOUT $FE,$C0,”GECE =>ASAGI BAS” PAUSE 200 IF YUKARI=0 THEN GUNDUZ ‘Yukarı tuşuna basılırsa GUNDUZ ’e git. IF ASAGI=0 THEN GECE ‘Aşağı basılırsa GECE’ ye git. IF SEC=0 THEN BASLA ‘Tekrar SEC tuşuna basılırsa Başla’ ya git GOTO IKI GUNDUZ: LCDOUT $FE,1, “GUNDUZ SET DEGER” UC: LCDOUT $FE,$C0,”ISIGUN = “,#ISIGUN ‘Gündüz Set sıcaklığı ekranda PAUSE 200 IF YUKARI=0 THEN ‘Yukarı tuşuna basılınca ISIGUN=ISIGUN+1 ‘Gündüz Set bir artırılıyor IF ISIGUN>50 THEN ISIGUN=50 ‘50 ye ulaşınca 50 de kalıyor ENDIF IF ASAGI =0 THEN ‘Aşağı tuşuna basılınca ISIGUN=ISIGUN-1 ‘Sıcaklık bir eksiltiliyor IF ISIGUN=255 THEN ISIGUN=0 ‘255 e ulaşınca sıfıra eşitleniyor ENDIF IF SEC=0 THEN BASLA ‘Sec tuşuna basılınca başa gidiliyor. GOTO UC GECE: LCDOUT $FE,1, ” GECE SET DEGER ” DORT: LCDOUT $FE,$C0,”ISIGECE = “,#ISIGECE PAUSE 200 IF YUKARI=0 THEN ISIGECE=ISIGECE+1 IF ISIGECE>50 THEN ISIGECE=50 ENDIF IF ASAGI =0 THEN ISIGECE=ISIGECE-1 IF ISIGECE=255 THEN ISIGECE=0 ENDIF IF SEC=0 THEN BASLA GOTO DORT END
Bu programla ilgili ilave bazı açıklamalar yapmak mantığını anlamak açısından yararlı olacaktır.
Görüldüğü üzere 2 satır 16 karakter bir ekran sınırları içinde birkaç kademeli bir menü düzenlenmiştir.
Programın baş tarafında yer alan ifadelerin açıklaması daha önce yapılmış idi. Bu nedenle açıklamamızaBAŞLA etiketinden itibaren yapacağız.
Başla etiketinden sonra hemen ekrana LCDOUT $FE,1, ” SEC => MENU “ komutu ile Mönü ye geçmek için SEC tuşuna basılacağı açıklanıyor. Dikkat edilir ise LCDOUT $FE,1 komutu kullanılarak önce ekran tamamen siliniyor arkasından Menu açıklaması veriliyor. Bu satır yalnızca bir defa icra edileceğinden ekranın tamamen silinmesi doğru olmaktadır. Aksi taktirde bir önceki ekrandan bazı karakterler ekranda kalabilir.
Altında BIR: etiketi ile birlikte LCDOUT $FE,$C0, “ODA SICAKLIGI=”,#ISIODA komutu ile Oda sıcaklığını veriyoruz.
Mönü’nün ilk kısmını oluşturan bu bölümde oda sıcaklığı ölçülerek ekrana getiriliyor ve kullanıcı isterse set sıcaklıklarını ayarlamak üzere bir alt mönüye geçebiliyor. Bunun için SEC tuşuna basması yeterli oluyor.
Bu konumda SEC tuşuna basıldığı zaman programda yer alan;
Bu konumda SEC tuşuna basıldığı zaman programda yer alan;
IF SEC=0 THEN MENU
Satırı sayesinde program MENU isimli etikete atlıyor. Burada
LCDOUT $FE,1, “GUNDUZ => YUKARI”
Komutu ile önce ekran siliniyor ve daha sonra Yukarı tuşuna basılırsa Gündüz mönüsüne gidileceği açıklanıyor. Bu satırın altında;
LCDOUT $FE,$C0,”GECE =>ASAGI BAS”
Komutu ile Aşağı tuşuna basılırsa da Gece mönüsüne gidileceği açıklanıyor. Doğal olarak bu satırların altında da hangi tuşa basıldığını kontrol eden bir bölüm yer alıyor. İşlem gayet basit. Yukarı tuşuna basılırsaGUNDUZ isimli etikete git;
Komutu ile Aşağı tuşuna basılırsa da Gece mönüsüne gidileceği açıklanıyor. Doğal olarak bu satırların altında da hangi tuşa basıldığını kontrol eden bir bölüm yer alıyor. İşlem gayet basit. Yukarı tuşuna basılırsaGUNDUZ isimli etikete git;
IF YUKARI=0 THEN GUNDUZ
Aşağı tuşuna basılırsa GECE isimli etikete git;
IF ASAGI=0 THEN GECE
Şeklinde komutlar veriliyor. Tabii ki tüm bu işlemler bittikten sonra programın asıl çalışan bölümüne gitmek içinde SEC tuşunu devreye sokuyoruz. SEC tuşuna basılması halinde ise program tekrar en başa atlıyor.
BU aşamada yalnızca Gündüz etiketi altında ne yapılıyor açıklamak istiyorum. Zira Gece etiketinde yapılanlar gündüzden çok farklı değil. Birisini anlarsanız diğerini anlamanız zor değil.
Gündüz etiketi altında önce Gündüz set değeri ekrana verilip aşağı veya yukarı tuşlarından birisine basmanız bekleniyor. Ya da SEC tuşuna basıp tekrar program başına geçmeniz bekleniyor. Yukarı tuşuna basmanız halinde Set sıcaklığı bir artırılıyor. Ancak Artırılan sıcaklığın 50 dereceyi geçmesi istenmediğinden şayet geçerseniz sıcaklık yine 50 ye eşitleniyor. Bu bir kısıtlama veya sınırlandırma halidir.
Aynı şekilde Aşağı tuşuna basılması halinde sıcaklığın değer bir eskitiliyor ve sıfır değeri geçilip 255’e ulaşıldığında sıcaklık tekrar sıfıra eşitleniyor. Daha önce görmüş idik. Sayıları birer eskiterek gidersek. Sıfırdan sonra tekrar 255 geliyor idi.
Bu kadar örnek verdikten sonra Micro Code Studio (MCS) ile nasıl program derlenip Hex dosyası elde ediliyor birazda ona değinelim.
Bildiğiniz gibi Pic gibi mikro işlemciler yazılan programları icra ederler. Bunun için yazılan programların Pic’ kayıt edilmesi (yazılması) gerekir. Basic de yazılan programlar direkt olarak Pic’e yazılamaz. Bas uzantılı olan bu dosyaların önce makine diline çevrilerek Pic ’in anlayacağı biçime dönüştürülmesi gerekmektedir.
Derleme denilen bu işlem MCS tarafından PBP derleyicisi kullanılarak yapılmaktadır. Derlendikten sonraHex formatına dönüştürülen programın daha sonra yine başka bir program ve bir programlayıcı devre yardımı ile Pic’e aktarılması yani yazılması sağlanır. Hem program yazma ve hem de derleme işlemi içinMicro Code Studio (MCS) programı kullanılmaktadır.
MCS ilk defa kurulurken bazı parametrelerin ayarlanması gerekiyor. Bunların başında PBPro klasörünün MCS ye gösterilmesi gerekmektedir. Bu iş için MCS de View mönüsünden Pic Basic Options alt mönüsü seçilir. Bu mönüde PBP nun yeri programa gösterilir. Aynı şekilde Programlayıcı nın yeri ve parametreleri de bu seçenekte MCS ye gösterilir. Bu işlemlerin yapıldığını kabul ederek derlemenin nasıl yapıldığına bakalım.
Programı yazmayı tamamladıktan sonra ekranın üst tarafında bulunan derle tuşuna (bir sayfa ve üzerinde sağa doğru ok olan tuş) tıklanır ise yazmış olduğunuz derlenir ve BAS uzantılı dosyanızın yer aldığı klasör içine aynı isimle ancak Hex uzantılı olarak kayıt edilir.
Dosyanın derlendikten sonra Pic’e yazılması için programlayıcıyı çalıştırmak gerekir. MCS bunu da otomatik yapabilir. Yine ekran üstünde üzerinde aşağı doğru ok bulunan bir entegre resmi göreceksiniz buda derlemeden sonra programlayıcıyı çalıştıran tuş dur. Bu tuşa basılınca önce program derlenir ve ardından program otomatik olarak programlayıcıya (IC-Prog) yüklenerek programlayıcı çalıştırılır. Size yalnızca programla tuşuna basarak Hex dosyasının Pic’e yazdırılması kalır.
MCS içinden IC-Prog gibi programlayıcıların otomatik çalıştırılması için bazı parametrelerinde ayarlanması gerekir. Bunların nasıl yapıldığı Hem MCS help mönüsünde hem de programlayıcıların açıklamalarında yer almaktadır. Bu bilgiler kullanılan programa göre değiştiğinden ve hepsini burada açıklamamız mümkün olmadığından yalnızca ön bilgi vermekle yetineceğiz.
Pic’e yazma ve Pic den okuma işlemlerinde en çok kullanılan program olan IC-Prog hakkında da biraz bilgi vermek isterim. IC-Prog hem seri porttan hem de paralel porttan çalışan programlayıcılarla uyumlu bir programlayıcıdır. Kullanımı son derece basittir. Gerekli parametreler ayarlanıp donanım seçimi de doğru yapılırsa sorunsuz olarak çalışacaktır.
Programı kullanırken dikkat edilmesi gereken en önemli nokta programlama yaparken veya programlama yaptıktan sonra doğrulama işleminin yaptırılmasıdır. Genelde hata veriyor diye bu işlem iptal edilmektedir. Hatalı yapılan bir işlemi kontrol etmez iseniz hatalı olduğunu nasıl anlayacaksınız. Hata var ise gösterilmesinde fayda vardır. Bu nedenle Seçenekler mönüsünden Programlanıyor alt mönüsünde bulunan kutucukların ikisini de veya en az birini işaretlemekte fayda vardır.
4.ders Proteus ve hex dosyaları
Download
1 yorum:
Helal olsun hocam faydalı içerikler paylaşmışşsın sayende bilgime bilgi kattın
Yorum Gönder