R8C/1A Group, R8C/1B Group
20. Usage Notes
Rev.1.30
Dec 08, 2006
Page 299 of 315
REJ09B0252-0130
20.2.6
Changing Interrupt Control Register Contents
(a) The contents of an interrupt control register can only be changed while no interrupt requests
corresponding to that register are generated. If interrupt requests may be generated, disable interrupts
before changing the interrupt control register contents.
(b) When changing the contents of an interrupt control register after disabling interrupts, be careful to
choose appropriate instructions.
Changing any bit other than IR bit
If an interrupt request corresponding to a register is generated while executing the instruction, the IR bit
may not be set to 1 (interrupt requested), and the interrupt request may be ignored. If this causes a
problem, use the following instructions to change the register: AND, OR, BCLR, BSET
Changing IR bit
If the IR bit is set to 0 (interrupt not requested), it may not be set to 0 depending on the instruction used.
Therefore, use the MOV instruction to set the IR bit to 0.
(c) When disabling interrupts using the I flag, set the I flag as shown in the sample programs below. Refer
to (b) regarding changing the contents of interrupt control registers by the sample programs.
Sample programs 1 to 3 are for preventing the I flag from being set to 1 (interrupts enabled) before the interrupt
control register is changed for reasons of the internal bus or the instruction queue buffer.
Example 1: Use NOP instructions to prevent I flag from being set to 1 before interrupt control register
is changed
INT_SWITCH1:
FCLR I
;
Disable
interrupts
AND.B
#00H,0056H
; Set TXIC register to 00h
NOP
;
NOP
FSET I
;
Enable
interrupts
Example 2: Use dummy read to delay FSET instruction
INT_SWITCH2:
FCLR I
;
Disable
interrupts
AND.B
#00H,0056H
; Set TXIC register to 00h
MOV.W MEM,R0
;
Dummy
read
FSET I
;
Enable
interrupts
Example 3: Use POPC instruction to change I flag
INT_SWITCH3:
PUSHC FLG
FCLR I
;
Disable
interrupts
AND.B
#00H,0056H
; Set TXIC register to 00h
POPC FLG
;
Enable
interrupts