PIC16F84Aライタ製作 2007.04.21(土)〜
著作者名: 中野 良知 作成開始: 2006.05.03(水) 概要作成 更新 : 2006.05.06(日) タイミングチャート追加。 : ポートマップ追加。 : 2007.04.18(水) バルク消去とコマンド表を追加。 : 2007.04.20(金) 回路図を追加。 : 2007.04.21(土) 製作経過を追加。 : 2007.04.26(木) テストプログラムの項を追加。 : 書き込み手順にバイト配列の説明を追加。 : フラッシュ書き込みで0xFFFFのスキップ処理を追加。 : config書き込みの項目を追加。 : 製作経過を巻末に移動。 : 2007.05.11(金) ICSP用アダプター製作例の項目を追加。 : 2007.05.22(火) フラッシュ書込み時の待機時間を8msecから20msecに変更。 : config書き込みの手順を追加。 : PIC12F675用ICSPピン配置追加。
目次 1. 概要 2. 開発ツール 3. GUI 4. 回路図 5. 参考資料 6. ポートマップ 7. ターゲットとの接続 7.1. ICSPアダプター 7.2. ICSPアダプター製作例 7.3. ポート制御 8. 書き込み手順 8.1. hexデータの読み込み 8.2. バルク消去 8.3. フラッシュROM書き込み 8.4. config書き込み 8.5. コマンド表 8.6. 関数の概要 9. タイミングチャート 9.1. プログラムデータ送信 9.2. プログラムデータ受信 9.3. アドレスインクリメント送信 10. テストプログラム 10.1. ソースコード 10.2. hexデータ 11. 製作経過 1. 概要 AVRWRITER用のアプリケーションにPIC16F84FマイコンのフラッシュROMの書き込みと 読み出し機能の追加検討資料です。 ICSP(In Circuit Serial Programing)に対応します。 PIC16F84Aへのプログラム書き込みは、PCからEZ-USBマイコン経由で行います。 書き込み回路の電源は、PCからUSBケーブル経由で供給します。 書き込み制御に必要な12Vは、書き込み器の回路内で5Vから昇圧し供給します。 2. 開発ツール Windows Appの開発ツールは Micosoft Visual C# 2005 Express Edition(無償版)を 使用します。 入手先とインストール方法は、VC#でCNCのページをご覧下さい。 使い方は、Windows AppでI/Oの制御を参照して下さい。 3. GUI "AVR WRITER for PIC16F84A"?。 メニューの 「書き込み」→「フラッシュ書き込み」と 「読み込み」→「フラッシュ読み込み」を使います。 4. 回路図 ライタ部の回路図は下記を参照してください。 PICライタ回路図:2007.04.26(木) 5. 参考資料 マイクロチップ本社の資料「PIC16F8X EEPROM Memory Programming Specification」 を参考にしました。 資料は、マイクロチップ・テクノロジー・ジャパンから 以下の順で検索しました。(2007.04.19(木)) 1)「日本語ドキュメントへジャンプします」 2)「本社サイトの”Design Resources のページ”を開く:」 3)「Programming」 4)「Programming Specifications 」 6. ポートマップ EZ-USB | ボード | | PIC16F84A PORT名 | 端子No | 用途 | PIN 名称 ---------+--------+------------------------------+-----+--------- A5 (O) | A1 | POWER ON/OFF | 14 VDD C0 (O) | A2 | MCLR(RESET) ON/OFF | 4 ~MCLR C1 (O) | A3 | VIHH ON/OFF | 4 ~MCLR B7 (O) | B2 | CLOCK | 12 RB6 B6 (I) | B3 | シリアルデータ入力(PICから) | 13 RB7 B5 (O) | B4 | シリアルデータ出力(PICへ) | 13 RB7 B4 (O) | B5 | クロック出力許可 | B3 (O) | B6 | データ出力許可 | 初期時 0000 0000 0x00 コマンド出力 10X0 0000 0x80 00X0 0000 0x00 データ出力 10X0 0000 0x80 00X0 0000 0x00 データ入力 1000 1000 0x88 0000 1000 0x08 終了時 0001 1000 0x00 例: コマンド出力用データは クロックH: 0x80 | (data<<5)&0x40 クロックL: 0x00 | (data<<5)&0x40 7. ターゲットとの接続 7.1. ICSPアダプター ターゲットボードのPIC16F84Aに直に書き込み・読み出しができるICSPアダプター ケーブルを製作します。 6ピン コネクタ ソケットアダプター ┌──┐ │ @ ├──────┐ ┌─────┐ ← マイコン │ A ├──────┤ 5芯 └┼┼┼┼┼┘ │ B ├──────┤ ケーブル ┌─────┐ ←ICソケット(18ピン) │ C ├──●───┼─────┼─────┤ │ D ├──│───┘ └┬┬┬┬┬┘ ←ICピン端子(9ピン×2) │ E ├──┘ │││││← 評価ボードのマイコン用 └──┘ ICソケットへ装着します。 コネクタピン配置 PIC16F84端子 備考 -------------------+----------------+--------------- @MCLR/VIHH 4 MCLR AGND 5 Vss Bクロック 12 RB6 Cデータ入力 13 RB7 ──┐ケーブルを DVDD 14 VDD │Uターンして Eデータ出力 13 RB7 ──┘接続 CとEをケーブル側で接続する事で、ROMライターがAVRとPIC両用に使えます。 コネクタピン配置 PIC12F675端子 備考 -------------------+----------------+--------------- @MCLR/VIHH 4 MCLR AGND 8 Vss Bクロック 6 GP1 Cデータ入力 7 GP0 ──┐ケーブルを DVDD 1 VDD │Uターンして Eデータ出力 7 GP0 ──┘接続 7.2. ICSPアダプター製作例 材料です。 5芯ケーブル長さ30cm。18ピンICソケット。スルーホールユニバーサル 基板。 6Pコネクター。 ICピン 9ピン×2本。 Φ0.25mm銅線。 他に18ピンのICソケット、製作作業中のICピン固定用です 。 ICピンをソケットに差してピンを固定します。基板から出ているピンはカット、 更に基板面よりわずかに下がるまでヤスリで削ります。 予備半田をした銅線をコ字の形に曲げて、ピンと内側のスルーホール間をブリッジします。 ICソケットを載せて、各ピンを半田付けします。 ICピン側にケーブルを半田付けします。 下はROMライター側に接続する6Pコネクターです。 上はROMライター、下はICSPアダプターにPIC16F84Aを装着し、ステッピングモータの 1−2相駆動プログラムをデバッグ中です。 7.3. ポート制御 Windows AppからEZ-USBマイコンのポートを制御する方法は、 EZ_IOを参照してください。 8. 書き込み手順 バルク消去で、フラッシュROMのデータを一括して消去した後に、1ワードづつフラッ シュROMへ書き込みます。 8.1. hexデータの読み込み データを格納する為のバイト型配列を初期化します。 0000 0001 0002 4FFE 4FFF ┌──┬──┬──┬ ─ ┬──┬──┐ │ FF │ FF │ FF │ │ FF │ FF │ └──┴──┴──┴ ─ ┴──┴──┘ コンパイラーが生成したintel hex形式のファイルを読み込み、2文字毎に1バイトのデ ータに変換し、バイト型の配列の指定されたアドレスに順次格納します。 hexデータの例 (構造は、「hexデータ」の項目を参照して下さい) :02000000F82BDB :1007F0001E30831685000130831285008501FB2B96 :02400E00F93F78 :00000001FF 0000 0001 07F0 07F1 07FE 07FF 400E 400F ┌──┬──┬ ─ ┬──┬──┬ ─ ┬──┬──┬ ─ ┬──┬──┐ │ F8 │ 2B │ │ 1E │ 30 │ │ FB │ 2B │ │ F9 │ 3F │ └──┴──┴ ─ ┴──┴──┴ ─ ┴──┴──┴ ─ ┴──┴──┘ │───────────────────────│ │─────│ プログラムデータ コンフィグレーション ワード プログラムデータは、2バイト毎に区切って書き込みます。 0000 0001 07F0 07F1 07FE 07FF 400E 400F ┌──┬──┬ ─ ┬──┬──┬ ─ ┬──┬──┬ ─ ┬──┬──┐ │ F8 │ 2B │ │ 1E │ 30 │ │ FB │ 2B │ │ F9 │ 3F │ └──┴──┴ ─ ┴──┴──┴ ─ ┴──┴──┴ ─ ┴──┴──┘ │─────│ │─────│ │─────│ │─────│ ↓ 0x2BF8 リトルエンディアン形式で2バイトに変換します。 0b0010 1011 1111 1000 2進数表記 0b0101 0111 1111 0000 1ビットづつ左シフトして0,data(14),0の構造にします。 16ビットのデータをLSBから順次送ります。 マイコンのプログラムメモリには、LSBとMSBを除いた、14ビットが書き込まれます。 8.2. バルク消去 フラッシュROMを一括して消去します。 手順) 1) MCLRを0にします。 2) RB6とRB7を0にします。 3) VDDをオンします。 4) MCLRに12Vを供給します。 5) Load Data for Program Memory(0x02)コマンドでデータ(0x3FFF)を送ります。 6) Bulk Erase Program Memory(0x09)コマンドを送ります。 7) Begin Programming Only Cycle(0x18)コマンドを送ります。 8) 10msec待ちます。 参考) バルク消去を行わずに1ワード毎に消去と書き込みを行う方法もあり、 Begin Erase Programming Cycle(x08)を使用します。 8.3. フラッシュROM書き込み 1. バイト型配列から2バイト(1ワード)づつフラッシュROMに書き込みます。 2. 1ワードごとにデータを読み出して照合します。 3. アドレスをインクリメント。 1.から3.を繰り返します。 手順) 1) MCLRを0にします。 2) RB6とRB7に0を出力します。 3) VDDをオンします。 4) MCLRに12Vを供給します。 5) 送信用データが0xFFFFのときは11)へスキップします。 バイト型配列にhexデータが格納されていないため。 6) Load Data for Program Memory(0x02)コマンドでデータを送ります。 7) Begin Programing Only Cycle(0x18)コマンドを送ります。 8) 20msec待ちます。 9) Read Data from Program Memory(0x04)コマンドで、プログラムメモリーからデー タを読み出します。 10) データーを照合します。 11) Increment Address(0x06)コマンドを送ります。 プログラムメモリーアドレスが+1されます。 12) 全てのデーターの書き込みが終了するまで 5)から11) を繰り返します。 13) MCLRを0にします(VIHH=オフ)。 14) RB6とRB7へ接続を開放します。 8.4. config書き込み コンフィグレーションワードの14ビットを書き込みます。 データはバイト型配列のアドレス400Eと400Fに格納されています。 400E 400F ┬──┬──┐ │ F9 │ 3F │ ┴──┴──┘ │─────│ コンフィグレーションワード ↓ 0x3FF9 リトルエンディアン形式で2バイトに変換します。 0b0011 1111 1111 1001 2進数表記 0b0111 1111 1111 0010 1ビットづつ左シフトして0,data(14),0の構造にします。 手順) 1) Load Configuration(x00)コマンドでコンフィグレーションワードを送ります。 2) Increment Address(0x06)コマンドを7回送ります。 3) Begin Erase Programming Cycle(0x08)を送ります。 4) Read Data from Program Memory(0x04)でコンフィグレーションワードを読み出し 書き込みデータと照合します。 8.5. コマンド表 コマンド 2進数 16進 付随データ ------------------------------+--------------+------+------------------ Load Configuration X X 0 0 0 0 0x00 0,data(14),0 Load Data for Program Memory X X 0 0 1 0 0x02 0,data(14),0 Read Data from Program Memory X X 0 1 0 0 0x04 0,data(14),0 Increment Address X X 0 1 1 0 0x06 Begin Erase Programming Cycle 0 0 1 0 0 0 0x08 Begin Programming Only Cycle 0 1 1 0 0 0 0x18 Load Data for Data Memory X X 0 0 1 1 0x03 0,data(14),0 Read Data from Data Memory X X 0 1 0 1 0x05 0,data(14),0 Bulk Erase Program Memory X X 1 0 0 1 0x09 Bulk Erase Data Memory X X 1 0 1 1 0x0B 8.6. 関数の概要 pic_write(); PIC16F84Aにプログラムとコンフィグのデータを書き込みます。 GUIメニュー「フラッシュ書き込み」からコールされます。 pic_read(); PIC16F84Aからプログラムデータを読み込みます。 GUIメニュー「フラッシュ読み込み」からコールされます。 pic_cmd_out(); 6ビットのコマンドを送信します。引数はコマンド値。 pic_data_out(): 16ビットのデータを送信します。有効データは14ビットです。 pic_data_in(); 16ビットのデータを受信。戻り値の14ビットが有効長です。 pic_vihh_on(); VIHH(+12V)をオンします。 pic_vihh_off(); VIHH(+12V)をオフします。 pic_power_on(); VDD(+5V)をオンします。 pic_power_off(); VDD(+5V)をオフします。 pic_reset_off(); MCLRを開放します。 PicAllPortSet(); PIC用にEZ-USBのポートディレクション等を設定します。 pic_clock_data_open(); クロックとデータの信号線とターゲットマイコンの RB6とRB7との接続を開放します。デバッグ実行時に使用します。 PicEND(); EZ-USBのポート設定をAVR用に戻します。 9. タイミングチャート 9.1. プログラムデータ送信 PIC16F84Aにプログラムデータを送信します。 ┌────────────────────────────────── VDD ─┘ ┌──────────────────────────────── │ MCLR ───┘ 1 2 3 4 5 6 1 2 3 4 5 15 16 ┌┐┌┐┌┐┌┐┌┐┌┐ ┌┐┌┐┌┐┌┐┌┐ ┌┐┌┐┌ RB6 ─────┘└┘└┘└┘└┘└┘└──┘└┘└┘└┘└┘└ ─ ┘└┘└┘ (CLOCK) ┌─┐ ┌─┬─┬─┬─ ─ ┬─┐ RB7 ───────┘ └───────────┴─┴─┴─┴─ ─ ┴─┴── (DATA) LSB MSB LSB MSB ├──────────┤ ├───────────┤ コマンド送信 プログラムデータ送信 pic_cmd_out(); pic_data_out(); RB7 出力 入力 方向 │←──────────────→│←──────────────→│ 14ビットのプログラムデータ xxkk kkkk kkkk kkkk を一回左シフトしMSBとLSBを クリアした16ビット 0kkk kkkk kkkk kkk0 にして出力します。 9.2. プログラムデータ受信 PIC16F84Aからプログラムデータを受信します。 ┌────────────────────────────────── VDD ─┘ ┌──────────────────────────────── │ MCLR ───┘ 1 2 3 4 5 6 1 2 3 4 5 15 16 ┌┐┌┐┌┐┌┐┌┐┌┐ ┌┐┌┐┌┐┌┐┌┐ ┌┐┌┐┌ RB6 ─────┘└┘└┘└┘└┘└┘└──┘└┘└┘└┘└┘└ ─ ┘└┘└┘ (CLOCK) ┌─┐ ┌─┬─┬─┬─ ─ ┬─┐ RB7 ─────────┘ └─────────┴─┴─┴─┴─ ─ ┴─┴── (DATA) LSB MSB LSB MSB ├──────────┤ ├───────────┤ コマンド送信 プログラムデータ受信 pic_cmd_out(); pic_data_in(); RB7 出力 入力 方向 │←──────────────→│←──────────────→│ 受信した16ビットの xkkk kkkk kkkk kkkx を右シフト後上位の2ビットをリセット し、有効長が14ビットのデータ 00kk kkkk kkkk kkkk にします。 9.3. アドレスインクリメント送信 PIC16F84Aのプログラムカウンタのインクリメントコマンドを送信します。 ┌────────────────────────────────── VDD ─┘ ┌──────────────────────────────── │ MCLR ───┘ 1 2 3 4 5 6 1 2 3 4 5 6 ┌┐┌┐┌┐┌┐┌┐┌┐ ┌┐┌┐┌┐┌┐┌┐┌┐ RB6 ─────┘└┘└┘└┘└┘└┘└ ─ ─ ┘└┘└┘└┘└┘└┘└─── (CLOCK) ┌───┐ ┌─┬─┐ RB7 ───────┘ └───── ─ ─ ──┴─┴─┴──────── (DATA) LSB MSB LSB MSB ├──────────┤ ├───────────┤ コマンド送信 次のコマンド送信 pic_cmd_out(); pic_cmd_out(); RB7 出力 方向 │←────────────────────────────────→│ 10. テストプログラム 10.1. ソースコード コンパイルの方法は、こちらを参照して下さい。 //*************************************************************************** // タイトル: LED点滅テスト // 作者 : ioio // 機能 : ポートAのビット0に接続したLEDが高速に点滅します。 // マイコン: PIC16F84A // クロック: 8MHz。XTALで3端子レゾネータを使用。 //*************************************************************************** // 変更履歴 // 2007.04.19(木) "htc.h"と__CONFIG(0x3FF9)を追加 // 2007.04.18(水) 作成開始 //*************************************************************************** #include "pic.h" // #include "htc.h" // __CONFIG(0x3FF9); // プロテクト=OFF, WDTE=OFF, XTAL void main(void) { TRISA = 0x1E; // PORTA 0=Out, 1,2,3,4=In while(1){ // 繰り返し PORTA = 0x01; // PORTA0=1 PORTA = 0x00; // PORTA0=0 } } //*************************************************************************** 10.2. hexデータ 上記のCソースコードをPICC Liteてコンパイルしたときの.hexリストです。 :02000000F82BDB :1007F0001E30831685000130831285008501FB2B96 :02400E00F93F78 :00000001FF 分かりやすく分割します。 1 2 3 4 5 6 -+--+----+--+--------------------------------+--------------- : 02 0000 00 F82B DB : 10 07F0 00 1E30831685000130831285008501FB2B 96 : 02 400E 00 F93F 78 : 00 0000 01 FF 1:先頭 2:データ長(バイト) 3:オフセットアドレス 5:データ。ACIIコードの2文字で1バイトを表現。ワードは4文字。 リトルエンディアン形式(下位バイト先頭)で、F82Bは0x2BF8です。 6:チェックサム アドレス0x07F0はバイト単位でのアドレスです。 アドレスを右に一回シフトすると、デバイスのワードアドレスになります。 0x07F0は、0x03F8でmin()の先頭です。main()は0x03F8から0x03FFに格納されます。 0x400Eは、0x2007でconfigデータのアドレスです。 11. 製作経過 2007.04.25(水) hexデータの書き込みが出来るようになり、下記のプログラムを実行させました。 出力はHighの幅が1.0msecで、Lowの幅が1.1msec。 周波数が476Hzのパルス出力を確 認しました。 //***************************************************************************** // タイトル: LED点滅テスト // 作者 : ioio // 機能 : ポートAのビット0に接続したLEDを約500Hzで点滅。 // マイコン: PIC16F84A // クロック: 20MHz //***************************************************************************** // 変更履歴 // 2007.04.18(水) 作成開始 //***************************************************************************** #include "pic.h" // #include "htc.h" // __CONFIG(xFF); void main(void) { unsigned int cnt1; // カウント変数1 TRISA = 0x1E; // Port A 0=Out, 1,2,3,4=In while(1){ // 繰り返し // LED ON PORTA = 0x01; // Port A-0=1 // ソフト遅延 cnt1 = 500; while(cnt1--); // 約1msecの遅延 // LED OFF PORTA = 0x00; // Port A-0=0 // ソフト遅延 cnt1 = 500; while(cnt1--); // 約1msecの遅延 } } //***************************************************************************** 2007.04.24(火) ターゲットへの電源供給ON/OFF回路を追加。 I/Fをmini EZ-USB用に変更。 ライターソフトをデバッグしています。 2007.04.22(日) 7年くらい前に製作したPICライターです。 PCのパラレルポートを使用します。 当時のライターソフトは、WinXPでは使えなくなっていました。 WinXPでも使えるライターソフトをDL。PICライターの回路を同ソフトの合わせて改 造しました。 ソフトは立ち上がり、クロック、データともに十分な振幅がありますが、読み出しや 書き込みが正常に行われません。 2007.04.21(土) AVR_WRITER基板です。 AVR_WRITER基板に追加した12V昇圧回路と、スイッチ回路です。 EZ-USBのPORTB6を入出力兼用に変更。PICのシリアルデータ信号(RB6)仕様に合わせ ました。 ROMデータの読み出しが不安定です。 クロック、データ入力の閾値が0.8VDD=4Vのところ、EZ-USBの出力が3.3Vでは不足し ているようです。 ダイオードで下駄を履かせてみましたが効果はありませんでした。 Highが4Vに上昇した分、Lowも上昇して1Vになり、規格Low:0.2VDD=1V以下。 High:0.8VDD=4V以上のどちらもぎりぎりで動作が不安定です。 2007.04.20(金) AVR_WRITER回路図に12V昇圧とスイッチ回路を追加しました。 PIC WRITERプログラム検討。クロックとシリアルデータの入出力を確認しました。 2007.04.19(木) PICC Liteの.hexのプログラムデータとconfigデーターの内容を検討し、 configデータをフラッシュROMと同時に書き込む事に決定しました。 書き込みデータが0x3FFFFの時は、アドレスインクリメントのみ実行しデータ書き込 みは行わないようにプログラムを修正しました。 2007.04.18(水) AVR WRTIER AppにPIC16F84Aの書き込み機能を追加することに決定しました。 2007.04.16(月) PICC Lite V9.6をインストール。 PORTB0に出力するプログラムで、コンパイルの動作確認をしました。 //************************************************************************** #include "pic.h" // を変更 void main(void) { TRISA = 0x1E; // Port A 0=Out, 1,2,3,4=In PORTA = 0x01; // Port A-0=1 while(1); // 繰り返し } //************************************************************************** 2007.04.15(日) HI-TEC社のCコンパイラー PICC Lite V9.6をダウンロード。 2006.05.06(日) タイミングチャート追加。ポートマップ追加。 2006.05.03(水) ライター資料作成開始。
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合に複製が可能です。 複製をする場合は著者まで連絡をお願いします。
Topへ
inserted by FC2 system