Personal tools
You are here: Home Members ichiro Life + Radio BLOG PICのC化 その3
Document Actions

PICのC化 その3

by Ichiro Hieda posted at 2008-05-16 12:30 last modified 2008-06-30 08:42

PIC16F84で,もともとアセンブリ言語で書いてあったプログラムのSDCCへの移植は,公私の案件ともほぼ完了しました^^;

そのうちの,特に重要なものについては,今後のことも考えて,16F88に移植することにしました.

16F84(A)から,16F88への移植については,あちらこちらに書いてありますが,SDCCを使っての移植についてはあまり見つからないですね.

実際やってみると,高速で割り込みがかかるようなプログラムでなければ,拡張されたconfigの設定と,ANSELの初期化くらいで動きます.

しかし,微妙なタイミングで動くプログラムの場合は,上記の設定をしてSDCCでコンパイルし直しても動いてくれませんでした.

遭遇した問題は,今のところ2点で,SDCCではデフォルトの演算が16bitで行われてしまう,ユーザーのデータ領域にもバンク切り替えがあるという点です..

インラインでアセンブリ言語を書く場合,

    _asm
    MOVLW    32
    MOVWF    _ii
    _endasm

は,

    _asm
    MOVLW    32
    BANKSEL  _ii
    MOVWF    _ii
    _endasm

としておく必要があるようです.インラインでアセンブリ言語を書くこと自体,普通は必要ありません^^;

16bit演算については,これも時間に余裕がない処理では気をつけた方がいいです.

    unsigned char jj;
    ...
    if ( jj-1 ) goto どこそか;

は,16F84では,8bitの比較として,jjから1引いて,ゼロかどうか判断するという,期待どおりのアセンブリ言語生成でした.

ところが,16F88では, ( jj-1 )を16bitとして見なすようで,生成されたアセンブリ言語の長さはもとの2倍以上になります.まあ,確かにそれが正しいCコンパイラーの所作なのかもしれません.これを避けるために,

    if ( jj!=1 ) goto どこそか;

と書き直しました.これは,jjが8bitの変数ですから,8bitでの比較をするのが正しいですし,アセンブリ言語の生成もその通りになっています(ただし,BANKSELの分,16F84(A)用よりは長くなります).

結局は,生成されたアセンブリ言語を眺めてトラブルシューティングということになります^^;

Category(s)
PIC