Home

PICあれこれと失敗談                              16項の追加 Ver.6.0 '16/02/03                              15項の追加 Ver.5.0 '15/04/09                              14項の追加 Ver.4.0 '15/02/25                              13項の追加 Ver.3.0 '15/01/03                            7〜12項の追加 Ver.2.0 '14/12/15                                    Ver.1.0 '14/07/14                           All rights reserved JA3OOK 中村 利和  PICを利用した機器を製作するに当たっての要点をまとめました。私の経験が中心ですから極一部 のことになります。私自身のメモですが誰かの役に立てば幸いです。    目次 1.なぜPICを選んだか 2.入門にPIC16F88を選んだ理由 3.開発環境を何にするか 4.LCDの輝度調整のVRは低めに! マニュアルの間違いもある! 5.ストップビット数 one or two stop bits 6.PICへ再書き込みができないトラブル 7.PICkit3でPICを認識しないトラブル(MPLAB X IDE v2.10 PICkit3) 8.PIC18F25K22の64MHz 9.LATレジスター(PIC16からPIC18への移行問題) 10.PIC18F25K22のEUSART関係のレジスタ名 11. EUSARTが動かない(PIC18F2550からPIC18F25K22への移行問題、ANSELの罠) 12.EEPROM 使用上の注意 13.WDT(ウォッチドッグタイマー) 使用上の注意 14.PIC18F25K22やPIC16F1936の受信エラー処理 15.バイナリーエディター 16.IDEやxc8コンパイラーをバージョンアップしたらEEPROMにアクセスできなくなった 1.なぜPICを選んだか   私は全くのMCU(マイクロコンピューター)の初心者。クラブ仲間でワイワイ雑談したりW  ebを見ていくうちにMCUにはいくつかのメーカーがあることを知り、まずその違いを大雑把  に把握することから始めた。   ・AVR     詳しい資料は大半が英文。しかしコンピュータや通信の英文でありなんとか理解できるはず。     Webでの事例も増えてきている様子。デビューが新しくPICよりアーキテクチャが洗練され     ているらしい。開発ツールも大丈夫。   ・H8     全ての資料が日本語。これは心強い。開発ツールも遜色ない。Webでの事例も多い。     PICやAVRよりIO数が多くRAM/ROMの容量も大きい。大規模領域がターゲットのようだ。     純国産のMCU。心情的には使いたい。   ・PIC     Webで事例の記事が多い。PIC固有の使いにくさを指摘している方々がおられるがCで組め     ば個性が包み隠されて使いにくさは感じないはず。     (これは予想とおりであった。ABSの機能を実現する範囲だけのことかも・・・)     詳しい資料は大半が英文。しかしコンピュータや通信の英文でありなんとかなるはず。     決め手は      ・「Ethernetコントローラ内蔵CPUボード/KBC-P18LAN2」が共立から、      ・「新PIC−NICキット」が秋月から     発売されていること。いずれは購入してカスタマイズしてみたい。そのためにはPICに慣れ     ておきたい。 2.入門にPIC16F88を選んだ理由   私の最初の開発目標はRS-232CでのPCとの通信。初心者向けに、RS-232C電圧変換ICも付いた   キットが秋月から販売されていたこと。    (K-01714 PIC16F88 CPUボードモジュールキット Ver.2 1,130円)   そしてWebには88での製作や実験k時も多かった。それで結果的にPIC16F88になった。   MCU初体験の私にとって手ごろのように思え、もし性能が不足していたら乗り換えればいい   だけのことと考えた。   半田付けが必要なピン間隔も重要な選定要素。このキットでは1/10インチであった。   細かな物を見ることが苦手になっている私にはこれが限度。これでも虫眼鏡やカメラから外し   た凸レンズが必要な場合がある。 3.開発環境を何にするか   今後も長いつきあいになるので、末永く保守してくれたり新製品に対応してくれる製品を使い   たい。数千円の差ならメーカー純正が正攻法。   ほとんどの開発環境が無償。CもOptimize機能を犠牲にすれば無償。   (Optimize機能:無駄な処理やメモリーを見つけて高速化や最小化を行ってくれる機能、に頼    らなければならないほど複雑なプログラムになるとは思えない)   ということで構築した開発環境は    ・MPLAB X IDE v2.10 (Microchip)    ・MPLAB XC8 C Compiler Free mode v1.31 (Microchip)    ・PICkit2 v2.61.00 (Microchip) + 書き込みアダプタ(秋月 K-05355)   Cを選んだ(アッセンブラでなく)理由。    ・C言語は最も普及しているプログラミング言語の一つ。     このXC8 CはISOやANSIに準拠しているとのことで、もし他メーカーのMCUに乗り換える     ことになっても楽そうだ。ソースプログラム互換は期待できないがノウハウは使える。    ・Webを読むとPICの弱点を挙げている方々がいるが、CならMCUの弱点が包み隠されていて使     いにくくないはず。    ・アッセンブラーをこの年齢(1945年生まれ)で覚えるのはつらいし、同じ覚えるなら     応用範囲が広い言語を覚えるべき。    ・若いとき仕事で使っていたSYSLやHPLとCは似ているので理解が早そうだ。      SYSL : 電電公社(現NTT)のDIPS用システム記述言語      HPL  : NECのシステム記述言語      (独り言・・・懐かしいなあ)   PICkit2について。    ・PICkit2とPICkit3を比較してPICkit2の方が良いとのWebの記事に引かれてPICkit2を購入し     た。しかしこれは選択ミス。PICkit2の方が良いというのはずっと昔の話だったのだ。     今(2014年)ならPICkit3を購入すべきであった。と言っても致命的問題に遭遇したわけで     はなく、PICkit2より長く使えるかも・・・との程度のこと。    ◎数あるPICの中から適切なPICを選定したり開発環境を準備したりするに当たっては、数ある     Webの中から、特にair variableさんの記事(参考資料1)および木村繁裕さんの記事(参考     資料2)を参考にした。感謝します。    と考えてPICkit2を買いました。   しかし、PICkit2を使い慣れたころ(追記)     新しい機器の製作に取り組もうとしてPIC16系では実現できないことが分かり(12項:EEPROM    サポート関数)PIC18系のPIC18F25K22に絞った。ところが困ったのはこのPICへPICkit2でプロ    グラムを書き込めない(サポートしていない)ことが分かり、がっかり!    しかたなくPICKit3を購入せざるを得なくなってしまった。うん千円の損!    教訓:初期トラブルの収まった程度の新しいツールを買おう。 4.LCDの輝度調整のVRは低めに! マニュアルの間違いもある!    開発環境とPIC自体を入手してから、最初の目標はLCDに文字を映し出すこと。   なぜなら、ABS(私が最初に取り組んだ開発対象の名称)の一番重要な機能はRS-232Cから   文字を受信することであり、そのためのデバッグ手段として受信した文字をLCDに表示する   ことが第一歩。    LCDドライバーソフトを自分で組むことが可能とのことで、これもair variableさん(参   考資料1)を一番の参考にして組み込み、MCUの処理速度に合わせた適切なタイミングと適   切な幅のチューニングを自分でやった。  <失敗談>   初めて文字をLCDに表示させるのに手こずった。   盲点はLCDの輝度調整用の電圧を加減するボリュームを最初に調整しなかったこと。電圧が   高すぎ画面が真っ白で、文字が出ているのに気づかず、タイミングと幅の調整ばかり行って   いて数日を無駄にした (^_^;)   教訓:輝度調整用の電圧は低めにしてテストを始めること。  <余禄>   この貴重な経験を積むことができたほかに、もう一つの成果はSC1602BSLのマニュアルに、初   期設定の一連の命令シーケンスの中で「100s待て」との記述があるが長すぎる。実験の結果   「100μs」待てばよいことも確認できた。   その後→100μsでは正常に初期化が終わらないことがあることが分かりその後は1msにしてい   る。      5.ストップビット数 one or two stop bits   ・two stop bitsはPIC16F系ではできない。AUSARTを使わず全てプログラミングして送信すれば    実現できるかもしれないがやっていない。    two stop bitsはPIC24系を使えばUARTで実現できるようである。(参考資料5 page149) 6.PICへ再書き込みできないトラブル   PICにPICkit2でプログラムを書き込めず、PICが壊れた! と早合点した経験談。   ・購入した秋月の PIC16F88 CPUボードモジュールキットには20MHzの外付け発振子が付属して    いて最初の数日はこの外付け発振子で実験していた。   ・このPICは外部発振子を使わない内部発振方式も可能で、それを試してみたときのトラブル。    プログラムを内部発振方式に変更し机上デバッグを終え、PICに書き込んだら正常に書き込め    た。動作も正常。   ・プログラムを一部変更して書き込もうとしたら書き込めない! デバイス名称を認識できな    いとのエラーメッセージ! 何回やっても書き込めない。再書き込みができないのだ。    プログラムを外部発振子をつける仕様に戻しても書き込めない。   ・PICが壊れたと思って、やむなく同じPICを追加購入。念のため4個。   ・新しいPIC16F88でやってみると、初回は書き込めるが2回目以降は書き込めない!    ・同様のトラブルをWeb調べてみると、参考資料6が見つかった。要約すると      プログラムを書き込む前にPICに通常電圧が供給されてしまい、書き込み済み      プログラムが内部発振で動いてしまって、新しい書き込みができない    とのこと。これと同じ症状に思える。   ・これまでの書き込み方法は、MPLABでソースプログラムを修正後に、コンパイルとPICへの書    き込みを行うために Make and Program DeviceアイコンMake&Program Iconをクリックしていた。   ・そこで、MPLABではBuildアイコンMake&Program Iconでコンパイルまで行い、PICへの書き込みはPICkit2    単独で行う(そのつどHexファイルのImportとPICへのWriteを指示する)ようにしたら正常に    書き込めることが分かった。 以来この方法で書き込んでいる。   ・二次的効果として、書き込み後にPCへのUSB端子をそのつど抜く必要がなくなった。    (書き込みが終わると電源供給も自動停止される。Make and Program Deviceを利用する場合     にも書き込み後に電源供給を自動停止するオプションがあるのかもしれないが私には分か     らない)    この電源供給のことで、その後にPICkit3を買って分かったこと。      MPLAB X IDEでのコンパイルとPICへのプログラミング(書き込み)が一体化しているので      USB端子を抜かないとPICへの電源供給が切れないようだ。それで、PICを抜く前に      USB端子を抜いている。わずらわしい。      古いドライバーを使えばPICkit3単独でプログラミングできるようだが試していない。      そのうち、いちいちUSB端子を抜き挿しするのがめんどうで、挿し      たままでPICを外したり付けたりしているが問題は起こっていない。今のところ・・・       7.PICkit3でPICを認識しないトラブル(MPLAB X IDE v2.10 PICkit3)   PICkit3を始めて使うときに経験する恐怖! それは次のエラーが赤文字で出ること。    Target device was not found. You must connect to a target device to use PICkit 3.   原因はPICkit3ではPICkitから電気を与えないことが既定値になったため。   解決策は    ・ProjectのProperties(プロジェクト名を選択し右クリック、一番下)      → PICkit3を選択      → Option categories:のプルダウンメニューでPowerを選択      → Power target from PICkit3にチェック        (Voltage Levelはさわらなくてよい:5.0のまま)      → OK    ・プログラム書き込みを指示      → その電圧を本当に与えるかを問い合わせてきた場合は      → OK    8.PIC18F25K22の64MHz    /* Internal OSC 16MHz 電源ON直後(Reset直後)は16MHzで内部発振させる */ #pragma config PLLCFG = OFF //Oscillator used directly #pragma config FOSC =INTIO67 //Internal oscillator block #pragma config PRICLKEN =OFF //Primary clock can be disabled by software   mainの最初に次の3行を記述する IRCF2 = 1; IRCF1 = 1; IRCF0 = 1; //16Mhz SCS1 = 0; SCS0 = 0; //Primary clock PLLEN = 1; //Frequency Multiplier 4x   mainの最初でなくても良いが、PLLENがONになった時からこのスピードで動き出す。   64MHz化と直接関係ないが、SCSレジスターについての次の記述はさけたい。 OSCCON = 0b01110000; //16Mhz, Primary clock  PLLEN = 1; //Frequency Multiplier 4x   OSCCONのIRCF<2:0>,SCS<1:0>以外のビットの値も変えてしまうのはまずいから。 9.LATレジスター(PIC16からPIC18への移行問題)   PIC16F88 や PIC16F1936 から PIC18F25550 や PIC18F25K22 にプログラムを移行して最初に   とまどったのが ポートB2を示す「RB2」 がコンパイルエラーになってしまうこと。   (コンパイルエラーの不親切なメッセージだけでは修正方法を思い浮かばなく苦労)   対策は    例えば RB2 を LATB2 や PORTBbits.RB2 に変更すればOK。    混在がいやなので LATB2(LATxn)に統一した。   説明不足なので追記    → 入力ポートで使用する場合は PORTBbits.RB2 形式の方が入力ピンのON/OFF状態を正しく      読み取れます。 10.PIC18F25K22のEUSART関係のレジスタ名   PIC18F25K22は二つのEUSARTを持っている。従ってレジスターを区別するために番号がつけられ   た。(参考資料8 PIC18(L)F2X/4XK22 Data Sheet 272pageなど)   他のPICからプログラムを移行したり一つのEUSARTしか使わない場合でも関係するレジスター   名を修飾付きや番号付きにしないとコンパイルエラーになる。    例えば TXSTA1bits.TX9 = 0; //Selects 8-bit transmission TXSTA1bits.SYNC = 0; //非同期モードを選択 RCSTA1bits.SPEN = 1; //シリアルポートを有効にする RCSTA1bits.RX9 = 0; //Selects 8-bit reception BAUDCON1bits.BRG16 = 0; TXSTA1bits.BRGH= 0; SPBRG1 = 103; //OSC=64MHz 非同期 9600bps TXSTA1bits.TXEN = 1; //送信を有効にする RCSTA1bits.CREN = 1; //連続受信を可能にする RCREG1 = 0; //受信バッファをクリア while(!RC1IF){} //1文字入力まで待機 11. EUSARTが動かない(PIC18F2550からPIC18F25K22への移行問題、ANSELの罠)    PIC18F2550には通常のPICに存在するANSELレジスターがないのだ。(PIC18F97J60にもない   ことを後で知った)   2550で完成したプログラムをPIC18F25K22に移行したとき罠にはまった。   25K22でも2550と同じように動作するものと思い込んでしまい、ANCELxの設定を失念していた。    ANCELを指定しない場合、つまり既定値はどのポートもアナログなのだ。   しかし、どのポートもアナログなのに液晶出力に使っているポートAは期待とおりに動作し   液晶に文字が正しく表示されている。   EUSARTから送信もできるのだ。   でも受信ができないのだ!   あれやこれやいじくってもANCELに思いが及ばず、1日ほどの回り道・・・   やっとANCELCでデジタルを指定して解決。えらい時間の浪費であった (^_^;)   同じ系統の(同じ系統と思い込んだ)PICでも油断してはいけないという教訓。 12.EEPROM 使用上の注意 (MPLAB XC8 C Compiler)   EEPROMを使用しようとするとコンパイラが提供するマクロや関数の利用が便利だがいくつか   注意点あり。(参考資料7 MPLAB_XC8_C_Compiler_User_Guide.pdf 183〜184page)    ・__EEPROM_DATA マクロ      このマクロを書く場所に注意        Cプログラムの初め(Functionより前)に、#includeや#defineに続いて書くこ        と。(Functionやmainの中に書かない)      このマクロの役割        HexファイルがPICにプログラミングされるとき(書き込まれるとき)に、        このマクロで記述したアドレスにその値が書き込まれる。          ・eeprom_write() function および eeprom_read() function これらのfunctionが使える対象はPIC18系。      eeprom_write() functionをcallした次に各PIC毎に決められた時間Waitすること。       (例えばPIC18F25K22の場合は最低4ms、参考資料8 PIC18(L)F2X/4XK22 Data        Sheet 438page) 13.WDT(ウォッチドッグタイマー) 使用上の注意  a WDTクリア命令を書く位置に注意すること。    ・メインループの中に一箇所だけ記述      理由 一定時間以内でWDTクリア命令を実行する必要があり、上記の注意を守って        プログラムを書くと実行時間を推定しやすい。        一般的に、functionの中とか複数個所に記述すると実行時間を推定しずらい        プログラムになることが多い。        その一定時間間隔はシステム毎に適した間隔を設定すること。   ・割込み処理内に記述しない      理由 WDTを使用する目的は実行時のプログラムの暴走を防止することにあるが、         プログラムが暴走していても割込みは所定通りに行われることがあるので、         割込み毎にWDTクリア命令を実行してしまっては暴走を発見できない。  b WDTの応用     複数の通過処理毎に通過フラグを立て、通過したことをメインループで確認するこ     とも有効。     例えば、一定時間毎に割り込みが発生することが前提のプログラムなら割込み処理     内に通過フラグを立て、メインループで通過フラグを判定すれば、割り込みが発生     していないことを検出できる。  上記abはPICに限らない注意事項であり、参考資料9(Spansion Inc. ソフトウエアで  のEMC対策)から引用した。そこにはab以外にも有用な事項が書かれている。  MPLAB XC8 C Compiler および PIC18F25K22 において上記の、    ・WDTクリア命令とは CLRWDT() マクロのこと。    ・WDTの一定時間間隔は #pragma config WDTPS = n で設定し、     CPUクロックに依存せず4ms×n が設定時間間隔である。     nに記述可能な値は \Microchip\xc8\v1.31\docs\chips\18f25k22.htmlを参照。 14.PIC18F25K22やPIC16F1936の受信エラー処理   EUSARTの受信エラーの種類によって処置方法を変えなければならず、もし変えるのが   いやなら SPEN をOFF,ONしなければならないのだ。   ・FERR ON: Framing Errorの場合      処置 SPENをオフにし、オンにする(間にNOPを1個入れる事例もある)   ・OERR ON: Overrun Errorの場合      処置 CRENまたはSPENをオフにし、オンにする(   同上     )   書かれているのはデータブック「PIC18F2x_4xk22.pdf」の269ページ。   受信エラー処理のデータブック原文   PIC16F193Xの場合は295ページに同様の記載がある。  PIC16F88系やPIC18F2550系の場合は エラーの種類によらずCRENをオフにし、オンにすれば  よい。ややこしい〜   データブックをたまたま見ていて気づいた。めったに起こらないエラーなので普通のテス  トでは発見できないだろう! 要注意である。仕様を合わせておいてくれ〜 15.バイナリーエディタ「Stirling」 <PICとは直接関係はないが備忘録として記載>   PICで行う通信プログラム(ABS)のデバッグのために「Tera Term」から送り込むテストデータの  中に0x00や0x03を入れる必要に迫られた。Webを探し回ってたどり着いたのが  「Stirling(後藤 和重氏制作のフリーソフト)」である。16進数表記での編集が簡単にでき、  とてもよく出来ている。  デバッグ手順は、   Stirlingで0x00などを含むデータファイルを作成    ↓   Tera Termのファイル送信機能で送信    (送信前に □バイナリ にチェックすることを忘れないように!) 16.IDEやxc8コンパイラーをバージョンアップしたらEEPROMにアクセスできない   現象:IDEとxc8コンパイラーをバージョンアップした。もちろん古いバージョンのそれらを      アンインストールしてから新しいバージョンをインストール。        MPLAB X IDE     v3.05 → v3.20        MPLAB XC8コンパイラ v1.34 → v1.36        余談:microchip社の日本語公式HPのそれらのダウンロードメニュー画面上で表示           されているバージョン番号と実際にダウンロードされるバージョン番号が異           なっている!!! ご愛嬌?!!! かなんなあ!!!      そしたら新しいバージョンでEEPROMの読み書きができなくなった。        <eeprom_read()やeeprom_write() Functionが動作しない>      バージョンアップ作業時、コンパイル時、プログラム書き込み時および実行時に何のワ      ーニングメッセージも出ていない。   調査:元のバージョンを再インストールしたり、いろいろ試行錯誤したが直らず、思案投げ首。      今回たまたま別のPCに元のバージョンのIDEとXC8コンパイラでの開発環境が残っており、      EEPROMにアクセスできる場合とアクセスできない場合のプログラムサイズを比べること      ができた。      比較の結果、本来は全く同じはずなのに、アクセスできない場合の方がサイズが小さい。      これはEEPROMアクセス関するコードが作られていないことを意味する。      この明白な証拠によりコンパイラーの動作を疑いはじめ、コンパイラーへの動作指定ウ      インドウ内の各項目を比較したが両PCは全く同じ指定。   対策:次の対策を実施したらプログラムサイズも等しくなり、EEPROMにアクセスできるようにな      った。       ・IDEやxc8コンパイラーをインストールしているMPLABXフォルダーやxc8フォルダーの        配下の古バージョンのフォルダーは残さずきれいに削除する。        (Program Files フォルダー配下のMicrochipフォルダーの中。アンインストール後         に目で確認して削除すること)       ・IDEのプロジェクト定義の古いものを削除。        (IDEでプロジェクトを削除してからユーザーフォルダー配下のMPLABXProjectsの中         の残骸を削除すること)       ・新しくプロジェクトを登録する。     これら三項目全てを行わないとダメなのかは不明。このうちどれか一つが根本原因かもしれ     ないが、これ以上の究明は力不足であり情報も不足。     想像だが、コンパイラーがヘッダーファイルを手繰る(たぐる)ときに連鎖が切れてもワー     ニングを出さずにほったらかしにしてしまっているのではないかな?Microchipさん頑張っ     て!         参考資料 1 air variable 昔から電子工作が好きな趣味の〜 → 無料のPIC最強開発環境 2 木村繁裕 〜電子工作(PIC,Arduino,AVR)情報発信のお役たちサイト     PIC全般は → マイコン     割込については → 使用PIC → PICの動かし方入門はこちら                       → タイマー割込を使ってLEDを点滅 3 あたるは ひとりでマイコンやら・・・ →PICマイコン →RS−232C通信1、2 4 Microchip社 PIC16F88 Data sheet 5 Microchip社 PIC24Family Data sheet 6 著者名不明 JDMプログラマで12F629/675に再書き込みできない問題 7 Microchip社 MPLAB_XC8_C_Compiler_User_Guide.pdf 8 Microchip社 PIC18F2x_4xk22.pdf 9 Microchip社 PIC16F193X.pdf 10 日本スパンション株式会社 Spansion Inc. →サポート→Microcontrollers            →開発に当たってのノウハウ→EMC設計(ノイズ対策)→ソフトウエア編 11 Tera Term プロジェクト Tera Term 12 後藤 和重氏 Stirling

 直前の画面へは ブラウザの戻る をクリックしてください。Topに戻るにはHome