[戻る]
一括表示

タイマー0割り込みの設定 投稿者:河原 利昭 投稿日:2018/10/01(Mon) 16:10:51 No.1212

アセンブラで記述し16F18857,16F18313両方で試しましたがタイマー0割り込みの設定できません。ご教示方宜しくお願いします。
tes18313A.asmファイルをコピペしました。
MPLAB X IDE v4.15 のシミュレータの割り込みルーチンにブレークポイントを設定して確認しました。
尚、PICに書き込みしてNCOは NCO1INCL データを変更すると周波数が変化しているので動作していると思います。
********
; ファイル名 tes18313A.asm
; タイマー0割込み、アナログ処理 NCO テスト用
; RA0-DAC1OUT RA1-ANSA1 RA2-NCO1 RA3-IN RA4-LATA4 RA5-LATA5
LIST P=16F18313
INCLUDE P16F18313.INC

__CONFIG _CONFIG1, _RSTOSC_HFINT1 & _FEXTOSC_OFF
__CONFIG _CONFIG2, _MCLRE_OFF & _WDTE_OFF
__CONFIG _CONFIG3, _LVP_OFF

CNT50us EQU 20h ;*
CNT5ms EQU 21h ;*
CNT1ms EQU 22h ;*
timer EQU 23h ;*タイマー割り込み・ステージフラグ
T1ms EQU 00h ; TMR0割り込み1mSecフラグ
Steg00 EQU 24h ;*ステージカウンター00
St01 EQU 00h ;
St02 EQU 01h ;
St03 EQU 02h ;

swADA0 EQU 78h ;*sw抵抗ラダーRA0 A/D変換結果

;◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆
; -----------------------------------------------------
ORG 0h
GOTO init

; -----------------------------------------------------
; 割込み処理 <1msecタイマー割り込み>

ORG 4h ; 新16Fは復帰時のアドレス値がスタックに保存される
intr
CLRF PCLATH ; 割り込み処理内はページ‘0’の為クリアする

BSF PORTA,RA5 ;“ 1 ”にする(デバック用)

BTFSC PIR0,INTF ; RB0 変化割込み
GOTO MOintr

OUTMOin
BTFSS PIR0,TMR0IF ; タイマー0 割り込み
GOTO OUTintr

BCF PIR0,TMR0IF ; タイマー割り込みフラグクリア
BSF timer,T1ms

BCF PORTA,RA5 ;“ 0 ”にする(デバック用)

OUTintr ; 新16Fは復帰時自動的にレジスタ値が回復される
RETFIE ; 割込み許可リターン

MOintr
; BSF Poji,MOCin ;
BCF PIR0,INTF ;
GOTO OUTMOin

; -----------------------------------------------------
; 初期処理 <クロック&ポート設定 各種信号初期化>
init
; <TMR0割込みの設定>
BANKSEL T0CON0 ; ■ バンク T0CON0 に切替え
MOVLW B'10000000' ; TMR0 割り込み許可 ポストスケーラ 1:1
MOVWF T0CON0 ;
MOVLW B'01110100' ; HFINTOSC プリスケーラ 1:16
MOVWF T0CON1 ;

BANKSEL INTCON ; ■ バンク INTCON に切替え
MOVLW B'10000001' ; GIE RB0/INT 立ち上がりエッジ
MOVWF INTCON ; 割り込み許可

BANKSEL PIE0 ; ■ バンク PIE0 に切替え
MOVLW B'00100001' ; TMR0 RB0/INT 割り込み許可
MOVWF PIE0 ;
MOVLB 0 ; ■ バンク0に切替え

CLRF TMR0H ; TMR0をクリア
; BSF T0CON0,T0EN ; 念のため入れてみた 変化無かった
BSF Steg00,St01 ; ステージ1

; <クロック設定>
BANKSEL OSCFRQ ; ■ バンク OSCFRQ に切替え
MOVLW B'00000011' ; B'00000011' B'00000101'
MOVWF OSCFRQ ; CLOCK=8MHz CLOCK=16MHz

; <ポート設定>
MOVLB 0 ; ■ バンク0に切替え 
MOVLW B'00001010' ; 00001010
MOVWF TRISA ; RA1 はアナログ入力 RA3 はデジタル入力
MOVLW B'00101001' ; 00101001

; <A/D設定>
; BANKSEL ADCON0 ; ■ バンク ADCON0 に切替え
; MOVLW B'10000000' ; B'1000 0000'
; MOVWF ADCON0 ; A/D変換設定 左詰め ADCLK '000111'
; MOVLW B'00000111' ; B'0000 0001'
; MOVWF ADCLK ; Fosc/16
; MOVLW B'00000000' ; B'0000 000'
; MOVWF ADREF ; リファレンス電圧 マイナス側 VSS プラス側 VDD

BANKSEL ANSELA ; ■ バンク ANSELA に切替え
MOVLW B'00000010' ; B'0000 0010'
MOVWF ANSELA ; ANSA1をアナログ入力に設定
MOVLB 0 ; ■ バンク0に切替え

; <NCOの設定>
BANKSEL RA2PPS ; ■ バンク RC2PPS に切替え
MOVLW 0x1D ; NCO
MOVWF RA2PPS ; RC2をNCO出力に設定

BANKSEL NCO1CON ; ■ バンク NCO1CON に切替え
MOVLW B'10110000' ;
MOVWF NCO1CON ; NCOモジュール有効 FDC50%デューティ出力
CLRF NCO1CLK ; NCOクロック Fosc 選択
MOVLW B'00000111' ;
MOVWF NCO1INCL ; 初期値設定?
MOVLB 0 ; ■ バンク0に切替え
NOP
; -----------------------------------------------------
; メイン処理
main
BTFSS timer,T1ms ; タイマーフラグチェック
GOTO main ;

BCF timer,T1ms ; タイマーフラグクリア ★
BTFSC Steg00,St01 ; ステージ1?
GOTO Steg001

BTFSC Steg00,St02 ; ステージ2?
GOTO Steg02

BTFSC Steg00,St03 ; ステージ3?
GOTO Steg03

GOTO main

;◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆
;------------------ ステージ1 学習運転・D41+41G= 錠SW StRunOk 処理
Steg001

;------- A/D変換ポート指定
BANKSEL ADCON0 ; ■ バンク ADPCH に切替え
MOVLW B'00000101' ;
MOVWF ADCON0 ; ANA1 ADONを選択
MOVLB 0 ; ■ バンク0に切替え

; GOTO St01in

St01Out
BCF Steg00,St01 ;ステージ1をクリア
BSF Steg00,St02 ;ステージ2をセットしてMainへ
GOTO main ;



;◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆
;------------- ステージ2 AN0 A/D変換判定処理
Steg02

;--------- A/D変換指令
BANKSEL ADCON0 ; ■ バンク ADCON0 に切替え
BSF ADCON0,GO ; アナログポート ANA1 変換指令 
MOVLB 0 ; ■ バンク0に切替え

; GOTO St02in

St02Out
BCF Steg00,St02 ;ステージ2をクリア
BSF Steg00,St03 ;ステージ3をセットしてMainへ ※※
GOTO main

;◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆
;---------------------- ステージ3 AN1 A/D変換判定処理
Steg03

;--------- A/D変換ポート指定
BANKSEL ADRESH ; ■ バンク ADRESH に切替え
MOVF ADRESH,W ; AD変換結果
MOVWF swADA0 ; swADA0 に保存
MOVLB 0 ; ■ バンク0に切替え

; GOTO St03in

St03Out
BCF Steg00,St03 ;ステージ3をクリア
BSF Steg00,St01 ;ステージ1をセットしてMainへ
GOTO main ;

END

Re: タイマー0割り込みの設定 投稿者:koujikuu 投稿日:2018/10/02(Tue) 00:08:24 No.1213

割り込み処理で、コアレジスタ、共通RAM はバンク切り替えなしでアクセスできますが
他の特殊機能レジスタ、汎用RAM はバンク切り替えが必要です

Re^2: タイマー0割り込みの設定 投稿者:河原 利昭 投稿日:2018/10/02(Tue) 06:42:23 No.1214

> 割り込み処理で、コアレジスタ、共通RAM はバンク切り替えなしでアクセスできますが
> 他の特殊機能レジスタ、汎用RAM はバンク切り替えが必要です
ご教示ありがとうございます。
早速試してみましたが、変化がありません。
timer 70h
BANKSEL PIR0
を追加しました。
シュミレータで04番地にブレークポイントを設定していますが、
mainルーチンから抜けません。
16F886では同じような方法で動作しています。
コンフィグか初期設定の<タイマー割り込みに間違いが有りそうなのですが、一週間ほど悩んでいます。追加変更箇所コピペします。
宜しくご教示お願いします。
****************************
timer EQU 70h

; 割込み処理 <1msecタイマー割り込み>

ORG 4h ; 新16Fは復帰時のアドレス値がスタックに保存される
intr
CLRF PCLATH ; 割り込み処理内はページ‘0’の為クリアする

; BSF PORTA,RA5 ;“ 1 ”にする(デバック用)
BANKSEL PIR0 ; バンク PIR0
BTFSC PIR0,INTF ; RB0 変化割込み
GOTO MOintr

OUTMOin
BTFSS PIR0,TMR0IF ; タイマー0 割り込み
GOTO OUTintr

BCF PIR0,TMR0IF ; タイマー割り込みフラグクリア
BSF timer,T1ms

; BCF PORTA,RA5 ;“ 0 ”にする(デバック用)

OUTintr ; 新16Fは復帰時自動的にレジスタ値が回復される
RETFIE ; 割込み許可リターン

MOintr
; BSF Poji,MOCin ;
BCF PIR0,INTF ;
GOTO OUTMOin

Re^3: タイマー0割り込みの設定 投稿者:Gokan 投稿日:2018/10/02(Tue) 09:30:54 No.1215

PIC16F18313のタイマ0はPIC16F886とは全く異なる構成ですので
データシートをよく読む必要があります。


> > 割り込み処理で、コアレジスタ、共通RAM はバンク切り替えなしでアクセスできますが
> > 他の特殊機能レジスタ、汎用RAM はバンク切り替えが必要です
> ご教示ありがとうございます。
> 早速試してみましたが、変化がありません。
> timer 70h
> BANKSEL PIR0
> を追加しました。
> シュミレータで04番地にブレークポイントを設定していますが、
> mainルーチンから抜けません。
> 16F886では同じような方法で動作しています。
> コンフィグか初期設定の<タイマー割り込みに間違いが有りそうなのですが、一週間ほど悩んでいます。追加変更箇所コピペします。
> 宜しくご教示お願いします。
> ****************************
> timer EQU 70h
>
> ; 割込み処理 <1msecタイマー割り込み>
>
> ORG 4h ; 新16Fは復帰時のアドレス値がスタックに保存される
> intr
> CLRF PCLATH ; 割り込み処理内はページ‘0’の為クリアする
>
> ; BSF PORTA,RA5 ;“ 1 ”にする(デバック用)
> BANKSEL PIR0 ; バンク PIR0
> BTFSC PIR0,INTF ; RB0 変化割込み
> GOTO MOintr
>
> OUTMOin
> BTFSS PIR0,TMR0IF ; タイマー0 割り込み
> GOTO OUTintr
>
> BCF PIR0,TMR0IF ; タイマー割り込みフラグクリア
> BSF timer,T1ms
>
> ; BCF PORTA,RA5 ;“ 0 ”にする(デバック用)
>
> OUTintr ; 新16Fは復帰時自動的にレジスタ値が回復される
> RETFIE ; 割込み許可リターン
>
> MOintr
> ; BSF Poji,MOCin ;
> BCF PIR0,INTF ;
> GOTO OUTMOin

Re^4: タイマー0割り込みの設定 投稿者:koujikuu 投稿日:2018/10/03(Wed) 06:56:49 No.1217

PIC16F18313 と PIC16F18857 で同じプログラムは動きません 細部の違いを把握する必要があります
クロック設定も違います TB3148 参照

16F18313 , RA2 BLINK (TMR0 INT)

processor 16F18313
#include "P16F18313.INC"

__CONFIG _CONFIG1 , _FEXTOSC_OFF & _RSTOSC_HFINT32 & _CLKOUTEN_ON & _CSWEN_ON & _FCMEN_ON
__CONFIG _CONFIG2 , _MCLRE_ON & _PWRTE_OFF & _WDTE_OFF & _LPBOREN_OFF & _BOREN_ON & _BORV_LOW & _PPS1WAY_OFF & _STVREN_ON & _DEBUG_OFF
__CONFIG _CONFIG3 , _WRT_OFF & _LVP_OFF
__CONFIG _CONFIG4 , _CP_OFF & _CPD_OFF

ORG 0
GOTO MAIN

ORG 4
BANKSEL PIE0
BTFSS PIE0,TMR0IE
BRA INT_R
BANKSEL PIR0
BTFSS PIR0,TMR0IF
BRA INT_R
BCF PIR0,TMR0IF
BANKSEL LATA
MOVLW 0x04 ; RA2 BLINK
XORWF LATA,F
INT_R
RETFIE

MAIN
BANKSEL OSCCON1
MOVLW 0x02 ; 32MHz / 4 = 8MHz
IORWF OSCCON1,F

BANKSEL ANSELA ; RA2 OUTPUT
BCF ANSELA,ANSA2
BANKSEL TRISA
BCF TRISA,TRISA2

BANKSEL T0CON1
MOVLW 0x4C ; FOSC/4 , 1:4096
MOVWF T0CON1 ; 2MHz / 4096 / 256 = 1.9Hz
BSF T0CON0,T0EN ; TMR0 START
BANKSEL PIE0
BSF PIE0,TMR0IE ; Enables the TMR0 interrupt

BSF INTCON,GIE ; Enables all active interrupts

BRA $ ; STOP

END

Re^5: タイマー0割り込みの設定 投稿者:河原 利昭 投稿日:2018/10/03(Wed) 08:56:12 No.1218

ご教示ありがとうございます。

タイマー0動作しだしました、やっと動き出しました。

PIC16(L)F18857/77のマニュアル
c2016-2018 Microchip Technology Inc. DS40001825D-page 128
FIGURE 7-1: INTERRUPT LOGIC及び
大全の「図9-2-1 割り込み回路ブロック」ロジックも同じ
によりますと、PEIEは周辺割込みでタイマー0に影響を与えないロジックですが
INTCONのPEIE“ビット6”を“1”にしないとタイマー割り込みは動作しません。
このロジックは正しいのでしょうか。

タイマー0動作NG
BANKSEL INTCON ; ■ バンク INTCON に切替え
MOVLW B'10000001' ; GIE RB0/INT 立ち上がりエッジ
MOVWF INTCON ;

タイマー0動作OK
BANKSEL INTCON ; ■ バンク INTCON に切替え
MOVLW B'11000001' ; GIE PEIE RB0/INT 立ち上がりエッジ
MOVWF INTCON ;

ロジックは正しいことを前提にPEIE“ビット6”を“0”にして色々と試していました、
動き出したのでこのまま進めます。
周辺割込みはロジック回路のように阻止しておきたいのですが何か手がありましたら、
ご教示方よろしくお願いします。

**************************

> PIC16F18313 と PIC16F18857 で同じプログラムは動きません 細部の違いを把握する必要があります
> クロック設定も違います TB3148 参照
>
> 16F18313 , RA2 BLINK (TMR0 INT)
>
> processor 16F18313
> #include "P16F18313.INC"
>
> __CONFIG _CONFIG1 , _FEXTOSC_OFF & _RSTOSC_HFINT32 & _CLKOUTEN_ON & _CSWEN_ON & _FCMEN_ON
> __CONFIG _CONFIG2 , _MCLRE_ON & _PWRTE_OFF & _WDTE_OFF & _LPBOREN_OFF & _BOREN_ON & _BORV_LOW & _PPS1WAY_OFF & _STVREN_ON & _DEBUG_OFF
> __CONFIG _CONFIG3 , _WRT_OFF & _LVP_OFF
> __CONFIG _CONFIG4 , _CP_OFF & _CPD_OFF
>
> ORG 0
> GOTO MAIN
>
> ORG 4
> BANKSEL PIE0
> BTFSS PIE0,TMR0IE
> BRA INT_R
> BANKSEL PIR0
> BTFSS PIR0,TMR0IF
> BRA INT_R
> BCF PIR0,TMR0IF
> BANKSEL LATA
> MOVLW 0x04 ; RA2 BLINK
> XORWF LATA,F
> INT_R
> RETFIE
>
> MAIN
> BANKSEL OSCCON1
> MOVLW 0x02 ; 32MHz / 4 = 8MHz
> IORWF OSCCON1,F
>
> BANKSEL ANSELA ; RA2 OUTPUT
> BCF ANSELA,ANSA2
> BANKSEL TRISA
> BCF TRISA,TRISA2
>
> BANKSEL T0CON1
> MOVLW 0x4C ; FOSC/4 , 1:4096
> MOVWF T0CON1 ; 2MHz / 4096 / 256 = 1.9Hz
> BSF T0CON0,T0EN ; TMR0 START
> BANKSEL PIE0
> BSF PIE0,TMR0IE ; Enables the TMR0 interrupt
>
> BSF INTCON,GIE ; Enables all active interrupts
>
> BRA $ ; STOP
>
> END

Re^6: タイマー0割り込みの設定 投稿者:koujikuu 投稿日:2018/10/03(Wed) 21:26:20 No.1219

PEIE は関係ないです GIE , TMR0IE を有効に設定すれば TMR0オーバーフロー割り込みは発生します
TMR0 以外の割り込みを全て禁止して実行してみて下さい
また _CLKOUTEN_ON 設定で CLKOUT(RA6) に FOSC/4 が出力され PIC のクロック周波数の確認ができます

PIC16F18857 RA2 LED BLINK (TMR0 INT)

前回のプログラムの CONFIG のみ変更しました

processor 16F18857
#include "P16F18857.INC"

__CONFIG _CONFIG1 , _FEXTOSC_OFF & _RSTOSC_HFINT32 & _CLKOUTEN_ON & _CSWEN_ON & _FCMEN_ON
__CONFIG _CONFIG2 , _MCLRE_ON & _PWRTE_OFF & _LPBOREN_OFF & _BOREN_ON & _BORV_LO & _ZCD_OFF & _PPS1WAY_OFF & _STVREN_ON & _DEBUG_OFF
__CONFIG _CONFIG3 , _WDTCPS_WDTCPS_31 & _WDTE_OFF & _WDTCWS_WDTCWS_7 & _WDTCCS_SC
__CONFIG _CONFIG4 , _WRT_OFF & _SCANE_not_available & _LVP_OFF
__CONFIG _CONFIG5 , _CP_OFF & _CPD_OFF

ORG 0
GOTO MAIN

ORG 4
BANKSEL PIE0
BTFSS PIE0,TMR0IE
BRA INT_R
BANKSEL PIR0
BTFSS PIR0,TMR0IF
BRA INT_R
BCF PIR0,TMR0IF
BANKSEL LATA
MOVLW 0x04 ; RA2 BLINK
XORWF LATA,F

INT_R

RETFIE

MAIN

BANKSEL OSCCON1
MOVLW 0x02 ; HFINT32 , 32MHz / 4 = 8MHz (FOSC)
IORWF OSCCON1,F

BANKSEL ANSELA ; RA2 OUTPUT
BCF ANSELA,ANSA2
BANKSEL TRISA
BCF TRISA,TRISA2

BANKSEL T0CON1
MOVLW 0x4C ; FOSC/4 , 1:4096
MOVWF T0CON1 ; 2MHz / 4096 / 256 = 1.9Hz
BSF T0CON0,T0EN ; TMR0 START
BANKSEL PIE0
BSF PIE0,TMR0IE ; Enables the TMR0 interrupt

BSF INTCON,GIE ; Enables all active interrupts

BRA $ ; STOP

END

Re^7: タイマー0割り込みの設定 投稿者:河原 利昭 投稿日:2018/10/05(Fri) 05:42:57 No.1220

具体的なご指導ありがとうございます。
タイマー0割り込み最小約15μSecまで確認できました。
約1mSecで使用する予定です。
これからもよろしくお願いします。
ありがとうございました。

Re^8: タイマー0割り込みの設定 投稿者:koujikuu 投稿日:2018/10/05(Fri) 23:03:10 No.1222

> 具体的なご指導ありがとうございます。
> タイマー0割り込み最小約15μSecまで確認できました。
> 約1mSecで使用する予定です。
> これからもよろしくお願いします。
> ありがとうございました。

Re^9: 投稿ミスの為 再投稿 投稿者:koujikuu 投稿日:2018/10/05(Fri) 23:06:56 No.1223

1ms (1000Hz) の割り込みを得るには、TMR2/4/6 の方が適しています
2MHz / 8 / 250 = 1000Hz

TxCLKCON クロック指定 , FOSC/4 (2MHz)
プリスケーラ 1:8
PRx 周期レジスタ 250-1 設定

で、1ms 周期で割り込みが発生します

- WebForum -