PICとメカな日々

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

スポンサーサイト

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

割り込みと鉛フリーハンダ

 ハードウェアの方は一段落したんで、しばらくソフトウェアの方をいろいろ実験してみようと思ったり。
 そんでこんどのテーマは「割り込み」。いわゆるインタラプト。

 PICはいろいろ割り込みがあるが、一番典型的なものとしてタイマ割り込みを使ってみる。参考書として使ってるこの本



 でタイマ割り込みのあたりを読んでみる。正確に言うとこの本は同じPICでも8ピンの12F675を使ってるが、基本的には似たようなモノらしい。

 そんでこのタイマだが、機能的には

・クロックをそのまま、あるいはクロック何回かでカウントアップ
・8ビットのタイマがオーバーフローするたびに割り込み発生

 が基本らしい。C言語からは、関数定義のときにアタマに

interrupt hogehoge()
{
}



 とinterruptを書き加えてやると割り込み発生時にこの関数をコールするそうな。今まではDelayMs()関数とかでウェイトをかけてたが、正確に時間を計りたい場合(時計とか)はコレで一定時間ごとに処理ルーチンが作動するようにしてやればよいわけか。

 あとは割り込みを使うためになんぼか設定が必要になる。これもデータシートを眺めた結果、OPTIONレジスタとINTCONレジスタの中にある設定ビットをいじってやればよいらしい。

 ちなみに割り込み関数の中では、割り込みを発動したフラグを0に戻してやる処理がまず最初に必要だそうな。今回のソースで言うとタイマ割り込みが発動したときに立つT0IFフラグだな。そうでないと割り込み処理後にまたすぐ割り込みになると。

 そんなこんなで今回のソースはこうなった。なんかif文ばかりで見苦しいが。


/*
 割り込みのテスト
 最初はカウントアップ方向にフラッシュ
 RA0のキーで割り込み→カウントダウン方向に変更
*/
#include<pic.h>
#include<delay.h>
__CONFIG(0x3FF2); //CONFIG:CP=OFF,PWRT=ON,WDT=OFF,OSC=HS
unsigned char led_outdata=0b00000001; //出力データを初期化
unsigned char timer_count=0; //タイマ定数設定
unsigned char vector=1; //フラッシュ方向は左=1,右=0
void main(void)
{
 PSA=0; //プリスケーラはTMR0に割り当て
 PS2=1;
 PS1=1;
 PS0=1; //プリスケーラ分周比は1:256

 T0CS=0; //クロックソースは内部命令サイクル
 TMR0=0; //TMR0をリセット
 T0IF=0; //T0IFをリセット

 T0IE=1; //TMR0割り込み発生を許可
 GIE=1; //割り込みを許可

 PORTA=0b00000000; //PORTAをリセット
 PORTB=0b00000000; //PORTBをリセット
 TRISA=0b00000011; //RA0,RA1を入力に設定
 TRISB=0b00000000; //PORTBを出力に設定

 PORTB=led_outdata;

 while(1) //無限ループ
 {
  if(RA0){ //RA0スイッチ
   DelayMs(30); //チャタリング待ち
   if(RA0){
    if(vector){ //vectorが1なら
     vector = 0; //vector=0に
    }else{
     vector = 1; //さもなくば1に
    }
   }
  }
 }
}

interrupt led_shift() //割り込みルーチン
{
 if(T0IF){
  T0IF = 0; //割り込みフラグクリア
  timer_count++;
  if(timer_count > 10){
   timer_count =0; //タイマカウント
   if(vector == 1){
    led_outdata <<= 1; //vector==1なら左シフト
    if(led_outdata == 0){
     led_outdata=0b00000001;//右に戻す
    }
   }else{
    led_outdata > >= 1; //vector!=1なら→シフト
    if(led_outdata == 0){
     led_outdata=0b10000000;//左に戻す
    }
   }
  }
 }
 PORTB=led_outdata; //出力
}



 そんで例によってコンパイルして、MPLAB上でシミュレーションしてもだいたい予想通りになってるんでチップに転送したんだが、なんかうまく行かない。というか、RB4~7につながってるLEDの上4ビットが点灯しない。

 基盤をあちこちさわってるうちに点灯することもあったりするんで、こりゃソフトの方じゃなくてハードの方らしいと目星はつく。最初はICSP用に付いてるコネクタの接触不良かと思ってたが、どうもLEDのグランド線のほうが接触不良らしい。テスタで調べたらやっぱし導通不良になってる。

 思い当たるフシはあった。LEDを取り付けるとき、部品といっしょに買った鉛フリーハンダ。通常のハンダより融点が高いんで、やたらとハンダ付けが難儀なことになるんだよな。普通のハンダならしばらくコテをあててると液体になったハンダがすっと隙間に流れ込んでハンダ付け完了になるんだが、Sn-Agだけの鉛フリーハンダの場合はコテが当たったとこだけハンパに液化して他の部分まで溶けてくれない。

 しょうがないので30Wの大きめのコテを持ち出してきていったん鉛フリーハンダを全部溶かし吸い取り線でハンダを外す。しかるのちに通常のハンダで再度ハンダ付けし直してようやくまともな動作に。
スポンサーサイト

コメント

電子書籍

電子書籍を探すなら http://www.mladickrealty.com/402853/411482/

  • 2008/09/14(日) 22:10:05 |
  • URL |
  • #-
  • [ 編集]

30代,40代で転職して臨床心理士

臨床心理士は、心理学のノウハウを使って、人の心理的な悩みの相談を受ける http://lachrymation.photobycolin.com/

  • 2008/10/17(金) 06:13:56 |
  • URL |
  • #-
  • [ 編集]

少林寺で修行

少林寺の検索サイト。少林寺拳法、少林寺拳法部、オザキ、同志社、憲法など少林寺に関する各種情報をお届けしています。 http://paylates.tallmadgetitan.com/

  • 2008/12/03(水) 21:03:03 |
  • URL |
  • #-
  • [ 編集]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://dmidorikawa.blog39.fc2.com/tb.php/10-b2a5953e
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

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