---PICの罠(MCLR偏)---

 以前アドバイスいただいたことを試してみようと、下記のような
 実験回路を組みました。

 
 この回路で、

      while(1){
         PORTA=~PORTA
         WaitTime(20000);
      }

 初期設定はありますが、このプログラムを走らせました。
 すると、最初は、思った動作をしますが、

 

 途中で、止まってしまいます。プログラム的には、間違いは
 ありません。
 PICの足に触ると、動き出したり、止まったり、動作が安定し
 ません。
 
 通常は、○ドウインの基板を使ってテストしてますが、
 この基板で動いて、ブレッドボードで実行すると、回路は、
 間違ってないのに動かないという事象に遭遇しました。
 違いを考えると、○ドウインの回路は、リセットの回路が組まれ
 ていますが、ブレッドボードでは、組まれていません。
 NETで検索するとありました。MCLRと呼ばれるリセットに使わ
 れる端子を有効にしておくと、リセットの回路がない状態で
 は、不安定になるとありました。
 
 そこで、前述のプログラムのconfigの設定を、
     MCLREN→MCLRDIS
 にして、再度コンパイル、それで、動かしてみました。

 

  あっけなく動きました。
  アドバイスいただいた通りの動作でした。
  LEDの極性を反対にして、ポートにつなぐのが味噌です。
  プログラムでは、時間をおいて、HIGHとLOWを繰り返して
  るだけです。
  こうすることで、PICがHIGHになると吸い出し?でLEDが
  点灯し、LOWになると吸い込みでLEDがつきます。
  私には、目から鱗でした。
  PICのポートが少ない時は、応用ができ
  そうです。

-ローコストLCDシリアル通信モニター(PIC16F1823)-

 諸兄のHPに載っていたローコストLCDシリアル通信モニター

 (PIC16F1823)を作成しました。

 

 USARTのボーレート設定がタクトスイッチでできるのが便利
 です。
 プログラム等は、全部、諸兄の作られた物を使わせていただき
 ました。
 もう一つPICをのせて、データー処理にとおもいましたが、
 今回は、やめました。
 諸兄のプログラムを見てみると、ボーレートの設定をEPROM
 に書き込んで、プログラムからリセットすることで、設定をかえ
 ているようでした。
 いままで、EPROMは使ったことないので、こんな使い方もで
 きるんだなと思いました。
 また、リセットするのに、
  asm(“RESET”)
 というインラインアセンブラーのコードを使ってるようです。
 それにしても、やはりすごいです。このような知識、どうやって
 獲得されたんでしょうね。

---新しいPIC---

 NETサーフィンをしていると「初めてのPIC」というHPが、
 目にとまりました。
 そこで紹介されている「16F1455(16F1459)」というPIC
 が目にとまりました。
 スペックを見ると、クロックが48Mhzに設定でき、
 2.3v~5.5vの幅広い電圧で動作できるとのありました。
 早速衝動買いをしてしまいました。
 ○月や○ルツ等では、取り扱いがなく、「○S」という初めて
 の会社での購入になりました。
 届いたパッケージは、会社独自のおしゃれなものです。

 

 中身は、HDD等の包装に使われている素材の袋にパッケージ
 されてました。

 

 開けてみると、PICは、静電気防止のスポンジ?ではなく、
 一つ一つプラスティックのケースに入っていました。

 

 感想としては、ICの取り扱いになれた?会社なのかなと
 おもいました。
 この「○S」という会社は、PICの検索をすると、必ずといって
 いいほど引っかかる会社でした。なんどか、HPは見て存在は
 知っていたのですが、どんな会社か分からず、利用していません
 でした。
 在庫のしなものばかりではなく、海外からも取り寄せ?で
 しなものを購入できるようです。

---新しい開発環境(8)---

 また、また、はまりました。二日ほど、あれこれ悩みました
 が結局、プログラムのミスでした。
 <はまったことその1>===============
    タイマー0とタイマー1の割り込みで、割り込みの関数
   部分で、初期値の設定を入れる部分が違ってました。
   switch文で、本来なら、switchを抜けてから再設定
   しなければならないのに、switchのなかに書いてました。

        void interrupt InterReceiver( void ){
            if(TMR1IF==1){
              if(ccw==0){
                  if(p_count<6){
                     p_count++;
                  }
                  switch(p_count){
                      case 1:cwOut=0;
                           ccwOut=0;
                           break;
                      case 2:cwOut=1;
                           ccwOut=0;
                           break;
                      case 3:cwOut=1;
                           ccwOut=1;
                           break;
                      case 4:cwOut=0;
                           ccwOut=1;
                           break;
                      case 5:cwOut=0;
                           ccwOut=0;
                           break;
                      case 6:cwOut=0;
                          ccwOut=0;
              TMR1L = tMr1_Low;//TMR1初期値
                TMR1H = tMr1_Hight;//

                            break;
         }
        }
        (本来の位置)
          TMR1IF=0;//割り込みフラグクリアー
    }
  
  下記の部分の位置が問題でした。   
     TMR1L = tMr1_Low;//TMR1初期値
     TMR1H = tMr1_Hight;//

  6回割り込みさせて、一連の動作がが終わるように組みましたが、
  初期値の設定を変えても割り込みの時間がほとんど変わりませんでした。
  なんのことはない、割り込みで、6回目に戻ってくる時に
  だけ初期値が設定されますので、1回だけは、期待した
  時間での割り込みがかかりますが、後の5回は、なんと
  設定の最大値、65536まで、カウントアップしてました。
  これでは、期待した動作になりません。
  期待した動作をさせるには、フラグのクリアーの前に入れ
  ないとだめでした。
  <はまったことその2>==============
   「main」のプログラムでは、必ず無限ループを作りますが、
   このなかの処理で、大きな勘違い。
   if文で判定をして、動作をさせましたが、if文に一回だけ
   入って処理をさせたかったのですが、一回動作をさせた
   後に、ifの条件を書き換えなかったので、動作を永遠に
   繰り返すことになって、終わりませんでした。
   終わりにさせたかったのがタイマー1の割り込みだった
   ので、タイマー1の割り込みのストップの方法をあれこ
   れさがしてしまいました。分かれば、なんのことはない、
   単純なミスでした。最新の開発環境にして、単なるシンタッ
   クスミスは、環境の方で指摘してくれるので、文法的な間違
   いは、ほとんど時間を賭けずに修正できるようになりました
   が、アルゴリズム等のミスは、ダメです。修正に時間がかか
   ります。
   頭が硬くなってます。

---値段の不思議---

 PICのプログラムをPICに書き込むのに、ADWINのPICライター
 を使ってました。
 16F88等の古いものを使ってるぶんにはいいのですが、
 開発環境を新しいものに変更したついでに、16F1ファミリーの
 新しいPICも使ってみようと思いました。
 ところが、このADWINのPICライターは、新しいPICには対応
 してないようで、書き込みができないので、新しいライター
 を買うことにしました。
 何にしようか迷いましたが、諸先輩がお使いになっている
 定番のPICKIT3を購入することにしました。
 ネットと値段を調べてみるとびっくり。だいたい同じ値段でしたが、
 ○mazonでは、10倍の値段のものが売られています。
 多分、○月のと同じものだと思いますが、びっくりです。
 それとも別物なのでしょうか。○mazonのものは、
 パッケージに、「XYGstudy」の表記が見られますが、
 ○月のものにはありません。
 同じものだとすると、この値段の違いは、
 なんでしょうか。

---新しい開発環境(7)---

 新しい環境で、あれこれやっています。TMR0(タイマー0)
 を使ったプログラムを作って検証していますが、いくつか
 思うように動かないことがありました。
 使ってるPICは、16F88というOLDなものですが、新しいの
 を使うには、細かいところで、分からないところがあるので
 未だに使ってます。
 さて、内部クロックを使ってる時は、動いたように思いますが
 20Mhzのセラロックを外部につけて動作させると、どうも、
 プリスケラ-が使えないようで、値をかえても動作に変化
 がありません。
 また、TMR0の停止が思うようにできませんでした。
 
 いろいろNETであさって見ると、諸兄のHPで、
  
    <TIMER0>
     TIMERのON/OFF制御が出来ない。
     外部クロック入力同期(Sync2Cycles)がONに固定
      されている。
 の記事を見つけました。
 16F88のTMR0については、「ON、OFFができない」という
 ことで一つは解決しましたが、プリスケラ-が反映されないの
 が分かりませんでした。
 諸兄の回路図を見ると、水晶発振子を使って、RA7に入れ
 ているようで、CONFIGの設定も、EXTCLKになっています。
 私のセラロックは、RA6とRA7に入れて、CONFIGは、HSに
 しています。こんな風にすれば、入力が1本ですみますね、
 また、一つ勉強です。

 CLOCKを外部入力にすると、TMR0は、固定されてしまう
 のでしょうかね。
まだ、まだ、奥は深いです。
 <追記>
   どうやらプログラムの勘違いをしていたようです。
   一部変更したら、動きました。

---新しい開発環境(6)---

 今回のプログラムの作成に使った回路?です。

 

 おきまりの基板+USBシリアル変換アダプター(○月)の構成
 で、開発してます。
 USBシリアル変換アダプターは、FT232RLという型番で、
 完成品が、950円でした。
 左端の小さな基板は、セラロックをつけたものです。はじめ、
 空中配線で、使ってましたが、アースの端子が根元からおれ
 てしまったので、基板につけました。
 この開発に使ってる基板は、
 「キットで遊ぼう電子回路シリーズNo9」
 に付属のものですが、便利に使ってル反面、やはり、中途
 半端な感じもします。使いやすいように、自作した方
 がいいのでしょうが、ずっと使ってます。

---新しい開発環境(5)---

 今日一日、正確にい言うと、昨夜から、もがいていました。
 その結果、やっと、割込を使った受信ができるようになりま
 した。
 今回はまったのは、諸兄のプログラムを移植していましたが、
 16F88ではないPICのプログラムだったので、またもや入力
 ピンの設定が違ってました。ここを直したら、すんなりでした。
 また、割込の書式も違うのかなと思って旧の環境での記述と
 新しい環境での、記述両方してみましたが、両方とも、通り
 ました。
    旧 RCIF = 1
    新 PIR1bits.RCIF = 0
 使えない表記だとすぐに、?マークがでるので、新しい環境
 での開発は、楽です。
 この割込のプログラムは、違う諸兄のプログラムを改変しました。
 いろいろゴミが残ってますが、私の環境で、一応動いたもの
 です。

---新しい開発環境(4)---

 諸兄のプログラムをもとに、多少変更を加えて、PCの
 キーボードから、LEDのコントロールをするプログラムをつく
 りました。
 キーボードから、1~7の数字を押すことで、それに応じた
 場所のLEDを点灯するプログラムです。
 プログラムです

 ヘッダーファイルの「uart.h」と「uart.c」諸兄の作られたものを
 そのまま使わせていただいています。
 今回はポーリングのプログラムなので、次は、割込を使った
 プログラムを作ってみようと思います。

---新しい開発環境(3)---

 新しい環境で、諸兄の書いてくれたシリアル通信のプログ
 ラムを自分の環境で実現するべくもがいていました。
 コンパイルはすんなり通るのに思った動作をしてくれません。
 全部疑って、一つ一つつぶして、やっと思うような動作ができ
 るようになりました。
 まず、はまったのが、デバックのために、プログラムの間に
 書き込んだ書式です。
     int count=1000;
     RA0=1;
     RA1=0;
     while(count>0){count--;}
     count=1000;
     RA0=0;
     RA1=1;
     while(count>0){count--;}
 LEDが交互に点滅するはずですが、RA1に当てはまるLED
 の変化がありません。
 もしやと思い
        PORTA=0b00000001;
        PORTB=0b00000000;
        ・・・・・・・・・・・・・・・・・・・
        ・・・・・・・・・・・・・・・・・・・
        
        PORTA=0b00000000;
        PORTB=0b00000001;
 のように変更したら動きました。「RA」の表記では、ポート
 全体の値を書き換えてしまってるようでした。
 よく見てみるとポートのビットの操作の記述が変更に変更に
 なってました。
      RA1→→PORTAbits.RA1
 のように書かないとだめでした。    
 次にはまったのが、外部オシレーターの使用でした。
 これは、デバックの方法の手落ちでした。外部オシレーター
 でプログラムがうまく動いているのか確かめるのに、LEDの
 点滅プログラムを挿入しましたが、ウエイトタイムが短くて
 点灯しっぱなしで、うまく動いてないように見えてしまいま
 した。何回、書き直したことか。
 丸一日かかって、諸兄のプログラムの再現ができました。

 

 PICのUART機能を使って、PCからのキー入力を
 エコーバックするプログラムです。
 それから、とんでもないミスをしてました。RXとTXのピンアサ
 インを私の教科書(キットで遊ぼう電子回路シリーズNo9)で
 確認しながらしてましたが、これが間違いでした。
 教科書のPICは、16F627AというPICで、今回使ったのは、
 16F88というPICでした。同じ18ピンのICなので、同じだろう
 たたかをくっくってたのが間違いでした。なんと、
    16F627
       TX--8ピン(RB2)
       RX--7ピン(RB1)
    16F88
       TX--11ピン(RB5)
       RX-- 8ピン(RB2)
 なんと、TXとRXが入れ替わってました。これでは、動きません
 ね。やはり、データシートみないとだめなんですねえ。