fc2ブログ

名張市つつじが丘おもちゃ病院

三重県名張市つつじが丘でおもちゃ病院を開院しています。年中無休で修理は無料、部品代のみ実費です。おもちゃの修理依頼は tutuji@cb4.so-net.ne.jp へメールにてご連絡下さい。なお、宅配便での受け付けは行っておりません。このブログにはおもちゃ等の修理事例やツール製作などを載せていきます。故障診断や修理方法の改善等、ご意見をお寄せ下さい。

PIC電子オルゴールVer6_3のバグ改修(IOC設定関連)

【前振り】
PIC電子オルゴールのサンプルプロジェクトの多くは非稼働時はIOC割り込みを仕掛けてSleepさせているのだが、その処理にとんでもないバグがあった。

【バグの内容】
改修前のコード
PIC電子オルゴールVer6_3のバグ改修(IOC設定関連)改修前

先ずは、IOC設定の前に行っている「ポートの空読み」だが、これは不要だ。僕の遠い記憶では、「IOCは直近の読み込み値との比較」であるので事前にポートを空読みしておく必要があると思っていた。改めてデータシートを確認したら、そのような記述は見当たらなかった。しかし、僕は何故ずっとそう思っていたのだろうと他のデータシートを見たら、12F629には「IOCは直近の読み込み値との比較」としっかりと書かれていた。また、「GPIOを読み直すことでIOCフラグがクリアされる」とのことだ。
PIC電子オルゴールVer6_3のバグ改修(IOC設定関連)12F629IOC
レガシーなデバイスではそうだったのだ。僕はIOCを理解していなかった。。。

PIC電子オルゴールでサポートしているデバイスは16F18xx以降なので「ポートの空読み」は必要無かった。

致命的なバグは、PIC電子オルゴールでは割り込みが許可された状態(GIEがセット)で動作しているにも関わらず、いきなり「IOC割込みを許可」していること。「IOC検出表示をクリア」してからsleep命令が実行されるまでの2命令サイクルの時間内に実際にIOCが発生すると割込み処理へ分岐してしまう。ところがIOC割り込み処理を用意していないのでIOC割り込みフラグがクリアされることなく、割り込み処理が無限に繰り返されることになる。

もう一つのバグは、SWがオンの状態でSleep処理に入ってくるとWakeupしないことだ。SWがオフであったからこそSleep処理へ飛んできたのだが、メインループでSWのオフを判定してからSleep処理へ飛んでくる間にオンになった場合に発生する。SWのチャタリングの発生具合によっては発生し得る。これは、蚊蜻蛉さん に指摘されて気が付いた。多謝。

改修後のコード
PIC電子オルゴールVer6_3のバグ改修(IOC設定関連)改修後

上記のように、Sleepへ移行する前には、「割込みを禁止(GIEをクリア)」してから「IOC割込みを許可」するようにした。Wakeup後には、「IOC割込みを禁止」してから「割込み許可(GIEをセット)」する。

「ポートの空読み」をやめて、SWがオン状態であった場合はSleepしないで戻るようにした。上記のコードでSWのオフを確認してからsleep命令が実行されるまでの間にオンになった場合はIOCフラグがセットされるのでsleep命令からすぐに戻ってくる。

【ダウンロード】
バグ修正は完了していて、公開ファイルは修正後のものに入れ替え済みである。
orgel6_3は ここから ダウンロードできる。

【余談】
改修前のコードで、sleep命令で休止中は割り込みが許可されているので、IOCが発生すると割り込み処理へ分岐するように見えるが、実際には分岐しない。

例えば、12F1822のデータシートでは
PIC電子オルゴールVer6_3のバグ改修(IOC設定関連)SLEEP中の割り込み
「sleep命令の直後の命令はISRへ分岐する前に必ず実行される」となっている。修正前のコードではsleep命令の直後の命令は「IOC割込みを禁止する」命令であり、それが実行されるので割り込み処理へは分岐しないことになる。

試しに、下記のようにsleep命令の後にnop命令を入れると、割り込み処理がループしてダンマリになる。
PIC電子オルゴールVer6_3のバグ改修(IOC設定関連)割り込みダンマリ実験
関連記事
スポンサーサイト



  1. 2021/01/15(金) 23:32:40|
  2. 電子オルゴール+音声再生
  3. | コメント:1
<<STM32電子オルゴールVer1_1(途上版のリリース) | ホーム | PIC電子オルゴールVer6_3のリリース(2線SPIのサポート完了)>>

コメント

2線SPIなら音声再生とLED点滅も

最新バージョンの目玉、2線SPI接続による音声再生の試作報告です。
サンプルプロジェクトは、orgel_1840_CdS.x を土台にしました。
8ピンPICでも余裕があるため、その分、応用範囲が広がったと感じます。
部品点数が若干増えますが、CdS操作やLED点滅も実装できました。
https://blog.canpan.info/charts/archive/312
  1. 2021/02/13(土) 12:55:09 |
  2. URL |
  3. ToyDr.わたなべ #9q2FTWbs
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

プロフィール

大泉茂幸

Author:大泉茂幸
名張市つつじが丘おもちゃ病院
名張市つつじが丘南3番町129番地
mailto:tutuji@cb4.so-net.ne.jp

子どもの頃から趣味は電子工作一筋でやってきました。理科離れが進む中で科学技術に興味を持つ子どもが少しでも増えて行くことを願って、子ども達に電子工作の活動の場を提供しています。

1981年からおもちゃ病院の活動を始め、2014年に三重県名張市への移住を機に「つつじが丘おもちゃ病院」を開院しました。自分でおもちゃを設計し製作する【おもちゃ工房】と、マイコンを応用した電子工作を楽しむ【マイコンクラブ】も併設しています。新規参加メンバーを募集しています。

当ブログで公開している技術情報や成果物の複製、改変および再配布はフリーです。読者様のおもちゃ病院活動のお役に立てば幸いです。ご利用いただいた結果や感想等を記事へのコメントやメールでフィードバックしていただけると有難いです。なお、公開ファイルは最新版を載せているので、古い記事の内容から変わっている場合があります。

公開しているファームウェアについては 目次ページ か 全国のおもちゃ病院様での使用実績 をご覧下さい。


当ブログへのリンクはフリーです。

カテゴリ

おもちゃ修理技術 (302)
¦ ・電子オルゴール+音声再生 (123)
¦ ・音声再生・録音再生 (39)
¦ ・2.4GHzラジコン (92)
¦ ・レガシーラジコン (31)
¦ ・赤外線リモコン (5)
¦ ・タッチセンス (8)
¦ ・RFID (4)
ツール製作 (58)
¦ ・プログラマー (47)
¦ ・USB-シリアル変換 (5)
¦ ・その他のツール (6)
修理事例 (279)
¦ ・マイコン換装 (121)
¦ ・電子・電気修理 (114)
¦ ・メカ修理 (44)
製作記事 (20)
PIC開発 (15)
AVR開発 (5)
LPC開発 (3)
STM開発 (2)
R8C開発 (6)
CH32V開発 (13)
おもちゃ病院 (12)
ドクター研修会 (8)
未分類 (0)

最新記事

最新コメント

月別アーカイブ

訪問者数

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する

QRコード

QR