SSブログ

MikroCと16F88(16F689)でメモリー破壊 [電子工作一般]

MicroCを使って秋月のPIC内蔵LCDをいじっています。
いろいろな表示をさせようと機能を増やしていくと、あるところからLCD表示が崩れたり、マイコンそのものが暴走してしまいます。この秋月I2C LCDを使わずに普通のキャラクタLCDとF88の組み合わせでも同じです。

P-05693.JPG

MikroCのLogファイルを見ると、次のワーニングが出ていることに気がつきました。
トラブルが起きない場合はワーニングがありません。

warning: 43 1511 IRP bit must be set manually for indirect access to 'c_vol' variable main.c
warning: 43 1511 IRP bit must be set manually for indirect access to 'c_amp' variable main.c
warning: 43 1511 IRP bit must be set manually for indirect access to 'c_wat' variable main.c
warning: 44 1511 IRP bit must be set manually for indirect access to 'c_wats' variable main.c

うまくいくときとダメなときのRAMの使用量を比べてみました。

Used RAM (bytes): 110 (46%) Free RAM (bytes): 130 (54%)
Used ROM (program words): 871 (21%) Free ROM (program words): 3225 (79%)
うまくいくとき

Used RAM (bytes): 200 (83%) Free RAM (bytes): 40 (17%)
Used ROM (program words): 1218 (30%) Free ROM (program words): 2878 (70%)
ダメなとき

ここでググったりして色々調べたところ、RAM BANKが0と1を超えるとMikroCはダメだと言うことが判りました。BANK-0と1の切り替えまではコンパイラーが旨くやってくれるようです。

F689ではRAMのBANK構成は次のようになっています。

689RAM.JPG

これをみると、BANK-0で96バイトとBANK-1で80バイトですから、176バイトを超えるとダメということが判ります。たしかに110バイトで済んでいるコードは動いていますが、200バイトを必要とするコードはバグります。

<追記>
生成されるアセンブルコードの状況によっては176バイト以下でもダメな場合がありました。BANK-0の90バイト以内にしてうまくいきました。テーブルをやめてループで描画するようにして一気にRAM使用量を減らした結果です。


これを回避するにはいくつかのアドバイスが有りました。

1. 一番簡単なのは仮想リニアアドレッシング機能を持っている別のPICを使う(16F1827は大丈夫だった)
2. 18Fシリーズを使う(全て仮想リニアアドレッシング機能がある)
3. MikroC以外のコンパイラを使う

ということです。
秋月I2C液晶乗っているPICのRAMを目一杯使いたいときはMikroCを捨てなくてはなりません。純正のXC8は大丈夫っぽいのですが、ライブラリが貧弱なのでメンドクサイですね。MikroCはLCDライブラリとかが揃っているので採用したのですが。この液晶に拘らなければ、仮想リニアアドレッシング機能をもったPICを使えば良いだけですが。ピンコンパチで貼り替えできるのが見つかれば良いのですが。しかもSOICピッチ。

ググってもなかなか見つからなかったのでBlogで書いておきます。
国内では全然見つかりませんでした。


nice!(2)  コメント(1) 
共通テーマ:日記・雑感

nice! 2

コメント 1

ocr

PIC は足を洗ってしまって分かりませんが,MPLAB + XC8(?) でも同じでしょうか?Mac でも MPLAB X ってのがあるので,インストールしてみましたが,PICKIT が行方不明になってました.苦笑

ちなみに AVR で使っている Crosspack も最新版を入れたら,delay 関連で挙動が変わってたりしました.
by ocr (2013-12-21 11:30) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。