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カウンター
カテゴリ
ユーザータグ

LTspiceAkaiKKRmachikaneyamaScilabKKRPSoCOPアンプCPAPIC強磁性モンテカルロ解析常微分方程式トランジスタode状態密度インターフェースecalj定電流スイッチング回路PDS5022DOS半導体乱数シェルスクリプトレベルシフトHP6632Aブレッドボード分散関係温度解析トランジスタ技術R6452A可変抵抗I2Cセミナー確率論反強磁性非線形方程式ソルバ絶縁偏微分方程式バンド構造熱設計数値積分バンドギャップカオスA/DコンバータフォトカプラシュミットトリガGW近似LEDLM358ISO-I2C三端子レギュレータ数値微分サーボ直流動作点解析カレントミラーマフィンティン半径TL431PC817C発振回路74HC4053USBアナログスイッチbzqltyFFTチョッパアンプ2ちゃんねる補間量子力学開発環境電子負荷標準ロジックパラメトリック解析アセンブラ基本並進ベクトルブラべ格子単振り子BSchLDAイジング模型繰り返しMaximaキュリー温度位相図状態方程式失敗談スピン軌道相互作用六方最密充填構造相対論FET抵抗コバルト不規則合金TLP621ewidthGGAQSGWgfortranランダムウォークラプラス方程式スイッチト・キャパシタcygwin熱伝導SMPスレーターポーリング曲線三角波格子比熱LM555条件分岐TLP552MCUNE555UPSTLP521QNAPマントルテスタFXA-7020ZR過渡解析詰め回路ガイガー管ダイヤモンド自動計測Writer509データロガー固有値問題VESTAスーパーセルOpenMP差し込みグラフ平均場近似起電力awk仮想結晶近似VCAubuntufsolveブラウン運動熱力学第一原理計算井戸型ポテンシャルシュレディンガー方程式面心立方構造fccウィグナーザイツ胞interp12SC1815L10構造非線型方程式ソルバFSMキーボードTeX結晶磁気異方性初期値OPA2277化学反応等高線ジバニャン方程式ヒストグラム確率論三次元フィルタRealforcePGAフェルミ面正規分布固定スピンモーメント全エネルギースワップ領域リジッドバンド模型edeltquantumESPRESSOルチル構造岩塩構造二相共存ZnOウルツ鉱構造BaOフォノンデバイ模型multiplotgnuplotc/aノコギリ波合金クーロン散乱ハーフメタル半金属CapSenseマンデルブロ集合マテリアルデザインSICGimpCK1026MAS830L円周率トランスPIC16F785凡例線種シンボルLMC662ヒストグラム不規則局所モーメント文字列疎行列TS-110TS-112Excel直流解析等価回路モデル入出力トラックボールPC軸ラベルAACircuitP-10フラクタル境界条件連立一次方程式Ubuntuifortパラメータ・モデルspecx.f関数フィッティング最小二乗法Crank-Nicolson法陰解法日本語EAGLEMBEグラフの分割負帰還安定性ナイキスト線図熱拡散方程式HiLAPW両対数グラフ片対数グラフ縮退

最新コメント
リンク

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