PICの動作はいかにして開始されるか。
PICの動作開始は、どの様になっているのか。
1.PICが適正な回路で使用され、電源が投入される。
2.電源電圧が決まった値を超えると、リセット信号が出て、PICは動作停止状態になる。
3.その後、決まった時間待機してから、クロック信号をカウント開始。
4.クロックが正常に1024カウント出来たら、0x00から、プログラムを開始。
のようになります。
PICのプログラムメモリーは下のようになっています。
PICは0x00から動作を始めますが、上のように、割込み発生時には0x04から処理が開始されるようになっています。
何もしないと、命令は0x00から0x01へ、そして。0x02と順番に実行されるので、0x04から始まる割込み処理も次々と実行してしまいます。
そこで、それを回避するために、0x00にGOTO 0x08(0x04を回避すればよいので0x08でなくとも良い)を書き、ジャンプして避けています。
また、割込み発生時には、0x04から処理が開始されるので、そのままだと、メインルーチンの処理に入ってしまうので、ここでも、GOTO INTERRUPTとしてジャンプし、割込みルーチンに処理が行くようにプログラムします。
例; 下のプログラムは、時計用プログラムの一部です。
;******************************** ;以降はコメント文
; Jumping Vector
;********************************
ORG 0 ;ORG 0 は、次の命令は0x00に置くという命令です、したがって、0x00に、GOTO INIT が置かれます。
GOTO INIT
ORG 4 ;ORG 4 は、次の命令を0x04に置くという命令です、したがって、0x04に、GOTO INTRPT が置かれます。
GOTO INTRPT
ORG 08H ;ORG 08Hは、次の命令を0x08に置くという命令です、したがって、0x08に、INIT が置かれますので、0x08のラベルはINITです。
(すぐ下からコメント文が始まりますが、コメント文は無視されるので、INITになる。)
ここで、ORG 08H 命令が必要なのは、メインルーチンがどのアドレスから始まるか指定するためです、
これが決まると、これを基準に他のラベルや命令のアドレスは計算できるのです。
;************************************
; Initialize routine
; PORT A & B Initialize
; PORTA
; RA3,4 :AC SWITCH control output
; RA0,1,2:LCD control output
; PORTB
; lower:SWITCH input
; upper:LCD data output
;
; Timer initilize
;
;************************************
INIT ;ここから、メインルーチン
;**** CMCON mode set *****
MOVLW 07H ;degital mode
MOVWF CMCON ;CMCON set
;**** PORT mode set *****
BCF INTCON,GIE ;Interrupt Disable
BSF STATUS,RP0 ;Set page 1
中略
;*************************************************
; Timer interrupt routine
; This interrupt occur every 3.125KHz
; So count this interrupt until 3125 times,
; then second count +1.
;*************************************************
INTRPT ;ここから、割込みルーチン
;**** save each register *******
MOVWF WR_SV ;save wreg
SWAPF STATUS,W ;save status
MOVWF STA_SV
;**** last pulse check ****
BCF INTCON,T0IF ;int flag reset
以下省略。
のように、プログラムを作ります。