としぶぅ~の「工作部屋」...毎日少しのお勉強

趣味・関心事を書いていこうと思います。

PIC16F88を動かす。。。その23(ADの解像度向上!動いたよ!完了かな。。)

2012-10-07 12:35:29 | PIC16F88

こんにちわ

としぶぅ~です。

 

今日は日曜日で、下の娘の誕生日ですが嫁が仕事なのでどこもいかず子供たちと転がっています(笑)

夕方からどっか連れて行けっていわれました^^;

 

それまでは時間があるので、先日コーディングしてうまく動かないところをデバッグしました。

とりあえず動いたので報告!

まずは、取り込みは・・・・やはり16bitにするとうまく取り込めていない。。。

ファイルを分けると16bitデータがうまく渡せていない。。。ちょっとこれはこれからの課題においておいて

取り込んだデータを2バイトデータで表示部分に渡します。

void ad4()
{
/*************************************************
channel:AN4
基準電圧:+VREF-VSSを使用
AD変換clock:8MHz/16
ADFM=0 Leftjustified
変換時間:
**************************************************/
unsigned char temp = 10;
int i = 0;
int j = 0;

//設定
ADCON1=0xE0; //1110 0000 A/D結果は左詰め,FOSC/16,A/D基準電圧:+VREF-VSS
ADCON0=0x61; //01xx x001 FOSC/16,ANS4,A/D Status(INPUT),A/D-ON

DelayUs(100); /* Delay関数使用 : 安定待ち */

//AD変換開始
GO_DONE=1;

//変換終了待ち
while(GO_DONE==1){}

//変換結果処理
ad_datah = ADRESH;
ad_data = ADRESL;
// return();
}

void ad_4ms()
{

ad4();

/* 前回のデータと今回のデータが違っていたら表示フラグをセットする */
if((ad_data_old != ad_data) | (ad_data_oldh != ad_datah)){
ad_disp = 1; /* 表示フラグセット */
ad_data_old = ad_data; /* 新データを旧データにセット */
ad_data_oldh = ad_datah; /* 新データを旧データにセット */ 
}
}

こんな感じにしました。

マーカー部分が、2バイトで取り込んでいる部分です。

とりあえず外部参照できるように、ヘッダファイル内で”extern”宣言しておいてください。

次は表示部分!

ここ。。。。結構間違いが…^^;

とりあえず2バイトで取り込むところを修正して実行するも・・・・表示がおかしい・・・

”なぜっ!?”

なんどやってもおかしい・・・

そこでPickit3登場です。

1step実行かけながらレジスタの内容を確認していきます。

なんかすごいですね。。。変数も状態もすべて見れる。。。ここまでできると思ってなかったので

最初どうしようと・・・考えてましたが、いろいろさわっているうちにできることを発見!

おぉすげ~

32bitマイコンのjtagデバッガー並みにできてます。。。。

これで発見しました・・・・100の桁、10の桁、1の桁のデータを作るところの計算が間違っている!

修正したら・・・・

こんな感じです。

いいですよ・・・・温度はちょっとずれていますが。。。。問題ないと思います。(微調整範囲です。。。)

とりあえず修正部分は

void disp_ad3()
{
int ad_fugou;
int data_100,data_100a;
int data_10,data_10a;
int data_1,data_1a;
unsigned char ad_temp;
int dt_0,dt_1,dt_2;

if(ad_disp == 1){
ad_disp = 0; /* display flag clear */
// 温度表示の計算
dt_0 = ((ad_data_old & 0x00ff) + ((ad_data_oldh << 8) & 0x0300)); ←2バイトを1ワードデータに
ad_dt0 = dt_0;
dt_1 = dt_0 - 300;
if(dt_1 > 0){
if(dt_1 > 425){
dt_1 = 425;
}
dt_2 = dt_1 * 2;
ad_fugou = 0x2b;
data_100 = (dt_2 / 100);
data_10 = ((dt_2 - data_100 * 100) / 10);       ←data_100に100かけてなかった
data_1 = (dt_2 - data_100 * 100 - data_10 * 10); ←data_100に100、data_10に10かけてなかった

}else{
if(dt_1 == 0){
ad_fugou = 0x20;
data_100 = 0;
data_10 = 0;
data_1 = 0;
}else{
dt_1 = 1 - dt_1;
if(dt_1 < 125){
dt_1 = 125;
}
dt_2 = dt_1 * 2;
ad_fugou = 0x2d;
data_100 = dt_2 / 100;
data_10 = (dt_2 - data_100 *100) / 10;       ←data_100に100かけてなかった
data_1 = dt_2 - data_100 *100 - data_10 * 10; ←data_100に100、data_10に10かけてなかった
}
}
}

// アスキー変換
data_100a = data_100 | 0x30;
data_10a = data_10 | 0x30;
data_1a = data_1 | 0x30;
// LCDへの温度表示
lcd_posyx(1,0);
lcd_data(ad_fugou);
lcd_posyx(1,1);
lcd_data(data_100a);
lcd_posyx(1,2);
lcd_data(data_10a);
lcd_posyx(1,4);
lcd_data(data_1a);

}

こんな感じです。

あとは、小数点表示になるように少し修正してあります。

いや~なんとかなってよかった。

しかし、Pickit3・・・・いいですね~

赤い・・・・

なんか今日デバッグしていて、かな~り早くなっていると感じました。

これからはこちらメインで使用でしょうか・・・・

 

とりあえず動いたので今日はこの辺にしておきます。

 

それではまた~(^^)/