生成AI、Gemini様に「タイマで割り込みをするプログラムを書いて」とお願いしてます。ここまでGemini様は2勝2敗2分け(マイコン1機種で2環境やったものがあるので機種としては5)です。今回お願いしてみるのは、米MicroChip社のArmコアMCU、SAMD21です。使いやすい機種だけれどもGenimi様は?
※Google様の生成AI、Gemini(無料プランだけれども)を使ってソフトをコーディングしてもらっています。
SAMD21マイクロコントローラ
Web上でSAMD21とつなげて書かれていることが多いので、それにつられて書いてしまってますが、”SAM D21″とSAMとDの間にスペースを入れた方が良いようです。SAMという名を冠したマイクロコントローラ(マイコン)の大きなシリーズの中でD21ファミリという比較的ローエンドの製品という位置づけのようです。出元はマイコン業界の雄、確実に5本の指に入ってらっしゃる米MicroChip社です。シリーズ源流はMicroChipに買収されたATMEL社製品だと思いますが、買収後もこのファミリ製品は繁栄してます。SAMは大族、MicroChip社のSAMファミリの全貌図が以下に。
SAM Microcontrollers Based on Arm® Cortex®-M Cores
さて今回この中のSAMD21G18という機種指名にて、以下のようにGoogleの生成AI Gemini様に投げかけてます。いつもながら茫漠としてます。
SAMD21G18で1ms毎にタイマで割り込みをするプログラムを書いて
なんでSAMD21G18かと言えば、理由は簡単、手元にSAMD21G18搭載の超小型マイコンボード、Seeed Studio製Seeeduino Xiaoがあるためです。円安で海外製の半導体やボードの価格が上がるなか、今だに「手がとどく」お求めやすい逸品であります。
Gemini様のご回答
例によってまずは3案を並べて拝見させていただきました。全てC言語ソースが生成されてました。特にビルド環境については言及がありませぬ。MicroChip社製品なので、MicroChip社の純正開発環境 MPLAB X IDEかもしれません。でも、ちょっとね。MPLAB X IDEはPIC16Fのビルドでいつもお世話になっておりますが、SAMD21のビルドでは使用したことがありません。知らんけれどもPIC16Fでの経験からすると分厚い自動コンフィギュレーションツール(GUI)のサポートがある筈。それ抜きで「さらっとした」コードだけをご提示いただいても実機上で動くハズもありませぬ。生成していただいたのはあくまでタイマ割り込みを使う「ひな型」的なものと理解しました。強力で自己完結したコンフィギュレーションツールを使うならばその位置づけはビミョ~。
そこでGeminiのプロンプトに追加のお願いをしました。
Arduino環境でのソースにして
なにせターゲット機「Seeeduino Xiao」はSeeeduinoというお名前のとおり、Arduino IDE環境でプログラム作成を行うことを前提としているためです。その辺の解説があるSeeed社の製品ページ(通販ページ)が以下に。
https://jp.seeedstudio.com/Seeeduino-XIAO-Arduino-Microcontroller-SAMD21-Cortex-M0+-p-4426.html
結論からいうと、Arduino環境のソースとしてもマズイ感じのソースが出来上がってました。目立つところを列挙すると
-
- setup()、loop()関数と並列にmain()関数がある。
- tc0という16ビットタイマを使おうとしているようにみえる
Arduino環境のソース、.ino形式にはmain()関数がありません。これはmain()関数が無いというわけではなくて、Ardinoのプリプロセッサで処理される .inoソースに無いというだけで、「裏」のシステム側のソースにはmain()があります。プリプロセッサの処理後、みんなまとめてC++コンパイラが良きに計らってくれるわけです。よって、.ino形式前提のsetup()、loop()関数に並列におかれたmain()関数は何かの勘違いっす。慌て者だな。
また、タイマのインスタンスとして TC0 という16ビットタイマのオブジェクトが最初からある前提でソースがかかれているようです。しかし、SAMD21のタイマはこんな感じです。
-
- TCC0~TCC2、24ビットのコンペア・キャプチャ・タイマ
- TC3~TC7、16ビットタイマ、TCCよりは非力だがコンペア・キャプチャ機能も含む
TC0というのは何か誤解してる?感じっす。なお、SAMD21のタイマについては以下の別件シリーズで調べてます。
AT SAMの部屋(14) XiaoでもGo!machine.TCC1使用、PWM出力
上記はTiny Go言語からSAMD21のTCC1を使ってますが、Go言語だろうとC言語だろうとハードウエアレジスタの制御は似たようなもん(いい加減だな。)
一応、Gemini様のご回答のソースをそのまま、Arduino IDE環境にコピペして、ターゲット機をSeeeduino Xiao(SAMD21マイコン搭載の奴。Seeduino XiaoもSAMD21搭載品だけなく、ESP32とか、RISC-V搭載とかいろいろ派生品種が増えているので要注意っす)にしてみたところが、コンパイルエラー続出でボロボロでした。
実機動作するTCC0タイマを使ったプログラム
実際にTCC0タイマの割り込みを使ってLチカを行うサンプルプログラムが、Arduino環境のSeeeduinoのボードパッケージ傘下に含まれていました。手元の環境での在処は以下でした。
パッケージのインストールパス\packages\Seeeduino\hardware\samd\1.8.5\libraries\TimerTCC0\examples\ISRBlink
上記に格納されていたサンプルプログラムはArduino環境でターゲット機をSeeeduino Xiaoに向ければ問題なくビルド出来、実機でも動作しております。こんな感じ(点滅するのはオレンジのLEDの方。)
機種によってはやっぱりGemini様のお勉強が追い付いてない。。。マイコンのタイマとかマイナーなことを聞くのが悪い?