PIC16F1827でシリアル通信

PIC16F1827でシリアル通信(EUSART)をテストした。
とはいえ、MCCを使えば簡単。

まずはMCCで内蔵オシレーター32MHzで動くように設定。

MCCでのオシレーターの設定。
内蔵オシレーターで32MHzで動く設定。
MCCでのオシレーターの設定

次にMCCのEUSARTの設定。
確か、Enable EUSART InterruptsをONした以外はデフォルトのままだったと思う。

MCCでのEUSARTの設定。
デフォルトからEnable EUSART InterruptsをONにしただけ。
MCCでのEUSARTの設定

最後にMCCでRA1ピンをLED用に出力に割り当て。
ソースコード(書き換えた部分のみ抜粋)は次の通り。
Macで入力した文字をそのまま返すだけ。通信の間、LEDが光る。
GlobalとPeripheralの割り込みをEnableにするのを忘れない事!(動かなくてしばらく悩んだ…)

void main(void)
{
    volatile uint8_t rxData;
    // initialize the device
    SYSTEM_Initialize();
    // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
    // Use the following macros to:

    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    INTERRUPT_PeripheralInterruptEnable();

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();
    LATAbits.LATA1 = HIGH;

    while (1)
    {
        // Add your application code
 
        if (EUSART_is_rx_ready()) {
            LATAbits.LATA1 = LOW;
            rxData = EUSART_Read();
            if (EUSART_is_tx_ready()) {
                EUSART_Write(rxData);
            }
            LATAbits.LATA1 = HIGH;
        }
    }
}

回路図はコレ。

回路図。
PICKit3, USBシリアルも。
回路図

USBシリアルはFTDIのチップの載った古いモジュールで、Macにつないでターミナルからcuコマンドで接続。
sudo cu -s 9600 -l /dev/cu.usbserial-A10042Fd

カテゴリー: PIC, ソフトウェア, 回路 | タグ: , , , , , | コメントする

医療従事者の方たちに感謝

PIC12F1822でFC-102(Rainbow LED)を制御できるようになったので、青い光で医療従事者の方たちに感謝の意を表そうと思いました。

これのMPLAB X IDE用のプロジェクトファイル一式のzipファイルです。

回路図は一つ前の投稿と同じです。

電池駆動時の回路図です。
電池駆動時の回路図です。
ICSP回路付きの回路図です。
ICSP回路付きの回路図です。

カテゴリー: PIC, ソフトウェア, 作ったモノ | タグ: , , | コメントする

PIC12F1822でFC-102を光らせる

まずはMCCでクロックを内蔵オシレーター8MHzx4PLLの32MHzに設定して、RA2を出力に設定してソースファイルを生成(Generate)。
main.cにビット0を送る関数((void) send_bit0(void))とビット1を送る関数((void) send_bit1(void))をアセンブラで書いて、メインループで次のように send_bit0(); だけにして、まずは send_bit0(); が正しく動くかを確認。

send_bit0を実装

while (1) {
    // Green
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    // Red
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    // Blue
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    __delay_us(50);
}

最初、全部(16個)のLEDがMAXで白く発光して「どういう事だよ…」となったけど、よく調べたらクロックが8MHzになっててx4PLLされてなかったりして、ちゃんと32MHzで動くようにして再度調整。調整した結果がコレ。

void send_bit0(void)
{
    // 0.5, 2.0us
    // 4, 16 insts
#asm
    movlb 2 ; BANK 2
    bsf 12, 2 ; LATA, 2
    nop
    movlb 2 ; BANK 2
    bcf 12, 2 ; LATA, 2
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
#endasm
}

send_bit1を実装

(void)send_bit1(void) も調整。

void send_bit1(void)
{
    // 1.2, 1.3us
    // 10, 10 insts
#asm
    movlb 2 ; BANK 2
    bsf 12, 2 ; LATA, 2
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    movlb 2 ; BANK 2
    bcf 12, 2 ; LATA, 2
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
#endasm
}

結果としてwhileループの最後の__delay_us(50);__delay_us(70);に調整。
最初のうちは24ビットしか送ってないのにLEDが2つ光ったりしてタイミングの調整が大変だった。でも、意外にもアセンブラで書いたのは (void)send_bit0(void)(void)send_bit1(void) の2つだけで動いた。

send_byteを実装

続いて1バイトを送信する void send_byte(unsigned char b) を書いた。

void send_byte(unsigned char b)
{
    if (b & 0x80) {
        send_bit1();
    } else {
        send_bit0();
    }
    if (b & 0x40) {
        send_bit1();
    } else {
        send_bit0();
    }
    if (b & 0x20) {
        send_bit1();
    } else {
        send_bit0();
    }
    if (b & 0x10) {
        send_bit1();
    } else {
        send_bit0();
    }
    if (b & 0x08) {
        send_bit1();
    } else {
        send_bit0();
    }
    if (b & 0x04) {
        send_bit1();
    } else {
        send_bit0();
    }
    if (b & 0x02) {
        send_bit1();
    } else {
        send_bit0();
    }
    if (b & 0x01) {
        send_bit1();
    } else {
        send_bit0();
    }
}

main.cファイル

今回のmain.cのファイルです。
MCCで生成したmain.cを差し替えると、次のような感じで光ります。
アニメーションはしません。

FC-102をPIC12F1822で制御。
電池はFC102の駆動用。
FC-102をPIC12F1822で制御
FC-102をPIC12F1822で制御。
どちらも電池(6V)で駆動中。
PICもFC-102も電池で駆動中

回路図

ICSP回路付き。
ICSP回路付き
電池駆動時の回路。
電池駆動時の回路

カテゴリー: PIC, ソフトウェア, 回路 | タグ: , , | コメントする

MPLAB X IDEでアセンブラを使う

FC-102(Rainbow LED)をPICで動かそうと、データシート(WS2811)を確認したらタイミングが凄くシビア。
0.5μSとか1.2μSとか。xc8の__delay_us()だって整数しか渡せない。
「他の人はどうしてるの?」とググったらアセンブラで書いていた。
32MHzで動かせば、1命令当たり4サイクルで動くから1命令0.125μS。0.5μSは4命令(0.5μS)くらいまで大丈夫そうだ。

で、PICのアセンブラなんて書いた事ないから、とりあえずCでLチカを書いて、それをアセンブラに書き換えてみようと.asmファイルを書いたら、mpasmx(アセンブラのコマンドだと思う)の実行で”Bad CPU type in executable”とか出てきた。調べると、macOS Catalina以降では32ビットのアプリは動かないそうで、mpasmxというコマンドは32ビットのアプリらしく、動かないという事のようだ。

しょうがないという事で、「じゃあ、XC8のインラインアセンブラで書けばいいや」とXC8のインラインアセンブラのディレクティブ #asm, #endasm で囲って書いたけど、#asm, #endasm を認識しない…という問題が。

調べたら、プロジェクのPropertiesのXC8 Global Optionsの”C standard”を”C 90″に設定して、XC8 Compilerの”Preprocessing and messages”の”Use CCI syntax”をONに設定すれば使える事がわかった。

XC8 Global Options
XC8 Compiler

追記:
WikipediaのPICの命令

カテゴリー: PIC, ソフトウェア | タグ: , , , , , , | コメントする

MicroPythonのドキュメント

MicroPythonのドキュメントを見つけたのでBookmark。
MicroPython 1.12 ドキュメント

カテゴリー: Bookmark, LEGO | タグ: | コメントする

チェビシェフ脚

チェビシェフ脚というリンク機構を知ったので、LEGOで作ってみました。

チェビシェフ脚についてはこちらを参照のこと。

カテゴリー: LEGO, 作ったモノ | タグ: , , | コメントする

ADKって何だっけ?

YouTubeのアナリティクス画面を見ていて「MPU-6050 + Arduino UNO + ADK + Android」というタイトルの動画が見られているのがわかった。

「これ、何だっけ?」と思ったら、AndroidにArduinoを介してセンサーとかを接続できるADKというライブラリだった。ADKの発表は2011年でかなり古い。

Smartphone Worldの記事
リアルとアプリをつなぐ「Android Open Accessory Development Kit(ADK)」とは ―― Androidとクラウドとハードウェアの未来

Androidの開発者サイトでの概要
周辺機器・概要

Arduinoのサイトでのガイド
Guide to the Arduino ADK
This is a retired productって書いてある…

カテゴリー: Android, Arduino, Bookmark | タグ: | コメントする

コンデンサーの単位変換表

偶然見つけたのでリンクへ追加しました。

Standard Capacitor Values Conversion Chart pF – nF – uF

カテゴリー: Bookmark | タグ: , | コメントする

やってみよう!#3 可変抵抗器(ボリューム)を調査する

やってみよう!シリーズの第3弾として、「可変抵抗器(ボリューム)を調査する」をYouTubeにアップロードしました。

カテゴリー: やってみよう!, 基礎知識, 部品 | タグ: , , , | コメントする

PiStorms

こんなものあるんですね!
EV3の代わりにRaspberry Piを使ってロボットを動かすみたいな。
PiStorms LEGO Interface

PiStormsのシステムイメージ図
サイトからのイメージ

カテゴリー: LEGO, Raspberry Pi, ロボット | タグ: , , | コメントする