2015年12月10日木曜日

Excel VBA Win32API シリアル通信(続編)

Excel VBA いまさらの Win32API シリアル通信の続編

【やり残している事】
  • コマンド送信(WriteFile)してからレスポンス受信(ReadFile)まで100msのタイマ(Sleep)を入れる事でデータを取得できるようになったが、この100msを削りたい
  • レスポンスが無い場合(断線や、電池切れ)に対応が必要
【オシロスコープで調べた結果/100msが必要だった訳】
  • コマンドに対する反応時間は、変動するが50ms以内に全文字受信完了している
  • 従って、最後まで受信した後、ReadFile関数を起動していることになる
  • タイマが無い場合、ReadFile がタイムアウトして受信失敗する
    SetCommTimeouts の設定が不適切
【調べた事/同期I/Oと非同期I/O】
  • WriteFile, ReadFile には同期I/Oと非同期I/Oの使い方があり、
    ユーザーフォームのモーダルモーダレスの関係と似ている
  • 非同期I/Oで使用する場合は、OVERLAPPED構造体による指定が必要
  • 今回の要件からは、非同期I/Oにする必要は無いと思われる
【調べた事/イベント駆動】
  • タイマに頼らず、通信条件変更に対応するにはイベント駆動する必要がある
  • 同期I/Oと非同期I/Oどちらも使える
  • 送信し終わった(WaitCommEvent)(ただしライン上の信号は不明)
  • 受信開始はわかる(WaitCommEvent)
  • 受信文字数を予め調べることが出来る(ClearCommError)
【実施方針】
  • 100msタイマを置き換えられればいいだけなので、拘りすぎないで
【試行1】
  • ClearCommError で受信文字数を予め調べる方法
  • コマンド送信後100ms経過後に挿入しても、文字数ゼロで取得できず頓挫
  • 考えが変わり次の手へ
【試行2】
  • ReadFile 関数に規定の文字に達するまで受信する機能がある
  • 受信すべき文字数を設定すると100msタイマは不要となり、問題解決
  • 規定文字に達しない場合のタイムアウトの設定が必要
【試行3】
  • 変動要素の文字数より、決まっている最終文字でイベント発生すればいい
  • SetCommState関数のDCB構造体に、このイベント発生文字を指定
  • WaitCommEvent関数で待って、ReadFile へ
  • これは簡単に出来て、問題解決
【試行4】
  • 後の処理で受信文字数の算出は必要である
  • 従って、受信文字数を監視すればよく、試行3の WaitCommEventで最終文字を待って ReadFile する必要は無く、試行2の受信文字数で抜ければいい
  • ただし、すぐに ReadFile に入るので、待ち受け開始から受信終了までビジー状態が長く続く
  • 正常時はタイムアウトで抜けるのではなくて、最後の文字受信で抜けるから最速
  • レスポンスが無い場合に対応するため、タイムアウトの設定は必須
【レスポンスが無い場合】
  • WaitCommEvent はそれ自体にタイムアウトの設定が無いので
    レスポンスが無い場合にハングアップしないよう別途タイマ設定が必要になる
  • タイムアウトは、ReadFile だけで済むのだから イベント待ちする必要はない
    (レスボンスが返るまで長時間待つ場合はNG)
【タイマ/SetCommTimeouts の設定の確認】
  • コマンド送信と、レスポンス受信を100回繰り返すループにして、時間を計測した
  • 当初、10秒を超えていたが、4秒程度まで詰められた
  • タイマで抜ける方法より、規定文字数で抜ける方法が早い
  • タイマのインターバルの設定は、受信文字数で抜けない使い方の場合、最終文字かどうかは分からないのでこのタイムアウトが大きく影響するので、通信速度に応じて小さく
  • タイマの トータルの設定は、ReadFile 関数に指定した文字数に影響を受ける
【○○の手習い】
「この100msを削りたい」という問題解決のため、どうすればいいかを調べ始めるも、全く頭に入ってこない。同じことを何度も読み返したりしているうちに少しずつ言葉に慣れ、分からない事が何かが分かり始めた感じ。ネットの情報は多いのだが一気に解決に結びつくサイトやサンプルを今回は見つけられなくて、他言語の解説やMSDNの解説を眺めざるを得なかった(さらに分からなくなる)、で一進一退。
最近は、集中力が持続できず、他へ逃げてしまう自分との戦いになってきている気がする。

2015年11月17日火曜日

NTSCカメラと液晶モニタ

10年位前に購入したカメラを、玄関モニタ用に設置した。これまで何度も頓挫、やっと実用化できた。
モニタのケースは準備してあったので追加工と塗装だけだったがカメラケースには悩んだ。ホームセンターで、塩ビパイプや樹脂製の花鉢など手に取るところまで行ったが、結局取り付け金具も含めて廃材で済ませた。購入したのは、塗装に使ったカラースプレーだけ。
NTSCのカメラなので壊れたら替えはきかない。

【カメラ】
  • ドーム型
  • 2006年5月、秋月から14,000円で購入
  • NTSC出力、電源DC12V
【液晶モニタ】
  • 5.6インチ
  • 2003年1月カマデンから13,650円で購入
  • NTSC入力、電源DC12V
【モニタケース】
  • 電源は壊れた外付けハードディスクの12V電源を使用
  • ケースは15年以上使われずじまいの壁掛け型ケース
  • 日焼けして変色していたので、スプレー塗装した
【カメラケース】
  • カメラケースはある装置に使われていた防水ケース
  • ただし穴だらけ
  • 耐候性はありそう
【ケーブル】
  • FMアンテナを撤去してケーブルを再利用する
  • 電源を沿わせる(DC重畳しない)
  • FMラジオに妨害が入り、電源線の根元にノイズ輻射防止用のコアを入れた

2015年11月10日火曜日

Excel VBA いまさらの Win32API シリアル通信

10年以上前に取り組んだ時はMSCommで実現していたが、Windows 更新プログラムの適用で使えなくなってしまうのでまずい。

今回は別の手段、APIによる方法を試す事にした。いくつかのサイトを見て、例文を使わせてもらっい、指定の時間間隔でデータを取り込んでEccelシートに書き込み、グラフ(スパークライン)表示するところまで、大きな困難も無く数日でデモ用簡易版プログラムは完成した。

ところが、依頼者のパソコンで使うとまるでダメ。開発機と違う自分のパソコンでも再現、半分以上の受信データを取り逃がし、根本的に問題有りと気づかされる。
開発機でまれに起きていた時は、何か端末側で他のタイミングとぶつかるためで、リトライすればいいと考え、対策した。
よく考えれば、送信処理後、送り終わったかは確かめもせず、すぐに受信処理に入る手順でもたまたまよかったに過ぎない。通信速度が115200ではなくて、9600bpsだったら全くダメだったかもしれない。
コマンド送信後に固定タイマを入れることで、データを取り逃がすことは無くなり、デモ用のプログラムは翌日渡せた。


本ちゃんの依頼が来たら、タイマで済ませられないので、解決策を講じないといけない。
  • VB2005では新しい解決法(SeriaPort コントロール)が提供されているが、それは使えない
  • 実際は、受信データ長がシステム構成で変わる(受信終了までの時間が変わる)
  • データ要求コマンドに対する反応時間(一文字目)が、どのくらい変動するものかも不明
  • 通信速度を変えてもOKにするにはイベント駆動する必要がある
  • オシロスコープの出番
  • 毎回、返答が無い場合(断線や、電池切れ)を想定して対処する必要がある
イベント駆動について調べると、途端にハードルが上がり、頭に入ってこない。分かることは
  • 送信終りのイベント検出
  • 受信データの先頭文字は固定文字である
  • 送信内容から受信文字数は計算できるので、正常受信完了は分かるはず

2015年11月2日月曜日

Excel VBA WMI で FTDI 社製 FT232 の ID が読めない

「USBシリアル変換ケーブルの、IDを読み込みたい」がテーマ。
シリアル通信仕様の機器(温度ロガー)に接続したUSBシリアル変換ケーブルの固有シリアル番号を取得して、VBAの動作環境を特定したい。
WMI (Windows Management Instrument) を使用すれば、情報(デバイスインスタンスID)を取得できる。サンプルコードで問題なくディスクドライブは取得できた。ところが、手持ちの10年前くらい前に購入したアーベルl製USBシリアル変換ケーブルの場合が、取得できず悩まされた。
  • Win32_DiskDrive     ・・・これはディスクドライブ
  • Win32_Printer     ・・・これはプリンタ
  • Win32_USBController     ・・・これはポートのUSBコントローラーが出てくる
  • Win32_ComputerSystemProduct     ・・・コンピュータ名やCPU番号
  • Win32_SerialPort     ・・・ダメ
  • Win32_Ports     ・・・ダメ
FTDIだけだと思われるが、全て当たってみるには大変そう。で、一年以内に絞ってネット検索してみたら、マイコンの掲示板にヒントを見つけた。
早速試したところNameで見つけ出せたので、次のようなコードを試した。

  Set colPort = oService.ExecQuery("Select * From Win32_PnPEntity")
  For Each Serial In colPort
        If Serial.Name = "USB Serial Converter" Then
            Debug.Print Serial.Name
            Debug.Print Serial.DeviceID
        End If
  Next
  • クエリー条件を"Win32_PnPEntity"とすると、該当する項目がずらずらと出てくる
  • "USB Serial Converter"にて抽出する
FTDI製のFT232チップを使用したUSBシリアル変換ケーブルは、これでOK。
おまけとして、CPU番号を見れることも分かったので、USBシリアル変換ケーブルを使わない場合はこれでパソコンを特定できる。
WSIの解説サイトのサンプルを見ていると、マクロから何でも出来てしまいそうで、恐ろしくもなる。

2015年10月27日火曜日

Excel VBA 異常発生をメールで通知

Excel VBA で「ワイヤレス温度計の温度データをモニタして、異常発生時にメールで通知」がテーマ。受信は不要なので、手早くできる方法を選択したい。
ネットで色々探って比較したが、その多くが、いつもお世話になっている「Excelでお仕事」のサイトの「CDOでメール送信」というページの記事を基本にしているようだ。
Gmail を使用したテストメールが成功するまで少し悩まされたので、整理しておく。(他のメールハーバーは試していない)

グーグルヘルプにある、メールが届かないない場合のチェックリスト
  • Gmail で POP や IMAP が有効になっているか
  • SMTP サーバーの SSL を有効にしたか
  • SMTP サーバーの認証を許可したか
    メール クライアントで SMTP サーバーの [認証を許可] がアクティブになっていることを確認します。
  • 入力したユーザー名とパスワードが合っているか
    @gmail.com」まで入力していることを
  • 添付ファイルを送信しようとしているか
    実行ファイル、 25 MB を超えるメッセージの送受信はできない
  • それでもメールを送信できない場合、SMTP サーバーをポート 465(SSL)とポート 587(TLS)で設定していて、メールの送信ができない場合は、ポート 25(SSL)で を設定してみ
  • SMTP サーバー設定、「smtp.gmail.com」に変更して、設定を保存してみて
  • SMTP サーバーに接続できるか、Telnet で試す
まず、Telnet で試してみるべきかも。これがダメなら全て徒労になる。

うまくいかなかった原因は、Gmai が昨年から2段階認証となったこと。古いサイトの記事では出てこない。「安全性の低いアプリへのアクセスを有効」にしておく必要があった。
上の項目は、Gmail の「メール設定」「メール転送とPOP/IMAP」画面だが、ここではなくて、Googleアカウントヘルプから、「安全性の低いアプリがアカウントにアクセスするのを許可する」を選択しておく。
  • すると、「 安全性の低いアプリへのアクセスが有効になりました」と通知メールが届く。
  • Gmai で実際運用する場合は、2段階認証にしてアプリ用のパスワードを使うようにした方がいいのかも
今回、いろいろな人の作成したサンプルコードを比較してみて、パッと見、行数がエラく違ったりしてずいぶん違う印象を持ったのだが、解析していくと当然のことながら同じ。構造体でひとかたまりのデータにして渡しているいるだけだ。(送信するだけなら簡単)

2015年9月23日水曜日

PHOTO-U2のLCDを活かす(未完)

PICをコントローラとして使い、小型ディスプレイとして使いたければ

  • 4Dsystems uVGA-III, uVGA-II
  • SSD1963, 864x480ドット, 24bitフルカラーのフレームバッファを持つ、液晶コントローラモジュール[CB-SSD1963]
  • TECTOY SSD1963EVK
  • RTD2662, RTD2660 Flat Panel Display Controller

これらのデバイスを使用したボードが入手可能。LCDコントロール出力を備え、マイコンからバッファに表示データを書き込む。

メッセージボードとして製作。使用するには、フォントの入手の問題がある

ここまで調べただけ

2015年9月1日火曜日

TDS3012 (オシロスコープ)LCDの故障(2)(分解)

久しぶりに使おうとしたら、画面が真っ白。しばらく置いても全く変化無し、重傷。また分解することにした。ブログに手順が残っていたのでスムースに出来た。

前回はメイン基板を外して裏返してみるところまでしなかった。今回は、ホームセンターで工具を購入した。トルクスドライバの長いのがないと外せないネジが2ヶ所あり、このためだけに。
LCDへのコネクタのの清掃とハンダ付け点検などで、元通りになった。

2015年8月29日土曜日

Excel VBA シートの非表示

シートを非表示にしたくなるケース
  1. 作業用に一時的なシートを使うような場合
  2. 設定用の条件などが記載されたシート
  3. データベースの台帳のようなシート
ActiveWindow.Visible = False
  • これを実行したまま保存すると、非表示のまま保存され、開けても表示されない
  • 非表示で作業したブックを出力するような場合(ケース1)は、
    必ず保存前に、Visible = True にしないと、開けないブックになってしまう
Application.Windows(Name).Visible = True

  • 表示は上のように対象を特定すること
  • 非表示だったシートを再表示しても、アクティブにはなるわけではない

ところが、マクロが実行されないことには、非表示にならないので、上のケース1の場合は構わないが、2,3のケースは、ブックの拡張子変更や、別名保存されたりすると「マクロを有効にするまで」は丸見えとなってまずいので
  • シートのタブから「シートの非表示」を実行して
  • ファイルのバックステージ「情報」で、「ブックの保護」「ブック構成の保護」で
    パスワードで保護する


2015年7月20日月曜日

エアコンのリモコン修理

「長時間使用されないときは液もれ防止のため電池を取出してください」の通りの故障。
  • 東芝のWH-D4N(エアコン用/平成9年購入)
  • 実家の客間、使用頻度かなり低い
  • 電池の液漏れを見つけたので、掃除した(洗剤は使っていない)
  • 電池交換したが動かない
「ちょっと見て」ということで、確かめてみると。
  • 本体は、強制ボタンで動作OK
  • リモコンの電池を入れ直して
  • リセットしてもLCDが全部点いたり、全く点かなかったり
  • リモコンLEDが光らない
リモコンを預かって帰る。
  • 電池ホルダの金具を紙やすりで磨いてみたが全く現象は変わらず
  • リセットからうまく起動できない感じ(LCD表示がブロックごとに明滅)
ここで「リモコンの故障」なので、ネットで探してみる。
  • 同じ型番の中古品がヤフオクで1500円程度
  • ユニバーサルマルチリモコンと称するものがアマゾンで新品444円!
代わりがあるようなのでバラしてみることにする。カバーを分離するのは、とてもやっかい。はめ込み式なので、大小のマイナスドライバを何本も使って、けがしないように慎重に根気よくカバーをはがす。

電池の液漏れは何度も見てきたが、
  • 液漏れは、バッテリホルダから金具を吸い上がって基板のマイナス側パターン周辺を侵食していた
  • 溶けて銅パターンが無くなっているような個所はなさそう
  • LEDの導通はOK
  • 侵食された付近には、何かの設定用と思われるジャンパーが数か所
  • 初期設定から先に進まない=スイッチが放されるのを待っているみたいな感じ
部品面側の掃除だけでは、現象変わらず。
  • 基板を外して、ボタンコンタクト側を掃除
  • 綿棒が随分と汚れるのは導電性の汚れ?
  • ボタン(導電ゴム)側も掃除する
画面はばっちり、各ボタンにも反応するようになった。終了

2015年7月8日水曜日

PIC USB のまとめ

【ネットで調べると】
ネットで自作記事がいっぱい出てくるが、各記事の年代差が大きく、つまみ食いするとかえって混乱する(混乱した)。
  • 2000年ごろから USB が PC の方で一般的になったため記事が出始めている
  • 2005年1月号トラ技:FTDI の USB-シリアル変換IC FT232BM の紹介/CDC
  • 2008年8月号トラ技:付録基板はまだ仮想COMポート
  • 2009年 PIC USB ブートローダーのアプリケーションノート
  • 2010年1月号トラ技:デバイスドライバ WinUSBの活用記事
  • 最近の記事は、ドライバが不要な HID クラスが主だ
【1対N(ホストとターゲット)のパケット単位の通信】
  • N < 128
  • エンドポイントと呼ばれるバッファメモリを介在する
  • パケットに指定されたアドレスをデバイス側で検知して必要なパケットを受信する
  • デバイスに対して送信データがあるかホストから問い合わせる(デバイスからの発呼不可)
  • フルスピードバルク転送モードの場合、最大64バイト(パケットサイズは選択できる)
【エンドポイント】
  • いわゆるメモリ受け渡しみたいな事
  • 双方向のコントロールエンドポイントがひとつ
  • その他のエンドポイントは、単方向で個数はデバイスにより異なる
  • Windowsからはエンドポイント番号を使って読み書きするだけ
  • Windows側のアプリはパケット分割を意識する必要はない(転送サイズは要)
【転送モード】
  • コントロール転送: 必須事項
  • バルク転送: ロースピードモードでは使用できない
  • インタラプト転送: 周期的な小容量通信(マウスやキーボード)
  • アイソクロナス転送: ロースピードモードでは使用できない(音声や動画)
  • 最も高い優先順位をもつ転送はアイソクロナス転送
  • その次は周期的にデバイスへのアクセスを行うインタラプト転送
【デバイスクラス】
  • CDC(Communications Device Class): 文字通信
  • HID(Human Interface Device Class): キーボードやマウス
  • マスストレージクラス:USB メモリ
  • その他
【ディスクリプタ】
  • デバイスディスクリプタ
    ベンダID,プロダクトIDなど、デバイスの特性や属性などの情報
    コントロール転送を用いて、GET_DESCRIPTOR のリクエストを送る
  • コンフィグレーションディスクリプタ
  • インターフェイスディスクリプタ
  • エンドポイントディスクリプタ
  • ストリングディスクリプタ
【レイテンシ】
  • フレーム単位が1msであるということ
  • USB2.0ではマイクロフレームが追加され、125μs単位
  • レガシーIOは、μsオーダーで反応する(割り込み処理)
  • 入出力の反応時間がばらつくことになる(パソコン制御の大きな欠点に)
  • 転送モードにより優先順位も異なる

今回は、「市販品のIOを購入するほどでもない数本程度の入出力(表示ランプやスイッチ)、あるいは自前のプローブ回路のリレー等の制御を低コストで実現するには」がテーマ。
CDCでとりあえず可能であろうことは分かった。HIDデモを動かしてみたところまで(2015年6月作業分)で、整理しておくことにした。
マイクロチップの「デモ」を動かすところまできたけれども、ネットの情報はバラバラなので、トラ技を古い順に目を通してこの資料をまとめた。しかし、ここから先は、2週間経つも全く進展しない。(やる気、集中力のなさはこの不順な天気のせいか?)  雑誌の記事の「あとがき」に「使いこなすまでの壁が高いが、分かれば楽」とあったけれど、具体的に、こうするにはどこをどう改変すればいいか、が今後の課題。目標は、HIDで、例えばみかけジョイスティックで、信号入出力をExcel VBAから実現すること。
Km2Net USB-IO2.0 がそれに近そう。

数年前、装置にログ機能を持たせるとしたらということで、USBメモリかSDカードを追加できないか検討した。この時は、FATシステムを組み込むとメモリを圧迫すること、ブラックボックス部との共存の不安(開発時に余計なところに時間をかけたくない)から、FATをもつ専用のICを使った方がいいと結論し、サンプルを購入したりして試した。

2015年6月23日火曜日

Device - HID - Custom Demos を試してみる

秋月電子の PIC18F4553 仕様USB対応マイコンボード[AE-USBPIC44]を使用してヒューマンインターフェース(HID)クラスを試した。
C:\microchip_solutions_v2013-02-15\USB\Device - HID - Custom Demos
フォルダにある、Firmware からコピーして使った。修正点は次の通り。

  1. デバイス指定変更
    HardwareProfile.h の
      #if defined(__18F4550)
         #include "HardwareProfile - PICDEM FSUSB.h"
      ↓
      #if defined(__18F4553)
         #include "HardwareProfile_PICDEM_FSUSB.h"
  2. ファイル名を修正した
    HardwareProfile - PICDEM FSUSB.h

    HardwareProfile_PICDEM_FSUSB.h
  3. usb_device.cの#include を修正
    #include "../USB/usb_device_local.h"

    #include "usb_device_local.h"
  4. ただし、MPLAB X-IDE, コンパイラ指定は C18 
3.の変更は、インクルードファイルを、マイクロチップソリューションから自前のフォルダへコピーして使用したためのもの。(2015/6/27 修正ファイルと内容を訂正)
ビルド成功後、PIC18F4553 に焼き込んで試した。スイッチとLEDの配置が、基板とプログラムでは異なるが、プログラムの方に合わせた。
  • RD0, RD1 に LED を接続 (秋月の基板は RE2 )
  • スイッチは RB4, RB5 (秋月の基板は RE0, RE1 )
C:\microchip_solutions_v2013-02-15\USB\Device - HID - Custom
フォルダにある、DemosGenericHIDSimpleDemo.exe
を起動する。パソコンと基板を接続すると、すぐにこのサンプルプログラムで動作確認できた。パソコン側は何もする必要は無く、インとアウトが出来ることがわかった。
  • Connect ボタンで接続
  • Toggle LED(s) で二つ同時に点灯消灯する
  • RB5 と GND をショートすると
    State: Not Presses -> Pressed になる(下図の状態)



2015年6月18日木曜日

Microchip Solutions から自前のフォルダへ

【マイクロチップソリューションフォルダから自前のフォルダに再作成してトライ】
秋月電子の PIC18F4553 仕様USB対応マイコンボード[AE-USBPIC44]のデモ「MPLABを使った使用例2」がビルド成功したので、PIC側のプログラムを自前の開発用ワークフォルダの下に作成してみることにした。以下に作業内容を示す。

MPLAB X-IDE v3.00 、microchip_solutions_v2013-02-15 です】
  1. 自分用のフォルダを作成しファイルをコピー
    microchip_solutions_v2013-02-15\USB\Device - CDC - Basic Demo\Firmware
    の中身ををそのまま自分用ワークフォルダにコピー
  2. プロジェクトを次のようにインポート
    MPLABX -> Inport -> MPLAB v8 Project から
    USB Device - CDC - Basic Demo -  C18 - PICDEM FSUSB.mcp
    をインポートする
  3. MPLABX -> Project Properties から
    PIC18F4550 -> PIC18F4553 に変更
    Compiler は C18, Shift-JIS を選択して、一旦終了する
  4. ここで、Miising Files が14個有りでエラー終了
  5. main.c と HardwareProfile.h の書き換えは済ませておく
    MPLABを使った使用例2に従って
  6. Projects ツリー Header Files 右クリックメニュー Add Existing Item から
    HardwareProfile - PICDEM FSUSB.h
    HardwareProfile.h
    usb_config.h
    の三つ(ワークフォルダ内にある)を登録
  7. Projects ツリー  Source Files に必要な
    main.c
    usb_descriptors.c
    の二つを上と同様に登録
  8. Header Files 右クリックメニュー New Logical Folder から
    [USB Stack] のロジカルフォルダを作成する
  9. Source Files の下にも上と同様に [USB Stack] を作成する
  10. [USB Stack] に登録するファイルは、ワークフォルダとは分けて別にフォルダを準備して、そこへコピーした(他でも使うと思われるので)
  11. C:\microchip_solutions_v2013-02-15\Microchip\Include\USB から
    usb.h
    usb_ch9.h
    usb_common.h
    usb_device.h
    usb_function_cdc.h
    usb_hal.husb_hal_pic18.h
    C:\microchip_solutions_v2013-02-15\Microchip\USB から
    usb_device_local.h
    usb_device.c
    C:\microchip_solutions_v2013-02-15\Microchip\USB\CDC Device Driver から
    usb_function_cdc.c
    をこの"別の"フォルダへコピーする
  12. [Linker Files] は、
    C:\Program Files (x86)\Microchip\MPLABX\v3.00\mpasmx\LKR から
    18f4553_g.lkr をコピーしてワークホルダへ貼り付けてから、登録した
  13. プロジェクトプロパティからインクルードパスを設定する
    C:\Program Files (x86)\Microchip\mplabc18\v3.45\h
    C:\microchip_solutions_v2013-02-15\Microchip/include
    と、自分のワークフォルダへのパスの三つ
  14. 右の成功したプロジェクトのプロジェクトツリーと見比べて同じ構成になるように [USB Stack] に登録する
  15. ここでビルドしてもエラーになった
  16. HardwareProfile - PICDEM FSUSB.h をHardwareProfile_PICDEM_FSUSB.h
    へ名前を変更(右クリックメニューで Rename を使う)
    空白があるとダメみたい
  17. ここでビルドしてもエラーになったら(途中でビルド失敗していたら)、build フォルダに残っている o ファイルを消す
    (正しい方法なのかどうかは不明ですが)
  18. ビルド成功
  19. PICへ書き込むと、PCと通信可となる(6/20確認)
  20. ワークフォルダ内の要らないファイルを削除
メモリ使用量
  • Data 702/2048byte
  • Memory 5802/32768byte で、そこそこ使われる

【あとがき】
要は、右図の様にマイクロチップソリューションの中と同じプロジェクトツリーの構成にすればいいのだけれど、この作業は紆余曲折あった。
まだ道半ばも、いじってみれるところまで来た。
  • XC8へ移行できていない
  • CDCクラス通信でつながったに過ぎない

【あとがき2】2015/06/26
コピーする作業より、要らないフォルダを全て消してフォルダのリネームしたほうが手っ取り早いかも。「マイクロチップソリューション」のZIPファイルを残しておけばいいだけ。

【あとがき3】2015/06/27
ヒューマンインターフェース(HID)クラスのテスト後、インクルードパスの修正箇所を出来るだけ減らしたいので、フォルダ構成、コードの修正箇所を見直してみた。またまたビルド失敗を繰り返すハメになって、試行錯誤(私の悪い癖)ではだめだと思いきちんと、コピー元、コピー先のファイル一覧表を作るなどして頭を整理してみた。
  • マイクロチップソリューションのフォルダのパスがあると中途半端にうまくいってしまてNG
  • 別のテーマの usb_config.h を登録してしまい、定数が定義されていないエラーが解決できずてこずった
  • usb_descriptors.c も同様で、テーマ別のフォルダに置かれているファイルには注意
    (同じ名前で多数存在する)
  • パスは、自分のワークフォルダとUSB共通ファイル用フォルダ、関数用に MPLAB X-IDE、の3つでOKだった

The programmer could not be started: Could not acquire hardware tool communications resources:

あれやこれや書き込んで試したりしているうちに
上のメッセージが出て、ICD3 で書き込めなくなった。

Project Proparties
ICD3->Reset

で元に戻った。

秋月PIC18F4553仕様USB対応マイコンボード「MPLABを使った使用例1」を
デバッグモードで少し使ってみた。

2015年6月17日水曜日

PIC18F4553 USB対応マイコンボードを使ってみた

【MPLABを使った使用例2を試す】
本来の目的だった、購入した秋月電子の PIC18F4553 仕様USB対応マイコンボード[AE-USBPIC44]をパソコンからUSBで使う、を試した。
「MPLABを使った使用例1」が済んだ後、MPLAB X-IDE 導入の大きな回り道をしてしまったが
「MPLABを使った使用例2」の方は説明書に従い、一部異なる部分があったが、書き込みまでは難無く終わってしまった。
ただし、データ通信用のマイクロUSB-Bケーブルが届くまで待つことになったが。

【CDC Basis Demo の書き込み/MPLAB X-IDE v3.00】
  1. microchip_solutions_v2013-02-15 -> USB -> Device - CDC - Basic Demo -> Firmware
    の中から
    USB Device - CDC - Basic Demo -  C18 - PICDEM FSUSB.mcp
    をインポート(C18で)した
  2. Project Properties から
    PIC18F4550 -> PIC18F4553 に変更
    Compiler は C18
  3. ここまででは、ビルド成功しないので、以下は秋月の説明書に従う
  4. main.c の書き換えは、秋月の説明書と少し様子が違ったが
  5. void UserInit(void)に以下の接続ピンの定義を追加
        TRISEbits.TRISE0=1; //aki
        TRISEbits.TRISE1=1; //aki
        TRISEbits.TRISE2=0; //aki
        #define aki_sw1 PORTEbits.RE0 //aki
        #define aki_sw2 PORTEbits.RE1 //aki
        #define aki_LED PORTEbits.RE2 //aki
  6. void ProcessIO(void)に以下のスイッチとLEDオンオフ部分を追加
        if(aki_sw1 == 0)
    .............................
            aki_LED = 1;
        }
        else
        {
    >         stringPrinted = FALSE;
            aki_LED = 0;
        }
  7. インポートして書き込むHardwareProfile.hを指示通り変更
  8. リンカーの書き換えC:\Program Files (x86)\Microchip\MPLABX\v3.00\mpasmx\LKRから18f4553_g.lkrを追加してrm18f4550 - HID Bootload.lkrはリムーブする
  9. ここでビルド成功する
  10. 基板のJpをUSBバスパワーに切り替えてICD3を接続、書き込み成功

【PC側は】
C:\microchip_solutions_v2013-02-15\USB\Device - CDC - Basic Demo
\PC Software Example\VCsharp 2005\BasicCommunication\Csharp Simple CDC Demo\obj
\DebugCsharp Simple CDC Demo.exe を実行する

【PCとつないでみた】(2015/6/20)
  • USBケーブルを挿すとPC側は自動的にドライバがインストールされた
  • Csharp Simple CDC Demo.exe を起動
  • com ポートは 3 が表示された
  • connect ボタンを押すと、Connected と PC側に表示
  • 基板の sw2 を押すと、PC側に Botton Pressed と表示
  • PC側から 123 と 入力してSend Data ボタンを押すと 234 と返してくる
以上で動作確認終了。

2015年6月15日月曜日

MPLAB X-IDE, XC8 への移行(3)

【中規模のC18版プログラムを移植してみた】
実際は MPLAB X-IDE, XC8 への移行(2) よりこちらに先に手を付けたが、手におえず中断。移行(2)の成功後再度試した。しかし、うまくいかない。そこで、テンプレートに、本文を張り付けていく方法を試し、両者を比較した。

【テンプレートを使って移植】
これなら、ビルド成功から始まる。本文のコピペとビルドを繰り返す。全て貼り付け終わって、ビルドも成功した。両者の差分をとっても大きな違いは見つからず、リンカや環境の設定に不具合点がある事が確定。
ビルド不成功の原因は後述。

【C18 版のファイルとの相違点(修正した部分)】【XC8 v1.34】
マイクロチップ社の「移行ガイド」に出てくる分
  • ポインタストレージ修飾子 near, far, rom が不要
  • 関数バリアント strcpypgm2ram は、strcpy へ修正
  • eeprom はプラグマが不要
    推奨する方法に書き換えた
  • 割り込みもプラグマの指定、ベクタアドレス指定は不要
    関数名に void interrupt RRRRR(void) と interrrupt を付加
    (ただし動かして確かめたわけではない)
  • strcpypgm2ram -> strcpy
    ROM領域と区別しなくて済む
その他、定義済みと思われる
  • #include <stdbool.h>
    で true=1, false=0 と定義されている
    enum で TRUE, FALSE を定義していたが統一した
  • #define NULL 0 ・・・使ってはいけない
  • CLEAR も使ってはいけない
その他、ワーニング
  • itoa(ival, asc); -> itoa(asc, ival, 16);
    C18の場合と引数の数と並びが違うので修正が必要
  • warning: (765) degenerate unsigned comparison
    warning: (757) constant conditional branch
    のメッセージ。ゼロ以上かの分岐条件に使われる変数だからか? signed を明記
(標準の文字型は C18 ではsigned char XC8 ではunsigned char)
(XC8 User's Guide APPENDIIX A に関数ごとの修正個所が有り)

その他、テンプレートに倣った変更
  • ハードウェア定義の h ファイルに入れていたが、コンフィグは c ファイルに別に作成した
  • テンプレートに従って、クロック周波数の定義を追加した
  • 中身が空の関数は警告メッセージが出るので、すべてコメントアウトした
  • ヘッダファイルを細かく分ける必要は無いのでまとめた
(ディレイはライブラリファンクションがあり、Delaysをインクルードしなくてもいいが、今回はそのまま使った)

バグが見つかる(今更・・・)
  • warning: (758) constant conditional branch: possible use of "=" instead of "=="
  • おっしゃる通り "==" でないとならない、C18では見逃されていた
メモリ使用量(XC8はフリー版)
  • 2011年出荷時(C18ライセンス版)の記録 ROM: 4260byte. RAM: 365byte
  • ビルド後 Data 212byte, Memory 6247byte・・・・コードは1.47倍に増

【落とし穴1.ソースファイル名に使われていたかっこを取ってOK】
プロジェクトをオープンした時、Output の Project Loading Warning タブを開くと

Warning: Project "QQQQQ" refers to file "C:\...\QQQQQ(io).c" that contains spaces or odd characters in its name or its path.

と、オープンした時点で出ているではないか!
  • [ that contains spaces or odd characters ] は、フォーマットで解決済みと思い込んでいた
  • テンプレートから作成したプロジェクトの方には、かっこは使っていない
  • QQQQQ(io) -> QQQQQ_io に修正
【落とし穴2..P1ファイルのあるフォルダ内を全て消したらOK】
Output のエラーメッセージは、

No Rule to make Target....
  • Build フォルダに 更新されていないファイルが残ったままなので消してみた
  • <No Rule to make Target....>が消え、ビルド成功!

【インポートについて】
  • 手順
    New Project  -> Microchip Embedded -> Exiting MPLAB IDE v8 Project
    Next->.mcp ファイルを開く
    Select  Compiler, Select Project Name and Folder, Encording Shift-JIS を選択
  • インポート後フォーマットを適用して、余計な空白を消す
  • この時点で比較用コピーを残しておくとよい
【フォーマット】
  • Source -> Format または、ソース上で右クリック
  • { の配置が変わる(素直に従うことにした)
  • C18ではOKだった余計な空白が詰まるみたい
  • インデントも変わるが、必ずしもそれが正しい位置とは限らない
    一行で完結している while や、struct など
【テンプレートから始める】
  • File ->New Project -> Samples\Microchip Embedded\PIC18 C Template
  • これなら、必ずビルド成功から始められる・・・「急がば廻れ」
【フォント指定】
  • Tools -> Option -> Font & Colors
  • 最初に日本語フォントに設定しておくこと
  • テンプレートから作成したプロジェクトは、これで失敗
    インポートした方は読み込み時に指定したのでOK
【全体の使用感】
  • Microchip 固有の strpgm2ram のような関数が無くなって、より標準へ近づいた
  • コンフィギュレーションの発生機能が付いた(資料と見比べなくて済む)
  • IDEの機能も増え、使い勝手も向上している(はず)
  • メニュー構成や字句が変わっていて戸惑う
  • デバッグ作業はしていないが、ワンステップ上がった気にさせてくれる

2015年6月11日木曜日

MPLAB X-IDE, XC8 への移行(2)

【C18版を移植してみた】
いきなり他人のプログラムを修正しようとしても、どこから手を付けたらいいのか分からないので、完成品のプログラムの中から規模の小さいものを移植してみることにした。
  1. プロジェクト作成から、既存プログラムの読み込み
    File -> Inport -> MPLAB IDE v8 Project -> フォルダを指定
    これで、指定したプロジェクトフォルダに、XC8出力用のフォルダが作成される
  2. インクルードファイルの置かれたフォルダを設定する
    File -> Project Properties -> XC8 Compiler -> Include directories
    C:\Program Files (X86)\Microchip\xc8\v1.34\Include を指定
  3. <p18fxxxx.h>でインクルードしているデバイス指定を xc.h に変更する
    【例】#include <p18f2321.h> を #include <xc.h>
  4. ビルドをかけるとエラーが出てくる
    ここで、フォーマット変換をかけて余計な空白を削除しておいたほうがいい
    (後で修正点比較用に、この時点でのコピーを保存しておくとよい)
    (フォントを日本語表示できるものにしておくこと)
  5. プラグマを使ってある部分を修正
  6. rom 修飾子が不要なので削除する(文字列定数に多用。他に、near、far、も)
作業としては、主に宣言や定義部分の修正が必要だが、関数[ srrcpypgm2ram ]の様に、ROM エリア絡みは関数名を変更する必要有り。

2009年出荷時(C18)の記録
  • ROM:1190byte. RAM:284byte 
だったものが、ビルド後
  • Data 30byte, Memory 1486byte
無料版コンパイラだからなのか、生成されたバイナリコードは1.25倍になった。

2015年6月8日月曜日

MPLAB X-IDE, XC8 への移行

パソコンからリレーをオンオフしたくなる案件がでたので調べてみた。USBを使いたい。
  1. FA用のUSBインターフェイスのIOユニットでは数万円してしまう
  2. 基板なら数千円
  3. インストール済みのPICなら千円程度
案件の方は受注はならなかったが、上の 3. の場合だと他にも使い道があるので、これを機会に再度(前回はUSBメモリ)試してみることにした。安さにつられて秋月電子の PIC18F4553 仕様USB対応マイコンボード[AE-USBPIC44]を購入した。
C Compiler C18 の再インストール以来、久しぶり。これを機会に X-IDE にしなければ、となってMPLAB 8.92 と共存させようとするも
  • Languaeg ToolSuite に Microchip MPLAB XC8 が表示されない
アンインストール、インストールを繰り返してもダメで、こだわる必要がないと思い始め、
  • MPLAB X-IDE へ移ることにした
紹介されている手順に従って、サンプルプログラム「MPLABを使った使用例1」は、「SAMPLE.c」の内容をコピーするだけで無事すんなりと、書き込み成功し完成した。
  • 書き込み器が、ICD3 なので変換アダプタが必要となり、ここに手間取った(右写真)
  • 秋月電子通商のキット、[AE-USBPIC44] は、何もインストールされているわけではないのでプログラムが必須
  • 「使用例1」は、MPLAB X と XC8 Compiler の組み合わせのソフト例(PIC18F4553用)
  • 完成すると、sw1 または sw2 を押し続けるとLEDの点滅周期が変わる

2015年5月7日木曜日

ガラホ、SDカード満杯に気付かずハマる

昨日ガラホ(シャープのSHF31)を購入したが、元のガラケーに入れてあったMP3音楽が使えるようにして欲しいとの頼まれ事。電話帳、メールデータおよび正規購入楽曲は、移行できている。
PCと接続するためのUSBケーブルも同時に購入してあって、PC側のLISMOが、これまでのようにケータイを接続しても無反応(LISMOが対応していない)なので、さて困った、となった次第。

調べると、PCとUSB接続してSDカードにコピーしてやればいいみたいなので、シャープサイトからドライバをダウンロード、リムーバブルディスクとして見えるところまでこぎつけた。

ところが、MP3音楽ファイルをコピぺしようとしても、「ディスクが満杯」とでて、コピーできない。カラの新規ファイルは作れる。

さて結論は、このメッセージ通りで「SDカード満杯」なだけ。
持ち主が1GB SDカードを満杯で使用していて、機種変更した時もそのまま。ただ、ライブラリリストには購入した楽曲しか表示されない。

「満杯」だからコピーできないのだと、思い至るのにしばらく時間がかかった。
  1. SDカードの中身をみると、KDRという拡張子のファイルが多数
  2. どれも、容量が3~5MBくらい
  3. 調べると、これは「保護」されたファイルみたい
  4. 元が、PCからダウンロードしたものなので、一つ消してみる
  5. と、新しく、ファイルがSDカードへコピーできた・・・やっとここで判る
よく見ると、残容量が1MBを切っていて、ほぼ100%の使用率。依頼主も薄々「これが原因では」と思っていたことが後で分かった。
SDカードの適当に作ったフォルダへコピーした音楽は、ガラホ側のLISMOのアプリで自動認識され、めでたく再生可となった。

【初めて手に取ってみたガラホは】
機種は、シャープのSHF31。見た目は二つ折りケータイ。スマホとしては、画面が小さい。
外出先でネットをする必要が無い、あっても調べ物をする程度、ほとんどはメールと通話だけでOK(自分はこれに当てはまるタイプ)のひと向け。流行のLINEも一応使えるみたい。ボタンへの反応は軽快。メニュー構成もほぼケイタイのままなので、分かり易い。
アプリ(場面)によっては、カーソルらしきものが出現する。ただ、写真の拡大縮小、送る戻るが直感的に操作できるスマホの良さは失われている。

【ボタンがあることの安心感】
初めてiPhoneを手にした時、メニューの階層、今どこにいるのかが全く分からず、非常に戸惑った。パソコンのESCキーの存在に慣れた者は、「戻る」ボタンが無いことがストレス。
このガラホはクリアキーが戻るボタン。階層をたどっても必ず元に戻る。

【MP3音楽ファイル】
本件のMP3データは、依頼主のカラオケ歌唱(採点97点くらいを出すらしい)を録音したもので、反復して聴いて、また録って(アナログ信号から録音)練習している。
ショップ店員は、この辺のこと(権利関係)には一切口を出さないようだ。

【SDカード満杯】
依頼主にはSDカードを満杯で使うと、メモリのエラーが出たときに被害を大きくしてしまう可能性があるから、空きエリアを残しておくようアドバイスした。

2015年4月27日月曜日

ヘッドルームとフットルーム

3年位前のトラブルの話を整理。
ヘッドルームは図の電源電圧5Vまで使えない部分。ゼロ側のことをフットルームと表現するようだ。

【現象】
さて、トラブルは、既存設備への追加改造で外部付加回路として電流検出アンプを片電源回路で設けた。
極力ゼロ付近まで正しく測定値が得られるように、入力レールツーレールのオペアンプを使った。
ところが、測定端オープン時に、ゼロにならずプラス側の値が表示され、その値がアンプのスペックより大きい。
原因は、フルスケールが204.7nAだったので感度が高く、拾ってしまうハムが整流され非対称波形となって測定値をプラス側に振らす。

【解決策】
  • ハムの重畳は物理的に対策するしかない。
  • 両極性の回路にすれば、後段でも除去できる(普通はこうなっている)
  • フットルームによるゼロがゼロにならない問題は、出力負荷を軽くして、アンプのスペック通りの性能を引き出すしかない
  • よりよいアンプに交換する(してもゼロにはならない)
  • オフセット値を設定する機能は設けたが、全測定範囲で誤差になるので使えない
  • マイナス側へ電源電圧範囲を広げた回路にすればOK
実際は、良否判定値の10nA付近の精度が重要なだけなので、「ゼロにはなりませんと」と事情を説明し、説明書に明記した。(オフセットのような全範囲の誤差ではないことも)

【余談・単電源用オペアンプとレールツーレール】
「レールツーレールのオペアンプは、0V~VCCの範囲まで扱うことができ、 ほぼ入出力の関係は直線です。」とあったりするが、「ほぼ」であって全範囲ではない。ACのアンプを想定した記述になっている場合が多い。
ただし、片電源用オペアンプの中にはマイナス側入力も出来るタイプがあり、全てが図の様になるわけではない。

【余談・回路はバイポーラだけどAD変換はユニポーラ】
昔の計測回路はこれ。この場合オフセット分が、マイナスへずれていても分からない。
AD変換をバイポーラにすると、逆極性の値が示されて、「逆に流れているのかと」騒ぐ人が出てくる。高感度回路の場合は、ハムの波形の対称性までも影響する。

【余談・リーク電流】
集積回路全体の静止時のリーク電流は機能的な不具合や、ウェハーレベルの性能低下などを察知できたりするようで、この検査を省略するにはリスクが伴うようだ。

2015年4月23日木曜日

Excel VBA 変数一覧表を作る

【一覧表にしてみると】
その時々の思いつきで変数名や、関数名を振ってしまっていたが、リリース前に全体的な統一性、整合性、同名の型違い、プリフィックス(一文字か二文字の)の有無などチェックする目的で書き出してみた。最初はExcelのシートに貼り付けて、一行ずつ消しての手作業だったが、プログラムを眺めるという観点ではなく、異なる観点で見直すことが出来て有用だった。(一年前のこと)
バージョンの更新を重ねたので、再度やってみることにした。

【変数一覧表を作成するマクロ】
変数一覧表を作成するマクロを見つけたので使ってみたが、途中でエラー停止したことや、変数の型も、引数についても同様に知りたいので、改造することにした。
ところが、手を加えているうちにはまってしまった。それというのも、元の作者が「・・・。こうすれば、簡単に変数の値を共有できます。」という流儀で広域変数ばかりで作ってあり、私とは真逆の考えの方。

【変数一覧表を作成するマクロを改造】
フィルタ部分はそのまま使用させてもらうつもりだったが、関数の引数部分も取り出す機能を入れ始めた頃から削る部分と、追加部分が入り交じっておかしくなってしまい、丸一日がかりになるはめに。オリジナルにあった、関数名との対応表を作成する部分は削った。

【出来たマクロは】
自分の記述法は、変数名、関数名の行が、二行に分かれたり一行にコロンで区切り、複数書いたりするケースが無いので、対応はしなかった。
左端から順に数えて進めるというオリジナルの方法には従ったが、もっとスマートな方法がありそうな気がする(パターンを登録して、それを見つけるとか) 検出キーワードは、
  • Sub, Function,
  • ByRef, ByVal
  • Dim, Public
 以下の定数関係は無視(定義モジュールに集中しているので、コードをみれば済むこと)
  • Enum, Type, Const
【使用結果】
一瞬で書き出しが終わり、シート上、手作業で同名をカウントする式を貼り付けた後、重複するセルを削り、変数一覧表が出来上がる。
今回リリースしたマクロの書き出し結果は
  • 広域変数16個(条件定義の配列や動作モードや動作ステップ)を除いて
  • 269個有り、重複を削除したら107個残った
  • 一番多いもので30回登場(通信結果を受ける変数)
  • 一回限りの登場が 62 個
ざっとみたところで、同じ目的での一字違いとか、同名で型違いとか、いくつか見つかる。Variant は二つ。一回限りが多いということは、同じ処理を何度も書いていなから、とも言える。

【変数名・自分流】
自分なりの名前付けルールを厳密にしているわけではないが、その場限りのカウント等の汎用的な変数は抽象的なものでもいいが、後から見て、操作している内容まで伝わるような具体的な名前にした方がいい。種類を減らそうとか、短くしようとかにこだわりすぎないこと。

2015年4月8日水曜日

Excel VBA OnTime が使いこなせず

【タイマ経過後実行】
OnTime(EarliestTime, Procedure, LatestTime, Schedule)
  • EarliestTime: マクロを実行する時刻を指定
  • Procedure: 指定時刻に実行するプロシージャ名
  • Schedule: True の指定で OnTimeメソッドの設定有効/Falseで設定を取り消す
【不具合】
  • OnTime ソメッドを使い、ボタン操作がされなくなって一定時間経過後、フォームを自動的に閉じるプログラムを作ったが、時間を短くしてデバッグすると時々うまくいかない
  • 4つあるボタンの操作の度に、タイマ設定を取り消して、再度タイマの設定を行う、というように単純に考えて作ったのだが・・
  • 押されている間繰り返すというボタン処理(Do Event有り)のせいなのか、クリックして一秒もかからないボタン処理が入るからなのかわからない
  • 「取り消し」が不完全で、複数のタイマが発生してしまう模様
  • 指定した時刻を過ぎて「取り消す」とエラーになる
【注意点】
  • 「今から○分後」の実行する時刻指定(EarliestTime)が異なると別モノのタイマが準備されてしまい、活きている
【改良版】
  • 「取り消し」しなくても済むやり方
  • 取り消す処理を入れるとややこしいので、指定時刻になったら呼び出すが、その時「処理」を実行するかしないかは別の条件で判断する
  • タイマは1分間隔のインターバルタイマとすることで、タイマは必ず一つになる
  • インターバルは経過時間の誤差になるので、間隔をあまり開けられない
  • タイマはカラ実行して終わらせればよく、取り消す処理を入れる必要は無い
【再帰処理】
  • インターバルタイマ/繰り返し=自分自身の関数を呼び出す
【余談】
  • タイマが日付をまたげるか、を忘れがち
  • ハード回路に置き換えて考えたらすっきりまとめられた
    (モノマルチ×、同期処理○)

2015年3月31日火曜日

Excel VBA SDIに悩まされる

一年越越しで抱えていたトラブルが解決した。
実機(顧客から預かったパソコン)で開発してそのまま納品した後、改善要望や不具合の報告があって対応してきたが、自分のパソコンで再現できず、運用上は問題無く、管理画面での不具合のため導入が進み、原因はこちらで推察して対応していた。

【結論】
  • 客先の実機は、Eccel 2013 + Windows8.1
  • こちらは、Excel 2010 + Windows8.1 または Excel 2010 + Windows7
  • 不具合の症状は、「ファイルを開く」操作が入った後、許可されているはずのシートの特定セルが編集できない」というもの
  • 「Excel 2013 でモーダル ダイアログから開かれたブックのメニューバーやリボンの操作ができずウィンドウを閉じることができない」 とMicrosoft Support に発表されている内容に起因し、対策も示されている
  • Excel 2013 からSDIになったことでこの不具合が出ているようだ
  • Excelバージョンの違いで、こちらの環境では再現しない
【対策の経緯】
  1. 不具合の症状は、見えないところでモーダルフォームが開いている感じ
  2. モーダレスとモーダルフォームが混在していたので、モーダルフォームへ統一し、必ず閉じるように大改造
  3. この改造でも不具合は解消せず、Excel 2013 のSDI とこの不具合が影響していそうだと思い至るまでに時間がかかった
  4. Microsoft Support に記載の対策が「モーダルフォームで一旦開いて」というものだったので、逆に全てモーダレスフォームにして解決(シートのセルや配置したボタンにアクセスできないよう対策が必要)
【ネット情報】

  • 今回は、現象と原因が直接結びつくような、ネット情報を見つけられなかった
  • これまでExcel VBA プラス キーワードでネット検索していたが、Excel 2013特有の問題があることが分かり、これまでお世話になってきた「VBA講座」とはまた違ったサイトを知ることが出来た

2015年3月21日土曜日

Excel VBA 意味不明なコンパイルエラー

Enum で定義されているはずの定数が、「定数式が必要です」というエラーダイアログが表示されてプログラムが実行できなくなった。初めての事。(Excel2010)
宣言文から、Private Enum の Private を外したら出なくなった。関係のない個所に変更をくわえたりした後、試しに元に戻してみるとエラーにならない。出たりでなかったりを繰り返した。
出荷後のバグ対応、要望に基づく変更の最中でバージョン管理用文書になんて書けばいいのか、コメントに残しておくべきなのか困った事に。
ぐぐったら、同症状の報告有り、エディタのバグとある。

2015年3月14日土曜日

Windows7 DVI の不具合/Windows Update絡み?

2015年3月のWindows Update の不具合顛末記
  1. 3月12日の夜、別件のダウンロード中に、「ロック」状態にしたら、画面がまっ黒で、マウスカーソルだけが出ている状態になる(マウス操作可、キーボードは無効)
  2. 2時間後くらいに戻って操作するも、2の状態のままなので、電源ボタンで強制オフ
  3. 翌朝、Windows 起動ロゴの表示後、まっ黒でマウスカーソルだけ有効な状態で停止
  4. 並行してた Windows Update を疑い、「アップデートの失敗」を調べ、試してみる
  5. ブルー画面で起動を繰り返したり、「復元」も失敗したりで、いよいよOS再インストールを覚悟
【原因は】
使っている 三菱ディスプレイ RDT233WLM の DVI コネクタを外してアナログRGB出力にすると問題無い事がわかった。正常にWindowsは起動して、残りのアップデートが再開された。アップデートの最中に電源が切られる不具合があった履歴も残されていた。
この記事をまとめながらネットで調べたら、DVI 出力と Windows7 のトラブル報告も見つかった。

【過去にも】
Windows7にする前からも、ディスプレイが省エネモードで自動オフした後、再開できず(No Signal に陥ってしまう)、何度も電源入り切りしてみたり、アナログケーブルを挿して再開させたりのトラブルが何度もあった。ただ、今回のマウスカーソルだけが表示される現象は初めて。

【対策は】
「ロック」した時、一瞬画面がまっ黒になるが、今回はそのタイミングで DVI 出力がおかしくなった。また DVI コネクタを抜かないとだめなので、ハードがらみ、アップデートも関係しているかも、偶然発生なのかも不明。調査対策は後日へ。

【余談/不具合調査中の現象】
  • キー操作出来ない
  • セーフモードは DVI でも表示され、正常
  • コマンドプロンプトも、操作できるが、CドライブがDドライブに化けていたり
  • コマンドプロンプトで、winsxs-> Dir とやると、表示がループして止まらなくなったり
  • メモリーチェックは問題なし
  • ブルー画面になった途端、再起動を繰り返す現象が起きたり、
  • ブルー画面でPAGE_FAULT_IN_NONPAGED_AREA が出たり

2015年3月10日火曜日

RAMSA WZ-9421A 改造

オーディオ好きの知り合いに、クロスオーバの周波数を変更して欲しいという事で預かった機器の、改造が済んだ。久しぶりにはんだごてを手にした。

まず、最初に特性をとってみた。オペアンプの数から大体の回路構成と、抵抗コンデンサの数と定数からフィルタ部分が抵抗を切り替えているであろうことは推察できた。ハイパス側とローパス側の定数も共通のようだ。(2次のアクティブフィルタ, Gain=1)

しかし、いざプリントパターンを追って(片面ベーク基板)回路図にしていく段階で、何度もめげそうになった。基板裏から照明を当てて透かして見えるようにしてから少しは捗ったが、それまでは、表と裏、右と左を入れ換え、目を図面に移すたびに「あれっ」となって、また見返す。集中が持続できない。
次に困ったのは、フィルタの定数が教科書から導いた値と違う。また、Webの設計ツールでも違う。
結局、これまで何度も使った教科書とアナデバの資料による計算結果が一致したのだけれど、現物の定数は違っているので、これを調べた時間は無駄に終わった。

現物は、ポップノイズ対策なのか教科書にあるアクティブフィルタ回路に余計な部品がいくつもついていて惑わされたが、周波数比の通りの抵抗組み合わせ計算結果が得られたら、あとはすいすいと進んだ。所望の抵抗も2本、3本の組み合わせで手持ちのもので実現できた。
改造後の測定結果は、狙った通りだった。