PIC12/16F Software delay その3

PIC12/16Fでのタイマをつかわないソフトウェアでの一定時間の時間稼ぎプログラムの時間計算方法について。
20MHz動作でも10秒以上を設定できる3段階のネストまで拡張。


○ネストが3段階のとき
3段階までのネストで、システムクロックfOSC=20MHzの場合でも、10秒以上のdelayを作成することができます。これ以上の時間を消費させるアプリケーションでは、sleep等も検討すべきでしょう。

さしあたって、汎用レジスタの確保。
        udata   H'20'
TMP res D'3'


コード本体
        movlw   x
movwf TMP
movlw y
movwf TMP+D'1'
movlw z
movwf TMP+D'2'
LOOP
;xのネスト
decfsz TMP,F
goto LOOP
;yのネスト
decfsz TMP+D'1',F
goto LOOP
;zのネスト
decfsz TMP+D'2',F
goto LOOP


(a) zとyのネストについて
ネストが2段階のときまでの考察より、それぞれ(3z-1)サイクルと{(3y-1)+767(z-1)}サイクルとなります。

(b) xのネストについて
最初の1順は、(3x-1)サイクル、それ以降は1順あたり(3*256-1)サイクルかかります。
yのネストは、z回実行され、そのうちの(z-1)回はxのネストを256回必要とします。残りの1回は、xのネストをy回必要とします。

よって、xのネストの実行回数は(z-1)*256回。前述のとおり、xのネストは最初の1回のみ(3x-1)サイクル、それ以降は(3*256-1)サイクルとなるので、xのネストの実行サイクルは

(3x-1)+(3*256-1)*{(z-1)*256+y-1}

x,y,zのネストと代入の6サイクルをあわせて

197122z+770y+3x-197883サイクル

となります。

tag: PIC アセンブラ 

PIC12/16F Software delay その2

PIC12/16Fでのタイマをつかわないソフトウェアでの一定時間の時間稼ぎプログラムの時間計算方法について。
少し長い時間を設定できるネストを2段階まで拡張。


○ネストが2段階のとき
769cycleよりも長いディレイが必要な場合は、ソースのネストを深くして対応します。ネストひとつにつきひとつの汎用レジスタを消費します。

さしあたって、汎用レジスタの確保。
        udata   H'20'
TMP res D'2'


コード本体
        movlw   x
movwf TMP
movlw y
movwf TMP+D'1'
LOOP
;xのネスト
decfsz TMP,F
goto LOOP
;yのネスト
decfsz TMP+D'1',F
goto LOOP


ここで、LOOPに続く1回目のdecfszとgotoのペアを「xのネスト」と名づけます。同様にその次のdecfszとgotoのペアを「yのネスト」と呼ぶことにします。(ネストという言葉の使い方が一般的なものと少しずれていますが、気にしない方向で。)

(a) yのネストについて
PICの命令実行順序のとおりに考えると分かりにくいですが、yのネストに存在する2つの命令が実行される回数は、(xの値にかかわらず)yの値だけで決まります。yのネストの実行サイクル数は

(a-i) decfszは必ず1回だけスキップを実行 : 2 cycle
(a-ii) decfszは(a-i)以外は1cycle : y-1 cycle
(a-iii) gotoは(a-ii)と同じ回数×2cycle実行 : 2(y-1) cycle
(a-i)~(a-iii)を合計して : 3y-1 cycle

(b) xのネストについて
xのネストは最初の1順のみTMPにxが代入された状態から1周し、その後はTMPにD'0'が入った状態、すなわちx=256の状態からの実行となります。

(b-i) 最初の1順は、ネストが1段階のときの考察から : 3x-1 cycle
(b-ii) 2順目以降は(3*256-1)cycle、(y-1)繰り返すため : 767(y-1) cycle
(b-i)(b-ii)を合計して : 3x+767y-768 cycle

(a)(b)および代入部分の4cycleを合計して : 3x+770y-765 cycle

tag: PIC アセンブラ 

PIC12/16F Software delay その1

PIC12/16Fでのタイマをつかわないソフトウェアでの一定時間の時間稼ぎプログラムの時間計算方法について。
考え方の基本となる、ネストが1段階の場合まで。


○ネストが1段階のとき

さしあたって、汎用レジスタの確保。
        udata   H'20'
TMP res D'1'


コード本体
LOOP
decfsz TMP,F
goto LOOP


汎用レジスタTMPは8bitなので、符号なし整数でD'0'~D'255'まで扱えますが、ディレイが最大になるのは、最初にTMPにD'0'を代入したときです。それ以外では、D'255',D'254',・・・,D'1'の順にディレイが短くなります。D'0'のときはD'256'と考えると

TMPの初期値がxであるとき、LOOPの実行サイクル数は

(i) decfszは必ず1回だけスキップを実行 : 2 cycle
(ii) decfszは(i)以外は1cycle : x-1 cycle
(iii) gotoは(ii)と同じ回数×2cycle実行 : 2(x-1) cycle
(i)~(iii)を合計して : 3x-1 cycle

        movlw   x                       ;1 cycle
movwf TMP ;1 cycle
LOOP
decfsz TMP,f
goto LOOP ;3x-1 cycle


合計すると'''3x+1 cycle'''となる。

1≦x≦256なので、
delay(max)= 3*256+1=769 cycle
delay(min)= 3*1+1=4 cycle

○cycle数と実時間の相互変換
PICの動作クロックをFOSC[Hz]とし、t[s]のソフトウェアディレイを作る場合の実行サイクル数nは以下のように求められる。

PICは、1cycleに4clockを要するので1cycleにかかる時間は

4/FOSC [s]

よって、t[s]のディレイに必要な実行サイクル数nは

n=t/(4/FOSC)=(t*FOSC)/4

4≦n≦769の条件を満たす場合、1段階のネストで実装できます。nからxをもとめるには、n=3x+1をxについてとけばよいので

x=(n-1)/3

端数はNOPで調整します。

tag: PIC アセンブラ 

PICマイコンのNOPとGOTOの消費電力

PIC12/16Fの小技として、NOPが2回分の時間稼ぎの代わりにGOTO $を使うとプログラム領域を節約できるというものがあります。
私はソースの可読性の観点からと、PAGEの概念があるPICで不必要なGOTOを行うことに抵抗があるという理由から、こういう場面ではNOPを使ってきました。
そんな折、2ちゃんねるの【初心者】PICでBEEP音を作りたい!!2【親切に】スレッドで以下のようなやり取りを見ました。

520 名前:技術奴隷[sage] 投稿日:2008/09/04(木) 05:38:55 ID:ECgj3Ptz
>>519
>あとさ、NOP、NOPはGOTO $+1にすると、容量が半分で済みます。

容量が有り余ってる時は大して意味が無いな。
逆にNOPで時間稼ぎした方が低消費電力になるメリットがある。
馬鹿の一つ覚えで凝り固まらず状況によって使い分ければヨロシ

536 名前:774ワット発電中さん[sage] 投稿日:2008/09/14(日) 15:47:50 ID:7tJFO2EZ
本当かどうか試しに 12F683 内蔵8MHz 5V で実験

LOOP GOTO $+1 ×32
 GOTO LOOPで 851uA

LOOP NOP ×64
 GOTO LOOPで 777uA

確かに1割位電流少なかった。
ただ最初 動作確認の為にGPIOをON/OFFさせてたら2mA位食ってたから
この程度 NOP/GOTO $+1の差なんてどうでもいい差だと思うが
重箱の隅が気になる方はどうぞってかんじ

重箱の隅が気になったので、追試してみました。条件は以下のとおり。
・PIC16F88使用
・内部クロック8MHz
・電源電圧は5V、電源は手持ちの安物スイッチング電源
・回路は以下のもの




◎ GOTO版

1.841mA




MAIN
FILL (GOTO $+D'1'),D'100'
GOTO MAIN


◎ NOP版

1.728mA




MAIN
FILL (NOP),D'200'
GOTO MAIN


私の行った追試の結果は、1.841mA(GOTO)/1.728mA(NOP)=1.065と1割とまではいかないながらもNOP版のほうが低消費電力ということでした。
二つの間で実験条件はほぼ変わらないので、定性的にNOP版のほうが低消費電力といっていいと思います。また、PIC16F88のデータシートによると、私の試験条件(VDD=5V,T=室温,Fosc=8MHz)での消費電流IDDは1.7mA(typ)ということなので、妥当な結果だと思います。




分かっていたことですが、この二つの消費電流の差はプルアップ抵抗一本分ぐらいの差なのであまり気にしても仕方ないかもしれません。ボタン電池駆動などの極省電力を目指すなら、SLEEPとWDTを使うのが常套手段でしょうし。

さらに追試をしたい方がいるかもしれないので、コードの全文を載せておきます。

goto.asm

        LIST    P=PIC16F88
INCLUDE "P16F88.INC"
__CONFIG _CONFIG1, _CP_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_IO &_LVP_OFF __CONFIG _CONFIG2, _FCMEN_OFF & _IESO_OFF

ORG H'0000'
INITIALIZE
BANKSEL(OSCCON)
MOVLW B'01110000' ;8MHz
IORWF OSCCON,F
BANKSEL(TRISA)
CLRF TRISA
CLRF TRISB
BANKSEL(ANSEL)
;A/D Converter OFF
CLRF ANSEL
BANKSEL(CMCON)
;Comparator OFF
MOVLW B'00000111'
MOVWF CMCON
BANKSEL(PORTB)

MAIN
FILL (GOTO $+D'1'),D'100'
GOTO MAIN
END


nop.asm

        LIST    P=PIC16F88
INCLUDE "P16F88.INC"
__CONFIG _CONFIG1, _CP_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_IO &_LVP_OFF
__CONFIG _CONFIG2, _FCMEN_OFF & _IESO_OFF

ORG H'0000'
INITIALIZE
BANKSEL(OSCCON)
MOVLW B'01110000' ;8MHz
IORWF OSCCON,F
BANKSEL(TRISA)
CLRF TRISA
CLRF TRISB
BANKSEL(ANSEL) ;A/D Converter OFF
CLRF ANSEL
BANKSEL(CMCON) ;Comparator OFF
MOVLW B'00000111'
MOVWF CMCON
BANKSEL(PORTB)

MAIN
FILL (NOP),D'200'
GOTO MAIN
END

tag: PIC アセンブラ 

FC2カウンター
カテゴリ
ユーザータグ

LTspiceAkaiKKRmachikaneyamaScilabKKRPSoC強磁性CPAPICOPアンプecalj状態密度常微分方程式モンテカルロ解析odeトランジスタインターフェースDOSPDS5022スイッチング回路定電流半導体分散関係シェルスクリプト乱数レベルシフトHP6632A可変抵抗温度解析トランジスタ技術ブレッドボードR6452AI2C確率論セミナー数値積分反強磁性バンドギャップ熱設計非線形方程式ソルバ絶縁バンド構造偏微分方程式三端子レギュレータフォトカプラカオスマフィンティン半径ISO-I2CGW近似LM358A/DコンバータシュミットトリガLEDUSB数値微分サーボアナログスイッチ補間発振回路カレントミラー直流動作点解析TL43174HC4053PC817C単振り子FFTVESTA開発環境bzqlty電子負荷量子力学基本並進ベクトルパラメトリック解析標準ロジックチョッパアンプBSchLDAアセンブラブラべ格子2ちゃんねるイジング模型PWscf状態方程式仮想結晶近似キュリー温度Quantum_ESPRESSO熱伝導VCAスイッチト・キャパシタewidth最適化QSGWTLP621GGASMPMaxima失敗談位相図六方最密充填構造繰り返しスピン軌道相互作用相対論ランダムウォークFETgfortranコバルトスレーターポーリング曲線ラプラス方程式抵抗cygwin不規則合金格子比熱熱力学マントル条件分岐MCU井戸型ポテンシャルダイヤモンドQNAPUPS固有値問題シュレディンガー方程式自動計測ガイガー管詰め回路OpenMPTLP521ハーフメタルLM555ubuntufsolveブラウン運動平均場近似NE555ZnOTLP552QuantumESPRESSOxcrysdenCIF最小値最大値awkフェルミ面テスタ第一原理計算Ubuntu差し込みグラフFXA-7020ZR三角波過渡解析Writer509データロガースーパーセル起電力CK1026AACircuitMAS830LフィルタMBEP-10PGAトランスナイキスト線図ノコギリ波負帰還安定性EAGLEOPA2277PIC16F785CapSenseLMC6622SC1815入出力固定スピンモーメントFSMTeX結晶磁気異方性全エネルギーc/a合金multiplotgnuplot非線型方程式ソルバL10構造正規分布等高線ジバニャン方程式初期値interp1fcc面心立方構造ウィグナーザイツ胞半金属デバイ模型磁気モーメント電荷密度重積分SIC不純物問題ゼーベック係数cif2cellPWgui擬ポテンシャル二相共存ウルツ鉱構造edeltquantumESPRESSOフォノンリジッドバンド模型スワップ領域BaO岩塩構造ルチル構造ヒストグラム確率論マテリアルデザインフラクタルマンデルブロ集合キーボードRealforceクーロン散乱三次元疎行列縮退化学反応関数フィッティング最小二乗法Excel直流解析PCTS-110TS-112日本語パラメータ・モデル等価回路モデル文字列状態図陰解法熱拡散方程式HiLAPW両対数グラフCrank-Nicolson法連立一次方程式specx.fifort境界条件片対数グラフグラフの分割円周率ヒストグラム不規則局所モーメントGimpシンボル軸ラベル凡例線種トラックボール

最新コメント
リンク

にほんブログ村 その他趣味ブログ 電子工作へ