[SPIの実験2]でのプログラムが上手く動作しない
〔ブラウザーの戻るを使用して戻って下さい〕
《質問》
SPIのマスターからスレーブへ1秒毎でデータ0x30〜0x7aまでを送信しているが、
受信したデータは0x30のままで変化しない。
for のループは回っている様である。
---------------------------------------------------------------------
while(1) {
// LCDに表示しやすい用にキャラクター文字を送っています。
for (i = 0x30 ; i < 0x7b ; i++) {
SSP1BUF = (char)i ;
__delay_ms(1000) ; // 1秒毎に送る
}
}
---------------------------------------------------------------------
[SPIの実験2]の記事はこちら。
《解析》
質問者の実験構成
MAPLB IDE 8.83
HI-TECH C Lite mode(Lite Mode) V9.83
PIC:マスター、スレーブ共に16F1823
プログラマー不明
解析の実験構成
(質問者の作成されたプログラムを送ってもらい解析しました)
MAPLB IDE 8.63
HI-TECH C Lite mode(Lite Mode) V9.80
PIC:マスターに12F1822、スレーブに16F1827
PICkit3にて書き込み
実験1回目
正常に動作
実験2回目
MAPLB IDE 8.83
HI-TECH C Lite mode(Lite Mode) V9.83
をダウンロードして別のマシーンで書き込み実験したら0x30のまま変化しない。
コンパイラーを疑う
実験3回目
MAPLB IDE 8.63
HI-TECH C Lite mode(Lite Mode) V9.83
やっぱり0x30のまま変化しない。
さらにコンパイラーをますます疑う
質問者にコンパイラーをV9.80にする様に指示をした。
返答はV9.80でも動作しない。
実験1回目と2回目を良く見比べたら、コンパイル方法が若干異なるのを発見
1回目は実験プログラムで使用しないのでリンクはされないのだが、
左の様にサブライブラリ(skMonitorLCD.c)が追加されている。
これはリンクされないがコンパイルはされる。
これを外して(Remove)コンパイル後実験4回目を行う。
動作せず、0x30のまま変化しない。
コンパイラーのバージョン(少なくともV9.80以降)は関係なさそう。
IDEの「View」→「ProgramMemory」ウインドウを表示させそこの[Symbolic]アセンブラコードを
動作したパターンと動作しないパターンで見比べる
動作したパターンでは、skMonitorLCD.cのデータがPICのメモリデータ領域に登録されているだけで
後は同じにしか見えない!
《結果》
上の解析した結果から下記の様にすれば動作する事が判明した。
---------------------------------------------------------------------
#include <pic.h>
#include <htc.h> // delay用
#define _XTAL_FREQ 4000000 // delay用に必要(クロック4MHzを指定)
が記述されています、これを
#include <pic.h>
#include <htc.h> // delay用
#define _XTAL_FREQ 4000000 // delay用に必要(クロック4MHzを指定)
const char omajinai[] = "ugoke" ; // 動作する為のおまじないです
---------------------------------------------------------------------
とconst char omajinai[] = "ugoke" ;の行を追加します。
《原因》
上記のomajinai変数のデータはPICのプログラムデータ領域の先頭に書き込まれるだけと思いますが
なぜこれで動作するのかよく分かりません。
なんとなくコンパイラーの不具合っぽくもなくもないのですが....
或いはPICのF1シリーズの不具合か(他にPICを持っていないのでその辺は調査不明ですがぁ)....
でもぉ、他にSPIのレジスターの使い方とか有ったりしてぇ.....
謎です。
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2012 Shigehiro Kimura All Rights Reserved.