目次
前
次
Cristal marker
アマチュア無線のトランシーバのメータ調整に
クリスタルマーカーを利用します。
25kHzを生成するクリスタルマーカーをPIC12F629で作りました。
ピン接続は、以下。
PIC12F629は内蔵で4MHzがあるので、タイマーカウンタで
50kHzを生成して、内部カウンタを+1して、カウンタの
LSBの値をピンに出力します。
ブロック図で見ると、以下。
50kHzを生成するには、タイマー0の入力クロックが
500kHzであるので、10分周してオーバーフロー割込み
を起こします。
割込みハンドラは、次のように記述します。
void interrupt(void)
{
/* generate trigger */
if ( INTCON.T0IF == ON ) {
/* clear flag */
INTCON.T0IF = OFF ;
/* initialize */
TMR0 = CNTBEGIN ;
/* set flag */
eflag = ON ;
}
}
タイマー0の初期化は、プリスケーラの分周比を1/2とし
TMR0に246を設定します。
さらに、オーバーフロー割込みをイネーブルにします。
/* initialize Timer 0 */
{
/*
4MHz/4 = 1MHz -> 1MHz/2 = 500kHz prescaler = 1:2
*/
OPTION_REG = 0x00 ;
/* 256 - 10 = 246 */
TMR0 = CNTBEGIN ;
/* enable timer0 overflow interrupt */
INTCON.T0IE = ON ;
}
/* enable general interrupt */
INTCON.GIE = ON ;
割込みハンドラから、イベントフラグを受け取ったなら
フラグをクリアし、1か0を出力します。
if ( eflag == ON ) {
/* clear flag */
eflag = OFF ;
/* impress */
IDS = xcnt & ON ;
/* update */
xcnt++ ;
}
IDSは、次のようにマクロ定義しておきます。
#define IDS GPIO.B0
最終ソースコードは、以下。
/* redefine data type */
typedef unsigned char UBYTE ;
typedef unsigned int UWORD ;
#define OFF 0
#define ON OFF+1
#define CNTBEGIN 246
#define DEFX 588
#define IDS GPIO.B0
volatile UBYTE eflag ;
volatile UBYTE xcnt ;
/* function prototype */
void init_usr(void);
/* interrupt handler */
void interrupt(void)
{
/* generate trigger */
if ( INTCON.T0IF == ON ) {
/* clear flag */
INTCON.T0IF = OFF ;
/* initialize */
TMR0 = CNTBEGIN ;
/* set flag */
eflag = ON ;
}
}
void main(void)
{
/* user initialize */
init_usr();
/* endless loop */
while ( ON ) {
/* event flag handling */
if ( eflag == ON ) {
/* clear flag */
eflag = OFF ;
/* impress */
IDS = xcnt & ON ;
/* update */
xcnt++ ;
}
}
}
/* define function body */
void init_usr(void)
{
/* I/O state */
GPIO = 0x00 ;
/* I/O directions */
TRISIO = 0xfc ; /* bit 0,1 as output , others as input */
/* disable compare module */
CMCON = 0x07 ;
/* pull-up */
WPU = 0x3c ;
/* initialize Timer 0 */
{
/*
4MHz/4 = 1MHz -> 1MHz/2 = 500kHz prescaler = 1:2
*/
OPTION_REG = 0x00 ;
/* 256 - 10 = 246 */
TMR0 = CNTBEGIN ;
/* enable timer0 overflow interrupt */
INTCON.T0IE = ON ;
}
/* enable general interrupt */
INTCON.GIE = ON ;
/* clear flag */
eflag = OFF ;
/* clear */
xcnt = 0 ;
}
目次
前
次