PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Direkter SRAM zugriff (ASM)



teslanikola
14.03.2006, 17:25
Hallo ich melde mich mal wieder mit einem problem,

also ich möchte aus einer bestimmten Addresse des SRAMs meine Werte auslesen, das ist ja mit

LDS register, 0xXX

kein Porblem.
So wenn ich aber jetzt ein Register hab in dem die Addresse gespeichert ist, kann ich nicht darauf zugreifen:

LDS register, addressregister

DAS GEHT NICHT!!!

Wie kann ich aber das so einrichten, das ich auf die in einem Register gespeicherte Addresse zugreifen kann????

Grüße Teslanikola

izaseba
14.03.2006, 17:58
Was hast Du vor, ich verstehe Dein Problem nicht in einem Register ist die Sramadresse ?

teslanikola
14.03.2006, 18:06
Also die Addresse zB 0x15 wird per LDI in ein Register gepackt und dort soll auch was geschrieben werde,so.
Jetzt will ich hald an anderer stelle die Daten wieder auslesen.

BSp:
.def adress = r16

ldi adress, 0x20
schreibe ein register in Adresse 0x20 ( wie machen? STS geht mit Register ned )
.
.
.
lese daten aus adresse ( Register= Adress ) aber mit LDS geht ein zugriff per register (adresse) nicht.

Wie lösen?

SprinterSB
14.03.2006, 19:18
Der obige Befehl lädt r16 mit 0x20, das hat nix mit SRAM zu run.

Für LDS und STS kannst du direkt hart die Adresse angeben oder ein Symbol. Wie die Syntax für letzteres ist (Definition, Deklaration und Referenzierung), hängt von deinem Assembler ab.

linux_80
14.03.2006, 19:23
Hallo,
meinst Du indirekte Adressierung?
Dann schau mal die Befehle LD an, mithilfe von den X, Y und Z-Registern kann man den Speicher indirekt adressieren.

AVR Instruction Set :
http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf

teslanikola
14.03.2006, 19:51
@linux, das mit den Pointer-Register ist mir schon klar, was mien Porblem ist: ich hab ein Array ( 5Bytes ) im Sram ( vom ender her ) und jetzt will ich mal das eine, mal das andere Byte auslesen oder schreiben, nur ich weis ja ned wie ich das machen soll, die Pointregister brauch ich schon für meinen sack ( der fängt dann hald nicht am ende des SRAM an sondern 5Bytes eher ) wie kann ich also bestimmte bytes ( welches wird vom µC bestimmt) auslesen?

SprinterSB
14.03.2006, 19:54
Pointer-Register hast du 3 Stück, X, Y und Z. Wenn die alle belegt sind, musst du eines davon auf dem Stack sichern oder in einem freien Register und danach wieder herstellen.

teslanikola
14.03.2006, 20:15
arg entweder werd ich ned verstande, oder ihr versteht mich nede. Ich will einfach die Addresse, welche ich in einem Register gespeichert hab, aus dem SRAM auslesen und diesen wert ( aus dem Sram) in ein weiteres register schreiben.

Meine Idee:

Also wenn ich meinen Stack erst 5 Bytes vor dem SRAM ende anfange, dann hab ich ja auf jeden 5 Bytes aus dem SRAM zu meiner Freien verfügung, so darin speicher ich mir jetzt nacheinander ein paar daten, da ich ja mir die Addresse dieser Position irgenwie merken muss sollte die irgenwie in ein Register. So. nun will ich ja meine Daten ja irgendwann mal abrufen, also die Addresse aus dem Registerholen und mit ihrer Hilfe irgenwie an meine Daten kommen, nur will die sache ned funktionieren. man kann ja mit dem tolle LDS zielreg, 0x20 toll auf die adresse 0x20 zugreifen, aber wenn ich jetzt statt 0x20 ein register ( mein adressregister in dem ja auch 0x20 gespeichert ist ) dann geht die sache komischerweise ned mehr. So genau da hängts wie kann ich das lösen?

SprinterSB
14.03.2006, 20:25
So was nennt man indirekten Zugriff.

LDI r30, lo8(addr) ; abhängig vom Assembler
LDI r31, hi8(addr)
LD r10, Z

izaseba
14.03.2006, 20:47
teslanikola,
was soll der Quatsch?
Ich weiß, daß es von hinten Spaß macht :cheesy: aber wieso gehst Du nicht von vorne an den Sram ?
Meistens kann man den ab der Adresse 0x0060 für eigene Zwecke benutzen.
Der Stack kommt von hinten nach vorne, und Deine Daten von vorne nach hinten...
So macht man das meistens.

Gruß Sebastian

teslanikola
14.03.2006, 21:03
ok das mit von vorne nach hinten ist quatsch, ach von hinten nach vorna, aber das mit dem indireckten zugriff geht immer noch nede:

LDI r30, lo(addr)
LDI r31, hi(addr)
LD r10, Z

Mein Porg sieht so aus: Alle paar sec wird ein Interupt aufgerufen, dort wir immer eine der 5Bytes ausgelesen und zwar nacheinander, also beim ertsten Int das erste, bei 2. das 2. usw, bis es bei 5. wieder bei 1 anfängt, nur das bekomme ich ned gebacken. Das mit dem indirekten zugriff geht nede, da kommt als fehlermeldung:
D:\Eigene Dateien\Multiplex.asm(81) : error : Undefined variable referenced

SprinterSB
14.03.2006, 21:19
Wie gesagt: Assembler ist nicht Assembler. Vielleicht hilft ein Blick ins Wiki und in dortige Tutorials? (wenn du schon nicht verrätst, welchen Assembler du verwendest).

izaseba
14.03.2006, 21:23
mach das so:

irgendwo in den Anfangsfeierlichkeiten


.equ Meinevariablen = 0x0060
.def tmp,R16
Im Dattenblatt nachlesen, ob die Adresse ;0x0060 wirklich auch die erste Adresse ist, die man benutzen darf

in der reset routine:


ldi XH,HIGH(Meinevariablen)
ldi XL,LOW(Meinevariablen)


jetzt hast Du die Adresse 0x0060 in den X Pointer.

in Deinem Interrupt erstmal prüfen, ob Du bei 0x0066 angekommen bist:


cpi XL,0x0066
brlo nichtzuruecksetzen
ldi XH,HIGH(Meinevariablen)
ldi XH,LOW(Meinevariablen)
nichtzuruecksetzen:
ld tmp,X+
;mach was mit tmp



In der ISR SREG Register retten!

Gruß Sebastian

izaseba
14.03.2006, 21:25
@ Sprinter,

D:\Eigene Dateien\Multiplex.asm(81) : error : Undefined variable referenced


Diese Fehlermeldung sieht so aus als ob man Dein Beispiel eingesetzt hätte,
und "addr" nicht definiert hätte

Gruß Sebastian

teslanikola
15.03.2006, 16:42
Ok werde es mit dem Pointer machen, das scheint zuverlässig, aber sag mal was verbirgt sich darunter:


In der ISR SREG Register retten!




Diese Fehlermeldung sieht so aus als ob man Dein Beispiel eingesetzt hätte,
und "addr" nicht definiert hätte


hatte es definiert, das war ja ds verwirende

izaseba
15.03.2006, 18:38
aber sag mal was verbirgt sich darunter:

Hast Du AVRStudio ?

Wenn ja, schreib mal ein kurzes Programm, wo cp add sub usw. vorkommt,
dann gehe des Programm im Studio schrittweise durch und schaue Dir den Inhalt vom SREG an !

Dann bringe im Erfahrung wozu SREG da ist, und dann überlege, was passiert, wenn Dein Programm sich in der Hauptschleife befindet und beim Abarbeiten von einem z.B add Befehl dem ein Branch folgt ,von einem Interrupt abgebrochen, in dem wiederrum irgendwas verglichen oder addiert wird.

O weh, jetzt verstehe ich selber nicht, was ich getippt hab, aber mach mal mit Studio, es ist besser, wenn Du selber drauf kommst...

Gruß Sebastian

teslanikola
15.03.2006, 20:42
Hast Du AVRStudio ?

Wenn ja, schreib mal ein kurzes Programm, wo cp add sub usw. vorkommt,
dann gehe des Programm im Studio schrittweise durch und schaue Dir den Inhalt vom SREG an !

Dann bringe im Erfahrung wozu SREG da ist, und dann überlege, was passiert, wenn Dein Programm sich in der Hauptschleife befindet und beim Abarbeiten von einem z.B add Befehl dem ein Branch folgt ,von einem Interrupt abgebrochen, in dem wiederrum irgendwas verglichen oder addiert wird.

O weh, jetzt verstehe ich selber nicht, was ich getippt hab, aber mach mal mit Studio, es ist besser, wenn Du selber drauf kommst...


Klar hab ich studio, als Atmelfan und Atmelferienjobber ist das ja pflicht ;-), danke für deine Bemühungen, ich denke die richtig komplexen sachen muss ich schon zT selber rausfinde, so nst lerne ich ja nix ;-)

Danke noch mal, mein Prog geht jetzt, macht aber ganz lustige sachen, die ich nicht will!

izaseba
15.03.2006, 20:49
komplexen sachen muss ich schon zT selber rausfinde, so nst lerne ich ja nix


Da ist wirklich was wahres dran.
Deswegen sage ich Dir nicht, warum das mit dem SREG so wichtig ist, das kriegst Du schon selber hin...

Gruß Sebastian