EEM 306 Mikroişlemciler ve Lab. Doç.Dr. Mehmet SAĞBAŞ
Alt Program Yapısı Alt programın çağrılması Alt program korunur alınır ;Argumanlar R12 R15 registerlarına atanir. call #SubroutineLabel SubroutineLabel: ;R4 R11 register değerleri stackta ;Alt program govdesi ;Stacktan R4 R11 register değerleri ret Subroutine, Interrupt, LPM
Yerel Değişkenler Yerel değişkenlerin depolama: CPU Registerları: Alt program içinde kullanılmadan önce değerleri stacta koruma altına alınmalı RAM: Tercih edilmez. Alt program çağrılsa da çağrılmasa da değişkenler yer kaplar. Stack: Genellikle kullanılabilecek CPU registerı kalmadığında değişkenlere stack üzerinde yer tahsis edilir. Subroutine, Interrupt, LPM
Yerel Değişkenler Yerel Değişken Register Yerel Değişken Stack Subroutine, Interrupt, LPM
Argümanlar Geri Dönüş Argümanlar: R12 R15 Stack Geri Dönüş R12 R15 Stack Niye 6(SP)? Subroutine, Interrupt, LPM
KesMeler Sistem Reset Non-maskable Interrupts Toplu olarak etkileri iptal edilemez. Bireysel olarak (Kesme Bayrakları ile) etkileri iptal edilir. Maskable Interrupts SP register ı GIE biti kullanılarak toplu olarak etkisizleştirilebilirler. Kesme bayrakları ile etkinleştirilirler. Subroutine, Interrupt, LPM
KesMeler
P1 Portu için Kesmeler LaunchPad üzerinde bulunan MSP430G2231 mikrodenetleyicisinde toplam 10 adet giriş/çıkış bulunmaktadır. 10 giriş/çıkış da harici kesmeye gidebilmektedir. Bütün giriş/çıkışlardaki kesme vektör adresi ortak kullanılmaktadır. Assembly Uygulama
P1IFG Kaydedicisi (P1 Interrupt Flag) P1 portunun ilgili pininde kesme oluşup oluşmadığı, bu saklayıcının bitleri kontrol edilerek öğrenilir. Eğer Bit = 1 ise kesme oluşmuş, Eğer Bit = 0 ise kesme oluşmamış anlamına gelmektedir. Örnek: if(p1ifg_bit.p1ifg_7 == 1) P1OUT_bit.P1OUT_0 = 1; //Eğer P1.7 de bir kesme oluşmuş ise P1.0=1
P1IE Kaydedicisi (P1 Interrupt Enable) Bu kaydedici ise P1 portunun ilgili bitinin kesmelere açık olup olmayacağı durumunu belirlemek için kullanılır. Eğer Bit = 1 ise ilgili pinde kesme açık, Eğer Bit = 0 ise ilgili pinde kesme kapalı durumdadır. Örnek: P1IE_bit.P1IE_7 = 1; //P1.7 için harici kesme açık
P1IES Kaydedicisi (P1 Interrupt Edge Select) P1 portunun ilgili bitinin kesmeye düşen kenar veya yükselen kenarda gideceğini belirleyen kaydedicidir. Eğer Bit = 1 ise düşen kenar, Eğer Bit = 0 ise yükselen kenar Örnek: P1IES_bit.P1IES_7 = 1; //P1.7 için kesmeler düşen kenar.
Merkezi İşlem Ünitesi (16 Bit RISC CPU) Özellikler Stack pointer, Program counter ve Status saklayıcılarını erişebilme (Bu özellik PIC 16F serilerinde yok). Asambley kodlama için bu esneklik sağlıyor. Ancak C kodlamada gerek yok, derleyici en uygun şekilde kendisi ayarlıyor. 16 bit adresleme ile belleğe daha az erişim gereksinimi 7 adet adresleme modu Toplam 27 adet komut 16 bit olmasına rağmen byte ya da word türünde veri adresleyebilme
MSP430 CPU Saklayıcıları 12 adet working register R0-R3 arası farklı amaçlar için kullanılıyor. 4 Özel amaçlı register PC (R0) SP (R1) SR (R2) (CG1) CG2 (R3) 12 Genel amaçlı register R4... R15 MSP430 İşlemci Mimarisi
Program Counter R0 PC (Program Counter) Register Yürütülecek sonraki komutun adresini içerir. lsb bit 0 zorlanmıştır ve çift adreslere hizalanır. Komut uzunluğu 2 Byte oldu için her komut getirmeden sonra otomatik olarak 2 arttırılır. Jump komutlarında, yeni adres komut tarafından üretilir ve içerik bu adrese göre yenilenir. MSP430 İşlemci Mimarisi
Stack Pointer R1 Stack pointer, mikrodenetleyicinin herhangi bir kesme veya altprograma dallanma anında Program Counter (PC) ın o anki konumunun (adres) kaydedildiği alandır. Altprogram veya kesme sonunda buradaki adrese dallanılarak mikrodenetleyici çalışmasına kaldığı yerden devam eder. Bellekte 0x280 alanından itibaren adreslenir ve LIFO (Son giren ilk çıkar) kuralıyla çalışır.
Stack Pointer R1 SP (Stack Pointer) Register Stack ın tepe adresini saklar Stack a ekleme yapıldıkça, en son eklenen elemanın adresini gösterir. lsb biti 0 a zorlanmıştır. Yani stack a word konur ve alınır. STACK RAM de yer alır. RAM in en üsttünde gerçekleştirilir ve düşük adreslere doğru genişler. Word e göre hizalanır, yani byte konduğunda 1 byte boş olarak harcanır. MSP430 İşlemci Mimarisi
Stack Pointer R1 Stack İşlemleri SP İlklendirilmesi C ile otomatik gerçekleşir. Assembly de bizim tarafımızdan yapılmalıdır. MSP430 İşlemci Mimarisi
Status Register R2 C (Carry) : Elde bayrağı Z (Zero) : Sıfır bayrağı N (Negative) : Negatif bayrağı GIE (General Interrupts Enable) : Genel kesmeleri aktif etme biti OSC OFF :LFXT1 kristali devre dışı bırakılır SCG0 : DCOCLK devre dışı SCG1 : SMCLK devre dışı V (Overflow) : Taşma bayrağı Düşük Güç Modları için Kullanılan bitler
Status Register R2 SR (Status Register) İşlevleri 3 kategoride toplanabilen bayraklar setini içerir. Düşük Güç Mod Kontrol Aritmetik Lojik Kesme Aktifleme MSP430 İşlemci Mimarisi
Status Register R2 Aritmetik ve Lojik İşlem Sonuçları C (Carry): Aritmetik işlemin sonucu tahsis edilen alandan daha büyük olup olmadığı Z (Zero): İşlemin sonucu 0 ise set edilir. N (Negative): İşlemin sonucunun msb biti ile eşlenir. V (Signed Overflow): İşaretli işlemin sonucunda bir overflow olduğunda set edilir. Kesme aktifleme GIE (General Interrupt Enable): Maskelenebilir kesmeleri aktifler. Düşük Güç Mod Kontrolü CPUOFF, OSCOFF, SCG0, SCG1: Hepsi 0 ise sistem tam güçte çalışır. MSP430 İşlemci Mimarisi
Constant Generators CG1-CG2 R2 R3 Sabit Üreteçleri R2 ve R3 her ikisi de 6 yaygın kullanılan sabitleri sağlamak için kullanılır. Genel Amaçlı Registerlar Kalan 12 registerın (R4... R15) özel bir amacı yoktur. Veri ve adres için kullanılırlar. MSP430 İşlemci Mimarisi
Constant Generators CG1-CG2 R2 R3 Bu birimin asıl amacı aritmetik işlemlerde çok kullanılan bazı sayıları bellek erişim gereksinimi olmadan doğrudan saklayıcı içerisinden almalarını sağlamaktır. Bunun için R2 ve R3 saklayıcıları kullanılır. Bu işlem C derleyicisi içerisinde otomatik olarak yapılmaktadır.(optimizasyon yüksek seviyede ise)
General Purpose Registers R4 R15 Genel kullanım amaçlı saklayıcılardır. 16 bit Uzunlukları 2 byte olmasına rağmen byte ya da word erişimler kolaylıkla yapılabilir.
Düşük Güç Modları Aktif Mod: CPU, saat blokları ve etkinleştirilmiş modüller aktif durumdadır. Yaklaşık 300 ma akım çekilir. LPM0: CPU ve MCLK aktif değil, SMCLK ve ACLK aktif kalır. Yaklaşık 85 ma akım çekilir. LMP3: CPU, MCLK, SMCLK ve DCO etkin değil, ACLK aktif kalır. Yaklaşık 1 ma akım çekilir. Standart düşük güçte çalıştırma modudur. LMP4: CPU ve tüm saat blokları etkin değil. Yaklaşık 0.1mA akım çekilir.
Düşük Güç Modları
Düşük Güç Modları ve Kesmeler Uygulama C Uygulama
#include <msp430.h> void main(void) { Uygulama 1.2 WDTCTL = WDTPW WDTHOLD; // Stop watchdog timer BCSCTL1 = CALBC1_1MHZ; DCOCTL = CALDCO_1MHZ; delay_cycles(100000); P1DIR = BIT6; // yeşil LED (P1.6) çıkış P1IE = BIT3; // P1.3 için kesmeleri aç (Bit = 1 ise ilgili pinde kesme açık) P1IES = BIT3; // Düşen kenar tetikleme yapılıyor (Bit = 1 ise düşen kenar). Butona bastığım anda kesmeye gidecek P1IFG = 0x00; // Açılışta kesmeye gitmemesi için P1IFG'i sıfırlanmış (Bit = 0 ise kesme oluşmamış) bis_sr_register(lpm4_bits GIE); /* Düşük güç tüketimi ve kesmeler status registerda ayarlanıyor. Düşük güç moduna inmek için her zaman bu fonksiyon kullanılır. GIE (General Interupt Enable) genel kesmeleri açıyor. Bu yapılmazsa program kesme vektörüne dallanmaz } #define LPM4_bits (SCG1+SCG0+OSCOFF+CPUOFF) #define LPM4_EXIT bic_sr_register_on_exit(lpm4_bits) // Exit Low Power Mode 4 Bu fonksiyon ile mikrokontrollör 0.1 uw güç harcama moduna geçer */
Uygulama 1.2 (devam) #pragma vector=port1_vector /* pragma vektör ile kesme vektörü yazıldı. Anlamı: Programda port kesmesi geldiği zaman kesme vektörüne geldiği zaman PORT1_VECTOR'ün adresine dallanır (PORT1 için 0xFFE4). PORT1_VECTOR'ünün adresi: #define PORT1_VECTOR (2 * 2u) / 0xFFE4 Port 1 */ interrupt void P1_ISR(void) { P1OUT ^= BIT6; // her butona basıldığında yeşil LED yanıp söner P1IFG = 0x00; // Kesme bayrağı sıfırlandı. Sıfırlanmazsa bir daha kesmeye girmez. }