- Neden Kesmeye İhtiyacımız Var?
- MSP430'da Kesinti Türleri
- MSP430'da Program Denetimini Kesme
- GPIO Kesintisini Test Etmek için MSP430 Devresi
- Kesmeler için MSP430'u Programlama
- CCS'den MSP430'a Program Yükleme
- MSP430'da Programı Kesme
Size sadece zamanı gösterecek şekilde programlanmış basit bir dijital saat düşünün, şimdi saat dilimini değiştirmek istediğinizi hayal edin. Sen ne yapardın? Saat dilimini değiştirmenizi sağlayan menüye geçiş yapan bir düğmeye basmanız yeterlidir. Burada, sistem zaman tutma süreçlerindeki harici kesintinizi tahmin edemez ve saatinizdeki saniye değerini artırmakla meşgul olduğu için sizden beklemenizi isteyemez. Kesintilerin işe yaradığı yer burasıdır.
Kesmelerin her zaman harici olması gerekmez; dahili de olabilir. Çoğu zaman bir Gömülü kesmede, CPU'nun iki çevre birimi arasındaki iletişimi de kolaylaştırır. Önceden ayarlanmış bir zamanlayıcının sıfırlandığını ve zaman, zamanlayıcı kaydındaki değere ulaştığında bir kesintinin tetiklendiğini düşünün. Kesme işleyicisi, DMA gibi diğer çevre birimlerini başlatmak için kullanılabilir.
Bu eğitimde, farklı LED'leri değiştirmek için MSP430'daki harici kesintileri kullandık. Bir basma düğmesi kullanılarak durum değişikliği ile harici bir kesme verildiğinde, kontrol ISR'ye aktarılır (önceden boşaltılır) ve gerekli olanı yapar. MSP430G2 başlatma panosu için CCS ortamı kurulumu gibi temel bilgileri öğrenmek için, CCS kullanarak MSP430 ile başlarken bu bağlantıyı izleyin, çünkü bu eğitimde bunun ayrıntılarına girmeyeceğiz. Ayrıca bağlantıyı izleyerek Energia IDE ve CCS kullanan diğer MSP430 tabanlı öğreticileri de kontrol edin.
Neden Kesmeye İhtiyacımız Var?
Gömülü bir sistemde yoklama ek yükünü kaydetmek için kesintilere ihtiyaç vardır. Daha yüksek önceliğe sahip görevlerin, mevcut çalışan görevi önceden devreye sokarak yürütülmesi gerektiğinde çağrılırlar. Ayrıca CPU'yu Düşük güç modlarından uyandırmak için de kullanılabilir. Harici bir sinyalin bir GPIO bağlantı noktası üzerinden geçişiyle uyandırıldığında, ISR çalıştırılır ve CPU tekrar Düşük Güç Moduna geri döner.
MSP430'da Kesinti Türleri
MSP430 içinde kesmeler aşağıdaki Türleri-altına
- Sistem yeniden başlatması
- Maskelenemez Kesinti
- Maskelenebilir Kesinti
- Vektörlü ve Vektörsüz Kesmeler
Sistem yeniden başlatması:
Besleme voltajı (Vcc) ve Sıfırlama modu seçili RST / NMI pinindeki düşük sinyal nedeniyle meydana gelebilir ve ayrıca bekçi uygulaması zamanlayıcı taşması ve güvenlik anahtarı ihlali gibi nedenlerle de meydana gelebilir.
Maskelenemez Kesinti:
Bu kesintiler CPU komutlarıyla maskelenemez. Genel Kesme etkinleştirildikten sonra, maskelenemez kesme işlemden yönlendirilemez. Bu, Osilatör hataları gibi kaynaklar ve RST / NMI'ye (NMI modunda) manuel olarak verilen bir kenar tarafından oluşturulur.
Maskelenebilir Kesinti:
Bir kesinti oluştuğunda ve bir CPU talimatı ile maskelenebiliyorsa, o zaman Maskelenebilir Kesmedir. Her zaman dışsal olmaları gerekmez. Ayrıca çevre birimlerine ve işlevlerine de bağlıdırlar. Burada kullanılan harici bağlantı noktası kesintileri bu kategoriye girer.
Vektörlü Kesmeler ve Vektörsüz Kesmeler:
Vektörlü: Bu durumda, kesinti yapan cihazlar, kesme vektör adresini ileterek bize kesintinin kaynağını sağlar. Burada ISR'nin adresi sabitlenir ve kontrol bu adrese aktarılır ve ISR gerisini halleder.
Vektörsüz: Burada tüm kesintilerin ortak ISR'si vardır. Vektörel olmayan bir kaynaktan bir kesinti meydana geldiğinde, kontrol, tüm vektörsüz kesintilerin paylaştığı ortak adrese aktarılır.
MSP430'da Program Denetimini Kesme
Kesinti oluştuğunda, MCLK açılır ve CPU KAPALI durumdan geri çağrılır. Programın kontrolü, kesintinin meydana gelmesinden sonra ISR adresine aktarılırken, program sayacındaki ve durum yazmacındaki değerler yığına taşınır.
Art arda, Durum Kaydı temizlenir, böylece GIE temizlenir ve düşük güç modu sonlandırılır. En yüksek önceliğe sahip kesme seçilir ve kesme vektör adresi program sayacına yerleştirilerek yürütülür. MSP430 GPIO Interrupt Örnek Kodumuza gelmeden önce , içinde yer alan Port kayıtlarının çalışmasını anlamak önemlidir.
MSP430'da GPIO Kontrolü için Bağlantı Noktası Kayıtları:
PxDIR: Bir port yön kontrol kaydıdır. Programcının işlevini özel olarak 0 veya 1 yazarak seçmesine izin verir. Bir pin 1 olarak seçilirse, o zaman bir çıktı olarak işlev görür. Bağlantı noktası 1'i 8 bitlik bir bağlantı noktası olarak düşünün ve pim 2 ve 3 çıkış bağlantı noktaları olarak atanacaksa, P1DIR yazmacının 0x0C değeriyle ayarlanması gerekir.
PxIN: Salt okunur bir kayıttır ve porttaki mevcut değerler bu kayıt kullanılarak okunabilir.
PxOUT: Bu özel kayıt, değerleri doğrudan bağlantı noktalarına yazmak için kullanılabilir. Bu, yalnızca çekme / aşağı açılır yazmacı devre dışı bırakıldığında mümkündür.
PxREN: Pullup / pulldown kaydını etkinleştirmek veya devre dışı bırakmak için kullanılan 8 bitlik bir kayıttır. Bir pim, hem PxREN hem de PxOUT kaydında 1 olarak ayarlandığında, o zaman belirli pim yukarı çekilir.
PxDIR |
PxREN |
PxOUT |
I / O Yapılandırması |
0 |
0 |
X |
Dirençlerle giriş devre dışı |
0 |
1 |
0 |
Dahili indirmeli giriş etkin |
0 |
1 |
1 |
Dahili pullup etkinleştirilmiş giriş |
1 |
X |
X |
Çıktı - PxREN'in etkisi yoktur |
PxSEL ve PxSEL2: MSP430'daki tüm pinler çoğullandığından, kullanmadan önce belirli fonksiyonun seçilmesi gerekir. Hem PxSEL hem de PxSEL2 kayıtları belirli bir pim için 0 olarak ayarlandığında, genel amaçlı G / Ç seçilir. PxSEL 1 olarak ayarlandığında, birincil çevresel fonksiyon seçilir ve bu böyle devam eder.
PxIE: Bir x portundaki belirli bir pim için kesintileri etkinleştirir veya devre dışı bırakır.
PxIES: Kesmenin üretildiği kenarı seçer. 0 için yükselen kenar seçilir ve 1 için düşen kenar seçilir.
GPIO Kesintisini Test Etmek için MSP430 Devresi
MSP430 Kesinti Örneği kodumuzu test etmek için kullanılan MSP430 devresi aşağıda gösterilmiştir.
Kartın zemini hem LED'i hem de düğmeyi topraklamak için kullanılır. Basma düğmesinin çapraz olarak zıt tarafları normalde açık terminallerdir ve düğmeye basıldığında bağlanırlar. LED'in yüksek akım tüketimini önlemek için LED'in önüne bir direnç bağlanır. Genellikle 100ohm - 220ohm aralığındaki düşük dirençler kullanılır.
Port Kesintilerini daha iyi anlamak için 3 farklı kod kullanıyoruz. İlk iki kod Devre Şeması 1'dekiyle aynı devreyi kullanır. Koda girelim. Bağlantılar yapıldıktan sonra kurulumum şöyle görünüyor.
Kesmeler için MSP430'u Programlama
MSP430 Kesme Programının tamamı bu sayfanın altında bulunabilir, kodun açıklaması aşağıdaki gibidir.
Aşağıdaki satır, bekçi uygulaması zamanlayıcısının çalışmasını durdurur. Watchdog timer genellikle iki işlem gerçekleştirir. Biri, denetleyiciyi sıfırlayarak denetleyicinin sonsuz döngülerden korunmasını, diğeri ise dahili zamanlayıcıyı kullanarak periyodik olayları tetiklemesidir. Bir mikro denetleyici sıfırlandığında (veya çalıştırıldığında), zamanlayıcı modundadır ve MCU'yu 32 milisaniyeden sonra sıfırlama eğilimindedir. Bu satır, denetleyicinin bunu yapmasını durdurur.
WDTCTL = WDTPW + WDTHOLD;
P1DIR kaydını 0x07 değerine ayarlamak, çıkış olarak pin0, pin1 ve pin2'nin yönünü ayarlar. Ayar P1OUT 0x30 yapılandırır için iç pullup dirençlerle bir giriş pin4 ve Pin5 etkinleştirilmiş. P1REN'in 0x30 olarak ayarlanması, bu pinler üzerinde dahili çekmeyi sağlar. P1IE, P1IES'in bu pimlerdeki kesme kenarı olarak yüksekten alçağa geçişi seçtiği kesinti etkinleştirir.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
Sonraki satır, düşük güç modunu etkinleştirir ve kesintilerin alınabilmesi için durum kaydında GIE'yi etkinleştirir.
__bis_SR_register (LPM4bits + GIE)
Program sayacı, makro kullanılarak port 1 vektörünün adresiyle ayarlanır.
PORT1_VECTOR . #pragma vektör = PORT1_VECTOR __interrupt void Port_1 (void)
Aşağıdaki kod pin0, pin1, pin2'ye bağlı LED'lerin her birini tek tek değiştirir.
eğer (% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; count ++; } else if (sayın% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; count ++; } Başka { P1OUT ^ = Bit2; P1IFG & = ~ 0x30; count ++; }
Devre Şeması 2:
Benzer şekilde, kavramı daha iyi anlamak için farklı bir iğne deneyelim. Yani burada basma düğmesi, pin 1.5 yerine pin 2.0'a bağlanır. değiştirilen devre aşağıdaki gibidir. Yine bu devre MSP430 buton kesme programını test etmek için kullanılır.
Burada port 2, giriş için kullanılır. Bu yüzden farklı kesme vektörü kullanılmalıdır. P1.4 ve P2.0 girişlerini alır.
Port 2 sadece giriş için kullanıldığından, P2DIR 0 olarak ayarlanır. Port 2'nin pin0'ını dahili çekme dirençleri etkinleştirilmiş giriş olarak ayarlamak için, P2OUT ve P2REN kayıtları 1 değeriyle ayarlanmalıdır. port 2'nin pin0'ında interrupt ve ayrıca interrupt'ın kenarını seçmek için P2IE ve P2IES 1 değeriyle ayarlanır. Port 2'deki bayrağı sıfırlamak için P2IFG temizlenir, böylece bayrak tekrar ayarlanabilir. kesintinin oluşumu.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Kesme kaynağı 1 numaralı bağlantı noktasından olduğunda, bağlantı noktası 1'in pin 1'ine bağlı LED yanar. Kesme kaynağı port 2'ye ait olduğunda, port 1'in pin2'sine bağlanan LED yanar.
#pragma vektör = PORT1_VECTOR __interrupt void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; for (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vektör = PORT2_VECTOR __interrupt void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; for (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
CCS'den MSP430'a Program Yükleme
Projeyi başlatma çubuğuna yüklemek ve hatalarını ayıklamak için, projeyi seçin ve araç çubuğundaki hata ayıklama simgesine tıklayın. Alternatif olarak, hata ayıklama moduna girmek için F11'e basın veya RunàDebug'a tıklayın.
Hata ayıklama moduna girildikten sonra, MCU'da yüklü kodu serbestçe çalıştırmak için yeşil renkli çalıştır düğmesine basın. Şimdi, basma düğmesine basıldığında, kenardaki değişiklikle kesme tetiklenir, böylece LED'in durumunda değişiklik istenir.
MSP430'da Programı Kesme
Kod başarıyla yüklendikten sonra, sadece butonu kullanarak test edebiliriz. LED düzeni, basma düğmesi kullanılarak bir kesinti verildiğinde programımıza göre değişecektir.
Tam çalışma aşağıda bağlantısı verilen videoda bulunabilir. Umarım öğreticiden keyif almışsınızdır ve yararlı bir şeyler öğrenmişsinizdir. Herhangi bir sorunuz varsa, bunları yorum bölümüne bırakın veya diğer teknik sorular için forumlarımızı kullanın.