PIC16F18346の基本動作から応用プログラムまでを学びます。

ホーム
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
    
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
pic-as アセンブラで割込み
2021-11-05

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 の特徴を確認します。

org の代わりに、psect を使用する

ここに掲載したプログラム例では、Isr_Vec という psect (program section) を作成します。

具体的には割込み処理プログラム開始を指定する org 4 の代わりに以下の記述をします。

pic-as linker を設定する

Isr_Vec という program section の開始番地を、0x4 にするよう、 pic-as linker を設定します。

pic-as Linker の Custom linker options 欄には。既に電源ON時の開始を設定するする -pPor_Vec=0h が記入されていると思います。そこに、-pIsr_Vec=4h を追加設定します。

MPLAB X の設定手順は以下の通りです。

  1. project propaty ボタンを押し、プロパティーウインドを開く
  2. pic-as Linker をクリック
  3. Custom linker options の右欄をクリックして入力ウインドを開く
  4. 入力欄をクリックしてから "-pIsr_Vec=4h" と入力
  5. 正しく入力がされていることを確認して [OK] をクリックする

 

プログラム例

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 アセンブラプログラムは、[こちら]