目次
前
次
簡易クロックディテクタ
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 ;
}
目次
前
次