Elektronik / Elektronik Kaynakları/

8051 Programlama yapısı bilgiler örnekler

Sponsorlu Bağlantılar

8051 denetleyicisinin programlanması hakkında temel bilgiler örnekler Emeği geçen Kişilere Teşekkürler

8051 Programlama Yapısı

  • Başlık
  • Tanımlamalar
  • Kesme Servis programları
  • Ana program
  • Alt Programlar
  • Tablolar

Başlık: Bu kısım programın en üst kısmında bulunur. Burada kısaca programın hangi amaç için yazıldığı en son değişim tarihi gibi sonraki inceleme ve kullanımlar için kolaylık sağlayacak bilgiler bulunur. Her satırına noktalı virgülle başlandığı için derleme işleminde makine kodunun oluşturulmasında dikkate alınmaz.

Tanımlamalar: Kodun ilk kısmıdır, ancak ilk başta oluturulmaz. Burada program yazılırken oluşturulan sabit tanımlamaları, hafıza adres tanımlamaları ve programın başlangıçı için gerekli tanımlamalar vardır. Program yazılırken zamanla oluşan değişkenler, sabitler burada yapılan tanımlamalarla programın daha kolay ve okunabilir olması sağlanır.

Kesme Servis programları : Burası mikrokontrolör sistemin kullandığı kesme servis programlarının, üretici firma tarafından belirlenmiş adreslere gerekli alt programların yerleştirildiği kısımdır. Bu adresler önceden belirli olduğundan buradaki belirlenen adreslere ORG komutuyla gerekli komutlar yerleştirilir.

Ana program : yazılımın genel kısmıdır. Bu kısım diğer program blokları ve yapıların kullanıldığı, genel kontrol ve diğer işlemlerin yapıldığı kısımdır. Program içerisinde yazım kolaylığı için kullanılan semboller, modüler programlamada kullanılan direktifler ve esas kontrol komutları ana programda bulunur. Ana program mikrokontrolör sistemin ilk şartlandırmalarının yapıldığı çalışmaya hazır hale getirildiği konfigürasyon kısmıdır. Burada mikrokontrolör sistemin donanım ve yazılım olarak ilk şartlandırmaları yapılır. Mikrokontrolör sistemin giriş çıkış birimleriyle dış sistemlerle etkileşimi arttıkça bu konfigürasyon kısmı da artmaya başlar.

Alt program : ana program tarafından her zaman kullanılmayan sadece gerektiğinde çağrılan komut bloklarıdır. Okunabilirlik açısından alt programlara, alt programın işleviyle ilgili bir etiket verilmelidir. Ayrıca alt programlar için aynı etiketlerinin kullanılmamasına dikkat edilmelidir, aksi takdirde derleme işlemi sırasında assembler hata mesajı verecektir.

Alt programların sonuna mutlaka RET komutu konulmalıdır, aksi takdirde program yanlış
komutları yürütecektir. Alt programlar ana programın sonunda bulunmalıdır. Alt programlardan sonra ana programın bazı kısımları bulunmamalıdır.

Tablolar : Aritmetik ve dönüşüm işlemleri için kullanılan tabloların oluşturduğu kısımdır. Bu tablolar bir etiketle başlar ve DB veya DW komutları yardımıyla oluşturulur.

Direktifler: Direktifler Assembler tarafından doğrudan makine koduna eklenmeyen ancak diğer komut, alt program ve kontrol ifadelerinin işlenmesini sağlayan komutlardır. Bu komutlar sayesinde assembler makine koduna belirli eklemeler ve değişiklikler yaparak programın daha etkili ve kolay bir şekilde oluşturulmasını sağlar.

EQU komutuyla belirli değişken ismi sabit olarak atanabilir. Derleyici EQU komutuyla
tanımlanan bütün değişkenlere derleme işlemi sırasında tanımlanan sabit değerini yerleştirir. Böylece değişkenler makine koduna sabit değerler olarak yerleştirilir. EQU tanımlama komutuyla tanımlama yapılırken aynı değişken ismi yalnızca bir kez kullanılmalıdır. Ayrıca EQU komutuyla komut ve direktifler tanımlama için kullanılmamalıdır.

SAYAC EQU 45H
ARTIM EQU 32
…
…
MOV A,SAYAC

Data komutuyla belirli bir adres bir değişken olarak atanabilir. Böylece uzun programlarda çok sayıdaki hafıza adresleri bu değişken isimler kullanılarak hafıza adresleri karışıklığı olmadan kolaylıkla kullanılabilir.

Derleyici DATA komutuyla tanımlanan bütün değişkenlere derleme işlemi sırasında tanımlanan hafıza adresini yerleştirir. Böylece değişkenler makine koduna hafıza adresleriyle işlem yapılmış gibi yansır.

Bu komut orta ve yüksek seviyeli dillerdeki değişkenlerin karşılığı olarak düşünülebilir. Dikkat edilmesi gereken nokta DATA tanımlama komutuyla tanımlama yapılırken aynı değişken ismi yalnızca bir kez kullanılmalıdır. Ayrıca DATA komutuyla komut ve direktifler tanımlama için kullanılmamalıdır.

SON_DEGER DATA 45H
CODE

Bu komutla belirli bir değişken ismi kod hafızasındaki bir adres olarak tanımlanabilir. Böylece kod hafızasındaki bir adres belirli bir değişken olarak kullanılabilir. Yine diğer değişken tanımlamalarına olduğu gibi bu değişkenlerde derleme işlemi sırasında adres kod hafızası adres değerleri yazılarak derleyici tarafından değiştirilirler.

RESET CODE 00H
TIMERO_KESMESI CODE 0BH
SET
EQU komutu gibi bu direktif de bit tanımlamaları için kullanılır.
FLAG BIT 0

Sembol Tanımlamaları : Herhangi bir yerde tanım yada etiket olarak kullanılacak kelimeler en fazla 255 karakter olabilir ve bu tanımlamanın sadece ilk 31 karakteri dikkate alınır.

Örneğin:
31_karakterden_uzun_tanımlama_isimleri ile

31_karakterden_uzun_tanımlama_i aynıdır.

Sembollerde büyük yada küçük harf duyarlılığı yoktur. Yani Assembler için “TABLO” ile
“tablo” aynıdır.

Etiketler: Etiketler çağırma ve sıçrama komutlarında kullanılır. Etiketlerden sonra iki nokta işareti kullanılmalıdır. Etiket isimleri sayesinde çağırma yada sıçrama komutlarında alt programların başlangıç adresleri bilinmek zorunda değildir. Derleme işlemi sırasında derleyici etiketten sonra gelen komutun program hafızası adresini etiketin isminin geçtiği bütün komut satırlarına yerleştirir. Böylece kullanıcı komutların uzunluklarını çok gerekmedikçe hesaplamakla uğraşmayacaktır. Etiketler kullanılarak etiketten sonra gelen komutların istenen yerde yürütülmesi sağlanır.

Örneğin :

ALT_PROGRAM:
MOV R1,#45H
MOV A,@R1
DEC DPTR
…
RET

Not: Alt programların sonunda RET komutu unutulmamalıdır. Yoksa komut yürütme işlemi aşağı doğru devam eder ve yanlış sonuçlar elde edilebilir.

ORG : Bu direktif sayesinde bu komutun ardından gelen kod belirtilen adresten sonra kod hafızasına yazılır. Bu komut sayesinde kesme servis programları donanım üreticileri tarafından belirlenen adreslere kesme servis alt programlarının yerleştirilmesini sağlar.

Örneğin :

ORG 001BH ; Timer1 kesme adresi
INC 32H ; 32H ‘ın içeriğini bir arttır
MOV A,32H ; 32H akümülatöre yaz
RETI ; kesmeden geri dön

Yukarıdaki örnekte Timer1 kesme servis alt programında küçük bir alt program örneği yazılmıştır.

Not : Kesme servis alt programlarının uzunluğu en fazla 8 byte olmak zorundadır. Eğer daha uzun bir servis programı yapılacaksa, bu program bir alt program olarak oluşturulur ve kesme servis alt programında bu alt program çağrılır.

ORG 0100H
MOV R0,#90H
MOV A,@R0

Bu örnekte ise belirli bir adresten sonra program kodu yazılarak makine kodunun bu adresten sonra program hafızasına yazılması sağlanmıştır.

INCLUDE : Bu direktifle önceden yazılan alt program tekrar yazılmadan bu komutla ana program bloğunun içine yerleştirilir. Böylece sürekli kullanılan alt programlar defalarca yazılmak yerine ana programdan INCLUDE komutuyla çağrılarak program hafızasına bu komutun ardından yerleştirilir.

#INCLUDE 7_SEGMENT.ASM

Direktiflere Devam: DB komutu kendisinden sonra gelen değerlerin sadece byte olarak sabitler olduğunu belirtir. Böylece bu komuttan sonra gelen karakter belirlenen etiketten sonra program hafızasına byte byte yerleştirilir ve DPTR registeri kullanılarak buradan okuma yapılabilir.

Bu komutla ayrıca iki tırnak içersine alınan karakter yada karakter dizileri ASCII olarak kaydedilir. ASCII olarak kaydetme işlemi yine derleyici tarafından derleme işlemi sırasında yapılır ve yazılan karakterlerin ASCII karşılıkları kolaylıkla bulunmuş olur. Bu işlem seri porttan veri gönderirken yada LCD gibi gösterge amaçlı uygulamalarda çok kullanılmaktadır.

Örneğin;

TEK_SAYILAR: DB 1,2,3,5,7,11,13,17,19
YAZI: DB ‘LCD EKRANINA YAZ’
Ayrıca byte ve ASCII veri birlikte de kullanılabilir
STOK: DB ‘TRANSISTORLER’,90,’OPAMPLAR’,20

DW : DW komutu da DB komutu gibi kullanılır, tek farkı burada sabitler byte byte değil de WORD olarak yani 16 bit olarak program hafızasında saklanmaktadır

Örneğin; TABLO: DW 2004,’G’, 1900,45,’F’

Açıklamalar : Açıklamalar program tekrar incelendiğinde yada başkası tarafından incelenmesi gerektiğinde programda kullanılan algoritmaları anlatan kısa ifadelerdir. Komutlardan sonra noktalı virgül ( ; ) ile başlayan kısımdır. Genellikle programın uzun uzun açıklaması yapılmaz, sadece o satırdaki işlem bu işlemde ne yapıldığı anlatılmaya çalışılır.

Açıklamalar noktalı virgülle başladığından derleyici bu karakterden sonra karakterleri sadece list ( *.lst ) dosyasına ekler, object ( *.obj ) ve hexadecimal ( *.hex ) dosyasında açıklama kısmı görülmez

MOV R0,#08H ;ilk değer
DONGU:
MOV A,@R0 ;R0 ın gösterdiği adresteki sayıyı
; akümülatöre yükle
INC R0 ;R0 ı arttır
…
…
CJNE R0,#0E0H,DONGU ;R0 E0 oluncaya kadar işleme devam et

8051 ile Aritmetik İşlemler

Toplama İşlemi: 8051 komut setinde iki ayrı toplama işlemi komutu vardır, ADD ve ADDC. Bunlar sırasıyla toplama ve elde ile toplama komutlarıdır.

Her iki komutta da iki byte toplanarak sonuç akümülatörde saklanır. ADD komutu; akümülatör ve herhangi bir adresteki sayının toplanarak sonucun akümülatöre saklanmasını sağlar. ADDC ise normal toplama komutuna ek olarak elde bayrağındaki bitin de toplamaya katılmasını sağlar. Her iki toplama komutunda da 3 bayrak sonuçtan etkilenir. Bunlar; elde, yarım elde ve taşma bayraklarıdır.

Elde bayrağı çıkan sonuçtan elde oluşuyorsa set edilir. Yarım elde bayrağı ise toplanan sayılardaki düşük nibblelardan taşma oluşuyorsa set edilir.

Yarım elde BCD sayılarla yapılan işlemlerde kolaylık sağlamaktadır. Taşma bayrağı ise 6.bitlerin değil de sadece 7. bitlerin toplamından elde oluşuyorsa set edilir, veya 7. bitlerin değil de sadece 6. bitlerin toplamından taşma oluşuyorsa set edilir. Bu taşma bayrağı işaretli sayılarla yapılan işlemlerde toplanan sayıların işareti dikkate alınarak toplama işleminin yapılmasını sağlar.

Çıkarma İşlemi: Toplama işleminin aksine çıkarma için sadece SUBB komutu mevcuttur. “Subtract with Borrow” kelimelerinin kısa ifadesi olan bu komutta “Carry – Elde” biti, “Borrow – Borç” biti olarak değerlendirilir.

Çıkarma işleminde de toplama işleminde olduğu gibi sonuç yine akümülatörde saklanır. Akümülatördeki sayıdan herhangi bir adresteki sayı çıkarılarak sonuç akümülatöre yazılır. Çıkarma işleminde akümülatördeki değer diğer sayıdan küçükse elde biti set edilerek işlem
sırasında eldenin ödünç alındığı belirtilir. Bu özellik çoklu çıkarma işlemlerinde kolaylık
sağlamaktadır.

Eğer eldeli çıkarma yapılması istenmiyorsa, yani birden fazla byte’dan oluşan iki değişken üzerinde çıkarma yapılmıyorsa, elde bitinin önceki değerinin çıkarma sonucunu etkilememesi
için elde biti temizlenir (CLR C).

Yarım elde bayrağı da toplamada olduğu gibi BCD sayılarla yapılan işlemlerde kullanılır.
Akümülatördeki sayının düşük nibble ‘ı çıkan sayıdan küçükse yarım elde bayrağı set edilir.
Yine taşma bayrağı da toplamada olduğu gibi işaretli sayılarla yapılan işlemlerde sayıların
işaretlerini koruması için kullanılır. Yani taşma bayrağı 6. bitlerin değil de 7. bitlerin yada 7.
bitlerin değil de 6.bitlerin çıkarma işleminden dolayı elde ihtiyacı oluşuyorsa set edilir.
Toplama İşlemi

Örnek

8051_programlama_yapisi

Çıkarma İşlemi Örnek:

8051_programlama_yapisi-2

Çarpma ve bölme işlemleri:Çarpma işleminde çarpılacak 8 bitlik iki sayı önce A ve B akümülatörlerine yüklenir. Çarpma komutunu ardından yüksek ağırlıklı byte B akümülatöründe düşük ağırlıklı byte ise A akümülatöründe saklanır. Ancak burada çarpım sonucunun FFFFH değerini geçmemesine dikkat edilmelidir. Bu nedenle bu işlemde elde bayrağı hiçbir zaman set edilmez. Sonuç eğer FFH değerinden büyükse taşma bayrağı set edilir.

Bölme işleminde ise bölünecek 8 bitlik sayı önce A akümülatörüne yüklenir ardından B akümülatörüne bölen sayı yüklenir. Bölme işleminin ardından tam kısım A akümülatöründe
kalan ise B akümülatöründe saklanır. Bölme işleminden sonra elde bayrağı her zaman temizlenir sadece taşma bayrağı 0 ile bölme işlemi oluşursa set edilir. B akümülatörüne eğer
0 ile bölme için 0 yüklenirse akümülatörlerdeki sonuç rasgele değerlerdir. Bu nedenle yazılan
programlarda B akümülatöründe bölme işleminden önce 0 değeri olmaması sağlanmalıdır.

8051_programlama_carpma_bolme

Artırma ve Eksiltme İşlemleri: Programlarda genel olarak herhangi bir adresteki verinin arttırılması ve azaltılması INC ve DEC komutlarıyla gerçekleştirilir. Bu komutlar sayesinde herhangi bir adrese yada veri bloğuna arttırma ve azaltma komutlarıyla erişilebilir.

Bu erişim için bir alt program yazılabilir ve gerektiğinde bu alt programla istenilen adrese
erişilebilir. Bunun için R0-R7 registerlarına öncelikle bloğun adresi yazılır ardından dolaylı
adreslemeyle bu adresin ilk bloğuna ulaşılır ve arttırma azaltma komutuyla R0-R7
registerları azaltılarak işleme devam edilir.

Alt programın sonuna bir kontrol komutu konularak belirli bir değere kadar bu işlemin tekrarlanması sağlanabilir.

Aşağıda 70H-77H adreslerindeki sayıların birer arttırılarak 80H-87H adreslerine yerleştiren bir alt program örneği vardır:

8051_programlama_arttirma_eksiltme

Not: Azaltma komutunda dikkat edilmesi gereken nokta azaltılacak adresteki sayının 00H olmamasıdır. İçeriği 00H olan adresteki sayı azaltma komutuyla adreste FFH değeri oluşur.

Sıçrama ve Dallanma Komutları : Sıçrama ve dallanma komutlarında şimdiye kadar anlatılan komutlarda kullanılmayan bir yapı kullanılır.

Bu komutlarla PC ( Program Counter ) registerına doğrudan veri yazılır. Şimdiye kadar anlatılanlarda ise PC mikrokontrolör iç kontrolörüyle komutlara göre arttırılır, sıçrama ve dallanma komutlarında ise gidilecek program adresi yada etiketindeki adres yazılır.

Programlarda sıklıkla kullanılan ORG ( ORIGIN ) komutuyla ORG komutundan sonraki komutların bu adresten sonra program hafızasına yerleştirilmesi sağlanır. Ayrıca ORG komutuyla Timer ve diğer kesme alt programlarının reset kesme adresleri belirlenmiş olur.

ORG komutunun bunların dışında program içerisinde kullanılması durumunda program hafızasında boş bölgeler oluşur ve boyut olarak büyük programlarda yer sorununa neden
olur. Bu nedenle programlarda ve alt programlarda etiket kullanmak program hafızasının
verimli kullanımı için önemlidir.

Koşulsuz Dallanmalar: Bu komutlarda PC ‘ a gidilecek olan adres yazılır ve mikrokontrolör bu adresteki komutu ve sonraki komutu yürütmeye başlar. Bu komutlarda herhangi bir koşul olmaksızın sıçrama yapılır.

Dört farklı komut vardır: Kısa, mutlak, uzun ve indeksli sıçrama komutu. Kısa sıçrama komutunda 127 byte ileri veya 128 byte geri sıçrama yapılabilir.

Mutlak sıçramada ise gidilecek yerin adresi 11 bittten oluşur, yani 2 kbyte lık blokluk
program bölgesinde herhangi bir yere sıçrama yapılabilir. Uzun atlama komutuyla ise adres
bilgisi 16 bittir ve bu 16 bitle 64 kbyte program hafızasında istenilen yere sıçrama yapılabilir.

İndeksli atlama ise önemli bir atlama komutudur. Bu komutla öncelikle DPTR registerına
atlanacak tablo yada bölgedeki ilk adres yazılır ve ardından akümülatörle indeksleme
yapılarak A+DPTR adresindeki komuta sıçrama yapılır. İndeksli sıçrama ve diğer koşulsuz
sıçrama komutlarına örnekler aşağıdadır:

8051_programlama_sicrama_dallanma_komutlari

Koşullu Dallanma : Bu komutlarla belirli koşullara göre belirli işlemlerin yapılması sağlanır. Elde, akümülatör yada herhangi bir adresteki bit veya byte koşullarına uygun olarak sıçrama yapılır.

Bu komutlarla programlarda istenilen kontroller sağlanarak programın daha etkin olması sağlanır.Koşullu sıçrama komutlarında aranan koşul gerçekleşiyorsa program belirlenen
adrese sıçrama yapar, eğer koşul gerçekleşmiyorsa program bir sonraki komuttan devam
ettirilir.

Koşul sağlanırsa komutla birlikte verilen etiket yada program adresi PC ye aktarılır ve program bu adresteki komutları yürütmeye başlar.Koşullu sıçrama komutları yapı olarak ikiye ayrılabilir;

1 – Eldenin, akümülatörün yada belirli bir bitin durumuna göre sıçrama ve belirli bir
adresteki sayıyı girilen değere göre karşılaştırma.

2 – Azaltarak karşılaştırma işlemine göre sıçrama olarak ayrılabilir.

İlk komutlar bitlerin set yada temizlenmesine göre sıçrama yaparken ikinci komut yapıları
byte ların adreslerdeki verilerle karşılaştırılıp sıçrama yapılmasını sağlar. Bu ikinci komut yapıları yüksek seviyeli dillerdeki for ve while döngülerindeki gibi belirli kontrollere göre belirli sayıda çevrim alt programları çalıştırabilirler.

Program içerisinde herhangi bir yere atlamak için JMP komutu kullanılır.Atlanılmak istenilen yere göre SJMP, LJMP ve AJMP olarak üç gruba ayrılır. Atlanılacak adres relative adres ise SJMP, 11 bitlik bir adres ise AJMP, 16 bitlik bir adres ise LJMP kullanılır. Ancak;pratikte programcının sadece JMP kullanması yeterlidir. Assembly derleyici gerekli dönüşümleri gerçekleştirir.

8051_programlama_yapisi-3

Yukarıda P1.0 ‘a bağlı olan bir led 12 Mhz kristal bağlı bir sistemde yaklaşık bir saniye aralıklarla yanıp sönmektedir.

ALT PROGRAM ÇAĞIRMALAR

Çağırma komutları alt programlarda çok önemli kullanım alanına sahiptir. Bu çağırma komutları sayesinde gerekli olduğu yerde alt programlar çağrılarak bu alt programlar çalıştırılıp alt program bittikten sonra ise ana programa tekrar dönülür.

Çağırma komutları iki tanedir :

Mutlak ve uzun çağırma komutları Mutlak çağırma komutunda çağrılan alt programın adresi 11 bittir, yani 2 kbyte program bloğu içerisindeki herhangi bir yerden alt program çağrılabilir.

Uzun çağırma komutta ise çağrılan alt programın adresi 16 bittir ve 64 kbyte program hafızası içerisinde herhangi bir yerden alt program çağrılabilir.

Alt programlardan çıkılıp tekrar ana programa dönülmesi için alt programların sonuna RET
komutu yazılmalıdır. Eğer RET komutu alt programların sonuna yazılmazsa program aşağı
doğru devam eder ve hatalar oluşur.

Ayrıca kesme alt programlarında da benzer olarak RETI komutu kullanılır. Bu komutun
RET komutuna göre farkı bu komutla mikrokontrolör bir kesme servis alt programı işlemi
yürüttüğünü ve bu işleme ait alt programın gerçekleştirildiğini belirten bayrakların set
yada temizlenmesidir.

RET yada RETI komutuyla yığından PC ‘ın önce düşük ağırlıklı byte sonrada yüksek
ağırlıklı byte ‘ı alınır ve PC bu korunmuş değerlere göre işlemleri yapmaya devam eder.
Bir önceki örnek başına bir etiket konup sonuna da RET konursa ve kısa sıçrama komutu
kaldırılırsa led’i yaklaşık bir saniye aralıklarla yanıp söndüren bir alt program yazılmış
olur ve istenildiği zaman çağrılabilir.

Örnek:

8051_programlama_yapisi-4