RH850で外部割込みの割込発生フラグのクリアは必要か?

ある機種RH850のコードにて、外部割込みの割込発生フラグのクリアをしていない箇所がありました。その機種の取説には割込発生フラグのクリアを行う記載があります。一般的に割込み発生後、割込発生フラグのクリアを行わないと次の割込みが発生しない ことが多々くあります。大抵と明確に取説にき記載されていません。試そうとしてもハードが固められていて自由に、外部割込みが発生できません。

このような場合は開発ボードで調べます。北斗電子のRH850F1KH-176pin :R7F7017093AFPボードで調べてみました。まず e2Stdio の自動コード生成で、INTP割込みを追加します。

これで一旦自動生成して、ユーザコードを追加します。割込ハンドラ: r_Config_INTC_intp0_interrupt は ベクタテーブルから直callされているので、割込発生フラグのクリアは無い状態です。

R7F7017093AFPINTP0P0_1、pin19 です。 線をつけて手動でポートをGNDに落とします。特に問題なく連続検出できているみたいですね。

ここで自動生成コードを見てみます。ここで気づいたのですが、SFR 構成が試したかったRH850機種とと全然ちがいますね。

試したかったRH850機種は多分開発フェーズが古いようです。差を比較すると全然違うようでした。

項目RH850F1KH調査対象RH850
外部割込みの呼び名INTPxIRQx
外部割込エッジ設定レジスタFCLA0CTLx_INTPLEXINTCTL
外部割込発生フラグレジスタICPx に含むEXINTSTR
外部割込発生クリアレジスタ無し。EXINTSTC
割込設定レジスタICPxEICx
IMRx
ユーザ側で割込発生フラグクリアの実施エッジ検出時は自動。(取説に明記あり)外部割り込み処理フローに明記あり。
ユーザ側で発生クリアレジスタのダミーリードの実施取説上は記載無し。外部割り込み処理フローに明記あり。

Xperia Z4 Tablet Wi-Fi版をAndroid11/12相当にsetupする ‘25.7月編

前回 Xperia Z4 Tablet Wi-Fi版はうまくいきましたが、Bootlooder Unlock にて、解除コードが合っているにもかかわらずUnlockができない場合が見られました。その調査と対策を報告します。

Xperia Z4 Tablet Wi-Fi版: SGP712 は、キャリアが絡んでいないため、Boot Loader Unlock Allowed :YES での機種です。なも関わらず fastboot oem unlockremote: command not allowed で拒否されます。同類のSGP611、SGP612 は何台もSETUPしてきましたが、本事象は初めてです。特定のIMEIでバグがあるのでしょうか?

以前SETUPが成功した端末と何が違うのか調べると、以下のようにソフトウェア一式が古いようでした。出荷時期の早い個体で、アップデートされていない模様です。Boot Loader も少し古いです。

XperiFirm で純正ROM最新のダウンロードします。仕向け毎に結構バージョンが違うみたいですね。日本向けが最新みたいです。

ダウンロードしたディレクトリを、FlashTool .ftf に変換し、その.ftf をFlashToolで端末に書きます。

しかし結果は変わらず fastboot oem unlockremote: command not allowed で拒否されます。

OEMロックの解除の許可

海外サイトで情報を収集しようと検索すると、Gemini が「開発者モードでOEMロックの解除の許可」が必要とつぶやいてくれました。見てみると確かその項目があり、OFFになっていました。

これで fastboot oem unlock は成功しました。

これまでSONY系を何台もSETUPしてきましたが、この設定をしたことはありません。使用状況によって「OEMロックの解除の許可」がOFFになっている場合があるといえそうです。

ルネサスE2 Lite を試す

ルネサス E1 のバックアップに、E2 Lite を導入したので試してみました。

とりいそぎ RH850 にて。接続は以下ような感じです。クリアケースがきれいです。

Windowsの認識状態を確認します。E1 ドライバを入れていれば追加インストールは不要なようです。

e2Stdio のデバッグ設定を追加します。”Lite“とは書いてありませんが選択できるようになっています。

デバックを開始するとエラーになりました。

RH850 は未対応なんですかね。深追いせず RL78RX で使えればとりあえずいいでしょう。また今度。

富士重CVTシステムの警告調査解消1【組込システム解析実習】

組込システム技術者としてソフト組めるだけでは不十分です。テスト時、システムを理解し不具合解析も必要となります。弊方個人所有のFIATで、Dレンジ挿入時、突然CVTMIL( 故障警告灯のWoldWideな通称 )が点灯し、走行不能になりました。LIMP HOMEモード(低速で最低限走れるようにすることの通称)にもなりません。よほど重症なようです。

当CVTは’97と古く、管理はFIAT、実体は富士重ということで、整備情報も部品もあやふやな状態です。故障コードMIL点滅回数 の説明も整備書にも記載されていません。警告を出しているのは CVT-ECU のソフトウェアです。その解析と対策をレポートしていきます。


まずシステム全体を理解する必要があります。着目点は何が Input で何が Output なのか? 自分で整理することで理解が深まります。(整備書の図は中途半端に抽象化されよくわかりません)

上記の中で、電磁パウダークラッチは未知の存在です。半クラッチもあるでしょうからDuty制御かなと推察します。スロットルスイッチは当システムの動作異常で最も陥りやすい項目として知られているようです。電磁パウダークラッチの接続/切断と同意ととらえてよい感じです。


CVT-ECUで検出可能な故障を推察します。出力系はマイコンおよびソフトウェアから駆動できているかは判定できません。センサ故障は断線とほぼ同意と考えます。

入出力デバイス故障CASE検出可能性
検出可能
タイミング
入力スロットル開度地絡/天絡/OpenIG-ON
上限/下限エンジン制御と共用のため不明
入力スロットルスイッチ地絡/天絡/Open走行開始時
入力バッテリ電圧上限/下限IG-ON
入力エンジン回転数断線エンジン始動
入力シフトポジションPスイッチ断線、実ギア位置と不一致IG-ON
入力シフトポジションRスイッチ断線、実
ギア位置と不一致
走行開始時
入力シフトポジションNスイッチ断線、実
ギア位置と不一致
IG-ON
入力シフトポジションDスイッチ断線、実ギア位置と不一致走行開始時
入力シフトポジションLスイッチ断線、実ギア位置と不一致走行開始時
入力車速パルス断線走行開始時
出力電磁パウダークラッチ断線、ブラシ消耗CVT-ECUに-側端子があるため有IG-ONもしくは走行開始時
出力油圧ソレノイド断線GNDはボディGND落としのため不明。IG-ONもしくは走行開始時
その他不揮発性メモリ
(おそらく搭載有)
読書き不能IG-ON

他ポイントが二点あります。

  • 一般的に出力系は駆動電流を計測する検出回路やICを用いて、マイコンに逆入力して判定します。近年、エンジンの点火や噴射は、環境のため失火判定が必須となっています。’97頃のAT制御で、実施されていたかは怪しいところです。
  • EEPROMなど不揮発性メモリの搭載有無も調査を左右する要素です。学習値や故障が記録されるかされないかでECUの動作が変わってきます。今回の場合、学習値や故障が記録も必要はないかなとは思います。

次の記事では、これらの情報を元に、実車をチェックしていきます。

.NET DataGridViewで行ドラッグ移動を簡潔に行う

.NET DataGridViewですが行ドラッグ移動くらい標準でできるのかなと思っていましたができないんですね。IAWスキャンツールも面倒そうなのかやってない。以下のようにすると割とスマートにできました。説明はコメントをみてください。

       this.dgvParameters = new System.Windows.Forms.DataGridView();

        // For row drag
        private bool duringDrag = false;  // ドラック中かのフラグ
        private int dragFromRow = 0;      // ドラック開始行

        /* マウスボタンDownイベント / Start Row drag */
        private void dgvParameters_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) {
            // Remark: top of data row is 0
            if ( e.RowIndex < 0 && dgvParameters.RowCount < e.RowIndex ) {
                return;
            }
            duringDrag = true;
            dragFromRow = e.RowIndex;
        }

        /* マウス移動イベント Evrey Row drag */
        private void dgvParameters_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e) {
            if ( duringDrag == false ) {    // Not dragging
                return;
            }

            /* マウスイベントはたくさん発生するので、ここで時間でイベント間引きするとベスト */

            // Remark: top of data row is 0
            if ( e.RowIndex < 0 && dgvParameters.RowCount < e.RowIndex ) {
                duringDrag = false;     // Cancel dragging.
                dragFromRow = 0;
                return;
            }

            int dragToRow = e.RowIndex;
            if ( dragFromRow == dragToRow ) {
                return;             // 同じ行内ならスルー
            }

            // Delect and insert target row.
            DataGridViewRow from = dgvParameters.Rows[ dragFromRow ]; // 移動元行を取り出す
            dgvParameters.Rows.RemoveAt( dragFromRow );               // 移動元行をGridから削除
            dgvParameters.Rows.Insert( dragToRow, from );             // 移動元行をGridの指定行に追加
            dgvParameters.Rows[dragToRow].Selected = true;            // 行選択を移動

            dragFromRow = dragToRow;    // Set next drag row. 移動元行を現在行に切替え
        }
        
        /*  マウスボタンUPイベント / End Row drag */
        private void dgvParameters_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e) {
            if ( duringDrag == false ) {    // Not dragging
                return;
            }

            duringDrag = false ;    // End dragging
            dragFromRow = 0;
        }

このロジックだと、移動中動きを見せつつ、上方向の移動と下方向の移動も同じロジックで両立できます。実行結果は以下のとおりです。