PICとメカな日々

Webにも萌えにも限界を感じたオタクがPICマイコンをいじる日々。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

やっぱ動かない

 そろそろA/D変換とかやってみたいので12F675に移行しようと思って、この本


 
 に載ってたA/D変換した結果をシリアルポート経由でPCに送信するボードを作ってみたが、やっぱ動かない。

 12F675にA/D変換にシリアルポート。こんだけ未経験の要素があったらそりゃ一発で動くわけないわな。部分ごとに分解してチェックしていくか。
スポンサーサイト

クリスタル替えた

 結局4.194304Mhzのクリスタルに替えた。

 時計作るのはこのへんにして、次はようやく12F675使ってA/D変換かな。

時計その後

やっぱ時間のズレ大きいわ。3.2768Mhzのクリスタルでないとあかんな。

普通のデジタル時計

 7セグLEDが余っていたという理由だけで、なんとなくデジタル時計を作ってみる。ダイナミック点灯は前回のバイナリ時計でやったので、今回の目標はトランジスタの動作確認。

 最初は32Khzのクリスタルで動かそうとしたが、うまいこと発振しないのと(やっぱ発振モードをLPにしないとだめか?)ダイナミック点灯のちらつきが起きそうだったので2Mhzクリスタルに変更。

 なんとなく動いているので電池動作でしばらく確認した後、また古い携帯用のアダプタに電源を変更する予定。

デジタル時計


 回路図はコレ。
20060212195435.jpg


 ソースコード。再利用価値があるとすれば7セグの表示データだろうけど、シンク動作なので0が点灯なのに注意。

/*

  普通の時計 PIC16F84使用
  2.0Mhzクリスタル仕様
  
*/
#include<pic.h>
#include<delay.h>
__CONFIG(0x3FF2);        //CONFIG:CP=OFF,PWRT=ON,WDT=OFF,OSC=HS

void display(void);
void time_adjust(void);
char segment[10]={
          0b01000000,    //0
          0b01111001,    //1
          0b00100100,    //2
          0b00110000,    //3
          0b00011001,    //4
          0b00010010,    //5
          0b00000010,    //6
          0b01011000,    //7
          0b00000000,    //8
          0b00010000,    //9
};

unsigned long timer_count=0;  //タイマ定数設定
unsigned char hour=0;
unsigned char min=0;
unsigned char sec=0;
void main(void)
{
  PSA=0;          //プリスケーラを使用する
  PS2=1;
  PS1=0;
  PS0=0;          //プリスケーラは1:32

  T0CS=0;           //クロックソースは内部命令サイクル
  TMR0=0;           //TMR0をリセット
  T0IF=0;           //T0IFをリセット
  
  T0IE=1;           //TMR0割り込み発生を許可
  GIE=1;           //割り込みを許可
  
  PORTA=0b00001111;      //PORTAをリセット
  PORTB=0b11110000;      //PORTBをリセット
  TRISA=0b00011000;      //RA3・4を出力、RA0~2を入力に設定
  TRISB=0b00000000;      //RB0-7を出力に設定
  
  PORTA=0b00000111;      //PORTAをリセット
  PORTB=0b01111111;      //PORTBをリセット

  while(1)           //無限ループ
  {
    display();        //時刻表示
    time_adjust();      //時刻調整
  }
}

void display()          //時刻表示ルーチン
{
  //hourの10の桁
  PORTA=0b00000000;
  RB7=0;            //全列OFF

  PORTB = (0x80 & PORTB) | (0x7F & segment[hour/10]);  //PORTBの下7bitにhourの10の桁出力
  RA0=1;            //hourの10の桁ON
  DelayMs(1);
  
  //hourの1の桁
  PORTA=0b00000000;
  RB7=0;            //全列OFF
  
  PORTB = (0x80 & PORTB) | (0x7F & segment[hour%10]);  //PORTBの下7bitにhourの1の桁出力
  RA1=1;            //hourの1の桁ON
  DelayMs(1);
  
  //minの10の桁
  PORTA=0b00000000;
  RB7=0;            //全列OFF
  
  PORTB = (0x80 & PORTB) | (0x7F & segment[min/10]);  //PORTBの下7bitにminの10の桁出力
  RA2=1;            //minの10の桁ON
  DelayMs(1);
  
  //minの1の桁
  PORTA=0b00000000;
  RB7=0;            //全列OFF
  
  PORTB = (0x80 & PORTB) | (0x7F & segment[min%10]);  //PORTBの下7bitにminの1の桁出力
  RB7=1;            //minの1の桁ON
  DelayMs(1);
}

void time_adjust()
{
  //hourのカウントアップ
  if(RA4){           //hourスイッチを見る
    DelayMs(30);       //チャタリング待ち
    if(RA4){
      hour++;        //時刻をカウントアップ
      if(hour >=24){
        hour = 0;
      }
    }
    while(RA4){        //ボタンがオフになるまで待つ
      display();      //待っている間の表示
    }
    DelayMs(50);       //も一回押すには0.05秒待ち
  }
  
  //minのカウントアップ
  if(RA3){           //minスイッチを見る
    DelayMs(30);       //チャタリング待ち
    if(RA3){
      min++;        //分をカウントアップ
      sec = 0;      //秒を0に変更
      if(min >= 60){
        min = 0;
      }
    }
    while(RA3){         //ボタンがオフになるまで待つ
      display();       //待っている間の表示
    }
    DelayMs(50);        //も一回押すには0.05秒待ち
  }
}

interrupt clock_count()          //割り込みルーチン
{
  if(T0IF){
    T0IF = 0;            //割り込みフラグクリア
    TMR0 = 131;            //TMR0をオーバーフローまで125カウントに指定 256-125-131
    timer_count++;
    if(timer_count == 125){
      timer_count = 0;      //タイマカウント(1sec=2M=4*32*125*125)
      sec++;
      if(sec >= 60){
        sec = 0;
        min++;
        if(min >= 60){
          min = 0;
          hour++;
          if(hour >= 24){
            hour = 0;
          }
        }
      }
    }
  }
}


バイナリ時計とその他

 バイナリ時計の方は、電池動作をやめてACアダプタ動作に変更。
 とはいえ新しくアダプタ買ってくるのももったいないので、昔の携帯電話用ACアダプタをガラクタ箱から引っぱり出して接続。

 出力電圧が5Vしかないので、レギュレータを通すと3.5Vくらいになってしまうがそれでもちゃんと動作している。

 それはそれとして、前に買った7セグLEDを使ってみるために普通のデジタル時計を制作中。なんか順番が逆のような気もするが。

 しかしなんだ、次の問題はケース工作だな。普通のプラケースとかアルミケースだと面白くないし。木製(それも広葉樹の木材)とかガラスとか、なんか手芸とか工芸方面のものと電子工作を絡ませると面白いかも。

クリスタルに変えた

 バイナリ時計を006P電池が切れるまで動かしてみたが、三日くらいは動いてた。最後の方で時間を見たら約2分程度進んでいる。精度にすると約0.04%くらいか。以外にセラロックは精度が高かった。

 ついでにギリギリ点灯している状況で電池の電圧を測ると約4V、PICに入ってるVcc電圧で約2.5V。結構低電圧でも動作することが判明。

 さすがに4日目にはいるとカウントが止まって一部のLEDが点灯しっぱなしという状態で止まったため、最初から予定していたクリスタルへの変更を行う。

 マルツパーツから届いた3.2768Mhzのクリスタルと22pFのコンデンサ×2個をセラロックと入れ替え。それに伴いファームウェアも一部変更して焼き直し。

 再度PICを差し込んで電源投入したらちゃんと動くが、やはりクロックが1/3になったせいかちらつきを感じる。これが32.768Khzだったらもっとひどかっただろうな。

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。