PIC16F1455でUSBデバイスをつくる

自分へのクリスマスプレゼントとしてマイクロチップから送ってもらったサンプル品のPIC16F1455とPIC16F1459。F1シリーズでは初のUSB機能内蔵マイコンで為替レートにもよるが1個150円前後で手に入る。PIC18F14K50が秋月で170円で買えるが、これらは外付けの水晶も不要、48MHzの高速動作、8kワードフラッシュ、1kバイトRAMとUSBを使用しなくても十分魅力あるチップである。特に1455は14ピンなので小さく作るにはかなり有効。ということで、とりあえずUSB機能からチェックしてみた。

2012-12-27 16-08-01.008

とりあえず、以前PicoBasicのUSBシリアル変換に使用していたPIC18F14K50の置き換えを考えてみる。ソフトウエアは例によってマイクロチップのライブラリを使う。とりあえず1459と1455両方のソフトウエアを作成して「ハマりどころ」をいくつか発見したので列挙して備忘録としておく。

ライブラリは最新として2012-10-15バージョンのものを使用する。元となるプロジェクトはCDC Serial Emulatorである。実はこの10月15日バージョンでまずハマった。というのは、以前、このライブラリが出た頃と今ダウンロードできるものではファイルの内容が異なるということ!!2台のマシンにライブラリをインストールして開発していたのだが、同じ10-15のライブラリなのに2台でファイルの内容が異なっていた。信じられない!!!最近ダウンロードした方のマシンにインストールしたライブラリの1459用のファイルのタイムスタンプは10月20日となっていて、内容も全然違うので注意が必要だ。というか古い方では修正するところが多いし、DTR処理がうまく動作しないのでお勧めしない。10月15日ライブラリに10月20日タイムスタンプのファイルが混じっているのはどう考えても変!しっかりしろマイクロチップ!内々にこっそりアップデートするな!

と怒りはこれくらいにして、変更点を列挙する。まずはハードウエアの変更点から。

・ICSP端子がRA0,1からRC0,1に変更されているので書き込み時には注意。RA0,1でもいけるがLVP専用で現実的でない

・コメントにも書いてあるが、内蔵クロックを使用するならパスコンを1μF以上にする

・なぜかPICkit3では電源電圧が4.5V位以上の時はチップのIDが読み出せないので何もできない

次にプロジェクト関係。

・MCPプロジェクトファイルがないので18F14k50用のもので開いてチップとコンパイラを変更すると楽

・DTRでPicoBasicをリセットをするための処理としてusb_config.hの
#define USB_CDC_SUPPORT_DTR_SIGNALINGを有効にする
#define USB_CDC_DTR_ACTIVE_LEVEL    1に変更する

・HardwareProfile – LPC USB Development Kit – PIC16F1459.hの
#define USE_INTERNAL_OSC
がコメントアウトされているのではずして有効にする

元々のソースは1459専用になっているのでPIC16F1455も使用できるように変更

・HardwareProfile – LPC USB Development Kit – PIC16F1459.hの
UART関連の宣言を変更
#if defined(_16F1459)
#define UART_TRISTx   TRISBbits.TRISB7
#define UART_TRISRx   TRISBbits.TRISB5
#define UART_Tx       PORTBbits.RB7
#define UART_Rx       PORTBbits.RB5
#elif defined(_16F1455)
#define UART_TRISTx   TRISCbits.TRISC4
#define UART_TRISRx   TRISCbits.TRISC5
#define UART_Tx       PORTCbits.RC4
#define UART_Rx       PORTCbits.RC5
#endif
RTS/CTSをサポートするならさらなる変更が必要

・HardwareProfile.hの_16F1459のみチェックしている箇所を以下のように修正
#if defined(_PIC14E)
#if defined (_16F1459) || defined (_16F1455)

・main.cの_16F1459を参照している部分を変更
#elif defined(_16F1459) || defined(_16F1455)

void InitializeUSART(void)内
ポート初期化部分でPORTBがないので以下のようにしておく
#if defined(_16F1459)
ANSELB = 0x00;    // Not Available in 1455
TRISB  = 0x00;
#endif

UARTポートの初期化部分でANSB5を参照しているので1459の時のみ初期化する
(1455ではRC5にアナログ機能がないので初期化不要)
#if defined(_16F1459)
ANSELBbits.ANSB5 = 0;   //Make RB5 digital
#endif

usb_function_cdc.cも同様に_16F1459を参照している部分を同様に変更

これらの変更を施してメイクすると1455や1459のHexファイルが作成できる。完成した1455用のHexファイルはこれ。

USBserial1455.hex(DL時に拡張子をhexに変更してください)

USBシリアル回路の変更を含めた、PicoBasicを使用するための回路は以下の通り。

1455serial

以上で従来と同じ感覚でPicoBasicを使用することができるようになった。1459の場合は端子が多少変更になる。

1459serial

たったこれだけの回路でUSBシリアル変換が可能となるので、高い変換専用チップは要らない。国内でも簡単に入手できるようにどこかの店で売ってくれると教材用としてお勧めできるのだが・・・。

USBシリアル変換以外にも同様の変更を施せばUSB-MIDIのファームウエアも動作することを確認している。とはいえ、このチップの本領発揮はHIDを使用したカスタムUSB機器にあると思っている。アイデア募集中!!

追記(2013/5/14):マイクロチップのライブラリがアップデートされたので、その対応版を使ってみた記事もどうぞ!

  1. hi, im trying with pic 16f1455 to create a cdc (USB to serial converter). i download a library from microchip, compiler and mplabX but i can compile because i recive more error.
    you have tutorial or suggest of any type?
    THX😀

    • What kind of errors? If these are the compile errors, check above article with translating to your language. And try it again!!

    • KV2
    • 2013年 9月 8日

    初めまして。16F1455の情報を探してこちらを知りました。
    当方でもやはりPicKit3+IPE(1.90)で書き込もうとするとDeviceIDが取得出来ず、最後はprogramming failedと言われてしまいます。powerの項目で電圧を5Vから下げてみても症状は変わりませんでした。どうやってPICにプログラムを書き込まれたかご教示願えませんでしょうか。

    • こんにちは。当方ではMPLAB8+PICkit3です。確か、電圧は4Vくらいで使っていたとおもいます。
      PICkit3に関するトラブル例はマイクロチップのフォーラムでも頻繁に議論されいますが、結局それよりも多いのが誤配線だったりすることも多いので、まずは回路を確認してみてください。プログラミングの端子がいつものA0,A1ではないことに起因する配線上のトラブルも多いみたいです。
      また、ICSPではなく、チップ単独での書き込みでも試してみてください。PICkit2に比べて流せる電流が少なくなって電圧降下している可能性もあります。
      その他、いろいろとエアバリアブルさんがまとめてらっしゃるので参考まで。
      http://www.ne.jp/asahi/air/variable/picmel/integration/write/pickit3/

  1. 2013年 5月 14日

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。