ちょっとTea Time!? PICの憂鬱(備忘録) 2022.3.4
マイクロコントローラにはもっぱらPICを使っています。.一時期、AVR(ATMEL)を試していた時もありましたが、
C言語の書き方、とくにI/O関係がかなり違うので、結局はあきらめました.ネットではPICよりAVRの方が
良いという意見もあるようですが、やっぱり慣れたものが使いやすいです.
PICをつかっていていいところは、ピン数が同じデバイスであれば基本的にはI/Oの配置が同じなので、
ほぼ置き換えができるというところです.デバイスも新しくなるほど、速度や容量が大きくなるので、さらに
複雑なプログラムを組むことができます.
ただ、置き換えが可能といってもソフトの作法が少し異なるようなので、そこは注意が必要です.
というのも同じプログラムを新しいデバイス用に再コンパイルするとコンパイルエラーが発生したり、
コンパイルできても動かないケースがでてきます.
ということで、備忘録としてPICを変更したときにCCS-Sコンパイラをつかうときの注意点を備忘録として
もっとも使う28PinのPICについてのみ整理です. 今後も、さらに注意が必要なことがわかれば付けたしていきましょう.
最初はPIC16F886(8kW、内部オシレータ8MHz)
最初に使ったのはPIC16F886。プログラム容量は8kWあるので、LCDをつかったプログラムでもそこそこ余裕がありました。
といっても、LCDは16x2の小さいものなので、表示テキストも少ないないのでなんとか足りていたといったところです。
次はPIC16F1938(16kW、内部オシレータ32MHZ、PLL有り)
LCDの表示を拡充していくと、PIC16F886では容量の壁にぶち当たりました。このときにいわゆるF1シリーズと言われる
PIC16F1938を使うようになりました。当時もっていたCCS-Cコンパイラ(PCM)もまだ対応していたので助かりました。
これを使うことで容量は一気に倍になったこともあり、かなりの余裕ができました。
プログラムのソースコードもPIC16F886とほぼ同じですが、注意点は1つ。
PIC16F1938では内部PLLが自動的にONになるようなので、PIC16F886(8MHz)で動かしていたプログラムは、
勝手に32MHzで動いてしまいます。時間管理をしているプログラムの場合はPLLをOFFにする必要があるので、
明示的に#FUSE設定が必要です。まあ、ここを注意すればとくにソースの変更は必要なしでした。
#FUSES PLL_SW // 内蔵のPLLを停止するおまじないです。PLL_SWを抜かすと、自動的にPLLが動き4倍速になってしまいます。
その次はPIC18F26K20(32kW、内部オシレータ64MHz、PLL有り)
PIC16F938で十分かと思っていましたが、やはりどんどんプログラムが大きくなってきます。LCDに20X4のものをつかったり、
赤外線リモコンなどが入ってくると一気にプログラム容量が増えてきます。そこで、次はPIC18F26K20あたりをつかうように
なりました。これを使うには今までのコンパイラ(PCM)では対応できないので、新規に18F対応のPCHを購入しました。
プログラムソースとしては、PIC16F1938とほぼ同じで単に容量が増えて、高速になったという感じでした。
メモリー容量も32kWあるので十分かと思っていましたが、グラフィックイコライザやパラメトリックイコライザなどでは
浮動小数点も扱うようになると、かなり厳しくなってきました。というか、完全に不足するような自体も発生です。
でも、なかなか容量の大きな最新のPICには移行できません。その理由は下記になります。
・対応させるには、コンパイラのバージョンアップ(新規購入)が必要。
・PICライタ(まだPICKIT2を使っていた)では書き込めない
すでにPICではJシリーズが出ていたのですが、指を加えてみていました。
でも、思い切って開発環境を一新です。
現在はPIC18F27Q43を使用中(64kW、内部オシレータ64MHz、PLL有り)
現在はさらに大きな容量に対応できるようにPIC18F27Q43を主に使おうとしています。
そのために、コンパイラも新調し、さらにPICKIT4も購入しました。PICKIT4をつかうために、ライターソフトもMPLAB XIPEを
インストールです。いままでの、開発環境からかなり様変わりしました。
ただPIC18F26K20からPIC18F27Q43に移行するときには、プログラム上で数々の修正が必要であることがわかりました。
いままでわかったことを整理です。
項目 | PIC18F26K20の場合 | PIC18F27Q43の場合 | 27Q43になったときの違い |
ICの基本性能 | クロック最大64MHz プログラム容量32kW EEPROM 1kB RAM 3.8kB ADC分解能10Bit |
クロック最大64MHz プログラム容量64kW EEPROM 1kB RAM 8kB ADC分解能12bit DAC機能有り |
かなり強力になりました。 とにかく容量増がうれしい。 |
内部クロックの宣言 (クロック端子もIOで使う) |
#FUSES INTRC_IO | #FUSES RSTOSC_HFINTRC_64MHZ | 宣言が変わりました。長くなったな〜。 |
クロック変更(プログラム中) | setup_oscillator(OSC_64MHZ) | setup_oscillator(OSC_HFINTRC_64MHZ) | 宣言が変わりました。長くなったな〜。 |
10MHzの水晶をつかう場合 | #FUSES HS | #FUSES XT setup_oscillator(OSC_EXTOSC); |
なぜXTに変わったか不明 またプロラム中にもサブルーチンを呼ぶ必要があるみたい。 |
ADCをつかう場合の事前宣言 | setup_adc(ADC_CLOCK_DIV_64); | setup_adc(ADC_CLOCK_DIV_64 | ADC_TAD_MUL_16); | ADCのセットアップタイムを追加しないと、 やたら変換に時間がかかります。 |
ADCをつかう場合の変数の注意 | adc_xxxxは使えない可能性がある | adc_count,adc_result,adc_dataなどの変数はコンパイラ内部で予約されています。 | |
ADCのポート番号 | sAN0 //| A0 sAN1 //| A1 sAN2 //| A2 sAN3 //| A3 sAN4 //| A5 sAN5 //| E0 sAN6 //| E1 sAN7 //| E2 sAN8 //| B2 sAN9 //| B3 sAN10 //| B1 sAN11 //| B4 sAN12 //| B0 |
sAN0 //| A0 sAN1 //| A1 sAN2 //| A2 sAN3 //| A3 sAN4 //| A4 sAN5 //| A5 sAN6 //| A6 sAN7 //| A7 sAN8 //| B0 sAN9 //| B1 sAN10 //| B2 sAN11 //| B3 sAN12 //| B4 sAN13 //| B5 sAN14 //| B6 sAN15 //| B7 sAN16 //| C0 sAN17 //| C1 sAN18 //| C2 sAN19 //| C3 sAN20 //| C4 sAN21 //| C5 sAN22 //| C6 sAN23 //| C7 |
大幅に変更になりました。A0〜A3以外はすべて入れ替わっています。 |
割り込みの宣言 | #INT_RTCC | #INT_TIMER0 | タイマ割り込みの宣言が変更になりました。 |
ということで、いままでのソースを流用するときはすこし変更が必要です。
でも、プログラム容量が大きくなり、ADCが12ビットになったり、DACが追加されたりと機能が大幅に強化されているので、
しばらくはこのPIC18F27Q43が主流になるなか〜という感じです。
ただし、心配は入手性かな?最近の半導体不足もあり秋月でも購入個数の制限がかかっています。
(都度、追加していくかも)。