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