一、定時/技術器的基本原理
定時/計數器,是一種能夠對內部時鐘訊號或外部輸入訊號進行計數,當計數值達到設定要求時,向cpu提出中斷處理請求,從而實現定時或者計數功能的外設。
定時/計數器的最基本工作原理是進行計數。不管是定時器還是計數器,本質上都是計數器,可以進行加1(減1)計數,每出現乙個計數訊號,計數器就會自動加1(自動減1),當計數值從0變成最大值(或從最大值變成0)溢位時,定時/計數器就會向cpu提出中斷請求。
二、cc2530的定時/計數器
cc2530共有5個定時/計數器,其中定時器1是乙個16位的定時器,為cc2530中功能最全的乙個定時/計數器,在 應用中應優先選用。定時器1的工作模式有三種:
<1>自由執行模式:計數器從0x0000開始,在每個活動 時鐘邊沿增加1,當計數器達到0xffff時溢位,計 數器重新載入0x0000並開始新一輪的遞增計數。該 模式的計數週期是固定值0xffff,當達到最終計數 值0xffff時,標誌位t1if和ovfif被設定。
<2>模模式:計數器從0x0000開始,在每個活動時鐘邊 沿增加1,當計數器達到t1cc0暫存器儲存的值時 溢位,計數器又將從0x0000開始新一輪的遞增計數, 模模式的計數週期可由使用者自行設定。
<3>正計數/倒計數模式:計數器反覆從0x0000 開始,正計數到ticc0儲存的最終計數值,然後再倒計數回0x0000,當達到最終計數值時,標誌位t1if和ovfif被設定。
三、cc2530的定時/計數器中斷系統
定時器有3種情況能產生中斷請求:
<1> 計數器達到最終計數值(溢位或回到零)。
<2> 輸入捕獲事件。
<3> 輸出比較事件(模模式時使用)。
使用模模式要特別注意,需要開啟通道0的輸出比較模式,否則計數器的 值達到t1cc0後,是不會產生溢位中斷的。
設定定時器1的最大計數值
定時器1共有5對t1ccxh和t1ccxl暫存器,分別對應通道0到通道4。在使用定時器1的定時功能時,使用t1cc0h和t1cc0l兩個暫存器存放最大計數值的高8位和低8位。
最大計數值 = 定時時長 / 定時器計數週期。
在本實訓中,系統時鐘為16mhz,分頻係數為128,要定時0.1秒,最大計數值為:
定時器初始化函式設計
<1> 將定時器1的最大計數值寫入t1cc0。
<2> 通過t1cctl0暫存器開啟定時器1通道0的輸出比較模式。
<3> 設定定時器1的相關中斷控制位。
<4> 設定分頻係數和工作模式並啟動定時器。
定時器中斷服務函式設計
<1> 清除t1stat的中斷標誌位。
<2> 累加全域性變數count。
<3> count被10整除即1秒的定時到了。
<4> 10秒定時到將count清零。
#include "定時器1 有5個通道不怎麼明白這5個通道有什麼用,因為經過我的實驗,這五個通道所裝載的值都是通道1所裝在的值只是產生的中斷標誌位不一樣,並不像我想象的那樣,五個通道可以裝載不同的計數值iocc2530.h
"#define led5 p1_3
#define led6 p1_4
/****************定時器1初始化函式***************===
*/void
init_timer1()
unsigned
char count = 0
; /*
***************=定時器1服務函式********************
*/#pragma vector = t1_vector__interrupt
void
timer1_sevice()
if(count == 100) //
定時10秒到}/*
***************==埠初始化函式********************
*/void
init_port() /*
***************====主函式*************************
*/void
main()
1 #include 23#define uint unsigned int
4#define uchar unsigned char56
7#define led1 p1_0
8#define led5 p1_1
9#define led6 p1_4
10/*
***************定時器1初始化函式***************===
*/11
void
init_timer1()
1234
35 unsigned char count = 0
; 36 unsigned char count1 = 0
; 37 unsigned char count2 = 0
; 38
/****************=定時器1服務函式********************
*/39
#pragma vector = t1_vector
40 __interrupt void
timer1_sevice()
415354}
55else
if((t1stat & 0x02) != 0)56
6465}66
67else
if((t1stat & 0x04) != 0)68
7677}78
79}80/*
***************==埠初始化函式********************
*/81
void
init_port()82
89/*
***************====主函式*************************
*/90
void
main()
91
zigbee基礎應用(四)定時器
1.暫存器相關 舉個栗子 t1ctl 0x0d 128分頻,自動重灌 0x0000 0xffff t1stat 0x21 通道0,中斷有效 2.程式案例 描述 通過定時器t1查詢方式控制led1周 期性閃爍 include define uint unsigned int define uchar ...
Zigbee基礎實驗學習 電池板的點燈實驗
新手學zigbee,利用光碟資料做的小實驗,記錄下遇到的錯誤以及解決方法。實驗操作步驟 1 iar embedded workbench開啟cc2430 sw examples工程 2 直接rebuilt出現錯誤 fatal error e62 file name d zigbee資料庫 cc243...
無線感測網 zigbee基礎實驗 點對點通訊
標頭檔案 1 include 2 3 include hal mcu.h 4 include hal assert.h 5 include hal board.h 6 include hal rf.h 7 8 include 9 include basic rf.h 10 11 define nod...