AVR Assembler Source Blog

Ремонт частотных преобразователей AVR Assembler Source Blog: Copy_Flash_to_RAM_AVR102_appnote

Sunday, October 6, 2013

Copy_Flash_to_RAM_AVR102_appnote

ремонт частотного преобразователя
                              ;**** A P P L I C A T I O N   N O T E   A V R 1 0 2 ************************
                              ;*
                              ;* Title:  Block Copy Routines
                              ;* Version:  1.1
                              ;* Last updated: 97.07.04
                              ;* Target:  AT90Sxx1x (Devices with SRAM)
                              ;*
                              ;* Support E-mail: avr@atmel.com
                              ;* 

                              ;* DESCRIPTION

                              ;* This Application Note shows how to copy a block of data from Program
                              ;* memory to SRAM and from one SRAM area to another
                              ;*

                              ;***************************************************************************


.include "8515def.inc"

 rjmp RESET                   ;reset handle

                              ;***************************************************************************
                              ;*
                              ;* "flash2ram"
                              ;*
                              ;* This subroutine copies a block of data from the Program memory (Flash) 
                              ;* to the internal SRAM. The following parameters must be set up prior to 
                              ;* calling the subroutine:
                              ;* Z-pointer:  Flash block start address x 2 (WORD oriented code segment)
                              ;* Y-pointer: ram block start address
                              ;* romsize: block size
                              ;*
                              ;* Number of words :5 + return
                              ;* Number of cycles :10 x block size + return
                              ;* Low Registers used :1 (r0)
                              ;* High Registers used :1 (flashsize)
                              ;* Pointers used :Y, Z
                              ;*
                              ;***************************************************************************

                              ;***** Subroutine Register variables

.def flashsize=r16            ;size of block to be copied

                              ;***** Code    

flash2ram:
       lpm                    ;get constant
       st Y+,r0               ;store in SRAM and increment Y-pointer
       adiw ZL,1              ;increment Z-pointer
       dec flashsize
       brne flash2ram         ;if not end of table, loop more
       ret


                              ;***************************************************************************
                              ;*
                              ;* "ram2ram"
                              ;*
                              ;* This subroutine copies one block of data from one SRAM area to another.
                              ;* The following parameters must be set up prior to calling the subroutine:
                              ;*
                              ;* Z-pointer:  start of RAM area to copy from
                              ;* Y-pointer: start of RAM area to copy to
                              ;* ramsize  :   size of block to copy
                              ;*
                              ;* Number of words :4 + return
                              ;* Number of cycles :6 x block size + return
                              ;* Low Registers used :1 (ramtemp)
                              ;* High Registers used :1 (ramsize)
                              ;* Pointers used :Y, Z 
                              ;*
                              ;***************************************************************************

                              ;***** Subroutine Register variables

.def ramtemp=r1               ;temporary storage register
.def ramsize=r16              ;size of block to be copied

                              ;***** Code    

ram2ram:
       ld ramtemp,Z+          ;get data from BLOCK1
       st Y+,ramtemp          ;store data to BLOCK2
       dec ramsize   
       brne ram2ram           ;if not done, loop more
       ret

                              ;****************************************************************************
                              ;*
                              ;* Test Program
                              ;*
                              ;* This program copies 20 bytes of data from the Program memory to the SRAM
                              ;* area beginning at location BLOCK1. It then makes a second copy to the
                              ;* area beginning at location BLOCK2.
                              ;*
                              ;****************************************************************************

.equ BLOCK1=$60               ;start address of SRAM array #1
.equ BLOCK2=$80               ;start address of SRAM array #2

                              ;***** Main Program Register variables

.def temp=r16                 ;temporary storage variable

                              ;***** Code

RESET:
       ldi temp,low(RAMEND)
       out SPL,temp           ;init Stack Pointer  
       ldi temp,high(RAMEND)
       out SPH,temp

                              ;***** Copy 20 bytes ROM -> RAM

       ldi ZH,high(F_TABLE*2)
       ldi ZL,low(F_TABLE*2)  ;init Z-pointer
       ldi YH,high(BLOCK1)
       ldi YL,low(BLOCK1)     ;init Y-pointer
       ldi flashsize,20
       rcall flash2ram        ;copy 20 bytes

                              ;***** Copy 20 bytes RAM -> RAM

       ldi ZH,high(BLOCK1)
       ldi ZL,low(BLOCK1)     ;init Z-pointer
       ldi YH,high(BLOCK2)    ;(not necessary in this specific case)
       ldi YL,low(BLOCK2)     ;init Y-pointer
       ldi ramsize,20 
       rcall ram2ram          ;copy 20 bytes
   
forever:
       rjmp forever           ;eternal loop 

F_TABLE:
       .db 0,1                ;start of table (20 bytes)
       .db 2,3
       .db 4,5
       .db 6,7
       .db 8,9
       .db 10,11
       .db 12,13
       .db 14,15
       .db 16,17
       .db 18,19

No comments:

Post a Comment