一般に、バーンするのに必要なクロック サイクル数を計算してから、ループを記述します。データシートを参照して、ループにかかるサイクル数を決定し、必要な反復回数を計算してください。
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)=21
、y=high(13333)=52
と を追加しnop
ます。
それが一般的な考え方です。計算を間違えていないことを願っています。この関数を作成する場合は、呼び出しと戻りのオーバーヘッドを考慮してください。また、パラメータ化することもできます。