はじめまして!RL78/G23初心者のNitarouです。元々は78K0/KD2とPM+でアセンブラで作成したプログラムをRL78で使える前提で取り組みましたがCS+(CC-RL)はかなり手ごわいです。インターバルタイマ割込みでbreak設定しても止まりません。エミュレータはE2-Liteです。下記プログラムを添付しますので、解決策をご教示お願い致します。
;;***************************************;* RAM MEMORY MAP 0FBF00H-0FFEDFH;***************************************;.data .DSEG DATA;RREG0: .DS 4RREG1: .DS 2RREG2: .DS 2ZAD1: .DS 2ZADM1: .DS 2ZAD2: .DS 2ZADM2: .DS 2ZADD: .DS 2GAD1: .DS 2GADM1: .DS 2GAD2: .DS 2GADM2: .DS 2GASADD: .DS 2GASDT: .DS 2GDDSP: .DS 2BBCNVD: .DS 2REGA: .DS 2REGB: .DS 6AVCTZ: .DS 2AVCNTZ: .DS 2AVCTG: .DS 2AVCNTG: .DS 2;MNF: .DS 1DPF: .DS 1DG4D: .DS 1DG3D: .DS 1DG2D: .DS 1DG1D: .DS 1DATP6: .DS 1;;;**************************************;* INITIAL SET;**************************************;.SECTION .sdata, SDATA.L_section_sdata:;.SECTION .text, TEXT;START .VECTOR 0x00000;INTTM00 .VECTOR 0x00020 ;タイマ割り込み;OPT .CSEG OPT_BYTE .DB 0x00 .DB 0xFC ;LVD0 2.67V .DB 0xEC ;高速メインモード2MHz .DB 0x85 ;オンチップデバッグ許可; .CSEG;START: DI SEL RB0 MOV CMC,#0x00 ;低消費発振; MOV OSTS,#0x04 ;発振安定時間1.6~3.2ms MOV CSC,#0xC0 ;高速オンチップオシレータ動作 MOV CKC,#0x00 ;高速オンチップオシレータ選択 MOV HOCODIV,#0x04 ;オンチップオシレータ周波数2MHz MOV PER0,#0x21 ;PER0(F00F0H)ADCEN,TAU0EN"1" MOVW AX,#0x0000 MOVW !TPS0,AX ;TPS0(F01B6H,F01B7H) MOVW AX,#0x0A0F MOVW !TT0,AX ;カウント動作停止 SET1 TMMK00 ;TAU0割込み禁止 CLR1 TMIF00 ;割込み要求フラグクリア SET1 TMPR100 ;INTTM00の割込み優先順位レベル3 SET1 TMPR000 MOVW AX,#0x0000 MOVW !TMR00,AX ;TMR00(F0190H,F0191H) MOVW AX,#0x0005 MOVW !TMR01,AX ;TMR01 MOVW AX,#0x0003 ;タイマカウント開始 MOVW !TS0,AX ;TS0(F01B2H,F01B3H) MOV TIS1,#0x03 MOV TOE0,#0x03 ;ch.01出力許可OST_CK: NOPSTART0: NOPSTART1: CLR1 SELLOSC MOVW TDR00,#1000 ;周期(0.25秒) CLR1 TMIF00 CLR1 TMMK00 MOV PMCA2,#0xC0 ;P26,P27アナログ入力設定;;**********************************************;* PORT SET;**********************************************; MOV PM0,#0xFF ;P0.0-7 入力 MOV PU0,#0x0F ;PU0(F0030H) P0.0-3 PU抵抗付加 MOV PM1,#0x0F ;P1.0-3 入力 ;P1.4-7 出力 MOV PU1,#0x0F ;PU1(F0031H) P1.0-3 PU抵抗付加 MOV PM2,#0xC0 ;P2.6-7 入力 ;P2.0-5 出力 MOV PM3,#0xFF ;P3.0入力 MOV PU3,#0x01 ;PU3(F0033H) P3.0 PU抵抗付加 MOV PM4,#0xFF ;P4.0-1 入力 MOV PU4,#0x03 ;PU4(F0034H) P4.0-1 PU抵抗付加 MOV PM5,#0xFC ;P5.0-1 出力 MOV PM6,#0xFF ;P6.0-3 入力 MOV PM7,#0xF0 ;P7.0-3 出力 ;P7.4-7 入力 MOV PU7,#0xF0 ;PU7(F0037H) P7.4-7 PU抵抗付加 MOV PM12,#0xFF MOV PU12,#0x01 ;PU12(F003CH) MOV PM14,#0xFF MOV PU14,#0x01 ;PU14(F003EH); MOV ADM0,#0x00 MOV ADM1,#0x00 MOV ADM2,#0x00 CLR1 ADMK CLR1 PIF4 CLR1 PMK4 CLR1 EGP0.4 SET1 EGN0.4;;*********************************************;* MAIN PROGRAM;*********************************************; EIMAIN1: NOP NOP NOP NOP NOP BR $MAIN1;;*********************************************;* タイマ割込;*********************************************;INTTM00: SEL RB1 CALL !ZDTI CALL !GDTI CALL !CALGAS CALL !GASDSP NOP RETI;;;*********************************************; Zero Data Average;*********************************************;ZDTI: CALL !AVZCTCL MOVW HL,!ZAD1 MOVW BC,#8 CALL !CLRMEM MOV A,#30ZDTS: SUB A,#1 MOV !AVCTZ,A CALL !ZDTI0 MOVW AX,!ZAD2 XCHW AX,BC MOVW AX,!ZADM2 CALL !SADD16 MOVW !ZADM2,AX MOVW HL,!AVCTZ MOV A,[HL] CMP A,#0 BNZ $ZDTS MOVW AX,!ZADM2 MOV C,#30 CALL !SDIV16 MOVW !ZADD,AX RET;ZDTI0: CALL !AVCTCLZ MOVW HL,!ZAD1 MOVW BC,#6 CALL !CLRMEM MOV A,#30ZDTS0: SUB A,#1 MOV !AVCNTZ,A CALL !ADZERO MOVW AX,!ZAD1 XCHW AX,BC MOVW AX,!ZADM1 CALL !SADD16 MOVW !ZADM1,AX MOVW HL,!AVCNTZ MOV A,[HL] CMP A,#0 BNZ $ZDTS0 MOVW AX,!ZADM1 MOV C,#30 CALL !SDIV16 MOVW !ZAD2,AX RET;GDTI: CALL !AVGCTCL MOVW HL,!GAD1 MOVW BC,#16 CALL !CLRMEM MOV A,#30GDTS: SUB A,#1 MOV !AVCTG,A CALL !GDTI0 MOVW AX,!GAD2 XCHW AX,BC MOVW AX,!GADM2 CALL !SADD16 MOVW !GADM2,AX MOVW HL,!AVCTG MOV A,[HL] CMP A,#0 BNZ $GDTS MOVW AX,!GADM2 MOV C,#30 CALL !SDIV16 MOVW !GASADD,AX RET;GDTI0: CALL !AVCTCLG MOVW HL,!GAD1 MOVW BC,#16 CALL !CLRMEM MOV A,#30GDTS0: SUB A,#1 MOV !AVCNTG,A CALL !ADGAS MOVW AX,!GAD1 XCHW AX,BC MOVW AX,!GADM1 CALL !SADD16 MOVW !GADM1,AX MOVW HL,!AVCNTG MOV A,[HL] CMP A,#0 BNZ $GDTS0 MOVW AX,!GADM1 MOV C,#30 CALL !SDIV16 MOVW !GAD2,AX RET;;*********************************************;* A/D;*********************************************;ADZERO: MOV ADS,#7 SET1 ADIF SET1 ADCE CALL TIMER CLR1 ADIF SET1 ADCSADZ0: BTCLR ADIF,$ADZ1 BR $ADZ0ADZ1: MOVW AX,ADCR CLR1 ADCS CLR1 ADCE MOV C,#*** CALL !SDIV16 MOVW !RREG1,AX MOVW BC,AX MOVW AX,#234 MOVW !RREG2,AX MULHU MOVW !RREG0,AX MOVW AX,BC MOVW !RREG0+2,AX MOVW AX,!RREG0 MOV C,#100 CALL !SDIV16 MOVW !ZAD1,AX RET;ADGAS: MOV ADS,#6 SET1 ADIF SET1 ADCE CALL TIMER CLR1 ADIF SET1 ADCSADG0: BTCLR ADIF,$ADG1 BR $ADG0ADG1: MOVW AX,ADCR CLR1 ADCS CLR1 ADCE MOV C,#*** CALL !SDIV16 MOVW !GAD1,AX RET;TIMER: MOV D,#0xFFJ40: MOV E,#0xFFJ41: DEC E BNZ $J41 DEC D BNZ $J40 RET;;********************************************;* CALC GAS;********************************************;CALGAS: MOV A,P6 AND A,#0x0F MOV !DATP6,ACP15: CMP !DATP6,#15 ;1111 FS=1000 BNZ $CP14 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#60 CALL !SDIV16 MOVW !GDDSP,AX RET;CP14: CMP !DATP6,#14 ;1110 FS=300 BNZ $CP13 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#200 CALL !SDIV16 MOVW !GDDSP,AX RET;
CP13: CMP !DATP6,#13 ;1101 FS=200 BNZ $CP12 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#30 CALL !SDIV16 MOV C,#10 CALL !SDIV16 MOVW !GDDSP,AX RET;CP12: CMP !DATP6,#12 ;1100 FS=150 BNZ $CP11 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#40 CALL !SDIV16 MOV C,#10 CALL !SDIV16 MOVW !GDDSP,AX RET;CP11: CMP !DATP6,#11 ;1011 FS=100 BNZ $CP10 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#60 CALL !SDIV16 MOV C,#10 CALL !SDIV16 MOVW !GDDSP,AX RET;CP10: CMP !DATP6,#10 ;1010 FS=50 BNZ $CP9 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#12 CALL !SDIV16 MOV C,#100 CALL !SDIV16 MOVW !GDDSP,AX RET;CP9: CMP !DATP6,#9 ;1001 FS=30 BNZ $CP8 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#20 CALL !SDIV16 MOV C,#100 CALL !SDIV16 MOVW !GDDSP,AX RET;CP8: CMP !DATP6,#8 ;1000 FS=20 BNZ $CP7 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#30 CALL !SDIV16 MOV C,#100 CALL !SDIV16 MOVW !GDDSP,AX RET;CP7: CMP !DATP6,#7 ;0111 FS=30.0 BNZ $CP6 SET1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#20 CALL !SDIV16 MOV C,#10 CALL !SDIV16 MOVW !GDDSP,AX RET;CP6: CMP !DATP6,#6 ;0110 FS=25.0 BNZ $CP5 SET1 !DPF.0 CALL !CALC_OX MOVW AX,!RREG0 MOV C,#241 CALL !SDIV16 MOVW !GDDSP,AX RET;CP5: CMP !DATP6,#5 ;0101 FS=20.0 BNZ $CP4 SET1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#30 CALL !SDIV16 MOV C,#10 CALL !SDIV16 MOVW !GDDSP,AX RET;CP4: CMP !DATP6,#4 ;0100 FS=10.0 BNZ $CP3 SET1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#30 CALL !SDIV16 MOV C,#20 CALL !SDIV16 MOVW !GDDSP,AX RET;CP3: CMP !DATP6,#3 ;0011 FS=5.0 BNZ $CP2 SET1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#12 CALL !SDIV16 MOV C,#100 CALL !SDIV16 MOVW !GDDSP,AX RET;CP2: CMP !DATP6,#2 ;0010 FS=2.0 BNZ $CP1 SET1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#30 CALL !SDIV16 MOV C,#100 CALL !SDIV16 MOVW !GDDSP,AX RET;CP1: CMP !DATP6,#1 ;0001 FS=1.0 BNZ $CP0 SET1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#60 CALL !SDIV16 MOV C,#100 CALL !SDIV16 MOVW !GDDSP,AX RET;CP0: SET1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#60 CALL !SDIV16 MOV C,#100 CALL !SDIV16 MOVW !GDDSP,AX RET;CALC: MOVW AX,!GASADD MOVW DE,AX MOVW HL,!ZADD CALL !ZCP2B BC $MNDP_S CLR1 !MNF.1 BR $CALC_0MNDP_S: SET1 !MNF.1 MOVW AX,!GASADD XCHW AX,BC MOVW AX,!ZADD CALL !SSUB16 MOVW !GASDT,AX BR $CALC_1CALC_0: MOVW AX,!ZADD XCHW AX,BC MOVW AX,!GASADD CALL !SSUB16 MOVW !GASDT,AXCALC_1: MOVW AX,#5 MOVW DE,AX MOVW HL,!GASDT CALL !ZCP2B BC $NORM_DP MOVW AX,#0 MOVW !GASDT,AXNORM_DP: MOVW AX,!GASDT MOVW !RREG1,AX MOVW AX,#128 MOVW !RREG2,AX MOVW BC,AX MOVW AX,!RREG1 MULHU MOVW !RREG0+2,AX MOVW AX,BC MOVW !RREG0,AX RET;CALC_OX: MOVW AX,!GASADD MOVW DE,AX MOVW HL,!ZADD CALL !ZCP2B BC $MNDP_OX_S CLR1 !MNF.1 BR $CALC_OX_0MNDP_OX_S: SET1 !MNF.1 MOVW AX,!GASADD XCHW AX,BC MOVW AX,!ZADD CALL !SSUB16 MOVW !GASDT,AX BR $CALC_OX_1CALC_OX_0: MOVW AX,!ZADD XCHW AX,BC MOVW AX,!GASADD CALL !SSUB16 MOVW !GASDT,AXCALC_OX_1: MOVW AX,!GASDT MOVW !RREG1,AX MOVW AX,#128 MOVW !RREG2,AX MOVW BC,AX MOVW AX,!RREG1 MULHU MOVW !RREG0,AX MOVW AX,BC MOVW !RREG0+2,AX RET;;********************************************; Data Clear;********************************************;AVZCTCL: MOVW HL,!AVCTZ MOVW BC,#1 CALL !CLRMEM RET;AVCTCLZ: MOVW HL,!AVCNTZ MOVW BC,#1 CALL !CLRMEM RET;AVGCTCL: MOVW HL,!AVCTG MOVW BC,#1 CALL !CLRMEM RET;AVCTCLG: MOVW HL,!AVCNTG MOVW BC,#1 CALL !CLRMEM RET;CLRMEM: NOP NOPCLRM: MOV A,#0 MOV [HL],A INCW HL DECW BC MOV A,B OR A,C BNZ $CLRM RET;;********************************************;* GAS DISPLAY;********************************************;GASDSP: NOP MOV A,!DPF BT A.0,$DPDP BR $GASDP0DPDP: SET1 P1.4 BR $GASDP1GASDP0: CLR1 P1.4;GASDP1: MOV A,!MNF BT A.1,$MNDP BR $NMDPMNDP: SET1 P1.5 BR $NMDP0;NMDP: CLR1 P1.5NMDP0: MOVW AX,!GDDSP CMPW AX,#999 BH $THDDP_0 MOVW AX,!GDDSP CMPW AX,#99 BH $HRDDP_0 MOVW AX,!GDDSP CMPW AX,#9 BH $TENDP_0 BR $SGLDP_0THDDP_0: MOVW AX,!GDDSP MOVW !REGA,AX CALL !B_DCONV MOV A,!REGB+0 MOV !DG4D,A MOV A,!REGB+1 MOV !DG3D,A MOV A,!REGB+2 MOV !DG2D,A MOV A,!REGB+3 MOV !DG1D,A BR $LCDDRV_1HRDDP_0: MOVW AX,!GDDSP MOVW !REGA,AX CALL !B_DCONV MOV A,!REGB MOV !DG4D,A MOV A,!REGB+1 MOV !DG3D,A MOV A,!REGB+2 MOV !DG2D,A MOV !DG1D,#0x0F BR $LCDDRV_1TENDP_0: MOVW AX,!GDDSP MOVW !REGA,AX CALL !B_DCONV MOV A,!REGB MOV !DG4D,A MOV A,!REGB+1 MOV !DG3D,A MOV !DG2D,#0x0F MOV !DG1D,#0x0F BR $LCDDRV_1SGLDP_0: MOV A,!DPF BT A.0,$MODZZ BR $MODZLCDDRV_1: BR $LCDDRVMODZ: CLR1 P1.4 MOVW AX,!GDDSP MOVW !REGA,AX CALL !B_DCONV MOV A,!REGB MOV !DG4D,A MOV !DG3D,#0x0F MOV !DG2D,#0x0F MOV !DG1D,#0x0F BR $LCDDRVMODZZ: SET1 P1.4 MOVW AX,!GDDSP MOVW !REGA,AX CALL !B_DCONV MOV A,!REGB MOV !DG4D,A MOV !DG3D,#0x00 MOV !DG2D,#0x0F MOV !DG1D,#0x0F BR $LCDDRV;LCDDRV: MOV A,!DG1D MOV P7,A SET1 P5.1 SET1 P5.0 CLR1 P1.6 SET1 P1.7 NOP CLR1 P1.7 MOV A,!DG2D MOV P7,A CLR1 P5.1 SET1 P5.0 CLR1 P1.6 SET1 P1.7 NOP CLR1 P1.7 MOV A,!DG3D MOV P7,A SET1 P5.1 CLR1 P5.0 CLR1 P1.6 SET1 P1.7 NOP CLR1 P1.7 MOV A,!DG4D MOV P7,A CLR1 P5.1 CLR1 P5.0 CLR1 P1.6 SET1 P1.7 NOP CLR1 P1.7 RET;SADD16: XCH A,X ADD A,C XCH A,X ADDC A,B RET;SSUB16: XCH A,X SUB A,C XCH A,X SUBC A,B RET;ZCP2B: PUSH DE CALL !ZSB2B_1 BC $ZCP2B1 MOV A,D OR A,E BZ $ZCP2B1 MOV B,A XOR A,B INC AZCP2B1: POP DE RET;ZSB2B_1: MOV A,E SUB A,[HL] MOV E,A INCW HL MOV A,D SUBC A,[HL] MOV D,A DECW HL RET;SMULT16: MOV A,#0 MOV !RREG0,A MOV !(RREG0+1),A MOV B,#16JMLT120: CLR1 CY MOV A,!RREG0 ROLC A,1 MOV !RREG0,A MOV A,!(RREG0+1) ROLC A,1 MOV !(RREG0+1),A MOV A,!RREG1 ROLC A,1 MOV !RREG1,A MOV A,!(RREG1+1) ROLC A,1 MOV !(RREG1+1),A BNC $JMLT220 MOV A,!RREG2 ADD A,!RREG0 MOV !RREG0,A MOV A,!(RREG2+1) ADDC A,!(RREG0+1) MOV !(RREG0+1),A MOV A,#0 ADDC A,!RREG1 MOV !RREG1,AJMLT220: DEC B BNZ $JMLT120 RET;SDIV16: MOVW DE,AX MOV X,#0 MOV B,#16JDIV160: MOV A,X ADD X,A MOV A,E ADDC E,A MOV A,D ADDC D,A MOV A,#0 ADDC A,X SUB A,C MOV X,A MOV A,E BT A.0,$JDIV180 BC $JDIV170 OR A,#0x01 MOV E,A BR $JDIV180JDIV170: MOV A,C ADD X,AJDIV180: DEC B BNZ $JDIV160 MOV A,X MOV C,A MOVW AX,DE RET;B_DCONV: MOVW AX,!REGA MOV B,#4 MOV C,#0 MOVW HL,!REGB NOPB_D1: MOVW DE,#10 DIVHU NOP XCHW AX,DE MOV [HL+C],A INC C XCHW AX,DE DEC B BNZ $B_D1 MOV A,X MOV [HL+C],A RET
チョコです。
具体的なデバイスは何でしょうか?
以下の2つの命令はSFRが2ndSFR領域なので、単純にこの記述ではエラーになります。
他にも、同じ種類のエラーになる記述がありそうです。
また、以下の初期設定の部分は気になります。TDR00に値が設定されていないのにタイマが起動されています。
その後にも、以下のような設定で0.25秒とありますが、2MHzを1001カウントしても周期は1ミリ秒にしかならないのでは。
他にも気になるところはありますが、全部を読む気にはなりません。
プロジェクト・ファイルがあれば、ビルドして、もっとチェックできるとおもわれますが。
以上
78K0/KD2は、8ビットMCUでRL78/G23は16ビットMCUです。16+ビット化に伴い内蔵周辺機能が追加されています。その結果SFRが256バイト(メモリの最後)に収まらなくなって、2ndSFRにも配置されるようになりました。78K0では、SFRはそのまま名前だけで指定できますが、RL78では2ndSFRの場合には、名前の頭に"!"を付ける必要があります。
また、メモリ空間が64kを超えるためにCALL命令のオペランドにも"!addr1"のように、名前の頭に"!"を付ける必要があります。
書かれていたプログラムに、このような修正を行い、ビルドは通るようになりました。
そこで、デバッガとしてシミュレータを使って、確認してみました。
そのときの状態が以下の画面イメージです。
また、メモリの0x20番地の16ビットを見ると0189となっているので、そのアドレスを確認すると、以下のようになっていましたので、ここにブレーク・ポイントを設定してみました。
何も考えずに、ブレーク・ポイントを有効にして実行してみました。
その結果が下に示す画面イメージです。
きちんと、INTTM00でブレークがかかっています。
ここで、右下の部分を拡大したものを下に示します。
x00189番地でブレークして、実行時間が528.000μ秒かかっていることが分かります
初期化等の時間がかかっていいることもあり、500μよりは長くなっています。
この状態で、そのまま実行させると、暴走しているようで戻ってきません。
実行を停止してみると下のようにプログラムの」ないところでした。
プログラムの細かなところをチェックする気はないのですが、本来なら、プログラムの最初で設定するSPの設定がソース上に見当たりません。また、起動時のCPUの制御レジスタを見るとありえない値になっています。これは、シミュレータが勝手に決めた値、実際のSPの値は不定となります。
この書き込みを参考にして、デバッグを進めてください。
G23_ASM_TEST.zip
Nitarouさんのレスポンスがないので、こちらで勝手にプロジェクトを作成して、簡単な評価を行いました。プロジェクトのzipファイルを添付しておきます。
前回の書き込みで、スタックポインタ(SP)が設定されていないのでうまく動かないと指摘しましたが、そこの部分を修正しておきました。下に示すのが、スタック領域を32バイト確保したところです。
下に示すのは、SPの設定を行っているところです。
この状態で、ビルドして、シミュレータにダウンロードしてみました。
前回と同様にINTTM00でブレークしたのが下の画面イメージです。前回と同じく526.5μ秒かかっています。
このまま、実行を再開すると、下のような結果になりました。
時間が330m秒かかって、TM00のカウント値(TCR00)が103と明らかに異常です。
この理由は、TM00のインターバル時間よりも、INTTM00の処理時間の方が長いという割り込み処理ではやってはいけない処理になっていることが判断できます。
そこで、下のように、サブルーチンコールの処理時間をブレークポイントを設定することで測定してみます。
1回実行すると、下のようになりました。サブルーチンZDTIの処理でほぼ165m秒かかっていることが分かります。
同様に、GDTIの処理時間もほぼ165m秒かかっていることが分かります。
CALGASの実行で、523μ秒かかっています。
GASDSPの実行では、ほぼ106μ秒ksksっています。
ということで、周期がTM00ではなく、その処理時間で決まってしまっている状態です。周期を250m秒となるように、TPS0レジスタと、TDR00レジスタの設定値を見直すべきです。
これ以上は、プログラムの詳細にはいってしまうので、コメントしません。ここまでの、基本的な内容を見直してください。
チョコさん、ありがとうございます。
インターバルタイマの時間、等を見直しましてデバッグを行うとAD変換プログラムでbreakしません。
ADIFの確認ができないからと思われますが、解決方法をご教示ください。
Nitarou
添付ファイルの添付方法をご指導ください。
>ADIFの確認ができないからと思われますが、解決方法をご教示ください。
割り込みについての考え違いがあります。A/Dの初期設定は以下のようになっています。
問題は下の129行目にあります。これはA/D変換の割り込みのマスクを解除(=ベクタ割り込み許可)しています。これでは、A/D変換が完了してINTADが発生すると、INTADの割り込みが受付けられてINTADのベクタに分岐し、ADIFフラグはクリアされてしまいます。ここらの仕組みは78K0でも同じだったはずです。つまり、今回の使い方では、ADMKはクリアしてはいけません。必ずADMKはセット(マスクをセット=ベクタ割り込みは禁止)しておく必要があります。
しかも、割り込みベクタとしては、以下の2つしか定義していません。
実際にメモリを確認すると、以下のように他の割り込みベクタは定義されていません。
そのため、INTADが受付けされると0x0000番地に分岐して、そこの内容を命令としてフェッチして以降は暴走することが考えられます。
繰り返しになりますが、ADIFをポーリングする場合には、必ずADMKはセットしないといけません。
下に示す処理にはいくつか問題があります。272行目は無駄な処理です。
色んなところでサブルーチンTIMERを呼び出しています。このサブルーチンの先頭と最後にブレークポイントを設定して実行時間を測定してみました。
その結果は、以下のように163m秒と長すぎると思われます。
また、前回指摘したINTTM00の周期よりINTTM00割り込み処理時間が長いと、他の処理はできません。これは、INTADとINTTM00では、INTTM00の優先順位が高いので、INTADが発生してもINTTM00が優先され、その間に次のINTTM00が発生するので、INTADでの暴走はおこりませんが。
とにかくいくつかの問題が重なっているのが現状のステータスです。
>添付ファイルの添付方法をご指導ください。
マウスカーソル位置は投稿画面の一番上か一番下に動かしておいた方がいいでしょう。
下の画面イメージにあるように、投稿画面の下側のツール・バーの「Insert」をクリックしてプルアップメニューの「Image/Video/file」をクリックします。
すると、下に示すウィンドウが開くので、「Upload」をクリックすると、ファイルを指定するウィンドウが開きます。
そこで、以下のように指定します。
すると、以下の画面のように、指定したファイルが指定されます。ここで「OK」をクリックします。
チョコさん、大変お世話になっております。
タイマクロックをTPS0に0x0009を書き込んで時間を長くして、ADの変換時間はADM0の値をfclkに指定してみました。VECTORはINTADとして0x00034を指定しました。CLR1 ADMKは削除しました。
ADIFの検出がまだできませんので、お忙しいところ恐れ入りますが、ご指導ください。
fileの添付に挑戦しましたが上手く添付できませんでした。申し訳ありません。
;;***************************************;* RAM MEMORY MAP 0FBF00H-0FFEDFH;***************************************;.data .DSEG DATA; stack areaSTACK: .DS 48STACKEND:;RREG0: .DS 4RREG1: .DS 2RREG2: .DS 2ZAD1: .DS 2ZADM1: .DS 2ZAD2: .DS 2ZADM2: .DS 2ZADD: .DS 2GAD1: .DS 2GADM1: .DS 2GAD2: .DS 2GADM2: .DS 2GASADD: .DS 2GASDT: .DS 2GDDSP: .DS 2BBCNVD: .DS 2REGA: .DS 2REGB: .DS 6AVCTZ: .DS 2AVCNTZ: .DS 2AVCTG: .DS 2AVCNTG: .DS 2;MNF: .DS 1DPF: .DS 1DG4D: .DS 1DG3D: .DS 1DG2D: .DS 1DG1D: .DS 1DATP6: .DS 1;;;**************************************;* INITIAL SET;**************************************;.SECTION .sdata, SDATA.L_section_sdata:;.SECTION .text, TEXT;START .VECTOR 0x00000 ;start;INTTM00 .VECTOR 0x00020 ;タイマ割り込み;INTAD .VECTOR 0x00034 ;AD割込み;OPT .CSEG OPT_BYTE .DB 0x00 .DB 0xFC ;LVD0 2.67V .DB 0xEC ;高速メインモード2MHz .DB 0x85 ;オンチップデバッグ許可; .CSEG;START: MOVW SP, #LOWW STACKEND; DI SEL RB0 MOV CMC,#0x00 ;低消費発振; MOV OSTS,#0x04 ;発振安定時間1.6~3.2ms MOV CSC,#0xC0 ;高速オンチップオシレータ動作 MOV CKC,#0x00 ;高速オンチップオシレータ選択 MOV !HOCODIV,#0x04 ;オンチップオシレータ周波数2MHz MOV !PER0,#0x21 ;PER0(F00F0H)ADCEN,TAU0EN"1" MOVW AX,#0x0009 MOVW !TPS0,AX ;TPS0(F01B6H,F01B7H) MOVW AX,#0x0A0F MOVW !TT0,AX ;カウント動作停止 SET1 TMMK00 ;TAU0割込み禁止 CLR1 TMIF00 ;割込み要求フラグクリア SET1 TMPR100 ;INTTM00の割込み優先順位レベル3 SET1 TMPR000 MOVW AX,#0x0000 MOVW !TMR00,AX ;TMR00(F0190H,F0191H) MOVW AX,#0x0005 MOVW !TMR01,AX ;TMR01 MOVW AX,#0x0001 ;タイマカウント開始 MOVW !TS0,AX ;TS0(F01B2H,F01B3H) MOV !TIS1,#0x03 MOV !TOE0,#0x03 ;ch.01出力許可OST_CK: NOPSTART0: NOPSTART1: CLR1 SELLOSC MOVW TDR00,#1000 ;周期(0.25秒) CLR1 TMIF00 CLR1 TMMK00 MOV !PMCA2,#0xC0 ;P26,P27アナログ入力設定;;**********************************************;* PORT SET;**********************************************; MOV PM0,#0xFF ;P0.0-7 入力 MOV !PU0,#0x0F ;PU0(F0030H) P0.0-3 PU抵抗付加 MOV PM1,#0x0F ;P1.0-3 入力 ;P1.4-7 出力 MOV !PU1,#0x0F ;PU1(F0031H) P1.0-3 PU抵抗付加 MOV PM2,#0xC0 ;P2.6-7 入力 ;P2.0-5 出力 MOV PM3,#0xFF ;P3.0入力 MOV !PU3,#0x01 ;PU3(F0033H) P3.0 PU抵抗付加 MOV PM4,#0xFF ;P4.0-1 入力 MOV !PU4,#0x03 ;PU4(F0034H) P4.0-1 PU抵抗付加 MOV PM5,#0xFC ;P5.0-1 出力 MOV PM6,#0xFF ;P6.0-3 入力 MOV PM7,#0xF0 ;P7.0-3 出力 ;P7.4-7 入力 MOV !PU7,#0xF0 ;PU7(F0037H) P7.4-7 PU抵抗付加 MOV PM12,#0xFF MOV !PU12,#0x01 ;PU12(F003CH) MOV PM14,#0xFF MOV !PU14,#0x01 ;PU14(F003EH); MOV ADM0,#0x28 ;AD変換時間fclk MOV ADM1,#0x08 ;fclk (2MHz) MOV !ADM2,#0x00; CLR1 PIF4 CLR1 PMK4 CLR1 EGP0.4 SET1 EGN0.4;;*********************************************;* MAIN PROGRAM;*********************************************; EIMAIN1: NOP NOP NOP NOP NOP BR $MAIN1;;*********************************************;* タイマ割込;*********************************************;INTTM00: SEL RB1 CALL !ZDTI CALL !GDTI CALL !CALGAS CALL !GASDSP NOP RETI;INTAD: MOVW AX,ADCR RETI;;*********************************************; Zero Data Average;*********************************************;ZDTI: CALL !AVZCTCL MOVW HL,!ZAD1 MOVW BC,#8 CALL !CLRMEM MOV A,#30ZDTS: SUB A,#1 MOV !AVCTZ,A CALL !ZDTI0 MOVW AX,!ZAD2 XCHW AX,BC MOVW AX,!ZADM2 CALL !SADD16 MOVW !ZADM2,AX MOVW HL,!AVCTZ MOV A,[HL] CMP A,#0 BNZ $ZDTS MOVW AX,!ZADM2 MOV C,#30 CALL !SDIV16 MOVW !ZADD,AX RET;ZDTI0: CALL !AVCTCLZ MOVW HL,!ZAD1 MOVW BC,#6 CALL !CLRMEM MOV A,#30ZDTS0: SUB A,#1 MOV !AVCNTZ,A CALL !ADZERO MOVW AX,!ZAD1 XCHW AX,BC MOVW AX,!ZADM1 CALL !SADD16 MOVW !ZADM1,AX MOVW HL,!AVCNTZ MOV A,[HL] CMP A,#0 BNZ $ZDTS0 MOVW AX,!ZADM1 MOV C,#30 CALL !SDIV16 MOVW !ZAD2,AX RET;GDTI: CALL !AVGCTCL MOVW HL,!GAD1 MOVW BC,#16 CALL !CLRMEM MOV A,#30GDTS: SUB A,#1 MOV !AVCTG,A CALL !GDTI0 MOVW AX,!GAD2 XCHW AX,BC MOVW AX,!GADM2 CALL !SADD16 MOVW !GADM2,AX MOVW HL,!AVCTG MOV A,[HL] CMP A,#0 BNZ $GDTS MOVW AX,!GADM2 MOV C,#30 CALL !SDIV16 MOVW !GASADD,AX RET;GDTI0: CALL !AVCTCLG MOVW HL,!GAD1 MOVW BC,#16 CALL !CLRMEM MOV A,#30GDTS0: SUB A,#1 MOV !AVCNTG,A CALL !ADGAS MOVW AX,!GAD1 XCHW AX,BC MOVW AX,!GADM1 CALL !SADD16 MOVW !GADM1,AX MOVW HL,!AVCNTG MOV A,[HL] CMP A,#0 BNZ $GDTS0 MOVW AX,!GADM1 MOV C,#30 CALL !SDIV16 MOVW !GAD2,AX RET;;*********************************************;* A/D;*********************************************;ADZERO: MOV ADS,#7 SET1 ADCE CALL TIMER CLR1 ADIF SET1 ADCSADZ0: BTCLR ADIF,$ADZ1 BR $ADZ0ADZ1: MOVW AX,ADCR CLR1 ADCS CLR1 ADCE MOV C,#*** CALL !SDIV16 MOVW !RREG1,AX MOVW BC,AX MOVW AX,#234 MOVW !RREG2,AX MULHU MOVW !RREG0,AX MOVW AX,BC MOVW !RREG0+2,AX MOVW AX,!RREG0 MOV C,#100 CALL !SDIV16 MOVW !ZAD1,AX RET;ADGAS: MOV ADS,#6 SET1 ADCE CALL TIMER CLR1 ADIF SET1 ADCSADG0: BTCLR ADIF,$ADG1 BR $ADG0ADG1: MOVW AX,ADCR CLR1 ADCS CLR1 ADCE MOV C,#*** CALL !SDIV16 MOVW !GAD1,AX RET;TIMER: MOV D,#0x03J40: MOV E,#0x03J41: DEC E BNZ $J41 DEC D BNZ $J40 RET;;********************************************;* CALC GAS;********************************************;CALGAS: MOV A,P6 AND A,#0x0F MOV !DATP6,ACP15: CMP !DATP6,#15 ;1111 FS=1000 BNZ $CP14 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#60 CALL !SDIV16 MOVW !GDDSP,AX RET;CP14: CMP !DATP6,#14 ;1110 FS=300 BNZ $CP13 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#200 CALL !SDIV16 MOVW !GDDSP,AX RET;
CP13: CMP !DATP6,#13 ;1101 FS=200 BNZ $CP12 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#30 CALL !SDIV16 MOV C,#10 CALL !SDIV16 MOVW !GDDSP,AX RET;CP12: CMP !DATP6,#12 ;1100 FS=150 BNZ $CP11 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#40 CALL !SDIV16 MOV C,#10 CALL !SDIV16 MOVW !GDDSP,AX RET;CP11: CMP !DATP6,#11 ;1011 FS=100 BNZ $CP10 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#60 CALL !SDIV16 MOV C,#10 CALL !SDIV16 MOVW !GDDSP,AX RET;CP10: CMP !DATP6,#10 ;1010 FS=50 BNZ $CP9 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#12 CALL !SDIV16 MOV C,#100 CALL !SDIV16 MOVW !GDDSP,AX RET;CP9: CMP !DATP6,#9 ;1001 FS=30 BNZ $CP8 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#20 CALL !SDIV16 MOV C,#100 CALL !SDIV16 MOVW !GDDSP,AX RET;CP8: CMP !DATP6,#8 ;1000 FS=20 BNZ $CP7 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#30 CALL !SDIV16 MOV C,#100 CALL !SDIV16 MOVW !GDDSP,AX RET;CP7: CMP !DATP6,#7 ;0111 FS=30.0 BNZ $CP6 SET1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#20 CALL !SDIV16 MOV C,#10 CALL !SDIV16 MOVW !GDDSP,AX RET;CP6: CMP !DATP6,#6 ;0110 FS=25.0 BNZ $CP5 SET1 !DPF.0 CALL !CALC_OX MOVW AX,!RREG0 MOV C,#241 CALL !SDIV16 MOVW !GDDSP,AX RET;CP5: CMP !DATP6,#5 ;0101 FS=20.0 BNZ $CP4 SET1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#30 CALL !SDIV16 MOV C,#10 CALL !SDIV16 MOVW !GDDSP,AX RET;CP4: CMP !DATP6,#4 ;0100 FS=10.0 BNZ $CP3 SET1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#30 CALL !SDIV16 MOV C,#20 CALL !SDIV16 MOVW !GDDSP,AX RET;CP3: CMP !DATP6,#3 ;0011 FS=5.0 BNZ $CP2 SET1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#12 CALL !SDIV16 MOV C,#100 CALL !SDIV16 MOVW !GDDSP,AX RET;CP2: CMP !DATP6,#2 ;0010 FS=2.0 BNZ $CP1 SET1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#30 CALL !SDIV16 MOV C,#100 CALL !SDIV16 MOVW !GDDSP,AX RET;CP1: CMP !DATP6,#1 ;0001 FS=1.0 BNZ $CP0 SET1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#60 CALL !SDIV16 MOV C,#100 CALL !SDIV16 MOVW !GDDSP,AX RET;CP0: SET1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#60 CALL !SDIV16 MOV C,#100 CALL !SDIV16 MOVW !GDDSP,AX RET;CALC: MOVW AX,!GASADD MOVW DE,AX MOVW HL,!ZADD CALL !ZCP2B BC $MNDP_S CLR1 !MNF.1 BR $CALC_0MNDP_S: SET1 !MNF.1 MOVW AX,!GASADD XCHW AX,BC MOVW AX,!ZADD CALL !SSUB16 MOVW !GASDT,AX BR $CALC_1CALC_0: MOVW AX,!ZADD XCHW AX,BC MOVW AX,!GASADD CALL !SSUB16 MOVW !GASDT,AXCALC_1: MOVW AX,#5 MOVW DE,AX MOVW HL,!GASDT CALL !ZCP2B BC $NORM_DP MOVW AX,#0 MOVW !GASDT,AXNORM_DP: MOVW AX,!GASDT MOVW !RREG1,AX MOVW AX,#128 MOVW !RREG2,AX MOVW BC,AX MOVW AX,!RREG1 MULHU MOVW !RREG0+2,AX MOVW AX,BC MOVW !RREG0,AX RET;CALC_OX: MOVW AX,!GASADD MOVW DE,AX MOVW HL,!ZADD CALL !ZCP2B BC $MNDP_OX_S CLR1 !MNF.1 BR $CALC_OX_0MNDP_OX_S: SET1 !MNF.1 MOVW AX,!GASADD XCHW AX,BC MOVW AX,!ZADD CALL !SSUB16 MOVW !GASDT,AX BR $CALC_OX_1CALC_OX_0: MOVW AX,!ZADD XCHW AX,BC MOVW AX,!GASADD CALL !SSUB16 MOVW !GASDT,AXCALC_OX_1: MOVW AX,!GASDT MOVW !RREG1,AX MOVW AX,#128 MOVW !RREG2,AX MOVW BC,AX MOVW AX,!RREG1 MULHU MOVW !RREG0,AX MOVW AX,BC MOVW !RREG0+2,AX RET;;********************************************; Data Clear;********************************************;AVZCTCL: MOVW HL,!AVCTZ MOVW BC,#1 CALL !CLRMEM RET;AVCTCLZ: MOVW HL,!AVCNTZ MOVW BC,#1 CALL !CLRMEM RET;AVGCTCL: MOVW HL,!AVCTG MOVW BC,#1 CALL !CLRMEM RET;AVCTCLG: MOVW HL,!AVCNTG MOVW BC,#1 CALL !CLRMEM RET;CLRMEM: NOP NOPCLRM: MOV A,#0 MOV [HL],A INCW HL DECW BC MOV A,B OR A,C BNZ $CLRM RET;;********************************************;* GAS DISPLAY;********************************************;GASDSP: NOP MOV A,!DPF BT A.0,$DPDP BR $GASDP0DPDP: SET1 P1.4 BR $GASDP1GASDP0: CLR1 P1.4;GASDP1: MOV A,!MNF BT A.1,$MNDP BR $NMDPMNDP: SET1 P1.5 BR $NMDP0;NMDP: CLR1 P1.5NMDP0: MOVW AX,!GDDSP CMPW AX,#999 BH $THDDP_0 MOVW AX,!GDDSP CMPW AX,#99 BH $HRDDP_0 MOVW AX,!GDDSP CMPW AX,#9 BH $TENDP_0 BR $SGLDP_0THDDP_0: MOVW AX,!GDDSP MOVW !REGA,AX CALL !B_DCONV MOV A,!REGB+0 MOV !DG4D,A MOV A,!REGB+1 MOV !DG3D,A MOV A,!REGB+2 MOV !DG2D,A MOV A,!REGB+3 MOV !DG1D,A BR $LCDDRV_1HRDDP_0: MOVW AX,!GDDSP MOVW !REGA,AX CALL !B_DCONV MOV A,!REGB MOV !DG4D,A MOV A,!REGB+1 MOV !DG3D,A MOV A,!REGB+2 MOV !DG2D,A MOV !DG1D,#0x0F BR $LCDDRV_1TENDP_0: MOVW AX,!GDDSP MOVW !REGA,AX CALL !B_DCONV MOV A,!REGB MOV !DG4D,A MOV A,!REGB+1 MOV !DG3D,A MOV !DG2D,#0x0F MOV !DG1D,#0x0F BR $LCDDRV_1SGLDP_0: MOV A,!DPF BT A.0,$MODZZ BR $MODZLCDDRV_1: BR $LCDDRVMODZ: CLR1 P1.4 MOVW AX,!GDDSP MOVW !REGA,AX CALL !B_DCONV MOV A,!REGB MOV !DG4D,A MOV !DG3D,#0x0F MOV !DG2D,#0x0F MOV !DG1D,#0x0F BR $LCDDRVMODZZ: SET1 P1.4 MOVW AX,!GDDSP MOVW !REGA,AX CALL !B_DCONV MOV A,!REGB MOV !DG4D,A MOV !DG3D,#0x00 MOV !DG2D,#0x0F MOV !DG1D,#0x0F BR $LCDDRV;LCDDRV: MOV A,!DG1D MOV P7,A SET1 P5.1 SET1 P5.0 CLR1 P1.6 SET1 P1.7 NOP CLR1 P1.7 MOV A,!DG2D MOV P7,A CLR1 P5.1 SET1 P5.0 CLR1 P1.6 SET1 P1.7 NOP CLR1 P1.7 MOV A,!DG3D MOV P7,A SET1 P5.1 CLR1 P5.0 CLR1 P1.6 SET1 P1.7 NOP CLR1 P1.7 MOV A,!DG4D MOV P7,A CLR1 P5.1 CLR1 P5.0 CLR1 P1.6 SET1 P1.7 NOP CLR1 P1.7 RET;SADD16: XCH A,X ADD A,C XCH A,X ADDC A,B RET;SSUB16: XCH A,X SUB A,C XCH A,X SUBC A,B RET;ZCP2B: PUSH DE CALL !ZSB2B_1 BC $ZCP2B1 MOV A,D OR A,E BZ $ZCP2B1 MOV B,A XOR A,B INC AZCP2B1: POP DE RET;ZSB2B_1: MOV A,E SUB A,[HL] MOV E,A INCW HL MOV A,D SUBC A,[HL] MOV D,A DECW HL RET;SMULT16: MOV A,#0 MOV !RREG0,A MOV !(RREG0+1),A MOV B,#16JMLT120: CLR1 CY MOV A,!RREG0 ROLC A,1 MOV !RREG0,A MOV A,!(RREG0+1) ROLC A,1 MOV !(RREG0+1),A MOV A,!RREG1 ROLC A,1 MOV !RREG1,A MOV A,!(RREG1+1) ROLC A,1 MOV !(RREG1+1),A BNC $JMLT220 MOV A,!RREG2 ADD A,!RREG0 MOV !RREG0,A MOV A,!(RREG2+1) ADDC A,!(RREG0+1) MOV !(RREG0+1),A MOV A,#0 ADDC A,!RREG1 MOV !RREG1,AJMLT220: DEC B BNZ $JMLT120 RET;SDIV16: MOVW DE,AX MOV X,#0 MOV B,#16JDIV160: MOV A,X ADD X,A MOV A,E ADDC E,A MOV A,D ADDC D,A MOV A,#0 ADDC A,X SUB A,C MOV X,A MOV A,E BT A.0,$JDIV180 BC $JDIV170 OR A,#0x01 MOV E,A BR $JDIV180JDIV170: MOV A,C ADD X,AJDIV180: DEC B BNZ $JDIV160 MOV A,X MOV C,A MOVW AX,DE RET;B_DCONV: MOVW AX,!REGA MOV B,#4 MOV C,#0 MOVW HL,!REGB NOPB_D1: MOVW DE,#10 DIVHU NOP XCHW AX,DE MOV [HL+C],A INC C XCHW AX,DE DEC B BNZ $B_D1 MOV A,X MOV [HL+C],A RET;
貼り付けられたプログラムは、そのままではビルドでエラーが出るので、そこは修正してビルドしてみました。
ADZERO:とADZ1:にブレークポイントを設定して実行したところ、ADZEROでブレークして、実行させると、きちんとADZ1でブレークしました。
その間の実行時間は73.5μ秒でした。
つまり、ADIFはきちんとセットはされていることになります。
どのように、確認したのでしょうか。もしかしたら、ADIFビットの値を目視で確認しているのではないでしょうか。
このプログラムでは、"BTCLR ADIF,$ADZ1”でADIFをチェックしているので、次の”BR $ADZ0”のところでADIFがセットされてないなら、ADIFがセットされていてもBTCLR ADIF,でクリアされてしまいます。
BTCLR ADIF,の動作をよく考えてください。
できれば、この命令ではなく、普通の条件付き分岐命令を使った方がデバッグはやり易いですよ。
チョコさん、BTCLR命令の件、BT命令に変更してみました。
まだ上手くbreakしません。INTADを.VECTORで定義したのが原因でしょうか?
ご指導ください。
;;***************************************;* RAM MEMORY MAP 0FBF00H-0FFEDFH;***************************************;.data .DSEG DATA; stack areaSTACK: .DS 48STACKEND:;RREG0: .DS 4RREG1: .DS 2RREG2: .DS 2ZAD1: .DS 2ZADM1: .DS 2ZAD2: .DS 2ZADM2: .DS 2ZADD: .DS 2GAD1: .DS 2GADM1: .DS 2GAD2: .DS 2GADM2: .DS 2GASADD: .DS 2GASDT: .DS 2GDDSP: .DS 2BBCNVD: .DS 2REGA: .DS 2REGB: .DS 6AVCTZ: .DS 2AVCNTZ: .DS 2AVCTG: .DS 2AVCNTG: .DS 2;MNF: .DS 1DPF: .DS 1DG4D: .DS 1DG3D: .DS 1DG2D: .DS 1DG1D: .DS 1DATP6: .DS 1;;;**************************************;* INITIAL SET;**************************************;.SECTION .sdata, SDATA.L_section_sdata:;.SECTION .text, TEXT;START .VECTOR 0x00000 ;start;INTTM00 .VECTOR 0x00020 ;タイマ割り込み;INTAD .VECTOR 0x00034 ;AD割込み;OPT .CSEG OPT_BYTE .DB 0x00 .DB 0xFC ;LVD0 2.67V .DB 0xEC ;高速メインモード2MHz .DB 0x85 ;オンチップデバッグ許可; .CSEG;START: MOVW SP, #LOWW STACKEND; DI SEL RB0 MOV CMC,#0x00 ;低消費発振; MOV OSTS,#0x04 ;発振安定時間1.6~3.2ms MOV CSC,#0xC0 ;高速オンチップオシレータ動作 MOV CKC,#0x00 ;高速オンチップオシレータ選択 MOV !HOCODIV,#0x04 ;オンチップオシレータ周波数2MHz MOV !PER0,#0x21 ;PER0(F00F0H)ADCEN,TAU0EN"1" MOVW AX,#0x0009 MOVW !TPS0,AX ;TPS0(F01B6H,F01B7H) MOVW AX,#0x0A0F MOVW !TT0,AX ;カウント動作停止 SET1 TMMK00 ;TAU0割込み禁止 CLR1 TMIF00 ;割込み要求フラグクリア SET1 TMPR100 ;INTTM00の割込み優先順位レベル3 SET1 TMPR000 MOVW AX,#0x0000 MOVW !TMR00,AX ;TMR00(F0190H,F0191H) MOVW AX,#0x0005 MOVW !TMR01,AX ;TMR01 MOVW AX,#0x0001 ;タイマカウント開始 MOVW !TS0,AX ;TS0(F01B2H,F01B3H) MOV !TIS1,#0x03 MOV !TOE0,#0x03 ;ch.01出力許可OST_CK: NOPSTART0: NOPSTART1: CLR1 SELLOSC MOVW TDR00,#1000 ;周期(0.25秒) CLR1 TMIF00 CLR1 TMMK00 MOV !PMCA2,#0xC0 ;P26,P27アナログ入力設定;;**********************************************;* PORT SET;**********************************************; MOV PM0,#0xFF ;P0.0-7 入力 MOV !PU0,#0x0F ;PU0(F0030H) P0.0-3 PU抵抗付加 MOV PM1,#0x0F ;P1.0-3 入力 ;P1.4-7 出力 MOV !PU1,#0x0F ;PU1(F0031H) P1.0-3 PU抵抗付加 MOV PM2,#0xC0 ;P2.6-7 入力 ;P2.0-5 出力 MOV PM3,#0xFF ;P3.0入力 MOV !PU3,#0x01 ;PU3(F0033H) P3.0 PU抵抗付加 MOV PM4,#0xFF ;P4.0-1 入力 MOV !PU4,#0x03 ;PU4(F0034H) P4.0-1 PU抵抗付加 MOV PM5,#0xFC ;P5.0-1 出力 MOV PM6,#0xFF ;P6.0-3 入力 MOV PM7,#0xF0 ;P7.0-3 出力 ;P7.4-7 入力 MOV !PU7,#0xF0 ;PU7(F0037H) P7.4-7 PU抵抗付加 MOV PM12,#0xFF MOV !PU12,#0x01 ;PU12(F003CH) MOV PM14,#0xFF MOV !PU14,#0x01 ;PU14(F003EH); MOV ADM0,#0x28 ;AD変換時間fclk MOV ADM1,#0x08 ;fclk (2MHz) MOV !ADM2,#0x00; CLR1 PIF4 CLR1 PMK4 CLR1 EGP0.4 SET1 EGN0.4;;*********************************************;* MAIN PROGRAM;*********************************************; EIMAIN1: NOP NOP NOP NOP NOP BR $MAIN1;;*********************************************;* タイマ割込;*********************************************;INTTM00: SEL RB1 CALL !ZDTI CALL !GDTI CALL !CALGAS CALL !GASDSP NOP RETI;INTAD: MOVW AX,ADCR RETI;;*********************************************; Zero Data Average;*********************************************;ZDTI: CALL !AVZCTCL MOVW HL,!ZAD1 MOVW BC,#8 CALL !CLRMEM MOV A,#30ZDTS: SUB A,#1 MOV !AVCTZ,A CALL !ZDTI0 MOVW AX,!ZAD2 XCHW AX,BC MOVW AX,!ZADM2 CALL !SADD16 MOVW !ZADM2,AX MOVW HL,!AVCTZ MOV A,[HL] CMP A,#0 BNZ $ZDTS MOVW AX,!ZADM2 MOV C,#30 CALL !SDIV16 MOVW !ZADD,AX RET;ZDTI0: CALL !AVCTCLZ MOVW HL,!ZAD1 MOVW BC,#6 CALL !CLRMEM MOV A,#30ZDTS0: SUB A,#1 MOV !AVCNTZ,A CALL !ADZERO MOVW AX,!ZAD1 XCHW AX,BC MOVW AX,!ZADM1 CALL !SADD16 MOVW !ZADM1,AX MOVW HL,!AVCNTZ MOV A,[HL] CMP A,#0 BNZ $ZDTS0 MOVW AX,!ZADM1 MOV C,#30 CALL !SDIV16 MOVW !ZAD2,AX RET;GDTI: CALL !AVGCTCL MOVW HL,!GAD1 MOVW BC,#16 CALL !CLRMEM MOV A,#30GDTS: SUB A,#1 MOV !AVCTG,A CALL !GDTI0 MOVW AX,!GAD2 XCHW AX,BC MOVW AX,!GADM2 CALL !SADD16 MOVW !GADM2,AX MOVW HL,!AVCTG MOV A,[HL] CMP A,#0 BNZ $GDTS MOVW AX,!GADM2 MOV C,#30 CALL !SDIV16 MOVW !GASADD,AX RET;GDTI0: CALL !AVCTCLG MOVW HL,!GAD1 MOVW BC,#16 CALL !CLRMEM MOV A,#30GDTS0: SUB A,#1 MOV !AVCNTG,A CALL !ADGAS MOVW AX,!GAD1 XCHW AX,BC MOVW AX,!GADM1 CALL !SADD16 MOVW !GADM1,AX MOVW HL,!AVCNTG MOV A,[HL] CMP A,#0 BNZ $GDTS0 MOVW AX,!GADM1 MOV C,#30 CALL !SDIV16 MOVW !GAD2,AX RET;;*********************************************;* A/D;*********************************************;ADZERO: MOV ADS,#7 SET1 ADCE CALL TIMER CLR1 ADIF SET1 ADCSADZ0: BT ADIF,$ADZ1 BR $ADZ0ADZ1: MOVW AX,ADCR CLR1 ADCS CLR1 ADCE MOV C,#*** CALL !SDIV16 MOVW !RREG1,AX MOVW BC,AX MOVW AX,#234 MOVW !RREG2,AX MULHU MOVW !RREG0,AX MOVW AX,BC MOVW !RREG0+2,AX MOVW AX,!RREG0 MOV C,#100 CALL !SDIV16 MOVW !ZAD1,AX RET;ADGAS: MOV ADS,#6 SET1 ADCE CALL TIMER CLR1 ADIF SET1 ADCSADG0: BTCLR ADIF,$ADG1 BR $ADG0ADG1: MOVW AX,ADCR CLR1 ADCS CLR1 ADCE MOV C,#*** CALL !SDIV16 MOVW !GAD1,AX RET;TIMER: MOV D,#0x03J40: MOV E,#0x03J41: DEC E BNZ $J41 DEC D BNZ $J40 RET;;********************************************
今回は一部分だけなので、ビルドが通りません。
そのため、プログラムだけを眺めて判断するしかありません。
少なくとも、今回提示された範囲では、ADMKは操作されてないので、初期状態(ADMKは1)だとすると、INTADの割り込みベクトルを設定していても影響しません。
ADZEROでは、BT命令に変更されており、ADIFはセットされたままになりますが、ADGASではまだBTCLR命令が使われています。ここらの影響がどうなっているかは分かりません。
「まだ上手くbreakしません。」が何をもってそう判断しているのかが分からないと、コメントしようがありません。どこにブレークポイントを設定しているかを明確にしてください。
情報がすくな過ぎます。
チョコさん、お忙しいところ申し訳ありません。
当方で確認したのは、ADZ0でbreakして、ADZ1にbreak設定してADZ0から実行してADZ1まで走らない状態で強制停止するとBT ADIF,$ADZ1のところでループしている状態でした。説明不足で申し訳ありません。宜しくお願い致します。
;;***************************************;* RAM MEMORY MAP 0FBF00H-0FFEDFH;***************************************;.data .DSEG DATA; stack areaSTACK: .DS 48STACKEND:;RREG0: .DS 4RREG1: .DS 2RREG2: .DS 2ZAD1: .DS 2ZADM1: .DS 2ZAD2: .DS 2ZADM2: .DS 2ZADD: .DS 2GAD1: .DS 2GADM1: .DS 2GAD2: .DS 2GADM2: .DS 2GASADD: .DS 2GASDT: .DS 2GDDSP: .DS 2BBCNVD: .DS 2REGA: .DS 2REGB: .DS 6AVCTZ: .DS 2AVCNTZ: .DS 2AVCTG: .DS 2AVCNTG: .DS 2;MNF: .DS 1DPF: .DS 1DG4D: .DS 1DG3D: .DS 1DG2D: .DS 1DG1D: .DS 1DATP6: .DS 1;;;**************************************;* INITIAL SET;**************************************;.SECTION .sdata, SDATA.L_section_sdata:;.SECTION .text, TEXT;START .VECTOR 0x00000 ;start;INTTM00 .VECTOR 0x00020 ;タイマ割り込み;INTAD .VECTOR 0x00034 ;AD割込み;OPT .CSEG OPT_BYTE .DB 0x00 .DB 0xFC ;LVD0 2.67V .DB 0xEC ;高速メインモード2MHz .DB 0x85 ;オンチップデバッグ許可; .CSEG;START: MOVW SP, #LOWW STACKEND; DI SEL RB0 MOV CMC,#0x00 ;低消費発振; MOV OSTS,#0x04 ;発振安定時間1.6~3.2ms MOV CSC,#0xC0 ;高速オンチップオシレータ動作 MOV CKC,#0x00 ;高速オンチップオシレータ選択 MOV !HOCODIV,#0x04 ;オンチップオシレータ周波数2MHz MOV !PER0,#0x21 ;PER0(F00F0H)ADCEN,TAU0EN"1" MOVW AX,#0x0009 MOVW !TPS0,AX ;TPS0(F01B6H,F01B7H) MOVW AX,#0x0A0F MOVW !TT0,AX ;カウント動作停止 SET1 TMMK00 ;TAU0割込み禁止 CLR1 TMIF00 ;割込み要求フラグクリア SET1 TMPR100 ;INTTM00の割込み優先順位レベル3 SET1 TMPR000 MOVW AX,#0x0000 MOVW !TMR00,AX ;TMR00(F0190H,F0191H) MOVW AX,#0x0005 MOVW !TMR01,AX ;TMR01 MOVW AX,#0x0001 ;タイマカウント開始 MOVW !TS0,AX ;TS0(F01B2H,F01B3H) MOV !TIS1,#0x03 MOV !TOE0,#0x03 ;ch.01出力許可OST_CK: NOPSTART0: NOPSTART1: CLR1 SELLOSC MOVW TDR00,#1000 ;周期(0.25秒) CLR1 TMIF00 CLR1 TMMK00 MOV !PMCA2,#0xC0 ;P26,P27アナログ入力設定;;**********************************************;* PORT SET;**********************************************; MOV PM0,#0xFF ;P0.0-7 入力 MOV !PU0,#0x0F ;PU0(F0030H) P0.0-3 PU抵抗付加 MOV PM1,#0x0F ;P1.0-3 入力 ;P1.4-7 出力 MOV !PU1,#0x0F ;PU1(F0031H) P1.0-3 PU抵抗付加 MOV PM2,#0xC0 ;P2.6-7 入力 ;P2.0-5 出力 MOV PM3,#0xFF ;P3.0入力 MOV !PU3,#0x01 ;PU3(F0033H) P3.0 PU抵抗付加 MOV PM4,#0xFF ;P4.0-1 入力 MOV !PU4,#0x03 ;PU4(F0034H) P4.0-1 PU抵抗付加 MOV PM5,#0xFC ;P5.0-1 出力 MOV PM6,#0xFF ;P6.0-3 入力 MOV PM7,#0xF0 ;P7.0-3 出力 ;P7.4-7 入力 MOV !PU7,#0xF0 ;PU7(F0037H) P7.4-7 PU抵抗付加 MOV PM12,#0xFF MOV !PU12,#0x01 ;PU12(F003CH) MOV PM14,#0xFF MOV !PU14,#0x01 ;PU14(F003EH); MOV ADM0,#0x28 ;AD変換時間fclk MOV ADM1,#0x08 ;fclk (2MHz) MOV !ADM2,#0x00; CLR1 PIF4 CLR1 PMK4 CLR1 EGP0.4 SET1 EGN0.4;;*********************************************;* MAIN PROGRAM;*********************************************; EIMAIN1: NOP NOP NOP NOP NOP BR $MAIN1;;*********************************************;* タイマ割込;*********************************************;INTTM00: SEL RB1 CALL !ZDTI CALL !GDTI CALL !CALGAS CALL !GASDSP NOP RETI;INTAD: MOVW AX,ADCR RETI;;*********************************************; Zero Data Average;*********************************************;ZDTI: CALL !AVZCTCL MOVW HL,!ZAD1 MOVW BC,#8 CALL !CLRMEM MOV A,#30ZDTS: SUB A,#1 MOV !AVCTZ,A CALL !ZDTI0 MOVW AX,!ZAD2 XCHW AX,BC MOVW AX,!ZADM2 CALL !SADD16 MOVW !ZADM2,AX MOVW HL,!AVCTZ MOV A,[HL] CMP A,#0 BNZ $ZDTS MOVW AX,!ZADM2 MOV C,#30 CALL !SDIV16 MOVW !ZADD,AX RET;ZDTI0: CALL !AVCTCLZ MOVW HL,!ZAD1 MOVW BC,#6 CALL !CLRMEM MOV A,#30ZDTS0: SUB A,#1 MOV !AVCNTZ,A CALL !ADZERO MOVW AX,!ZAD1 XCHW AX,BC MOVW AX,!ZADM1 CALL !SADD16 MOVW !ZADM1,AX MOVW HL,!AVCNTZ MOV A,[HL] CMP A,#0 BNZ $ZDTS0 MOVW AX,!ZADM1 MOV C,#30 CALL !SDIV16 MOVW !ZAD2,AX RET;GDTI: CALL !AVGCTCL MOVW HL,!GAD1 MOVW BC,#16 CALL !CLRMEM MOV A,#30GDTS: SUB A,#1 MOV !AVCTG,A CALL !GDTI0 MOVW AX,!GAD2 XCHW AX,BC MOVW AX,!GADM2 CALL !SADD16 MOVW !GADM2,AX MOVW HL,!AVCTG MOV A,[HL] CMP A,#0 BNZ $GDTS MOVW AX,!GADM2 MOV C,#30 CALL !SDIV16 MOVW !GASADD,AX RET;GDTI0: CALL !AVCTCLG MOVW HL,!GAD1 MOVW BC,#16 CALL !CLRMEM MOV A,#30GDTS0: SUB A,#1 MOV !AVCNTG,A CALL !ADGAS MOVW AX,!GAD1 XCHW AX,BC MOVW AX,!GADM1 CALL !SADD16 MOVW !GADM1,AX MOVW HL,!AVCNTG MOV A,[HL] CMP A,#0 BNZ $GDTS0 MOVW AX,!GADM1 MOV C,#30 CALL !SDIV16 MOVW !GAD2,AX RET;;*********************************************;* A/D;*********************************************;ADZERO: MOV ADS,#7 SET1 ADCE CALL TIMER CLR1 ADIF SET1 ADCSADZ0: BT ADIF,$ADZ1 BR $ADZ0ADZ1: MOVW AX,ADCR CLR1 ADCS CLR1 ADCE MOV C,#*** CALL !SDIV16 MOVW !RREG1,AX MOVW BC,AX MOVW AX,#234 MOVW !RREG2,AX MULHU MOVW !RREG0,AX MOVW AX,BC MOVW !RREG0+2,AX MOVW AX,!RREG0 MOV C,#100 CALL !SDIV16 MOVW !ZAD1,AX RET;ADGAS: MOV ADS,#6 SET1 ADCE CALL TIMER CLR1 ADIF SET1 ADCSADG0: BT ADIF,$ADG1 BR $ADG0ADG1: MOVW AX,ADCR CLR1 ADCS CLR1 ADCE MOV C,#*** CALL !SDIV16 MOVW !GAD1,AX RET;TIMER: MOV D,#0x03J40: MOV E,#0x03J41: DEC E BNZ $J41 DEC D BNZ $J40 RET;;********************************************;* CALC GAS;********************************************;CALGAS: MOV A,P6 AND A,#0x0F MOV !DATP6,ACP15: CMP !DATP6,#15 ;1111 FS=1000 BNZ $CP14 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#60 CALL !SDIV16 MOVW !GDDSP,AX RET;CP14: CMP !DATP6,#14 ;1110 FS=300 BNZ $CP13 CLR1 !DPF.0 CALL !CALC MOVW AX,!RREG0 MOV C,#200 CALL !SDIV16 MOVW !GDDSP,AX RET;
>ADZ0でbreakして、ADZ1にbreak設定してADZ0から実行してADZ1まで走らない状態で強制停止するとBT ADIF,$ADZ1のところでループしている状態でした。
シュミレータで確認してみました。下に示すのが、ADZ0でブレークした状態です。
ここで、そのままブレーク付きで実行すると、数回~十数回ADZ0でブレーク後にADZ1でブレークしました。当然その場合には、ADIFは1になっています。(その後にクリアする処理がなさそうなので、
また、ADZ0でブレーク後、ADZ0のブレーク・ポイントを解除した場合には、ADZ1でブレークしてADIFは1の状態でした。
E2liteでこのような動作にならなかったとすると、ハードウェアでは、ブレーク中にADIFが正常にセットされない可能性があったのかと考えられます。これは、実際のハードウェア環境がないと確認はできませんし、Renesasの関係部門の人でないと答えられないと思います。
ただし、ADZ0でのブレークをやめれば、この問題は回避することは可能で、ADZ1だけにブレーク・ポイントを設定しておけば、ADIFがセットされたかどうかの確認はできます。
なお、アセンブラ記述のほとんどコメントがないプログラムについては、対応が非常に困難です。
そのことをご理解ください。