8048F16 の フラッシュリモート書き換えが出来ました。
C言語版の 書き換えプログラムが有ればと、ニュースで、打診
したのですが、結局 自分で開発するはめになりました。
ロム破損 11個、 電源インピーダンス低化で、破損1個の散々
な、カジュアルティ(犠牲)を払い、2WKS の レイバー投入の
末、完成出来ました。
随分と、ミスも犯しましたので、後人の参考に供したく、辱を忍ん
で、公表致します。
胆-----
8048F16 の場合(H8,SH通じて)、フラッシュ関連のSWが
トータルな管理を省いており、プログラムミスで、簡単に ロムが
破損します。 システム設計のミス、バグと言えます。
具体的には PW,E,EV,P,PV の四個のSWが有り、同時
に複数のSWを投入すると、ロムシステムが直ちに破損し、ロム
無しCPU と化けてしまいます。 WDT同様、16ビットレジスタ
ーとし、上位のデーターを付す事で、事故を1/256に防止する配
慮が欠けた重大なシステム設計ミスと言えます。11名の重傷者
のうち5名がこれで不幸に会いました。
馬鹿 ----- 1.
H8 コンパイラーの int aaa; のデフォールト は インテジャー
で、符号付です。
char *cp;
if(0xFF == *cp)
{ cp++;
}
では、*cp が符号拡張されて、 0x00FF と比較されます。 従
って、*cp が 0x80 以上では 0xFF80 − 0xFFFF になり、
絶対に 0x00FF との一致が有りません。 これには、はまりま
した。 デバッガーなしの 割り込み禁止状態で RAM上のプログ
ラム上のプログラム実行中ですから、インスペクトで、すぐに原因が
解るところで、時間と、更に5名の重傷者を生んでしまいました。
if('\xFF'== *cp) 又は
if(0xFF == (*cp & 0xFF)) と、すれば 良かったのですが、魔が差
したとしか言えません。 過消去で、ロム機能が破損し、ブートロムも
壊れました。
馬鹿 ----- 2.
デバッガー無しの開発は 十年振りでしたので、随分と感覚が鈍って
いました。 デバッグ手法として、思い起こして、利用したのは、
1.PO にパルス、状態を表示させ ストレージオシロで観測
2.エリアに変数を配列で、記録し 制御をフラッシュロムに
移してから確認する(未利用の領域を消去、書込みする)
です。 以後、スムースに、デバッグを行なえました。
当初、ソフトタイマー(ライトパルス巾)、タイーマー(消去パルス巾)、
WDT、単独デバッグをデバッガーを利用して行ない、くみ上げれば
動くと簡単に考えていましたが、実際には、単純なミス、誤解がプロ
グラムの大きな傷を生み、変数の確認をしながら、ループを追いか
ける手法で、解決に至りました。 CPU 破損の現場で、冷静に勇
気も保ちつつ、前進するのは 大変でした。
結果
10個の、自己コピー動作で、 全数OK 約十秒で、コピーできて
います。 Sファイル転送が TCP 転送で 90秒ですので、
100秒でのリモート書き換えが実現します。
雑感
AKI H8 を 利用しましたので、CPU 交換が 比較的楽でした。
それでも、部品面に有る部品の いくつかを裏面に配し、ヒートガン
を当て易くしました。 H8 の交換では、半田不良が無く、他の
チップに比べ H8 の半田濡れ姓の良さに助けられました。
〒226-0002 横浜市緑区
東本郷 6-17-1-602
オンボード tel 045-473-7678
fax 045-474-5351
WEB ---
http://www02.so-net.ne.jp/~ob_henry