標題: pic16f887 TMR0計時器講解及準確定時程序 [打印本頁]
作者: 51黑ele 時間: 2016-5-16 01:27
標題: pic16f887 TMR0計時器講解及準確定時程序
一、前言
TMR0 計時器
實際上 TMR0 計時器的應用很廣。很少程式不用到它。它非常方便,而且很容易用來撰寫產生任意期 間的脈沖的程式或副程式(subroutine)、測量時間,或是計數外部脈沖 (事件),幾乎沒有什么限制。
TMR0 計時器模組是 8 位元的計時器/計數器,具有下列特性:
● 8 位元計時器/計數器;
● 8 位元 prescaler (與 Watchdog timer 共享);
● 可程式的內部或外部時脈來源 (Programmable internal or external clock sources);
● 溢位中斷 (Interrupt on overflow); 及
● 可程式選擇的外部時脈邊緣 (Programmable external clock edge selection)。
二、原理與暫存器設定說明
原理:
OPTION_REG 暫存器
1.002.jpg (14.78 KB, 下載次數: 195)
下載附件
2016-5-16 01:29 上傳
1.003.jpg (15.41 KB, 下載次數: 217)
下載附件
2016-5-16 01:29 上傳
1.004.jpg (49.76 KB, 下載次數: 222)
下載附件
2016-5-16 01:29 上傳
1.005.jpg (33.81 KB, 下載次數: 223)
下載附件
2016-5-16 01:29 上傳
1.006.jpg (29.08 KB, 下載次數: 210)
下載附件
2016-5-16 01:29 上傳
可以看出,PSA 位元的邏輯狀態決定 prescaler 指派給 TMR0 或是 watchdog timer。
另外,值得一提的是:
● 當 prescaler 指派給 TMR0 時,任何對 TMR0 暫存器的寫入動作將會清除 prescaler;
● 當 prescaler 指派給 watchdog timer 時,CLRWDT 指令將同時清除 prescaler 與 WDT;
● 當 TMR0 作為計時器用時,對 TMR0 的寫入動作不會讓脈沖計數立即開始,而會有兩個指令周期 的延遲。因此,有必要調整寫到TMR0 的值;
● 當微控制器被設成睡眠模式時,振蕩器便會關閉。因為沒得計數脈沖,所以就不會發生溢位 (overflow)。這就是為什么 TMR0 溢位不能將微控制器從睡眠模式中喚醒的原因;
● 當用作不含 prescaler 的外部時脈計數器時 (external clock counter),最小的脈沖長度或兩個脈 沖之間的間歇必須是 2 Tosc + 20 nS. Tosc 是振蕩訊號周期 (oscillator signal period);
● 當用作含 presacler 的外部計數器時,最小的脈沖長度或兩個脈沖之間的間歇必須是 10nS;
● 8 位元 prescaler 暫存器不提供給使用者,這表示不能直接讀寫 prescaler 暫存器;
當從 TMR0 將 prescaler 指派給 watchdog timer 時,必須按下列指令次序執行以免發生重置 (reset):
view source print?
01 BANKSEL TMR0 02 CLRWDT ;CLEAR WDT 03 CLRF TMR0 ;CLEAR TMR0 AND PRESCALER 04 BANKSEL OPTION_REG 05 BSF OPTION_REG,PSA ;PRESCALER IS ASSIGNED TO THE WDT 06 CLRWDT ;CLEAR WDT 07 MOVLW b’11111000’ ;SELECT BITS PS2,PS1,PS0 AND CLEAR 08 ANDWF OPTION_REG,W ;THEM BY INSTRUCTION “LOGICAL AND” 09 IORLW b’00000101’ ;BITS PS2, PS1, AND PS0 SET 10 MOVWF OPTION_REG ;PRESCALER RATE TO 1:32
● 同樣的,當從 WDT 將 prescaler 指派給 TMR0 時,必須按下列指令次序執行以免發生重置:
view source print? 1 BANKSEL TMR0 2 CLRWDT ;CLEAR WDT AND PRESCALER 3 BANKSEL OPTION_REG
4 MOVLW b’11110000’ ;SELECT ONLY BITS PSA,PS2,PS1,PS0 5 ANDWF OPTION_REG,W ;CLEAR THEM AFTERWARDS BY INSTRUCTION 6 ;“LOGICAL AND” 7 IORLW b’00000011’ ;PRESCALER RATE IS 1:16 8 MOVWF OPTION_REG
暫存器設定說明:
為了恰當地使用 TMR0,必須:
1、要選擇模式:
● 計時器模式是借由 OPTION_REG 暫存器的 T0CS 來選擇。 (T0CS: 0=timer, 1=counter);
● 使用的時候,必須借由清除 OPTION_REG 暫存器的 PSA 位元將 prescaler 指派給 TMR0。 prescaler 比率 (Prescaler rate) 的設定是透過OPTION_REG 暫存器的 PS2-PS0 位元,及
● 使用中斷時,必須設定 INTCON 暫存器的 GIE 與 TMR0IE 位元。
2、要測量時間:
● 重設 TMR0 暫存器或寫入已知的值到 TMR0;
● 經過時間 (單位是毫秒,當使用 4 MHz 石英晶體時) 的獲得方式是透過讀取 TMR0 暫存器
● 每當 TMR0 暫存器溢位時,INTCON 暫存器的 TMR0IF 旗號便會自動豎起來,如果中斷有啟用, 會引發中斷。
3、要計數脈沖:
● 位于 RA4 腳位,要計數的脈沖極性 (polarity) 的選擇是透過設定 OPTION_REG 暫存器的 T0SE 位元 (T0SE: 0=負向緣, 1=正向緣); 及
● 脈沖數可從 TMR0 暫存器中取得。如同計時器模式,presacler 和中斷的用法是一樣的。
三、程式與電路圖
程式:
// FOSC=16MHz Fcy=4Mhz Tcy=1/Fcy
#include
__CONFIG ( FOSC_HS & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF ); //配置位元設置為外接晶振
__CONFIG ( BOR4V_BOR40V & WRT_OFF );
unsigned char data=0;//定義變數data并賦值為0
main()
{
unsigned int i=0;//定義i為無符號整形并賦值為0
T0CS=0; // 選通Fosc/4
PSA=0; //設定為用TIMER0,而不是WDT
PS2=0; //1:16 預除4倍,數完250次=(4MHz/1)*250=1ms
PS1=1;//PS2,PS1,PS0為除頻設置
PS0=1;
T0IF=0;//設置溢位初始值為0
TMR0=6; //預設TMR0=6,運行250次會進位
TRISD=0;// 埠初始化D0--D7設置為輸出
PORTD=0; //D埠輸出低電頻,8個LED全滅掉
data=0b00000001;//data賦值為1
while(1) // 主回圈必須是閉環
{
if(T0IF==1)//如果溢位為1則執行if下語句
{
T0IF=0; //if成立將溢位再次置0
i++; //i=i+1
if(i==1000) //i=1000時執行下面語句
{
i=0; //i重新置0,進行下一輪計時
data=data<<1; //data左移1位
if(data==0) //如果data=0時執行下面語句
data=0b00000001; //data重新置為1
PORTD=data; //D埠輸出資料為data
TMR0=6;//使TMR0等于6
}
}
}
}
電路圖:
1.007.jpg (32.21 KB, 下載次數: 209)
下載附件
2016-5-16 01:29 上傳
四、結論
1.008.jpg (52.55 KB, 下載次數: 219)
下載附件
2016-5-16 01:29 上傳
1.009.jpg (50.63 KB, 下載次數: 199)
下載附件
2016-5-16 01:29 上傳
1.010.jpg (44.17 KB, 下載次數: 220)
下載附件
2016-5-16 01:29 上傳
1.011.jpg (47.74 KB, 下載次數: 217)
下載附件
2016-5-16 01:29 上傳
1.012.jpg (48.32 KB, 下載次數: 230)
下載附件
2016-5-16 01:29 上傳
1.013.jpg (44.22 KB, 下載次數: 174)
下載附件
2016-5-16 01:29 上傳
1.014.jpg (45.24 KB, 下載次數: 180)
下載附件
2016-5-16 01:29 上傳
1.015.jpg (47.73 KB, 下載次數: 200)
下載附件
2016-5-16 01:29 上傳
程序打包下載:http://www.zg4o1577.cn/bbs/dpj-50261-1.html
作者: YJGG 時間: 2016-5-17 07:06
謝謝樓主分享!
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
蜜桃av一区二区三区
|
久久亚洲春色中文字幕久久久
|
中国美女撒尿txxxxx视频
|
国产欧美日韩在线播放
|
91精品国产综合久久精品图片
|
99色综合|
一区二区三区视频在线免费观看
|
在线观看中文字幕dvd播放
|
一区二区成人
|
午夜影院在线观看视频
|
国产7777|
久久成人高清视频
|
亚洲精品免费看
|
日韩a在线
|
日韩在线国产
|
日韩成人
|
有码一区
|
日韩中文字幕第一页
|
欧美日韩国产精品一区
|
正在播放国产精品
|
国产精品伦理一区二区三区
|
日本超碰|
欧美a∨
|
欧美国产日韩在线
|
午夜视频在线观看网站
|
欧美视频 亚洲视频
|
成人免费精品视频
|
免费在线看a
|
欧美亚洲国产精品
|
国产精选一区
|
久久69精品久久久久久久电影好
|
国产专区在线
|
在线观看中文字幕
|
亚洲欧美中文日韩在线v日本
|
香蕉大人久久国产成人av
|
久久久91精品国产一区二区三区
|
午夜私人影院在线观看
|
欧美日韩不卡合集视频
|
中文字幕av高清
|
99精品国产一区二区青青牛奶
|
伊人网综合在线观看
|