PICを、アセンブリ言語のプログラムで使う。

PICで電子工作をするため、アセンブリ言語プログラムを使い始める。

当ブログをご覧いただき、ありがとうございます。
ご注意事項:
記載内容には、十分注意しておりますが、勘違い、記憶違い、理解不足、思い込み等が無いとは限りませんので、申し訳ありませんが、 記載内容の正確性は保障致しません(出来ません)。
従いまして、このブログの内容を参考にする事に起因して生じる、または 生じた、いかなる事態にも、当方は何の責任も取れませんので、 参考にされる場合は、自己責任にてお願い致します。
このブログのアセンブリ言語に関する説明には、PICで電子工作するのに必要な事柄以外(私のレベルで)は出てきません、ご了承願います。

PICの動作はいかにして開始されるか。

PICの動作開始は、どの様になっているのか。

 

1.PICが適正な回路で使用され、電源が投入される。

2.電源電圧が決まった値を超えると、リセット信号が出て、PICは動作停止状態になる。

3.その後、決まった時間待機してから、クロック信号をカウント開始。

4.クロックが正常に1024カウント出来たら、0x00から、プログラムを開始。

のようになります。

 

PICのプログラムメモリーは下のようになっています。

f:id:higonohimajin:20210401091458p:plain

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

 以下省略。

 

のように、プログラムを作ります。