ゲイテッドレーザーサイト その6 (とりあえずソフトウェア) [DIY]
昨日、更新したら、ページビューがぐんとあがってて、ちょっと喜んでます。
まだ、APSには関係が薄いので、その筋の人は以下は読まなくてもいいかも。
で、
今回は、12f683のソフトウェアに関して。
まずは、ちょっと長いけど全文。
説明:
続きは、続きで。
まだ、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