---PIC 流れるサインボード (1)---

 諸兄のHPを参考に、PICを使ってサインボードを作りました。
 何の使用目的もない、ただのおもちゃです。
 ただ、諸兄のHPで使ってる74HC154は製造中止でしたの
 で、これまた、諸兄のHPを参考に、74LS138二つで置き換
 えて作りました。
 三日ぐらいかかって、配線を終えて、どのような形で、流れる
 サインボードを実現するか考えました。
 参考になるC言語によるプログラムがみあたらなかったので、
 過去の7セグLEDを使った工作を思い出しながら、
 ダイナミック点灯を基本にプログラムを組むことにしました。

 

 8×8のLEDが4枚ですので、8×32列のLEDがならんでます。
 この黄色い□から黄色い□までのLEDに、タイマー割り込みを
 使って、このLEDとダブるように準備したメモリーの内容を
 書き出すことにしました。
 テレビで使われている走査線のイメージでしょうか。
 メモリーには、縦に8個並んでいるそれぞれのLEDの
 ON-OFFの情報を書き込みます。
 右にスクロールさせるには、メモリーの左側の山吹色の部分
 に表示させる文字のデーターを書き込みます。
 左にスクロールさせるには、メモリーの右側の青色の部分に
 表示させる文字のデーターを書き込みます。
 「A」の表示をさせるには、

 

 16進数7個をメモリーに書き込みます。
 左側に書いてある数字が、上から左端の縦の列の情報に
 対応します。
 これをスクロールさせるには、メモリーに書いてある情報を
 それぞれ、一つ右側のメモリに移動する、ということで、実現
 します。

 

 多分、このほかにもスクロールの方法があるのでしょうが、
 自己流で、作製しました。
 実際に動かして見ると、すーっと流れるような表示には、
 なっていません。
 なめらかにするには、もう少し、工夫が必要なんでしょうね。

 

 アルファベットのA~Zまでの大文字のデーターを入れると、
 それだけで、ほぼメモリーが満杯です。
 倍のメモリーのある16F1939に変更してみようと思います。
 USARTを使って、PCのデータをスクロールさせるのが目標
 です。

--MPLAB XIDE config 自動生成--

 XIDEに開発環境を移した時はv3.10でしたが、まもなくv3.15
 がでたので、ちょっとたってからVUPしました。
 2.3日前でしょうかXIDE操作してるとv3.20のリリースの
 バルーンがでてきました。
 まだ、VUPはしていませんが、バグフィックス版なのでしょうか、
 それとも新しい機能が追加されたのでしょうか。近々VUP
 してみようと思います。
 PICのプログラムをするのに困ってたのが、「congif」の設定
 で、PICの種類ごとに特有?の設定をするのが面倒でしたが
 XIDEでは、以下の方法で、自動設定できます。
 Window-PIC Memory Views-Configration Bits
 とたどります。

 

 すると下記の画面になりますので、

 

 矢印のOPTIONの各項目をクリックします。すると、ON、OFF
 等の選択ボックスがでますので、設定に応じて選択をします。
 設定が全部おわったら、右クリックをして、

 

 Configration Source Code Outputをクリックすると、

 

 設定してあるPICのConfigのコードが生成されます。
 これを全部コピペするとConfigのできあがりです。

---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
 使えない表記だとすぐに、?マークがでるので、新しい環境
 での開発は、楽です。
 この割込のプログラムは、違う諸兄のプログラムを改変しました。
 いろいろゴミが残ってますが、私の環境で、一応動いたもの
 です。