denshikobo’s blog

PICプログラミングやPCの操作で感じた日々の由無し事を綴ります

自己完結するPIC_coloに少し自信を深めた

 

PIC_colo_miniのサンプル・プログラム6種が動きました。

 

最後のFlash_memoryでPIC_coloが動作異常を起こしました。ロードしたFlash_Memoryプログラムではなく、PIC_coloデバッガで停止したようです。Resetすると回復するので、プログラムを書き換えてしまうような不具合ではなさそうなのですが、PIC_coloデバッガ自身のデバッグは久しぶりです。

 

はて?何が起きているのか?PICkitを接続して調べなくても大丈夫なのか?

 

Resetして再起動・・・停止。Resetして再起動・・・停止。

何度も繰り返して、Common_Frameが64バイトのflash_read_buffの読み取りを掛けた所でPIC_coloが停止してしまうことが判りました。

 

プログラムを調べると・・・

#define SEND_BUFF_SIZE 16
#define RECEIVE_BUFF_SIZE 64
unsigned char comm_receive_buff[RECEIVE_BUFF_SIZE];
unsigned char comm_send_buff[SEND_BUFF_SIZE];

送信用バッファは16バイトしか確保していませんでした。orz

 

バッファサイズを超えて書き込まないように修正すると、

for( offset=0;offset<size;offset++)
{
 if( offset >= SEND_BUFF_SIZE )break;  <==追加した
 comm_send_buff[offset] = *(pointer++);
}
PIC_coloは停止しなくなりましたが、memoryの読み取りが16バイトに制限されます。comm_send_buffを64バイトに拡張できれば良いのですが、RAMの使用量が256バイト(<==設計仕様)を超してしまいます。

 

さて?どうするか?

 

あらためてプログラムの動作を調べると・・・

(1)memory_readコマンド受信  <==comm_read_buff使用
(2)コマンド解釈
(3)コマンド実行 <==comm_send_buff使用
(4)コマンドcomplete送信 <==次のコマンド送信許可

この動作は全てのコマンドに共通(resetコマンドだけcomplete送信が無い)なので、comm_send_buffとcomm_receive_buffは共用できます。簡単に次のように書き換えて、64バイトのmemory読み取りが出来るようになりました。パチパチパチ~

 

#define RECEIVE_BUFF_SIZE 64
unsigned char comm_common_buff[RECEIVE_BUFF_SIZE];
#define comm_receive_buff comm_common_buff
#define comm_send_buff comm_common_buff
 

で、「PIC_coloが自己完結している」というのは・・・

PIC_colo_Updateプログラムを使うと0x0000~0x0fffに配置されているPIC_coloデバッガ自身の書き換えが出来ます。つまり今回の不具合対策(デバッグからPIC_coloプログラムの書き換えまで)は全てPIC_colo単体で行ったのです。

 

『PICkitを使わないPICプログラムの開発環境』というPIC_coloのコンセプトの実現に、少し自信が待てました。