150 likes | 318 Views
Storing data in Program Memory. Special-purpose Load and Store Instructions. Atmega32 Memory. Address bus (16-bit in Atmega32) A unique 16-bit address references each memory byte. Data bus (8-bit). Nonvolatile – ROM (fast R – slow W) ROM PROM EPROM EEPROM (permanent data store)
E N D
Storing data in Program Memory Special-purposeLoad and Store Instructions CS-280 Dr. Mark L. Hornick
Atmega32 Memory • Address bus (16-bit in Atmega32) • A unique 16-bit address references each memory byte. • Data bus (8-bit) • Nonvolatile – ROM (fast R – slow W) • ROM • PROM • EPROM • EEPROM (permanent data store) • Flash ROM (program store) • Volatile – RAM (fast RW) • SRAM (temp data store) • DRAM CS-280 Dr. Mark L. Hornick
SRAM is volatile memory • Power must be supplied to maintain values stored in SRAM • SRAM values disappear when power is shut off • SRAM is cleared when power is first applied CS-280 Dr. Mark L. Hornick
Review: Program vs. Data Memory Addressing 0x0000 0x0001 0x0002 0x0003 0x0004 Byte 0 Byte 1 • Program Memory is organized and accessed in words • A word is 2 bytes • Each word has a unique address • Data Memory is organized and accessed in bytes • Each byte has a unique address Byte 2 Byte 3 Byte 4 Byte 5 Byte 6 Byte 7 Byte 8 Byte 9 0x0060 0x0061 0x0062 0x0063 0x0064 Byte 0 Byte 1 Byte 2 Byte 3 Byte 4 CS-280 Dr. Mark L. Hornick
Review: Allocating SRAM Data memory .DSEG ; subsequent directives refer to data segment .ORG SRAM_START ; address where Data Memory starts (0x60) x1: .byte 1 ; reserve 1 byte of SRAM, assign label x1=0x60 x2: .byte 2 ; reserve 2 bytes of SRAM, assign label x2=0x61 x3: .byte 1 ; reserve 1 byte of SRAM, assign label x3=0x63 .CSEG ; switch further directives to code segment .ORG 0x2A ; set addr for start of program instructions LDS R20, x1 ; load value at data addr specified by x1 STS x2, R20 ; store value in R20 to data addr x2 • The addresses are assigned automatically by the Assembler • The .byte n directive tells the assembler to allocation n bytes • Be very careful about using .ORG for addresses < 0x60 CS-280 Dr. Mark L. Hornick
Review: The X, Y, and Z Registers The X, Y, and Z 16-bit registers overlap the last six 8-bit registers R26 through R31 CS-280 Dr. Mark L. Hornick
Review: Indirect Addressing • Accesses a 8-bit (byte) value from SRAM data memory at the address specified indirectly via the 16-bit X, Y, or Z index-registers • Example: • LD R20, X ; load value at data addr held in X to R20 • ST Y, R20 ; store value in R20 to data addr held in Y • Note X, Y, Z hold data address values that are 16-bits CS-280 Dr. Mark L. Hornick
Data values can be stored permanently by allocating them to non-volatile Program Memory .DSEG ; subsequent directives refer to data segment .ORG SRAM_START ; address where Data Memory starts (0x60) x1: .byte 5 ; reserve 5 bytes of (uninitialized) volatile SRAM .CSEG ; switch further directives to code segment .ORG 0x2A ; set addr for start of program instructions y1: .db 1,5 ; alloc 2 bytes in Prog Memory with initial values of 1 and 5 title: .db ‘c’,’s’,’2’,’8’,’0’,0 ; allocate 6 bytes in Program Memory course: .db “CS-280”, 0 ; allocate 7 bytes in Program Memory Note assembler does NOT automatically insert a NULL char at the end of the string • The .byte n directive tells the assembler to allocate n bytes in Data Memory • No initial value can be specified to SRAM data memory values • The .db n,m,… (“define byte”) directive tells the assembler to allocate and store the bytes n,m… in Program Memory • The initial values of the memory are specified • The assembler always starts data on a word boundary in memory CS-280 Dr. Mark L. Hornick
9 For example, character 'O' is 79 (row value 70 + col value 9 = 79). O 70 Review: ASCII Encoding CS-280 Dr. Mark L. Hornick
Accessing (reading) data from Program Memory There are three instructions to load (read) data from Program Memory to a register LPM • loads from byte address in Z register to R0, where Z and R0 are implied arguments LPM Rn, Z • loads from byte address in Z to Rn (R0-R31); note that X and Y are not allowed LPM Rn, Z+ • Same as above, but increments Z after loading CS-280 Dr. Mark L. Hornick
Big Red Flag • When using LPM, the Z register must contain the data’s byte address • Recall: Program Memory is organized by words – each word has an address • Byte address is 2*word address CS-280 Dr. Mark L. Hornick
How do you load a byte address value into Z? .CSEG ; switch further directives to code segment .ORG 0x2A ; set addr for start of program instructions LDI ZL, LOW(2*values) ; load ZL with the low 8 bits of the address LDI ZH, HIGH(2*values) ; load ZH with the high 8 bits of the address LPM R20, Z ; load Program Memory byte addr contained in Z values: .db 5, 10, 11, 12, 13 ; define 5 bytes of Program Memory • Use LOW() and HIGH() are Assembler functions • “values” label contains the word address of the location of the first reserved byte • The assembler expression “2*values” correctly computes the associated byte address CS-280 Dr. Mark L. Hornick
There are certain conventions for defining Program Memory • The .db directives are placed after program instructions, so that the data itself is placed in memory after the instruction opcodes • When defining numeric data values, the first value specifies the number of values to follow: y1: .db 1,5 ; alloc 2 bytes in Prog Memory with initial values of 1 and 5 • When defining character or string data values, the last value speicified should always be zero, indicating that the character data is terminated with a null-character: title: .db ‘c’,’s’,’2’,’8’,’0’,0 ; allocate 6 bytes in Program Memory course: .db “CS-280”, 0 ; allocate 7 bytes in Program Memory CS-280 Dr. Mark L. Hornick
Note: The Z register can also be incremented explicitly • ADIW ZH:ZL, 5 ; add immediate value (to Z) • The value may be 0-63 (decimal) • So you can use ADIW in conjuction with LPM and LPM Rn, Z instructions to post-increment the Z register to point to the address of the next character in program memory CS-280 Dr. Mark L. Hornick
There is also an SPM instruction…. • But due to the nature of Flash memory, writing to it is more complex • Before writing, an entire page of memory must be erased • Page size is device-specific • On some devices, only entire pages can be written • In CE2800, use the .DB directive to write to Flash memory • Only writes once, when the program is downloaded to the device CS-280 Dr. Mark L. Hornick