1

マイクロ コントローラーについて学び始めたばかりで、タイマーを使用せずにコードに遅延を導入する方法を理解できませんでした。私のボードには 16MHZ のクロックがあります。ボタンが押されたかどうかを確認する前に、5 ミリ秒の遅延を導入したいとしましょう。5 ミリ秒の遅延を得るために実行する必要がある命令の数をどのように特定し、どのようにプログラムしますか? これを行う標準化された方法はありますか?非常に標準的なもののように見えますが、どのように行われるのか理解できません。

Atmega 328 Arduino unoでアセンブリ言語を使用してプログラミングしています。

4

1 に答える 1

6

一般に、バーンするのに必要なクロック サイクル数を計算してから、ループを記述します。データシートを参照して、ループにかかるサイクル数を決定し、必要な反復回数を計算してください。

       ldi r16, x ; 1 cycle
loop:  nop        ; 1 cycle
       dec r16    ; 1 cycle
       brne loop1 ; 2 cycles when jumping, 1 otherwise

の値に応じてx、このループにはx * 4サイクルがかかります。16MHz ボードでは 1ms は 16000 サイクルなので、5ms は 80000 サイクルになります。これは、この 8 ビット ループが管理できる範囲を超えているため、16 ビット カウンターを作成する必要があります。

       ldi r16, x ; 1 cycle
       ldi r17, y ; 1 cycle
loop:  nop        ; 1 cycle
       dec r16    ; 1 cycle
       brne skip  ; 2 cycles when jumping, 1 otherwise
       dec r17    ; 1 cycle
skip:  brne loop  ; 2 cycles when jumping, 1 otherwise

さて、ループ本体は反復ごとに 6 サイクルかかるようになりました。r16がラッピングされているかどうかに関係なく、6 サイクルであることに注意してください。セットアップには 2 サイクルかかりますが、最終的brneには 1 サイクル戻るため、1 サイクルのオーバーヘッドが発生します。つまり、13333 回の反復である 79999 サイクルが必要であり、さらに 1 サイクルが無駄になります。したがってx=low(13333)=21y=high(13333)=52と を追加しnopます。

それが一般的な考え方です。計算を間違えていないことを願っています。この関数を作成する場合は、呼び出しと戻りのオーバーヘッドを考慮してください。また、パラメータ化することもできます。

于 2014-05-05T18:00:20.223 に答える