/********************************************************** 割り込みを用いて1秒ごとのLEDのON-OFFを行う **********************************************************/ /*****************************************************************         スタートアップ部 変更の必要は無い *****************************************************************/ #pragma asm STACKEND .EQU H'FFF10 .SECTION VEC, DATA, LOCATE=H'000000 .ORG H'000000 ;RESET VECTOR .DATA.L BEGIN .SECTION P,CODE,ALIGN=2 BEGIN: MOV.L #STACKEND,ER7 ;set stack pointer ;***** move Section D(ROM) to Section X(RAM) ***** MOV.L @_D_Head,ER0 ;source address to ER0 MOV.L @_X_Head,ER1 ;destination address to ER1 MOV.L @_D_Size,ER2 ;size to be copied to ER2 OR.L ER2,ER2 ;(ER2 or ER2) to ER2 JMP @LOOP_11 LOOP_1: MOV.B @ER0+,R3H ;source byte to E3H with ER0++ MOV.B R3H,@ER1 ;E3H to destination INC.L #1,ER1 ;increment destination address DEC.L #1,ER2 ;ER2-- LOOP_11: BNE LOOP_1 ;***** clear Section B ***** MOV.L @_B_Head,ER1 ;destination address to ER1 MOV.L @_B_Size,ER2 ;size to be copied to ER2 MOV.B #0,R3H ;0 to R3H OR.L ER2,ER2 ;(ER2 or ER2) to ER2 JMP @LOOP_21 LOOP_2: MOV.B R3H,@ER1 ;R3H to destination INC.L #1,ER1 ;increment destination address DEC.L #1,ER2 ;ER2-- LOOP_21: BNE LOOP_2 JSR @_main ; Call main() EternalLoop: BRA EternalLoop .SECTION D, DATA, ALIGN = 2 .SECTION X, DATA, ALIGN = 2 .SECTION B, DATA, ALIGN = 2 .SECTION C, DATA, ALIGN = 2 _D_Head: .DATA.L (STARTOF D) ; Section D Head Address _X_Head: .DATA.L (STARTOF X) ; Section X Head Address _D_Size: .DATA.L (SIZEOF D) ; Section D Size _B_Head: .DATA.L (STARTOF B) ; Section B Head Address _B_Size: .DATA.L (SIZEOF B) ; Section B Size .SECTION P,CODE,ALIGN=2 ;これを忘れてはいけない #pragma endasm /* メモ CPU割り込みマスククリアE_INT()と割り込みマスクセットD_INT()の表現 #pragma asm ANDC.B #B'01111111,CCR ;E_ENT() #pragma endasm #pragma asm ORC.B #B'10000000,CCR ;D_ENT() #pragma endasm */ /********************ここから通常のCプログラム********************/ #include <3048f.h> #include "h8_3048.h" #define clearTimer1Flag() (ITU1.TSR.BIT.IMFA=0) main() { P5.DDR=3; /* LED INITIALIZATION */ initTimer1Int(10000); /*時間割り込み10msec ch1使用*/ #pragma asm ANDC.B #B'01111111,CCR ;E_INT() #pragma endasm startTimer1(); /*時間割り込みタイマスタートch1*/ while(1); /*なにもしないループ*/ } int tick=0; int loop=0; /*割り込みベクタの設定は次の形式で書く .SECTION MYVEC, DATA, LOCATE=ここにベクタを書き込むアドレス .ORG ここにベクタを書き込むアドレス .DATA.L ここに割り込み関数のアドレス(通常は関数名) .SECTION P,CODE,ALIGN=2 ;これを忘れてはいけない 複数の場所に分けて複数の割り込みベクタを書く場合は「MYVEC」のところを 「MYVEC1」,「MYVEC2」,...とすればよい */ #pragma asm .SECTION MYVEC, DATA, LOCATE=H'000070 .ORG H'000070 ;IMIA1 .DATA.L _TimerIntFunc .SECTION P,CODE,ALIGN=2 ;これを忘れてはいけない #pragma endasm #pragma interrupt (TimerIntFunc) void TimerIntFunc() /*タイマ割り込みルーチン*/ { clearTimer1Flag(); /*タイマステータスフラグのクリア 忘れないこと*/ if (tick==1) { P5.DR.BYTE=1; } else { P5.DR.BYTE=2; } if (++loop==50) { tick=1-tick; loop=0; } }