Kontigt exempel i "avr intructions set" pdf:en

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

Kontigt exempel i "avr intructions set" pdf:en

Inlägg av Rymdninja »

På sidan 91 i AVR instruction set mannualen kan man läsa följande exempel:

Kod: Markera allt

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?

Tack o hej
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

Det står i texten, att du läser 0x76 när lägsta pekaren i Z är 0 delvis en byte och 0x58 när den är 1 :)
Max_jammer
Inlägg: 9
Blev medlem: 21 maj 2004, 18:26:34

Inlägg av Max_jammer »

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:

ldi ZH, high(Table_1<<1); Initialize Z-pointer
ldi ZL, low(Table_1<<1)

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.

Läs mer om LPM instruktionen i databladet.

Hoppas det hjälper

/D
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

Inlägg av Rymdninja »

*** 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 :)

tack för det här!
Skriv svar