pristup k programovej pamäti (at mega8)

zdravim vas. potreboval by som poradit s pristupom do flash pamäti cez istrukciu LPM. Zaujimaju ma hlavne tabulky konstant velkostou nad 255 byte

.include "m8def.inc"


start:
  ldi  r16,low(RAMEND)
  out  SPL,r16             
  ldi  r16,high(RAMEND)
  out  SPH,r16


  ; Vlož adresu tabulky 'tabulka' do Z registru. 
  ; Násobíme dvěma, abychom dostali bajtovou adresu.
  
  ldi  ZH,high(2*tabulka)  ; Horní bajt adresy do ZH
  ldi  ZL,low(2*tabulka)   ; Dolní bajt adresy do ZL
  lpm                      ; Vlož 1. bajt z tabulky do r0
  adiw  ZL,1               ; Zvětši Z register o 1
  lpm                      ; Vlož 2. bajt z tabulky do r0
  

  ldi  ZH,high(2*tabulka+9)  
  ldi  ZL,low(2*tabulka+9)   
  lpm                      ; Vlož 10. bajt z tabulky do r0

; 2.varianta
  ldi  ZH,high(2*tabulka)  
  ldi  ZL,low(2*tabulka)   
  lpm r16,Z                ; Vlož 1. bajt z tabulky do r16

; 3.varianta
  ldi  ZH,high(2*tabulka)  
  ldi  ZL,low(2*tabulka)   
  lpm r16,Z+               ; Vlož 1. bajt z tabulky do r16
  lpm r16,Z+               ; Vlož 2. bajt z tabulky do r16
  lpm r16,Z+               ; Vlož 3. bajt z tabulky do r16



tabulka:
.db  0,10,20,30,40,50,60,70,80,90,100,110 ; atd max 64 kB

no skor som myslel nieco ine , trebars skok napr. do stredu tabulky cez premennu (register) skoky po 5 byte
ja som to riesil takto:

nasobi: ;nasobi reg * 5 hodnotou reg temp
inc r23
adiw zl,5
cp r23,temp
brne nasobi
clr r23
z1
lpm temp,z+ ;nacita byte ulozene v flash
rcall odosli_data
inc r22
cpi r22,5
brne z1
clr r22
clr zl
ret

tabulka:
.db 10,20,30,40,50,60,70,80,90,100,
.db 110,120,130,140,150,160,170,180…atd

… len mi to zabralo vela strojoveho casu hlavne ku kovcu tabulky…[/code]

[code]
mi to nejak nezobralo dobre tak este raz =)
no skor som myslel nieco ine , trebars skok napr. do stredu tabulky cez premennu (register) skoky po 5 byte
ja som to riesil takto:

nasobi: ;nasobi reg * 5 hodnotou reg temp
inc r23
adiw zl,5
cp r23,temp
brne nasobi
clr r23
z1:
lpm temp,z+ ;nacita byte ulozene v flash
rcall odosli_data
inc r22
cpi r22,5
brne z1
clr r22
clr zl
ret

tabulka:
.db 10,20,30,40,50,60,70,80,90,100,
.db 110,120,130,140,150,160,170,180…atd

… len mi to zabralo vela strojoveho casu hlavne ku koncu tabulky…[/code]

Delal jsem podobne hopkani po tabulce v attiny2313, jde to udelat velmi rychle treba prez shiftovani, ale vzdyt Atmega8 ma i instrukci na nasobeni ne? Tak proc ji nepouzit?

diky za tip este by bodol snad nejaky prikladik…

tedy u atmegy16