| I. 前回からの続き 前回は、簡単な外部割り込みの実装を一緒に学びました。CC2430には4つのタイマがあり、タイマ1、タイマ2、タイマ3/4(タイマ3とタイマ4の使い方は同じ)の3つに分けられます。 筆者もCC2430を触ったばかりで、タイマーに関わるプロジェクトの経験は基本的にゼロなので、タイマーの詳細な解析をするつもりはない(お手伝いもできない)。この記事では、タイマ1のカウントオーバーフロー割り込みの使い方を簡単に実験してみるだけで、その入力キャプチャ/出力比較/PWM機能については省略する。タイマ2とタイマ3/4についても簡単に紹介する。筆者のパワーが一定の火に達するのを待って、Zigbeeの戦闘経験の高さに立って、このエッセイを改善する。 タイマー1 Timer1はタイマ/カウンタ/パルス幅変調機能を持つ16ビットタイマである。個別にプログラム可能な3つの入力キャプチャ/出力比較チャンネルを持ち、それぞれをPWM出力として使用したり、入力信号のエッジ時間をキャプチャするために使用したりできる(入力キャプチャ/出力比較とは何か、PWM出力をどのように実装するかについての詳細は、読者各自でCC2430の中国語マニュアルを参照されたい)。 タイマーには、動作モードという非常に重要な概念がある。 動作モードには、フリーラン、モジュロ、アップダウンがある。 以下は、CC2430中国語マニュアルからの3つのモードの紹介です:
3つのモードを比較すると、フリーランニング・モードのオーバーフロー値は0xFFFFで変更できないが、他の2つのモードはT1CC0に値を代入することで、タイマーのオーバーフロー値を正確に制御できることがわかる。本実験では、この機能を利用し、T1CC0に値を割り当てることで、タイマーを1秒ごとに割り込みを発生させ、LEDの点滅間隔を1秒単位で正確に制御する。 (1) 実験の導入 タイマーのモジュロ・モードでは、LEDの点滅間隔を1秒に正確に制御する、すなわち、明0.5秒→暗0.5秒→明0.5秒→暗0.5秒......とする。 → 明0.5s → 暗0.5s(つまり、暗から明への遷移の瞬間は1s)。明暗の反転はオーバーフロー割り込みによって実現される。 (2)プログラムフローチャート (3) 関連計算 前述したように、LEDの状態は、明0.5s → 暗0.5s → 明0.5s → 暗0.5s .... → そのために、対応するオーバーフロー値を計算する必要がある(一時的にNとする)。 システム・クロック周波数は32MHzに選択され、タイマーに供給されるクロック周波数はデフォルトで16MHzである(いずれも、CC2430中国語マニュアルにある特殊機能レジスタ CLKCONによって 設定される)。 タイマー1については、そのクロック周波数を128分周に設定する。 まとめると、計算式は次のようになります: .gif")
c N=62500を調べ、その16進数は0xF424、つまり、T1CC0H = 0xF4、T1CC0L = 0x24を設定する必要があります。
(4) 実験ソースコードと解析/* 実験内容: タイマー1の実験、タイマーカウントオーバーフロー、LED1点滅 * / # include #define led1 P1_0 # define led2 P1_1 #define led3 P1_0 #define led3 P1_1
1 #define led3 P1_2 #define led4 P1_3 &
nbsp; /* システムクロックの初期化------------------------------------------------------------------------*/void xtal_init(void) { SLEEP &=~0x04;& nbsp; // 両方の電源投入while(! (SLEEP & 0x40)); //水晶発振器オン、安定 CLKCON &=~0x47; & nbsp; // 水晶発振器選択。
nbsp; //32MHz水晶発振器選択 SLEEP |=0x04; }/*LED初期化-------------------------------------------------------*/void led_init(void) { & nbsp; P1SEL = 0x00; //P1は通常のI/Oポート P1DIR |=0x0F; & nbsp; //P1.0 P1.1 P1.2 P1.3 出力 led1 =1; &
nbsp; //全てのLEDを消灯 led2 =1; led3 =1; led4 =1; }/*T1 の初期化----------------------------
----------------------------*/void timer1_init(void) {EA=1; // トータル割り込みをオンにする & nbsp;T1IE=1; // T1割り込みをONOVFIM=1; // T1オーバーフローをON
割り込み T1CC0L=0x24; //オーバーフロー値下位8ビット T1CC0H=0xF4; //オーバーフロー値上位8ビット &
nbsp; T1CTL =0x0e; //128分割、モジュロモード(0x0000->T1CC0); 実行開始;T1IF=0; &
nbsp; // 割り込みフラグをクリア }/* メイン関数--------------------------------------------------------*/void main(void
) { xtal_init(); led_init(); timer1_init();while(1); &
nbsp; //オーバーフロー割り込み待ち }/*T1ターミナルサービスサブルーチン---------------------------------------*/#pragma vector=T1_VECTOR __interrupt
v oid T1_ISR(void) {EA=0; //割り込みオフ led1 = !
led1; //LED反転EA=1; //割り込み中  
; T1CTL &=~0x10; // 割り込みフラグをクリア }.
OK]を、プログラムをコンパイルし、オンラインデバッグは、LED1の開発ボードは、期待どおりに点滅し、約1秒の点滅間隔を感じる。 しかし、これは実験の成功を証明するには十分ではありません、あなたは厳密に1秒の間隔を決定することができれば完璧だろう〜ので、私はWIN 7の時計を(タスクバーの時間の右側をクリックするとすることができます)開いた。秒針を見ながら、目の端で点滅するLED1をちらっと見た。結果は:2分で、2つのペースは基本的に同じです(この精度は許容することができます〜)。この時点で、実験は基本的に完了したと言える。 タイマー2 タイマー2は MACタイマーとも呼ばれ、IEEE 802.15.4 MACのイベントトラッキングプロトコルをサポートするために特別に設計されています。このタイマーには、発生したサイクル数を記録するために使用できる8ビットのオーバーフローカウンターがあり、フレーム開始デリミターが受信/送信された正確な時間、または送信が完了した正確な時間を記録するために使用される16ビットのキャプチャレジスタがあり、また、特定の時間(受信開始、送信開始など)に無線モジュールに様々なコマンド選択通信信号を生成するために使用される16ビットの出力比較レジスタがあります。 タイマー3/4 タイマ3/4はタイマ/カウンタ/PWM機能を持つ8ビット・タイマです。t3/t4には2つの出力比較チャネルがあり、それぞれPWM出力として使用できます。 V. まとめ このセクションでは、タイマ 1 のオーバーフロー割り込みのカウント方法を学び、LED 点滅間隔 1 秒の正確な制御を実現しました。次の章では、CC2430のシリアル・ポート通信について紹介する。
|