Hazırlayan: Metin ÇINAR şifreli kilit devresi bir yana kıymetini bilen için çok değerli bilgiler var Emeği geçen Kişilere Teşekkürler.
Mikrokontrolör
Mikrokontrolör ’ler (MCU) bir çeşit MİB (CPU ) olarak görülebilirler. MCU’lar MİB’ den daha yavaş ve daha az bellek adresleme yeteneğine sahiptirler, fakat gerçek zamanlı kontrol problemlerinin gerçeklenmesi için tasarlanmış olduklarından hem daha ucuz hem de kullanımları daha kolaydır. MİB ile MCU arasındaki en önemli fark kullanımları için gerekli olan harici donanımlardır. MCU hemen hemen her zaman, bir kristal veya osilatör dışında hiçbir harici donanıma ihtiyaç duymaz. CPU ise harici parçalar kullanılmadan hiçbir iş yapamaz. Örneğin paralel iletişim arbirimi,seri iletişim arabirimi,bellek gibi pekçok ek donanıma ihtiyaç duyar.
Bazı standart MİB’ler sahip oldukları hız ve komut kümeleri ile MCU paketleri içerisinde bulunabilirler.Bu şekilde CPU çok daha kullanışlı ve ek özelliklere sahip bir MCU olarak kullanılabilir. Bir mikrokontrolörün dört temel özelliği vardır. Bunlar; hız,boyut,bellek kapasitesi ve sunulan ek bazı imkanlardır.
Hızı belirleyen, kullanılan saat işaretinin frekansıdır ve genellikle her saniyedeki milyon çevrim olarak ölçülür(Mega-Hertz,MHz). Farklı MCU’ lar için bu hız farklılık gösterir ve işlemcilerin kullanım hızlarının da farklı olmasına neden olur. Complex Instruction Set Computers (CISC)-Karmaşık komut kümesine sahip bilgisayarlarda bir komutun işlenmesi için gerekli olan saat çevrimi her komut için farklılık gösterir. Bazı komutlar bir saat çevriminde tamamlandıkları gibi bazı komutlar ise düzinelerle ifade edilebilecek saat çevrimlari sonunda tamamlanabilmektedir.
Bu nedenle CISC mimarisine sahip bilgisayarların ne kadar hızlı olduklarını söylemek pek kolay değildir. Reduced Instuction Set Computers (RISC) –RISC mimarisine sahip bilgisayarlar daha az ve daha basit işlemler gerçekleştirebilen komut kümesine sahiptir.Genellikle bu komutlar bir veya birkaç saat çevriminde gerçeklenebilir. Bir CISC komutunun gerçeklenebilmesi için çok sayıda RISC komutunun kullanılması gerekebilir.
Boyut, MCU’nun bir adımda işleyebileceği bit sayısı ile belirlenir. MCU lar 4,8,16,32 bitlik olarak imal edilirler,fakat günümüzde hala en fazla kullanılan ları 8 bitliktir.
Kişisel bilgisayarlarda bellek MB(Mega-Byte) mertebesi ile ölçülürken mikrokontrolörlerin ROM boyutları KB(Bin-Byte) mertebesi ile ölçülmektedir.RAM değerleri birkaç yüz byte civarlarındadır. Mikrokontrolörler belleklerini bir masaüstü makinasından farklı olarak kullanırlar. Mikrobilgisayarlarda bellek Von Neuman mimarisine göre organize edilmektedir. Yani bütün program ve veriler aynı bellekte tutulmaktadır. Bunun aksine pekçok MCU bellek organizasyonunda Harvard mimarini temel almaktadır.
Bu mimaride ise program ayrı bir bellekte (genellikle ROM,Flash veya diğer non-volatile(kalıcı) belleklerde) tutulurken veriler ve geçici değişkenler ayrı bir bellekte tutulurlar (genellikle dahili veya harici SRAM). Bu sadece fonksiyonel bir ayrım değildir (kalıcı veri ROM’da,geçici veri RAM’de) aynı zamanda işlemcinin ayrı belleklere daha verimli olarak erişimini de sağlar.
Bellek Yapıları
Kişisel bilgisayarlar programlarını manyetik hard disklerinde, disketlerde ya da optik CD-ROM‘larda saklarlar.Bu programların çalıştırılması gerektiğinde programlar bulundukları ortamdan RAM’e aktarılarak burada çalıştırılırlar. Mikrokontrolörler ise programlarını farklı tipte belleklerde saklarlar. Uygulanan gerilim kesildiğinde programın kaybolduğu ve düzenli olarak yenilenmesi (refresh) gereken DRAM ler yerine MCU’lar program kodlarını kalıcı bir bellekte tutarlar.
Rom (Salt oku bellek)
Salt Oku Bellek (Read Only Memory-ROM) içerisinde bulunan verilerin okunmasına izin veren fakat verilerin değiştirilmesine izin vermeyen bir bellek türüdür. Salt oku belleklerin programlanması özel tekniklerle gerçekleştirilir.Bu tür bellekler genellikle arabalarda,mikrodalga fırınlarda ,çamaşır makinalarında vs. kullanılan MCU sistemlerinde yer alırlar.
OTP Rom (One Time Programable Rom)
Bir defa programlanabilen bu tür ROM ‘lar programlama işinin üretici firma yerine müşteri tarafından yapılmasına olanak sağlar.Özel programlama donanımı ile, programcı kodunu bir defaya mahsus olmak üzere ROM’a yükler.
Eprom
Silinebilir/Programlanabilir ROM (Erasable/Programmable ROM) kullanıcıya ROM’u silip tekrar programlama olanağı sunar. Silme işlemi ultraviole ışığı ile gerçekleştirilir ve 5 dakika ile yarım saat arasında bir süre zarfında gerçekleştirilir.
Eeprom
Elektriksel olarak silinebilir PROM (Elecrically-Erasable PROM) ‘un kullanımı daha kolaydır çünkü programlama ve silme işlemleri aynı anda ve yavaş bir ultaviole ışığı ile silme süreci olmadan yapılabilir. EPROM ve EEPROM belirli bir programlama kapasitesine sahiptir. Yaklaşık olarak 1000 defa programlama yapılabilmektedir.
Flash
Flash belleklerde bir çeşit EEPROM ‘dur.EEPROM ‘un programlanması için özel bir programlama cihazına ve ROM’un kullanıldığı devrede ihtiyaç duyduğundan daha fazla bir gerilim seviyesine ihtiyaç duyulur.Flash bellekler ise kullanıldığı devreden ayrılmadan ve lojik-seviye gerilimi kullanılarak
programlanabilirler. Yaklaşık olarak 1000 defa programlama yapılabilmektedir. Flash belleğine yazmak, okumaktan çok daha fazla zaman aldığından dolayı Flash bellekleri RAM olarak kullanılamazlar.
Sram
Statik RAM (SRAM) de dinamik RAM (DRAM) gibi kalıcı olmayan bir bellek türüdür. SRAM sahip olduğu bilgiyi gerilim kaynağı var olduğu sürece kaybetmez. Hatta küçük bir pil ile içersindeki bilgiyi yıllarca muhafaza edebilir.DRAM ise SRAM de olduğu gibi bir gerilim kaynağına ve bunun yanında bilgileri muhafaza etmek için sabit bir saat işaretine ihtiyaç duyar.(constant refresh cycle) Pek çok MCU bir dahili SRAM’e sahiptir.Hatta bazıları harici olarak SRAM eklenmesine olanak sağlarlar
Mikrokontrolörlerde bulunabilecek temel özellikler
Bir MCU’nun pek çok farklı özelliği bulunabilir. Burada standartlaşmış bazı özellikler üzerinde durulacaktır.
Uart(Asia)
Asenkron Seri İletişim Arabirimi(Universal Asynchronous Receiver and Transmitter). ASİA , standart iletişim protokollerini kullanarak işlemcinin dış dünya ile iletişimini sağlar. Bu özellik MCU’nun bir harici aygıt ile iletişim yapmasının gerektiği durumlarda kullanılır.Örneğin bir LCD monitör ile ya da bir başka bilgisayar ile ASİA üzerinden iletişim sağlanabilir. Bu şekilde bir arabirime sahip olmayan bir yongaya harici olarak SPI üzerinden bir ASİA eklenebilir ya da ASİA görevini yerine getirebilecek bir yazılım kullanılabilir.
Spi
Harici sistemlerle iletişimde ASİA’nın kullanıldığı yerlerde Seri Çevre Arabirimi(Serial Peripheral Interface-SPI) diğer yongalarla iletişimde kullanılır.
SPI portlarına sahip pek çok yonga çeşidi vardır: ASİA,A/D çeviriciler,ve hatta bellek yongaları bunlardan bazılarıdır. Paralel iletişim kadar hızlı olmamasına rağmen SPI iletişiminin kullanımı kolaydır. Bütün adresleme ve veri hatlarının kullanılmasının yerine 3 ya da 4 hat ile iletişim sağlanabilir.
I2C (Inter Integrated Circuit)
Sadece iki hat kullanarak SPI ile aynı görevi yapar. I2C protokolü birden fazla aygıtın aynı anda iletişim yapabilmesine olanak sağlar.SPI da ise aynı anda sadece iki aygıt iletişim halinde bulunabilir.
CAN (Controller Area Network)
CAN otomobillerde kullanılmak üzere tasarlanmış bir seri ağ iletişim projesidir.Farklı bir alanda SPI ve I2C ile aynı görevi yerine getirir.
G/Ç İskeleleri (I/O Ports)
Sayısal Giriş/Çıkış bütün kontrolörler için çok önemli bir özelliktir.Bu nedenle üretici firmalar sayısal G/Ç port sayısını mümkün olduğunca artırmaya çalışmaktadırlar.Her bir G/Ç hattı için yonga üzerinde bir ayak bulunmalıdır. Örneğin 8 ayaklı bir yongada sadece birkaç tane G/Ç hattı bulunabilir. 40 ayaklı bir yongada ise genellikle dört tane 8 bitlik G/Ç hattı bulunur(toplam 32 bit G/Ç).
G/Ç hatları genellikle programlanabilirler. Programlanabilir G/Ç işlemlerinde iskelenin giriş mi yoksa çıkış mı olarak kullanılacağı yazılımla belirlenir. Bunun için herbir iskeleye ait kontrol saklayıcılarının uygun şekilde koşullanmaları gereklidir.
Analog Giriş
Gerçek dünyadaki işaretler genellikle bilgisayarın anlayamayacağı sürekli işaretlerden oluşur. Bu nedenle fiziksel dünyadaki analog değişimlerin izlenebilmesi için MCU’larda analog dijital çeviriciler(ADÇ) ya da analog karşılaştırıcılar bulunur.
Eğer MCU’nun sağladığı ADÇ uygulama için yeterli değilse dışarıdan harici olarak bir ADÇ SPI portu üzerinden MCU’ya eklenebilir.
Zamanlayıcı / Sayıcı
Zamanlayıcı MCU’nun dahili saat işareti ile çalışır. Bu saat işareti ölçeklenerek farklı saat işaretleri ile de kullanılabilir(/2,/4,/16,/256…).Ayrıca taşma durumunda kesme üretmeleri için kontrol saklayıcıları kullanılarak çeşitli ayarlar yapılabilir. Zamanlayıcılar belirli aralıklarla yapılması gerekli işlerin bulunduğu uygulamalarda hayati bir önem taşırlar.
Sayıcılar da zamanlayıcılarla aynı şekilde çalışırlar fakat sayıcılarda saat işareti yerine dışarıdan gelecek bir sinyal ile sayma işlemi gerçekleştirilir. Sayıcı içeriği kaç darbe alındığının belirlenmesi için yazılımla okunabilir.Çoğu MCU bir ya da daha fazla zamanlayıcı/sayıcı ya sahiptir.
Kesmeler
Kesme, MCU’nun çalışmasını kesip özel bir program kodunun çalıştırılmasını sağlayan bir sinyaldir. Kesmeler dışarıdan gelebileceği gibi içeriden de kesme alınabilir. Kesme hizmet programına ait program parçasının ilk adresi bellekte belirli bir yerde tutulur.Buna, kesme vektörü adı verilir.
Kesme hizmet programları genellikle küçük bir işi yerine getirmek için kullanılırlar. Kesme alındığında kesmeye gidilmeden önce geri dönüş adresi genellikle donanımla yığında saklanır.Eğer kesme hizmet programında kullanılacak saklayıcılar varsa bunlar da yığında saklanmalıdır.Kesme hizmet programına gidildiğinde genelde kesme kendisini pasifleştirerek sürekli bir kesme alınmasını engeller. Kesme sona erdiğinde ise program kesmenin alındığı noktadan itibaren çalışacak şekilde tekrar hazır hale getirilir. Eğer saklayıcılar yığına atılmış ise doğru bir sırada geri çekilmeleri gereklidir.Kesmeden dönüşte aynı zamanda pasifleştirilmiş olan kesme tekrar etkin hale getirilir.
Kesmenin kullanılmaması halinde MCU pek çok yararlı iş yapabilecekken gereksiz yere bazı olayların yoklanması ile meşgul olacaktır. Aynı zamanda yoklama yazılımla yapıldığından çok kısa süreli darbelerin kaçırılması olasılığı da vardır.
Watchdog Timer(Gözetleme Zamanlayıcısı)
Mikrokontrolörler gerçek dünyada çalışan aygıtlardır. MCU da herhangi bir sebepten dolayı bir sorun olması halinde MCU bunu kendi başına aşabilmelidir.
Gözetleme zamanlayıcısı etkin durumda olduğunda uygulamanın düzgün bir şekilde devam edip etmediği kontrol attında tutulur. Yazılımcı tarafından belirlenmiş süre içerisinde eğer program belirli bir noktaya ulaşmamış ise bir sorun olduğu anlaşılır ve gözetleme zamanlayıcısının süresi aşıldığı için kesme üretilir. Böylece sistem albaştan edilebilir ve sorunun çözülmesi sağlanabilir.
ATMEL AT90S2313 Mikrokontrolörü
AT90S2313 düşük güçlü RISC (reduced instruction set computer) mimarisi tabanlı bir mikrokontrolördür. Pek çok mikrokontrolörde olduğu gibi AT90S2313’de de Harward mimarisi kullanılmıştır. Bu mimaride veri belleği ile komut belleği birbirinden bağımsızdır. Bu mimarinin aksine Von Neuman mimarisinde ise veri ve komutlar aynı bellek içerisinde yer almaktadır.
Bu yapı farklılığına rağmen her iki mimaride de saklayıcı olarak adlandırılan özel bellek alanları mevcuttur. Saklayıcı temel olarak işlemci içerisinde bulunur ve işlemcinin çok önemli bir yapıtaşıdır. Saklayıcıların erişim süreleri belleklere göre çok daha hızlıdır. Bu nedenle MCU’da kullanılan pek çok komut bu saklayıcılar kullanılarak gerçeklenmektedir. S2313 de kullanılan saklayıcılar bellek haritası içerisinde yer aldıklarından veri belleği olarak da kullanılabilirler.
AT90S2313 ‘de bellek haritasının bir başka bölümü de donanım kontrolü için ayrılmıştır. Bunlar Giriş/Çıkış (G/Ç) kontrol portları ya da G/Ç saklayıcıları olarak adlandırılır.Bu saklayıcılar kullanılarak değişik donanım kaynakları kontrol altında tutulabilir.
Mikrokontrolör (MCU) 32 genel amaçlı saklayıcı takımı ile zengin bir komut kümesine sahiptir. 32 saklayıcının tamamı Aritmetik Lojik Birime (ALU) doğrudan bağlıdır. Bu nedenle iki farklı saklayıcıya bir komut ile ve tek saat darbesiyle erişilebilmektedir.
AT90S2313 Genel Özellikler
- 2048*16 bit (2K*16) program belleği
- 128 byte EEPROM
- 128 Byte SRAM
- 20 genel amaçlı G/Ç hattı
- 32 genel amaçlı iş saklayıcısı
- İki adet zamanlayıcı/sayıcı
- İç ve dış kesme olanakları
- Watchdog(Gözetleme) zamanlayıcısı
- Analog karşılaştırıcı
- Programlanabilir ASİA(UART)
- SPI seri port
- Yazılımla belirlenebilen güç tasarruf modları(Idle mode ve Power down mode)
Bacak Tanımlamaları
Vcc : Kaynak geriliminin uygulandığı bacak
GND : Topraklama bacağı
Port B (PB7..PB0) : Port B, 7 bitlik çift yönlü G/Ç iskelesidir. Her bit için seçime bağlı dahili (iç) pull-up özelliği mevcuttur. Port B çıkış tamponları 20mA akım sağlayabildiğinden doğrudan LED diyot göstergelerini sürebilir.
Port D (PD6..PC0) : Port D , 7 bitlik çift yönlü G/Ç iskelesidir.Her bit için seçime bağlı dahili (iç) pull-up özelliği mevcuttur. Port D çıkış tamponları 20mA akım sağlayabil-diğinden doğrudan LED diyot göstergelerini sürebilir. Port D’nin bu özellikleri yanında bazı farklı özellikleri de mevcuttur. Bu özelliklere burada değinil-meyecektir.
Reset : (Reset)’ hattına dışarıdan lojik 0 uygulanması halinde MCU resetlenir.Resetin algılanabilmesi için en az 50ns süresince lojik 0 değerinin uygulanması gereklidir. 50ns’den daha kısa süreli darbelerin algılanması garanti değildir.
XTAL1 , XTAL2 : Kristal osilatörün MCU’ya bağlanması için kullanılan uçlar.
Mimariye Genel Bakış
Yüksek hızda erişimin mümkün olduğu 32*8 bitlik saklayıcı takımının her bir elemanına erişim tek bir saat çevrimi ile mümkün olmaktadır.Yani sadece bir saat çevriminde bir ALU işlemi gerçeklenebilmektedir.İki saklayıcının operand olduğu bir işlemde bir peryodda işlem tamamlanmakta ve sonuç saklayıcılardan birine yazılmaktadır.
32 saklayıcıdan 6’sı 16 bitlik işaretçi olarak kullanılabilmektedir.Böylece tablolar üzerinde işlem yapmak oldukça kolaylaşmaktadır. Bu saklayıcılar X,Y ve Z saklayıcıları olarak adlandırılırlar. ALU saklayıcılar arasında ya da bir saklayıcı bir sabit arasında aritmetik ve lojik işlemeler gerçekleştirebilir. 32 genel amaçlı saklayıcı normal bellek alanları gibi de kullanılabilir. Çünkü bu saklayıcılar da veri belleği haritası içerisinde yer almaktadırlar. $00 ile $1F adresleri kullanılarak bu saklayıcılara erişim mümkün olmaktadır. Şekil 1’ de AT90S2313 mikrokontrolörüne ait mimari yapı verilmiştir.
AT90S2313 RISC mikrokontrolöre ait mimari yapı
Bellek Yapısı
Veri Belleği (SRAM) : AT90S2313’ün 128 byte’lık veri belleği mevcuttur. Bu veri belleğinin ilk adresi $0060 , son adresi ise $00DF ‘dir. Normalde bellek başlalangıç adresinin $0000 olması gerekmektedir. Fakat burada ilk 32 adres dahili saklayıcılara erişim için , sonraki 64 adres ise G/Ç ile ilgili saklayıcılara erişim için ayrımıştır. Buradan anlaşılacağı üzere bu saklayıcılar da bellek haritası içerisinde düşünülmektedir, fakat fiziksel olarak saklayıcılar SRAM içerisnde yer almamaktadır.
SRAM içerisinde saklanan bilgi uygulanan kaynak gerilimi var olduğu sürece saklanabilmektedir. Bundan dolayı SRAM geçici veri saklanması amacı ile kullanılmaktadır.
AT90S2313 Bellek haritası
Program Belleği (Flash) : Program belleği hem kullanılan bellek tipi olarak hem de kendisine ayrılmış adres aralığı açısından SRAM’den farklılık gösterir.Program belleği olarak kullanılacak olan bellek, kaynak gerilimi kesilse dahi içerisinde bulunan veriyi muhafaza edebilmelidir.Yani program belleği olarak kalıcı veri saklama özelliğine sahip bellek türleri kullanılır.Bir diğer nokta ise veri belleğine erişilirken program belleğine erişilememesidir. Aynı şekilde program belleğine erişilirken de veri belleğine erişim mümkün değildir. AT90S2313’de program belleğinin boyutu 2048*16 bittir. Bellek adresi $000 ile $3FF arasındadır.
Yığın : Yığın, genellikle PUSH,POP,CALL,RET gibi özel komutlar tarafından kullanılan, veri belleği içerisinde tanımlanan özel bir veri yapısıdır.Yığının veri belleği içerisinde nereye yerleşeceği programcı tarafından belirlenebilir. Yığın yüksek adreslerden düşük adreslere doğru büyüdüğü için tanımlama esnasında ilk adresinin büyük bir adres olması daha uygun olacaktır.
Yığına bir veri atıldığında yığın işaretçisi bir azaltılarak bir sonraki verinin yazılabileceği bellek gözünü göstermesi sağlanır.Yığından veri çekileceği durumda ise yığın işaretçisi bir artırılır ve işaretçinin gösterdiği veri, saklayıcılardan birine yerleştirilir.
Yığın, alt program çağrılarında ve kesmelerin işlenmesinde çok önemli bir görev üstlenmiştir. Bir alt program çağrısı yapıldığında veya kesme alındığında o andaki program sayacı yığına atılır. Çağrısı yapılan kod işlendikten sonra RET ya da RETI komutu ile daha önce yığına atılmış olan geri dönüş adresi yığından çekilir ve program akışı kesilmiş olduğu naktadan itibaren devam eder.
Yığın boyutu değişken olabileceği gibi sabit de olabilir. Fakat sabit yığın durumunda iç içe gidilebilecek alt program sayısı sınırlı alacağından değişken uzunluklu yığın yapısı daha avantajlıdır.
Saklayıcılar
Genel Amaçlı Saklayıcılar : AT90S2313’de 32 adet genel amaçlı saklayıcı(R0,R1,R2,…R31) takımı yer almaktadır. Pek çok komutta bu saklayıcılar kullanıldığından oldukça kullanışlı bir yapı söz konusudur. Bütün saklayıcılar 8 bitliktir ve veri belleği haritasında yer aldıklarından dolayı herbiri ayrı bir adrese sahiptir. Bellek haritasında ilk 32 adres saklayıcı takımına ayrılmıştır.
Genel amaçlı saklayıcılar R0-R15 VE R16-R31 olarak iki sınıfa ayrılırlar. Bir saklayıcı ve ivedi verinin işlendiği komutlarda(SBCI,SUBI,CPI,ANDI ,ORI ,LDI) sadece R16…R31 saklayıcıları kullanılabilmektedir.Belleğin işaretçi yapısı kullanılarak adreslenebilmesi için üç adet özel 16 bitlik saklayıcı (X,Y,Z) kullanılmaktadır. Bu saklayıcıların herbiri iki adet 8 bitlik saklayıcının birlikte kullanılması ile elde edilmektedir.
Genel amaçlı iş saklayıcıları
Durum Saklayıcısı : Bazı komutların sonuçlarına ait bilgilerin tutulduğu bir saklayıcıdır. Bunun dışında tablo 2.1 ‘de görülebileceği gibi bir kaç tane daha özelliği vardır. Örneğin MCU’nun kesmeleri tümüyle kaldırabilmesine olanak sağlayan global kesme izin biti bu saklayıcı içerisinde yer almaktadır. SREG’de 8 bitten herbirinin özel bir anlamı vardır. SREG G/Ç belleği içerisinde $003F adresi ile adreslenebilmektedir.
Tablo 2.1
Giriş/Çıkış Saklayıcıları : Aynı zamanda G/Ç portu olarak da adlandırılmaktadır. SREG ve yığın işareçisi gibi özel saklayıcıların bir kopyaları G/Ç saklayıcısı aralığında özel komutlarla erişilecek şekilde tutulurlar. G/Ç saklayıcılarına IN ve OUT gibi özel komutlar kullanılarak erişilebilmektedir.
Bunun yanında bu saklayıcıların bellek adreslerinin genel komutlar ile adreslenmesi ile de erişim sağlanabilmektedir. IN ve OUT komutları kullanıldığında G/Ç saklayıcı adresleri $00 ile $3F arasındadır. Bellek adresi olarak ise G/Ç saklayıcıları $20 ile $5F adresleri arasındadır.
Adresleme Türleri
İvedi Adresleme : Bu adresleme türünde ivedi veri komut içerisine yerleştiğinden ve komutun bir parçası olduğundan adres hesabı yapılmaz.
Saklayıcı Doğrudan Adresleme,Tek Saklayıcılı Veri, genel amaçlı saklayıcılardan birinde saklanır. Rd saklayıcısının kodu komut sözcüğü içerisine doğrudan yerleştirilir. Rd varış ya da kaynak saklayıcı olabilir.(Şekil 2.4)
LDI RD,K ; K sabit değeri Rd saklayıcısına yeleştirilir.
PUSH RD ; Rd saklayıcısının içeriğini yığına at
POP RD ; Yığının tepesindeki veriyi Rd saklayıcısına yerleştir.
Şekil 2.4: Saklayıcı doğrudan adreslem, tek saklayıcılı
Saklayıcı Doğrudan ,İki Saklayıcılı(Rd ve Rr) : İki saklayıcı üzerinde işlem yapılması gerekli olduğunde bu adresleme modu kullanılır. Herbir saklayıcı kodu komut sözcüğü içerisine yeleştirilir. İşlem somucu Rd saklayıcısına yerleştirilir.(şekil 2.5)
MOV Rd,Rr ; Rd Rr
SUB Rd,Rr ; Rd (Rd-Rr)
Şekil 2.5: Saklayıcı doğrudan adresleme, iki saklayıcılı
G/Ç Doğrudan Adresleme : G/Ç saklayıcılarının kullanıldığı komutlar bu adresleme modunu kullanır. Eğer komut aynı zamanda bir genel amaçlı saklayıcıyı da kullanıyorsa komut sözcüğü içerisine bu saklayıcının kodu da yerleştirilir.(Şekil 2.6)
IN Rd, P ; P portundaki veriyi Rd saklayıcısına yerleştir.
SBI P,b ; P G/Ç saklayıcısının b. bitini birle
Şekil 2.6: Giriş/Çıkış doğrudan adresleme
Veri Belleği Doğrudan Adresleme : Bu adresleme modunda veri , MCU SRAM’inden alınır.16 bitlik bellek adresi, 16 bitlik komut sözcüğünün hemen ardından gelir. Bu adresleme modunu kullanan komutlar program belleğinde 2 sözcüklük yer kaplarlar.(2*16 bit) (Şekil 2.7)
Şekil 2.7: Veri belleği doğrudan adresleme
LD Rd,K ; K bellejk adresindeki veriyi Rd saklayıcısına yerleştir.
Veri Belleği Dolaylı Adresleme: Veri belleğinin adresi 16 bitlik özel saklayıcılardan birinde tutulur.(Şekil 2.8)
LD Rd, X ; X işaretçisinin gösterdiği adresteki veriyi Rd’ye yaz.
ST Z,Rr ; Z işaretçisinin gösterdiği adrese Rr’ nin içeriğini yaz.
Şekil 2.8: Veri belleği dolaylı adresleme
Veri Belleği Dolaylı , Ötelemeli : Bu adresleme modu da veri belleği dolaylı adreslemeye benzer. Adres Y veya Z saklayıcılarından birinde tutulur. Sabit bir kayıklık (off-set) değeri ise bu adresin ötelenmesi için kullanılır. Bu adresleme modu yüksek seviyeli diller için de oldukça kullanışlıdır. İşaretçinin bir tablonun taban adresini ya da bir kayıt yapısını gösterdiği uygulamalarda kayıklık değeri ile tabloda ya da kayıtta istenen veriye kolaylıkla erişilebilir.(Şekil 2.9)
STD Z+q , Rr ; (Z+q) Rr (Z saklayıcısının içeriği değişmez.).
Şekil 2.9: Veri belleği dolaylı adresleme, ötelemeli
Veri Belleği Dolaylı,Önceden Azaltmalı : Bir önceki adresleme modu ile aynı şekilde işler.Buradaki fark ise saklayıcı içeriğinin işlem yapılmadan hemen önce bir azaltılmasıdır. Değişen adres bilgisi yine aynı saklayıcı içerisinde saklanır ve saklayıcının yeni içeriği ile adresleme gerçekleştirilir.(Şekil 2.10)
LD Rd,-X ; X’i bir azalt ve X’in gösterdiği bellek gözündeki veriyi Rd ‘ye yaz. (Rd (X-1) )
Şekil 2.10: Veri belleği dolaylı, önceden artırmalı adresleme
Veri Belleği Dolaylı Sonradan artırmalı : Bu adresleme modunda ise komutun işlenmesinin ardından saklayıcı içeriği bir artırılır ve yeni değer yine aynı saklayıcıda tutulur.(Şekil 2.11)
ST X+, Rr ; Rr’yi X’in işaret ettiği bellek gözüne yaz ardından X’i bir artır.
Şekil 2.11: Veri belleği dolaylı,sonradan artırmalı adresleme
Tanımlanmış Sabit Değerlerin Adreslenmesi : Bu adresleme modu, program belleği dolaylı adresleme modu olarak da adlandırılabilir. Bu adresleme şekli sadece LPM komutu tarafından kullanılır. Program belleğinin (Flash) adresi, 16 bitlik özel saklayıcılardan olan Z saklayıcısında tutulur. Program belleğinin bir satırı 16 bitlik olduğu için Z saklayıcısının en düşük anlamlı biti bu belleğin hangi sekizlisinin adresleneceğini gösterir. Eğer Z saklayıcısının en düşük anlamlı biti lojik 0 ise düşük anlamlı sekizli ,lojik 1 ise yüksek anlamlı sekizli adreslenir.(Şekil 2.12)
LPM komutu kullanıldığında okunan veri her zaman R0 saklayıcısına yerleştirir.
Şekil 2.12: Program belleğinde tanımlanmış sabitlerin adreslenmesi
Dolaylı Program Adresleme : IJMP ve ICALL komutları tarafından kullanılan adresleme modudur. Programın akışı Z saklayıcısının gösterdiği adresten itibaren devam eder.(Şekil 2.13)
IJMP ; Z’in gösterdiği yerden program akışı devam etsin.(PC=Z)
Şekil 2.13: Program belleği dolaylı adresleme
Bağıl Program Adresleme : RJMP ve RCALL komutları ile gerçeklenir. Komutta belirtilen kayıklık miktarı kadar (-2048 ile +2047 arası) program akışı kaydırılır. Dallanma komutları da bu adresleme modunu kullanırlar.(Şekil 2.14)
RJMP K ; Programın akışını k adet komut kadar kaydır.
BRMI K ; Negatif bayrağı bir ise K adet komut program akışını değişt
Şekil 2.14: Program belleği bağıl adresleme
Reset ve Kesme
AT90S2313 11 farklı kesme kaynağına sahiptir. Her bir kesmeye ait ayrı bir kesme vektörü program belleğinde tutulmaktadır.(Tablo 2.2) Aynı zamanda her kesme için ayrı bir kesme izin biti mevcuttur. Bir kesmenin kabul edilebilmesi için hem ilgili kesmeye ait kesme izin biti hem de global kesme izin biti lojik 1 değerinde olmalıdır.
Tablo 2.2: Reset ve kesme vektörleri
Program belleğinin ilk 11 adresi otomatik olarak reset ve kesme vektörlerine ayrılmıştır. Bu vektörlerin tam listesi aşağıdaki tabloda verilmiştir.Listede düşük adreste bulunan kesme vektörleri daha önceliklidir.
Reset Kaynakları
- Power-on reset
- Harici (dış) reset
- Watchdog reset (gözetleme reseti)
MCU resetlendiğinde bütün G/Ç saklayıcılarına ilk değerleri yüklenir ve program $000 adresinden itibaren çalışmaya başlar. Bu nedenle $000 adresinde RJMP program kodunun bulunması gereklidir (Reset kesme hizmet programının ilk adresine bağıl dallanma).Eğer program hiçbir zaman kesmeye izin vermiyorsa yani kesme vektörleri kullanılmıyorsa bu alanlara normal program kodu yerleştirilebilir. Aşağıda reset lojiğine ilişkin devre şeması verilmiştir.
AT90S2313 reset lojiği
Power-on Reset (POR) : Darbesi yonga üzerinde bulunan bir algılama devresi tarafından üretilir. Algılama seviyesi nominal olarak 2,2 Volt’tur.Vcc gerilimin algılama seviyesinin altında olduğu her durumda POR aktif haldedir. POR devresi başlangıç resetinin tetiklenmesinde kullanılabileceği gibi kaynak geriliminin yetersizliğinin ortaya çıkarılması için de kullanılabilir. Aslında POR, Vcc nin güvenli
bir seviyenin altında olması halinde MCU nun zarar görmemesi için kullanılır.Aşağıda şekil 2.16 ‘te durum daha net olarak incelenebilir.
Şekil 2.16: MCU başlar , reset Vcc’ye bağlı
Vcc eşik gerilimine eriştiğinde POR devresi tarafından gecikme zamanlayıcısı resetlenir ve gecikme süresi başlatılmış olur. Gecikme süresi boyunca bir iç reset işareti oluşturularak MCU resetlenir. MCU’nun başlaması dışarıdan reset kontrollü olarak da yapılabilir. Aşağıdaki şekil 2.17’da bu süreç verilmiştir.
Şekil 2.17: MCU başlar, dışarıdan reset kontrollü
Dış Reset : Dışarıdan (Reset)’ ayağına yuygulanan bir lojik 0 işareti ile MCU reset-lenebilir. Dış reset işleyişi şekil 2.18 ‘de verilmiştir.
Şekil 2.18: Dış reset süreci
Watchdog Reset (Gözetleme Zamanlayıcısı Reseti) : Gözetleme zamanlayıcısı aktif halde iken süresinin aşması halinde bir saat çevrimi süresince bir darbe üretilir. Bu darbenin düşen kenarı ile gecikme zamanlayıcısı time–out süresini saymaya başlar. Bu süre dolana kadar bir iç reset işareti oluşturularak MCU resetlenir. Aşağıda şekil 2.19’da watchdog reset algılama sürecininin aşamaları verilmiştir.
Şekil 2.19: Watchdog reset süreci
Kesme Yönetimi : AT90S2313 iki adet 8 bitlik kesme maskesi saklayıcısına sahiptir.Bunlar GIMSK (General Interrupt Mask Register) genel kesme maskesi saklayıcısı ve TIMSK (Timer/Counter Interrupt Mask Register) sayıcı/zamanlayıcı kesme maskesi saklayıcısıdır.
Bir kesme alındığında Durum saklayıcısındaki global kesme izin biti (I) sıfırlanır ve böylece bütün kesme izinleri kaldırılmış olur. Kesme hizmet programı içerisnde iken programcı istediği takdirde bu biti 1’leyerek kesme izinlerini verebilir.I biti kesmeden dön komutu ile otomatik olarak tekrar 1 yapılır.
Komut Kümesi ve Proje geliştirme araçları
Mikrokontrolörlere ait komut kümesi ve geliştirme araçları en güncel şekilde üreticiden elde edilebilir. Komutların ve mikrokontrolörün çalışma biçimi de uygulamalı çalışma ile çok daha iyi öğrenilebilir.
Assembler ve editör gibi program geliştirme aracları, hata ayıklayıcı programlar , mikrokontrolörlere ait bilgi ve komut kümeleri üretici firmadan edinilebilir. Burada çalışmanın sınırlarını aşacağından kontrolöre ait daha detaylı özellikler verilmemiştir.
Şifreli Kapı Kilidi Uygulaması
Bu uygulamada kullanıcı bir tuş takımı aracılığı ile mikrokontrolör ile iletişim kurabilmektedir.Kullanıcı, arabirim aracılığı ile şifresini ya da şifre değiştirmek isteğini kontrolöre bildirebilmektedir. Kontrolör tuş takımından okuduğu kodların anlamlarını çözerek kullanıcının isteği doğrultusunda gerekli işlemleri yerine getirebilmektedir. Çalışmanın bu bölümünde uygulamaya ilişkin donanım ve yazılım aşamaları hakkında bilgi verilmiştir. Yazılımın tamamı ise gerekli açıklamaları ve akış diyagramı ile birlikte ekler kısmında yer almaktadır.
Malzeme Listesi
- 1 Kondansatör 0,1 mikroF – Filtre kapasitesi
- 2 Kondansatör 18pf – Osilatör kondansatörleri
- 1 Kristal , 4 Mhz – Osilatör kristal
- 1 AT90S2313 – Atmel MCU
- 6 LED
- 4 Direnç ,4K – Tuş takımı satır dirençleri
- 1 Direnç ,1K – Reset Pull-up direnci
- 6 Direnç ,330 Ohm – LED akım sınırlama dirençleri
- 1 Anahtar,SPST anlık – Reset anahtarı
- 1 12 V, 1 A Röle – Tek kontaklı
- 1 Diyot – Röle ters akımı için
- 1 74LS40 (NAND kapısı) Kesme için
- 1 4×3 tuş takımı – Kullanıcı arabirimi
Kullanıcı Arabirimi (Tuş Takımı)
Tuş takımı genellikle matris biçiminde yerleştirilmiş olan tuşlardan oluşur. Şifreli kapı kilidi uygulamasında kullanılan tuş takımı 4 x 3 lük bir matris biçimindedir.
Şekil 3.2’de 4×3 standart tuş takımı ile mikrokontrolör arasındaki donanım yapısı verilmiştir. Görüldüğü gibi tuş takımı matrisine ait 4 satır doğrudan mikrokontrolöre bağlanmıştır. Satırlara bağlı olan değil ve (NAND) kapısı herhangi bir tuşa basıldığında kesme üretmek amacıyla bağlanmıştır.
Şekil 3.1: 4×3 Standart tuş takımı
Tuş takımının satırlarının okunabilmesi amacıyla satırların bağlı olduğu iskele kapıları alıcı olarak koşullanmıştır. Eğer hiç bir tuşa basılmamış ise bu 4 satırın bağlı olduğu kapılardan lojik 1 değeri okunur. Çünkü her satır bir direnç üzerinden kapılara bağlanmıştır. Ancak herhangi bir tuşa basılırsa bu tuşun bağlı olduğu satır hattı lojik 0 değerine düşeceği için kapıların okunması halinde 1111 değeri okunmaz.
Şekil 3.2: Tuş takımının mikrokontrolör ile bağlantısı
Tuş takımının satırlarına bağlanmış olan dirençlerin değerlerinin büyük seçilmesi daha uygun olacaktır. Bir tuşa basıldığında kısa devre meydana geldiğinden çekilen akımın, dolayısıyla güç sarfiyatının az olması için direnç değerleri büyük olmalıdır. Ayrıca direnç değerlerinin küçük seçilmesi halinde (<1000ohm) kesmenin algılanması da güçleşecektir. Çünkü değil-ve kapısının girişlerinin lojik 0 olarak algılanabilmesi için giriş seviye geriliminin belirli bir düzeyin altında olması gerekmektedir. Tuş takımının 3 adet sütunu ise yine 3 adet kapı tarafından sürülmektedir. Bu sütunların lojik 0 durumunda tutuldukları düşünülürse herhangi bir tuşa basılması halinde tuşun bulunduğu sütun ve satırın kısa devre olması ile ilgili satırın gerilimi de lojik 0 seviyesine düşecektir. Satırların hepsi bir değil-ve kapısı ile mikrokontrolürün kesme girişine bağlı olduğundan tuşa basılması kesme üretilmesini sağlayacaktır. Kesme hizmet programı içerisinde ise hangi tuşa basıldığı belirlenmektedir. Yukarıdaki donanımın kontrolör tarafından algılanabilmesi için kontrolörün uygun şekilde koşullanması gerekmektedir. Bunun için aşağıdaki koşullamalar yapılmalıdır.
.EQU SATIR_1=0 ; EQU sembolik deyimi ile eşitlikler atanarak program .EQU SATIR_2=1 ; daha anlaşılır bir yapıya getirilebilir. .EQU SATIR_3=2 .EQU SATIR_4=3 .EQU SUTUN_1=4 .EQU SUTUN_2=5 .EQU SUTUN_3=6 cbi DDRB,SATIR_1 ; burada satırların okunacağı kapılar alıcı olarak cbi DDRB,SATIR_2 ; koşullanmaktadır. cbi DDRB,SATIR_3 ; cbi (clear bit ) cbi DDRB,SATIR_4 ; DDRB B iskelesine ilişkin yönlendirici cbi PORTD,SATIR_1 ; Bu koşullamalar ise okunacak satırlara ilişkin cbi PORTD,SATIR_1 ; kapıların dahili pull-up kullanmalarını sağlar. cbi PORTD,SATIR_1 cbi PORTD,SATIR_1 sbi DDRB,SUTUN_1 ;buradaki koşullamalar ile tuş takımının bağlı sbi DDRB,SUTUN_2 ;olduğu kapıların verici olarak koşullanması sbi DDRB,SUTUN_3 ;sağlanmaktadır. ldi temp,3 ;kesme izninin verilmesi ve kesmenin çıkan kenar out MCUCR,temp ;tetiklemeli olması için gerekli koşullamalar. ldi temp,64 ;MCUCR (MCU kontrol saklayıcısı) out GIMSK,temp ;GIMSK (Genel kesme maskesi saklayıcısı) sei ;Global kesme izninin verilmesi
Bu koşullamalar altında başlangıçta sütun hatlarının hepsi lojik 0 seviyesinde tutulmaktadır. Bu durumda bir tuşa basılması halinde NAND kapısının çıkışı 0’dan 1’e çıkacağı için ve kesme de çıkan kenarın algılanması ile gerçekleşeceği için kesme hizmet programına dallanılır. Kesme hizmet programı içerisinde ise sütun hatları belirli bir anda sadece birisi etkin durumda (lojik 0) olacak şekilde sürülür. Her durumda satırlar okunarak 0 seviyesindeki satır bulunmaya çalışılır. 0 seviyesindeki satır bulunduğunda sürülen sütun da belli olduğundan basılan tuş belirlenir ve tuşun değeri bir saklayıcıya yazılır.
Tuş okuma alt programında öncelikle sütunlar sıra ile belirli bir süre sürülmekte ve satırlar okunmaktadır. Burada sütunların sürülmesinin hemen ardında ik bir gecikme programı çalıştırılmaktadır. Bu gecikme programının çalıştırılmadığı durumda satırların okunması halinde doğru bilgi alınması mümkün olmayacaktır. Çünkü sadece birkaç saat darbesi ardından bir satır 1 seviyesinde 0’a düşecek olsa bile bu durum, program tarafından sezilemeyecektir. Çünkü lojik 0’dan lojik 1’e ya da tersi geçişler belirli bir gecikme ile gerçekleşmektedir.
Gecikme programı eğer bir geçiş varsa bu geçişin kesin olarak algılanabilmesini sağlar. Burada akla şu soru gelebilir , “acaba bir tuşa basıldığı halde gecikme programından dolayı tuşun algılanamaması olasılığı var mıdır?”. Tuşun algılanamaması olasılığı yoktur çünkü gecikme programı sadece bir kaç ms’lik bir gecikme sağlamaktadır. Bir insanın bir tuşa basıp elini çekmesi için ise en azından 200ms’lik bir zamana ihtiyaç vardır.
Şekil 3.3: Tuş okuma alt programına ilişkin akış diyagramı
Uygulama İçin Kullanılan Yazılım
Şifreli kapı kilidi uygulamasındaki yazılımda program ilk koşulların belirlenmesinin ardından sonsuz döngüde beklemektedir. Bir tuşa basılıp kesme alınması ile bir kesme hizmet programına dallanılmakta ve basılan tuşun belirlenmesinin ardından yapılması gereken işlemler tamamlandıktan sonra kesmeden dönülmekte ve sonsuz döngüde beklemeye devam edilmektedir.Görüldüğü gibi bütün işlemler kesme hizmet programı içerisinde gerçekleştirilmektedir.
Yazılım aslında bir sonlu durum makinası gibi çalışmaktadır. Basılan tuş belirlendikten sonra eğer tuş ‘*’ ise şifre değiştirme durumuna geçilmektedir ve geçilen durum ilgili led ‘ler yakılarak kullanıcıya bildirilmektedir. Şifre değiştirme durumunda iken şifre değiştirme durum led’i ve eski sifrenin girilmesinin beklendiğini belirten durum led’i yakılır. Kullanıcı eski şifreyi girdikten sonra ‘# ’ tuşuna basarak girişi tamamladığını bildirir. Girilen karakterler bir sifre tablosunda tutulmaktadır ve ‘# ‘ tuşunun okunması ile bu tablodaki karakterler ile EEPROM’daki şifre karakterleri karşılaştırılır.
EEPROM da 25 adet 5 uzunluklu şifre bulunmaktadır. Yani yapı çok kullanıcılı olarak tasarlanmıştır. Bu nedenle şifre tablosundaki veri ile 25 farklı şifre bloğu karşılaştırılır. Eğer girilen şifre ile EEPROM şifreleri arasında uyuşma söz konusu değilse yine ilk koşullara dönülmektedir. Ayrıca kullanıcının hatalı, eksik ya da fazla veri girişi yaptığı durumlarda da ilk koşullara dönülmektedir. Eski şifrenin doğru olarak okunması halinde ise yeni şifrenin okunması durumuna geçilmektedir ve bu durum bir led ile kullanıcıya iletilmektedir.
Yine 5 karakterlik yeni şifre bir tabloda tutulmaktadır. Eğer veri girişinde bir hata söz konusu değilse yeni sifrenin onaylanması için bir daha girilmesinin bekleneceği bir duruma geçilecektir. Bu durum da yine kullanıcının haberdar olması için bir led ile bildirilecektir. Kullanıcının girmiş olduğu iki yeni sifre karşılaştırılarak aynı olup olamadıkları kontrol edilir.Eğer girilen yeni sifreler aynı ise bu sifre ile EEPROM’da bulunan sifre değistirilmektedir.
Eğer kullanıcı doğrudan şifre girmeye başladı ise şifre okuma durumuna geçilmektedir. Bu durum içerisinde iken kullanıcının girmiş olduğu karakterler şifre tablosunda tutulmakta ve ‘# ‘ okununcaya kadar bu durum içerisinde kalınmaktadır. Eğer ‘# ‘ karakteri okunduğunda girilmiş olan şifre formatı doğru ise bu şifre ile EEPROM’da bulunan 25 adet şifre karşılaştırılmaktadır. Eğer şifre doğru ise kapının açılması için ilgili iskele kapısı çıkışı lojik 1 düzeyine çekilmektedir. Yaklaşık olarak 1sn boyunca lojik 1 uygulandıktan sonra ise yine ilk koşullara dönülmektedir.
Diyagramdan da görüldüğü gibi çıkış karakteri (‘# ’) alınıncaya kadar bir durum içerisinde kalınmakta ve çıkış karakterinin ardından veri girişi kontrol edilmektedir. Hatalı veri girişi yapılması ilk koşullara dönülmesine neden olmaktadır.İlk koşullarda ise bütün saklayıcılara ilk değerleri yüklenmekte aslında sistem reset’lenmektedir. Böylece yapının devamlılığı sağlanabilmektedir.
Yazılımda durumlar arası geçişler bayraklar ile kontrol altında tutulmaktadır. Uygulamaya ilişkin yazılım ve akış diyagramı ekler kısmında açıklamalı olarak verilmiştir.
Proje DonanımYapısı : Belirtilen koşulları sağlayan projeye ilişkin ilişkin donanım şeması Şekil3.5’te verilmiştir
Şekil 3.5: Projeye ilişkin donanım şeması
Projenin Program Kodu
.include "2313def.inc" .DEF temp =R16 .DEF tus =R17 .DEF delay1 =R18 .DEF delay2 =R19 .DEF taban =R20 .DEF sayac =R21 .DEF veri =R22 .DEF EEVeri =R23 .DEF EEAdres=R24 .DEF temp2 =R25 .DEF s1 =R0 ;sifre okumak için ve .DEF s2 =R1 ;sifre degidtirmek için .DEF s3 =R2 ;alt programlarda kullanılan sayaclar .DEF s4 =R3 .DEF sifre_dogru =R4 ;bayrak saklayıcısıları .DEF e_s_dogru =R5 .DEF yeni_sifre_okundu =R6 .DEF yeni_sifreler_esit =R7 .DEF sifre_degistir =R8 .DEF sifre_girme =R9 .DEF hata =R10 .EQU rakam =5 ;sifre buyu bu sabit ile belirlenir. .EQU SUTUN_1 =0 ;tuş takımı sütunları .EQU SUTUN_2 =1 .EQU SUTUN_3 =2 .EQU SATIR_1 =3 ;tuş takımı satırları .EQU SATIR_2 =4 .EQU SATIR_3 =5 .EQU SATIR_4 =6 .EQU s_degistir_LED=0 .EQU eski_s_gir_LED=1 .EQU y_s_1_gir_LED=3 .EQU y_s_2_gir_LED=4 .EQU KAPIYI_AC =5 .EQU S_gir_LED =6 .DSEG yeni_sifre_1: .BYTE 5 ;Yeni sifre tablosu 1 için 5 byte ayır yeni_sifre_2: .BYTE 5 ;Yeni sifre tablosu 2 için 5 byte ayır sifre_tablo: .BYTE 5 ;sifre tablosuna 5 byte ayır .CSEG .ORG 0X00 rjmp RESET ;Power-on Reset rjmp kesme ;Kesme isteği0(IRQ0) rjmp RESET ;Kesme isteği1(IRQ1) rjmp RESET ;Zamanlayıcı 1 yakalama rjmp RESET ;Zamanlayıcı 1 karşılaştırma rjmp RESET ;zamanşayıcı 1 taşma rjmp RESET ;zamanlayıcı 0 taşma rjmp RESET ;ASİA,Rx coplete rjmp RESET ;ASİA,veri saklayıcısı boş rjmp RESET ;ASİA,Tx complete rjmp RESET ;analog karşılaştırıcı .CSEG reset: cli ;kesme iznini kaldır ;-------------------------------------- ;Yığın isaretcisine ilk değerinin verilmesi ; ldi Temp, low(RAMEND) out SPL, Temp ;-------------------------------------- ;iskele alıcı-verici kosullamaları ;ve ilk değerlerin verilmesi sbi DDRB,SUTUN_1 sbi DDRB,SUTUN_2 sbi DDRB,SUTUN_3 cbi PORTB,SUTUN_1 cbi PORTB,SUTUN_2 cbi PORTB,SUTUN_3 cbi DDRB,SATIR_1 cbi DDRB,SATIR_2 cbi DDRB,SATIR_3 cbi DDRB,SATIR_4 sbi DDRD,0 sbi DDRD,1 cbi DDRD,2 sbi DDRD,3 sbi DDRD,4 sbi DDRD,5 sbi DDRD,6 cbi PORTD,0 cbi PORTD,1 cbi PORTD,3 cbi PORTD,4 cbi PORTD,5 cbi PORTD,6 ;------------------------------------------ ;kullanılan sayaclara ilk değerlerinin atanması ldi temp,0 mov s1,temp ldi temp,0 mov s2,temp ldi temp,0 mov s3,temp ldi temp,0 mov s4,temp ;--------------------------------------------- ;bayraklara ilk değer atanması ldi temp,0 mov e_s_dogru,temp mov sifre_girme,temp mov sifre_degistir,temp mov sifre_dogru,temp mov yeni_sifre_okundu,temp mov hata,temp ;---------------------------------------------- ;kesme izninin verilmesi ldi temp,3 out MCUCR,temp ldi temp,64 out GIMSK,temp sei ;global kesme izin biti 1'lenir rjmp anacevrim ;anacevrim'e dallan anacevrim: rjmp anacevrim ;anacevrimde program sonsuz döngüde beklemek- ;tedir. Bütün iş kesme hizmet programı ;içerisinde yapılmaktadır. ;=========================================================== ;kesme hizmet programı ; ; kesme: rcall tusoku ;kesme tuş takımından alındığı için ;basılan tuşu "tuşoku" alt programı ile belirle mov temp,hata ;eğer hata=-1 ise basılan tuş belirlenememiştir cpi temp,-1 ;bu durumda hata=0 yapılarak kesmeden dönülür. brne L ;aksi halde kesme hizmet programı çalışmaya devam ldi temp,0 ;eder. mov hata,temp reti L: cpi tus,10 ;tus='*' mı? brne x ;tus='*' değilse x'git mov temp,sifre_girme cpi temp,0 ;sifre_girme=1 ve tus="*" ise sonlan brne sonlan mov temp,sifre_degistir cpi temp,0 ;sifre_degistir=1 ise ve yine tus='*' brne sonlan ;tusuna basılmış ise RESET(sonlan) ldi temp,1 mov sifre_degistir,temp ;"*" tusuna ilk kez basımış ise sbi PORTD,S_degistir_LED ;bayrak çekilir ve kullanıcı ledler ile sbi PORTD,Eski_S_gir_LED ;uyarılır. bekle: sbic PIND,2 ;kesme alınan bacak lojik 0 düzeyine rjmp bekle ;düşene kadar beklenir.(kullanıcının elini rcall dly ;tuştan çekmesi bekleniyor) reti ;kesmeden dön x: ;tus!=* ise bu kod yürütülür. mov temp,sifre_degistir cpi temp,1 brne sifre_okuma ;sifre_degistir!=1 ise sifre_okuma ya git mov temp,e_s_dogru ;sifre_degistir=1 ise eski sifre okundu mu? cpi temp,1 ;eski sifre okunmus mu? brne eski_s_oku ;okunmamıs ise eski sifreyi oku mov temp,yeni_sifre_okundu ;eski sifre okunmus ise cpi temp,1 ;yeni sifre okunmus mu? brne yeni_s_oku ;okunmamıs ise oku rcall yeni_sifre_2_oku ;okunmus ise yeni sifre 2'yi oku bekle_1: sbic PIND,2 ;kullanıcının elini çekmesi bekleniyor. rjmp bekle_1 rcall dly reti sifre_okuma: ldi temp,1 mov sifre_girme,temp ;sbi PORTD,s_gir_LED rcall sifre_oku bekle_2: sbic PIND,2 ;kullanıcının tuştan elini çekmesi bekleniyor. rjmp bekle_2 rcall dly reti eski_s_oku: ;sifre_degistir=1 ise bu kod parcası ;yürütülür. rcall eski_sifre_oku bekle_3: sbic PIND,2 ;kullanıcını elini çekmesi bekleniyor. rjmp bekle_3 rcall dly reti yeni_s_oku: ;eski sifre okunmus ve dogru ise bu kod ;parcası yürütülür. rcall yeni_sifre_1_oku bekle_4: sbic PIND,2 ;kullanıcını elini çekmesi bekleniyor. rjmp bekle_4 rcall dly reti sonlan: ldi temp,100 g: rcall dly dec temp brne g bekle_5: sbic PIND,2 rjmp bekle_5 rcall dly rjmp RESET ;============================================================= ;Kesme alındığında hangi tuşa basıldığını bulan kesme hizmet programı ; ; tusoku: sec ;eldebayrağı=1 yap ldi Temp, 0b11111011 ;baslangıçta SUTUN_3 etkin durumda ldi sayac,0 yeniden_tara: out PORTB,Temp rcall dly ;gecikme süresi kadar bekle sbis PINB, SATIR_1 ;SATIR_1 biti 1 ise tusa basılmamıstır rjmp S_1 ;bu bit 0 ise tusa basılmıstır.s_1'e git sbis PINB, SATIR_2 ;SATIR_2 biti 1 ise tusa basılmamıstır rjmp s_2 ;bu bit 0 ise tusa basılmıstır.s_2'ye git sbis PINB, SATIR_3 ;SATIR_3 biti 1 ise tusa basılmamıstır rjmp s_3 ;bit 0 ise tusa basılmıstır.s_3'e git sbis PINB, SATIR_4 ;SATIR_4 biti 1 ise tusa basılmamıstır rjmp s_4 ;bit 0 ise tusa basılmıstır.s_4'e git inc sayac ;sayacı 1 artır cpi sayac,3 ;sayac!=3 ise bütün sütunlar taranmamıştır. breq son_1 ;sayac=3 ise tus bulunamdığı için son_1'e git ror Temp ;diger sutuna bak rjmp yeniden_tara son_1: ldi temp,-1 ;bütün sütunlar tarandığı halde tuş mov hata,temp ;bulunamadığı için hata=-1 yaz rjmp son1 s_1: ;tus satır 1'de ise bu kod işlenir sbic PORTB,SUTUN_1 rjmp else1 ;SUTUN_1=1 ise diger sutunlara bak ldi TUS,1 ;SUTUN_1=0 ise 1 tusuna basılmıstır. rjmp bitti else1: sbic PORTB,SUTUN_2 rjmp else2 ;SUTUN_2=1 ise diger sutuna bak ldi TUS,2 ;SUTUN_2=0 ise 2 tusuna basılmıstır. rjmp bitti else2: ldi TUS,3 ;SUTUN_3=0 olduğu için 3 tusuna basılmıstır. rjmp bitti s_2: ;tus satır 2'de ise bu kod işlenir sbic PORTB,SUTUN_1 rjmp else3 ;SUTUN_1=1 ise diger sutunlara bak ldi TUS,4 ;SUTUN_1=0 ise 4 tusuna basılmıstır. rjmp bitti else3: sbic PORTB,SUTUN_2 rjmp else4 ;SUTUN_2=1 ise diger sutuna bak ldi TUS,5 ;SUTUN_2=0 ise 5 tusuna basılmıstır. rjmp bitti else4: ldi TUS,6 ;SUTUN_3=0 olduğu için 6 tusuna basılmıstır. rjmp bitti s_3: ;tus satır 3'de ise bu kod işlenir sbic PORTB,SUTUN_1 rjmp else5 ;SUTUN_1=1 ise diger sutunlara bak ldi TUS,7 ;SUTUN_1=0 ise 7 tusuna basılmıstır. rjmp bitti else5: sbic PORTB,SUTUN_2 rjmp else6 ;SUTUN_2=1 ise diger sutuna bak ldi TUS,8 ;SUTUN_2=0 ise 8 tusuna basılmıstır. rjmp bitti else6: ldi TUS,9 ;SUTUN_3=0 olduğu için 9 tusuna basılmıstır. rjmp bitti s_4: ;tus satır 4'de ise bu kod işlenir sbic PORTB,SUTUN_1 rjmp else7 ;SUTUN_1=1 ise diger sutunlara bak ldi TUS,10 ;SUTUN_1=0 ise '*' tusuna basılmıstır. rjmp bitti else7: sbic PORTB,SUTUN_2 rjmp else8 ;SUTUN_2=1 ise diger sutuna bak ldi TUS,0 ;SUTUN_2=0 ise 0 tusuna basılmıstır. rjmp bitti else8: ldi TUS,11 ;SUTUN_3=0 olduğu için '#' tusuna basılmıstır. bitti: son1: ldi temp,0b11111000 out PORTB,temp ret ;============================================================== ;gecikme programı [(3*255)*(250e-9)]*10=2ms (kristal=4MHz) ; dly: ldi delay2,10 s: dec delay1 brne s dec delay2 brne s ret ;============================================================== ;kapının açılamsı için şifre girildiğinde bu alt program işlenir ; sifre_oku: cpi Tus,10 ;Tus='*' ise RESET breq son cpi Tus,11 ;Tus='#' ise ileri_4'e git breq ileri_4 inc s4 ;sayacı 1 artır mov Temp,s4 cpi Temp,rakam+1 ;sayac 6 ile karşılaştırılıyor brmi ekle_4 ;sonuç negatif ise(s4<6)tuşu tabloya ekle ret ;s4>=6 ise fazla tuş girilmiştir, dön ekle_4: cpi Temp,1 brne oku_4 ;eğer ilk tuş ise tablnun adresni ldi ZL,low(sifre_tablo+64) ;Z işaretcisine yaz ldi ZH,high(sifre_tablo+64) oku_4: st Z+,Tus ;Tusu işaretçi ile gösterilen yere yaz ret ;dön ileri_4: mov Temp,s4 cpi Temp,rakam ;sayaç!=5 ise veri sayısı hatalı,RESET brne son clr Temp mov sifre_dogru,Temp ldi YL,low(sifre_tablo+64) ldi YH,high(sifre_tablo+64) rcall sifre_kar ;girilen sifre ile EEPROM' daki sifre kars. mov temp,sifre_dogru cpi temp,1 brne son ;sifre hatalı ise RESET sbi PORTD,KAPIYI_AC ;sifre dogru oldugu için kapıyı aç t: rcall dly ;0,7 sn süresince lojik 1 uygula dec temp brne t k: rcall dly ;0,7 sn süresince lojik 1 uygula dec temp brne k son: rcall dly rjmp RESET ;============================================================== ;bu altprogragram kullanıcı tarafından girilen sifre ile EEPROM da bulunan sifreleri ;karşılaştırır.Eğer girilen sifre doğru ise sifre_doğru bayrağını 1'ler Sifre_Kar: ldi EEadres,$00 mov Taban, EEadres ldi sayac,rakam Karsilastir: rcall EEPROM_OKU ld Veri, Y+ ;X sifrenin bulundugu tablonun ilk adresi cp Veri, EEveri ;Tablodaki veri ile sifre verisi aynı mı? brne esit_degil ;Aynı değilse esit_degil'e git dec sayac ;aynı ise sayacı azalt breq esit ;ve esit'e git inc EEadres ;EEPROM isaretcisini bir artır. rjmp Karsilastir esit_degil: ldi Temp, rakam ;Sifre hatalı olduğu için bir sonraki add Taban, Temp ;şifre bloğuna geç cpi Taban, 8 brpl exit ;Taban>126 ise EEPROM sonu olduğu için çık ldi sayac, rakam mov Eeadres,taban ldi YL,low(sifre_tablo+64) ldi YH,high(sifre_tablo+64) rjmp Karsilastir esit: ldi temp,1 mov sifre_dogru,temp ;şifre doğru olduğundan ilgili bayrak 1'lenir exit: ret ;============================================================== ;sifre degistirilmek istendiginde ilk olarak eski sifrenin girilmesi istenir ;Eski sifrenin okunması bu alt program ile gerçeklenir. ; eski_sifre_oku: cpi Tus,10 ;Tus='*' ise RESET breq son3 cpi Tus,11 ;Tus='#' ise ileri_3' git breq ileri_3 inc s1 ;sayacı 1 artır mov Temp,s1 cpi Temp,rakam+1 ;sayac 6 ile karşılaştırılıyor brmi ekle_3 ;sayac>5 ise veri fazladır tabloya ekleme ret ekle_3: cpi Temp,1 brne oku_3 ldi ZL,low(sifre_tablo+64) ;sifre tablosunun ilk adresi ldi ZH,high(sifre_tablo+64);z işaretcisine yüklenir. oku_3: st Z+,Tus ;okunan tus tabloya yazılır. ret ileri_3: mov Temp,s1 ;tus='#'(sonlanma karakteri) ise bu kod işlenir cpi Temp,rakam brne son3 ;sayaç!=5 ise veri sayısı hatalıdır.RESET clr Temp mov sifre_dogru,Temp ldi YL,low(sifre_tablo+64) ldi YH,high(sifre_tablo+64) rcall sifre_kar ;girilen sifrenin dogru olup olmadığı bu ;altprogram ile test edilir. mov Temp,sifre_dogru cpi Temp,1 ;bayrak çekilmiş mi? brne son3 ;bayrak!=1 ise hatalı giris, RESET cbi PORTD,Eski_S_gir_LED ;girilen sifre dogru ise kullanıcının sbi PORTD,y_s_1_gir_LED ;bundan haberdar olması için ve yeni ;sifrenin okunması için uygun ledler ;yakılır. ldi temp,1 ;eski sifre doğru olduğu için mov e_s_dogru,temp ;ilgili bayrak çekilir. ret son3: rjmp RESET ;============================================================== ;sifre degistirilmek istendiginde yeni girilecek sifre bu alt program ile ; yeni_sifre_1_oku: cpi Tus,10 ;Tus ='*' ise RESET breq son4 cpi Tus,11 ;Tus sonlanma karakteri ise breq ileri_1 ;yani tus='#' ise ileri git inc s2 ;sayacı 1 artır mov Temp,s2 cpi Temp,rakam+1 ;sayacı 6 ile karşılaştır brmi ekle_1 ;eğer s2<=5 ise tuşu tabloya ekle ret ekle_1: cpi Temp,1 ;eğer ilk sayı okunuyorsa brne oku_1 ;tablo adresini oku ldi ZL,low(yeni_sifre_1+64) ;Z işaretcisine tablonun baslangıç ldi ZH,high(yeni_sifre_1+64) ;adresini yaz oku_1: st Z+,Tus ;Tus değerini tabloya yaz ret ileri_1: mov Temp,s2 cpi Temp,rakam ;çıkış karakteri alındığında girilen veri brne son4 ;sayısı doğru mu? Yanlış ise RESET ldi Temp,1 mov yeni_sifre_okundu,Temp ;Veri girisi doğru ise bayrak çekilir. cbi PORTD,y_s_1_gir_LED ;kullanıcının yeni sifreyi onaylamsı sbi PORTD,y_s_2_gir_LED ;için yeni sifrenin bir daha okunması ;gerekir.Bunun için kullanıcı uygun ledler ;yakılarak yönlendirilir. ret son4: rjmp RESET ;ilk kosullara don ;============================================================== ;sifre degistirilmek istendiginde yeni sifre onaylanması için bir daha ;bu altprogram ile okunur.Eğer yeni girilen iki şifre aynı ise ;EEPROM' a yazılır. yeni_sifre_2_oku: cpi Tus,10 ;tus='*' ise RESET breq son2 cpi Tus,11 ;Tus='#' ise breq ileri_2 ;ileri_2'ye git inc s3 ;sayacı 1 artır mov Temp,s3 cpi Temp,rakam+1 ;sayacı 6 ile karşılaştır brmi ekle_2 ;eğer s3<=5 ise tuşu tabloya ekle ret ;s2>5 ise veri fazladır tebloya ekleme ;ve alt programdan dön ekle_2: cpi Temp,1 ;girilen sayı ilk sayı ise brne oku_2 ldi ZL,low(yeni_sifre_2+64) ldi ZH,high(yeni_sifre_2+64) oku_2: st Z+,Tus ret ileri_2: mov Temp,s3 cpi Temp,rakam ;Çıkış karakteri okunduğunda girilen veri brne son2 ;sayısı doğru mu? Yanlış ise RESET clr Temp mov yeni_sifreler_esit,Temp ;sonucun alınacağı bayrak sıfırlanır. rcall yeni_sifreleri_karsilastir mov Temp,yeni_sifreler_esit cpi Temp,1 ;yeni girilen iki sifre aynı mı? brne son2 ;değil ise RESET cbi PORTD,y_s_2_gir_LED ;sbi PORTD,6;degistirildi_LED rcall dly rcall Sifreyi_yaz ;aynı ise sifreyi EEPROM'a yaz son2: rjmp RESET ;ilk koşullara dön ret ;Alt programdan dön ;============================================================== ;yeni girilen iki sifre bu altprogram ile kontrol edilir ; ; yeni_sifreleri_karsilastir: ldi sayac,rakam ldi ZL,low(yeni_sifre_1+64) ;tabloların baslangıç adresleri ldi ZH,high(yeni_sifre_1+64) ;Z ve Y isaretcilerine yazlır ldi YL,low(yeni_sifre_2+64) ldi YH,high(yeni_sifre_2+64) geri: ld temp,Z+ ld temp2,Y+ cp temp,temp2 brne quit dec sayac brne geri ldi temp,1 mov yeni_sifreler_esit,temp quit: ret ;============================================================== ;Aşağıdaki alt programlar EEPROM'a veri yazmak ya da ;EEPROM'dan veri okumak için kullanılır. ; EEPROM_YAZ: sbic EECR,EEWE rjmp EEPROM_YAZ out EEAR,EEADRES out EEDR,eeveri sbi EECR,EEMWE sbi EECR,EEWE ret EEPROM_OKU: sbic EECR,EEWE rjmp EEPROM_OKU out EEAR,eeadres sbi EECR,EERE sbi EECR,EERE in eeveri,EEDR ret ;============================================================ ;sifre değiştirilmek istendiğinde yeni girilen iki şifre ;aynı ise bu yeni şifre eski şifrenin yerine yazılır ;taban yeni sifrenin yazılacağı ilk bellek gözünü göstermektedir. sifreyi_yaz: ldi sayac,rakam ldi ZL,low(yeni_sifre_1+64) ldi ZH,high(yeni_sifre_2+64) devam_et: mov eeadres,taban ld eeveri,Z+ rcall eeprom_yaz inc taban dec sayac brne devam_et ret
Yayım tarihi: 2008/10/20 Etiketler: AT90S2313, atmel avr projeleri, atmel devreleri, EEPROM, eprom, MCU, mikrokontrolor, şifreli kilit