Hur ladda en RAM buffert baklänges?. (AVR)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Fagge
Inlägg: 3930
Blev medlem: 27 maj 2003, 13:59:51
Ort: Blekinge

Hur ladda en RAM buffert baklänges?. (AVR)

Inlägg av Fagge »

Jag vill reservera 64byte i ram minnet till en buffert.
Och det gör jag ju genom att skriva.

BUFFERT: .BYTE 64

Om jag t.e.x vill fylla bufferten med värdet som finns i R16.
Då laddar man ju fört t.e.x Registerpartet X med namnet BUFFERT
& då man skriver X+ så ökas Registerparet automatiskt med ett.

Ldi XL, LOW (BUFFERT)
Ldi XH, HIGH (BUFFERT)
ST X+, R16
ST X+, R16
…
…

Men om jag skulle vilja skriva baklänges ?
Alltså jag vill börja skriva i slutet av denna 64bitars bufferten & använda mig av kommandot X- så att registerparet X minskas efter varje skrivning.
Så hur bär man sig åt för att peka registerparetX till slutet av bufferten?
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Inlägg av Swech »

Ldi XL, LOW (BUFFERT+64)
Ldi XH, HIGH (BUFFERT+64)
ST -X, R16
ST -X, R16
Användarvisningsbild
Fagge
Inlägg: 3930
Blev medlem: 27 maj 2003, 13:59:51
Ort: Blekinge

Inlägg av Fagge »

Ofan, så man kan använda siffror ihop med namnet.
Då provar vi med det! :)
Tackar.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Inlägg av Swech »

Namnet är ju trots allt endast en ersättning av just ett nummer.
Går att skriva mycket kul i sina uttryck * + - /

T.ex.
Ldi xl,low (buffert*2) ;går också fint

Swech
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Lite mer flexibelt blir det om du gör :

.EQU buff_len 64

BUFFERT: .BYTE buff_len

Ldi XL, LOW (BUFFERT+buff_len)
Ldi XH, HIGH (BUFFERT+buff_len)

Bara ett ställe (d.v.s EQU) att justera buffert längden.

Sen så utgår jag från att du någon annanstans kommer
att accessa BUFFERT åt andra hållet. Annars har ju definitionen
av "frammåt" och "bakåt" ingen igentlig mening. D.v.s att
processorn vet ju inte vad som du menar med frammåt/bakåt...
Användarvisningsbild
Fagge
Inlägg: 3930
Blev medlem: 27 maj 2003, 13:59:51
Ort: Blekinge

Inlägg av Fagge »

Oki.
Men låt säga att jag vill att RegX ska hoppa 12steg framåt eller bakåt i RAMet efter varje läsning/skrivning. Kan man klämma in siffror även där?

Typ såhär?
ST X+12, R16
ST -12X, R16

Sodjan:
Jo bufferten kommer att fyllas så att det nyaste värdet hamnar sist, medan den ibland kommer att behövas läsas åt andra hållet så att det nyaste värdet kommer först…
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

Det låter nästan som att det är en ringbuffert du behöver, Fagge! Skall man kunna både lägga in och ta ut "samtidigt" i bufferten så är det en ringbuffert man behöver.

En sådan gör man genom att ha en inpekare och en utpekare och sedan flyttar man dom efterhand som man lägger in och tar ut data. Hela tiden måste man hålla koll på när endera av pekarna slår runt buffertkanten. Samtidigt måste man hålla koll på fyllnadsgraden i bufferten. Det gör man genom att jämföra dom två pekarna mot varandra.

Edit: Nu kan jag inte AVR speciellt, men man brukar inte kunna autoincrementa mer än 1, 2 eller 4 byte samtidigt som man skriver eller läser data. Då får man göra det med en separat instruktion istället.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Ja, en ringbuffert där inlägg sker via "in" pekaren och utläsning
sker via både "in" eller "ut" pekaren beroende på vad som krävs.

Det jag menade med "frammåt" och "bakåt" är att det ju inte finns någon
(av processorn eller hårdvaran) förutbestämd rikting i bufferten. Det står dig
helt fritt att definiera "frammåt" och "bakåt" så att det blir enklast att
hantera kodmässigt.

Om du alltid vill läsa den senaste värdet så räcker det med 1 pekare
till bufferten som pekar på senaste värdet. Ungefär som en vanlig "stack".
Men du ville visst kunna läsa från båda "ändar* av bufferten...
Användarvisningsbild
Fagge
Inlägg: 3930
Blev medlem: 27 maj 2003, 13:59:51
Ort: Blekinge

Inlägg av Fagge »

Jag har nu lekt lite i AVRstudio med att försöka klämma in siffror på olika sätt kring X:et, men det verkar inte fungera. :?
Så man får nog skapa en liten subrutin som incrementerar X:et önskat antal ggr emellan varje läsning/ skriving, I fall man t.ex. vill plocka ut var 12e byte ur RAMet.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Inlägg av jesse »

Du borde kanske läsa lite på AVR Instruction set... Där definieras alla instruktioner och du kan läsa ut exakt vad du kan göra och inte.

t.ex. så kan du läsa om instruktionen ST på sid 137.

Om du vill göra
ST X+12,r0 (först lagra data i cell nr X, sedan öka X med 12)
så kan du ju t.ex göra så här:

Kod: Markera allt

ST X,r0
ADIW X,12
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> ...med att försöka klämma in siffror på olika sätt kring X:et...

Men *varför* skulle det fungera ?
Var har du sett det ? Var är det dokumenterat ?
Användarvisningsbild
Fagge
Inlägg: 3930
Blev medlem: 27 maj 2003, 13:59:51
Ort: Blekinge

Inlägg av Fagge »

Tack jesse.
Ibland snöar man in sig. :wink:
Klart som katten att man kan addera ett tal direkt till pekaren med adiw.

Sodjan
Ja Varför… En vild schansning.
Jag ville veta hur man ökar X med flera steg, men utan att veta hur så kändes det ändå logiskt om man kunde skriva nått i stil med X+12.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Inlägg av Swech »

jorå.. det går allt att skriva så som du gör
Men då är det
LDD
STD
som kan användas och Y eller Z reg. (inte X)

LDD R16,Y+30 (Värden 0-63 kan anges)
STD Z+5,R16

Observera dock att Y eller Z ej förändras
Man kan alltså

Kod: Markera allt

LD  R16,Y    ;hämta från adr pekad av Y
LD  R16,Y+  ;hämta från adr pekad av Y, efter ökas y med 1
LD  R16,-Y   ;minska Y med ett, därefter hämta från adr pekad av Y  
LDD R16,Y+5  ;hämta från adr pekad av Y+5  Y är oförändrad


Så Y och Z blir dina nya favoritregister ;) glöm X

Swech
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Inlägg av jesse »

LDD R16,Y+5 ;hämta från adr pekad av Y+5 Y är oförändrad

det är ju inte samma sak som att först lagra värdet i (Y) och sedan öka värdet på Y med 5.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Inlägg av Swech »

Nej det är det naturligtvis inte, men vad jag ville visa
är att det finns instruktioner som skrivs t.ex. Y+12
Sen att den inte gör det Fagge önskar i det här fallet var inte poängen.
Poängen är att någon kanske ser denna kombination och
får för sig att den är omöjlig på AVR.

Så nej den löser inte Fagges problem i detta specifika fall men
syntaxen finns.

Swech
Skriv svar