SSブログ

ゲイテッドレーザーサイト その6 (とりあえずソフトウェア) [DIY]

昨日、更新したら、ページビューがぐんとあがってて、ちょっと喜んでます。

まだ、APSには関係が薄いので、その筋の人は以下は読まなくてもいいかも。


で、
今回は、12f683のソフトウェアに関して。

まずは、ちょっと長いけど全文。
// PIC12F683 Configuration Bit Settings

// 'C' source line config statements
// $Header: /home/jake/Project/GatedLaserSight/Firmware/main.c,v 1.2 2015/03/24
13:01:15 jake Exp $
#include 
//#include 

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSCIO oscillato
r: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = ON       // MCLR Pin Function Select bit (MCLR pin functi
on is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memory code prot
ection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code pr
otection is disabled)
#pragma config BOREN = OFF      // Brown Out Detect (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal Ex
ternal Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Saf
e Clock Monitor is disabled)

#define _XTAL_FREQ 4000000

//#define GATE  GP0
#define LASER GP5
#define ON 1
#define OFF 0

volatile char gate;


void interrupt isr(void)
{
  if(PIR1bits.CMIF==1){                   // if set by Comparator
    if(CMCON0bits.COUT==1){
      gate = 1;           // gate is on
    }
    PIR1bits.CMIF = 0;
  }
}
main()
{
  // set internal clock oscillator
  OSCCONbits.IRCF=0b110;
  OSCCONbits.SCS=1;
  OSCTUNE=0;
  // そのほかのビットはリードオンリー


  // set I/O
  // set ANSEL Fosc/2,ANS=
  ANSELbits.ADCS=0b101;
  ANSELbits.ANS0=1;

  // reset GPIO
  GPIO=0;
  TRISIO=0;           // set as all output
  TRISIObits.TRISIO0=1;
  //ANSEL=0;            // set no use analog input
  CMCON0bits.CM= 0b101; // Comporator Mode Mulitiplex input with internal refere
nce
  CMCON0bits.CIS=1;     // Connect GP0/CIN+ to Comparator
  CMCON0bits.CINV=1;    // Comparator out when GP0 is over reference

  //set Vref
  VRCONbits.VREN=1;     // VRef enable
  VRCONbits.VRR=1;      // VRef Low Range
  VRCONbits.VR=10;      // 13/24*3.0=1.625V

  //interrupt setting
  INTCONbits.PEIE=1;    // Enable periphrall Interupt
  PIE1bits.CMIE=1;      // Use Comperator interrupt
  INTCONbits.GIE=1;     // Enable Interrupt
  PIR1bits.CMIF = 0;

  // Welcome LIT
  LASER=ON;
  __delay_ms(500);
  LASER=OFF;


  unsigned char state =0;
  while(1){
    if (gate==1)
      {
        gate=0;
        LASER=ON;
        __delay_ms(1500);
        LASER=OFF;
        //__delay_ms(500);
      }
  }
}



説明:
1-5行目パス
6行目今回開発系としXC8を使う。昔のコンパイラは、PICの型番号をインクルードファイルとして指定してそのなかで書くデバイス用の定数定義をしていたが、現在のものは、コンパイラの起動引数として宣言される。そのため、分ける必要は無い。こうしておけば、デバイスが変わっても、たとえばピン数が増えるなどで機能が変わらない上位デバイスに変更するとしても、プログラムを変更しないで使うことができる。 ことを目指しているが、アーキテクチャが異なればこの限りではない。ここでは、xc。hをインクルードする。
9-27行目コンフィグレーションワードの記述。MPLABXで自動的に生成されたテキストをコピーする。
29-34行目このプログラム特有の定数定義 _XTAL_FREQ: デバイス動作中のクロック周波数を指定する。(この値は、delay関数内で使用される) LASER:レーザダイオードの制御信号出力ポート
39-47行目割り込みサービスルーチン。 メインプログラムで、コンパレータの結果で閾値を越えると割り込みが起こるように設定しており、この関数で、割り込みを処理する。 この関数では、割り込みがコンパレータによるものかを確認し、さらにコンパレータ出力がオンのとき、ゲート変数を1にする。このゲート変数は、メイン関数のループ内で常に参照され、割り込みがあったことをメインプログラムに伝える。 gate変数を設定した後で、コンパレータ割り込みを再設定している。(英語で言うとリセットね)。


続きは、続きで。




コメント(0) 
共通テーマ:趣味・カルチャー

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。