目次

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 ;
}


目次

inserted by FC2 system