|
1. Üst ve alt katların birbirine bağlanması Önceki makalede, basit harici kesintilerin uygulanmasını birlikte öğrendik. Artık kesintilerle ilgili uygulamalı deneyimimiz olduğuna göre, bu bölümde zamanlayıcı kesintileri hakkında konuşalım. CC2430'un toplamda 4 zamanlayıcısı vardır ve bunlar 3 kategoriye ayrılabilir: zamanlayıcı 1, zamanlayıcı 2, zamanlayıcı 3/4 (3 ve 4'ün kullanımı aynıdır). Yazar da CC2430'a yeni ve zamanlayıcılarla ilgili projelerde neredeyse hiç pratik deneyimi olmadığı için, zamanlayıcıyı derinlemesine analiz etmeyi niyetim yok (ve yapamam). Bu makale, sayma taşma kesintilerinde zamanlayıcı 1'in kullanımına dair kısa bir deneysel inceleme sunar ve giriş yakalama/çıktı karşılaştırması/PWM fonksiyonlarından bahsetmez. Zamanlayıcı 2 ve Zamanlayıcı 3/4 sadece basit fonksiyon girişimleridir. Yazarın becerileri belli bir sıcaklık seviyesine ulaştıktan sonra, bu makaleyi geliştirmek için Zigbee'nin pratik deneyiminin zirvesinde duracağım. 2. Zamanlayıcı 1Zamanlayıcı 1, zamanlayıcı/sayaç/darbe genişliği modülasyonuna sahip 16 bitlik bir zamanlayıcıdır. Her biri PWM çıkışı olarak veya giriş sinyalini yakalamak için kenar zamanı olarak kullanılabilen 3 ayrı programlanabilir giriş yakalama/çıkış karşılaştırma kanalı vardır (giriş yakalama/çıkış karşılaştırmasının ne olduğu ve PWM çıkışının nasıl uygulanacağı hakkında bilgi için okuyucular CC2430 Çin kılavuzuna başvurabilir). Zamanlayıcıların çok önemli bir kavramı vardır:Çalışma şekli。 Çalışma modları şunlardır: Serbest çalışma modu (serbest koşu), kalıp modu (Modülo) ve Pozitif Sayım/Geri Sayım Modu (Yukarı-aşağıya)。 Aşağıda, 3 modun tanıtımı için CC2430 Çin kılavuzundan bir alıntı verilmiştir:
Üç modun karşılaştırılmasında, serbest çalışma modunun taşma değerinin 0xFFFF değiştirilemez olduğu görülebilir; Diğer iki mod, T1CC0'a bir değer atayarak zamanlayıcının taşma değerinin hassas kontrolünü sağlar. Bu deney, belirli bir T1CC0 üzerinden zamanlayıcı tarafından her 1 saniyede bir kesinti tetiklemek için bu özelliği kullanır; böylece LED ışığının yanıp sönme aralıklarını 1 saniyeye doğru doğru kontrol eder. (1) Deneye girişZamanlayıcının modülo modunda, LED ışığın yanıp sönme aralığı 1s ile hassas şekilde kontrol edilir; yani: parlak 0.5 saniye → koyu 0.5 saniye → parlak 0.5 saniye → loş 0.5 saniye...... → Açık 0.5s → Koyu 0.5s (yani, karanlıktan aydınlığa olan zaman aralığı 1s'tir). Işık/koyu tersis, taşan kesintilerle sağlanır. (2) Program akış şeması
(3) İlgili hesaplamalarDaha önce belirtildiği gibi, LED ışığın durumu şöyle: parlak 0.5s → koyu 0.5s → parlak 0.5s → loş 0.5s ...... → 0.5s ışık → 0.5s karanlık ve bu durum taşma kesintileriyle uygulanmalıdır, bu yüzden zamanlayıcının taşma süresi 0.5s olmalıdır. Bunu yapmak için, karşılık gelen taşma değeri hesaplanmalıdır (geçici olarak N olarak ayarlanır). Sistem saat frekansı 32MHz olarak seçilir ve verilen saat frekansı varsayılan olarak 16MHz'dir (her ikisi de özel fonksiyon kayıtları tarafından belirlenir).CLKCONDetaylar için lütfen CC2430 Çin kılavuzuna bakınız). Timer 1 için saat geçişini 128 bölüme ayarlayın. Özetle, liste şöyledir:
N=62500'ü bulmak için onaltılık sayı 0xF424, yani T1CC0H=0xF4, T1CC0L=0x24 ayarlarınız gerekir. (4) Deneysel kaynak kodu ve analiz/*
Deney açıklaması: Zamanlayıcı Zamanlayıcı 1 deneyi, zamanlayıcı sayısı taşması, LED1 yanıp sönmesi
*/
#include
#define lead1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
Voidxtal_init(Void)
{ UYKU &= ~0x04; //都上电
while(! (UYKU &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; 32MHz kristal osilatör seçin UYKU |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
Voidled_init(Void)
{ P1SEL =0x00; P1 normal I/O portudur P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 çıkışı
led1 =1; //关闭所有LED led2 =1; led3 =1; led4 =1;
}
/*T1初始化
-------------------------------------------------------*/
Voidtimer1_init(Void)
{ EA=1; //开总中断 T1IE=1; //开T1中断 OVFIM=1; //开T1溢出中断
T1CC0L=0x24; //溢出值低8位 T1CC0H=0xF4; //溢出值高8位
T1CTL =0x0e; 128 crossover; modülo mod (0x0000->T1CC0); Koşmaya başla; T1IF=0; Kesinti işaretini temizleyin
}
/*主函数
-------------------------------------------------------*/
Voidmain(Void)
{ xtal_init(); led_init(); timer1_init();
while(1); //等待溢出中断
}
/*T1终端服务子程序
-------------------------------------------------------*/
#pragma vektör=T1_VECTOR __interruptVoidT1_ISR(Void)
{ EA=0; //关中断
led1 = !led1; //LED灯反转
EA=1; //开中断
T1CTL &= ~0x10; //清中断标志
}
Tamam, programı derleyin ve çevrimiçi hata ayıklayın, geliştirme kartındaki LED1 planlandığı gibi yanıp sönüyor ve yanıp sönme aralığı yaklaşık 1 saniye gibi hissediliyor. Ama bu deneyin başarısını kanıtlamak için yeterli değil, eğer aralık kesin olarak 1s olarak belirlenebilirse, mükemmel olur~ Bu yüzden WIN 7 saatini açtım (görev çubuğunun sağ tarafındaki zamana tıklayın). İkinci eliyle bakarken, göz ucuyla LED1'in yanıp söndüğüne baktı. Sonuç olarak, iki dakika içinde ikisinin temposu temelde tamamen aynı olur (bu hassasiyet tolere edilebilir~). Bu noktada, deney temelde tamamlanmış sayılabilir, hehe~ 3. Zamanlayıcı 2Zamanlayıcı 2 de olarak adlandırılırMAC zamanlayıcı, IEEE 802.15.4 MAC'te olay takip protokolünü desteklemek için özel olarak tasarlanmıştır. Zamanlayıcı, gerçekleşen döngü sayısını kaydetmek için kullanılabilen 8 haneli taşma sayacı vardır; Bir kareye tam olarak ne zaman almaya başladığını/göndermeye başladığını veya iletimin tam tamamlanma zamanını kaydeden 16 bitlik bir yakalama kaydı vardır. Ayrıca, belirli bir zamanda kablosuz modüle çeşitli komut geçitleri sinyalleri (başlatma kabul, başlatma gönderme vb.) üreten 16 bitlik çıkış karşılaştırma registri içerir. 4. Zamanlayıcı 3/4Timer 3/4, zamanlayıcı/sayaç/PWM fonksiyonuna sahip 8 bitlik bir zamanlayıcıdır. T3/T4'ün her biri PWM çıkışı olarak kullanılabilen 2 çıkış karşılaştırma kanalı vardır. 5. SonuçBu bölüm esas olarak zamanlayıcı 1'in sayım taşma kesintisi yöntemini öğrenir ve LED ışık yanıp sönme aralığının 1 saniyelik hassas kontrolünü gerçekleştirir. Sadece birkaç başka zamanlayıcı sadece bir darbe gibi, sonra tekrar ekleyeceğim. Bir sonraki bölümde CC2430 seri port iletişimini tanıtacağız.
|