Hur ladda en RAM buffert baklänges?. (AVR)
Hur ladda en RAM buffert baklänges?. (AVR)
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?
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?
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...
.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...
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
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
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.
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.
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...
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...
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:
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
- Swech
- EF Sponsor
- Inlägg: 4750
- Blev medlem: 6 november 2006, 21:43:35
- Ort: Munkedal, Sverige (Sweden)
- Kontakt:
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å
Så Y och Z blir dina nya favoritregister
glöm X
Swech
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

Swech
- Swech
- EF Sponsor
- Inlägg: 4750
- Blev medlem: 6 november 2006, 21:43:35
- Ort: Munkedal, Sverige (Sweden)
- Kontakt:
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
ä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