mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Daten an bestimmter Position im SRAm speichern


Autor: DJANGO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an Alle,
Ich programmiere ein BusLogger auf dem AT90S8535 in ASM und habe 
folgendes Problem:

Ich empfange über SPI mehrere Bytes, die in ID und daten aufgeteilt 
sind.
Nun möchte ich (SRAM-Adresse = ID + 0x0060 ) in dieser Speicherzelle 
meine Daten(1 Byte) speichern. Das Ganze soll sowas wie ein 
Look-up-table sein.
Später soll immer nur nachgesehen werden ob die Speicherzelle 
beschrieben ist. Ich habe schon versucht die Speicherzellen zu benennen 
und die über SPI empfangene ID mit Daten zu speichern.
Hier ein Beispiel :
.equ  ID_1    = 0x0060     ; Erste Speicherzelle im SRAM
.equ  ID_2    = 0x0061     ; Zweite  Speicherzelle in SRAM
.equ  ID_3    = 0x0062      ; usw...... bis zu 300 Adressen

;Variablen in Registern

.def  Buffer       = R16
.def  temp       = R17
;Neustart
NEUSTART:
    ldi                       buffer, LOW(RAMEND)         ;Initiate Stackpointer
    out      SPL, buffer             ; wegen Interrupts und Unterprogr.
    ldi      buffer, HIGH(RAMEND)
    out      SPH, buffer
;Teste ob ich die im Register "buffer" gepeicherte Adresse als Speicherziel verwenden kann. Im Register "temp" sind die Daten gespeichert.
    ldi      buffer, 0x62
    ldi      temp, 0x80
    sts      buffer, temp

Wenn jemand eine Idee hat wie man das am besten realisieren kann.
Bin für jede Hilfe Dankbar
Gruß DJANGO

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@DJANGO

>Nun möchte ich (SRAM-Adresse = ID + 0x0060 ) in dieser Speicherzelle
>meine Daten(1 Byte) speichern. Das Ganze soll sowas wie ein


>Wenn jemand eine Idee hat wie man das am besten realisieren kann.

Du bist neu bei ASM?

Das geht recht einfach, man muss es nur so machen wie es im Manual 
steht.

.dseg
.org 0x60

ID_data: .byte 300    ; reserviert 300 Byte Speicher

>Bin für jede Hilfe Dankbar

Im AVR Studio im Menu Help -> AVR Tool User guide -> AVR Assembler -> 
Users Guide -> Directives

MfG
Falk

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@DJANGO

Huch, ich sehe gerade dass du noch den falschen Zugriff machst.

LDI lädt konstante Werte in Register
LDS lädt Variablen aus dem SRAM in Register
STS scheibt Daten aus Registern in den SRAM

; Schreibe 0x80 in den SRAM mit Index 2

    ldi      temp, 0x80
    sts      id_data+2, temp

MfG
Falk

Autor: DJANGO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk:
Vielen Dank für die schnelle Antwort.
Das mit dem Speicherreservieren bringt mich schon weiter.

In ASM kenne ich mich ein bisschen aus.

>Huch, ich sehe gerade dass du noch den falschen Zugriff machst.

Die sache mit dem zugriff ist gewollt gemacht. Ich wollte nur ins 
Register "buffer" den Wert (1 + OFFSET(0x60)) laden als Test , wenn ich 
die ID 1 über SPI erhalte . Anschlieesend sollte die in "buffer" 
stehende ID als Speicherziel gewählt werden.
Sorry für die Unklare Ausdrucksweise.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@DJANGO

>In ASM kenne ich mich ein bisschen aus.

Aber nur ein KLEINES bisschen, denn . . .

>Huch, ich sehe gerade dass du noch den falschen Zugriff machst.

>Die sache mit dem zugriff ist gewollt gemacht. Ich wollte nur ins
>Register "buffer" den Wert (1 + OFFSET(0x60)) laden als Test , wenn ich
>die ID 1 über SPI erhalte . Anschlieesend sollte die in "buffer"
>stehende ID als Speicherziel gewählt werden.

Das macht man anders (muss man anders machen).

; Wert aus dem SRAM laden

lds buffer, id_data

; wert über Index im SRAM speichern geht nur über x/y oder Z 
indexregister

; Basisadresse laden

ldi  zl,low(id_data)
ldi  zh,high(id_data)

; index addieren, 16 Bit

add zl, buffer
ldi temp,0
adc zh,temp

st  z,spi_data

Schau dir mal die Assemblerbefehle vom AVR GENAU an. Das Dokument

http://www.atmel.com/dyn/resources/prod_documents/...

ist dein Freund

MfG
Falk

Autor: DJANGO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@falk
Vielen Dank für das aufklären  wie ich eine Variable aus dem SRAM hole.
Ich denke ich drücke mich immer noch Unklar aus.

Ich erhalte über SPI 2 Byte. Das erste Byte ist die Adresse und das 
zweite Byte die Daten. nun möchte ich das erste Byte(Adresse) als 
Speicherindex verwenden und in "der" Speicherzelle das Byte 2 
speichern(Daten).
Als Pseudocode:
SPEICHER_ZELLE(Byte1)=Byte2;

Ich möchte somit bei einer Prüfung Zeitsparen, indem ich nicht den 
ganzen Speicherbereich absuche sondern mit der adresse kann ich direkt 
auf die Speicherzelle zugreifen und den Inhalt auslesen.
Gruß DJANGO

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@DJANGO

>Ich erhalte über SPI 2 Byte. Das erste Byte ist die Adresse und das
>zweite Byte die Daten. nun möchte ich das erste Byte(Adresse) als
>Speicherindex verwenden und in "der" Speicherzelle das Byte 2
>speichern(Daten).
>Als Pseudocode:
>SPEICHER_ZELLE(Byte1)=Byte2;

Das hab ich schon so verstanden. OK, hier vielleicht die komplette 
Variante

.dseg
.org 0x60

id_data .byte 300      ; buffer für SPI daten




.cseg

; Daten vom SPI holen und in Registern speichern, spi_1, spi_2

; Basisadresse laden

ldi  zl,low(id_data)
ldi  zh,high(id_data)

; Index addieren, 16 Bit

add zl, spi_1
ldi temp,0
adc zh,temp

st  z, spi_2

>Ich möchte somit bei einer Prüfung Zeitsparen, indem ich nicht den
>ganzen Speicherbereich absuche sondern mit der adresse kann ich direkt
>auf die Speicherzelle zugreifen und den Inhalt auslesen.

Genau, geht wie oben. Lesen auf exakt dem gleichen Weg, nur halt 
anstelle

st z, spi_2

ein

ld spi_2,z

MfG
Falk

Autor: DJANGO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank.
Jetzt habe ich verstanden wie du das gemeint hast.
Ich werde es gleich mal ausprobieren und melde mich dann.
Gruß DJANGO

Autor: DJANGO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk
Danke habe es gerade mal ausprobiert und es läuft soweit.
Nochmal vielen Dank für die mühe.
MFG
DJANGO

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.