Re: [問題] 89S51 使用 C51 計時問題

看板ASM作者 (呆呆小狼)時間10年前 (2014/06/07 22:41), 10年前編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/3 (看更多)
※ 引述《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://www.ptt.cc/bbs/ASM/M.1402152081.A.BF0.html ※ 編輯: WolfLord (125.230.90.132), 06/07/2014 22:43:52

06/08 09:06, , 1F
感謝<_ _)
06/08 09:06, 1F
文章代碼(AID): #1JaoIHlm (ASM)
文章代碼(AID): #1JaoIHlm (ASM)