LPM - Load Programme Memory

ELPM - Extended Load Programme Memory

LPM Reg, Z
ELPM Reg, Z
Reg: R0 - R31
Z: Zwei- oder Drei-Byte Pointer

Die Pointer bestehen aus 2 Registern, die auf die Programmspeicheradresse zeigen, aus der der Datenwert geladen werden soll. Er kann durch das RAMPZ-Register auf einen Drei-Byte Pointer erweitert werden und dann einen erweiterten (=Extended) Adressraum ansprechen (siehe Pointer). Es kann auch ein Post-Inkrement-Modifier mit dem Pointer verwendet werden.

Mit diesem Befehl wird ein 8-Bit Wert aus dem Programm-Flash-Speicher in ein Register geladen. Zulässig sind die Register R0 bis R31. Die Adresse kann hierbei nicht direkt, sondern nur in Form des Z-Pointers angegeben werden. Nachdem die Pointer einen 16-Bit (24-Bit bei ELPM) Adressraum ansprechen können, können Speicheradressen von 0 bis 65535 (16777216 bei EMLPM) erreicht werden.

Achtung: Wird für das zu ladende Register R30 oder R31 verwendet (dies sind die Register die den Z-Pointer definieren) und wird ein Post-Inkrement auf den Z-Pointer angewandt, so ist das Ergebnis des Befehls nicht vorhersagbar.


Beispiele:

ldi ZH, high(Label<<1) ;Laden des High-Bytes der Programmspeicheradresse des Labels "Label"

ldi ZL, low(Label<<1) ;Laden des Low-Bytes der Programmspeicheradresse des Labels "Label"


lpm r20, Z ;in das Register R20 wird der Wert von der Adresse des Flash-Speichers geladen, auf die der Pointer Z zeigt

oder im erweiterten Modus:

elpm r20, Z ;in das Register R20 wird der Wert von der Adresse des Flash-Speichers geladen, auf die der Pointer Z zeigt

Alternativ:

lpm r20, Z+ ;in das Register R20 wird der Wert von der Adresse des Flash-Speichers geladen, auf die der Pointer Z zeigt. Anschließend wird der Z-Pointer um 1 erhöht. Dies erfolgt nur innerhalb des 16-Bit (24-Bit bei ELPM) Adressraums des Z-Pointers

Statusregister: Keine Beeinflussung
Speicherplatz: 2 Byte
Taktzyklen: 3