Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
01/04/08 12:56
Read: times


 
Msg Score: +2
 +1 Informative
 +1 Good Answer/Helpful
#149032 - A related trick
Responding to: ???'s previous message
Following is a cute trick for doing software delays with really fine resolution. Of course interrupts have to be disabled, etc., etc., etc.

Please note that this sort of thing is a good idea only in certain special circumstances. In general, it's much, MUCH better to implement delays based on interrupts from a timer or the PCA or whatever.

-- Russ
;------------------------------------------------------------------------------
;                                 fdelay.s03
;------------------------------------------------------------------------------
; DESCRIPTION:  This module contains a little function to that gives a variable
;               delay with the same resolution as the SYSCLK period (on a
;               single-clocker, that is).  It's called with the number of
;               periods to delay in R7.  It works by jumping into the middle of
;               a big string of NOPs at a position that varies with the input
;               parameter.  There's a RET following the NOPs that returns to
;               the caller.
;
; REVISIONS     13 Sep 06 - RAC - Genesis, after a hint picked up on the
;                                  Silicon Labs user forum.
;------------------------------------------------------------------------------

                RSEG    RCODE

                PUBLIC  do_fine_delay
do_fine_delay:
                MOV     A,R7            ; Get input parameter
                CPL     A               ; Take two's compliment
                INC     A
                MOV     DPTR,#NOPS      ; Point DPTR at the NOP table
                JMP     @A+DPTR         ; Jump into table

;-----  256 NOPs (op code 0) coded in a semi-concise manner

NOPS:
                DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

                RET

                END



List of 27 messages in thread
TopicAuthorDate
Number of CPU cycle for 8051 function call            01/01/70 00:00      
   Do it in assembler            01/01/70 00:00      
   Delay functions            01/01/70 00:00      
   A related trick            01/01/70 00:00      
      Offset            01/01/70 00:00      
         Offset            01/01/70 00:00      
            Sure            01/01/70 00:00      
               Over Drive?            01/01/70 00:00      
      a refinement            01/01/70 00:00      
      NOPs are so bad waste of space...            01/01/70 00:00      
         waste of space... waste of time            01/01/70 00:00      
            fixed delay            01/01/70 00:00      
               Variable delay            01/01/70 00:00      
                  determinism of the cache            01/01/70 00:00      
               there are no cache misses in 'linear code'            01/01/70 00:00      
                  I got only ONE cache miss...            01/01/70 00:00      
      Old Keil Thread            01/01/70 00:00      
   What about a Delay like this.            01/01/70 00:00      
      No, it won't.            01/01/70 00:00      
         Ok.            01/01/70 00:00      
         also            01/01/70 00:00      
      Also ...            01/01/70 00:00      
         Actually...            01/01/70 00:00      
            will.            01/01/70 00:00      
               ANSI C            01/01/70 00:00      
                  Keil option: Disable ANSI casts            01/01/70 00:00      
         typo.            01/01/70 00:00      

Back to Subject List