; 629test.asm GP0 0.5秒ON、0.5秒OFFの繰り返しによる4MHz内部発振の確認 GP0とGND間にLED+Rをつなぐ
 
  list P=PIC12F629  
  include "P12F629.INC"  
  __CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
       
count1 equ 20h ;12f629では20hから64バイトがユーザーエリアとなっている
count2 equ 21h  
       
  org 0 ;今回は12C509A互換モードで使うので割り込みは使わない( org 4 は記述せず)
       
  bsf STATUS, RP0 ;12C509Aと異なりbank1に切り替えて次の設定を行う
  call 3ffh ;OSCCAL Valueの読み込み(12C509Aと異なり自動的に読みに行ってくれない)
  movwf OSCCAL ;読み込んだ校正値をOSCCALレジスタにセット(12C509Aと同じ記述)
  movlw b'00001000'  
  movwf TRISIO ;GP3を入力、GP0,GP1,GP2,GP4,GP5を出力に設定
  movlw b'00000000' ;bit7=0内部プルアップEnable。出力時にプルアップは無効となる
  movwf OPTION_REG  
  bcf STATUS, RP0 ;bank0に戻る
  clrf GPIO  
  movlw b'00000111' ;GP0,GP1,GP2をデジタルI/Oに
  movwf CMCON ;設定して12509と同様の設定にする
loop     ;ぴったり1秒のループになるようにwait500msで調整
  bsf GPIO, 0 ;GP0 ON
  call wait500ms ;ここでスタックを1段消費
  bcf GPIO, 0 ;GP0 OFF
  call wait500ms  
  goto loop  
       
wait     ;999usec
  movlw d'248'  
  movwf count1  
wlp nop    
  decfsz count1, f  
  goto wlp  
  goto $+1 ;ステップ数の調整 nop x 2 と同じ。 $+1とするとプログラムステップが半分で済む
  return   ;12C509Aでは使えなかったreturn命令が使える
       
wait500ms     ;499.998msec
  movlw d'249'  
  movwf count2  
wlp500 call wait ;ここでスタックを2段消費。12C509Aでは2段、12F629では8段まで使える
  goto $+1  
  goto $+1  
  call wait  
  goto $+1  
  nop    
  decfsz count2, f  
  goto wlp500  
  nop    
  return   ;12C509Aの時はretlw 0とした
       
  org 0x3ff ;プログラムエリアの最終番地に
  retlw 0x9c ;とりあえず手持ち個体のOSCCAL値をセットし、その値をWレジスタに入れて戻る
      ;この値はPICへの書き込み時にそれぞれの個体に合わせて変更できる
  end