作者WolfLord (呆呆小狼)
看板ASM
標題Re: [問題] 89S51 使用 C51 計時問題
時間Sat Jun 7 22:41:15 2014
※ 引述《a45601236qq (Ming)》之銘言:
: 今天試著做一下模擬 ms 計算的(高階語言 sleep 都喜歡以 1ms * n 為單位)
你沒說明你的環境, 假設這邊是使用12MHZ時鐘,一個M週期是1uS
: void timer1_isr() interrupt 3
: {
: TL1 = ( 65536 - 1000 ) % 256;
: TH1 = ( 65536 - 1000 ) / 256;
: Timer1Ms -= 1;
: if (Timer1Ms == 0)
: {
: Timer1Ms = Timer1Value;
: P1_2 = ~(P1_2);
: }
: }
這段有點問題:你的中斷發生到跳進ISR需要兩個M週期,ISRVECT的JMP
指令也要兩個M。然後你沒使用BANK(using X)所以會PUSH A,F R0~R7
10組資料每一個PUSH都要兩個M 然後設定TH TL 要2*2個M,所以你額外
的計時週期為28個M,所以你的T1算式應當為 (65536-(1000-28))
下面我的計時系統程式為說明:
Header:
#ifndef CRYSTALFREQ
#ifndef _EM6T
#define CRYSTALFREQ 24000000
#else
#define CRYSTALFREQ 48000000
#endif
#endif
#ifndef INSFREQ
#define INSFREQ (CRYSTALFREQ/12)
#endif
#ifndef TIMERREQ
#define TIMERFREQ (CRYSTALFREQ/12)
#endif
#define __FREQBASE__ (65536-((TIMERFREQ/1000)-13))
#define __VTH (__FREQBASE__/256)
#define __VTL (__FREQBASE__%256)
#define _HSdv 9
#define _TSdv 9
#define _OSdv 9
/********************************************************************/
isr.c
unsigned char _hsc=_HSdv;
unsigned char _tsc=_TSdv;
unsigned char _osc=_OSdv;
bit _msf;
bit _hsf;
bit _tsf;
bit _osf;
/********************************************************************/
void _T0ISR(void) interrupt intT0 using 1{
TR0=0;
TH0=__VTH;
TL0=__VTL;
TR0=1;
_msf=1;
if(_hsc>0){_hsc--;}else{
_hsc=_HSdv;
_hsf=1;
if(_tsc>0){_tsc--;}else{
_tsc=_TSdv;_tsf=1;
if(_osc>0){_osc--;}else{
_osc=_OSdv;_osf=1;
}
}
}
TF0=0;
}
/********************************************************************/
這裡因為使用Bank1 所以少了8個PUSH16個週期但是我多了一個把TIMER暫停
28-16+1=13 所以overhead 為13個M 算數式為(65536-((TIMERFREQ/1000)-13))
因為第零LEAP會被用來重至資料所以他也佔用時間,所以計數器均從9倒數。
--
劍兮,劍兮,食無魚,行無車,無以家養,不如歸去不如歸去~~ ▁▁
-= A23203 =- ▕武羅▏
BM4GRM Harlock WolfLord ▕夫得▏
 ̄ ̄
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.230.90.132
※ 文章網址: http://webptt.com/m.aspx?n=bbs/ASM/M.1402152081.A.BF0.html
※ 編輯: WolfLord (125.230.90.132), 06/07/2014 22:43:52
1F:推 a45601236qq:感謝<_ _) 06/08 09:06