beautypg.com

6 conditional returns, 8 handling interrupts, 6 conditional returns -13 – Maxim Integrated MAXQ Family User Manual

Page 38: 8 handling interrupts -13, Maxq family user’s guide

background image

3-13

When the supplied loop address is outside the relative jump range, the prefix register (PFX[0]) is used to supply the high byte of the

loop address as required.

move LC[1], #10h

; loop 16 times

LoopTop:

; loop addr not relative to djnz LC[n],src

call LoopSub

...

djnz LC[1], LoopTop

; decrement LC[1] and jump if nonzero

; assembles to: move PFX[0], #high(LoopTop)

;

djnz LC[1], #low(LoopTop)

If loop execution speed is critical and a relative jump cannot be used, one might consider preloading an internal 16-bit register with

the src loop address for the ‘DJNZ LC[n], src’ loop. This ensures that the prefix register will not be needed to supply the loop address

and always yields the fastest execution of the DJNZ instruction.

move LC[0], #LoopTop

; using LC[0] as address holding register

; assembles to: move PFX[0], #high(LoopTop)

;

move LC[0], #low(LoopTop)

move LC[1], #10h

; loop 16 times

...

LoopTop:

; loop address not relative to djnz LC[n],src

call LoopSub

...

djnz LC[1], LC[0]

; decrement LC[1] and jump if nonzero

If opting to preload the loop address to an internal 16-bit register, the most time and code efficient means is by performing the load in

the instruction just prior to the top of the loop:

move LC[1], #10h

; Set loop counter to 16

move LC[0], IP

; Set loop address to the next address

LoopTop:

; loop addr not relative to djnz LC[n],src

...

3.7.6 Conditional Returns

Similar to the conditional jumps, the MAXQ microcontroller also supports a set of conditional return operations. Based upon the value

of one of the status flags, the CPU can conditionally pop the stack and begin execution at the address popped from the stack. If the

condition is not true, the conditional return instruction does not pop the stack and does not change the instruction pointer. The follow-

ing conditional return operations are supported:

RET C

; if C=1, a RET is executed

RET NC

; if C=0, a RET is executed

RET Z

; if Z=1 (Acc=00h), a RET is executed

RET NZ

; if Z=0 (Acc<>00h), a RET is executed

RET S

; if S=1, a RET is executed

3.8 Handling Interrupts

Handling interrupts in the MAXQ is a three-part process. First, the location of the interrupt handling routine must be set by writing the

address to the 16-bit Interrupt Vector (IV) register. This register defaults to 0000h on reset, but this will usually not be the desired loca-

tion since this will often be the location of reset/power-up code.

move IV, IntHandler

; move PFX[0], #high(IntHandler)

; move IV, #low(IntHandler)

; PFX[0] write not needed if IntHandler addr=00xxh

Next, the interrupt must be enabled. For any interrupts to be handled, the IGE bit in the Interrupt and Control register (IC) must first be

set to 1. Next, the interrupt itself must be enabled at the module level and locally within the module itself. The module interrupt enable

is located in the Interrupt Mask register, while the location of the local interrupt enable will vary depending on the module in which the

interrupt source is located.

MAXQ Family User’s Guide

Maxim Integrated