Toplam 9 adet sonuctan sayfa basi 1 ile 9 arasi kadar sonuc gösteriliyor
  1. #1
    eshgi
    misafir

    yeni 8051 mikroişlemci

    BÖLÜM I
    GİRİŞ



    Günümüzde mikroişlemci kelimesi pek çok insan için yabancı olmayıp herkese fraklı anlam ifade eder. Teknik olmayan pek çok kişi , mikroişlemcinin , bir kişisel bilgisayarda (PC) kullanılan , bilgisayarını gücünü belirleyen çok önemli bir elektronik tümdevre olduğunu bilir. PC‘lerden başlayıp ,diz üstü PC’ler, minibilgisayarlara kadar bütün bilgisayarlar, mikroişlemcinin görevini gerçekleştiren , daha genel bir ifadeyle ,bir işlemciye sahiptir. Bilgisayarlardaki işlemciler , 1950’lerden günümüze çok değişik şekiller almıştır. Günümüzde tipik bir bilgisayar üç ana birimden oluşur :

    1- Merkezi İşlem Birimi(Central Processing Unit-CPU) 2- Hafıza (Memory) 3- Giriş/ Çıkış(I/O) Birimleri

    CPU ,bilgisayarın değişik birimleri arasındaki veri akışı ve veri işleme görevlerini yerine getirir. Veri işlemenin çoğu, CPU içindeki aritmetik lojik birimde gerçekleştirilir. CPU çeşitli komutları yürüterek , bilgisayar sisteminin çalışmasını yönetir. Bilgisayar hafızasında saklı olan komutlar, bilgisayarın yürüteceği programı oluşturur. Bir CPU‘ daki kontrol alt birimi, sistemdeki veri akışını yönetir, hafızadan okunan komutu çözer ve komut tarafından belirlenen işlemi yerine getirir. İşlemler ,veri transferi veya ALU’ daki işlemlerdir. ALU , toplama ,çıkarma .çarpma ,bölme gibi temel aritmetik işlemler ve lojik işlemleri yerine getirir. Lojik işlemler, AND, OR ve EX-OR gibi işlemlerdir.

    Dış dünyadan CPU’ ya veri transfer eden alt birim giriş cihazıdır. Giriş verisi, bir insan ,diğer bir bilgisayar veya başka bir elektronik sistem gibi çok değişik kaynaklardan gelebilir. CPU tarafından işlenen veri , hemen çıkışa gönderilebilir veya daha sonra işlenmek üzere hafızada saklanır. CPU’ dan dış dünyaya veri transfer eden alt birim çıkış cihazıdır. Bu birim ile, göstergeler, yazıcılar ,diğer bilgisayarlara veya elektronik sistemlere veri transfer eden cihazları belirtmektedir.
    1971 yılında , bir bilgisayarın ALU ile kontrol birimlerinin bir silikon tümdevresi üzerine , INTEL firması tarafından konulması ile , mikroişlemciler dönemi başlamıştır.
    Basit bir teknik tanım ile , mikroişlemci, yarı iletken tek bir tümdevre üzerine yerleştirilmiş CPU'’ya denir. Mikroişlemciler genel amaçlı cihazlar olup bir çok uygulama için uygundur. Bir mikroişlemci temel olarak CPU’ nun fonksiyonlarını yerine getirdiği için ,pek çok kere , CPU ile mikroişlemci eş anlamda kullanılmaktadır.
    Bir bilgisayarın CPU’ su baskı devre kartında bulunuyorsa , bilgisayar , minibilgisayar diye adlandırılır. Bir mikroişlemci etrafına kurulu bilgisayar, mikrobilgisayar diye adlandırılır. Bir mikrobilgisayarın mikroişlemcisi, I/O ve hafıza cihazları ,teknolojiye ve uygulamalara göre devamlın değişim göstermektedir. Teknolojinin gelişimi doğrultusunda , daha önce mikroişlemci tümdevresi üzerinde olmayıp dışarıda olan , pek çok giriş/ çıkış ve hafıza alt birimleri, CPU üzerine taşınmıştır.

    Mikrokontrolör , bir tümdevre üzerinde üretilen bilgisayara denir. Bir mikrokontrolör tümdevresinde bulunan hafıza ve giriş/ çıkış alt sistemleri, bu işlemcilerin bir çok uygulama içinde , gömülü olarak doğrudan ve tek başına , mikroişlemcilere göre çok daha basit ve ucuz arabirim teknikleriyle , kontrol amaçlı olarak kullanılmalarını sağlar. Günümüzde mikroişlemciler ev mikrokontrolörler teknolojinin vazgeçilmez birimleri olup , sayısız alanlarda kullanılmaktadır. Bugün ,mikroişlemci ve mikrokontrolör üreten pek çok firma bulunmaktadır. Bunların en önemlileri INTEL ve MOTOROLA firmalarıdır.

    Bir mikrokontrolör, özet olarak , kullanıldığı sistemin bir çok özeliğini aynı anda gözleme (monitoring) ,ihtiyaç anında gerçek zamanda cevap verme (real-time response) ve sistemi denetlemeden (control) sorumludur.

    Mikrokontrolörler , örneğin , otomobillerde motor kontrol, elektrik ve iç panel kontrol ; kameralarda , ışık ve odaklama kontrol gibi amaçlarla kullanılmaktadır. Bilgisayarlar , telefon ve modem gibi çeşitli haberleşme cihazları ,CD teknolojisi , fotokopi ve faks cihazları , radyo, TV,teyp,oyuncaklar, özel amaçlı elektronik kartlar ve sayılamayacak kadar pek çok alanda , mikrokontrolörler yoğun olarak kullanılmaktadırlar. Bu kadar geniş uygulamalarda kullanılan mikrokontrolörler , tümdevre –üzerinde yer alan çok değişik donanım özelikleri sunmaktadır. Bu özeliklerden bazıları şunlardır :

    Paralel ve Seri I/O portları ,zamanlayıcı / sayıcılar, ADC, ve RAM, ROM, EPROM ve EEPROM gibi değişik kapasitelerde ve özeliklerde hafıza birimleri.

    Mikrokontrolörlerin yoğun olarak kullanıldığı elektronik ve kontrol uygulamalarının yapısı , mikrokontrolör , onun arkadaşı olan genel amaçlı mikroişlemciden ayırmaktadır. Bu uygulamalarda gerçek zaman (real time) işlemi ve çok görevlilik( multi-tasking ) özeliği bulunur. Gerçek zamanda işleme , kontrolörün , sinyalleri çalışma ortamından hazır olduklarında alıp ortamı bekletmeden işleyebilmesi demektir. Benzeri şekilde ,kontrolör ihtiyaç anında çalışma ortamına ,gereken kontrol sinyallerini göndermeli ve ortamı bekletmeyecek tarzda hızlı olmalıdır. Diğer bir deyişle mikrokontrolör , sistemin çalışmasında sınırlayıcı etmen olmamalıdır. Çok görevlilik, bir çok görevi aynı anda veya aynı anda gibi yapabilme kapasitesidir.













    BÖLÜM II
    8051
    2.1 8051 MİKROKONTROLÖR AİLESİ


    8051 Intel firması tarafından , 1980 ‘lerin başında piyasaya sunulan , dünyanın en popüler 8-bit mikrokontrolörüdür. Bu mikrokontrolör için , başta Intel olmak üzere , pek çok üretici firma (Philips , Dallas, Siemens ,Oki ve Matra/Harris gibi) geniş bir donanım ve yazılım desteği sunmuş ve bunun neticesi, 8051, 1980‘lerden bugüne , bir endüstri standardı olmuştur.

    8051 ailesi bazen MCS-51 ailesi olarak da belirtilir. “ MCS” harfleri, geleneksel olarak , Intel firmasının üretmiş olduğu , bir sistemi veya CPU ‘lar , hafızalar, saat üreteçleri, giriş/ çıkış birimleri ve benzeri birimler içeren , mikrobilgisayar ve uyumlu parçaları (components) belirtmede kullanılmıştır. Kitapta 8051 ve MCS-51 ifadeleri , eş anlamlı olarak aynı aileyi belirtmek için kullanılmıştır ve genelde ,bir işlemciyi belirtmeyip ailenin ismi olarak kullanılmaktadır. Bununla beraber , 8051, MCS-51 ailesinin ilk üyelerinden olan , 8051, 8751 ve 8031 mikrokontrolörlerinden birinin de adıdır. Bugün için değişik mikrokontrolör aileleri arasında ,8051 ailesi, gelişmiş ürünleriyle beraber yaklaşık % 40 gibi bir piyasa payına sahiptir. 8051 ailesinin temel özelikleri aşağıda maddeler halinde özetlenmektedir:

    Popüler : Kolay bir şekilde bulunmakta ve desteklenmektedir. 8051 geliştiricileri için bir çok Internet Web sayfası , kitaplar , teknik dökümanlar , yazılım ve donanım gereçleri bulunmaktadır.

    Uygun, Hızlı ve güçlü : 8051 çekirdek mimarisi hedef kontrol uygulamalar için çok uygun olup hızlı ve güçlüdür.

    Geniş yelpaze ve uyumluluk : Çok değişik 8051 ürünleri olmasına karşın , ikili kod düzeyinde bütün ürünler uyumludur (compatible). Diğer mikrokontrolör aileleri , 8051 ‘in sunmuş olduklarını , farklı ve uyumsuz işlemcilerle (genellikle tek üretici firma kaynaklı olarak ) ancak sağlayabilmektedir. Bu uyumluluk , kolaylık ve esneklik , program geliştirme araçlarında , eğitiminde ve yazılım desteğinde de bulunmaktadır.

    Çok kaynaklılık : Günümüzde çok değişik 8051 işlemcisi üreten 12 üreticinin üzerinde firma bulunmakta ve sayısız yazılım ve bilgi kaynakları bulunmaktadır.

    Sürekli iyileştirme: 1980‘lerden bugüne silikon ve tasarım olarak sürekli geliştirilen 8051’ler hızını ve gücünü arttırmıştır. Günümüzde 16-bit modellerinin de bulunduğu 8051’ler değişik kapasite , boyutlarda ve fiyatlarda kolay bir şekilde temin edilebilmektedir.


    Şekil-2-1 8051 Mikrokontrolör Blok Diyagramı

    8051 ailesi 8-bit single-chip mikrokontrolör 'ler sanayi uygulamaları için geliştirilmiş üzerinde hem giriş hem de çıkış için kullanılabilen 4 adet I/O port'u bulunan ayrıca bu portları Data ve Adres hatları olarak kullanabilen bir yapıya sahiptir. 8051'de Program Bellek olarak 8KB ROM, 8751'de ise 8KB EPROM vardır. Program Bellek 16-bit adresleyebildiğinden, Program Belleğimiz 64 KB olabilir.16-bitlik Data Bellek' in adreslenebilmesi CPU' da bulunan DPTR register' i sayesinde mümkündür. Program Bellek yalnız okunabilir,yazılamaz. Bu ailede 64KB'dan büyük Program Bellek alanına sahip olan işlemciler de vardır. 8051'de programın ilk 4KB'lık kısmı chip üzerinde bulunan ROM' da tutulabilir. ROM' suz versiyonlarda Program Bellek haricidir ve örneğin EPROM olabilir. Bu versiyonlarda harici Program Bellek ucu PSEN (Program Store Enable) 'dir.


    Şekil-2-2 ALE Kullanımı İle Harici Program Kodunun Okunma Zamanlaması
    Data Bellek (RAM) ,Program Bellekten ayrı bir adres alanını işgal eder. 8051'de 128 Byte' lık Data Bellek chip' in üzerindedir. Bunlarda en fazla 64KB harici RAM ,harici Data Bellek alanında adreslenebilir. ROM'suz versiyonlarda 128 Byte' lık Data Bellek (RAM) chip üzerindedir. CPU' nun RD ve WR bacaklarından çıkan okuma ve yazma sinyalleri ile ihtiyaç duyulan Data Bellek' e erişilebilinir.





    Şekil-2-3 Ortak Adres ve Data Yolunun Program Kodu Okunması Sırasındaki Zamanlaması




    Şekil-2-4 Okuma İşlemi Zamanlaması

    RD ve PSEN sinyalleri lojiksel olarak AND' lenirse bu çıkış ucu harici Program/Data Bellek için okuma sinyali oluşturulabilir. 8051 Blok Diyagramı şekil-2-4.'de verilmiştir.


    Reset' ten sonra CPU programını icra etmeye 0000H adresinden başlar. Program Bellek' in bazı bölgeleri İnterrupt' lar için ayrılmıştır. Gelen interrupt CPU' nun bu adres alanına atlamasına ve buradan servis programının icrasına başlamasına neden olur. Örneğin harici INT0 interrupt' ı 0003H bölümüne ayrılmıştır. Eğer harici INT0 kullanıma girerse, program servis rutini 0003H bölümüne atlayarak interrupt' a cevap vermeye çalışır. Eğer harici INT0 kullanımda değilse servis rutini genel Program Bellek' i okumaya ve icra etmeye devam eder.

    İnterrupt servis bölümleri 8 Byte' lık aralarla yerleştirilmişlerdir.

    Örneğin; Vektör Adres
    Interrupt-0 : 0003H
    Timer -0: 000BH
    Interrupt-1: 0013H
    Timer-1: 001BH
    RI+TI: 0023H 'dir.


    Program Bellek'in (ROM) , harici ROM veya dahili ROM' dan hangisinin seçileceği chip üzerindeki EA (External Access) bacağının durumuna bağlıdır. Eğer EA bacağı +5V potansiyeline çekilirse program direk olarak dahili ROM'un 0000H ile 0FFFH adreslerinden çağrılır. Eğer program 1000H ile FFFFH adreslerinden çağırılıyorsa harici ROM kullanıldığı anlaşılır. EA bacağı toprak potansiyelinde ise tüm program harici ROM(EPROM) 'dan direk olarak çağrılır. ROM' suz versiyonlarda(8031-80C31) program' ın harici Program Bellek alanından çağrılması için EA bacağı toprak potansiyeline çekilmelidir

    Harici program icrası için donanım konfigürasyonu şekil-2-5' de gösterilmiştir.


    Şekil-2-5. CPU-EPROM ve Latch ile Harici Program Kodunun Okunması İçin Gerekli Donanım

    Burada P0 ve P2 (16-bit I/O hattı) external Program Bellek' ten programı getirmek için bum fonksiyonlarını yerine getirmek görevini üstlenmişlerdir. P0 (PORT-0) adres ve data hattının çoğullanmasından oluşmuştur. Böylece CPU' nun bacak sayısı azaltılabilmiştir. Bu çoğullama işleminden adres ve data hatlarını birbirinden ayırma işlemi CPU' dan çıkan ALE (ADDRESS LATCH ENABLE) bacağı sayesinde olmaktadır.

    Dahili Data Bellek alanı 3 bellek bloğuna bölünmüştür ve bunlar 128 Byte' n altı,üstü ve SFR (Special Function Register) olarak bilinir. Dahili Data Bellek adresleri her zaman 1Byte'lıktır. Bu yüzden bu adres alanı yalnızca 256 Byte' ı ima eder. Kuramsal olarak Data Bellek alanı 384 Byte olarak farz edilir. Bu bellek'in 7FH'dan üstüne, direk adresleme ve indirek adresleme yöntemleri ile iki farklı bellek alanına erişilir. Kuramsal olarak kabul edilen bu bellek alanından fiziksel olarak 256 Byte' ından faydalanılır. 80H ile FFH adresleri arasındaki bellek alanı SFR, 00H ile 7FH adresleri arasındaki bellek alanı ise Dahili Kullanılabilir RAM olarak adlandırılır.

    Dahili RAM' n 128 Byte' lık alt kısmına direk ve indirek adresleme ile ulaşılabilir. Dahili RAM 4 Register Bankı (yığını) (Bank0'dan Bank3'e) ve bu bankların her biri 8 registerden oluşan kullanışlı bir bellek alanıdır. Bu bankların seçimi SFR içindeki PSW (Program Status Word)'deki RS0 veRS1 (Register Selection bits) bitlerinin durumuna göre belirlenir.

    SFR kısmına ise sadece direk adresleme ile ulaşılabilir. Dahili RAM' ın 128 Byte' lık üst kısmında, komut takımı komutları ile, 128 Byte direk olarak adreslenebilir. SFR ; port adresleri, timer , status ve kontrol bitlerini, akümülatör , stack pointer vs gibi kaydedicileri (register) içerir. Buradaki register' lara yukarıda da değinildiği gibi yalnız direk adresleme ile erişilebilir. SFR' nin içindeki 60 adres alanı hem byte hem de bit bit adreslenebilir. Bitleri adreslenebilen SFR alanlarının adreslerinin sonu 0H ya da 8H değerindedir.

    Tüm bunların yanı sıra 8051 MCU' da;

    • 2 adet 16 bitlik timer/event (zaman/olay) sayıcı
    • Full dublex seri giriş/çıkış ara yüzü
    • Boolean işlemler yapabilme
    • Entegre üzerinde dahili osilatör
    • İki öncelikli bölüm ile 5 interrupt kaynağı yapısı
    • Çarpma,bölme,çıkarma ve karşılaştırma emirleri
    • 3.5MHz-15MHz arası saat frekansı
    • 128 Byte stack genişliği özellikleri de vardır.


    8051 CPU' nun bacak bağlantı yapısı şekil-2-6' da verilmiştir. Burada bulunan 4 port' un da ortak özellikleri çıkışlarının latch' lanmış , iki yönlü dahili pull-up' lıdır. Yani bir sonraki bilgi gelene kadar önceki bilgiyi portta tutar.













    Şekil- 2-6 8051 Mikrokontrolör Bacak Bağlantıları



    RST bacağı yüksekte iken ve osilatör çalışıyorken iki makine periyodu için CPU resetlenir. Sistem çalışıyorken RST pini 0V potansiyelinde ve reset anında +5V potansiyelinde olması gerekmektedir. Eğer sürekli olarak +5V seviyesinde ise CPU sürekli resetleniyor ve herhangi bir program icra edemiyor demektir.
    RxD ve TxD pinleri seri iletişim için data alma ve data gönderme işlevini yerine getirir.
    Şekil 2.6. 8051 Bacak Yapısı

    INT0 veINT1 pinleri harici interrupt giriş uçlarıdır.
    T0 ve T1 pinleri zamanlayıcı harici giriş uçlarıdır.



    Şekil-2-7 Portların Giriş/Çıkış Durum Özellikleri





    Şekil-2-8 İki yönlü Çıkış Yapısı





    Şekil-2-9 Open-Drain Çıkış Yapısı




    Şekil-2-10. Push-Pull Çıkış Yapısı


    XTALL1 veXTALL2 pinleri ise CPU' nun dahili osilatörüne bağlı bacaklardır. Hem harici uygun frekanslı kristal bağlayarak hem de harici osilatör kullanarak CPU çalıştırılabilir.



    Şekil-2-11 Saat İşaretinin Üretilmesi İçin Kristal veya Harici Saat Kullanımı

    Sistemin resetlenmesini sağlamak için şekil-2-12'deki devre (Power-ON Reset) kullanılabilir. Devreye bağlanan R ve C'nin değeri değiştirilerek reset süresi değiştirilebilir. Kurduğum devrede R=8.2K ve C=10nF'dır.



    Şekil-2-12. Power-ON Reset Devresi



    2.1. 8051 Komut Kümesi

    8051 komut kümesi üçe ayrılır. Bunlar ; veri transfer komutları , veri işleme komutları ev program akışı kontrol komutlarıdır.


    Gösterim İşlem Adresleme modları
    Dir Ind Reg Imm
    MOV A ,<src> A = <src> * * * *
    MOV <dest>, A <dest> =A * * *
    MOV <dest> ,<src> <dest>=<src> * * * *
    MOV DPTR, #data16 DPTR =16-bit ivedi sabit *
    PUSH <src> INC SP : MOV @SP , <src> *
    POP <dest> MOV<dest> , @SP : DEC SP *
    XCH A , <byte> ACC  <byte> * * *
    XCHD A ,@Ri ACC  @Ri (Düşük 4-bit) *

    Tablo-2-1 ahili Veri Hafıza Alanına Veri Transfer Komutları


    Adres genişliği Gösterim İşlem
    8- bit MOVX A, @Ri Harici RAM @Ri ‘ yi oku
    8- bit MOVX @Ri, A Harici RAM @Ri ‘ yi yaz
    16- bit MOVX A, @DPTR Harici RAM @DPTR‘ yi oku
    16- bit MOVX @DPTR ,A Harici RAM @DPTR‘ a yaz

    Tablo-2-2 :Harici Veri Hafıza Alanına Erişen Veri Transfer Komutları





    Gösterim İşlem
    MOVC A, @A+DPTR Prog. Hafıza @(A+DPTR)Hücresini Oku
    MOVC A, @A+ PC Prog. Hafıza @ (A+PC ) Hücresini Oku

    Tablo-2-3 : Tablo Okuma Komutları


    Gösterim İşlem Adresleme modları
    Dir Ind Reg Imm
    ADD A , <byte> A =A +<byte> * * * *
    ADDC A ,<byte> A =A +<byte> +C * * * *
    SUBB A ,<byte> A =A -<byte>- C * * * *
    INC A A =A +1 Sak. Özel (sadece ACC)
    INC <byte> <byte> =<byte>+1 * * *
    INC DPTR DPTR =DPTR +1 Sak. Özel (sadece DPTR)
    DEC A A=A-1 Sak. Özel (sadece ACC)
    DEC <byte>=<byte> -1 * * *
    MUL AB B:A =BxA Sak. Özel (sadece ACC ve B)
    DIV AB A =Int (A/B)
    B= Mod (A/B) Sak. Özel (sadece ACC ve B)
    Sak. Özel (sadece ACC)
    DIV A Ondalık Ayar

    Tablo-2-4: Aritmetik Komutlar

    Gösterim İşlem Adresleme modları
    Dir Ind Reg Imm
    ANL A,<byte> A = A AND<byte> * * * *
    ANL <byte> ,A <byte> = <byte> AND A *
    ANL <byte>, #data <byte> = <byte> AND #data *
    ORL A, <byte> A=A OR <byte> * * * *
    ORL <byte>, A <byte> = <byte> OR A *
    ORL <byte>, #data <byte> = <byte> OR #data *
    XRL A, <byte> A= A XOR <byte> * * * *
    XRL <byte>, A <byte> = <byte> XOR A *
    XRL <byte>, #data <byte> = <byte> XOR #data *
    CLR A A =00H Sak. Özel (ACC)
    CPL A A=NOT A Sak. Özel (ACC)
    RL A ACC’ yi bir –bit sola döndür. Sak. Özel (ACC)
    RLC A Sola CY üzerinden. Sak. Özel (ACC)
    RR A ACC’ yi bir-bit sağa döndür: Sak. Özel (ACC)
    RRC A Sağa CY üzerinden döndür. Sak. Özel (ACC)
    SWAP A ACC’ deki iki 4 –bit ‘i değiştir. Sak. Özel (ACC)

    Tablo-2-5 :Byte Tabanlı Lojik Komutlar








    Gösterim İşlem
    ANL C, bit C bayrağını adreslenen bit ile AND ‘le
    ANL C, /bit C bayrağını adreslenen bit in tersi ile AND‘ le
    ORL C, bit C bayrağını adreslenen bir ile OR‘ la
    ORL C, /bit C bayrağını temizle
    CLR C Adreslenen bit ’i temizle
    CLR bit C bayrağını tersle
    CPL bit Adreslenen bit’ i tersle
    SETB C C bayrağını 1 ‘le
    SETB bit Adreslenen bit’ i 1’ le


    Tablo-2-6 : Bit Tabanlı Lojik Komutlar


    Gösterim Açıklama
    SJMP <rel data> (Short Jump –Kısa dallanma )operand 2-nin tümleyeni tek bir byte olup değeri PC’ ye eklenir. Bir sonraki komut, 127 byte ileri veya 128 byte gerideki bir komut olacaktır.
    AJMP <Address 11> (Absolute Jump- Mutlak Dallanma) Operand 11- bit bir adres olup Program Hafızanın o anki 2 Kbyte’ lık alanı içine karşı gelir.
    LJMP<Address 16> (Long Jump – Uzun Dallanma) Operand 16- bit bir adres olup Program Hafızanın 64 Kbyte‘ lik alanı içinde bir yere karşı gelir.
    LJMP @ A + DPTR (Long Jump – Uzun Dallanma) Yürütülecek bir sonraki komutun adresi ,ACC ile DPTR ‘ın toplamıdır.


    Tablo-2-7 : Durumdan Bağımsız Dallanma Komutları






    Gösterim Açıklama
    ACALL<address 11>
    (Absolute Call) PC yığın hafızaya atılır ,11-bit adres PC’ye yerleştirilir.11-bit adres ile ,Program Hafızada 2K byte’ lık bir alan içinde dallanma gerçekleşir.
    LCALL<address 16>
    (Long Call) PC yığın hafızaya atılır ,16-bit adres PC’ye yerleştirilir.16-bit adres ile ,Program Hafızada 64K byte’ lık bir alan içinde dallanma gerçekleşir.
    RET
    (Return) Yığından ,PC olarak alınacak değer okunur.
    RETI
    (Return from Interrupt) Yığından PC olarak alınacak değer okunur ve kesme donanımı sıfırlanır.

    Tablo-2-8 : CALL ev RET komutları


    Gösterim Açıklama
    JZ<rel add>
    (jump if ACC zero) Eğer ACC sıfır ise , 2’ nin tümleyeni olan byte operand PC’ye eklenir.
    JNZ<rel add>
    (jump if ACC Notzero) Eğer ACC sıfır değil ise , 2’ nin tümleyeni olan byte operand PC’ye eklenir.
    JC<rel add>
    (jump if carry is set) Eğer elde bayrağı 1 ise , 2’ nin tümleyeni olan byte operand PC’ye eklenir.
    JNC<rel add>
    (Jump if Carry not set) Eğer elde bayrağı 1değil ise , 2’ nin tümleyeni olan byte operand PC’ye eklenir.
    JB<bit>, < rel add>
    (jump if Bit set) Eğer ilk operand (adreslenen bit) 1 ise , 2’ nin tümleyeni olan ikinci byte operand PC’ye eklenir.
    JNB <bit>, < rel add>
    (jump if Bit not set) Eğer ilk operand (adreslenen bit) 1 değil ise , 2’ nin tümleyeni olan ikinci byte operand PC’ye eklenir.
    JBC <bit>, < rel add>
    (jump if Bit set and Clear bit) Eğer ilk operand (adreslenen bit) 1 ise , 2’ nin tümleyeni olan ikinci byte operand PC’ye eklenir. Komuttan sonra bit temizlenir.
    CJNE A, direct, <rel add>
    (Compare and Jump if not equal) Birinci operand ACC ; ikinci bir dahili saklayıcı ; ve üçüncü , göreceli adres. Eğer ACC ‘nin içeriği saklayıcıdan farklı ise, 2’ nin tümleyeni olan üçüncü byte operand PC ‘ye eklenir.
    CJNE A, # data , <rel add>
    (Compare and Jump if not equal) Birinci operand ACC ; ikinci, bir sabit ; ve üçüncü , göreceli adres. Eğer ACC ‘nin içeriği sabitden farklı ise, 2’ nin tümleyeni olan üçüncü byte operand PC ‘ye eklenir.
    CJNE Rn, # data ,< rel data>
    (Compare and Jump if not equal) Birinci operand Rn ;ikinci operand ,bir sabit; ve üçüncü göreceli adres. Eğer Rn’ nin içeriği sabitten farklı ise 2‘ nin tümleyeni olan üçüncü byte operand PC’ye eklenir.
    CJNE @Ri ,# data, < rel add >
    (Compare and Jump if not equal) Birinci operand Ri ile işaretli byte; ikinci ,bir sabit ; ve üçüncü göreceli adres. Eğer @Ri’ nin içeriği sabitten farklı ise 2‘ nin tümleyeni olan üçüncü byte operand PC’ye eklenir.
    DJNZ Rn, <rel add>
    (Decrement and Jump if not Zero) Birinci operand Rn ;ikinic ,göreceli adres. Eğer azaltılan Rn içeriği sıfırdan farklı ise, 2’nin tümleyeni olan üçüncü byte operand PC’ ye eklenir.
    DJNZ direct ,< rel add>
    (Decrement and Jump if not Zero) Birinci operand bir dahili saklayıcı; ikinci göreceli adres. Eğer azaltılan saklayıcının içeriği sıfırdan farklı ise , 2‘ nin tümleyeni olan üçüncü byte operand PC’ye eklenir.


    Tablo2-9 : Duruma Bağımlı Dallanma Komutları







    Gösterim Açıklama
    ACALL<address 11>
    (Absolute Call) PC yığın hafızaya atılır ,11-bit adres PC’ye yerleştirilir.11-bit adres ile ,Program Hafızada 2K byte’ lık bir alan içinde dallanma gerçekleşir.
    LCALL<address 16>
    (Long Call) PC yığın hafızaya atılır ,16-bit adres PC’ye yerleştirilir.16-bit adres ile ,Program Hafızada 64K byte’ lık bir alan içinde dallanma gerçekleşir.
    RET
    (Return) Yığından ,PC olarak alınacak değer okunur.
    RETI
    (Return from Interrupt) Yığından PC olarak alınacak değer okunur ve kesme donanımı sıfırlanır.

    Tablo2-10 : CALL ve RET komutları


    2.1.1. Adresleme Modlarındaki Gösterim :

    Adresleme modlarında kullanılan gösterim aşağıda verilmektedir :


    Rn : Aktif saklayıcı kümesindeki 8 saklayıcıdan biri.

    ACC : Akümülatör

    PC : Program Counter

    direct : Dahili RAM bölgesinden, bit-adreslenebilir hafıza ve SFR’ lar dahil alana erişen 8-bit adres.

    @Ri : Saklayıcı-dolaylı adresleme modunu gösterir. Aktif saklayıcı kümesinden sadece R0 ve R1 bu modda kullanılabilir. Ri dahili RAM bölgesinden , bit-adreslenebilir hafıza ve SFR’ lar dahil , 8-bit bir adres içerir.

    # data : İvedi adreslemede kullanılan 8-bit bir sabit ,yani komutun içindeki veri.

    addr16 : 64 K program Hafıza içinde herhangi bir yere işaret eden iki byte adres.

    addr11 : Program Hafızada 2K’lık blok içinde, herhangi bir yere işaret eden 11-bit adres.

    rel :Göreceli dallanmada kullanılan ,ikinin tümleyeni ofset adres. Bu adres ile program akışı , PC yi takip eden öndeki –128 byte ve sonraki 127 byte‘ lık bir alan içinde, dallanabilir.

    bit : Bit adreslenebilir RAM veya SFR’ ın 8-bit adresi.

    reg : Saklayıcı adresleme modu.

    dir : Doğrudan (direct ) adresleme.

    ind : Saklayıcı-dolaylı( register-indirect) adresleme modu.

    imm : İvedi (immediate) adresleme modu.
    2.2.1. 8051 Interrupt Yapısı

    ROM' suz ve EPROM' lu versiyonlarda CPU' lar 5 interrupt kaynağına sahiptir. Bunlar; 2 harici interrupt, 2 timer interrupt ve seri port interrupt' ıdır.

    İnterrupt yetkileri: Interrupt kaynakları SFR içindeki IE registerinin bitleri set/reset (1/0) yapılarak yetkili veya yetkisiz kılınabilir.

    EA - - ES ET1 EX1 ET0 EX0
    msb lsb
    INTERRUPT ENABLE (IE) REGISTER

    EA : Tüm interrupt' ları yetkisizleştirebilir. Eğer EA=0 ise interrupt' lar yetkisizdir ve EA=1 ise diğer interrupt bitleri set/reset' lenerek interrupt' lar yetkili/yetkisiz yapılabilir.
    ES : Seri port interrupt yetki biti
    ET1 : Timer1 taşma interrupt yetki biti
    EX1 : INT1 bacağından gelen interrupt yetki biti
    ET0 : Timer0 taşma interrupt yetki biti
    EX0 : INT0 bacağından gelen interrupt yetki biti

    Interrupt Öncelikleri: Interrupt öncelikleri SFR içindeki IP registerinin programlanması ile belirlenebilir.

    - - - PS PT1 PX1 PT0 PX0
    msb lsb
    INTERRUPT PRIORITY (IP) REGISTER

    PS : Seri port interrupt' ı öncelik kontrol biti. 0 ise düşük ,1 ise yüksek öncelikli.
    PT1 : Timer1 Int. öncelik kontrol biti
    PX1 : INT1 bacağı Int. öncelik kontrol biti
    PT0 : Timer0 Int. öncelik kontrol biti
    PX0 : INT0 bacağı Int. öncelik kontrol biti

    Eğer farklı önceliklere sahip iki interrupt isteği eşzamanlı alındığında istek yüksek öncelikliye servis verilecektir. Eğer öncelikleri yazılımla tanımamışsak CPU kendi belirlediği interrupt öncelik sırasına göre hizmet verir. Buna göre en yüksek öncelikliden en düşük öncelikliye göre sıralanmış interrupt kaynakları şöyledir;


    • IE0
    • TF0
    • IE1
    • TF1
    • RI ya da TI .


    İnterrupt yetki bayrakları setlenmiş interrupt alındığında LCALL emiri ile belirtilen adrese atlanılır ve gerekli servis programı çalıştırılır. LCALL emirinden önce programın kesildiği yeri belirten PC (Program Counter)'nin içeriği otomatik olarak stack' e itilir ve işlem bitirildikten sonra tekrar otomatik olarak yüklenir. Eğer istenilen register' ların stack bellek' e itilmesi isteniyorsa bu işlem programcı tarafından yapılmalıdır. Örneğin ;

    PUSH IE
    MOV IE,#MASK
    CALL LABEL
    -------------------------
    POP IE
    RET
    LABEL:
    RETI

    gibi...


    2.2.2. Zamanlayıcı ve Sayıcı Yapısı (Timer / Counters)

    8051 iki 16 bitlik Timers/Counters registeri içerir. Bunlar Timer0 ve Timer1'dir.Her ikisi de zamanlayıcı ya da olay sayıcı olarak konfigüre edilebilir.
    Timer (Zamanlayıcı) işlevinde , register her makine saykılın da bir arttırılır. Bir makine saykılı ise 12 osilatör periyoduna eşittir. Böylece sayma hızı (count rate) 1/12 osilatör frekansına eşitlenir.
    Counter (Olay sayıcı) işlevinde ise register harici giriş bacağı yerini tutan T0 veT1'deki her 1'den 0'a geçişte bir arttırılır.

    Timer0 ve Timer1 dört işlem moduna sahiptir. Zamanlayıcı ya da 'Olay sayıcı' işlevlerinin seçimi SFR' deki TMOD register' inin içindeki C/T kontrol biti ile sağlanır. Her iki zamanlayıcı TMOD içindeki M1-M0 bit çiftlerinin sayesinde dört işlem moduna sahip olur

    GATE C/T M1 M0 GATE C/T M1 M0
    msb lsb
    TIMER-1 TIMER-0

    TIMER/COUNTER MODE CONTROL (TMOD) REGISTER

    GATE: Kapı Kontrol Setlendiği zaman sadece INTX bacağı yüksek ve TRX kontrol biti 1 ise yetkili olur. Sıfırlandığı zaman, TRX kontrol biti 1 olduğunda Timer/Counter yetkilidir.

    C/T: Zamanlayıcı veya Sayıcı seçici Zamanlama işlevinde resetlenir Sayma işlevinde setlenir.





    M1 M0 İşlem Modu
    0 0 (Mode 0) MCS-48 ile aynı zamanlayıcı özelliğinde TLX 5 bitlik ön ölçeklendirici gibi servis verir.

    0 1 (Mode 1) 16 bit zamanlayıcı. TLX ve THX kaskat bağlıdır. Ön ölçeklendirici yoktur.

    1 0 (Mode 2) 8 bitlik otomatik yeniden yüklemeli Timer/Counter.

    1 1 (Mode 3) TL0 , standart Timer0 kontrol bitlerinin kontrol ettiği bir
    Timer/ Counter. TH0 , Timer1 kontrol bitlerinin kontrol ettiği 8 bitlik bir zamanlayıcıdır.

    1 1 Timer1 Timer/Counter durdurulmuştur.


    Mode-0 : Mode 0 'da 8051 timer aynen 8048 Timer' ın yerine konulabilir yani aynı özellikler gösterir. 8 bitlik sayıcı ve 5 bitlik ön ölçeklendirici.

    Bu modda zamanlama registeri 13 bit'e ayarlanabilir. 1'den 0'a geçişler sayılır ve Timer interrupt bayrağı olan TF1 setlenir. TR1=1 ve GATE=0 ya da INT1=1 gerçeklenirse sayılmış giriş yetkilidir. TR1 kontrol biti SFR' deki TCON 'da bulunur. GATE ise TMOD 'da bulunur.

    Mode-1: Mode 0 ile aynıdır,tek farkı Timer registerinin 16 bit olmasıdır.

    Mode-2: Timer register 8 bitlik Counter (TL1) ile otomatik yeniden yüklemeli olarak konfigüre edilebilir. TL1 'in yeniden yükleme değeri TH1'de saklanır. Yazılım ile presetlenebilir. TH1'in yeniden yükleme değeri değiştirilemez.

    Mode-3: Timer1 sayılacak değeri tutar. Etkin olabilmesi için TR1=0 'a setlenmelidir. Mode 3'de Timer0'ın TL0 ve TH0 iki ayrı sayıcı olarak atanır. Mode 3 bazı uygulamalar için gereken ekstra 8 bitlik Counter üzerindeki zamanlayıcı sağlar. Mode 3'de Timer 0 ile 8051 üç adet Timers/Counters' a sahip gibi görünür. Mode 3'de Timer/Counter, Seri port için Baud Rate üreteci gibi kullanılabilir ve interrupt istekleri oluşturmakta faydalana bilinir.


    TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
    msb lsb
    TIMER/COUNTER CONTROL (TCON) REGISTER

    TF1/TF0: Timer 1/0 taşma bayrağı. Timer/Counter' da taşma olduğunda donanımla setlenir ve interrupt işlendiğinde resetlenir.
    TR1/TR0: Timer 1/0 koşma kontrol biti. Yazılım ile set/reset'lenir.
    IE1/IE0: Interrupt 1/0 üstünlük bayrağı. Harici interrupt üstünlüğü belirtildiğinde setlenir ve interrupt işleminde resetlenir.
    IT1/IT0: Interrupt 1/0 tipi kontrol biti. Yazılım ile set/reset'lenir.




    2.2.3. Güç Kontrolu (Power Control)

    8051'de güç harcamasını minimuma indirebilmek için iki yazılım seçim modu vardır. Bunlar; Idle ve Power Down Modlarıdır. CPU Idle modda iken dahili RAM, zamanlayıcı, seri port ve interrupt sistem fonsiyonlarının işlemesine izin verir. Power Down modunda iken sadece dahili RAM değerleri korunur ve diğer bütün fonksiyonlar işlevsizdir. Bu özel modlar yazılım yolu ile aktif hale geçerler. Aktif hale geçirmek için gerekli register SFR' deki PCON
    registeridir

    SMOD - - - GF1 GF0 PD IDL
    msb lsb

    PCON(POWER CONTROL REGİSTER)

    SMOD : Çift veri iletim hızı (baud) oranı biti. Eğer setlenirse veri iletim hızı iki katına çıkar. Bu halde iken seri port varolan diğer modları kullanır.
    GF1 : Genel amaçlı bayrak biti.
    GF0 : Genel amaçlı bayrak biti.
    PD : Power Down biti. Bu bit setlenirse Power Down moduna girilir.
    IDL : Idle mode biti. Setlenirse Idle moduna girilir.

    Bazen aynı anda hem PD hem de IDL bitleri setlenmeye çalışılabilir. Bu durumda üstünlük PD' ye verilmiş olduğundan Power Down moduna girilir. PCON Registerinin reset değeri (0***0000)'dır.

    2.2.3.1. IDLE Modu

    CPU , Idle modunda iken , Stack Pointer(SP), Program Counter (PC), Program Status Word(PSW), Akümülatör , Dahili RAM ve bütün diğer registerlerin değerleri korunur. Idle modu, donanım ile geçerli bazı interruptlar sayesinde PCON.0'ın resetlenmesi ile sona erdirilebilir. Bu modu sona erdirmenin diğer bir yolu ise donanım reseti vermektir. Önce osilatör koşturulur ve donanım resetinin aktif olabilmesi için yalnızca 2 makine saykılı (24 Osc. Periyodu) ile karşılaşılınca reset işlemi tamamlanacaktır.


    2.2.3.2. POWER DOWN Modu

    PCON.1 bitinin setlenmesi ile aktif olur. Power Down' da osilatör durdurulur. Çipin üzerindeki RAM' ın ve SFR' nin içeriği bu modda korunur. Bu moddan çıkmanın tek yolu donanım reseti vermektir ama donanım reseti vermek SFR yeniden tanımlanmasına rağmen dahili RAM' ın içeriği değiştirilemez. Power Down modu ile devrede en küçük güç harcaması gerçekleşir ve Vcc gerilimi yaklaşık 2V seviyesini kadar indirilebilir. Ama Power Down moduna girilene kadar Vcc geriliminin düşürülmemesi gerekir. Power Down moduna girildikten en az 10msn sonra Vcc erilimi 2V'a çekilebilir.

    2.2.4. 8051 Mikrokontrolörlerde İletişim

    Data bir noktadan diğer bir noktaya iletilirken ya seri ya da paralel formatta düzenlenir. Her ikisinin de birbirine göre avantaj ve dezavantajlı olduğu yönler bulunmaktadır. Paralel data transferi genelde belirli sürede çok miktarda data transferinin gerektiği yerlerde kullanılır.(PC ile Printer arasındaki gibi) . Seri data iletim metotlarında yüksek data transfer hızlarına erişilebilir fakat paralel data transferine göre en önemli üstünlüğü datanın iletilebilmesi için gerekli iletken sayısının paralele göre daha az olmasıdır.


    2.2.4.1. Paralel Haberleşme

    Paralel data transferinde ,bir bilgisayarın mikroişlemcisi ile çevre birimler arasındaki data bus üzerindeki bilgilerin iletimi gibi datalar bu metodda paralel olarak iletilir. Paralel ve seri data transferinde bir karakterin iletimi 8 bit ile yapılıyorsa, paralel data iletimi seri iletime göre daha hızlı olacağı hiç şüphesizdir. Çünkü seri data iletiminde bir karakter iletmek için 8t süre harcanıyorsa (start,stop ve parity bitleri hariç) paralel data iletiminde t kadar bir sürede işlem gerçeklenmiş olacaktır(Buna diğer üç bitin eklenmediğine dikkat !). Paralel data iletiminde polling ve handshaking gibi kontrol işlemleri için de ayrı kabloların kullanılması maliyeti iyiden iyiye arttırmaktadır. Ayrıca uzak mesafelere iletimde sinyal zayıflamasını kompanze etmek için Repeater cihazının kullanılması ekonomikliği ortadan kaldırmaktadır. Böylece paralel data iletimi, bilgisayar sistemlerinin çevre birimlerle haberleşmesinde ve mesafenin kısa olması durumunda tercih edilebilir.


    2.2.4.2. Seri Haberleşme

    Uzak mesafelere dataların paralel iletimi için kablo ve diğer masrafların çok olmasından dolayı bu durumda daha çok seri data iletimi tercih edilir. Tek bir iletim kanalı üzerinden belirli bir zamanda bir bit iletilmesi seri data transferi olarak adlandırılabilir. Seri iletişim kendi arasında ikiye ayrılır. Şimdi de bunlar hakkında kısa ve öz bilgiler verelim;



    2.1.4.2.1. Seri-Senkron Haberleşme

    Senkron seri data iletiminde önemli bir konu iletim kanalının iki ucundaki alıcı ve verici düzeneklerin birbiriyle her zaman senkronize çalışması gerekmesidir. Senkronizasyon işlemi ikinci bir iletim hattı üzerinden ortak bir clock (saat) sinyalinin hem alıcıya hem de vericiye gönderilmesi ile elde edilebilir. İletim kanalının her iki ucunda zamanlamayı sağlamak, senkronizasyonu elde etmek için her zaman bir ana saat sinyali kullanılır. Senkron seri data iletimi veri bloklarının hazır olduğu durumlarda kullanılır. Örneğin ; Harddisk' teki bilgilerin karşı tarafa gönderilmesinde. Senkron iletişim asenkron iletişime göre daha karmaşıktır. Bunun ana nedeni alıcı ünitede Byte Eşzamanlısının yapılmasının gerekmesindendir.

    2.2.4.2.2. Seri Asenkron Haberleşme

    Asenkron seri data iletimi, veri iletişiminde kullanılan en basit ve en kolay yöntemdir. Verimliliği düşük olduğu için düşük hızlardaki veri iletiminde daha çok kullanılır. Transmitter' den gönderilen her bir karakter 8 bit ile temsil edilir ve iletim sırasında veri karakterlerinin başına start biti (lojik - 0) ve sonuna parity (hata denetimi amacıyla) ile stop bitleri eklenir.

    Her bir data dizisinin ilk biti start bitidir , lojik-1'den lojik-0'a geçişle belirtilir ve bu start biti bir bit süresince lojik-0'da kalır. Ardından data bitleri gelir ve data biti sayısı 5..8 bit arası seçilebilir. Hemen ardından hata denetimi biti ve stop biti gelir. Stop biti 1,1.5 ve 2 bit sürelerinde seçilir ve bu süre boyunca lojik-1'de kalır. Hat boş iken aradaki hat sürekli lojik-1 seviyesinde tutulur. Bunun nedeni tabi ki hattaki gürültülerden etkilenmemek içindir.

    PC kullanıcıları data iletimi yapmak için bir RS-232 seri port' a ihtiyaç duyarlar. Bu konnektör için bacak numaraları ve sinyal adları aşağıdaki tabloda verilmiştir.





























    BACAK NO ORTAK İSİM RS232C İSMİ TANIM
    1 AA Koruma toprağı
    2 TxD BA Gönderilen data
    3 RxD BB Alınan data
    4 RTS CA Gönderme için istek
    5 CTS CB Gönderme için serbest
    6 DSR CC Veri kümesi hazır
    7 GND AB Sinyal toprağı
    8 CD CF Alınan hat sinyal algılayıcı
    9
    10 Veri kümesi testi için ayrılmış
    11 Tanımlanmamış
    12 SCF İkincil alınan hat sinyali algılayıcı
    13 SCB İkincil gönderme serbest
    14 SBA İkincil gönderme veri
    15 DB İletim sinyal elemanı zayıflaması (DCE)
    16 SBB İkincil alınan veri
    17 DD Alıcı sinyal elemanı zayıflaması (DC)
    18 Tanımlanmamış
    19 SCA İkincil gönd.içn istek
    20 DTR CD Veri terminali hazır
    21 CG Sinyal kalitesi algılayıcı
    22 CE Halka gösterge
    23 CH/CI Veri sinyali hızı seçici(DTE/ DCE)
    24 DA İletken sinyal elemanı zayıflaması
    25 Tanımlanmamış

    Tablo-2-11- RS-232 Bacak Bağlantıları Tablosu



    2.2.4.3. Standart Seri Arabirim

    8051'deki seri portumuz Full -Dublex' tir. Yani hem alıcı hem de verici eşzamanlı olarak gerçeklenebilir. Seri portun alıcı ve verici (receiver - transmitter ) registerlerı SFR 'de SBUF adı ile bulunmaktadır. Gönderilecek bilgiler SBUF' a yazılır, alınacak bilgiler ise SBUF' dan okunur. Seri portun dört işlem modu vardır;

    Mode-0 : Seri data giriş ve çıkışı RxD üzerindendir. TxD çıkışı saat için kullanılır. Bu uç kaydırmalı-kaydedicileri (Shift -Register) uyarmak için kullanılabilir. 8 bit alınır/gönderilir. Mutlaka TTL veya CMOS kaydırmalı-kaydedicilerle senkronize I/O biçiminde kullanılmalıdır. Bu modun Baud Rate değeri 1/12 osilatör frekansına eşittir. Sistem seri ise bu modda hız, eğer osilatör 12MHz ise baud rate 1Mbit/sn gibi UART'nin çok üstünde bir değer olabilmektedir. Ayrıca paralel sistemlerde Shift -Register' den önce sadece iki hatta (RxD ve TxD) ihtiyaç duyması avantajdır.

    Mode-1 : 10 bit RxD ucundan ya da 10 bit TxD ucundan alınır/gönderilir. Bir adet başlama (start) biti,8 data biti ve birde durdurma (stop) biti bulunur. Alıcı durumda , durdurma biti SCON' daki RB8 bitinin içeriğine gider. Baud Rate değeri değişkendir.

    Mode-2 : 11 bit RxD ucundan ya da 11 bit TxD ucundan alınır/gönderilir. Bir start biti, 8 data biti, bir adet programlanabilir 9. data biti ve bir stop biti bu modda bulunur. Gönderici durumda 9. data biti SCON registerindeki TB8 bitinin içeriğine gider. Ya da örneğin, PSW 'nin içindeki P (parity bit),TB8 'in üzerine taşınabilir. Alıcı durumda 9.data biti SCON üzerindeki RB8 değerine gider (eğer stop bitine önem verilmezse).Baud Rate değeri osilatör frekansının 1/32 veya 1/64 'ü olarak programlanabilir.

    Mode-3 : 11 bit RxD üzerinden veya 11 bit TxD üzerinden alınır/gönderilir. Bir start biti, 8 data biti, bir programlanabilir 9. data biti ve bir adet stop biti bulunur. Gerçekte Mode-3 ile Mode-2 arasındaki fark, Mode-3'ün istisnai Baud Rate değerlerine ayarlanabilmesidir. Yani Baud Rate değeri değişkendir.

    Tüm bu dört modda iletişim bazı komutların SBUF gibi tanımlama registerlerini kullanması ile sağlanır.

    SCON registerinin içeriği yalnız mod seçmek için gerekli bitleri içermeyip ,alıcı ve verici için 9.biti (TB8 ve RB8) ve seri port interrupt bitleri olan RI ve TI 'yı da içerir.




    SM0 SM1 SM2 REN TB8 RB8 TI RI
    msb lsb
    SERİ PORT KONTROL (SCON) REGİSTER





    SM0 SM1 mode Baud Rate
    0 0 0 Fosc/12
    0 1 1 Değişken
    1 0 2 Fosc/32 yada Fosc/64
    1 1 3 Değişken


    SM0, SM1, SM2 : Seri port modu kontrol biti. Yazılımla set / resetlenir.

    REN : Alma yetkili kontrol biti. Seri data alma yetkili/yetkisiz yapmak için yazılımla set / resetlenir.

    TB8 : 9. data bitinin (mode-2 ve 3'e göre) gönderilip gönderilmeyeceğini belirlemek için kullanılan yazılım ile set/resetlenebilen bitdir.

    RB8 : 9. data bitinin alınıp alınmayacağını belirlemek için kullanılan yazılım ile set/resetlenebilen bitdir.

    TI : Gönderme interrupt bayrağı. Byte gönderildiğinde donanım tarafından setlenir. İşlem tamamlandığında yazılım ile resetlenmelidir.

    RI : Alma interrupt bayrağı. Byte alındığında donanım tarafından setlenir. İşlem tamamlandıktan sonra yazılım ile resetlenmelidir.


    2.2.4.4. Çokişlemcili Haberleşme (Multiprocessor Communications)

    Çokişlemcili Haberleşmede Mode-2 ve Mode-3 çok özel durumlara sahiptir. Bu modlarda 9.data biti kullanılabilir. Data alınırken 9.bit RB8'e yazılır ve arkasından stop biti gelir. Stop biti alındığında port programlanabilir böylece seri port interrupt' ı yalnız RB8=1 iken aktif olur. Bu özellik SCON üzerindeki SM2 bitinin setlenmesi ile geçerlidir. Bu özelliğin Çokişlemcili Haberleşme sistemlerinde kullanımı şu şekilde olabilir;

    Birincil(Master) işlemci bir ya da birkaç İkincil(Slave) işlemciye data bloklarını göndermek isterken ,ilk olarak hedef slave işlemciyi tanımlayan adres byte' larını yollar. Burada adres byte' ı ile data byte' larının farkını 9.bit belirler. 9.bit 1 ise adres byte' ı , 0 ise data byte' ıdır. SM2=1 yapmak ile , data byte' ı ile slave işlemci interruptlanmayacaktır. Adres byte' ında tüm slave işlemciler interruptlanacaktır. Bu yüzden slave işlemciler eğer belirtilen adresin kendi başlangıç adresleri (kendilerine ayrılan adres ise) olup olmadığını aldıkları adres byte' ını inceleyerek anlayabilirler. Adreslenmiş olan slave işlemci kendi SM2 bitini temizleyecek ve gelecek olan data byte' larını almak için kendilerini hazırlayacaklardır. Yani slave işlemciler başlama adresi verildikten sonra bunun kendi adresleri olup olmadığını test edeceklerdir ve daha sonra gelecek dataları alarak işleyeceklerdir.

    SM2 (SCON.5) biti Mode-0 'da kullanım dışıdır ve Mode-1 'de stop bitinin sağlamlığını(doğruluğunu) test etmek için kullanılır. Mode-1 'de SM2=1 ise alınan interruptlar stop biti alınıncaya kadar aktif olmayacaktır.
    2.2.4.4.1. BAUD RATE Değerleri

    Mode-0 'da baud rate değeri (osilatör frekansı/12) 'dir. Mode-2 'de PCON registerindeki SMOD biti 1 ise baud rate 1/32 ve SMOD 0 ise 1/64 osilatör frekansına eşittir. Mode-1 ve Mode-3 'de baud rate timer-1'in taşma zamanı (overflow rate) ile karakterize edilebilir.

    Timer-1 'in Baud Rate Generatörü Olarak Kullanılması:

    Timer-1 'in baud rate generatörü olarak kullanılırken, baud rate değeri SMOD bitinin ve Timer-1 taşma değerine göre karakterize edilmiştir. Bu uygulamada Timer-1 interrupt' ı geçersiz kılınacaktır.

    Mode-1,3 BR= (2 (SMOD) /32)*(Timer-1 taşma zamanı)

    BR : Baud Rate

    Timer-1 bazı durumlarda otomatik yeniden yüklemeli (Auto Reload Mode) modda konfigüre edilebilir. Bu durumda baud rate değeri ise;

    Mode-1,3 BR=(2* (SMOD) /32)*(O_Freq /(12*[256-(TH1)]))
    ile verilebilir.Aşağıdaki tabloda Timer-1 ile çok kullanılan bazı baud rate değerlerinin elde edilmesi için gereken değerler verilmiştir.

    Baud Rate
    OSC_freq
    (MHz) SMOD C/T
    c=1,t=0 Mode Reload value
    Mode-0
    Max :1.67MHz 20 X X X X
    Mode-2
    Max : 625 kHz 20.00 1 X X X
    Mode-1,3
    Max : 104.2 kHz 20.00 1 0 2 FFh
    19.2k 11.059 1 0 2 FDh
    9.6k 11.059 0 0 2 FDh
    4.8k 11.059 0 0 2 FAh
    2.4k 11.059 0 0 2 F4h
    1.2k 11.059 0 0 2 E8h
    137.5 11.986 0 0 2 1Dh
    110 6.00 0 0 2 72h
    110 12.00 0 0 1 FEEBh

    { Timer-1 için }




    Özetlenecek olursa seri port timer-1'in taşması tarafından saatlenecektir. Timer-1'in girişinde osilatör frekansı 12'ye bölünür ya da harici saat uygulanır. Mode-0'da 12MHz'lik bir kristal ile 1Mbit/sn ve Mode-2'de ise gene 12Mhz'lik kristal ile 187.5kHz'lik baud rate değerlerine erişilebilir. Mode-1,3'de ise baud rate timer-1'e bağlıdır ve timer yeniden yükleme değeri ile istenen frekansa eşitlenebilir.

    Şimdi bu yeniden yükleme değerinin nasıl hesaplandığına dair bir örneğe bakalım. UART işlem hızının 300 bps ve osilatör frekansının 12Mhz olduğu durumdaki yeniden yükleme değerini hesaplayalım; (ARV:Auto Reload Value)

    ARV=(Clock rate)/(12*32*Bit rate) ; 104.16

    Eğer T1 üzerinden harici saat kullanılıyorsa;

    ARV=(Clock rate)/(32*Bit rate) ; olur.

    Yaklaşık tamsayı olarak 104 kabul edilir ve Timer için aktüel değer 256-104=152=98h ' dir. Eğer TH1 98h değeri ile yüklenirse doğru hız olan 300 bps alınır.

    Buna göre bizim kullanacağımız sistemde 9600 bps için ve kristalinde 12MHZ olduğu kabulu ile hesap yapılacak olursa;

    ARV=12M/(12*32*9600)=3.25 olur.
    Yaklaşık olarak 3 kabul edilir ve 256-3=253d=0FCh bulunur.


    2.2.5. PC Seri I/O Arayüz Cihazının Kontrolü ve Programlama Çalışmaları

    PC' lerde seri ara yüz I/O cihazı olarak 8250 entegresi kullanılmaktadır. PC' lerde genel olarak iki seri ve bir paralel portları vardır. Bu sayı genel kullanım için yeterlidir. Amaca göre istenildiğinde arttırılabilir. Sistemde bulunan seri port ,taban vektör ve adresleri tabloda verilmiştir.

    COM1 00000:00400H 03F8H
    COM2 00000:00402H 02F8H
    COM3 00000:00404H 0378H
    COM4 00000:00406H 0278H


    Bu portların kullanımı için bazı registerlerin bulunması ve bunların gerekli değerlere setlenmeleri gereklidir. Bu registerler ;






    1. Data Register
    2. Interrupt Enable Register
    3. Interrupt Identification Register
    4. Data Format Register
    5. Serial Control Register
    6. Serial Status Register
    7. Modem Status Register' dir.


    1.Data Register:

    Data register göndermek ve almak için 1 byte tutar. İçindeki bitler alınacak veya gönderilecek bitleri tutar.

    Data Bit7 Data Bit6 Data Bit5 Data Bit4 Data Bit3 Data Bit2 Data Bit1 Data Bit0
    msb lsb

    2.Interrupt Enable Register:

    Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

    Bit0:Veri geldiğinde interrupt üret.
    Bit1:Veri gönderme işlemi tamamlandığında interrupt üret.
    Bit2:Hat durum değişikliğinde interrupt üret.
    Bit3:Modem hattı değişikliğinde interrupt üret.
    Bit4-7:Kullanılmaz.

    3.Interrupt Identification Register:

    Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

    Bit0:Interrupt bekliyor.
    Bit1-2: 00:Modem hattında değişiklik oldu.
    01:Gönderme tamamlandı.
    10:Veri geldi.
    11:Hattın durumunda değişiklik oldu.
    Bit3-7:Kullanılmaz.


    4.Data Format Register:

    Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0



    Bit0-1:Veri uzunluğu: 00 5bit
    01 6bit
    10 7bit
    11 8bit

    Bit2urdurma biti sayısı: 0 1bit
    1 2bit

    Bit3:Parity var/yok: 0 OFF
    1 ON

    Bit4:Parity tek/çift: 0 Tek
    1 Çift
    Bit5 : Stick parity

    Bit6 : Set Break

    Bit7 : Bölücüye erişim biti: 0 Diğer kütükler
    1 Bölücü


    5.Serial Control Register:

    Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

    Bit0: Terminal iletişime hazır.
    Bit1: Gönderme isteği.
    Bit2: Out1
    Bit3: Out2
    Bit4: Geri beslemeli teste geç.
    Bit5-7:Kullanılmaz.


    6.Serial Status Register :


    Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0


    Bit0: Veri hazır.
    Bit1: Veri ezilmesi var.
    Bit2: Parity biti hatası var.
    Bit3: Zamanlama hatası.
    Bit4: Alıcı işlemi yarıda kesti.
    Bit5: Gönderme tamamlandı.
    Bit6: Kaydırma tamamlandı.
    Bit7 : Kullanılmaz.


    7.Modem Status Register:

    Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0


    Bit0: CTS değişti.
    Bit1: DSR değişti
    Bit2: RI kesildi.
    Bit3: RLSD kesildi.
    Bit4: CTS' nine sıfıra tümleyeni.
    Bit5: DSR' nine sıfıra tümleyeni.
    Bit6: RI' nın sıfıra tümleyeni.
    Bit7: RLSD' nin sıfıra tümleyeni.


    2.2.5.1. Program Communicatıons' un Açıklanması


    Procedure BaudRate Aktif: Data Format registerinin en anlamlı biti 1 yapılırsa , data register ile interrupt enable registeri baud rate değerinin belirlenmesinde kullanılabilir. Procedure' de data format registeri (2FB)' nin 8. Biti setlenmektedir.

    Procedure DataAktif : Data Format registerinin en anlamlı biti resetlenmektedir. Data ve Interrupt Enable registerleri asıl işlevlerinde kullanılmaya başlanır.

    Procedure DataHız Tanımı: BaudRate Aktif yapıldıktan sonra 2F8 ve 2F9 adreslerine verilen word baudrate değeri olarak yazılır.

    Procedure DataHız Tanımı: Baud rate değeri okunuyor.

    Procedure PortuSetle: Seçilen haberleşme portuna gerekli tanımlamalar yazıldı.

    Function InterruptDurumu: Interrupt ID registeri okunarak verinin geldiğini veya gönderildiğini belirler.

    Function PortuOku: Porttan gelen verinin okunmasını sağlar.

    Procedure PortaYaz : Porta bir byte' lık veriyi koyar. Gönderilecek karakter data registerine konulur.

    Function ByteToString: Byte olarak verilen veriyi string' e dönüştürür.

    Function StringToByte: String olarak verilen veriyi byte' a dönüştürür.

    Procedure SeriCom: PC' de 8051 işlemcisi için assembler program yazıp derlendikten sonra HEX uzantılı bir dosya oluşmaktadır. Bu HEX uzantılı dosya assembly emirlerin kodlarını ve adreslerini içermektedir. Dosyanın bir satırının formatı ;
    dataların_uzunluğu+adres+kayıt_tipi+datalar+kontrol_byte'ı, şeklindedir. Bu procedure ile ismi verilen HEX uzantılı dosyadan okunmakta ve seri porttan gönderilmektedir.





    Program Communications;
    uses
    dos,crt;
    {*************************************************************}

    const
    {baud rate tanımlamaları}
    br_9600 =$000C;

    {parity biti tanımlamaları}
    pr_none =$00;
    pr_odd =$08;
    pr_even =$18;

    {data uzunluk tanımlamaları}
    dl_6 =$01;
    dl_7 =$02;
    dl_8 =$03;

    {stop biti tanımlamaları}
    sb_1 =$00;
    sb_2 =$04;

    {seri port tanımlamaları}
    com1 =0;
    com2 =1;

    {8250 entegresi içerisindeki register tanımlamaları}
    data =0;
    interrupt_enable =1;
    interrupt_identification =2;
    data_format =3;
    seri_control =4;
    seri_status =5;
    modem_status =6;

    yetkilendir =128;

    {register için port adresleri}
    regs:array[0..1,0..6] of word=(($3f8,$3f9,$3fa,$3fb,$3fc,$3fd,$3fe),
    ($2f8,$2f9,$2fa,$2fb,$2fc,$2fd,$2fe));

    {interrupt_identification tanımlamaları}
    veri_geldi =4;
    veri_gonderme_tamamlandi =2;

    {Hexadecimal Rakamların Tanımlanması}
    Hexal:Array[1..16] of String[1]=('0','1','2','3','4','5','6','7',
    '8','9','A','B','C','D','E','F');


    var
    sayih,sayil:byte; {ByteToString Function'u için}
    hsayih,hsayil:string[1]; {StringToByte Function'u için}
    ch:char;


    {*************************************************************}
    {data_format registerinin en anlamlı biti 1 yapılıyor}
    procedure BaudRateAktif(pn:byte);
    var
    temp:byte;
    begin
    temp:=port[regs[pn,data_format]] or yetkilendir;
    port[regs[pn,data_format]]:=temp;
    end;

    {*************************************************************}
    {data_format registerinin en anlamlı biti 0 yapılyor}
    procedure DataAktif(pn:byte);
    var
    temp:byte;
    begin
    temp:=port[regs[pn,data_format]] and (not yetkilendir);
    port[regs[pn,data_format]]:=temp;
    end;

    {*************************************************************}
    {baud_rate değeri ilgili registere yerleştiriliyor}
    procedure DataHizAyari(pn:byte;speed:word);
    begin
    baudrateaktif(pn);
    port[regs[pn,data]]:=lo(speed);
    port[regs[pn,data+1]]:=hi(speed);
    end;

    {*************************************************************}
    {byte tipinde olan register word olarak tanımlanıyor}
    function DataHiziTanimi(pn:byte):word;
    begin
    baudrateaktif(pn);
    datahizitanimi:=portw[regs[pn,data]];
    end;

    {*************************************************************}
    {seçilen haberleşme portunun tanımlaması yapılıyor}
    procedure PortuSetle(pn:byte;speed:word;parity,datalen,stopbits:byte);
    var
    kontrolreg:byte;
    begin
    datahizayari(pn,speed);
    kontrolreg:=parity or stopbits or datalen;
    port[regs[pn,data_format]]:=kontrolreg;
    end;

    {*************************************************************}
    {veri geldiğinde ilgili registeri setler}
    function InterruptDurumu(pn:byte):byte;
    var
    b:byte;
    begin
    b:=port[regs[pn,interrupt_identification]];
    interruptdurumu:=b and (veri_gonderme_tamamlandi+veri_geldi);
    end;

    {*************************************************************}
    {port veri koruması için setleniyor veya okunuyor}
    function PortuOku(pn:byte):byte;
    begin
    dataaktif(pn);
    portuoku:=port[regs[pn,data]];
    end;

    {*************************************************************}
    {data registerine bir byte yazar}
    procedure PortaYaz(pn:byte;ch:byte);
    begin
    dataaktif(pn);
    port[regs[pn,data]]:=ch;
    end;
    {*************************************************************}

    Function ByteToString(Sayi:Byte):String;
    Var
    HexSayi:String[2];
    ie:Byte;
    Begin
    SayiH:=Trunc(Sayi/16);
    SayiL:=Trunc(Sayi-SayiH*16);
    For ie:=0 to 15 do
    if SayiH=ie then HexSayi:=Hexal[ie+1];
    For ie:=0 to 15 do
    if SayiL=ie then HexSayi:=HexSayi+Hexal[ie+1];
    ByteToString:=HexSayi;
    End;

    {*************************************************************}
    Function StringToByte(HexSayi1:String):Byte;
    Var
    Sayi1:Byte;
    ie:Byte;
    Begin
    HSayiH:=(Copy(HexSayi1,1,1));
    HSayiL:=(Copy(HexSayi1,2,1));
    For ie:=0 to 15 do
    if HSayiH=Hexal[ie+1] then Sayi1:=ie*16;
    For ie:=0 to 15 do
    if HSayiL=Hexal[ie+1] then Sayi1:=Sayi1+ie;
    StringToByte:=Sayi1;
    End;
    {*************************************************************}
    Procedure SeriCom;
    Label Oku;
    Var
    DosyaAdi:String[50];
    Run:String;
    Test:Boolean;
    PortOkunan:Byte;
    Dosya:Text;
    Uzunluk,KayitTipi,RamAdrH,RamAdrL,RamData:String[2];
    UzunlukByte,RamAdrHByte,RamAdrLByte,RamDataByte:Byte;
    i,j:Integer;
    Begin
    clrscr;
    TextBackGround(7);TextColor(0);
    GotoXY(18,12);Write('-');
    for i:=19 to 66 do
    Begin
    GotoXY(i,12);
    Write('-');
    End;
    GotoXY(67,12);Write('-');
    GotoXY(18,20);Write('-');
    for i:=19 to 66 do
    Begin
    GotoXY(i,20);
    Write('-');
    End;
    GotoXY(67,20);Write('-');
    for i:=13 to 19 do
    Begin
    GotoXY(18,i);
    Write('-');
    End;
    for i:=13 to 19 do
    Begin
    GotoXY(67,i);
    Write('-');
    End;
    TextBackGround(4);TextColor(30);
    GotoXY(19,13);Write(' Seri Port COM2 :9600,n,8,1 ');
    TextBackGround(7);TextColor(1);

    {Iletişim Test}
    test:=FALSE;
    GotoXY(19,14);Write(' ');
    GotoXY(19,15);Write(' İletişim Kurulmaya Çalışılıyor ');
    GotoXY(19,16);Write(' ');
    GotoXY(19,17);Write(' ');
    while NOT test do
    begin
    PortaYaz(1,11);
    if InterruptDurumu(com2) =veri_geldi then
    begin
    PortOkunan:=PortuOku(com2);
    if PortOkunan=11 then
    test:=TRUE;
    end
    else
    if keypressed then
    begin
    GotoXY(19,14);Write(' ');
    GotoXY(19,15);Write(' İletişim Sağlanamıyor. ');
    GotoXY(19,16);Write(' ');
    GotoXY(19,17);Write(' ');
    halt;
    end;
    end;}

    GotoXY(19,14);Write(' ');
    GotoXY(19,15);Write(' Yükleme Yapacağınız Dosya Adı: ');
    GotoXY(19,16);Write(' ');
    GotoXY(19,17);Write(' ');
    GotoXY(21,16);Readln(DosyaAdi);
    if DosyaAdi='' then
    begin
    TextBackGround(0);TextColor(15);GotoXY(1,21);exit;
    end;
    DosyaAdi:='C:\UTIL\ASM51\EXP\'+DosyaAdi+'.HEX';

    {$I-}
    Assign(Dosya,DosyaAdi);
    Reset(Dosya);
    if IOResult<>0 then
    Begin
    TextBackGround(0);TextColor(12);
    GotoXY(24,18);Write(' Hatalı Dosya Adı');
    GotoXY(26,19);Write(' ');
    { Readkey; }
    TextBackGround(0);TextColor(15);
    GotoXY(1,21);
    Exit;
    End;
    Close(Dosya);
    {$I+}

    TextBackGround(0);TextColor(12);
    Assign(Dosya,DosyaAdi);
    Reset(Dosya);
    Oku:
    Read(Dosya,ch);
    if ch<>':' then
    Begin
    GotoXY(19,18);Write(' Çalışma dosyanız ASM51 HEX yapılı değil ');
    GotoXY(19,19);Write(' ');
    Close(Dosya);
    TextBackGround(0);TextColor(15);
    GotoXY(1,21);
    Exit;
    End;
    if ch=':' then
    Begin
    GotoXY(19,18);Write(' .......... Datalar RAM a yazılıyor ...........');
    Uzunluk:='';
    For i:=1 to 2 do
    Begin
    Read(Dosya,ch);
    Uzunluk:=Uzunluk+ch;
    End;
    UzunlukByte:=StringToByte(Uzunluk);
    RamAdrH:='';
    For i:=1 to 2 do
    Begin
    Read(Dosya,ch);
    RamAdrH:=RamAdrH+ch;
    End;
    RamAdrHByte:=StringToByte(RamAdrH);
    RamAdrL:='';
    For i:=1 to 2 do
    Begin
    Read(Dosya,ch);
    RamAdrL:=RamAdrL+ch;
    End;
    RamAdrLByte:=StringToByte(RamAdrL);
    KayitTipi:='';
    For i:=1 to 2 do
    Begin
    Read(Dosya,ch);
    KayitTipi:=KayitTipi+ch;
    End;
    if (Uzunluk='00') and (RamAdrH='00') and (RamAdrL='00') and (KayitTipi='01') then
    Begin
    Delay(50);
    PortaYaz(Com2,255);
    Delay(50);
    PortaYaz(Com2,255);
    Delay(50);
    PortaYaz(Com2,00);
    Delay(50);
    Close(Dosya);
    GotoXY(19,18);Write(' Transfer Tamamlandı... ');
    GotoXY(19,19);Write(' Programı koşmak istiyor musunuz ( E/H ): ');
    GotoXY(64,19);Readln(Run);
    if (Run='e') or (Run='E') then
    Begin
    PortaYaz(Com2,01);
    GotoXY(19,18);Write(' ......... Program Koşuluyor ......... ');
    GotoXY(19,19);Write(' ');
    End
    else
    Begin
    PortaYaz(Com2,00);
    GotoXY(19,18);Write(' ');
    GotoXY(19,19);Write(' ');
    End;
    TextBackGround(0);TextColor(15);
    GotoXY(1,21);
    Exit;
    End;
    For j:=1 to UzunlukByte do
    Begin
    RamData:='';
    For i:=1 to 2 do
    Begin
    Read(Dosya,ch);
    RamData:=RamData+ch;
    End;
    RamDataByte:=StringToByte(RamData);
    Delay(50);
    PortaYaz(Com2,RamAdrHByte);
    Delay(50);
    PortaYaz(Com2,RamAdrLByte);
    Delay(50);
    PortaYaz(Com2,RamDataByte);
    GotoXY(28,19);Write('Adres :',ByteToString(RamAdrHByte),ByteToString(RamAdrLByte),' Data : ',RamData);
    RamAdrLByte:=RamAdrLByte+1;
    if RamAdrLByte=0 then RamAdrHByte:=RamAdrHByte+1;
    End;
    End;
    Readln(Dosya);
    Goto Oku;
    End;

    begin
    PortuSetle(Com2,BR_9600,Pr_None,Dl_8,Sb_1);
    DataAktif(Com2);
    SeriCom;
    end.


    Konu duray tarafından (05.Mayıs.2007 Saat 00:11 ) değiştirilmiştir. Sebep: başlık yeniden düzenlendi

  2. #2
    professionals
    Üyelik tarihi
    Mart.2007
    Nereden
    Afyon
    Mesajlar
    140

    kurukafa Ce: sadece 36 sayfasi sigdi 40 sayfa daha var ilgilenler olursa msj attsinn

    selam,

    bu neyin programı???

    kitap mı!!!! nedir.....
    Her konuda mütavazi ol!!!!!
    Mütavazilikte Toprak gibi ol!!!
    (Hayatı güzelleştirmek bizim elimizde)

  3. #3
    forum üyesi
    Üyelik tarihi
    Mart.2008
    Nereden
    istanbul
    Mesajlar
    9

    Standart Cevap: 8051 mikroişlemci

    arkadaşım çok teşekkür ederim eline sağlık diğer sayfalarıda almak isterim mümkünse aşağıdaki maile gönderirsen çok makbule geçer
    şimdiden teşekkür ederim iyi çalışmalar





    hayrisen46@mynet.com
    Konu bilgin61 tarafından (21.Nisan.2008 Saat 00:09 ) değiştirilmiştir. Sebep: çalışmayan mail

  4. #4
    forum üyesi
    Üyelik tarihi
    Nisan.2008
    Mesajlar
    2

    Standart Cevap: 8051 mikroişlemci

    kardes eline saglık hepsı ıcın ama
    benım browserda goun muyor sekıller ve tablolar..
    dolasıyle anlatım bıraz karısık gelıyor.
    sayfayı tekrar kontrol edebılırmısın...

  5. #5
    BİLGİSAYAR DONANIM VE YAZLIM
    Üyelik tarihi
    Şubat.2009
    Nereden
    K.MARAŞ
    Mesajlar
    16

    Standart Cevap: 8051 mikroişlemci

    Eline sağlık uğraşmışın iyi bilgiler teşekkürler

  6. #6
    forum üyesi
    Üyelik tarihi
    Şubat.2009
    Mesajlar
    12

    Standart Cevap: 8051 mikroişlemci

    bu 8051 x86 tabanlı işlemcilere giriyomu peki bununla diğerlerine göre basit bir pc kasa yapabilirmiyiz

  7. #7
    forum üyesi
    Üyelik tarihi
    Nisan.2009
    Mesajlar
    27

    Standart Cevap: 8051 mikroişlemci

    oooyyy ooyyyy okulda 1 dönem bu işlemciyi gördük asembler de programlamaya başladık tam düzene oturacağımız zaman bu defteri kapatıp C dilini öğrenmeye geçtik (böyle müfredatın ................ denir yani başka ne diyebilirsiniz ki ) daha da beteri 3-4 ayda c yi de öğretemediler 1 sene boşa gitti elde var 0 şimdi pic leri grünce bu işlemciden soğudum tabi bu biraz daha profesyonel bir eleman pic ler bunun yanında hafif kalıyorlar ( sözüm 877 den dışarı )

  8. #8
    forum üyesi
    Üyelik tarihi
    Ağustos.2011
    Mesajlar
    1

    Standart Cevap: 8051 mikroişlemci

    Günümüzde mikroişlemci kelimesi pek çok insan için yabancı olmayıp herkese fraklı anlam ifade eder. Teknik olmayan pek çok kişi , mikroişlemcinin , bir kişisel bilgisayarda (PC) kullanılan , bilgisayarını gücünü belirleyen çok önemli bir elektronik tümdevre olduğunu bilir. PC‘lerden başlayıp ,diz üstü PC’ler, minibilgisayarlara kadar bütün bilgisayarlar, mikroişlemcinin görevini gerçekleştiren , daha genel bir ifadeyle ,bir işlemciye sahiptir. Bilgisayarlardaki işlemciler , 1950’lerden günümüze çok değişik şekiller almıştır. Günümüzde tipik bir bilgisayar üç ana birimden oluşur :

    1- Merkezi İşlem Birimi(Central Processing Unit-CPU) 2- Hafıza (Memory) 3- Giriş/ Çıkış(I/O) Birimleri

    CPU ,bilgisayarın değişik birimleri arasındaki veri akışı ve veri işleme görevlerini yerine getirir. Veri işlemenin çoğu, CPU içindeki aritmetik lojik birimde gerçekleştirilir. CPU çeşitli komutları yürüterek , bilgisayar sisteminin çalışmasını yönetir. Bilgisayar hafızasında saklı olan komutlar, bilgisayarın yürüteceği programı oluşturur. Bir CPU‘ daki kontrol alt birimi, sistemdeki veri akışını yönetir, hafızadan okunan komutu çözer ve komut tarafından belirlenen işlemi yerine getirir. İşlemler ,veri transferi veya ALU’ daki işlemlerdir. ALU , toplama ,çıkarma .çarpma ,bölme gibi temel aritmetik işlemler ve lojik işlemleri yerine getirir. Lojik işlemler, AND, OR ve EX-OR gibi işlemlerdir.

    Dış dünyadan CPU’ ya veri transfer eden alt birim giriş cihazıdır. Giriş verisi, bir insan ,diğer bir bilgisayar veya başka bir elektronik sistem gibi çok değişik kaynaklardan gelebilir. CPU tarafından işlenen veri , hemen çıkışa gönderilebilir veya daha sonra işlenmek üzere hafızada saklanır. CPU’ dan dış dünyaya veri transfer eden alt birim çıkış cihazıdır. Bu birim ile, göstergeler, yazıcılar ,diğer bilgisayarlara veya elektronik sistemlere veri transfer eden cihazları belirtmektedir.
    1971 yılında , bir bilgisayarın ALU ile kontrol birimlerinin bir silikon tümdevresi üzerine , INTEL firması tarafından konulması ile , mikroişlemciler dönemi başlamıştır.
    Basit bir teknik tanım ile , mikroişlemci, yarı iletken tek bir tümdevre üzerine yerleştirilmiş CPU'’ya denir. Mikroişlemciler genel amaçlı cihazlar olup bir çok uygulama için uygundur. Bir mikroişlemci temel olarak CPU’ nun fonksiyonlarını yerine getirdiği için ,pek çok kere , CPU ile mikroişlemci eş anlamda kullanılmaktadır.
    Bir bilgisayarın CPU’ su baskı devre kartında bulunuyorsa , bilgisayar , minibilgisayar diye adlandırılır. Bir mikroişlemci etrafına kurulu bilgisayar, mikrobilgisayar diye adlandırılır. Bir mikrobilgisayarın mikroişlemcisi, I/O ve hafıza cihazları ,teknolojiye ve uygulamalara göre devamlın değişim göstermektedir. Teknolojinin gelişimi doğrultusunda , daha önce mikroişlemci tümdevresi üzerinde olmayıp dışarıda olan , pek çok giriş/ çıkış ve hafıza alt birimleri, CPU üzerine taşınmıştır.

    Mikrokontrolör , bir tümdevre üzerinde üretilen bilgisayara denir. Bir mikrokontrolör tümdevresinde bulunan hafıza ve giriş/ çıkış alt sistemleri, bu işlemcilerin bir çok uygulama içinde , gömülü olarak doğrudan ve tek başına , mikroişlemcilere göre çok daha basit ve ucuz arabirim teknikleriyle , kontrol amaçlı olarak kullanılmalarını sağlar. Günümüzde mikroişlemciler ev mikrokontrolörler teknolojinin vazgeçilmez birimleri olup , sayısız alanlarda kullanılmaktadır. Bugün ,mikroişlemci ve mikrokontrolör üreten pek çok firma bulunmaktadır. Bunların en önemlileri INTEL ve MOTOROLA firmalarıdır.

    Bir mikrokontrolör, özet olarak , kullanıldığı sistemin bir çok özeliğini aynı anda gözleme (monitoring) ,ihtiyaç anında gerçek zamanda cevap verme (real-time response) ve sistemi denetlemeden (control) sorumludur.

    Mikrokontrolörler , örneğin , otomobillerde motor kontrol, elektrik ve iç panel kontrol ; kameralarda , ışık ve odaklama kontrol gibi amaçlarla kullanılmaktadır. Bilgisayarlar , telefon ve modem gibi çeşitli haberleşme cihazları ,CD teknolojisi , fotokopi ve faks cihazları , radyo, TV,teyp,oyuncaklar, özel amaçlı elektronik kartlar ve sayılamayacak kadar pek çok alanda , mikrokontrolörler yoğun olarak kullanılmaktadırlar. Bu kadar geniş uygulamalarda kullanılan mikrokontrolörler , tümdevre –üzerinde yer alan çok değişik donanım özelikleri sunmaktadır. Bu özeliklerden bazıları şunlardır :

    Paralel ve Seri I/O portları ,zamanlayıcı / sayıcılar, ADC, ve RAM, ROM, EPROM ve EEPROM gibi değişik kapasitelerde ve özeliklerde hafıza birimleri.

    Mikrokontrolörlerin yoğun olarak kullanıldığı elektronik ve kontrol uygulamalarının yapısı , mikrokontrolör , onun arkadaşı olan genel amaçlı mikroişlemciden ayırmaktadır. Bu uygulamalarda gerçek zaman (real time) işlemi ve çok görevlilik( multi-tasking ) özeliği bulunur. Gerçek zamanda işleme , kontrolörün , sinyalleri çalışma ortamından hazır olduklarında alıp ortamı bekletmeden işleyebilmesi demektir. Benzeri şekilde ,kontrolör ihtiyaç anında çalışma ortamına ,gereken kontrol sinyallerini göndermeli ve ortamı bekletmeyecek tarzda hızlı olmalıdır. Diğer bir deyişle mikrokontrolör , sistemin çalışmasında sınırlayıcı etmen olmamalıdır. Çok görevlilik, bir çok görevi aynı anda veya aynı anda gibi yapabilme kapasitesidir.













    BÖLÜM II
    8051
    2.1 8051 MİKROKONTROLÖR AİLESİ


    8051 Intel firması tarafından , 1980 ‘lerin başında piyasaya sunulan , dünyanın en popüler 8-bit mikrokontrolörüdür. Bu mikrokontrolör için , başta Intel olmak üzere , pek çok üretici firma (Philips , Dallas, Siemens ,Oki ve Matra/Harris gibi) geniş bir donanım ve yazılım desteği sunmuş ve bunun neticesi, 8051, 1980‘lerden bugüne , bir endüstri standardı olmuştur.

    8051 ailesi bazen MCS-51 ailesi olarak da belirtilir. “ MCS” harfleri, geleneksel olarak , Intel firmasının üretmiş olduğu , bir sistemi veya CPU ‘lar , hafızalar, saat üreteçleri, giriş/ çıkış birimleri ve benzeri birimler içeren , mikrobilgisayar ve uyumlu parçaları (components) belirtmede kullanılmıştır. Kitapta 8051 ve MCS-51 ifadeleri , eş anlamlı olarak aynı aileyi belirtmek için kullanılmıştır ve genelde ,bir işlemciyi belirtmeyip ailenin ismi olarak kullanılmaktadır. Bununla beraber , 8051, MCS-51 ailesinin ilk üyelerinden olan , 8051, 8751 ve 8031 mikrokontrolörlerinden birinin de adıdır. Bugün için değişik mikrokontrolör aileleri arasında ,8051 ailesi, gelişmiş ürünleriyle beraber yaklaşık % 40 gibi bir piyasa payına sahiptir. 8051 ailesinin temel özelikleri aşağıda maddeler halinde özetlenmektedir:

    Popüler : Kolay bir şekilde bulunmakta ve desteklenmektedir. 8051 geliştiricileri için bir çok Internet Web sayfası , kitaplar , teknik dökümanlar , yazılım ve donanım gereçleri bulunmaktadır.

    Uygun, Hızlı ve güçlü : 8051 çekirdek mimarisi hedef kontrol uygulamalar için çok uygun olup hızlı ve güçlüdür.

    Geniş yelpaze ve uyumluluk : Çok değişik 8051 ürünleri olmasına karşın , ikili kod düzeyinde bütün ürünler uyumludur (compatible). Diğer mikrokontrolör aileleri , 8051 ‘in sunmuş olduklarını , farklı ve uyumsuz işlemcilerle (genellikle tek üretici firma kaynaklı olarak ) ancak sağlayabilmektedir. Bu uyumluluk , kolaylık ve esneklik , program geliştirme araçlarında , eğitiminde ve yazılım desteğinde de bulunmaktadır.

    Çok kaynaklılık : Günümüzde çok değişik 8051 işlemcisi üreten 12 üreticinin üzerinde firma bulunmakta ve sayısız yazılım ve bilgi kaynakları bulunmaktadır.

    Sürekli iyileştirme: 1980‘lerden bugüne silikon ve tasarım olarak sürekli geliştirilen 8051’ler hızını ve gücünü arttırmıştır. Günümüzde 16-bit modellerinin de bulunduğu 8051’ler değişik kapasite , boyutlarda ve fiyatlarda kolay bir şekilde temin edilebilmektedir.


    Şekil-2-1 8051 Mikrokontrolör Blok Diyagramı

    8051 ailesi 8-bit single-chip mikrokontrolör 'ler sanayi uygulamaları için geliştirilmiş üzerinde hem giriş hem de çıkış için kullanılabilen 4 adet I/O port'u bulunan ayrıca bu portları Data ve Adres hatları olarak kullanabilen bir yapıya sahiptir. 8051'de Program Bellek olarak 8KB ROM, 8751'de ise 8KB EPROM vardır. Program Bellek 16-bit adresleyebildiğinden, Program Belleğimiz 64 KB olabilir.16-bitlik Data Bellek' in adreslenebilmesi CPU' da bulunan DPTR register' i sayesinde mümkündür. Program Bellek yalnız okunabilir,yazılamaz. Bu ailede 64KB'dan büyük Program Bellek alanına sahip olan işlemciler de vardır. 8051'de programın ilk 4KB'lık kısmı chip üzerinde bulunan ROM' da tutulabilir. ROM' suz versiyonlarda Program Bellek haricidir ve örneğin EPROM olabilir. Bu versiyonlarda harici Program Bellek ucu PSEN (Program Store Enable) 'dir.


    Şekil-2-2 ALE Kullanımı İle Harici Program Kodunun Okunma Zamanlaması
    Data Bellek (RAM) ,Program Bellekten ayrı bir adres alanını işgal eder. 8051'de 128 Byte' lık Data Bellek chip' in üzerindedir. Bunlarda en fazla 64KB harici RAM ,harici Data Bellek alanında adreslenebilir. ROM'suz versiyonlarda 128 Byte' lık Data Bellek (RAM) chip üzerindedir. CPU' nun RD ve WR bacaklarından çıkan okuma ve yazma sinyalleri ile ihtiyaç duyulan Data Bellek' e erişilebilinir.





    Şekil-2-3 Ortak Adres ve Data Yolunun Program Kodu Okunması Sırasındaki Zamanlaması




    Şekil-2-4 Okuma İşlemi Zamanlaması

    RD ve PSEN sinyalleri lojiksel olarak AND' lenirse bu çıkış ucu harici Program/Data Bellek için okuma sinyali oluşturulabilir. 8051 Blok Diyagramı şekil-2-4.'de verilmiştir.


    Reset' ten sonra CPU programını icra etmeye 0000H adresinden başlar. Program Bellek' in bazı bölgeleri İnterrupt' lar için ayrılmıştır. Gelen interrupt CPU' nun bu adres alanına atlamasına ve buradan servis programının icrasına başlamasına neden olur. Örneğin harici INT0 interrupt' ı 0003H bölümüne ayrılmıştır. Eğer harici INT0 kullanıma girerse, program servis rutini 0003H bölümüne atlayarak interrupt' a cevap vermeye çalışır. Eğer harici INT0 kullanımda değilse servis rutini genel Program Bellek' i okumaya ve icra etmeye devam eder.

    İnterrupt servis bölümleri 8 Byte' lık aralarla yerleştirilmişlerdir.

    Örneğin; Vektör Adres
    Interrupt-0 : 0003H
    Timer -0: 000BH
    Interrupt-1: 0013H
    Timer-1: 001BH
    RI+TI: 0023H 'dir.


    Program Bellek'in (ROM) , harici ROM veya dahili ROM' dan hangisinin seçileceği chip üzerindeki EA (External Access) bacağının durumuna bağlıdır. Eğer EA bacağı +5V potansiyeline çekilirse program direk olarak dahili ROM'un 0000H ile 0FFFH adreslerinden çağrılır. Eğer program 1000H ile FFFFH adreslerinden çağırılıyorsa harici ROM kullanıldığı anlaşılır. EA bacağı toprak potansiyelinde ise tüm program harici ROM(EPROM) 'dan direk olarak çağrılır. ROM' suz versiyonlarda(8031-80C31) program' ın harici Program Bellek alanından çağrılması için EA bacağı toprak potansiyeline çekilmelidir

    Harici program icrası için donanım konfigürasyonu şekil-2-5' de gösterilmiştir.


    Şekil-2-5. CPU-EPROM ve Latch ile Harici Program Kodunun Okunması İçin Gerekli Donanım

    Burada P0 ve P2 (16-bit I/O hattı) external Program Bellek' ten programı getirmek için bum fonksiyonlarını yerine getirmek görevini üstlenmişlerdir. P0 (PORT-0) adres ve data hattının çoğullanmasından oluşmuştur. Böylece CPU' nun bacak sayısı azaltılabilmiştir. Bu çoğullama işleminden adres ve data hatlarını birbirinden ayırma işlemi CPU' dan çıkan ALE (ADDRESS LATCH ENABLE) bacağı sayesinde olmaktadır.

    Dahili Data Bellek alanı 3 bellek bloğuna bölünmüştür ve bunlar 128 Byte' n altı,üstü ve SFR (Special Function Register) olarak bilinir. Dahili Data Bellek adresleri her zaman 1Byte'lıktır. Bu yüzden bu adres alanı yalnızca 256 Byte' ı ima eder. Kuramsal olarak Data Bellek alanı 384 Byte olarak farz edilir. Bu bellek'in 7FH'dan üstüne, direk adresleme ve indirek adresleme yöntemleri ile iki farklı bellek alanına erişilir. Kuramsal olarak kabul edilen bu bellek alanından fiziksel olarak 256 Byte' ından faydalanılır. 80H ile FFH adresleri arasındaki bellek alanı SFR, 00H ile 7FH adresleri arasındaki bellek alanı ise Dahili Kullanılabilir RAM olarak adlandırılır.

    Dahili RAM' n 128 Byte' lık alt kısmına direk ve indirek adresleme ile ulaşılabilir. Dahili RAM 4 Register Bankı (yığını) (Bank0'dan Bank3'e) ve bu bankların her biri 8 registerden oluşan kullanışlı bir bellek alanıdır. Bu bankların seçimi SFR içindeki PSW (Program Status Word)'deki RS0 veRS1 (Register Selection bits) bitlerinin durumuna göre belirlenir.

    SFR kısmına ise sadece direk adresleme ile ulaşılabilir. Dahili RAM' ın 128 Byte' lık üst kısmında, komut takımı komutları ile, 128 Byte direk olarak adreslenebilir. SFR ; port adresleri, timer , status ve kontrol bitlerini, akümülatör , stack pointer vs gibi kaydedicileri (register) içerir. Buradaki register' lara yukarıda da değinildiği gibi yalnız direk adresleme ile erişilebilir. SFR' nin içindeki 60 adres alanı hem byte hem de bit bit adreslenebilir. Bitleri adreslenebilen SFR alanlarının adreslerinin sonu 0H ya da 8H değerindedir.

    Tüm bunların yanı sıra 8051 MCU' da;

    • 2 adet 16 bitlik timer/event (zaman/olay) sayıcı
    • Full dublex seri giriş/çıkış ara yüzü
    • Boolean işlemler yapabilme
    • Entegre üzerinde dahili osilatör
    • İki öncelikli bölüm ile 5 interrupt kaynağı yapısı
    • Çarpma,bölme,çıkarma ve karşılaştırma emirleri
    • 3.5MHz-15MHz arası saat frekansı
    • 128 Byte stack genişliği özellikleri de vardır.


    8051 CPU' nun bacak bağlantı yapısı şekil-2-6' da verilmiştir. Burada bulunan 4 port' un da ortak özellikleri çıkışlarının latch' lanmış , iki yönlü dahili pull-up' lıdır. Yani bir sonraki bilgi gelene kadar önceki bilgiyi portta tutar.













    Şekil- 2-6 8051 Mikrokontrolör Bacak Bağlantıları



    RST bacağı yüksekte iken ve osilatör çalışıyorken iki makine periyodu için CPU resetlenir. Sistem çalışıyorken RST pini 0V potansiyelinde ve reset anında +5V potansiyelinde olması gerekmektedir. Eğer sürekli olarak +5V seviyesinde ise CPU sürekli resetleniyor ve herhangi bir program icra edemiyor demektir.
    RxD ve TxD pinleri seri iletişim için data alma ve data gönderme işlevini yerine getirir.
    Şekil 2.6. 8051 Bacak Yapısı

    INT0 veINT1 pinleri harici interrupt giriş uçlarıdır.
    T0 ve T1 pinleri zamanlayıcı harici giriş uçlarıdır.



    Şekil-2-7 Portların Giriş/Çıkış Durum Özellikleri





    Şekil-2-8 İki yönlü Çıkış Yapısı





    Şekil-2-9 Open-Drain Çıkış Yapısı




    Şekil-2-10. Push-Pull Çıkış Yapısı


    XTALL1 veXTALL2 pinleri ise CPU' nun dahili osilatörüne bağlı bacaklardır. Hem harici uygun frekanslı kristal bağlayarak hem de harici osilatör kullanarak CPU çalıştırılabilir.



    Şekil-2-11 Saat İşaretinin Üretilmesi İçin Kristal veya Harici Saat Kullanımı

    Sistemin resetlenmesini sağlamak için şekil-2-12'deki devre (Power-ON Reset) kullanılabilir. Devreye bağlanan R ve C'nin değeri değiştirilerek reset süresi değiştirilebilir. Kurduğum devrede R=8.2K ve C=10nF'dır.



    Şekil-2-12. Power-ON Reset Devresi



    2.1. 8051 Komut Kümesi

    8051 komut kümesi üçe ayrılır. Bunlar ; veri transfer komutları , veri işleme komutları ev program akışı kontrol komutlarıdır.


    Gösterim İşlem Adresleme modları
    Dir Ind Reg Imm
    MOV A ,<src> A = <src> * * * *
    MOV <dest>, A <dest> =A * * *
    MOV <dest> ,<src> <dest>=<src> * * * *
    MOV DPTR, #data16 DPTR =16-bit ivedi sabit *
    PUSH <src> INC SP : MOV @SP , <src> *
    POP <dest> MOV<dest> , @SP : DEC SP *
    XCH A , <byte> ACC  <byte> * * *
    XCHD A ,@Ri ACC  @Ri (Düşük 4-bit) *

    Tablo-2-1 ahili Veri Hafıza Alanına Veri Transfer Komutları


    Adres genişliği Gösterim İşlem
    8- bit MOVX A, @Ri Harici RAM @Ri ‘ yi oku
    8- bit MOVX @Ri, A Harici RAM @Ri ‘ yi yaz
    16- bit MOVX A, @DPTR Harici RAM @DPTR‘ yi oku
    16- bit MOVX @DPTR ,A Harici RAM @DPTR‘ a yaz

    Tablo-2-2 :Harici Veri Hafıza Alanına Erişen Veri Transfer Komutları





    Gösterim İşlem
    MOVC A, @A+DPTR Prog. Hafıza @(A+DPTR)Hücresini Oku
    MOVC A, @A+ PC Prog. Hafıza @ (A+PC ) Hücresini Oku

    Tablo-2-3 : Tablo Okuma Komutları


    Gösterim İşlem Adresleme modları
    Dir Ind Reg Imm
    ADD A , <byte> A =A +<byte> * * * *
    ADDC A ,<byte> A =A +<byte> +C * * * *
    SUBB A ,<byte> A =A -<byte>- C * * * *
    INC A A =A +1 Sak. Özel (sadece ACC)
    INC <byte> <byte> =<byte>+1 * * *
    INC DPTR DPTR =DPTR +1 Sak. Özel (sadece DPTR)
    DEC A A=A-1 Sak. Özel (sadece ACC)
    DEC <byte>=<byte> -1 * * *
    MUL AB B:A =BxA Sak. Özel (sadece ACC ve B)
    DIV AB A =Int (A/B)
    B= Mod (A/B) Sak. Özel (sadece ACC ve B)
    Sak. Özel (sadece ACC)
    DIV A Ondalık Ayar

    Tablo-2-4: Aritmetik Komutlar

    Gösterim İşlem Adresleme modları
    Dir Ind Reg Imm
    ANL A,<byte> A = A AND<byte> * * * *
    ANL <byte> ,A <byte> = <byte> AND A *
    ANL <byte>, #data <byte> = <byte> AND #data *
    ORL A, <byte> A=A OR <byte> * * * *
    ORL <byte>, A <byte> = <byte> OR A *
    ORL <byte>, #data <byte> = <byte> OR #data *
    XRL A, <byte> A= A XOR <byte> * * * *
    XRL <byte>, A <byte> = <byte> XOR A *
    XRL <byte>, #data <byte> = <byte> XOR #data *
    CLR A A =00H Sak. Özel (ACC)
    CPL A A=NOT A Sak. Özel (ACC)
    RL A ACC’ yi bir –bit sola döndür. Sak. Özel (ACC)
    RLC A Sola CY üzerinden. Sak. Özel (ACC)
    RR A ACC’ yi bir-bit sağa döndür: Sak. Özel (ACC)
    RRC A Sağa CY üzerinden döndür. Sak. Özel (ACC)
    SWAP A ACC’ deki iki 4 –bit ‘i değiştir. Sak. Özel (ACC)

    Tablo-2-5 :Byte Tabanlı Lojik Komutlar








    Gösterim İşlem
    ANL C, bit C bayrağını adreslenen bit ile AND ‘le
    ANL C, /bit C bayrağını adreslenen bit in tersi ile AND‘ le
    ORL C, bit C bayrağını adreslenen bir ile OR‘ la
    ORL C, /bit C bayrağını temizle
    CLR C Adreslenen bit ’i temizle
    CLR bit C bayrağını tersle
    CPL bit Adreslenen bit’ i tersle
    SETB C C bayrağını 1 ‘le
    SETB bit Adreslenen bit’ i 1’ le


    Tablo-2-6 : Bit Tabanlı Lojik Komutlar


    Gösterim Açıklama
    SJMP <rel data> (Short Jump –Kısa dallanma )operand 2-nin tümleyeni tek bir byte olup değeri PC’ ye eklenir. Bir sonraki komut, 127 byte ileri veya 128 byte gerideki bir komut olacaktır.
    AJMP <Address 11> (Absolute Jump- Mutlak Dallanma) Operand 11- bit bir adres olup Program Hafızanın o anki 2 Kbyte’ lık alanı içine karşı gelir.
    LJMP<Address 16> (Long Jump – Uzun Dallanma) Operand 16- bit bir adres olup Program Hafızanın 64 Kbyte‘ lik alanı içinde bir yere karşı gelir.
    LJMP @ A + DPTR (Long Jump – Uzun Dallanma) Yürütülecek bir sonraki komutun adresi ,ACC ile DPTR ‘ın toplamıdır.


    Tablo-2-7 : Durumdan Bağımsız Dallanma Komutları






    Gösterim Açıklama
    ACALL<address 11>
    (Absolute Call) PC yığın hafızaya atılır ,11-bit adres PC’ye yerleştirilir.11-bit adres ile ,Program Hafızada 2K byte’ lık bir alan içinde dallanma gerçekleşir.
    LCALL<address 16>
    (Long Call) PC yığın hafızaya atılır ,16-bit adres PC’ye yerleştirilir.16-bit adres ile ,Program Hafızada 64K byte’ lık bir alan içinde dallanma gerçekleşir.
    RET
    (Return) Yığından ,PC olarak alınacak değer okunur.
    RETI
    (Return from Interrupt) Yığından PC olarak alınacak değer okunur ve kesme donanımı sıfırlanır.

    Tablo-2-8 : CALL ev RET komutları


    Gösterim Açıklama
    JZ<rel add>
    (jump if ACC zero) Eğer ACC sıfır ise , 2’ nin tümleyeni olan byte operand PC’ye eklenir.
    JNZ<rel add>
    (jump if ACC Notzero) Eğer ACC sıfır değil ise , 2’ nin tümleyeni olan byte operand PC’ye eklenir.
    JC<rel add>
    (jump if carry is set) Eğer elde bayrağı 1 ise , 2’ nin tümleyeni olan byte operand PC’ye eklenir.
    JNC<rel add>
    (Jump if Carry not set) Eğer elde bayrağı 1değil ise , 2’ nin tümleyeni olan byte operand PC’ye eklenir.
    JB<bit>, < rel add>
    (jump if Bit set) Eğer ilk operand (adreslenen bit) 1 ise , 2’ nin tümleyeni olan ikinci byte operand PC’ye eklenir.
    JNB <bit>, < rel add>
    (jump if Bit not set) Eğer ilk operand (adreslenen bit) 1 değil ise , 2’ nin tümleyeni olan ikinci byte operand PC’ye eklenir.
    JBC <bit>, < rel add>
    (jump if Bit set and Clear bit) Eğer ilk operand (adreslenen bit) 1 ise , 2’ nin tümleyeni olan ikinci byte operand PC’ye eklenir. Komuttan sonra bit temizlenir.
    CJNE A, direct, <rel add>
    (Compare and Jump if not equal) Birinci operand ACC ; ikinci bir dahili saklayıcı ; ve üçüncü , göreceli adres. Eğer ACC ‘nin içeriği saklayıcıdan farklı ise, 2’ nin tümleyeni olan üçüncü byte operand PC ‘ye eklenir.
    CJNE A, # data , <rel add>
    (Compare and Jump if not equal) Birinci operand ACC ; ikinci, bir sabit ; ve üçüncü , göreceli adres. Eğer ACC ‘nin içeriği sabitden farklı ise, 2’ nin tümleyeni olan üçüncü byte operand PC ‘ye eklenir.
    CJNE Rn, # data ,< rel data>
    (Compare and Jump if not equal) Birinci operand Rn ;ikinci operand ,bir sabit; ve üçüncü göreceli adres. Eğer Rn’ nin içeriği sabitten farklı ise 2‘ nin tümleyeni olan üçüncü byte operand PC’ye eklenir.
    CJNE @Ri ,# data, < rel add >
    (Compare and Jump if not equal) Birinci operand Ri ile işaretli byte; ikinci ,bir sabit ; ve üçüncü göreceli adres. Eğer @Ri’ nin içeriği sabitten farklı ise 2‘ nin tümleyeni olan üçüncü byte operand PC’ye eklenir.
    DJNZ Rn, <rel add>
    (Decrement and Jump if not Zero) Birinci operand Rn ;ikinic ,göreceli adres. Eğer azaltılan Rn içeriği sıfırdan farklı ise, 2’nin tümleyeni olan üçüncü byte operand PC’ ye eklenir.
    DJNZ direct ,< rel add>
    (Decrement and Jump if not Zero) Birinci operand bir dahili saklayıcı; ikinci göreceli adres. Eğer azaltılan saklayıcının içeriği sıfırdan farklı ise , 2‘ nin tümleyeni olan üçüncü byte operand PC’ye eklenir.


    Tablo2-9 : Duruma Bağımlı Dallanma Komutları







    Gösterim Açıklama
    ACALL<address 11>
    (Absolute Call) PC yığın hafızaya atılır ,11-bit adres PC’ye yerleştirilir.11-bit adres ile ,Program Hafızada 2K byte’ lık bir alan içinde dallanma gerçekleşir.
    LCALL<address 16>
    (Long Call) PC yığın hafızaya atılır ,16-bit adres PC’ye yerleştirilir.16-bit adres ile ,Program Hafızada 64K byte’ lık bir alan içinde dallanma gerçekleşir.
    RET
    (Return) Yığından ,PC olarak alınacak değer okunur.
    RETI
    (Return from Interrupt) Yığından PC olarak alınacak değer okunur ve kesme donanımı sıfırlanır.

    Tablo2-10 : CALL ve RET komutları


    2.1.1. Adresleme Modlarındaki Gösterim :

    Adresleme modlarında kullanılan gösterim aşağıda verilmektedir :


    Rn : Aktif saklayıcı kümesindeki 8 saklayıcıdan biri.

    ACC : Akümülatör

    PC : Program Counter

    direct : Dahili RAM bölgesinden, bit-adreslenebilir hafıza ve SFR’ lar dahil alana erişen 8-bit adres.

    @Ri : Saklayıcı-dolaylı adresleme modunu gösterir. Aktif saklayıcı kümesinden sadece R0 ve R1 bu modda kullanılabilir. Ri dahili RAM bölgesinden , bit-adreslenebilir hafıza ve SFR’ lar dahil , 8-bit bir adres içerir.

    # data : İvedi adreslemede kullanılan 8-bit bir sabit ,yani komutun içindeki veri.

    addr16 : 64 K program Hafıza içinde herhangi bir yere işaret eden iki byte adres.

    addr11 : Program Hafızada 2K’lık blok içinde, herhangi bir yere işaret eden 11-bit adres.

    rel :Göreceli dallanmada kullanılan ,ikinin tümleyeni ofset adres. Bu adres ile program akışı , PC yi takip eden öndeki –128 byte ve sonraki 127 byte‘ lık bir alan içinde, dallanabilir.

    bit : Bit adreslenebilir RAM veya SFR’ ın 8-bit adresi.

    reg : Saklayıcı adresleme modu.

    dir : Doğrudan (direct ) adresleme.

    ind : Saklayıcı-dolaylı( register-indirect) adresleme modu.

    imm : İvedi (immediate) adresleme modu.
    2.2.1. 8051 Interrupt Yapısı

    ROM' suz ve EPROM' lu versiyonlarda CPU' lar 5 interrupt kaynağına sahiptir. Bunlar; 2 harici interrupt, 2 timer interrupt ve seri port interrupt' ıdır.

    İnterrupt yetkileri: Interrupt kaynakları SFR içindeki IE registerinin bitleri set/reset (1/0) yapılarak yetkili veya yetkisiz kılınabilir.

    EA - - ES ET1 EX1 ET0 EX0
    msb lsb
    INTERRUPT ENABLE (IE) REGISTER

    EA : Tüm interrupt' ları yetkisizleştirebilir. Eğer EA=0 ise interrupt' lar yetkisizdir ve EA=1 ise diğer interrupt bitleri set/reset' lenerek interrupt' lar yetkili/yetkisiz yapılabilir.
    ES : Seri port interrupt yetki biti
    ET1 : Timer1 taşma interrupt yetki biti
    EX1 : INT1 bacağından gelen interrupt yetki biti
    ET0 : Timer0 taşma interrupt yetki biti
    EX0 : INT0 bacağından gelen interrupt yetki biti

    Interrupt Öncelikleri: Interrupt öncelikleri SFR içindeki IP registerinin programlanması ile belirlenebilir.

    - - - PS PT1 PX1 PT0 PX0
    msb lsb
    INTERRUPT PRIORITY (IP) REGISTER

    PS : Seri port interrupt' ı öncelik kontrol biti. 0 ise düşük ,1 ise yüksek öncelikli.
    PT1 : Timer1 Int. öncelik kontrol biti
    PX1 : INT1 bacağı Int. öncelik kontrol biti
    PT0 : Timer0 Int. öncelik kontrol biti
    PX0 : INT0 bacağı Int. öncelik kontrol biti

    Eğer farklı önceliklere sahip iki interrupt isteği eşzamanlı alındığında istek yüksek öncelikliye servis verilecektir. Eğer öncelikleri yazılımla tanımamışsak CPU kendi belirlediği interrupt öncelik sırasına göre hizmet verir. Buna göre en yüksek öncelikliden en düşük öncelikliye göre sıralanmış interrupt kaynakları şöyledir;


    • IE0
    • TF0
    • IE1
    • TF1
    • RI ya da TI .


    İnterrupt yetki bayrakları setlenmiş interrupt alındığında LCALL emiri ile belirtilen adrese atlanılır ve gerekli servis programı çalıştırılır. LCALL emirinden önce programın kesildiği yeri belirten PC (Program Counter)'nin içeriği otomatik olarak stack' e itilir ve işlem bitirildikten sonra tekrar otomatik olarak yüklenir. Eğer istenilen register' ların stack bellek' e itilmesi isteniyorsa bu işlem programcı tarafından yapılmalıdır. Örneğin ;

    PUSH IE
    MOV IE,#MASK
    CALL LABEL
    -------------------------
    POP IE
    RET
    LABEL:
    RETI

    gibi...


    2.2.2. Zamanlayıcı ve Sayıcı Yapısı (Timer / Counters)

    8051 iki 16 bitlik Timers/Counters registeri içerir. Bunlar Timer0 ve Timer1'dir.Her ikisi de zamanlayıcı ya da olay sayıcı olarak konfigüre edilebilir.
    Timer (Zamanlayıcı) işlevinde , register her makine saykılın da bir arttırılır. Bir makine saykılı ise 12 osilatör periyoduna eşittir. Böylece sayma hızı (count rate) 1/12 osilatör frekansına eşitlenir.
    Counter (Olay sayıcı) işlevinde ise register harici giriş bacağı yerini tutan T0 veT1'deki her 1'den 0'a geçişte bir arttırılır.

    Timer0 ve Timer1 dört işlem moduna sahiptir. Zamanlayıcı ya da 'Olay sayıcı' işlevlerinin seçimi SFR' deki TMOD register' inin içindeki C/T kontrol biti ile sağlanır. Her iki zamanlayıcı TMOD içindeki M1-M0 bit çiftlerinin sayesinde dört işlem moduna sahip olur

    GATE C/T M1 M0 GATE C/T M1 M0
    msb lsb
    TIMER-1 TIMER-0

    TIMER/COUNTER MODE CONTROL (TMOD) REGISTER

    GATE: Kapı Kontrol Setlendiği zaman sadece INTX bacağı yüksek ve TRX kontrol biti 1 ise yetkili olur. Sıfırlandığı zaman, TRX kontrol biti 1 olduğunda Timer/Counter yetkilidir.

    C/T: Zamanlayıcı veya Sayıcı seçici Zamanlama işlevinde resetlenir Sayma işlevinde setlenir.





    M1 M0 İşlem Modu
    0 0 (Mode 0) MCS-48 ile aynı zamanlayıcı özelliğinde TLX 5 bitlik ön ölçeklendirici gibi servis verir.

    0 1 (Mode 1) 16 bit zamanlayıcı. TLX ve THX kaskat bağlıdır. Ön ölçeklendirici yoktur.

    1 0 (Mode 2) 8 bitlik otomatik yeniden yüklemeli Timer/Counter.

    1 1 (Mode 3) TL0 , standart Timer0 kontrol bitlerinin kontrol ettiği bir
    Timer/ Counter. TH0 , Timer1 kontrol bitlerinin kontrol ettiği 8 bitlik bir zamanlayıcıdır.

    1 1 Timer1 Timer/Counter durdurulmuştur.


    Mode-0 : Mode 0 'da 8051 timer aynen 8048 Timer' ın yerine konulabilir yani aynı özellikler gösterir. 8 bitlik sayıcı ve 5 bitlik ön ölçeklendirici.

    Bu modda zamanlama registeri 13 bit'e ayarlanabilir. 1'den 0'a geçişler sayılır ve Timer interrupt bayrağı olan TF1 setlenir. TR1=1 ve GATE=0 ya da INT1=1 gerçeklenirse sayılmış giriş yetkilidir. TR1 kontrol biti SFR' deki TCON 'da bulunur. GATE ise TMOD 'da bulunur.

    Mode-1: Mode 0 ile aynıdır,tek farkı Timer registerinin 16 bit olmasıdır.

    Mode-2: Timer register 8 bitlik Counter (TL1) ile otomatik yeniden yüklemeli olarak konfigüre edilebilir. TL1 'in yeniden yükleme değeri TH1'de saklanır. Yazılım ile presetlenebilir. TH1'in yeniden yükleme değeri değiştirilemez.

    Mode-3: Timer1 sayılacak değeri tutar. Etkin olabilmesi için TR1=0 'a setlenmelidir. Mode 3'de Timer0'ın TL0 ve TH0 iki ayrı sayıcı olarak atanır. Mode 3 bazı uygulamalar için gereken ekstra 8 bitlik Counter üzerindeki zamanlayıcı sağlar. Mode 3'de Timer 0 ile 8051 üç adet Timers/Counters' a sahip gibi görünür. Mode 3'de Timer/Counter, Seri port için Baud Rate üreteci gibi kullanılabilir ve interrupt istekleri oluşturmakta faydalana bilinir.


    TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
    msb lsb
    TIMER/COUNTER CONTROL (TCON) REGISTER

    TF1/TF0: Timer 1/0 taşma bayrağı. Timer/Counter' da taşma olduğunda donanımla setlenir ve interrupt işlendiğinde resetlenir.
    TR1/TR0: Timer 1/0 koşma kontrol biti. Yazılım ile set/reset'lenir.
    IE1/IE0: Interrupt 1/0 üstünlük bayrağı. Harici interrupt üstünlüğü belirtildiğinde setlenir ve interrupt işleminde resetlenir.
    IT1/IT0: Interrupt 1/0 tipi kontrol biti. Yazılım ile set/reset'lenir.




    2.2.3. Güç Kontrolu (Power Control)

    8051'de güç harcamasını minimuma indirebilmek için iki yazılım seçim modu vardır. Bunlar; Idle ve Power Down Modlarıdır. CPU Idle modda iken dahili RAM, zamanlayıcı, seri port ve interrupt sistem fonsiyonlarının işlemesine izin verir. Power Down modunda iken sadece dahili RAM değerleri korunur ve diğer bütün fonksiyonlar işlevsizdir. Bu özel modlar yazılım yolu ile aktif hale geçerler. Aktif hale geçirmek için gerekli register SFR' deki PCON
    registeridir

    SMOD - - - GF1 GF0 PD IDL
    msb lsb

    PCON(POWER CONTROL REGİSTER)

    SMOD : Çift veri iletim hızı (baud) oranı biti. Eğer setlenirse veri iletim hızı iki katına çıkar. Bu halde iken seri port varolan diğer modları kullanır.
    GF1 : Genel amaçlı bayrak biti.
    GF0 : Genel amaçlı bayrak biti.
    PD : Power Down biti. Bu bit setlenirse Power Down moduna girilir.
    IDL : Idle mode biti. Setlenirse Idle moduna girilir.

    Bazen aynı anda hem PD hem de IDL bitleri setlenmeye çalışılabilir. Bu durumda üstünlük PD' ye verilmiş olduğundan Power Down moduna girilir. PCON Registerinin reset değeri (0***0000)'dır.

    2.2.3.1. IDLE Modu

    CPU , Idle modunda iken , Stack Pointer(SP), Program Counter (PC), Program Status Word(PSW), Akümülatör , Dahili RAM ve bütün diğer registerlerin değerleri korunur. Idle modu, donanım ile geçerli bazı interruptlar sayesinde PCON.0'ın resetlenmesi ile sona erdirilebilir. Bu modu sona erdirmenin diğer bir yolu ise donanım reseti vermektir. Önce osilatör koşturulur ve donanım resetinin aktif olabilmesi için yalnızca 2 makine saykılı (24 Osc. Periyodu) ile karşılaşılınca reset işlemi tamamlanacaktır.


    2.2.3.2. POWER DOWN Modu

    PCON.1 bitinin setlenmesi ile aktif olur. Power Down' da osilatör durdurulur. Çipin üzerindeki RAM' ın ve SFR' nin içeriği bu modda korunur. Bu moddan çıkmanın tek yolu donanım reseti vermektir ama donanım reseti vermek SFR yeniden tanımlanmasına rağmen dahili RAM' ın içeriği değiştirilemez. Power Down modu ile devrede en küçük güç harcaması gerçekleşir ve Vcc gerilimi yaklaşık 2V seviyesini kadar indirilebilir. Ama Power Down moduna girilene kadar Vcc geriliminin düşürülmemesi gerekir. Power Down moduna girildikten en az 10msn sonra Vcc erilimi 2V'a çekilebilir.

    2.2.4. 8051 Mikrokontrolörlerde İletişim

    Data bir noktadan diğer bir noktaya iletilirken ya seri ya da paralel formatta düzenlenir. Her ikisinin de birbirine göre avantaj ve dezavantajlı olduğu yönler bulunmaktadır. Paralel data transferi genelde belirli sürede çok miktarda data transferinin gerektiği yerlerde kullanılır.(PC ile Printer arasındaki gibi) . Seri data iletim metotlarında yüksek data transfer hızlarına erişilebilir fakat paralel data transferine göre en önemli üstünlüğü datanın iletilebilmesi için gerekli iletken sayısının paralele göre daha az olmasıdır.


    2.2.4.1. Paralel Haberleşme

    Paralel data transferinde ,bir bilgisayarın mikroişlemcisi ile çevre birimler arasındaki data bus üzerindeki bilgilerin iletimi gibi datalar bu metodda paralel olarak iletilir. Paralel ve seri data transferinde bir karakterin iletimi 8 bit ile yapılıyorsa, paralel data iletimi seri iletime göre daha hızlı olacağı hiç şüphesizdir. Çünkü seri data iletiminde bir karakter iletmek için 8t süre harcanıyorsa (start,stop ve parity bitleri hariç) paralel data iletiminde t kadar bir sürede işlem gerçeklenmiş olacaktır(Buna diğer üç bitin eklenmediğine dikkat !). Paralel data iletiminde polling ve handshaking gibi kontrol işlemleri için de ayrı kabloların kullanılması maliyeti iyiden iyiye arttırmaktadır. Ayrıca uzak mesafelere iletimde sinyal zayıflamasını kompanze etmek için Repeater cihazının kullanılması ekonomikliği ortadan kaldırmaktadır. Böylece paralel data iletimi, bilgisayar sistemlerinin çevre birimlerle haberleşmesinde ve mesafenin kısa olması durumunda tercih edilebilir.


    2.2.4.2. Seri Haberleşme

    Uzak mesafelere dataların paralel iletimi için kablo ve diğer masrafların çok olmasından dolayı bu durumda daha çok seri data iletimi tercih edilir. Tek bir iletim kanalı üzerinden belirli bir zamanda bir bit iletilmesi seri data transferi olarak adlandırılabilir. Seri iletişim kendi arasında ikiye ayrılır. Şimdi de bunlar hakkında kısa ve öz bilgiler verelim;



    2.1.4.2.1. Seri-Senkron Haberleşme

    Senkron seri data iletiminde önemli bir konu iletim kanalının iki ucundaki alıcı ve verici düzeneklerin birbiriyle her zaman senkronize çalışması gerekmesidir. Senkronizasyon işlemi ikinci bir iletim hattı üzerinden ortak bir clock (saat) sinyalinin hem alıcıya hem de vericiye gönderilmesi ile elde edilebilir. İletim kanalının her iki ucunda zamanlamayı sağlamak, senkronizasyonu elde etmek için her zaman bir ana saat sinyali kullanılır. Senkron seri data iletimi veri bloklarının hazır olduğu durumlarda kullanılır. Örneğin ; Harddisk' teki bilgilerin karşı tarafa gönderilmesinde. Senkron iletişim asenkron iletişime göre daha karmaşıktır. Bunun ana nedeni alıcı ünitede Byte Eşzamanlısının yapılmasının gerekmesindendir.

    2.2.4.2.2. Seri Asenkron Haberleşme

    Asenkron seri data iletimi, veri iletişiminde kullanılan en basit ve en kolay yöntemdir. Verimliliği düşük olduğu için düşük hızlardaki veri iletiminde daha çok kullanılır. Transmitter' den gönderilen her bir karakter 8 bit ile temsil edilir ve iletim sırasında veri karakterlerinin başına start biti (lojik - 0) ve sonuna parity (hata denetimi amacıyla) ile stop bitleri eklenir.

    Her bir data dizisinin ilk biti start bitidir , lojik-1'den lojik-0'a geçişle belirtilir ve bu start biti bir bit süresince lojik-0'da kalır. Ardından data bitleri gelir ve data biti sayısı 5..8 bit arası seçilebilir. Hemen ardından hata denetimi biti ve stop biti gelir. Stop biti 1,1.5 ve 2 bit sürelerinde seçilir ve bu süre boyunca lojik-1'de kalır. Hat boş iken aradaki hat sürekli lojik-1 seviyesinde tutulur. Bunun nedeni tabi ki hattaki gürültülerden etkilenmemek içindir.

    PC kullanıcıları data iletimi yapmak için bir RS-232 seri port' a ihtiyaç duyarlar. Bu konnektör için bacak numaraları ve sinyal adları aşağıdaki tabloda verilmiştir.





























    BACAK NO ORTAK İSİM RS232C İSMİ TANIM
    1 AA Koruma toprağı
    2 TxD BA Gönderilen data
    3 RxD BB Alınan data
    4 RTS CA Gönderme için istek
    5 CTS CB Gönderme için serbest
    6 DSR CC Veri kümesi hazır
    7 GND AB Sinyal toprağı
    8 CD CF Alınan hat sinyal algılayıcı
    9
    10 Veri kümesi testi için ayrılmış
    11 Tanımlanmamış
    12 SCF İkincil alınan hat sinyali algılayıcı
    13 SCB İkincil gönderme serbest
    14 SBA İkincil gönderme veri
    15 DB İletim sinyal elemanı zayıflaması (DCE)
    16 SBB İkincil alınan veri
    17 DD Alıcı sinyal elemanı zayıflaması (DC)
    18 Tanımlanmamış
    19 SCA İkincil gönd.içn istek
    20 DTR CD Veri terminali hazır
    21 CG Sinyal kalitesi algılayıcı
    22 CE Halka gösterge
    23 CH/CI Veri sinyali hızı seçici(DTE/ DCE)
    24 DA İletken sinyal elemanı zayıflaması
    25 Tanımlanmamış

    Tablo-2-11- RS-232 Bacak Bağlantıları Tablosu



    2.2.4.3. Standart Seri Arabirim

    8051'deki seri portumuz Full -Dublex' tir. Yani hem alıcı hem de verici eşzamanlı olarak gerçeklenebilir. Seri portun alıcı ve verici (receiver - transmitter ) registerlerı SFR 'de SBUF adı ile bulunmaktadır. Gönderilecek bilgiler SBUF' a yazılır, alınacak bilgiler ise SBUF' dan okunur. Seri portun dört işlem modu vardır;

    Mode-0 : Seri data giriş ve çıkışı RxD üzerindendir. TxD çıkışı saat için kullanılır. Bu uç kaydırmalı-kaydedicileri (Shift -Register) uyarmak için kullanılabilir. 8 bit alınır/gönderilir. Mutlaka TTL veya CMOS kaydırmalı-kaydedicilerle senkronize I/O biçiminde kullanılmalıdır. Bu modun Baud Rate değeri 1/12 osilatör frekansına eşittir. Sistem seri ise bu modda hız, eğer osilatör 12MHz ise baud rate 1Mbit/sn gibi UART'nin çok üstünde bir değer olabilmektedir. Ayrıca paralel sistemlerde Shift -Register' den önce sadece iki hatta (RxD ve TxD) ihtiyaç duyması avantajdır.

    Mode-1 : 10 bit RxD ucundan ya da 10 bit TxD ucundan alınır/gönderilir. Bir adet başlama (start) biti,8 data biti ve birde durdurma (stop) biti bulunur. Alıcı durumda , durdurma biti SCON' daki RB8 bitinin içeriğine gider. Baud Rate değeri değişkendir.

    Mode-2 : 11 bit RxD ucundan ya da 11 bit TxD ucundan alınır/gönderilir. Bir start biti, 8 data biti, bir adet programlanabilir 9. data biti ve bir stop biti bu modda bulunur. Gönderici durumda 9. data biti SCON registerindeki TB8 bitinin içeriğine gider. Ya da örneğin, PSW 'nin içindeki P (parity bit),TB8 'in üzerine taşınabilir. Alıcı durumda 9.data biti SCON üzerindeki RB8 değerine gider (eğer stop bitine önem verilmezse).Baud Rate değeri osilatör frekansının 1/32 veya 1/64 'ü olarak programlanabilir.

    Mode-3 : 11 bit RxD üzerinden veya 11 bit TxD üzerinden alınır/gönderilir. Bir start biti, 8 data biti, bir programlanabilir 9. data biti ve bir adet stop biti bulunur. Gerçekte Mode-3 ile Mode-2 arasındaki fark, Mode-3'ün istisnai Baud Rate değerlerine ayarlanabilmesidir. Yani Baud Rate değeri değişkendir.

    Tüm bu dört modda iletişim bazı komutların SBUF gibi tanımlama registerlerini kullanması ile sağlanır.

    SCON registerinin içeriği yalnız mod seçmek için gerekli bitleri içermeyip ,alıcı ve verici için 9.biti (TB8 ve RB8) ve seri port interrupt bitleri olan RI ve TI 'yı da içerir.




    SM0 SM1 SM2 REN TB8 RB8 TI RI
    msb lsb
    SERİ PORT KONTROL (SCON) REGİSTER





    SM0 SM1 mode Baud Rate
    0 0 0 Fosc/12
    0 1 1 Değişken
    1 0 2 Fosc/32 yada Fosc/64
    1 1 3 Değişken


    SM0, SM1, SM2 : Seri port modu kontrol biti. Yazılımla set / resetlenir.

    REN : Alma yetkili kontrol biti. Seri data alma yetkili/yetkisiz yapmak için yazılımla set / resetlenir.

    TB8 : 9. data bitinin (mode-2 ve 3'e göre) gönderilip gönderilmeyeceğini belirlemek için kullanılan yazılım ile set/resetlenebilen bitdir.

    RB8 : 9. data bitinin alınıp alınmayacağını belirlemek için kullanılan yazılım ile set/resetlenebilen bitdir.

    TI : Gönderme interrupt bayrağı. Byte gönderildiğinde donanım tarafından setlenir. İşlem tamamlandığında yazılım ile resetlenmelidir.

    RI : Alma interrupt bayrağı. Byte alındığında donanım tarafından setlenir. İşlem tamamlandıktan sonra yazılım ile resetlenmelidir.


    2.2.4.4. Çokişlemcili Haberleşme (Multiprocessor Communications)

    Çokişlemcili Haberleşmede Mode-2 ve Mode-3 çok özel durumlara sahiptir. Bu modlarda 9.data biti kullanılabilir. Data alınırken 9.bit RB8'e yazılır ve arkasından stop biti gelir. Stop biti alındığında port programlanabilir böylece seri port interrupt' ı yalnız RB8=1 iken aktif olur. Bu özellik SCON üzerindeki SM2 bitinin setlenmesi ile geçerlidir. Bu özelliğin Çokişlemcili Haberleşme sistemlerinde kullanımı şu şekilde olabilir;

    Birincil(Master) işlemci bir ya da birkaç İkincil(Slave) işlemciye data bloklarını göndermek isterken ,ilk olarak hedef slave işlemciyi tanımlayan adres byte' larını yollar. Burada adres byte' ı ile data byte' larının farkını 9.bit belirler. 9.bit 1 ise adres byte' ı , 0 ise data byte' ıdır. SM2=1 yapmak ile , data byte' ı ile slave işlemci interruptlanmayacaktır. Adres byte' ında tüm slave işlemciler interruptlanacaktır. Bu yüzden slave işlemciler eğer belirtilen adresin kendi başlangıç adresleri (kendilerine ayrılan adres ise) olup olmadığını aldıkları adres byte' ını inceleyerek anlayabilirler. Adreslenmiş olan slave işlemci kendi SM2 bitini temizleyecek ve gelecek olan data byte' larını almak için kendilerini hazırlayacaklardır. Yani slave işlemciler başlama adresi verildikten sonra bunun kendi adresleri olup olmadığını test edeceklerdir ve daha sonra gelecek dataları alarak işleyeceklerdir.

    SM2 (SCON.5) biti Mode-0 'da kullanım dışıdır ve Mode-1 'de stop bitinin sağlamlığını(doğruluğunu) test etmek için kullanılır. Mode-1 'de SM2=1 ise alınan interruptlar stop biti alınıncaya kadar aktif olmayacaktır.
    2.2.4.4.1. BAUD RATE Değerleri

    Mode-0 'da baud rate değeri (osilatör frekansı/12) 'dir. Mode-2 'de PCON registerindeki SMOD biti 1 ise baud rate 1/32 ve SMOD 0 ise 1/64 osilatör frekansına eşittir. Mode-1 ve Mode-3 'de baud rate timer-1'in taşma zamanı (overflow rate) ile karakterize edilebilir.

    Timer-1 'in Baud Rate Generatörü Olarak Kullanılması:

    Timer-1 'in baud rate generatörü olarak kullanılırken, baud rate değeri SMOD bitinin ve Timer-1 taşma değerine göre karakterize edilmiştir. Bu uygulamada Timer-1 interrupt' ı geçersiz kılınacaktır.

    Mode-1,3 BR= (2 (SMOD) /32)*(Timer-1 taşma zamanı)

    BR : Baud Rate

    Timer-1 bazı durumlarda otomatik yeniden yüklemeli (Auto Reload Mode) modda konfigüre edilebilir. Bu durumda baud rate değeri ise;

    Mode-1,3 BR=(2* (SMOD) /32)*(O_Freq /(12*[256-(TH1)]))
    ile verilebilir.Aşağıdaki tabloda Timer-1 ile çok kullanılan bazı baud rate değerlerinin elde edilmesi için gereken değerler verilmiştir.

    Baud Rate
    OSC_freq
    (MHz) SMOD C/T
    c=1,t=0 Mode Reload value
    Mode-0
    Max :1.67MHz 20 X X X X
    Mode-2
    Max : 625 kHz 20.00 1 X X X
    Mode-1,3
    Max : 104.2 kHz 20.00 1 0 2 FFh
    19.2k 11.059 1 0 2 FDh
    9.6k 11.059 0 0 2 FDh
    4.8k 11.059 0 0 2 FAh
    2.4k 11.059 0 0 2 F4h
    1.2k 11.059 0 0 2 E8h
    137.5 11.986 0 0 2 1Dh
    110 6.00 0 0 2 72h
    110 12.00 0 0 1 FEEBh

    { Timer-1 için }




    Özetlenecek olursa seri port timer-1'in taşması tarafından saatlenecektir. Timer-1'in girişinde osilatör frekansı 12'ye bölünür ya da harici saat uygulanır. Mode-0'da 12MHz'lik bir kristal ile 1Mbit/sn ve Mode-2'de ise gene 12Mhz'lik kristal ile 187.5kHz'lik baud rate değerlerine erişilebilir. Mode-1,3'de ise baud rate timer-1'e bağlıdır ve timer yeniden yükleme değeri ile istenen frekansa eşitlenebilir.

    Şimdi bu yeniden yükleme değerinin nasıl hesaplandığına dair bir örneğe bakalım. UART işlem hızının 300 bps ve osilatör frekansının 12Mhz olduğu durumdaki yeniden yükleme değerini hesaplayalım; (ARV:Auto Reload Value)

    ARV=(Clock rate)/(12*32*Bit rate) ; 104.16

    Eğer T1 üzerinden harici saat kullanılıyorsa;

    ARV=(Clock rate)/(32*Bit rate) ; olur.

    Yaklaşık tamsayı olarak 104 kabul edilir ve Timer için aktüel değer 256-104=152=98h ' dir. Eğer TH1 98h değeri ile yüklenirse doğru hız olan 300 bps alınır.

    Buna göre bizim kullanacağımız sistemde 9600 bps için ve kristalinde 12MHZ olduğu kabulu ile hesap yapılacak olursa;

    ARV=12M/(12*32*9600)=3.25 olur.
    Yaklaşık olarak 3 kabul edilir ve 256-3=253d=0FCh bulunur.


    2.2.5. PC Seri I/O Arayüz Cihazının Kontrolü ve Programlama Çalışmaları

    PC' lerde seri ara yüz I/O cihazı olarak 8250 entegresi kullanılmaktadır. PC' lerde genel olarak iki seri ve bir paralel portları vardır. Bu sayı genel kullanım için yeterlidir. Amaca göre istenildiğinde arttırılabilir. Sistemde bulunan seri port ,taban vektör ve adresleri tabloda verilmiştir.

    COM1 00000:00400H 03F8H
    COM2 00000:00402H 02F8H
    COM3 00000:00404H 0378H
    COM4 00000:00406H 0278H


    Bu portların kullanımı için bazı registerlerin bulunması ve bunların gerekli değerlere setlenmeleri gereklidir. Bu registerler ;






    1. Data Register
    2. Interrupt Enable Register
    3. Interrupt Identification Register
    4. Data Format Register
    5. Serial Control Register
    6. Serial Status Register
    7. Modem Status Register' dir.


    1.Data Register:

    Data register göndermek ve almak için 1 byte tutar. İçindeki bitler alınacak veya gönderilecek bitleri tutar.

    Data Bit7 Data Bit6 Data Bit5 Data Bit4 Data Bit3 Data Bit2 Data Bit1 Data Bit0
    msb lsb

    2.Interrupt Enable Register:

    Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

    Bit0:Veri geldiğinde interrupt üret.
    Bit1:Veri gönderme işlemi tamamlandığında interrupt üret.
    Bit2:Hat durum değişikliğinde interrupt üret.
    Bit3:Modem hattı değişikliğinde interrupt üret.
    Bit4-7:Kullanılmaz.

    3.Interrupt Identification Register:

    Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

    Bit0:Interrupt bekliyor.
    Bit1-2: 00:Modem hattında değişiklik oldu.
    01:Gönderme tamamlandı.
    10:Veri geldi.
    11:Hattın durumunda değişiklik oldu.
    Bit3-7:Kullanılmaz.


    4.Data Format Register:

    Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0



    Bit0-1:Veri uzunluğu: 00 5bit
    01 6bit
    10 7bit
    11 8bit

    Bit2urdurma biti sayısı: 0 1bit
    1 2bit

    Bit3:Parity var/yok: 0 OFF
    1 ON

    Bit4:Parity tek/çift: 0 Tek
    1 Çift
    Bit5 : Stick parity

    Bit6 : Set Break

    Bit7 : Bölücüye erişim biti: 0 Diğer kütükler
    1 Bölücü


    5.Serial Control Register:

    Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

    Bit0: Terminal iletişime hazır.
    Bit1: Gönderme isteği.
    Bit2: Out1
    Bit3: Out2
    Bit4: Geri beslemeli teste geç.
    Bit5-7:Kullanılmaz.


    6.Serial Status Register :


    Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0


    Bit0: Veri hazır.
    Bit1: Veri ezilmesi var.
    Bit2: Parity biti hatası var.
    Bit3: Zamanlama hatası.
    Bit4: Alıcı işlemi yarıda kesti.
    Bit5: Gönderme tamamlandı.
    Bit6: Kaydırma tamamlandı.
    Bit7 : Kullanılmaz.


    7.Modem Status Register:

    Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0


    Bit0: CTS değişti.
    Bit1: DSR değişti
    Bit2: RI kesildi.
    Bit3: RLSD kesildi.
    Bit4: CTS' nine sıfıra tümleyeni.
    Bit5: DSR' nine sıfıra tümleyeni.
    Bit6: RI' nın sıfıra tümleyeni.
    Bit7: RLSD' nin sıfıra tümleyeni.


    2.2.5.1. Program Communicatıons' un Açıklanması


    Procedure BaudRate Aktif: Data Format registerinin en anlamlı biti 1 yapılırsa , data register ile interrupt enable registeri baud rate değerinin belirlenmesinde kullanılabilir. Procedure' de data format registeri (2FB)' nin 8. Biti setlenmektedir.

    Procedure DataAktif : Data Format registerinin en anlamlı biti resetlenmektedir. Data ve Interrupt Enable registerleri asıl işlevlerinde kullanılmaya başlanır.

    Procedure DataHız Tanımı: BaudRate Aktif yapıldıktan sonra 2F8 ve 2F9 adreslerine verilen word baudrate değeri olarak yazılır.

    Procedure DataHız Tanımı: Baud rate değeri okunuyor.

    Procedure PortuSetle: Seçilen haberleşme portuna gerekli tanımlamalar yazıldı.

    Function InterruptDurumu: Interrupt ID registeri okunarak verinin geldiğini veya gönderildiğini belirler.

    Function PortuOku: Porttan gelen verinin okunmasını sağlar.

    Procedure PortaYaz : Porta bir byte' lık veriyi koyar. Gönderilecek karakter data registerine konulur.

    Function ByteToString: Byte olarak verilen veriyi string' e dönüştürür.

    Function StringToByte: String olarak verilen veriyi byte' a dönüştürür.

    Procedure SeriCom: PC' de 8051 işlemcisi için assembler program yazıp derlendikten sonra HEX uzantılı bir dosya oluşmaktadır. Bu HEX uzantılı dosya assembly emirlerin kodlarını ve adreslerini içermektedir. Dosyanın bir satırının formatı ;
    dataların_uzunluğu+adres+kayıt_tipi+datalar+kontrol_byte'ı, şeklindedir. Bu procedure ile ismi verilen HEX uzantılı dosyadan okunmakta ve seri porttan gönderilmektedir.





    Program Communications;
    uses
    dos,crt;
    {*************************************************************}

    const
    {baud rate tanımlamaları}
    br_9600 =$000C;

    {parity biti tanımlamaları}
    pr_none =$00;
    pr_odd =$08;
    pr_even =$18;

    {data uzunluk tanımlamaları}
    dl_6 =$01;
    dl_7 =$02;
    dl_8 =$03;

    {stop biti tanımlamaları}
    sb_1 =$00;
    sb_2 =$04;

    {seri port tanımlamaları}
    com1 =0;
    com2 =1;

    {8250 entegresi içerisindeki register tanımlamaları}
    data =0;
    interrupt_enable =1;
    interrupt_identification =2;
    data_format =3;
    seri_control =4;
    seri_status =5;
    modem_status =6;

    yetkilendir =128;

    {register için port adresleri}
    regs:array[0..1,0..6] of word=(($3f8,$3f9,$3fa,$3fb,$3fc,$3fd,$3fe),
    ($2f8,$2f9,$2fa,$2fb,$2fc,$2fd,$2fe));

    {interrupt_identification tanımlamaları}
    veri_geldi =4;
    veri_gonderme_tamamlandi =2;

    {Hexadecimal Rakamların Tanımlanması}
    Hexal:Array[1..16] of String[1]=('0','1','2','3','4','5','6','7',
    '8','9','A','B','C','D','E','F');


    var
    sayih,sayil:byte; {ByteToString Function'u için}
    hsayih,hsayil:string[1]; {StringToByte Function'u için}
    ch:char;


    {*************************************************************}
    {data_format registerinin en anlamlı biti 1 yapılıyor}
    procedure BaudRateAktif(pn:byte);
    var
    temp:byte;
    begin
    temp:=port[regs[pn,data_format]] or yetkilendir;
    port[regs[pn,data_format]]:=temp;
    end;

    {*************************************************************}
    {data_format registerinin en anlamlı biti 0 yapılyor}
    procedure DataAktif(pn:byte);
    var
    temp:byte;
    begin
    temp:=port[regs[pn,data_format]] and (not yetkilendir);
    port[regs[pn,data_format]]:=temp;
    end;

    {*************************************************************}
    {baud_rate değeri ilgili registere yerleştiriliyor}
    procedure DataHizAyari(pn:byte;speed:word);
    begin
    baudrateaktif(pn);
    port[regs[pn,data]]:=lo(speed);
    port[regs[pn,data+1]]:=hi(speed);
    end;

    {*************************************************************}
    {byte tipinde olan register word olarak tanımlanıyor}
    function DataHiziTanimi(pn:byte):word;
    begin
    baudrateaktif(pn);
    datahizitanimi:=portw[regs[pn,data]];
    end;

    {*************************************************************}
    {seçilen haberleşme portunun tanımlaması yapılıyor}
    procedure PortuSetle(pn:byte;speed:word;parity,datalen,stopbits:byte);
    var
    kontrolreg:byte;
    begin
    datahizayari(pn,speed);
    kontrolreg:=parity or stopbits or datalen;
    port[regs[pn,data_format]]:=kontrolreg;
    end;

    {*************************************************************}
    {veri geldiğinde ilgili registeri setler}
    function InterruptDurumu(pn:byte):byte;
    var
    b:byte;
    begin
    b:=port[regs[pn,interrupt_identification]];
    interruptdurumu:=b and (veri_gonderme_tamamlandi+veri_geldi);
    end;

    {*************************************************************}
    {port veri koruması için setleniyor veya okunuyor}
    function PortuOku(pn:byte):byte;
    begin
    dataaktif(pn);
    portuoku:=port[regs[pn,data]];
    end;

    {*************************************************************}
    {data registerine bir byte yazar}
    procedure PortaYaz(pn:byte;ch:byte);
    begin
    dataaktif(pn);
    port[regs[pn,data]]:=ch;
    end;
    {*************************************************************}

    Function ByteToString(Sayi:Byte):String;
    Var
    HexSayi:String[2];
    ie:Byte;
    Begin
    SayiH:=Trunc(Sayi/16);
    SayiL:=Trunc(Sayi-SayiH*16);
    For ie:=0 to 15 do
    if SayiH=ie then HexSayi:=Hexal[ie+1];
    For ie:=0 to 15 do
    if SayiL=ie then HexSayi:=HexSayi+Hexal[ie+1];
    ByteToString:=HexSayi;
    End;

    {*************************************************************}
    Function StringToByte(HexSayi1:String):Byte;
    Var
    Sayi1:Byte;
    ie:Byte;
    Begin
    HSayiH:=(Copy(HexSayi1,1,1));
    HSayiL:=(Copy(HexSayi1,2,1));
    For ie:=0 to 15 do
    if HSayiH=Hexal[ie+1] then Sayi1:=ie*16;
    For ie:=0 to 15 do
    if HSayiL=Hexal[ie+1] then Sayi1:=Sayi1+ie;
    StringToByte:=Sayi1;
    End;
    {*************************************************************}
    Procedure SeriCom;
    Label Oku;
    Var
    DosyaAdi:String[50];
    Run:String;
    Test:Boolean;
    PortOkunan:Byte;
    Dosya:Text;
    Uzunluk,KayitTipi,RamAdrH,RamAdrL,RamData:String[2];
    UzunlukByte,RamAdrHByte,RamAdrLByte,RamDataByte:Byte;
    i,j:Integer;
    Begin
    clrscr;
    TextBackGround(7);TextColor(0);
    GotoXY(18,12);Write('-');
    for i:=19 to 66 do
    Begin
    GotoXY(i,12);
    Write('-');
    End;
    GotoXY(67,12);Write('-');
    GotoXY(18,20);Write('-');
    for i:=19 to 66 do
    Begin
    GotoXY(i,20);
    Write('-');
    End;
    GotoXY(67,20);Write('-');
    for i:=13 to 19 do
    Begin
    GotoXY(18,i);
    Write('-');
    End;
    for i:=13 to 19 do
    Begin
    GotoXY(67,i);
    Write('-');
    End;
    TextBackGround(4);TextColor(30);
    GotoXY(19,13);Write(' Seri Port COM2 :9600,n,8,1 ');
    TextBackGround(7);TextColor(1);

    {Iletişim Test}
    test:=FALSE;
    GotoXY(19,14);Write(' ');
    GotoXY(19,15);Write(' İletişim Kurulmaya Çalışılıyor ');
    GotoXY(19,16);Write(' ');
    GotoXY(19,17);Write(' ');
    while NOT test do
    begin
    PortaYaz(1,11);
    if InterruptDurumu(com2) =veri_geldi then
    begin
    PortOkunan:=PortuOku(com2);
    if PortOkunan=11 then
    test:=TRUE;
    end
    else
    if keypressed then
    begin
    GotoXY(19,14);Write(' ');
    GotoXY(19,15);Write(' İletişim Sağlanamıyor. ');
    GotoXY(19,16);Write(' ');
    GotoXY(19,17);Write(' ');
    halt;
    end;
    end;}

    GotoXY(19,14);Write(' ');
    GotoXY(19,15);Write(' Yükleme Yapacağınız Dosya Adı: ');
    GotoXY(19,16);Write(' ');
    GotoXY(19,17);Write(' ');
    GotoXY(21,16);Readln(DosyaAdi);
    if DosyaAdi='' then
    begin
    TextBackGround(0);TextColor(15);GotoXY(1,21);exit;
    end;
    DosyaAdi:='C:\UTIL\ASM51\EXP\'+DosyaAdi+'.HEX';

    {$I-}
    Assign(Dosya,DosyaAdi);
    Reset(Dosya);
    if IOResult<>0 then
    Begin
    TextBackGround(0);TextColor(12);
    GotoXY(24,18);Write(' Hatalı Dosya Adı');
    GotoXY(26,19);Write(' ');
    { Readkey; }
    TextBackGround(0);TextColor(15);
    GotoXY(1,21);
    Exit;
    End;
    Close(Dosya);
    {$I+}

    TextBackGround(0);TextColor(12);
    Assign(Dosya,DosyaAdi);
    Reset(Dosya);
    Oku:
    Read(Dosya,ch);
    if ch<>':' then
    Begin
    GotoXY(19,18);Write(' Çalışma dosyanız ASM51 HEX yapılı değil ');
    GotoXY(19,19);Write(' ');
    Close(Dosya);
    TextBackGround(0);TextColor(15);
    GotoXY(1,21);
    Exit;
    End;
    if ch=':' then
    Begin
    GotoXY(19,18);Write(' .......... Datalar RAM a yazılıyor ...........');
    Uzunluk:='';
    For i:=1 to 2 do
    Begin
    Read(Dosya,ch);
    Uzunluk:=Uzunluk+ch;
    End;
    UzunlukByte:=StringToByte(Uzunluk);
    RamAdrH:='';
    For i:=1 to 2 do
    Begin
    Read(Dosya,ch);
    RamAdrH:=RamAdrH+ch;
    End;
    RamAdrHByte:=StringToByte(RamAdrH);
    RamAdrL:='';
    For i:=1 to 2 do
    Begin
    Read(Dosya,ch);
    RamAdrL:=RamAdrL+ch;
    End;
    RamAdrLByte:=StringToByte(RamAdrL);
    KayitTipi:='';
    For i:=1 to 2 do
    Begin
    Read(Dosya,ch);
    KayitTipi:=KayitTipi+ch;
    End;
    if (Uzunluk='00') and (RamAdrH='00') and (RamAdrL='00') and (KayitTipi='01') then
    Begin
    Delay(50);
    PortaYaz(Com2,255);
    Delay(50);
    PortaYaz(Com2,255);
    Delay(50);
    PortaYaz(Com2,00);
    Delay(50);
    Close(Dosya);
    GotoXY(19,18);Write(' Transfer Tamamlandı... ');
    GotoXY(19,19);Write(' Programı koşmak istiyor musunuz ( E/H ): ');
    GotoXY(64,19);Readln(Run);
    if (Run='e') or (Run='E') then
    Begin
    PortaYaz(Com2,01);
    GotoXY(19,18);Write(' ......... Program Koşuluyor ......... ');
    GotoXY(19,19);Write(' ');
    End
    else
    Begin
    PortaYaz(Com2,00);
    GotoXY(19,18);Write(' ');
    GotoXY(19,19);Write(' ');
    End;
    TextBackGround(0);TextColor(15);
    GotoXY(1,21);
    Exit;
    End;
    For j:=1 to UzunlukByte do
    Begin
    RamData:='';
    For i:=1 to 2 do
    Begin
    Read(Dosya,ch);
    RamData:=RamData+ch;
    End;
    RamDataByte:=StringToByte(RamData);
    Delay(50);
    PortaYaz(Com2,RamAdrHByte);
    Delay(50);
    PortaYaz(Com2,RamAdrLByte);
    Delay(50);
    PortaYaz(Com2,RamDataByte);
    GotoXY(28,19);Write('Adres :',ByteToString(RamAdrHByte),ByteToString(RamAdrLByte),' Data : ',RamData);
    RamAdrLByte:=RamAdrLByte+1;
    if RamAdrLByte=0 then RamAdrHByte:=RamAdrHByte+1;
    End;
    End;
    Readln(Dosya);
    Goto Oku;
    End;

    begin
    PortuSetle(Com2,BR_9600,Pr_None,Dl_8,Sb_1);
    DataAktif(Com2);
    SeriCom;
    end.

  9. #9
    MEKATRONİK
    Üyelik tarihi
    Kasım.2011
    Nereden
    MERSİN/TARSUS
    Mesajlar
    29

    Standart Cevap: 8051 mikroişlemci

    teşekkürler sayın hocam
    İnsan söylemediklerinin hakimi,söyledikelrinin mahkumudur.

 

 

Konu Bilgileri

Bu Konuya Gözatan Kullanıcılar

Şu anda 1 kullanıcı bu konuyu görüntülüyor. (0 kayıtlı ve 1 misafir)

Yetkileriniz

  • Konu Acma Yetkiniz Yok
  • Cevap Yazma Yetkiniz Yok
  • Eklenti Yükleme Yetkiniz Yok
  • Mesajınızı Değiştirme Yetkiniz Yok
  •