2011/6/25
チェックサムの計算 ただいま挑戦中
PICマイコンのチェックサムの計算方法について
Hexファイル中の各行末のチェックサムではなくて、PICマイコンのメモリ内容のチェックサムの計算についてです。
PIC18F4450を例にすると、
チェックサムは次のようにして計算することができます。
1、プログラムメモリのすべてのロケーションの内容(バイト値)を合計する
2、コンフィギュレーション・ワードの内容(未実装ビットは除外、バイト値)を合計する
3、プログラムメモリのブロックのうち、いずれか1つでもコードプロテクトされていた場合は、各ユーザーIDロケーションの内容(下位4ビット)を合計する
上記の合計値を加算した、下位16ビットがチェックサムになります。
プログラムメモリがコードプロテクトされていない場合のプログラムメモリのチェックサムの計算方法は、
Dim i As Integer
Dim Checksum As Integer = 0
For i = 0 To ProgramMemorySize -1
Checksum = Checksum + Code(i)
If Checksum > &HFFFF Then
Checksum = Checksum - &H10000
EndIf
Next
プログラムメモリがコードプロテクトされていた場合、コードプロテクトされたデバイスから読み出したコードは‘00h’となるので、上記の方法で計算できますが、デバイスに書き込む前のコードは‘00h’であるとは限りませんので、上記の方法では計算できません。
たとえば、00000h〜003FF のブートブロックをコードプロテクトした場合、00400以降のブロックのチェックサムを計算しなければなりません。つまり、ブートブロックをチェックサムの計算対象から除外する必要があります。
同様に、ブロック0がコードプロテクトされていた場合はブロック0を、ブロック5がコードプロテクトされていた場合はブロック5をそれぞれ計算対象から除外します。
さらに、ブートブロックのサイズが可変なデバイスもあります。
PIC18F4550の場合は2Kバイトで固定ですが、PIC18F4682は、2Kバイト、4Kバイト、8Kバイトの3つから選択可能です。
したがって、ブートブロックサイズの可変なデバイスの場合は、あらかじめ、コンフィギュレーション・ワードのBBSIZビットの値から、ブートブロックのサイズを求めておく必要があります。
こうして、プログラムメモリにランダムな値を設定し、ブートブロックとブロック0をコードプロテクトした場合のチェックサムを計算してみると、‘BBF3h’になりました。
このコードを MPLAB-IDE に読み込ませると、‘0xbbf3’となりました。
ついでに、PICkit2のPC側ソフト(V2.61)に読み込ませてみると、‘0B0Fh’でした。
PICkit2のコードプロテクト時のチェックサムが怪しい結果になりました。
また、MPLAB-IDE も常に正しいかというと、そうでもなさそうです。
前述のPIC18F4682のブロック0をコードプロテクトしてみると…。自分で計算したチェックサムと果たして一致するでしょうか。
何事も疑う価値はあります。
1
Hexファイル中の各行末のチェックサムではなくて、PICマイコンのメモリ内容のチェックサムの計算についてです。
PIC18F4450を例にすると、
チェックサムは次のようにして計算することができます。
1、プログラムメモリのすべてのロケーションの内容(バイト値)を合計する
2、コンフィギュレーション・ワードの内容(未実装ビットは除外、バイト値)を合計する
3、プログラムメモリのブロックのうち、いずれか1つでもコードプロテクトされていた場合は、各ユーザーIDロケーションの内容(下位4ビット)を合計する
上記の合計値を加算した、下位16ビットがチェックサムになります。
プログラムメモリがコードプロテクトされていない場合のプログラムメモリのチェックサムの計算方法は、
Dim i As Integer
Dim Checksum As Integer = 0
For i = 0 To ProgramMemorySize -1
Checksum = Checksum + Code(i)
If Checksum > &HFFFF Then
Checksum = Checksum - &H10000
EndIf
Next
プログラムメモリがコードプロテクトされていた場合、コードプロテクトされたデバイスから読み出したコードは‘00h’となるので、上記の方法で計算できますが、デバイスに書き込む前のコードは‘00h’であるとは限りませんので、上記の方法では計算できません。
たとえば、00000h〜003FF のブートブロックをコードプロテクトした場合、00400以降のブロックのチェックサムを計算しなければなりません。つまり、ブートブロックをチェックサムの計算対象から除外する必要があります。
同様に、ブロック0がコードプロテクトされていた場合はブロック0を、ブロック5がコードプロテクトされていた場合はブロック5をそれぞれ計算対象から除外します。
さらに、ブートブロックのサイズが可変なデバイスもあります。
PIC18F4550の場合は2Kバイトで固定ですが、PIC18F4682は、2Kバイト、4Kバイト、8Kバイトの3つから選択可能です。
したがって、ブートブロックサイズの可変なデバイスの場合は、あらかじめ、コンフィギュレーション・ワードのBBSIZビットの値から、ブートブロックのサイズを求めておく必要があります。
こうして、プログラムメモリにランダムな値を設定し、ブートブロックとブロック0をコードプロテクトした場合のチェックサムを計算してみると、‘BBF3h’になりました。
このコードを MPLAB-IDE に読み込ませると、‘0xbbf3’となりました。
ついでに、PICkit2のPC側ソフト(V2.61)に読み込ませてみると、‘0B0Fh’でした。
PICkit2のコードプロテクト時のチェックサムが怪しい結果になりました。
また、MPLAB-IDE も常に正しいかというと、そうでもなさそうです。
前述のPIC18F4682のブロック0をコードプロテクトしてみると…。自分で計算したチェックサムと果たして一致するでしょうか。
何事も疑う価値はあります。
1
テーマ: プログラミング
2011/12/12 21:08
投稿者:shiggy
2011/12/12 17:41
投稿者:shiggy
今日は!
約1、2年前に、FENGさんに、PicKit2の書込み方法について教えて
頂きました。
そのPicKit2で、dsPIC33FJ12GP202(高機能なPIC)にも書込みが出来まして本当に感謝しています。
改めて、貴方とPicKit2に感謝していますが、このPicKit2構造を理解できないかと考えています。
(少しでも、PicKit2の理解を深める為に)
もし、御社で、上記の目的が達成できる書込み機を製作して居られるれるならば、それはPicKit2と同じ機能と考えて宜しいでしようか?
(つまり、PicKit2のBackupと考えています)
PICには、IDとconfigと色々な項目がありますが、私はプログラム本体を単純に書き込んでいるだけです。
約1、2年前に、FENGさんに、PicKit2の書込み方法について教えて
頂きました。
そのPicKit2で、dsPIC33FJ12GP202(高機能なPIC)にも書込みが出来まして本当に感謝しています。
改めて、貴方とPicKit2に感謝していますが、このPicKit2構造を理解できないかと考えています。
(少しでも、PicKit2の理解を深める為に)
もし、御社で、上記の目的が達成できる書込み機を製作して居られるれるならば、それはPicKit2と同じ機能と考えて宜しいでしようか?
(つまり、PicKit2のBackupと考えています)
PICには、IDとconfigと色々な項目がありますが、私はプログラム本体を単純に書き込んでいるだけです。
2011/12/8 22:10
投稿者:monster
こんばんは
何年か前に通販で買ったPIC Writer の組み立て説明書を探してここにたどり着きました。
FENG3さんで紹介されているPIC Writer 509(FENG3改その6)と同じもののようですが、お持ちなら分けていただけないでしょうか。
よろしくお願いします。
何年か前に通販で買ったPIC Writer の組み立て説明書を探してここにたどり着きました。
FENG3さんで紹介されているPIC Writer 509(FENG3改その6)と同じもののようですが、お持ちなら分けていただけないでしょうか。
よろしくお願いします。
2011/8/19 19:00
投稿者:senshu
FENG3さん、こんばんは。
今日は私のサイトに有用な情報をありがとうございました。
>何事も疑う価値はあります。
同感です。試してみないとわからないことばかりです。
今日は私のサイトに有用な情報をありがとうございました。
>何事も疑う価値はあります。
同感です。試してみないとわからないことばかりです。
FENG3のホームページにコメント投稿は出来ますが、新規投稿
即ち新しいテーマの投稿方法がわかりません。
どなたか、教えて頂けないでしょうか