Microchip社は、今までの標準アセンブラソフトであった MPASM から、新たにXC8_AS または、PIO_AS と言われる XC8 Cコンパイラと親和性の高いアセンブラソフトへの切り替えを行いました。
変更からまだ一年程度しか経っていないため、pic-as に関する情報は少ないのですが、手に入るmicrochio社のmanualやインターネット上の記事から、pic-as の割込み処理の使い方をまとめました。
Mpic-asの割込み処理をプログラムするには、今までの MPLABでの org 命令の代わりに psect を使用明レ、その psect の配置開始番地が 0x4 になるよう pic-as linker を設定します。
Timer 1 からの割込みでLEDを点滅させるプログラムを、C言語、MPASM、pic-as の3種類の言語で作成しました。これらのソースリストを見比べながら、pic-as の特徴を確認します。
ここに掲載したプログラム例では、Isr_Vec という psect (program section) を作成します。
具体的には割込み処理プログラム開始を指定する org 4 の代わりに以下の記述をします。
Isr_Vec という program section の開始番地を、0x4 にするよう、 pic-as linker を設定します。
pic-as Linker の Custom linker options 欄には。既に電源ON時の開始を設定するする -pPor_Vec=0h が記入されていると思います。そこに、-pIsr_Vec=4h を追加設定します。
MPLAB X の設定手順は以下の通りです。
LEDを点滅させるプログラムを、C言語、MPASM、pic-as の3種類の言語で作成しました。
== xc8 C言語 ==
#include <xc.h>
#define _XTAL_FREQ 1000000 // delay_ms(x) のための定義
#define LED LATC5
#pragma config FEXTOSC = OFF, RSTOSC = HFINT1, CLKOUTEN = OFF
#pragma config CSWEN = ON , FCMEN = ON , MCLRE = ON
#pragma config PWRTE = OFF , WDTE = OFF , LPBOREN = OFF
#pragma config BOREN = OFF , BORV = LOW , PPS1WAY = OFF
#pragma config STVREN = ON , DEBUG = OFF , WRT = OFF
#pragma config LVP = ON , CP = OFF , CPD = OFF
void main(void) {
TRISC5 = 0; // RC5を出力に設定
T1CON = 0b00000001; // Fosc/4 Sync PreS 1/1
T1GCON = 0; // ゲート機能は使用せず
TMR1IF = 0; // タイマー1 割込みフラッグをクリア
TMR1IE = 1; // タイマー1 割込みを使用許可
PEIE = 1; // 周辺機能割込みの使用許可
GIE = 1; // 全割込みの使用許可
while(1); // 割込みを待つ
}
//----------------------割込み処理------------------------
void __interrupt() T1_isr(void) {
if(TMR1IF){ // Timer1からの割込みを確認
TMR1IF = 0; // 割込みフラッグをクリア
LED = !LED; // LEDを反転
}
}
== MPASM アセンブラ言語 ==
LIST P=PIC16F18346 ; 使用するPICを指定
INCLUDE "P16F18346.INC" ; 読み込む設定ファイルを指定
__CONFIG _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT1 & _CLKOUTEN_OFF & _CSWEN_OFF & _FCMEN_OFF
__CONFIG _CONFIG2, _MCLRE_ON & _PWRTE_OFF & _WDTE_OFF & _LPBOREN_OFF & _BOREN_OFF & _BORV_LOW & _PPS1WAY_OFF & _STVREN_ON & _DEBUG_OFF
__CONFIG _CONFIG3, _WRT_OFF & _LVP_ON
__CONFIG _CONFIG4, _CP_OFF & _CPD_OFF
; 電源ONリセット 開始番地 ----------------
ORG 0
GOTO Main
; 割り込み処理 開始番地 ---------------
ORG 0x4
MOVLB 0x0
BTFSS PIR1, TMR1IF ; Timer1からの割込みを確認
GOTO RetInt ; Timer1からでないなら戻る
BCF PIR1, TMR1IF ; 割込みフラッグをクリア
MOVLW 0x20 ; LED4(RC5)を反転 ------
MOVLB 0x2 ; LED(RC5)のビットをXOR
XORWF LATC, F ; LED ON/OFF 反転
RetInt: RETFIE
; メイン プログラム ------------------
Main: MOVLB 0x1
BCF TRISC, TRISC5 ; RC5を出力に設定
MOVLW 0x1 ; T1CON = 0b00000001;
MOVLB 0x0
MOVWF T1CON ; Fosc/4 Sync PreS 1/1
CLRF T1GCON ; ゲート機能は使用せず
BCF PIR1, TMR1IF ; 割込みフラッグをクリア
MOVLB 0x1
BSF PIE1, TMR1IE ; TMR1IE タイマー1 割込みを使用許可
BSF INTCON, PEIE ; PEIE 周辺機能割込みの使用許可
BSF INTCON, GIE ; GIE 全割込みの使用許可
Loop: GOTO Loop ; 割込みを待つ
END
== pic-as アセンブラ言語 ==
PROCESSOR 16F18346
#include <xc.inc>
config FEXTOSC = OFF, RSTOSC = HFINT1, CLKOUTEN = OFF
config CSWEN = ON , FCMEN = ON , MCLRE = ON
config PWRTE = OFF , WDTE = OFF , LPBOREN = OFF
config BOREN = OFF , BORV = LOW , PPS1WAY = OFF
config STVREN = ON , DEBUG = OFF , WRT = OFF
config LVP = ON , CP = OFF , CPD = OFF
; 電源ONリセット 開始番地 ----------------
PSECT Por_Vec,class=CODE,delta=2
Start:
GOTO Main
; 割り込み処理 開始番地 ---------------
PSECT Isr_Vec,class=CODE,delta=2
IsrVec:
BANKSEL PIR1
BTFSS TMR1IF ; Timer1からの割込みを確認
BRA RetInt ; Timer1からでないなら戻る
BCF TMR1IF ; 割込みフラッグをクリア
MOVLW 0x20 ; LED4(RC5)を反転 ------
BANKSEL LATC ; LED(RC5)のビットをXOR
XORWF BANKMASK(LATC), F ; LED ON/OFF 反転
RetInt:
RETFIE
; メイン プログラム ------------------
Main:
BANKSEL TRISC
BCF TRISC5 ; RC5を出力に設定
MOVLW 0x1 ; T1CON = 0b00000001;
BANKSEL T1CON
MOVWF BANKMASK(T1CON) ; Fosc/4 Sync PreS 1/1
CLRF BANKMASK(T1GCON) ; ゲート機能は使用せず
BCF TMR1IF ; 割込みフラッグをクリア
BANKSEL PIE1
BSF TMR1IE ; TMR1IE 割込みを使用許可
BSF PEIE ; PEIE 周辺機能割込みの使用許可
BSF GIE ; GIE 全割込みの使用許可
Loop: BRA Loop ; 割込みを待つ
END Start
pic-as アセンブラプログラムは、[こちら]