遅延サブルーチンを書く必要があります。約 1 秒遅れるはずです。8051 環境、DS89C430 マイクロコントローラー (11.0592 MHz XTAL) 用である必要があります。このサブルーチンはどのように記述できますか?
Delay1sec: ...
....
...
....
...
遅延サブルーチンを書く必要があります。約 1 秒遅れるはずです。8051 環境、DS89C430 マイクロコントローラー (11.0592 MHz XTAL) 用である必要があります。このサブルーチンはどのように記述できますか?
Delay1sec: ...
....
...
....
...
割り込み中にも機能する正確な1秒の遅延を取得するには、ソフトウェアタイマーではなく、ハードウェアタイマーを使用する必要があります。Jerry Coffinが提案した、利用可能なオンボードタイマーの1つを使用することをお勧めします。
これは、組み込みのタイマーとカウントタイマーのオーバーフローを含むアプローチです。実行中のタイマーは、8051との互換性を維持するために、デフォルトで12クロックサイクルごとに更新されるため、1秒間に921,600回更新されます。少し乗算すると、0から46080までカウントするのに50ミリ秒かかることがわかります。これは、19456で16ビットタイマーを開始し、それが20回オーバーフローして1秒間遅延するのを待つこともできることを示しています*。
コードは次のようになります。
CLR T0M ; set timer 0 to use a divide-by-12 of
; the crystal frequency (default)
MOV R0,TMOD ; set timer 0 to 16-bit mode without
ORL R0,#01h ; affecting the setup of timer 1
MOV TMOD,R0
LCALL Delay1sec ; call the delay subroutine
Delay1sec:
MOV R0,#20d ; set loop count to 20
loop: CLR TR0 ; start each loop with the timer stopped
CLR TF0 ; and the overflow flag clear. setup
MOV TH0,#4Ch ; timer 0 to overflow in 50 ms, start the
MOV TL0,#00h ; timer, wait for overflow, then repeat
SETB TR0 ; until the loop count is exhausted
JNB TF0,$
DJNZ R0,loop
RET
注:命令実行時間のオーバーヘッドは例から除外されています。
*数学の内訳:
11059200/12 = 921600
0.05 * 921600 = 46080
65536-46080 = 19456 = 0x4C00
ソフトウェア遅延ループはプロセッサ時間を浪費し、割り込みによって妨害されます。そうは言っても、ハードコードされた方法でそれを行うことができます。
1つのアプローチでは、マシンサイクルあたりのクロックサイクル数と、さまざまな命令の実行にかかるマシンサイクル数を知る必要があります。データシートによると、DS89C430は通常、命令バイトごとに1マシンサイクルを使用し、実行には1サイクルを必要とします。各命令のサイクル数は、 『超高速フラッシュマイクロコントローラーユーザーズガイド』に記載されています。
水晶周波数は11.0592MHzであるため、ルーチンは11,059,200クロックサイクル遅延する必要があります。これは、多くの場合、既知の長さのネストされたループを介して実行され、追加のループ設定と、場合によってはサブルーチンの呼び出しおよび戻り命令*が含まれます。
関数は次のようになります。
Delay1sec: ; <------------------------------+
; LCALL Delay1sec ; 3 cycles |
MOV R2,#42d ; 2 cycles |
MOV R1,#00d ; 2 cycles |
MOV R0,#00d ; 2 cycles |
loop: DJNZ R0,loop ; 4 cycles <-- l1 <- l2 <- l3 Delay1sec
DJNZ R1,loop ; 4 cycles <---------+ | |
DJNZ R2,loop ; 4 cycles <---------------+ |
RET ; 3 cycles <---------------------+
数学がどのように分解されるか見てみましょう**:
l1
= 4 * 256 = 1024サイクル
l2
=(1024 + 4)* 256 = 263168サイクル
l3
=(263168 + 4)* 42=11053224サイクル
Delay1sec
=11072668+ 3 + 2 + 2 + 2 + 3=11053236サイクル
11053236サイクル*1/11059200秒/サイクル= 999.461ミリ秒
※必要に応じて、サブルーチンの呼び出しと戻りの命令を省略できます。
**ループカウンターの決定に関連する計算を支援するためにMicrosoftExcelを使用しました。
このマイクロコントローラには、システム クロック (12 分周) に接続された3 つのオンボード タイマー (ユーザーズ マニュアルのセクション 11 を参照) があるため、時間が経過したときに割り込みを生成するようにプログラミングする必要があります。分割された入力は 1 MHz 未満であり、最大のカウンターは 16 ビットであるため、1 秒に到達するには 14 回の割り込みをカウントする必要があります (少なくとも、計算が正しく行われた場合)。
A) ハードウェア タイマーを参照します。
B) CPU タイマーを参照する。一部のプロセッサには、クロック ティックで実行される非常に幅の広いタイマー (つまり 64 ビット幅) があります。
C) ソフトウェア ループ。最良の結果を得るには、コードとすべてのデータは、タイミングが予測可能な内部メモリに存在する必要があります。SDRAM から実行すると、タイミングの問題が発生する可能性があります。
組み立てサイクルを数える必要はありません。代わりに、ピンにパルスを「描画」し (ループの前にハイにプルし、ループの後にローにプル)、ロジック アナライザーを使用してパルス幅を測定し、ループ カウントを変更してタイミングを微調整することができます。最良の結果を得るには、周波数カウンターを使用して測定することにより、外部 CPU クロック/クリスタルに対して補正し、中心周波数から離れていることを補正する必要があります。
タイマーを使用してループのタイミングを計算することにより、自己調整できます。