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

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

PIC16F88を動かす。。。その17(温度計完了?)

2012-09-23 18:08:43 | PIC16F88

こんばんわ

としぶぅ~です。

 

今日は午前中雨で・・・大分涼しかったですね~

とても過ごしやすい^^

なのに今日は家でうまく動いていないPICと格闘(笑)

ずっとではないですよ。。。ほんの2時間ほどです。。。

何とかなりました。

とりあえず原因を確認するためにいろいろやってみました。

1.ソースコードの見直し

2.デバッガ(Pickit2)を使って気になるところを外して状況確認

   → 表示の関数を実行後、AD取り込みデータが”00”になってしまうことが

      わかった。

3.2.から推測してプログラム中でADの設定が変わってしまわないか、デバッガ(Pickit2)

   → 設定は変わらないことを確認

4.再度ADCの設定をデータシートを見ながら確認

   → おかしな設定が見つかりました。。。

     電圧範囲を設定する値がおかしかった。。。。^^;

     最初はVDD-VSSの範囲でデータをとりこむようにしていたが、解像度の問題で

     途中で+VREF-VSSの範囲でデータを取り込むように変更をしたが、実は、

     +VREF--VREFの範囲でデータをとりこむ設定になったいた。

     こうなると、-VREFのポートは、RA2のポートとかさなり、LCDのデータポートに

     使っているため、”Lo”レベル出力の時は、うまく動くが、”Hi”レベル出力になると

     ADに入る電圧がおかしな値になってしまい、今回のように”00”を取り込んでしまう

     ということでしょう。。。。

とりあえずプログラムを直すと普通に動作するようになりました。。。。よかったよかった。

で、確認!

通常時の表示

冷蔵庫にしばらく入れての表示

  他の温度計と微妙に違いますが。。。

冷凍庫にしばらく入れての表示

  ちょっと見にくい?

なんとか温度計になっているんではないでしょうか・・・・

 

いや~よかった。。。動いて(^^)

ソースコードは今週のどこかで貼り付けますかね。。。いらない??

そか・・・・じゃやめとこうかな(笑)

 

とりあえず、温度計を作ることについては終わりかな。。。ADコンバータのお勉強になりました。

 

次は何するかな。。。。RS232Cのプログラム入れて、PCにデータだすかな・・・・

また考えます。

 

それでは今日はこの辺で・・・(^^)/

 

 


PIC16F88を動かす。。。その16(温度表示について。。)

2012-09-22 23:11:31 | PIC16F88

こんばんわ

としぶぅ~です。

 

なんか急に涼しくなりましたね。

今日は昼間でも全くエアコンいらなかったです。

 

では、今日は温度センサーから取り込んだ16進データを25℃~85℃表示にすることを

考えます。

いろいろ考えていたんですが、どうも計算があわない・・・

何が合わないかって。。。先日作った表をみながら計算したんだけどどうしても100℃の

時の16進データと温度データがあわない。。。。計算するとどうもFFhで78℃くらいにな

ってしまう。。。

どうもおかしい。。。。データシートみても比例グラフになっているので。。。温度高い時だ

け係数は変えることないと思っていたんだけど。。。。あ!

このセンサLM61Bは-25℃~+85℃までを見れるんだ。。。表が間違っている。

ということで作り直しました。

こんな感じです。これで計算があいそうです。

上記のセンサのデータを計算で表すと

 0℃より温度が高い時は、

   (現在の取得データ - 65h(0℃の時の取得データ)) ÷ 2

 0℃より温度が低い時は、

   1 - ((現在の取得データ - 65h(0℃の時の取得データ)) ÷ 2)

という感じになりますか。。。

上記で計算して表示するプログラムをコーディングして実行すると

      

こんな感じになります。

デバッグで取り込みデータをみると、

ま、思った通りに表示できています。

でOK・・・・とおもいきや。。。

センサを手で押さえると温度表示が上がっていきますが、あるところで

急に表示が・・・・!

     

こんな感じに。。。しかも。。。一度こうなると表示が戻らない。

で、デバッグ!

表示が上記のようになったときは取り込みデータが”00”になっている。

しかも、こうなると元に戻らなくなる。。。

PICの方なのか・・・・センサか?

調査すると、センサ出力はちゃんと電圧がでています。

ADの結果が”00”のままになっているようです。

ソフトかな~。。。。だんだんややこしくなってきました。

 

ちょっと最終はもう少し先になりそうです。

明日もう少しデータシートやらソースコードやら眺めてみます。

上記の表示用のソースコードも、もう少しまとめてから貼り付けます。

 

なかなか前に進まない・・・いかんな~

まだ、明日は日曜なのでもう少し頑張ります。

 

それでは、今日はこの辺で

おやすみなさい~(^^/

 


PIC16F88を動かす。。。その15(昨日作ったコードのデバッグする)

2012-09-21 23:22:09 | PIC16F88

こんばんわ

としぶぅ~です。

今日は金曜だけど、会社の職場懇談会があったのであまり時間が取れなかった。。

昨日なんかおかしい表示・・・”00”が出ていたのでちょっと追っかけてみた。

現状は、 こんなん!

     こんなん!

 

上記を交互に表示している感じ・・・・

一応コードも少しいじりました。

lcd_f88.c

void disp_ad()
{
   unsigned char ad_10;
   unsigned char ad_1;

   if(ad_disp == 1){
      ad_disp = 0; /* display flag clear */
      ad_10 = (ad_data_old & 0xf0) >> 4;
      ad_1 = (ad_data_old & 0x0f);

      if(ad_10
         ad_10 = ad_10 | 0x30;
      }else ad_10 = (ad_10-0x09) | 0x40;
      if(ad_1
         ad_1 = ad_1 | 0x30;
      }else ad_1 = (ad_1-0x09) | 0x40;


      lcd_posyx(1,0);
      lcd_data(ad_10);
      lcd_posyx(1,1);
      lcd_data(ad_1);

    }
}

ちょっとだけさわりました。。。2行目クリアしてたのやめた。。。。ちらつくので^^;

ソフト的には見直してもおかしいところ見当たらない・・・

温度センサの出力が”00”の値を出してる??

で、波形観測

どうも、定期的にノイズがでているようです。

取説読んでみたけど。。。。それらしい記述がない。。。逆にノイズに強いとか書いてあるし(笑)

回路適当に半田ずけしたしな~と、こころあたりが^^;

再度半田づけしなおします。

 

すると。。。なんと表示が安定!

オシロスコープでのノイズも・・・・ひっかからない。

いや、たま~に引っかかっていますが、表示が”00”になることはないです。

 温度計並べたけど・・・読めないですね

26℃さしてます。。。。

ま、いい感じではないでしょうか。。。

とりあえず今日はここまでにします。

 

温度の表示するために計算方法を明日考えます。

 

なかなかすすまないな・・・・

 

では、今日はこの辺で。。。。おやすみなさい~^^/

 

 

 


PIC16F88を動かす。。。その14(昨日の考えを実行する)

2012-09-20 22:45:01 | PIC16F88

こんばんわ

としぶぅ~です。

夜はかな~り涼しくなってきましたね。。。。秋だ~^^

 

今日は昨日考えたやり方でとりあえずコーディングしてみました。

ささっと書いたのでバグありそうです。。。

表示になぜが”00”がでます。。。

表示についてはとりあえず、ADで取り込んだ値を16進数で表示しています。

まずは、ADのコードです。

下記をad.cに追加しました。

unsigned char ad_data; //(20120908追加)
unsigned char ad_disp; //(20120919追加)
unsigned char ad_data_old; //(20120919追加)

void ad_4ms()

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

 

次にlcd_f88.cに下記を追加

void disp_ad()
{
     unsigned char ad_10;
     unsigned char ad_1;

 /* 表示フラグを確認して、フラグが立っていたら表示データ作成 */ 

    if(ad_disp == 1){
        ad_disp = 0;      /* 表示フラグのクリア */
        ad_10 = (ad_data_old & 0xf0) >> 4; /* MSB8bit */
        ad_1 = (ad_data_old & 0x0f);             /*  LSB8bit  */

 /* 16進数表示データ作成 */

        if(ad_10
           ad_10 = ad_10 | 0x30;
        }else ad_10 = (ad_10-0x09) | 0x40;
        if(ad_1
           ad_1 = ad_1 | 0x30;
        }else ad_1 = (ad_1-0x09) | 0x40;

           lcd_posyx(1,0);
               lcd_puts("                ");     /* 2行目クリア */
               lcd_posyx(1,0);                /*  MSBデータ表示 */
               lcd_data(ad_10);
               lcd_posyx(1,1);                /* LSBデータ表示 */
               lcd_data(ad_1);

        }
}

コードはこんな感じです。

動作状況は

こんな感じです。

表示データは”8C”です。

電圧がちょっと高めなので(Pickit2の時より微妙に高い。。0.2Vくらい?)

表示データ値が少し低くなっているかな…

でもデータ的にはだいたいいいところに来ていると思います。

室温でだいたい25℃くらいなので、前回とった表で見比べると

94h付近になるはず・・・多少誤差ありますが、8Chなのでいいところ来ています。

ちゃんと温度計になっているということですね。

 

後は、少しバグ取りして、16進数を温度表示なるように変換して、温度表示できるようになれば

完成ですね。。。

明日やれるかな~

明日は、会社の懇談会なので・・・早く帰ってこれればつづきやります。

 

それでは、今日はこの辺で(^^/

おやすみなさ~い!

 

 


PIC16F88を動かす。。。その13(今日はADのやり方考える)

2012-09-19 22:26:26 | PIC16F88

こんばんわ
としぶぅ~です。

今日はADを行う方法を考えていきます。
まず、テンプレートで4msごとに5分割で処理ができるようにしてあります。
ソールコードは下記(main.cの中身)


//無限ループ
while(1){

  if(tmr_4ms_up == 1){
     tmr_4ms_up = 0;
     switch(tmr_cnt_up){
        case 0: ad_data = ad4();  //処理1
              break;
        case 1:          //処理2
              break;
        case 2:               //処理3
              break;
        case 3:               //処理4
              break;
        case 4:               //処理5

              break;
        }
   }

}

現在 tmr_cnt_upの値が "0" の時にADするようになっています。

(マーカーの部分)
つまり、4ms x 5 = 20msに1回ADするようになります。

プログラムの仕様として
1.ADは8bitでやります。
  10bitでやろうとおもったけど、まず下位1bitはかなりゆれるので実質
  9bitになるかなと思うのでとりあえず8bitでやります。
2.AD値の平均はとりません。
  20msごとにADやるので平均をとらないで前回のAD値と違っていた場合の
  みLCDの方に表示するようにします。
  これで、多分平均とるのと同じ状態になると思います。
3.表示は"case 1:"の部分で行う。

こんな感じでうまく動くんではないでしょうか・・・多分^^;

ちょっとコーディングして動作の確認してからコードは貼り付けます。
明日はやれるかな~。。。
ちょっとやれなかったら金曜日に!

ということで、今日はこの辺で。

ではおやすみなさい~^^/