| ??? 08/01/05 14:20 Read: times |
#98595 - My old solution: Responding to: ???'s previous message |
On my former assembler days I used this:
;************************************************************************/
;* */
;* Macro to waste a defined count of cycles */
;* */
;* Author: Peter Dannegger */
;* danni@specs.de */
;* */
;************************************************************************/
;macro parameters
;1.parameter: count of cycles (1 ... 65535)
;2.parameter: 1. used register: default R7
;3.parameter: 2. used register (on delay > 515): default R6
mdelay macro value, rx, ry ;cycle, used register(s)
local m____1
if( value < 5 )
rept value
nop
endm
elseif( value < 515 )
if nul &rx
mov r7, #low((value-1)/2)
djnz r7, $
else
mov rx, #low((value-1)/2)
djnz rx, $
endif
if((value and 1) = 0)
nop
endif
else
if nul &rx
mov r7, #high(value/2+253)
mov r6, #low(value/2-2)
m____1: djnz r6, m____1
djnz r7, m____1
else
mov rx, #high(value/2+253)
mov ry, #low(value/2-2)
m____1: djnz ry, m____1
djnz rx, m____1
endif
if(value and 1)
nop
endif
endif
endm
http://home.tiscali.de/peterd/ap...mdelay.mac There is no need for additional assembler instructions. Simple let the assembler calculate the right preload values for the counting registers. The limitation until 65535 cycle was given by the assembler. But this is no drawback, because for longer delays a timer should always be the better approach. Since the title is real, the cycles are always wasted and thus mostly another task exist, which can already be done during delays above 65535 cycle. Peter |



