60歳からの電子工作ノート

生涯学習として取り組んでいます。

熱電対付きサーモグラフィの試作(ScottPlotのヒートマップ)

 ヒートマップのサンプルプログラムをScottPlotで作成しました。以下を参考にしています。資料1*1、資料2*2、資料3*3

 

サンプルプログラム1

ヒートマップとは数値データを色に対応させて表示し、温度分布をわかりやすくした図です。ScottPlotでは配列(0,0)の数値データを左上の座標から色で表示します。

カラーマップで数値と色を対応させています。デフォルトはViridis です。

表示データの最大値、最小値がカラーマップの両端の色となります。

ヒートマップの横に表示するカラーマップをカラーバーと呼んでいます。

図1.  ヒートマップ

図2. サンプルプログラム 1

サンプルプログラム2

カラーマップの選択、スケール変更、補間処理の確認用プログラムです。
またカラーマップのRGB値を保存できます。

図 3 サンプルプログラム 2の画面

・Updateボタン :  ヒートマップを更新します。

・Color Map type:  カラーマップの選択します。

図4. カラーマップの選択


・Scale: Autoのチェック時には、表示データの最小値、最大値がカラーマップの両端の色となります。Autoが未チェック時には、入力した最小値、最大値がカラーマップの両端の色となります。

図5.  Scale Auto未チェック、MIn=0,Max=10の例

・Smooth : 補間処理を行い表示します。

図6. Smooth有効

・Show X,Y Axics Ticks : X,Y軸の目盛り表示の有無です。

図7. X,Y軸の目盛り無し

・Show data[r,c] : 配列データの表示の有無です。

図8. 配列データの表示無し

・SAVE ボタン:  表示に使用中のカラーマップのRGB値 を保存します。

図9. カラーマップ(Virdis)のRGB値

環境

Windows 11 Pro , 22H2      .NET Framework 4.8 
Microsoft Visual Studio Community 2022 (64 ビット) – Current Version 17.6.3

WPF アプリ(.NET Framework)    ( C#,XAML,Windows,デスクトップ)
ScottPlot 4.1.67 

ファイルの登録場所

サンプルプログラム1: https://github.com/vABCWork/WPF-HEATMAP-SAMPLE1

サンプルプログラム2: https://github.com/vABCWork/WPF-HEATMAP-SAMPLE2

 

*1:資料1「ヒートマップによる表示」 https://scottplot.net/cookbook/4.1/#heatmap  

*2:資料2「カラーバー」 https://scottplot.net/cookbook/4.1/category/plottable-colorbar/

*3:資料3「カラーマップの種類」 https://scottplot.net/cookbook/4.1/colormaps/

熱電対付きサーモグラフィの試作(ハードウェア)

赤外線アレイセンサ(MLX90640)を使用した熱画像表示器を試作しました。

 

 

システム構成図

図1. 構成図



メインボード

図2. CPU端子機能割り付け表

図3. メインボード 回路図-1

図4. メインボード 回路図-2

図5. 基板のパターン

図6. フットプリント

図7. メインボード

図8. メインボード(実装後)

図9. 部品表(メインボード)

LCDインターフェイスボード

図10. LCDインターフェイスボード 回路図

図11. 基板のパターンとフットプリント

図12. LCDインターフェイスボード(部品実装前と実装後)

図13. 部品表(LCDインターフェイスボード)


センサインターフェイスボード

図14. センサインターフェイスボード 回路図

図15. 基板のパターンとフットプリント

図16. センサインターフェイスボード(部品実装前と実装後)

図17. 部品表(センサインターフェイスボード)

ZHコネクタ(1.5mmピッチ) 用ケーブルの作成

メインボードとLCDインターフェイスボードにZHコネクタ(1.5㎜ピッチ)を使用しています。電線を圧着してボード間の接続ケーブルを作成します。

圧着工具は、(株)エンジニアのPAD-11 (PA-09も可)を、電線はAWG28相当を使用しました。(秋月電子通販コード P-11640)

図18. 圧着工具(PAD-11)と使用電線

手順:

ピンセットでコンタクトをつまみ、圧着工具にセットします。ダイス幅 は1.0を使用します。電線を入れ圧着します。

図19. 電線の圧着

コンタクトの被覆部分をラジオペンチで成型します。圧着工具で被覆部分をかしめます。ダイス幅は1.3を使用しました。

図20. 被覆部分のかしめ

ZHコネクタのハウジングに入れます。

図21. ハウジングへの挿入

チップ部品のはんだ付け

 今回は0402(1005 メートル法)サイズのチップ抵抗、コンデンサを使用しました。糸はんだ、小手先もなるべく細いものを使用しましたが、はんだの付け過ぎになってしまいました。

図22. はんだが多い

先曲がり型のピンセットを使用すると、はんだ付け前に部品を固定しやすいです。

図23. 先曲がり型ピンセット(P-672)と真っすぐなピンセット(PT-02)

図24. 使用機材

部品の外形寸法の間違い

基板が出来上がってから、エミュレータ接続用コネクタとDCジャックの間隔が狭く、取り付けられない事がわかりました。

図25. 取り付け不可(間隔が狭い)

原因はエミュレータ用コネクタの外形を表すシルクの幅が、実際の部品より狭いためでした。(以前も同じフットプリントを使用していましたが、近くに部品が無かったので気づきませんでした。)

図26. 部品外形寸法の間違い

 とりあえず部品を削って対応しました。

図27. 部品を加工して取り付け

KiCad PCBエディタの印刷により、部品のフットプリントとレイアウトが確認できます。この時点で、実際に部品をのせて確認しておけば回避できました。

図28 PCBエディタ 印刷

 

デジタル顕微鏡 ADSM302

 チップ部品のはんだ付け用にデジタル顕微鏡ADSM302(Andonstar 社製)を購入し、3年ほど経ちました。機能を調べてみました。

参考資料*1

 

起動、表示とシャットダウン

 起動は、電源スイッチケーブルの電源スイッチを使用します。LEDライトが点灯し、モニタに「 Welcome」と表示され起動します。対象物が表示されますので上下移動用のハンドルとフォーカスリングを調整して見やすい表示にします。

操作キーまたはリモコンによりズームイン、ズームアウトできます。

図1. ズーム機能 (セラミックコンデンサ 0402, 1005(メートル法) の表示)

シャットダウンは、LCDモニタ下にある操作キーの電源ボタンでシャットダウンします。モニタに「Goodby」と表示後、モニタ表示が消えます。その後、電源スイッチケーブルでOFFしてLEDを消します。

図2. デジタル顕微鏡(ADSM302)

注.
LCDモニタの下にある、操作キーの「電源」では、起動しません。電源スイッチケーブルの電源スイッチで起動します。

・電源スイッチケーブルで電源OFFした場合、設定メニューで変更した内容(例えば 写真(静止画)の解像度を、12M 4032x3024からVGA(640x480)に変更等)は保存されません。

・電源ONと同時にLEDライトも点灯します。直視しないように注意が必要です。

リモコン

 リモコン(単4電池 2つ)により操作可能です。

図3. リモコン

動画の撮影

 動画の撮影はLCD下の操作キー[OK]または、リモコンの[OK]で行います。

図4. 動画の撮影と再生

図5. 動画の撮影と再生(ズーム)


写真の撮影

 操作キーの[M]またはリモコンの[MODE]により、スタンバイモードからキャプチャモードにして撮影します。操作キーまたはリモコンにより写真をキャプチャします。撮影時に表示が一瞬消えます。操作キーの[M]またはリモコンの[MODE]により、キャプチャモードからイメージプレイバックモードにすると、撮影した写真が表示されます。

 

図6. 写真の撮影と表示

 

図7. 写真の撮影と表示(ズーム)


スタンバイモードでも写真撮影可能です。ただしズームしても、ズームしない状態で写撮影されます。

図8. 写真の撮影と表示(スタンバイモード)

外部モニタへのHDMI出力

付属のHDMIケーブルを使用して、パソコンのモニタに接続します。デジタル顕微鏡本体のLCDは暗くなり表示されません。この状態では動画の録画はできません。写真の撮影はできます。

図9. HDMI出力と写真撮影

設定

録画(Video)

スタンバイモードで、LCD下の操作キー[M]の長押しまたはリモコンの[MENU]で録画(Video)の設定メニューが表示されます。 

図10. 設定 Video,Exposure

図11. Video設定内容

システム(Setup)

スタンバイモードでLCD下の操作キー[M]の長押し後に[M]を押す、またはリモコンの[MENU]を2回押すとシステム(Setup)の設定メニューが表示されます。 

図12. 設定 Setup,Date/Time

図13. Setup設定内容

写真(Still)

キャプチャモードで、LCD下の操作キー[M]の長押し、またはリモコンの[MENU]により写真(Still)の設定メニューが表示されます。

 

図14. 設定 Still,Resolution

図15. Still 設定内容
プレイバック(Playback)

プレイバックモードで、LCD下の操作キー[M]の長押し、またはリモコンの[MENU]でプレイバック(Playback)の設定メニューが表示されます。 

図16. 設定 Playback,Delete,Delete Current,Cancel

図17. Playback設定内容

簡単な修理と調整

 本機器を3年間使用して、調子が悪くなる事もありましたが、簡単な修理や調整で対応できました。以下は例です。

・起動しない。LEDランプが点灯したり、消えたりする。

電源スイッチケーブルのUSB Type-Aの部分が接触不良であったため、別なUSBケーブルのType-A部分に置き換えました。

図18. 電源スイッチケーブル

電源スイッチケーブルを使用しない場合は、付属のUSBケーブルをLCD側に接続し、他方をACアダプタにつなげて電源を供給すればカメラは起動します。

図19. USBケーブルとACアダプタで起動

・上下移動用のハンドルで、動かなくなった。またある範囲で止まらなくなり、下に動いてしまう。

支柱の後ろにある、ネジを締めたら直りました。

図20. 支柱の後ろのネジ

LCDモニタで、部品が真上から見えない。

本体を止めているネジ2か所を調整すると直りました。

図21. 本体取り付けネジの調整

 

*1:資料1「ADSM302 ユーザズマニュアル」 https://andonstar.com/download-center/

新ペルチェ制御用ボードの試作(ソフトウェア 2)

通信(SPI,SCI)処理とファイル関連情報が記載されています。

 

SPI通信

 LCDコントローラ(ILI9488)へのSPI通信フォーマットは、DBI Type-C Option1(3 line)(9bit)です。前回の資料1*1と同じです。

ただし前回は「CPUの割込み処理」で送信していましたが、今回は「DMA転送」に変更しました。これは長いデータをCPUの割込み処理内で転送していると、他の割込みが入らない場合があるためです。

・DMAの設定

DMA チャンネル2をRSPI0の送信に使用します。

図1. DMA転送(SPI送信)

 

「送信バッファエンプティ割り込み(SPTI0)」が発生するとDMA転送が開始されます。全データの送信が終了するまでは待機する仕様としたため、データ転送中は「送信中フラグ」をセットし、アイドル割り込み(SPII0)でをクリアします。

図2. SPI送信処理

シリアル通信(SCI1)

パソコンとのデータ送受信にも、DMAを利用します。DMAチャンネル0を受信に、チャンネル1を送信に使用します。

・DMAの設定

DMA チャンネル0をSCI1の受信に使用します。

図3. DMA転送(SCI1 受信)

DMA チャンネル1をSCI1の送信に使用します。

図4. DMA転送(SCI1 送信)

図5. コマンド受信からレスポンス送信まで

コマンドとレスポンスにはCRCが付きます。

CRC演算器を使用します。CRC-16-CCITT, MSB-First, 初期値 0xffff, 生成多項式x^{16} + x^{12} + x^{5} + 1です。

図6. モニタコマンド

図7. 書き込みコマンド

使用メモリとmapファイル

使用したRAMは約21[Kbyte]、ROMは約40[Kbyte]でした。

図8. mapファイルとtotal size

図9. ファイル一覧


ファイル一覧

登録場所(マイコン):https://github.com/vABCWork/pid_new

登録場所(パソコン):https://github.com/vABCWork/WPF-PID-NEW

実験風景

図10. 実験の様子

 

 

*1:資料1「I2C通信とSPI通信(4インチ LCDパネルとインターフェイスボード)」  https://vabc.hatenadiary.jp/entry/2022/10/10/174722

新ペルチェ制御用ボードの試作(ソフトウェア 1)

  全体のフローとタッチキー入力が主な内容です。

 

 

全体の処理

図1. 全体のフロー

図2. 割り込み一覧

図3. 処理タイミング

抵抗膜式タッチパネルのタッチ位置計測

CPUのI/O ポート、バッファIC、ADコンバータを使用してタッチ位置を得ます。

図4. タッチ位置検出の構成図

・X位置の測定

X+,X-に電圧を印加するため、SW0とSW1をONにします。またSW2とSW3をOFFにします。Xの位置を得るため、Y+からAN004として読み出します。

図5. X位置測定時の動作

・Y位置の測定

Y+,Y-に電圧を印加するため、SW2とSW3をONにします。またSW0とSW1をOFFにします。Yの位置を得るため、X+端子からAN003として読み出します。

図6. Y位置測定時の動作

・Z1,Z2 の測定

Y+,X-に電圧を印加するため、SW0とSW3をONにします。SW1とSW2をOFFにします。

Z1を得るため、X+端子からAN003として読み出します。Z2を得るため、Y-端子からAN002として読み出します。

図7. Z1,Z2測定時の動作

 

タッチキーの入力判定処理

10msec毎にタッチ判定を行います。キー入力が確定すると、キー入力処理(100msec毎に実行)に知らせるフラグをセットします。次の手順で行います。

1) 電圧印加とA/D変換

各端子(X+,X-,Y+,Y-)に電圧を印加し、X,Y,Z1,Z2のAD変換値を得ます。

図5. タッチパネルへの電圧印加とA/D変換

2)タッチ圧の計算

 タッチ圧 Rzは次式で得ます。

 Rz = Rx\times\dfrac{X}{4096}\times\left(\dfrac{Z_2}{Z_1} - 1\right)

 XはX軸測定値、RxはタッチスクリーンのXプレート(フィルム側)の抵抗値 約 270[Ω]。

 資料1*1  参照。

3) タッチされたキーの特定

タッチ圧が40[Ω]を超えていたら「タッチ無し」とします。タッチ圧が40[Ω]を以下ならば「タッチ有」とし、位置(X,Y)から押されたキーを判定します。位置データは、読み出したA/D値(12bit)の上位8biを使用します。(例: X測定時、読み出したA/D値(上位8bit)が 0x40~0x5Fの範囲であり、かつY測定時、A/D値(上位8bit)が0x20~0x38であれば、STOP/RUNがタッチされたと判断。)

図6. タッチキーの位置と判定用データ

4) キーの入力判定

  タッチ状態が4回継続後、非タッチにればキー入力されたとします(キー入力確定)。100msec毎に処理されるキー入力処理に知らせるフラグをセットします。▼(Down)と ▲(Up)は、250msec以上、タッチ状態が継続すれば、キーが長押しされているとします。

図7. 一度押しの判定タイミング(最短)

図8. 長押しの判定

図9. 一つのキーに対する一度押し、長押しの判定

キー入力処理

 入力判定(10msec毎に実施)結果は、キー入力処理(100msec毎)で表示変更のための処理が行われます。

図10. キー入力処理内容 (100msec毎)

図11. キー入力処理

表示処理

PV,SV等のパラメータと値を表示します。100msec毎に実施します。

図12. 表示処理

パラメータの保存

E2データフラッシュのブロック0 (0x0010 0000~0x0010 3FFF)へ、PIDパラメータを保存しています。SV,P,I,D,MR,Hys は単精度浮動小数点データ(4byte)、heat_cool, pid_typeは 1byteのデータとして保存されます。(pid_typeは未使用)

CRC-8(x^{8} + x^{5} + x^{4} + 1 )(初期値 0xff)が付きます。CPU内蔵のCRC演算器はパソコンとの通信時に使用し競合する可能性があるため、ここでは使用していません。

図13. PIDパラメータの保存


熱電対による温度計測

熱電対の断線検出用の抵抗を追加しました。

参考資料:資料2*2、資料3*3
資料4*4 

図14. 熱電対入力部の回路

図15. バーンアウトの実験結果

PID 制御

資料5*5と同じです。

ただし、MVの出力ポートはMTIOC4A,4C を使用しています。

アラーム出力

基板上に4つのLEDが付いています。次の意味があります。

ALM_1  : ROM-CRCエラー

ALM_2  : E2 データフラッシュエラー (CRCエラーまたは書き込み失敗)

ALM_3  : 熱電対の断線エラー

ALM_4  : パソコンとの通信エラー

*1:資料1「I2C通信とSPI通信(I2C通信とSPI通信(温湿度表示器の試作)」  https://vabc.hatenadiary.jp/entry/2022/11/22/111325

*2:資料2「ペルチェ制御用ボードの試作(熱電対による温度測定)」 https://vabc.hatenadiary.jp/entry/2022/01/22/165620

*3:資料3「 熱電対・変換器間の導線による温度測定誤差と対策」 https://www.m-system.co.jp/mstoday/plan/mame/2012-2013/1210/index.html

*4:資料4「A Basic Guide to Thermocouple Measurements」SBAA274–September 2018

*5:資料5「ペルチェ制御用ボードの試作(PID制御のプログラム)」https://vabc.hatenadiary.jp/entry/2022/02/15/163249

新ペルチェ制御用ボードの試作(ウオッチドックタイマ)

ウオッチドックタイマを使用すると、プログラムが何らかの原因で停止(無限ループ)した際にマイコンを再起動することができます。ウオッチドックタイマ用のテストプログラムを作成しました。

次の資料を参考にしています。資料1*1、資料2 *2

 

ウオッチドックタイマ

動作

 本CPUのウオッチドックタイマはカウントを開始すると、初期値から1ずつ値が減少します。プログラムが正常に動作して想定時間以内にリフレッシュすれば、カウント値は初期値に戻りアンダーフローにはなりません。異常動作を起こし想定時間以内にリフレッシュできない場合、カウンタはアンダーフローとなりリセット信号が発生し再起動します。

図1. ウオッチドックタイマの動作(プログラムの正常時と異常時)
ウィンドウ機能

処理1の「遅れ」異常の場合には上記で異常検知できますが、「早まり」異常となった場合は、リフレッシュされるので異常を検出できません。このためウィンドウ機能の開始位置を適切に設定し、リフレッシュできる期間を設定します。もしウィンドウ開始位置の前でリフレッシュが発生した場合は、リセットします。

図2. ウオッチドックタイマの動作(ウィンドウ機能)
独立ウオッチドックタイマ (Independent Watch Dog Timer)

本CPUのウオッチドックタイマは、プログラムの動作と別なクロックで動作する、独立ウオッチドックタイマ(IWDT)です。 専用オンチップオシレータの起動が必要です。

図3. 独立ウオッチドックタイマの起動

動作開始モード

ウオッチドックタイマのカウントを開始するモードには「オートスタートモード」と「レジスタスタートモード」があります。 

オプション機能選択レジスタ0 (OFS0) のbit1(IWDTSTRT) = 0の場合、「オートスタートモード」となります。OFS0 レジスタで設定します。リセット後、自動的にカウントが開始されます。bit1(IWDTSTRT)=1の場合「レジスタスタートモード」でIWDTレジスタで設定します。

図4. IWDT設定用のレジスタ

図5. IWDT開始条件と動作

テスト

レジスタスタートモード、アンダーフロー、NMI割り込み

 正常に動作しているプログラムを異常にすることは難しいので、正常タスク(100msec 待ち)と異常タスク(遅れ)(150 msec 待ち)を用意します。最初に正常タスクを2つ実行し、ALM3のLEDが点滅する事を確認します。(正常動作)

次に正常タスクと異常タスクを実行します。異常タスクが入ると、ウオッチドックタイマによりアンダーフローとなり、NMI割り込みが発生します。NMI割り込み処理ルーチン内で、ALM4のLEDを点灯します。タイムアウト時間を136.5msecとします。

図6. タイムアウト時間の設定

図7. レジスタスタート、アンダーフロー、NMI割り込み
レジスタスタートモード、アンダーフロー、リセット

 最初に正常タスクを2つ実行し、ALM3のLEDが点滅する事を確認します。(正常動作)

異常タスクが入ると、ウオッチドックタイマによりアンダーフローとなり、RESETが発生します。独立ウオッチドックタイマによるリセットが発生すると、(SYSTEM.RSTSR2.BIT.IWDTRF = 1)となります。リセット解除後の再起動でこのフラグが1ならば、ALM4のLEDを点灯します。タイムアウト時間を136.5msecとします。

図8. レジスタスタートモード、アンダーフロー、リセット
オートスタートモード、アンダーフロー、リセット

 最初に正常タスクを2つ実行し、ALM3のLEDが点滅する事を確認します。(正常動作)

異常タスクが入ると、ウオッチドックタイマによりアンダーフローとなり、RESETが発生します。独立ウオッチドックタイマによるリセットが発生すると、(SYSTEM.RSTSR2.BIT.IWDTRF = 1)となります。リセット解除後の再起動でこのフラグが1ならば、ALM4のLEDを点灯します。オードスタートモードでは、オプション機能選択レジスタ0(OFS0)の設定を使用します。

・オプション機能選択レジスタ0(OSF0: FFFF FF8Ch)へのデータ設定(except_vecttbl.c)

図9. OFS0への設定

図10. オードスタートモード、アンダーフロー、リセット

オートスタートモード、リフレッシュエラー、リセット

 正常タスク(100msec 待ち)と異常タスク(早まり)(50 msec 待ち)を用意します。
タイムアウト時間を136.5msecとします。ウインドウ開始位置を50%、終了位置を0%とします。タスクが正常(68~136msecの範囲で実行)であれば、リフレッシュ許可内でリフレッシュされます。異常(早まり 50msec)の場合、ウインドウ開始位置前にリフレッシュされるため、リフレッシュエラーとなります。リフレッシュエラーにより、リセットされます。一度、独立ウオッチドックタイマによるリセットが発生すると、(SYSTEM.RSTSR2.BIT.IWDTRF = 1)となります。リセット解除後の再起動でこのフラグが1ならば、ALM4のLEDを点灯します。

 

図11. リフレッシュエラー

 

オプション機能選択レジスタ0(OSF0: FFFF FF8Ch)へのデータ設定(except_vecttbl.c)

図12. OFS0への設定(ウィンドウ開始位置あり)

図13. オードスタートモード、リフレッシュエラー、リセット

ファイル一覧

ファイル一覧は各テスト共通です。

図14. ファイル一覧(共通)

登録場所:

レジスタスタートモード、アンダーフロー、NMI割り込み:

https://github.com/vABCWork/test_IWDT_Reg_Underflow_NMI

レジスタスタートモード、アンダーフロー、リセット:

https://github.com/vABCWork/test_IWDT_Reg_Underflow_Reset

オートスタートモード、アンダーフロー、リセット:

https://github.com/vABCWork/test_IWDT_Auto_Underflow_Reset

オートスタートモード、リフレッシュエラー、リセット:

https://github.com/vABCWork/test_IWDT_Auto_RefreshError_Reset

 

補足

 独立ウオッチドックタイマは、プルグラム実行用の発振器と独立しているので、プルグラム実行用の発振器が異常となった場合でも影響なく動作します。例えば、何かの原因でプログラム実行用の発振器の周波数が1/2となった場合でも、ウオッチドックタイマは正常の周波数で動作しているので、異常を検出できます。これに対してプログラム実行用とウオッチドックが同一の発振器を使用した場合、故障するとウオッチドックもカント間隔が2倍となるので、実際の時間でウオッチドックが働きません。

図15. 独立ウオッチドックタイマの効果

*1:資料1「RX23E-Aグループ ユーザーズマニュアル ハードウェア編 ( R01UH0801JJ0120 Rev.1.20)」

*2:資料2「FAQ 1006640 : ウォッチドッグ・タイマの基本」 https://ja-support.renesas.com/knowledgeBase/17796064

新ペルチェ制御用ボードの試作(ROMのチェックサム)

 マイコンのプログラムが壊れていないか判断するために、電源投入時にチェックサム(CRC)を確認する事があります。プログラムをビルドする際に作成したチェックサムと、マイコン起動時にマイコンで計算したチェックサムを比較します。

図1. チェックサム(CRC)の確認

次の資料を参考にしています。資料1*1、資料2*2、資料3*3

 

ビルド時のCRC

CRCの作成

CRCは、CRC-16-CCITT, MSB-First, 初期値 0xffff, 反転出力、生成多項式x^{16} + x^{12} + x^{5} + 1です。作成されたCRCをROMの先頭番地(0xffc 0000)に置くことにします。CRCの計算範囲を0xfffc 0100~0xffff ff7f としました。

図2. CRCの作成


CRCの記入とセグメント配置

ビルド時のCRCを記載するソースコード(rom_crc_data.c)を作成します。

図3. CRC記入ファイル

またこのコードが、0xfffc 0000から配置されるように、リンク・オプションのセクション開始アドレスを設定します。(本テスト用のセクション設定ファイル  *.hsi のインポートでも可能です。)

図4. セクション開始アドレスの設定

・ビルド

ビルド後CRC値が表示されます。( 図2の -VERBOSE=CRC

図5. ビルド時のCRC

この値を、rom_crc_data.cへ転記します。

図6. ビルド後のCRCの記入


mapファイルで指定したアドレスに割り付いている事を確認します。

図7. mapファイルによる配置アドレスの確認

マイコンによるCRC計算

CRC演算器を使用します。CRC-16-CCITT, MSB-First, 初期値 0xffff, 生成多項式x^{16} + x^{12} + x^{5} + 1  演算器によるCRC計算後、値を反転させています。

確認テスト

エミュレータ(E2-Lite)デバックします。CS+よりE2-Liteでダウロードすると、0xffff ff88~0xffff ff8bにあるオプション機能選択レジスタ1(OFS1) のb24が強制的に0となります。(資料3より) デバックツールと接続中は、b24=0が継続しているようです。 このため、CRCの計算には、0xffff ff80~0xffff ffffは含めていません。

図8. 0xffff ff80~0xffff ffffの領域(CRC計算に含めない)


rom_crc_dataが正常値ならばアラームは点滅しません。正常値以外を書き込んで実行すると、ALM1が点滅しました。

・CS+バージョン:

        CS+ for CC V8.09.00 [12 Dec 2022]

ファイル一覧

図9   ファイル一覧

GitHub登録場所: https://github.com/vABCWork/test_rom_crc


補足 (可変ベクタ空き領域のアドレス設定)

割り込み処理(int_prg.c)で未定義の処理 があります。例えばvect=1~15は定義されていません。

図 10. 未定義の割込み処理(int_prg.c)

「リンク・オプション」で、可変ベクタ空き領域のアドレスを設定すると、未定義箇所にアドレス(処理プログラムの先頭アドレス)を登録できます。

図11. 可変ベクタの空アドレスの定義(_Excep_BRK)

mapファイルにより、ベクタテーブルのベクタ番号に実行アドレスが登録されているのがわかります。またテーブルの配置アドレスも確認できます。

図12. 割り込みベクタテーブルの登録アドレスとテーブル配置アドレス(mapファイルより)

E2-Liteで実行させると、割り込みテーブルレジスタ(INTB)に割り込みベクタ先頭アドレスが入っています。そのテーブルの内容を見ると、割り込み処理プログラムの先頭アドレスが登録されています。

図13. 割り込みテーブルレジスタ(INTB)とテーブルの内容

  これに対して可変ベクタ空き領域のアドレス設定 を空欄とした場合、ベクタテーブルのベクタ番号に実行アドレスは登録されません。登録されていない箇所には0x0000 0000が入ります。

図14. 可変ベクタ空き領域のアドレス「空欄」設定の場合

図15. 割り込みベクタテーブルの登録アドレス(空欄あり)とROMの内容

この場合、もしCPUが誤動作してvect番号=1 が実行されると、PC(プログラムカウンタ)は0000 0000となり、0000 0000にある命令語、初期化されてないRAMの値が命令語として実行される可能性があります。

 本テストでは、未登録アドレスは全て_Excep_BRKとして、ベクタ番号0の処理と同じにしています。

図16. ベクタ番号 0の処理

修正(2023年5月23日)

 Githubに登録していある int_prg.c で、vect=199とvect=200の処理内容が dma.cで定義と記入してありますが、本内容ではdma.cはありません。下記のように修正します。

修正後のチェックサムは異なります。

図17. 修正(int_prg.c)

 

*1:資料1「RX23E-Aグループ ユーザーズマニュアル ハードウェア編 ( R01UH0801JJ0120 Rev.1.20)」

*2:資料2「CC-RX コンパイラ ユーザーズマニュアル(R20UT3248JJ0112 Rev.1.12)」

*3:資料3「リンケージエディタとCRC演算器のCRC-CCITT結果の違い」 https://ja-support.renesas.com/knowledgeBase/17796715