MacBookでPICマイコンを書込むために
PicWriterUSBによってホストOS非依存のPICマイコン書込み環境が実現出来ましたので、当初の目的であったMacBook Pro(M1)にてPICマイコンのソフト開発が可能になりました。IDEとしてMicrochipのMPLAB X IDEがありますので、XC8コンパイラとの組合せでMac上でも開発は行なえます。
ですが、私の環境だけなのかもしれませんがよく落ちます→MPLAB X IDE
M1へのネイティブ対応が無いためかもしれませんがなかなかにストレスです。また、PicWriterUSBは単にHEXファイルのコピーを行うだけですので、折角のMPLAB X IDEもデバッグ機能は使えずエディター+ビルドボタンでしかありません。むしろ使い慣れたエディターでソースを書いてターミナル上でコンパイル作業を行った方が快適なくらいです。
そこでVSCode(Visual Studio Code)+PicWriterUSBにてPICマイコンのソフト開発環境を構築することにしました。実はPicWriterUSB=RP2040の開発もVSCodeを使用しています。こちらの環境設定も別途記事に纏めたいと思います。
VSCode + XC8コンパイラ
まずはVSCodeとXC8コンパイラのインストールが必要ですが、既に色々と情報が溢れていますからここでは説明を省略します。VSCodeがアプリとして実行可能かつターミナル上でxc8コマンドが使える状態にしておいてください。
(ちなみにですが、VSCodeはM1プロセッサにネイティブ対応なので何となく気持ち良いです)
VSCodeは非常にカスタマイズ性が高くプラグイン(Extension)も豊富で、自分の好み通りに仕上げていくのも楽しみの一つかと思います。ここではVSCodeのカスタマイズに関してあまり突っ込んだ説明はしませんが、C/C++ Extension PackとJapanse Language Packはインストールしておく方が良いかと思います。
早速、サンプルコードをビルドする環境を整えていきます。フォルダ構成と配置されるファイルは下記のようになります。
| 1 2 3 4 5 6 7 8 9 10 11 | work/  └── blink/         ├── .vscode/        │     ├── c_cpp_properties.json        │     ├── tasks.json         │     └── pic_program.sh        ├── src/        │     └── main.c        └── out/              ├── blink.hex              : | 
.vscodeフォルダの3ファイルにて環境設定&動作設定を行います。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | {     // See https://go.microsoft.com/fwlink/?LinkId=733558     // for the documentation about the tasks.json format     "version": "2.0.0",     "echoCommand": true,     "tasks": [         {             "label": "build",             "detail": "Build C source files",             "type": "shell",             "command": "xc8",             "args": [                 "--chip=16F1823",                 "-Oout/${workspaceFolderBasename}",                 "src/*.c"             ],             "group": {                 "isDefault": true,                 "kind": "build"             },             "problemMatcher": []         },         {             "label": "clean",             "detail": "Clean output files",             "type": "shell",             "command": "rm",             "args": [                 "out/*"             ],             "problemMatcher": []         },         {             "label": "program",             "detail": "Program hex file to device",             "type": "shell",             "command": "${workspaceFolder}/.vscode/pic_program.sh",             "args": [             ],             "dependsOn":[                 "build"             ],             "problemMatcher": []         }     ] } | 
| 1 2 | rm -f /Volumes/PicWriter/*.hex cp out/*.hex /Volumes/PicWriter/ | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | {     "configurations": [         {             "name": "PIC16F1823",             "includePath": [                 "${workspaceFolder}**",                 "/Applications/microchip/xc8/v2.40/pic/include",                 "/Applications/microchip/xc8/v2.40/pic/include/c99",                 "/Applications/microchip/xc8/v2.40/pic/include/proc"             ],             "defines": [                 "__XC8",                 "__PICC__",                 "_16F1823",                 "__interrupt()="             ],             "cStandard": "c99",             "cppStandard": "c++17",             "compilerPath": "",             "intelliSenseMode": "gcc-x64",             //"intelliSenseMode": "macos-gcc-arm",             //"intelliSenseMode": "clang-x64",             "browse": {                 "path": [                     "${workspaceFolder}**",                     "/Applications/microchip/xc8/v2.40/pic/include",                     "/Applications/microchip/xc8/v2.40/pic/include/c99"                 ],                 "limitSymbolsToIncludedHeaders": true             }         }     ],     "version": 4 } | 
pic_program.shには実行属性を与えておいて下さい。これは単にPicWriterドライブにHEXファイルをコピーしているだけです。.vscodeフォルダ以外に置いても構いませんが、他のフォルダに置く場合はtasks.jsonも修正して下さい。c_cpp_properties.jsonにてIntelliSenseの設定をしています。使ってみるとやはり便利ですね。→IntelliSense
またoutフォルダは自動生成されませんので「mkdir out」などして作っておいてください。
ソースコードは下記になります。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | /*  * File:   main.c  * Author: mato  *  * Created on Oct15, 2022, 6:46 PM  */ #include <xc.h> // PIC12F1822/16F1823 Configuration Bit Settings // CONFIG1 #pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input) #pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled) #pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled) #pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = OFF       // Internal/External Switchover (Internal/External Switchover mode is disabled) #pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled) // CONFIG2 #pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off) #pragma config PLLEN = OFF      // PLL Enable (4x PLL disabled) #pragma config STVREN = OFF     // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset) #pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming) // クロック周波数指定 // __delay_ms()関数が使用する #define _XTAL_FREQ 8000000 void main(void) {     // PICマイコン設定     OSCCON = 0b01110010;  // 内部クロック周波数を8MHzに設定     ANSELA = 0b00000000;  // すべてのピンをデジタルモードに設定     ANSELC = 0b00000000;  // すべてのピンをデジタルモードに設定     TRISA  = 0b00001010;  // GPIO-Aピン出力モード設定(RA3ピンは常に入力)     TRISC  = 0b00100000;  // GPIO-Cピン出力モード設定(RC5をRxとして入力)     //ボーレートジェネレータの設定     // 115200 (best case for 8MHz clock)     SYNC = 0;     BRGH = 1;     BRG16 = 1;     SPBRG = 16;     //TXSTA     //CSRC , TX9 , TXEN , SYNC , SENDB , BRGH , TRMT , TX9D     CSRC = 1;     TX9 = 0;     TXEN = 1;     SYNC = 0;     //SENDB =     //RGH = 0;     //RCSTA     //SPEN , RX9 , SREN , CREN , ADDEN , FERR , OERR , RX9D     SPEN = 1;    // serial port enable bit     RX9 = 0;     // 9bit receive     SREN = 0;    // シングル受信イネーブル ビット 非同期モードでは無視される。     CREN = 1;    // 連続的な受信イネーブル ビット     ADDEN = 0;   // アドレス検知 非同期の8ビットモードでは無視される。     // LEDを消灯する     LATA5 = 0;     // LED点滅処理(永久に繰り返す)     int i;     for(i=0; ;i++) {         // LEDを点灯する         LATA5 = 1;         __delay_ms(800);         while(TRMT==0){};         TXREG = (unsigned char )(i%10 +0x30);         while(TRMT==0){};         TXREG = (unsigned char )(0xD);         while(TRMT==0){};         TXREG = (unsigned char )(0xA);         // LEDを消灯する         LATA5 = 0;         __delay_ms(200);     }     // 以下の命令は実行されない     return; } | 
準備が整いましたら、VSCodeを起動してメニューからファイル→フォルダーを開く… にて作成したblinkフォルダを選択します。

メニューからターミナル→タスクの実行… を選択するとウィンドウがポップアップしますので「build」を選択します。

パネル内のターミナルに下記のように表示されていればビルドは成功です。

次にPicWriterUSBをMacへ接続し「PicWriter」ドライブが接続されたことを確認して、ターゲットのPICマイコンをPicWriterUSBへ接続します。
VSCodeのメニューからターミナル→ターミナルの分割、を選択するとパネル内にもう一つターミナルのウィンドウが開きますので、下記のように「screen /dev/tty.usbmodemDAE2022CDC001 115200」コマンドを実行します。実行直後に「USB connected.」と表示されていれば正常に接続出来ています。

VSCodeのメニューからターミナル→タスクの実行… →Program を実行します。ターミナル上に下記のように表示されてPICマイコンへの書込みが完了します。

書込みが成功するとRP2040ボード上のグリーンLEDが点灯し「フリーランモード」となり、書込んだPICマイコンのプログラムが実行されます。PIC16F1823 RA5ピンにLEDを接続するとLチカ動作を確認出来ます。
 
無事にタスクコマンド一発でビルド→書込み→動作確認、が出来るようになりました。

 
  
  
  
  

コメント