Example:
ldi ZH, high(Table_1<<1); Initialize Z-pointer
ldi ZL, low(Table_1<<1)
lpm r16, Z ; Load constant from Program ;
;Memory pointed to by Z (r31:r30)
...
Table_1: .dw 0x5876 ; 0x76 is addresses when ZLSB = 0 ; 0x58 is addresses when ZLSB = 1 ...
LPM instruktionen laddar juh det tal i r16 som Z pekar på (Z innehåller en minnesaddresss). I det här fallet så antyder kommentarerna i Table_1 att 0x5867 används som en address i exemplet ovan. MEN, och detta upptäcker snart den klarsynte, att .dw 0x5867 är en 16 bitars konstant och kan omöjligt få plats i ett 8 bitars register som r16. "Hmmm" säger jag åt det. Kan någon kanske kasta lite ljus över det här? Är jag ute o seglar och i så fall har jag glömt min flytväst?
Du har samma problem som jag hade för några månader sen. Det handlar om adresseringen.
Eftersom FLASH är ett 16 bitars minne, pekar en enda adress på 2 byte, dvs 2 X 8 bit. Detta innebär att om ett FLASH minne kan adresseras med 5 adresser så ska du kunna läsa 10 byte (2 för varje adress)
Om du nu går tillbaka till ditt exempel så ser du att de skriver:
det här <<1 innebär att värdet av Table_1 ska skiftas ett steg vänster, dvs multipliceras med 2.
(Minst signifikanta biten av Z blir noll)
Om du vill peka på adress 1 i FLASH så innehåller Z värdet 2 istället (efter multiplikationen med 2)
Vill du peka på adress 2 i FLASH, så innehåller Z värdet 4 efter multiplikationen med 2.
DVS. om Z har värdet 2 så kommer du att läsa en byte av det värdet som finns på adress 1 i FLASH.
*** MEN, om du låter Z ha värdet 3 istället, så pekar du fortfarande på adress 1 i FLASH men nu får du ut den andra byte istället.
Smart va?
Alltså:
när du låter Z peka på Table_1<<1 (eller du kan också skriva Table_1*2) så pekar du på 0x76, om du adderar en etta till Z så pekar du på 0x58. Bägge värden har samma adress i FLASH (den ena är den låga byte:n den andra är den höga byte:n)
Så svaret på din fråga: nej 16 bit rymms inte i ett 8 bits register, men det går att läsa 8 bit i taget.
*** MEN, om du låter Z ha värdet 3 istället, så pekar du fortfarande på adress 1 i FLASH men nu får du ut den andra byte istället.
Smart va?
Aaahh....nu fattar jag...efter att ha läst de här svaret och i databladet en gån till så gick det upp för mig. Om man dessutom lägger till att det är ett litet skrivfel i kommentarerna (borde vara addressed istället för addresses) så är det ganska klart