目次

簡易クロックディテクタ

 100kHz程度のLEDで目視できないクロックの存在を  LEDの点滅で表示します。  2Hzのクロックを、入力クロックを使い、Dタイプ  フリップフロップで記憶します。リセットで一度LED  を消灯しておくと、入力クロックがあれば、2Hzで  LEDが点滅します。  基板の切れ端に実装してみると、次のようになります。  このディテクタで、BarCodeScannerのクロックに同期した  データを掴まえる回路の動作解析ができました。  2Hzを生成するPIC12F1501のコードは、以下。 typedef unsigned char UBYTE ; typedef unsigned short UWORD ; /* send 0.5Hz clock bit */ #define GENCLK PORTA.F0 volatile UBYTE tflag ; #define TFLAG tflag #define OFF 0 #define ON OFF+1 #define CNTBEGIN 34286 #define MASK03 0x03 volatile UBYTE state ; /* function prototype */ void init_usr(void); /* interrupt handler */ void interrupt(void) { /* generate trigger 1Hz */ if ( PIR1.TMR1IF == ON ) { /* clear flag */ PIR1.TMR1IF = OFF ; /* initialize */ TMR1H = CNTBEGIN / 256 ; TMR1L = CNTBEGIN % 256 ; /* event flag */ TFLAG = ON ; } } void main(void) { /* initialize */ init_usr() ; /* endless loop */ while ( ON ) { /* 1Hz */ if ( TFLAG == ON ) { /* clear flag */ TFLAG = OFF ; /* impress */ GENCLK = (state & ON) ; /* update state counter */ state++ ; state &= ON ; } } } /* define function body */ void init_usr(void) { /* select 31.25kHz */ OSCCON = (0x03 << 3) | MASK03 ; /* disable A/D converter */ ADCON0.ADON = OFF ; ADCON2 = 0 ; /* disable D/A converter */ DACCON0.DACEN = OFF ; /* disable compare module */ CM1CON0.C1ON = OFF ; CM1CON0.C1OE = OFF ; /* I/O state */ LATA = 0 ; /* I/O directions */ TRISA = 0x08 ; /* bit3 as input , others as output */ /* no pull-up */ //WPUA = 0x00 ; /* initialize Timer 1 */ { /* 31.25kHz/1 = 31.25kHz -> 31.25kHz/31250 = 1Hz clock source Fosc (31.25kHz) prescaler 1:1 T1CKPS 00 */ T1CON = (1 << 6) | ON ; /* 65536 - 31250 = 34286 */ TMR1H = CNTBEGIN / 256 ; TMR1L = CNTBEGIN % 256 ; /* enable timer 1 overflow interrupt */ PIE1.TMR1IE = ON ; /* enable peripheral interrupt */ INTCON.PEIE = ON ; } /* enable general interrupt */ INTCON.GIE = ON ; /* clear flag */ TFLAG = OFF ; /* initialize variables */ state = 0 ; }
目次

inserted by FC2 system