2

遅延サブルーチンを書く必要があります。約 1 秒遅れるはずです。8051 環境、DS89C430 マイクロコントローラー (11.0592 MHz XTAL) 用である必要があります。このサブルーチンはどのように記述できますか?

Delay1sec: ...
....
...
....
...
4

3 に答える 3

3

割り込み中にも機能する正確な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を使用しました。

于 2011-03-02T00:25:41.767 に答える
2

このマイクロコントローラには、システム クロック (12 分周) に接続された3 つのオンボード タイマー (ユーザーズ マニュアルのセクション 11 を参照) があるため、時間が経過したときに割り込みを生成するようにプログラミングする必要があります。分割された入力は 1 MHz 未満であり、最大のカウンターは 16 ビットであるため、1 秒に到達するには 14 回の割り込みをカウントする必要があります (少なくとも、計算が正しく行われた場合)。

于 2011-02-27T18:28:15.143 に答える
0

A) ハードウェア タイマーを参照します。

B) CPU タイマーを参照する。一部のプロセッサには、クロック ティックで実行される非常に幅の広いタイマー (つまり 64 ビット幅) があります。

C) ソフトウェア ループ。最良の結果を得るには、コードとすべてのデータは、タイミングが予測可能な内部メモリに存在する必要があります。SDRAM から実行すると、タイミングの問題が発生する可能性があります。

組み立てサイクルを数える必要はありません。代わりに、ピンにパルスを「描画」し (ループの前にハイにプルし、ループの後にローにプル)、ロジック アナライザーを使用してパルス幅を測定し、ループ カウントを変更してタイミングを微調整することができます。最良の結果を得るには、周波数カウンターを使用して測定することにより、外部 CPU クロック/クリスタルに対して補正し、中心周波数から離れていることを補正する必要があります。

タイマーを使用してループのタイミングを計算することにより、自己調整できます。

于 2011-03-14T20:47:07.203 に答える