SNSへはこちら

PIC18F45K50で遊ぶ(1) - 基本のLチカで入門

すっご〜〜く久々の更新です。けんきうしつが忙しくて全然手がつけられませんでした。
更に言うと、beatmania IIDX という沼 にハマったため、この趣味分野の優先順位がほぼ最下位になっていました。DAO コン高いよ、DAO コン。

それでもなお、タイトルの通り PIC をいじいじしていましたので、これに関した記事を書こうかなと言った具合です。

なぜこの型番か

早速ですが、タイトルの通りの型番に目をつけました。Twitter で見たから、というのがきっかけ。その人曰く、

  • USB FS/LS のデバイスペリフェラル搭載
    • 双方向ペアのエンドポイントが16個
    • OTG を積んでいないので、レジスタが複雑でなくて済む
  • クリスタルレスで USB を遊べる
  • CPU は 64MHz 動作
    • まあ PIC は1命令4サイクルが基本なので実質 16MHz ですが...
    • こちらの記事がわかりやすいかと。
  • ROM が 32KBytes でまあまあ実用に耐える
  • 公式で USB ブートローダーが提供されていて、ビルドして導入すれば書き込み器が不要になる
    • USB ケーブル1本で開発できるので超便利。
    • ちょうど USB ペリフェラルで遊びたいと思っているし。
    • こちらは次回の記事で説明。

から。そうだね。欲しいなあ〜とか、でもお金ないなあ〜とか、そうこうしているうちに、なんと秋月で販売を開始したよう。ほしいと思っていた時に丁度かよ。最高です。即買い。

しかし、個人的にアレなのは、やはり大きさ。40pin あるデバイスですが、横幅が LPC1114 を彷彿とさせるデカさです。28pin のものが簡単に手に入ればいいですがね。

入門

環境は以下。

  • macOS Mojave
    • Catalina は電子工作に絶対向かないから、絶対インストールしないぞ!!!!
  • MPLAB X IDE
  • MPLAB Snap
    • 本ブログでも散々取り上げた、安価な書き込み・デバッグアダプタです。重宝しています。
    • でもたま〜に使おうとして接続すると、毎回ファームウェアがぶっ壊れているのはどうして?厄年だから???

まずは基本のLチカ。取り敢えず CPU クロックは最大の 64MHz に上げて電力の無駄遣いをしましょう。デフォルトから変更した Fuse Bits は以下(多分)。

  • CONFIG1L
    • PLLSEL: PLL4X
  • CONFIG1H
    • FOSC: INTOSCIO
    • FCMEN: OFF
  • CONFIG2L
    • BOREN: OFF
  • CONFIG2H
    • WDTEN: OFF

この段階で、マイコン起動時には Primary Clock (= 内部オシレータ 1MHz を PLL で4倍したもの、つまり 4MHz)が CPU 動作クロックになる。ここからは起動後にするお仕事。

#include "global.h" // 上のFuseたちを記述したファイル
#define _XTAL_FREQ 64e6
int main(void) {
    OSCCONbits.IRCF = 7;

    TRISAbits.RA0 = 0;
    while(1) {
        __delay_ms(1000);
        LATAbits.LA0 ^= 1;
    }
}

IRCF を設定することで、内部オシレータ周波数を 16MHz に。よって、これにより PLL を経由して CPU クロックは 64MHz になりました。めでたしめでたし。

そういえば PIC はピン方向(TRISx)で出力を指定するときは 0 を書き込むんでしたね。勘違いして1を書き込んで、「動かねえぞ!」って勝手にハマっていました。

USBペリフェラル使用に向けて

Fuse Bits で LS48MHZ というのがあります。IDE 上では "System clock as 24MHz/48MHz" 等々としか記述されていませんが、データシートによるこのビットの説明を読むと、"System clock is expected at 24 MHz / 48 MHz" とあるので、USB ペリフェラルを動かすには、システムクロックを 24MHz or 48MHz に設定せねばならないようです。つまり 64MHz 動作は無理。トホホ...まあ USB なんか割り込みが立て続けに入るようなものなので、そこまで CPU クロックスピードに拘る必要はなさそうですが。

ということで、Fuse Bits の先程の設定を2箇所いじります。

  • PLLSEL を PLL3X にする
    • プログラム記述中の IRCF と併せて 16MHz x 3 = 48MHz となる
  • LS48MHZ を SYS48X8 にする
    • これで USB クロックが適切になる

というわけで

取り敢えず入門でした。基本のLチカができたということで、今回は締めたいと思います。お次はブートローダーの導入です(これが割と面倒くさい)。現状できているので近いうちに記事にしたいところです。もうしばらくお待ち下さい。