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

18 Mart 2013 Pazartesi

Pic Programlama Diline Giriş


Pic e nerden başlamalıyım?

Pic dünyası çok yönlü bir olay. Yalnızca pic’i bilmeniz yetmiyor. Çünki yalnız başına pic bir şey ifade etmiyor. Onunyanında diğer lojik entegreleri, transistörlü devreleri, röleleri, ledleri besleme devrelerini kısaca elektroniği içine alan bütün sistemleri az çok bilmeniz gerekiyor.
Neler öğrenmeniz gerekir 
 Pic denilen alet belirli sayıda komut seti (makine dili komutları) ile çalışan bir programlanabilir entegredir. Temel çalışma dili Makine dili dediğimiz rakamlardan oluşan komut seti ile oluşturulan bir dildir. Ancak rakam karşılıklarının anlaşılması çok zor olduğu için her bir rakama karşılık gelen komutlara harf kodları verilerek Assembly dediğimiz dil oluşturulmuştur.
Bu dil kısıtlı olanakları ile yinede anlaşılması çok kolay olmayan yada iyi programlar yazabilemek için epeyce zaman harcamanız gereken bir dildir.
Tabiiki pic üzerinde çalışan dillerin en hızlısıdır. Aynı amaca yönelik yazılmış programlardan ASM olanı en hızlı çalışandır. Ancak programlama işine çok kısa zamanda girmenizi sağlayacak ve nisbeten daha kolay öğrenebileceğiniz diğer dillerde mevcut. Bunlardan birisi BASIC dilidir. Ayrıca C dili dediğiğimiz dilde mevcut.
Herkesin merakla öğrenmek istediği konu ise hangisinden başlayayım.
Bu tamamen sizin bilgi ve becerinize bağlı bir olay. Bu konuya karar verirken bazı programların basicde yada diğer diller de yazılmasının mümkün olmadığını hemen belirteyim. Kısaca Basic yada C dilini bilsenizde biraz olsun ASM de bilmenizde yarar var. Çünki diğer dillerin içinde program yazarken programların arasına ASM de yazılmış bölümler de koyabilmeniz mümkün. Özellikle zamanlamaya bağlı işlemlerde diğer diller sınıfta kalırlar. Bu konudaki işlemler yalnızca ASM ile çözümlenir.
Programcılıkta öğrenmenin en iyi yollarından birisi bol bol örnek incelemektir. Başka birisi bir işi nasıl yapmış görüp anlarsanız bu bilgi kafanızda daha iyi kalır. Aynı işi tarif ederlerse fazla akılda kalıcı olmaz. Bu nedenle bol bol örnek incelemeye bakın.
Diyelimki ASM (Assembly) öğrenmeye karar verdiniz,
- Komut setini ve fonksiyonlarını iyice öğrenmeye çalışın.
- Programları yazabilmeniz için bir editör programına ihtiyacınız olacak. Bu işi MPASM denilen bir programla yapabileceğiniz gibi her hangi bir editörlede text formatında yazabilirsiniz programları.
– Sonra bu yazılan ASM formatındaki programın pic in anlayacağı HEX file formatına dönüştürülmesi (derlenmesi) gerekir. Aynı işi MPASM programı yapmaktadır. Programı internette arama yaptırarak bulabilirsiniz.
– Elinizde şimdi HEX formatında bir dosya var. Bu dosyayı artık pic’e aktarmaya sıra geldi. Bunun çin piyasadan 1 adet USB den çalışan bir programlayıcı satın alın.  Brenner programlayıcılardan birini kendiniz yapın.
Her iki programlayıcı için yazılmış arayüz programları vardır. Bu arayüz programları HEX dosyanızı alır ve programlayıcı üzerine taktığınız Pic’e yazar. Sonuç olarak birde ara yüz programını bulmanız gerekiyor. Bunların hepside internette mevcut. Yada programlayıcıyı satın aldığınız zaman size arayüz programınıda vereceklerdir.
Şimdi BASIC de çalışmak isterseniz ne yapmanız gerekecek onu izah edeyim. Bu açıklamalarım Pic Basic Pro (PBP) içindir.
- İnternet den Micro Code Studio isimli editör programını yükleyeceksin. Mechanique isimli sitede free olarak vardır.
– Yine internette PBP2.47 yada PBP2.50 sürümleri olan Basic derleyicisini bir yerlerden bulacaksın . Bu derleyiciyi C ana klasörüne kuracaksın.
- MCS yi çalıştırıp view menüsünde bir seçenekde PBP derleyicisinin adresini MCS ye göstereceksin. Sonra artık programlarını yazabilirsin. Yukarıda derle butonuna basınca da programın derlenecek ve aynı yerde HEX dosyası oluşturulacaktır. Hata bulunursa ekran altında sana gerekli açıklamalar verilecektir.
Piyasada birde PrOton yada Pic Basic Plus isimli bir basic derleyicisi daha var. Onun kendi editörü ve derleyicisi bulunmaktadır. Bu programı internetten bulursan yükleyip aynı şekilde önce programı yazıp sonra derleme butonuna tıklayarak programlarını Hex formatına çevirebilirsin.
Elde edilen Hex dosyasının Pic’e yazılması işlemi yine aynı. Arayüz programınızı çalıştırıp, hex dosyasını yükleyecek ve sonra yaz butonuna basıp programı pic e yazdıracaksınız.
Son olarak da C dili ile ilgili programlardan biraz bahsedeyim. Bir kaç tane C dili derleyicisi var. Bunlar derleyiciyi yazan firmalara göre değişik isimler almaktadırlar. Hepsinin kendi editörleri ve derleyicileri mevcuttur.
Bu yazımızda PIC programlamaya başlamak isteyen arkadaşlara yardımcı olmaya çalışacağız. Öncelikle PIC nedir onla girelim. PIC Microchip firmasının üretimi olan mikrodenetleyicilerinin model ismidir. PIC 16F877, PIC 16F84, PIC 16F628A gibi, bunlar birer entegre ismi. Ancak Mikrochip firmasının PIC mikrodenetleyicileri o kadar yaygın kullanılıyor ki peçete yerine selpak ifadesinin kullanılması gibi PIC denilince akla mikrodenetleyici geliyor.
Neden yaygın kullanılıyor derseniz ilk başta fiyat uygunluğu geliyor, kolay bulunması ve internette ilgili dökümanların kolay bulunabilmesi de diğer artı özellikleri. Sadece PIC mikrodenetleyicisi kullanmış biri olarak diğer firmaların ürettiği (mesela motorola) mikrodenetleyiciler hakkında pek bir bilgim yok. PIC le başladı öyle gidiyor, ancak bundan sonra alternatifleri de değerlendirmeye çalışacağım.
PIC le neler yapabiliriz?
Bu soruya tam bir cevap vermek veya PIC le yapılabilecek uygulamalara bir sınır koymak oldukça zor, elektronik tecrübeniz arttıkça verebileceğiniz cevaplar da artacaktır. Ancak basitçe;mikrodenetleyiciler bizim için karar verirler, ne zaman ne yapması gerektiğini program aracılığıyla söylersiniz ve PIC bunu sizin için yapar. Örneğin: Ne zaman hangi ledleri yakacağını söylerseniz led panelde kayan yazı yapabilirsiniz veya tuş takımından girilen şifre doğru olursa röle yardımıyla şifreli kapı yapabilirsiniz vs.
PIC programlamaya hangi model PIC le başlayalım?
Yeni başlayacak arkadaşlar için en uygun modeller 16F84A-16F877A-16F628 veya 16F628A

 olduğunu düşünüyorum. Bu model PIC lerin bazılarında dahili osilatör olduğu için harici osilatör bağlamak durumunda kalmayacaksınız. Bu durmda mikrodenetleyicimizi çalıştırmak için sadece VDD ucuna +5V ve VSS ucunu toprağa bağlamamız yeterli olacaktır.
PIC 16F628 modelinde toplam 18 adet pin bulunur, bunlardan 16 tanesi giriş-çıkış pini olarak kullanılabilir kalan 2 pin ise PIC in çalıştırılmasıyla ilgilidir(Besleme ve toprak pinleri). Bu 16 giriş-çıkış pinimizden 8 tanesi A portuna 8 tanesi de B portuna ait pinlerdir.
(bu arada mikrodenetleyici = mikroişlemci + bellek + giriş-çıkış vs çevresel birimler olduğunu bildireyim)
Fiilen PIC programlamaya başlayabilmeniz için gereken asgari gereçler;
Donanım Olarak;
1) Herhangi bir model PIC Mikrodenetleyicisi
2) PIC Programlama Cihazı (PIC Programlama devresi)
3) Bilgisayar
Yazılım olarak;
4) Derleyici (Seçtiğiniz programlama diline bağlı olarak size bir derleyici(compiler) gerekir)
5) Programlama Cihazıyla irtibatı kuracak olan(çoğunlukla programlama cihazıyla birlikte verilir) yani yazdığınız kodu entegrenize yüklenmesini sağlayan yazılım.
Şimdi internette pek sık duyduğumuz bazı isimleri bu kategorilere koyalım (terimlerden kafası karışan arkadaşlar için),
ICPROG: 5. maddemizle ilgili; yazdığımız kodların PIC e yükleme amaçlı kullanabileceğimiz aracı yazılımlardan bir tanesidir.
PicBasic: 4. maddemizle ilgili, PIC programlama yapabilmek için alternatif programlama dillerinden bir tanesi, bu dille programlamak istiyorsanız PicBasic derleyicisine ihtiyacınız var demektir.
Pic C: Yine 4. maddemizle ilgili, PIC C de pic programlamada kullanılabilecek alternatif dillerden birisidir.
Yukarıda saydığımız 5 şarta sahip olduğunuzda PIC programlamak için yapmanız gerekenler sırasıyla şöyle olacaktır.
1) Bilgisayarımızı açar, PIC C Derleyicimizi çalıştırırız. Yapmak istediğimiz uygulamaya ve mikrodenetleyicimize göre kodumuzu yazarız.
2) Kodu derleyip, hex dosyası oluşturduktan sonra hex dosyasını PIC e yükleyecek olan ve yukarıda da aracı yazılım olarak bahsettiğimiz yazılımı çalıştırırız.
3) Mikrodenetleyicimizi PIC Programlama cihazına yerleştirdiysek yazdığımız kodun hex uzantılı dosyasını bu yazılım aracılığıyla PIC imize yükleyebiliriz ve artık PIC i programlama cihazından söküp devremizde kullanabiliriz.
Ancak tüm bunları sağlamak ve hatasız uygulamalar geliştirmek yeni başlayan arkadaşlar için epeyce zor olacaktır. Bu yüzden en uygun başlama yönteminin simülasyon programlarıyla olduğunu düşünüyorum. Simülasyon programı kullandığımız durumda yukarıdaki listenin donanım bölümündeki
1)”Herhangi bir model PIC Mikrodenetleyicisi”
2)”PIC Programlama Cihazı” maddelerinden kurtuluyoruz ve daha da önemlisi yanlış bağlantılarla yanabilecek donanım veya çalışmayı önleyebilecek donanım hatalarından kurtuluyoruz.
Yazılım çevresinde elektronik simülasyonu yapan bir çok program var ancak PIC simülasyonu yapabilen pek yok. PIC simülasyonu yapan ve benim de kullandığım PROTEUS adında gayet güzel bir simülasyon programı var. (PIC simülasyonunu mümkün kılan programların özelliği yazdığınız kodları bu programlar sayesinde bilgisayar ortamında PIC e yükleme ve çalıştırma imkanı vermesidir. )
Bu işlemleri fiilen yapmak istediğimizde
 1. PIC i programlamak için bir takım işlemler
 2. çalıştırmak için birtakım işlemler yapmak durumundasınız, ancak simülasyon programları sayesinde programlamak için PIC inize sağ tıklayıp derleme sonucu oluşan hex dosyasını kaynak olarak göstermek, çalıştırmak için de simülasyon programınızın çalıştır düğmesine basmak yeterli olacaktır.
PIC programlamak için gereken asgari gereçlerin yeni bir listesini yapmamız gerekirse;
1) Yazacağınız kodları derleyip, hex dosyasına çevirecek derleyici. (Seçeceğiniz dile göre değişir, PIC C Dili, PIC Basic dilleri için derleyiciler internette mevcut)
2) Proteus Simülasyon Programı
olacaktır.
Bu şekilde PIC programlama dünyasına hızlı giriş yapabilirsiniz, bu işlemlere illa da fiilen başlamak istiyorsanız bir kaç denemeden sonra yine simülasyon ortamına döneceksiniz çünkü yazdığınız kodları gerçek bir PIC de denemeniz için gereken işlemler sürekli yapıldığında çok can sıkıcı olur, genelde kodumuzdan emin olduğumuzda son işlem olarak gerçek PIC e yükleme yaparız, ha bir aksilik olursa en fazla bir kaç defa değiştirip yükleriz. Kod geliştirme işlemini simülasyon üzerinden ilerletiyoruz son aşamada gerçek bir PIC e yüklüyoruz (hazır olduğunu düşündüğümüzde), bu her seviyeden PIC programcısı için böyledir.
PIC Assembly Dersleri
1. Ders: PIC Programlamaya Giriş
Mikroişlemci Nedir?
Mikroişlemci, ön belleğine yazılan programı işleterek istenilen çıkışlara yönlendiren birimdir.
Sayısal bilgisayarlar üç temel kısımdan (mikroişlemci, giriş/çıkış birimleri ve bellek) ve bunlara
ek olarak bazı destek devrelerden oluşur. Her bir temel kısım en basitten en karmaşığa kadar
çeşitlilik gösterir.
Mikroişlemci/Merkezi Đşlem Birimi (Central Proccesing Unit - CPU): Sistemin kalbidir. Birim
hesapları yapmak ve verileri idare etmek için 4, 8, 16, 32, 64 bitlik veri formatında çalışır, belki
gelecekte bu sayı çok artacaktır.
Giriş/Çıkış Birimi (Input/Output): Sayısal, analog ve özel fonksiyonlardan oluşur.
Mikroişlemcinin dış dünya ile ilişkisini sağlar. Mikroişlemciye verilen ve işlemlerden alınan
veriler bu birim üzerinden sağlanır.
Bellek: Mikroişlemcinin işleyeceği komutlar ve veriler belleklerde tutulur. Bilginin işlenmesi
sırasında ortaya çıkan ara değerler ve sonuçları da mutlaka belleklerde tutulmak zorundadur.
Mikrodenetleyici Nedir?
Mikrodenetleyici; mikroişlemci, giriş/çıkış birimleri ve bellekten oluşan bir entegredir.
Mikrodenetleyiciler bir yazılım olmadan hiçbir işe yaramayan bir plastik, metal ve temizlenmiş
kum yığınıdır. Kendisini kontrol eden bir yazılım olduğunda ise neredeyse sınırsız bir
uygulamaya sahiptir.
Mikrodenetleyicinin Avantajları
Mikrodenetleyicilerin mikroişlemcilere olan avantajları oldukça fazladır. Örneğin mikroişlemcili
bir sistem yapıldığında mikroişlemcinin yanısıra bellekler (RAM, ROM veya EPROM), giriş/çıkış
birimi ve buna benzer birçok sistem kullanılmaktadır. Bu karışık sistemin hem tasarlanması ve
yapımı zordur hem de maliyeti daha yüksektir. Mikrodenetleyicilerde bir sistemin
çalıştırılabilmesi için yalnızca bir mikrodenetleyici ve osilatör devresi yeterli gelmektedir.
Sistemde gerekli olan ön bellek ve G/Ç birimi mikrodenetleyici içinde bir yonga halindedir.

Assembly Dili Nedir?
Assembly, sadece 1'lerden ve 0'lardan oluşan makine dillerinin insanlar tarafından daha anlaşılır
hale getirilmesi ihtiyacından doğmuş bir programlama dilidir. Örneğin bir mikroişlemcinin bir
veriyi bir yerden başka bir yere taşıması için kullanılan 10011101 diye bir komut olduğunu
düşünelim. Đşte Assembly dilinin yaptığı iş bu komutu Đngilizce taşımak anlamına gelen "move"
eylemine ithafen MOV şekline dönüştürmektir. Yani programınızı yazarken siz 10011101 yerine
MOV yazarsınız, daha sonra Assembly derleyicisi bunu otomatik olarak 10011101 sayısal
ifadesine dönüştürür. Bu tür kelimeleri akılda tutmak sayısal ifadeleri akılda tutmaktan daha kolay
olduğundan hem kolay ve hızlı bir yazım sağlanır hem de önceden yazılmış olan programların
okunup anlaşılması kolaylaşır.
Assembly, programlama dillerinin en ilkelidir de diyebiliriz ama programlama dillerinde ilkellik
demek temellik demektir, bu da herhangi bir programlama dilinde yapmanız mümkün olmayan
şeyleri de bu dille yapabilmeniz anlamına gelir. Assembly dili mikroişlemcilerin asıl dili olan 0 ve
1'lerden oluşan dile en yakın dildir. Diğer dillerde yazdığımız programlar öncelikle Assembly
diline derlenirler (0 ve 1'lere) daha sonra makineye (işlemciye, denetleyiciye, bilgisayara)
iletilirler. Yani diğer dillerdeki herhangi bir komut kesinlikle Assembly dili kullanılarak
oluşturulabilir. Assembly dili, bu anlamda diğer dillerin yapı taşıdır, yani Assembly ile
yazılamayacak program yoktur ama diğer programlama dilleri ile yazılamayacak program çeşitleri
mutlaka mevcuttur. Tabii ki bu diğer diller gereksiz manasında anlaşılmamalıdır.
Eğer kapsamı küçük bir donanım için bir program yazıyorsak Assembly kullanarak çok daha
verimli programlar elde edebiliriz. Özellikle işlem kapasitesi küçük bir işlemci kullanıyorsak bir
önceki cümle geçerliliğini arttırır (pipelining ve paralel işleme desteklemeyen işlemciler). PIC
16F84 mikrodenetleyicisi de kapasitesi az olan bir denetleyici sayılır. Fakat geniş kapasiteli
bir işlemci veya denetleyici kullanıyorsak programımızı diğer dillerle yazıp sadece özel özen
gerektiren yerlerde Assembly kullanmak bizi daha verimli sonuçlara ulaştırabilir.
Günümüzde Microchip firması, standart ürettiği PIC ailelerinin dışında birçok özelleşmiş PIC
aileleri de üretmektedir. Mesela USB veri alışveriş yongasının dahili olarak bulunduğu PIC'lerden
tutun da RF iletişim için özelleşmiş PIC'lere kadar birçok değişik özellikte PIC üretilmektedir.
Standart PIC aileleri ise kaç bitlik komutlardan oluştuklarına (merkezi işlem biriminin dahili
olarak kaç bitlik veri yoluna sahip olduğuna) göre isimlendirilirler. Mesela bu komutlar
16(C/F)5xx serisi işlemcilerde 12 bit, 16(C/F)XX işlemcilerde 14 bittir.

PIC programcıları program kodlarını yazarken bir komutun kaç bitlik kelime boyundan oluştuğu
ile pek fazla ilgilenmezler. Seçilen bir çipi programlarken uyulması gereken kuralların ve o çiple
ilgili özelliklerin bilinmesi yeterlidir. Bu özellikler PIC'in bellek miktarı, G/Ç portu sayısı, A/
D dönüştürücüye sahip olup olmadığı, kesme (interrupt) fonksiyonlarının bulunup bulunmadığı,
bellek tipinin ne olduğu (Flash, EPROM, EEPROM vb.) gibi bilgilerdir.

PIC, kaynaklarına en kolay ulaşılabilen ve amatör çalışmalar için fiyatı oldukça uygun olan bir
işlemcidir. Hatta profesyonel çalışmalarda bile kullanılabilecek kadar güvenilir kod korumasına
sahiptir. Mesela 16F84 tipi bir işlemci flash program hafızasına sahiptir, 1 milyondan fazla kere
silinip tekrar programlanabilmesine ve diğer birçok gelişmiş özelliğine karşın fiyatı sadece 4-5

Nasıl Programlanır?
PIC'i programlamak için öncelikle yazdığımız programı HEX koduna (0 ve 1'lerden oluşan
makine dilinin 16'lık sayı sisteminde yazılmış hali) çeviren derleyiciye ihtiyacımız vardır. Eğer
programı yazmak için Assembly dilini kullanıyorsak herhangi bir Ascii karakter koduna göre
çalışan program kullanmamız yeterlidir. Bu programlara örnek olarak Windows altında Notepad
veya Linux altında Gedit, KWrite gibi programlar verilebilir. Yazdığımız programı derleyici
ile derledikten sonra (Assembly dili için Mpasm adlı program kullanılır) PIC'i programlayacak
olan elektronik devrenin (programlayıcı) bilgisayar arayüzü çalıştırılır. Programcının bilgisayar
arayüzüne derlenen dosya'nın yani HEX dosyasının yeri gösterilir. Artık programlama işlemi
yapılabilir. Sonuç olarak bir PIC'i programlamak için; program(.asm), derlenmiş program(.hex),
programcı arayüzü ve programcı devresi gerekir.
PIC kullanarak bir program veya çalışan bir devre yaparken izlenecek adımlar şunlardır:
1) Ne yapacağımızı tasarlamalı ve tam olarak tanımlamalıyız,
2) Donanım tasarımını tam olarak bitirmeliyiz,
3) Yapacağımız programla ilgili akış diagramı çıkartmalıyız,
4) Assembly programını bir Ascii editör programına yazmalıyız ve uzantısını .asm olarak
kaydetmeliyiz,
5) Mpasm programını kullanarak bunu derlemeliyiz,
6) Programlayıcı elektronik devre yardımı ile HEX dosyasını PIC'in içine yüklemeliyiz.

Not: Buradaki bilgilerden çok daha geniş kapsamlısını internetten bulabilirsiniz. Data sheet'ten

okuduktan sonra deneme yanılma ile uygulama yapmak en güzel öğrenme yoludur.   2. Ders: Çalışma Mantığı ve
Komutlar
2. Ders: 
Piclerin Çalışma Mantığı ve Komutlar

Geçen derste PIC'i çalıştırmak için gerekli olan minimum donanımdan bahsetmiştik. Beslemeleri
bağlamak (1.+5V, 2.0V),3. reset bacağını +5V'a bağlamak ve 4.osilatör bacaklarının bağlantılarını
yapmak PIC'i çalıştırmak için bu dördü yeterliydi. Şimdi biraz daha ayrıntılı inceleyeceğiz, PIC
komutlarına ve register (yazmaç) mantığına giriş yapacağız, PIC'in içinde neler olduğunu biraz
daha ayrıntılı olarak öğreneceğiz.

Eğer Microchip firmasının herhangi bir mikrodenetleyicisini kullanacaksınız data sheet'ler %90
ihtimalle sizin için yeterli olacaktır. Eğer ingilizceniz varsa bir denetleyiciyi öğrenmek için
tek yapmanız gereken oturup data sheet'i okumak ve uygulamalar yapmaktır. Zaten yazacağınız
programı sınırlayan genelde denetleyicinin yetenekleri değil sizin yeteneklerinizdir. Bunu şöyle
açıklayayım: işlemcinin çarpma komutu olmayabilir, o zaman siz diğer komutların birleşimi
cinsinden çarpma fonksiyonunu yazmalısınız; işlemcinin analog/sayısal çeviricisi olmayabilir, siz
haricen kullanabilmelisiniz...

Bizim PIC'in bir reset bacağı var ve eğer bu bacak 1 seviyesinde (+5 Volt) olursa reset olmaz
ama eğer bu bacak 0 seviyesinde (0 Volt) olursa PIC reset olur demiştik. 
Şimdi gelelim RESET'in anlamına. Reset demek programınızın başa dönmesi demektir, başa dönmesi demek de programın program hafızasında 0000h adresinden itibaren tekrar okunmaya başlaması demektir. Bu satırın ismi "kesme adresi"dir. işlemciniz bir kesme durumunda bu adrese gider. 
Peki kesme nedir? Normal program akışı içerisinde, isterseniz programınızın akışının 
bozulmasına neden olabilecek öncelikler belirleyebilirsiniz, bu öncelikler oluşunca işlemci bütün
işlerini bırakır ve sizin 0004h adresine yazdığınız alt programı öncelikli olarak işler. Sonra kaldığı
yerden ana programı işlemeye devam eder. Burada program akışı kesildiği için  bu olaya kesme denir. 

Programlama dili yazarken:

Girintiler ve Program Bölümleri

Bir assembly programı temel olarak dört bölüme ayrılır. Bunlar: Başlık, atama, program ve sonuç bölümleridir.

Başlık

Programın en başındaki bilgilere başlık bölümü denilir.
Baş tarafına (;) konulan satır, assembler tarafından hexadesimal kodlara dönüştürülmez. Bu satırlar programın geliştirilmesi esnasında hatırlatıcı açıklamaların yazılmasında kullanılır. Örneğin CLRF ile başlayan satırda "portB'nin içini sıfırla" cümlesi, CLRF komutunun ne iş yaptığını açıklar. Programın bölümlerini birbirinden ayırmak için (-—-—— veya =====) çizgileri kullanmak, programı görsel olarak daha okunur hale getirdiği gibi bu çizgiler arasına uyarılar ve açıklamalar da yazılabilir.
======== PICDENEME.ASM ======== EYYUP KÜÇÜKASLAN ===== 18.03.2013 =====LIST P=16F84A
 LIST P=16F84A satırı, programın hangi PIC için yazıldığını belirtir. LIST bir compiler bildirisidir. Yani compiler’i yönlendiren bir komuttur.
Başlık bölümünde ayrıca INCLUDE komutu da kullanılabilir. INCLUDE komutu adresleri sabit olan STATUS, PORTA, PORTB, TRISA, TRISB gibi özel registerlerin “atamalar” bloğunda adreslerini her defasında belirtme zorunluluğunu ortadan kaldırmak için kullanılan bir compiler bildirisidir.

#include "P16F84.INC"

Assembler, yukarıda belirtildiği gibi komutların üç kolona bölünerek yazılmış olduğunu varsayar. Belirtilen kolona yazılmayan bir komut olduğunda ise bunu da kabul eder. Ancak, hexadesimal kodlara dönüştürme (Compile) esnasında hataları bir uyarı (Warning) olarak belirtir. Assembly komutları yazılırken kolonlar arasında verilen TAB'ların uzunluğu önemli değildir. SPACE tuşu ile verilen aralık da assembler tarafından TAB olarak algılanır.

Etiketler


PIC belleğindeki bir adresin atandığı, hatırlamayı kolaylaştıran kısaltmalardan meydana gelen sembolik isimlere etiket denilir. Örneğin PORTB etiketi, PIC16F84A′ün file register belleğindeki B portunun bulunduğu adresi temsil eden etikettir. Etiketler program içerisinde 1. kolona yazılır. PORTB EQU 0×06 ifadesi program içerisinde yazıldıktan sonra B portunun hangi adreste olduğunu akılda tutmaya gerek yoktur. EQU (eşitleme) ifadesidir. Programın herhangi bir yerinde PORTB etiketi kullanıldığında, B portunun adresi olan 0×06 yazılmış gibi işlem görür. Program akışı yukarıdan aşağıya doğru devam ederken GOTO DONGU komutu ile, akış DONGU yazılan etikete dallandırılır. Bu etiketin adresi bir özel register adresi gibi fiziksel bir adres değildir. Bu şekilde tanımlanan bir etikete assembler otomatik olarak bir adres atar. Bu adresi bizim bilmemiz gerekmez.
Etiket tanımlarken uyulması gereken kurallar şunlardır:
•    Etiketler 1. kolona yazılmalıdır.
•    Etiketler bir harfle veya alt çizgi( _) ile başlamalıdır.
•    Etiketler içerisinde Türkçe karakterler kullanılamaz.
•    Etiketler bir assembly komutundan oluşamaz.
•    Etiketlerin içerisinde alt çizgi, rakam, soru işareti bulunabilir.
•    Etiketler en fazla 31 karakter uzunluğunda olabilir.
•  Etiketlerde büyük/küçük harf duyarlılığı vardır. (“Döngü” olarak tanımlanmış bir etiketi program içerisinde “döngü” yazarak kullanılamaz.)
ETİKET
STATUS
  

Atama deyimi (EQU)

EQU deyimi PIC16F84′ün belleğindeki bir hexadesimal adresi belirlenen bir etikete atamak için kullanılır.

ATAMA KOMUTU
EQU 

Sabitler

PIC assembly dilinde heksadesimal sayılar birer sabittir, Sabitler MOVLW ve bazı mantıksal ve aritmetik işlem komutlarında kullanılırlar.

HEX ADRES           
0X03

ORG Deyimi

ORG ingilizcedeki “origin” kelimesinden gelmektedir. ORG deyimi iki amaç için kullanılır.
•    Program komutlarının hangi adresten itibaren başladığını gösterir.
•    PIC 16F84′ün Interrupt alt programlarının başlangıç adresini belirlemede kullanılır.
PROGRAM BLOĞU
ETİKET
START
KOMUT
ORG
CLRF
MOVLW
SABİT,ETİKET VEYA HEKSADESİMAL ADRES
0X00
PORTB
0XOF 

Sonlandırma Bloğu

PIC16F84′ün duraklama (halt) komutu yoktur. Programı belirli bir yerde duraklatmak için bazen sonsuz döngü kullanılır.
DONGU
GOTO DONGU
END
Yukarıdaki sonsuz döngüde DONGU etiketine assembler otomatik olarak bir adres verir. GOTO DONGU komutu ise program akışını devamlı olarak aynı adrese gönderir. Bu durumda program belirlenen adreste duraklatılmış olur. END deyimi ise program komutlarının sona erdiğini assembler’a bildirir. Her program sonunda end deyimi muhakkak kullanılmalıdır. Aksi halde program devam derlenirken dosya sonunun belirtilmediğini belirten bir hata mesajı verecektir.

Büyük ve Küçük Harflerin Kullanımı

PIC assembler komutlarının büyük veya küçük harfle yazılması önemli değildir. İstenirse büyük/küçük harf karışımı komutlarda kullanılabilir. Örneğin Movlw, movhv, MOVLW komuttan arasında hiçbir fark yoktur. Ancak etiketler büyük/küçük harf duyarlıdır. Start ile START birbirinin aynısı değildir. Herhangi bir karışıklığa neden olmaması için hep büyük veya hep küçük harf kullanmak en iyi seçimdir.; (noktalı virgül) işaretinden sonra gelen yazılar derleyici tarafından dikkate alınmaz ve bu
yüzden programlarda yorum yazmak amacıyla kullanılır.

Assembly dilinde her komut ingilizce bir mananın kısaltılmışıdır ve bu komut aslında
2'lik sistemde 6'bitlik bir sayıyı temsil eder. Eğer bu komutla birlikte bir sabit sayı falan da
kullanılacaksa (komut gerektiriyorsa) o zaman program memory'ye bu sabit ile yazılırlar.

CONFIG (CONFIGuration): Bu komut ile işlemcinin bazı özelliklerini ayarlarsınız. Aşağıda
komutun tam yazım şekli ve komut hakkındaki açıklamalar belirtilmiştir.
Örnek1:
__CONFIG _WDT_OFF &_XT_OSC &_PWRTE_ON &_CP_OFF

Örnek2:
_CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

Örnek3:
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 
@ DEVICE pic16F628A, WDT_OFF 
@ DEVICE pic16F628A, PWRT_ON 
@ DEVICE pic16F628A, MCLR_OFF 
@ DEVICE pic16F628A, BOD_OFF 
@ DEVICE pic16F628A, LVP_OFF 
@ DEVICE pic16F628A, CPD_OFF 
@ DEVICE pic16F628A, PROTECT_OFF 


yazılabilir.

_CP_OFF (Code Protect OFF): Buraya OFF yerine ON da yazabilirsiniz. Bu komut ile işlemcinize yazdığınız kodu başkalarının okuya bilip okuyamayacağını belirlersiniz.

_WDT_OFF (Watch Dog Timer OFF): Watch Dog Timer'ın açık mı kapalı mı olacağını belirlemenize yarar, Watch Dog Timer'ın ne olduğunu ileride göreceksiniz.

_PWRTE_ON: işlemcinin açılışta kendisine reset atmasına yarar, OFF veya ON olabilir.

_XT_OSC: Devrede kullandığınız osilatör tipini belirtmenize yarar. Diğerlerinden farklı olarak 4 farklı değer alabilir: RC, XT, LP, HS.
Osilatör bir frekans üretecidir. Pic ile alakalı bölümünde bir kare dalga frekans üretecidir. Pic bu kare dalganın her bir palsinde bir işlem yapar. Dolayısıyla osilatör olmaz ise pic de işlem yapmaz.

INTRC:Dahili Osilatörü Kullanacağınızı belirtir.

MCLR: girişi Türkçe tabiri ile Reset bacağıdır

RC - Direnç/kondansatör (Resistor/Capacitor).

XT - Kristal veya seramik resonatör (Xtal).

HS - Yüksek hızlı kristal veya seramik resonatör (High Speed ).

LP - Düşük frekanslı kristal (Low Power).

Seçilecek olan osilatör tipi PIC'in kontrol ettiği devrenin hız gereksinimine bağlı olarak seçilir. Aşağıdaki tablo hangi osilatör tipinin hangi frekans sınırları içerisinde kullanılabileceğini gösterir.


Osilatör tipi Frekans sınırı

RC 0 – 4 MHz

LP 5 – 200 KHz

XT 100 KHz – 4 MHz

HS (-04) 4 MHz

HS (-10) 4 – 10 MHz

HS (-20) 4 – 20 MHz

PIC'e bağlanan clock osilatörünün tipi programlama esnasında PIC içerisinde bulunan konfigürasyon bitlerine yazılmalıdır. Osilatör tipini belirten kodları (RC, XT, HS ve LP)

PIC ASSEMBLY KOMUTLARININ YAZILIŞ BİÇİMİ


PIC16F84'ün toplam 35 tane komutu vardır. Bu komutların yazılış biçimini üç grupta toplayabiliriz.

1. Byte-yönlendirmeli komutlar.

2. Bit-yönlendirmeli komutlar.

3. Sabit işleyen komutlar.

4. Kontrol komutları.

Komutların yazılış biçimlerini açıklarken bazı tanımlama harfleri kullanacağız. Önce bu harflerin anlamlarını verelim:

f = File register 

d = destination (gönderilen yer)

d=0W register

d=1file register 

k = Sabit veya adres etiketi b = Bit tanımlayıcı

b = Binary sayıları belirleyen harf (örneğin b'00001111' gibi) 

d = Desimal sayıları belirleyen harf (Örneğin d'16' gibi)

1.Byte-Yönlendirmeli Komutları

Örnek: MOVF 0x03, 0 ;0x03 adresindeki file registerin içeriğini W registeri içerisine kopyalanır. 

MOVF STATUS , 0 ;STATUS registerin içeriği W registere kopyalanır. 

MOVF STATUS ,1 ; STATUS registerinin içeriği yine kendi içine yazılır.


NOT: Byte-yönlendirmeli komutlarda destination (gönderilecek'' yer) belirleyen d'nin yazıldığı yere 0 veya 1 yazmak hatırlatıcı olmayabilir. MPASM bunu dikkate alarak 0 yerine w, 1 yerine f yazmaya izin verir. MPASM'nin MS-DOS versiyonunda ise w ve f harflerinin otomatik olarak kullanılmasına izin verilmez. Bu durumda her programın tanımlama bölümünde aşağıdaki eşitlikler yazılmalıdır.

W EQU 0 

F EQU 1

Bu eşitliklerden sonra komutlarda destination belirlemek için w ve f harfleri kullanılabilir. Örneğin:

INCF, w ; SAY registerinin içeriği 1 arttırıldıktan sonra sonuç W registerine yazılır.(W=SAY+1)

INCF, f ; SAY registerinin içeriği 1 arttırıldıktan sonra sonuç yine SAY registeri içine yazılır. (SAY=SAY+1)

2.Bit-Yönlendirmeli Komutlar


Örnek: BCF 0x03, 5 ; 0x03 adresindeki registerin 5. bitini sıfırla

BSF STATUS, BESBIT ;STATUS registerinin BESBIT etiketiyle tanımlı olan bitini "1" yapar. (Tanımlama bloğunda BESBIT EQU 5 yazılması gerekir.)

3.Sabit İşleyen Komutlar


Örnek: MOVLW 0x2F ;W registerine 2F heksadesimal sayısını yükler.

ADDLW b’00101111’ ;W registeri içerisindeki sayıya 00101111 binary sayısını ekler.

4.Kontrol Komutları


Örnek: GOTO DONGU ;Program akışı DONGU olarak belirlenen etikete dallanır.

CALL TIMER ; Program akışı TIMER etiketi ile belirlenen adresteki alt programa dallanır.

NOT: Program içerisinde yazılan etiketlere assembler'in otomatik olarak adres verdiğini unutmayın.

SAYI VE KARAKTERLERİN YAZILIŞ BİÇİMİ

PIC assembly komutlarında sayılar heksadesimal, binary veya desimal formda kullanılabilir. Değişik kaynaklarda kullanılan sayı ve karakter gösteriliş biçimleriyle karşılaştığınızda bunları okuyabilmeniz için aşağıda örnekler verilmiştir.

Heksadesimal sayılar


Heksadesimal sayılar "0x", "0" veya "h" harfleriyle başlamalıdır. Örneğin, STATUS registerine 03 adresini atamak için aşağıda gösterilen yazılış biçimleri kullanılabilir.

STATUS EQU 0X03

EQU 3

EQU 03

EQU 03h

EQU h’03’ (Bu kitapta örneklerde kullanılacak biçim)

MOVLW komutu ile W registeri içerisine yüklenecek olan FF heksadesimal sabitler ise aşağıdaki gibi yazılabilir.

MOVLW 0xFF

h’FF’

Eğer FF heksadesimal sayısını aşağıdaki gibi kullanmaya kalkarsanız çalışmaz

MOVLW FP 

FFh

Çünkü kural olarak heksadesimal sayılar muhakkak "0" veya "h" harfi ile başlamalıdır.

Binary Sayılar


Binary sayılar b harfi ile başlamalıdır. Örneğin 00001010 binary sayısını W registeri içerisine yüklemek için aşağıdaki gibi yazılmalıdır.

MOVLW b’00001010’ 

ANDLM b’00001111’

Desimal sayılar


Desimal sayıların başına d harfi konularak tırnak içerisinde yazılırlar. Örneğin 15 desimal sayısı W registeri içerisine yüklemek için aşağıdaki gibi yazılmalıdır.

MOVLW d’15’

MOVLW d’255’

ASCII Karakterler


Genellikle RETLVV komutu ile birlikte kullanılan ASCII karakterler tırnak içerisine alınarak aşağıdaki gibi yazılırlar.

RETLW ‘A’

RETLW ‘T’

PIC ASSEMBLY KOMUTLARI



Yer Değiştirme veya Yükleme Komutları

Komut ve Örnek

İngilizce tanımı

Türkçe açıklaması

MOVLW k

Move Literal to W

K sabit değerini W registerine yükler.

MOVLW h ‘0F'


W<-op br="" nbsp="">

MOVF f,d

Move f

f registerinin içeriğini W veya f’e yükler.

MOVF TEST,0


d=0 WTEST d=1 TESTTEST

MOVMF f

Move W to f

W registerin içeriğini f registerine yükler.

MOVWF PORTA


PORTAW
Register İçeriğini Değiştirme Komutları

CLRF

F

Clear f

f registerinin içeriğini siler (sıfırlar).

CLRF

TRISA


TRISA00000000

CLRW


Clear W

W registerin içeriğini siler (sıfırlar).

CLRW



W00000000

COMF

F,d

Complement f

F registerinin içindeki sayı terslenir. Yani tüm 1'ler 0, 0'lar 1 olur. Sonuç W veya f registerine yüklenir.

COMF

SAY, 0


SAY= 0011011 ise,

d=0 W11001010

d=1 olsaydı SAY11001010

DECF

f,d

Decrement f

F registerinin içerisindeki sayıyı "1" eksiltir. Registerin içeriği h'00' ise, "1" eksiltildiğinde h'FF' olur. Sonuç W veya f registerine yazılır.

DECF

GIT,1


GIT=h' 2C" ise 2C-1=2B

d=1 GIT2B

d=0 olsaydı W2B

INCF

f,d

Increment f

F registerinin içerisindeki sayıyı "1" artırır. Registerin içeriği h' FF' ise, "1" arttırıldığında h' 00' olur. Sonuç W veya f registerine yazılır.

INCF

GIT, 0


GIT=h' 2C' ise 2C+1=2D

d=0 W2D

d=1 olsaydı GIT2D

BCF

f,b

Bit Clear f

f registerinin içerisindeki sayının b.ninci bitini sıfırlar.

BCF

PORTB,5


PORTB = b'11111111' ise,

PORTBb' 11011111’

BSF

f,b

Bit Set f

F registerinin içerisinde sayının b.ninci bitini 1 yapar.

BSF

PORTA,3


PORTA = b’ 00000000' ise,

PORTAb' 00001000’

RLF

f,d

Rotate Left f

f registeri içerisindeki sayıyı bir pozisyon sola kaydırır. Registerden taşarak Carry bayrağına yazılan bit, LSB'ye yazılır. Sonuç W veya f registerine yüklenir.

RLF

KAY,0



RRF

F,d

Rotate Right f

F registeri içersindeki sayıyı bir pozisyon sağa kaydırır. Registerden taşarak Carry bayrağına yazılan bit, MSB'ye yazılır. Sonuç W veya f registerine yüklenir.

RKF

KAY,1



SWAPF

f,d

Swap nibbles inf

f registerinin içerisindeki ilk dört bit ile son dört biti yer değiştirir. Sonuç W veya f registerine yüklenir.

SWAPF

DEG,1


DEG = b' 00101111' ise,

d=1 olduğundan DEG11110010

d=0 olsaydı W11110010’
Program Akışını Kontrol Etme Komutları

GOTO

k

Go to address

Program akışı k adresine dallanır.

GOTO

DOMGU


Program, DÖNGÜ etiketinin yazıldığı yere dallanır ve buradan itibaren devam eder.

CALL

k

Call subroutine

Program akışı k etiketinin bulunduğu yerdeki alt programa dallanır.

CALL

TIMER


Program TIMER etiketinin yazıldığı alt program satırlarının başlangıcına dallanır ve buradan itibaren devam eder.

KETÜRN


Return from subrouitine

Alt program komutlarının en sonuna yazılan bu komut, program akışını ana programa geri döndürür.

RETLW


Return with Literal in W

Program akışını alt programdan ana programa döndürür ve W registerine k sabitini yükler.

RETLW

H'2F'


Alt programdan ana programa döndürür ve W registerine 2F yüklenir.

RETFIE


Return From Interrupt

Program akışını interrupt alt programından ana programa döndürür.

BTFSC

f,b

Bit Test F, Skip if Clear

F registerinin b.inci bit'ini test eder. Eğer bu bit "0"sa program akışı bir sonraki komuta geçer.

BTFSC

PORTA,2



BTFSS

f,b

Bit Test F, Skip if Set

F registerinin b.inci bit'ini test eder. Eğer bu bit "1"se program akışı bir sonraki komuta geçer.

BTFSS

PORTA,0



DECFSZ

f,d

Decrement f, Skip if Zero

F registerinin içeriğini "1" azaltır. Register içeriği 0'sa bir sonraki komuta atlar. Sonuç W veya f registere yazılır.

DECFSZ

SAYAC,!


SAYAC=h' 2F’ ise 2F-1=2E

d=0 olsaydı Wh' 2E’

d=1 olduğundan SAYACh'2E'

INCFSZ

F,d

Increment f, Skip if Zero

F registerinin içeriğini "1" arttırır. register içeriği "0"sa bir sonraki komuta atlar. Sonuç W veya f registere yazılır.

INCFSZ

SAYAC, 1


SAYAC=h' 2F’ ise 2F+1=30

d=1 SAYACh' 30'

d=0 Wh'30"
Mikrodenetleyici Kontrol Komutları

CLRWDT


Clear VVatchdog

Timer

Watchdog timer'ı sıfırlar. Aynca vvatchdog timer'ın prescalar değerini de sıfırlar. Status bitlerinden TO ve PD'yi "1"yapar.

SLEEP


Go into standby mode

Mikrodenetleyiciyi uyuma moduna geçirerek güç harcamasını azaltır. Microdenetleyici uyuma modundan reset, watchdog timer ve TOCKI girişi vasıtasıyla çıkar.
Mantıksal Komutlar

ANDLW

K

AND Literal with W

W registerin içeriği ile k sabitine AND işlemini uygular. Sonuç W registerine yazılır.

ANDLW

b’ 0110001'


W = b' 10011101' ise,

b' 00110001' sabitin değeri

b’ 00010001' AND işlemi sonucu

Wb’ 00010001'

ANDWF

f,d

AND W with f

W registeri ile file register içeriğine AND işlemini uygular. Sonuç W veya f registerine yazılır.


ANDWF


TEST,1



W=b' 11111111' ise,

TEST=b’11011110”ise,

b' 11011110' AND işlemi sonucu

d=0 ise Wb' 11011110'

d=1 olduğundan TESTb' 11011110 ’

IORLW

k

Inclusive OR Literal with W

W registerin içeriği ile k sabitine OR işlemini uygular. Sonuç W registerine yazılır.

IORLW

B-00101000-


W =b' 10000100' ise

b' 00101000' sabitin değeri

b' 10101100' OR sonucu ,

W b' 10101100’

IORWF

f,d


W registeri içeriği ile file registerin içeriğine OR işlemini uygular. Sonuç W veya f registerine yazılır.

IORWF

TEST,1


W = b' 10000100" ise,

TEST = b'00101000’ ise,

b' 10101100 ‘ OR sonucu

d=0 ise Wb' 10101100"

d=1 olursa TESTb‘ 0101100 '

XORLW

k

Exclusive OR Literal withW

W registerin içeriği ile k sabitine XOR işlemini uygular. Sonuç W registerine yazılır.

XORLW

b' 00101000’


W = b ‘ 00000000 ‘ ise

b' 00101000’ sabitin değeri

b' 11010111" XOR sonucu

Wb' 11010111'

XORWF<"

P.S- • ..• . -

Exclusive OR W with f

W register ile file register içeriğine XOR işlemini uygular. Sonuç W veya f registerine yazılır.

XORWF

TEST,1


W = b' 00000000' ise,

TEST = b' 00101000' ise,

b' 11010111" XOR sonucu

d=0 ise Wb' 11010111"

d=1 olursa TESTb' 1101011'l'
Aritmetik İşlem Komutları

ADDWF

f,d

Add W with f

W registerinin içeriğini f registeri ile toplar. Sonuç W veya f registerine yazılır.

ADDWF

TOPLA,0


W=h' 2A' ise, TOPLA=h ' 31' ise, h' 2A'+h' 31'=b' 5B'

d=1 ise TOPLAh' 5B'

d=0 olduğundan Wh' 5B'

ADDLW

k

Add Literal andW

W registerinin içeriğini k sabit değeri ile toplar. Sonuç W registerine yazılır.

ADDLW

H' 2F'


W=h' B0’ ise, h' B0'+h' 2F'=h' DF'

Wh' DF'

SUBLN

k

Subtract W from Literal

K sabit değerinden W registeri içeriğini çıkarır. Sonuç W registerine yazılır.

SUBLW

H' 90'


W=h' 83’ ise h' 90'-h' 83' = h' 07’

Wh' 07’


SUBWF


f,d


Subtract W from file register


f registerinin içeriğinden W registerinin içeriğini çıkarır. Sonuç W veya f registerine yazılır.

SUBWF

CIK,1


W=h' 83' ise, CIK=h' 90' ise, h' 90'-h' 83'=h' 07’

d=0 ise Wh' 07’

d=1 olduğundan CIKh’07'
İşlem Yapmayan Komut

NOP


No Operation

Bir komut saykılı süresince hiçbir işlem yapmayan bir komuttur. Bir dahili komut süresinde çalışır. Bu nedenle zaman geciktirme işlemlerinde kullanılır.


PIC16F628A W Registeri ve MOVLW/MOVWF Komutları


Artık yavaş yavaş komutlara geçmeyi düşünüyorum.Aslında bir sürü teorik bilgi var (pic16f628a’nin diş görünümü,pin bağlantıları,çalışması,besleme gerilimi,osilatör çeşitleri,reset uçları ve devresi – mclr resetlenmesi ,wdt resetlemesi vb. - ,bellek yapısı vs.)
Fakat bunların çoğu zaten internette olan şeyler.Blogumda Önemli noktalara yer verip,komutlarıda öğretip daha sonra da uygulamalara geçmek istiyorum.

Neyse bu kadar hikaye kısmı yeter sanırım.
Başlayalım :]

W Saklayıcısını (Register) “geçici depolama alanı” olarakta düşünebiliriz.Diğer programlama dillerinde de vardır registerlar.
PIC’te gerçekleştereceğimiz tüm işlemlerde W saklayıcısını kullanmak zorundayız.

W Registeri ilede ilk kodumuzu söyle bir diyagramda öğrenmiş olalım;

Bu iki satırlık kodda diyorki ;

W saklayıcısına “binary 11111111” verisini yükle – yada taşı -
daha sonrada bu veriyi TRISA’ya at.

Aslında kafanızda daha rahat oturması amacıyla Winrar mantığıyla düşünebilirsiniz.Bir dosyayı ilk önce sıkıştırıyorsunuz daha sonrada bu sıkıştırdığınız dosyayı dışarı çıkartıyorsunuz.


Elektronikte bildiğiniz gibi bir şeyi 1 ile aktif eder, 0 ile durdurur ya da “deaktif” ederiz ( dijital mantığı )

Bu iki satırlık kodumuzda da TRISA ile PORTA nın tüm uçlarını giriş yaptık.

TRISA = PORTA’yı giriş/çıkış yapar
TRISB = PORTB’yi giriş/çıkış yapar.
PORTA = Genelde giriş olarak kullanılır ( yapısından dolayı,bknz:Schmitt Trigger(ST) yapısı )
PORTB = Genelde çıkış olarak kullanılır (yapısından dolayı,bknz:TTL yapısı)

MOVLW[boşluk][W saklayıcısına atılacak veri] şeklinde kullanılır.

MOVWF[boşluk][W saklayıcısının içerisindeki veriyi f saklayıcısına yükler] (F saklayıcısı burada PORTA,PORTB,TRISA,TRISB olabilir. Bunların içinde de birer register bulunmaktadır.Örneğin PORTA’nın içerisinde 8-bit uzunluğunda bir veri tutucu adınada PORTA registeri denmektedir.)

PIC16F628A Konfigürasyon


PIC16F628A için örnek konfigürasyon ayarlarını veriyorum.Bunu kendinize göre düzenleyebilirsiniz.MPLAB kullanıyorsanız bu konfigürasyonları elle yazmamız lazım.Editörde bu konfigürasyonlar yeni bir çalışma sayfası açıldığında gelmiyor maalesef.

;===KONFIGURASYON.ASM========================================================
LIST P=16F628A

__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF

;---------------------------------------------------------------------------------------

Örnek bir konfigürasyon ayarımız.Siz isterseniz - örnek veriyorum - DATA_CP yi ON yaparak kodlarınızı okunabilir hale getirebilirsiniz [; Default olarak OFF yapılmış bu kod dizisinde.


PIC Assembly Genel Komutlar ne işe yaradıkları


Bu yazımda size PIC için gereken genel komutlarımızdan bahsedeceğim.

Her PIC yazmaya başladığımızda üst tarafta hangi PIC te yazacağımızı belirtmek amacıyla LIST P= komutunu kullanırız.Örneğin biz PIC16F628A ile işlem yaptığımız için LIST P=16F628A şeklinde yazılmaktadır.

PIC'te banklar bulunmaktadır.Bu banklarda hex cinsinden adresleri vardır.Bu adreslerde de bizim atayacağımız ve önceden atanmış değişkenler vardır.(bknz:PIC16F628A RAM Memory )
Bu banklar arası geçişi yapmak içinde BANKSEL komutunu kullanırız.
Biz PIC'te bir değişkeni bir yere atamak için EQU komutunu kullanırız.Örnek kullanımı:
PORTB EQU 0x06 Burada ki "0x06" hex değerinde yazılmış adresimizdir.Biz PORTB yi Banklarımızda ki 06h'ye oturttuk.Artık orası PORTB'nindir :)

PIC'te temizleme işlemlerini CLRF ile yaparız.Örneğin;
CLRF PORTB yazdığımızda PORTB nin içeriği sıfırlanmaktadır.

Elektronikte 1 ve 0 kavramları vardır.Örneğin küçük bir Led'in yandığı duruma 1,sönük olduğu konuma da 0 deriz.Yani genellemek olursa enerji varsa 1,yoksa 0'dır.

Şimdi PIC'te bu 1 ve 0 ı kullanabileceğimiz iki komut göstereceğim.

İlk komutumuz kendine verilen değeri 1 yapıyor.Komutumuzun adı BSF(Bit Set F) Örnek kullanımı; BSF PORTA,2 ; PORTA'nın 2.bitini 1 yap.

Diğer komutumuzda BCF ( Bit Clear F ).Örnek kullanımı;
BCF PORTB,4 ; PORTB'nin 4.bitini 0 yap.
PORTB4 nin 4 bitinde bir motor çalışıyor farzedelim.Bu komutu yazdığımızda motor duracaktır.

Şuraya git dediğimizde gidebilecek bir komutumuzda var tabi ki.Oda GOTO
Bu komutcuk daha çok DONGU'lerde kullanılmaktadır.Örnek kullanımı;
DONGU

GOTO DONGU 


Gördüğünüz gibi bir sonsuz döngü oluşturduk.

Birde istediğimizi çağırabilmek için CALL komutu kullanırız.Örnek kullanımı;

CALL DONGU gibi.

BTFSC ( Bit Test F,Skip if Clear ) : Bu komuta söylediğimiz biti test eder,eğer bu test ettiği bit "0" ise bir sonraki komuttan devam eder.
Örnek kullanımı;

BTFSC PORTB,5

GOTO DONGU

MOVLW h'FF'

Buranın açıklaması şöyle: PORTB'nin 5. bitini test et eğer bu bit 1 ise GOTO DONGU satırına git.Eğer 0 ise de MOVLW h'FF' satırına atla.

BTFSS ( Bit Test F,Skip if Set ) :
 Bu komuta söylediğimiz biti test eder,eğer bu test ettiği bit "1" ise bir sonraki komuttan devam eder.
Örnek kullanımı;

BTFSS PORTA,1

GOTO DONGU

MOVLW h'06'

Buranın açıklaması da şöyle: PORTA'nın 1. bitini test et eğer bu bit "1" ise MOVLW h'06' satırına atla.Eğer 0 ise de GOTO DONGU satırına git.

INCF(INCrease F) : F değerinin içerini 1 attırır.

INCF h'06' ; h'06' INCF komutuyla h'07' oldu.

INCFSZ ( Increment f, Skip if Zero ) : F'teki içeriği 1 attırır,içerik 0 sa bir sonraki komutu atlar.

INCFSZ f,d şeklinde kullanılmaktadır.Buradaki d sonucumuzun nereye yazılacağını belirtir.eğer bu 0 ise W saklayıcısına 1 ise F in içerisine yani kendisine atılır.
Örnek kullanımı;

INCFSZ SAY,1

SAY=h'08' olduğunu farzedelim. INCFSZ komutumuzla içeriği 1 attırarak h'09' olarak yeni değerimizi aldı.Şimdi bu sonucu nereye atacak?
Yukarıda da belirttiğimiz gibi eğer 1 ise SAY'ın içerisine 0 ise de W saklayıcısına atacak.

DECF (DECrement F ) : F'in içeriğini 1 azaltır.

DECFSZ (DECrement f,Skip if Zero) f,d : F içeriğini 1 azaltır,içerik 0'sa bir sonraki komuta atlar.


1 yorum:

Unknown dedi ki...

Açıklayıcı kısa ve öz bilgiler pic programına yeni başlayacak olan arkadaşlar için güzel bir derleme