Elektronik / Mikrodenetleyici Projeleri/

Atmel AT90S2313 Hakkında ve Şifreli Kilit Uygulaması

Sponsorlu Bağlantılar

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)

at90ls2333 pin tanimlama

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ı
at90s2313 risc mimari

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ı
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ı
genel amacli is saklayicilari

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
durum saklayıcısı

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ı
saklayici dogrudan adreslem tek saklayicili

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ı
rd rr saklayici takimi

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
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
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ı 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ı 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ı, ö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
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
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
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
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
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
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ı
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ü
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
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
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ı
4x3 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 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ı
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.

Program Durum Diyagramı
Program Durum Diyagramı

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ı
Projeye ilişkin donanım şeması

Program Akış Diagramı
Program Akış Diagramı

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