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 :
1
.equ ID_1 = 0x0060 ; Erste Speicherzelle im SRAM
2
.equ ID_2 = 0x0061 ; Zweite Speicherzelle in SRAM
3
.equ ID_3 = 0x0062 ; usw...... bis zu 300 Adressen
4
5
;Variablen in Registern
6
7
.def Buffer = R16
8
.def temp = R17
9
;Neustart
10
NEUSTART:
11
ldi buffer, LOW(RAMEND) ;Initiate Stackpointer
12
out SPL, buffer ; wegen Interrupts und Unterprogr.
13
ldi buffer, HIGH(RAMEND)
14
out SPH, buffer
15
;Teste ob ich die im Register "buffer" gepeicherte Adresse als Speicherziel verwenden kann. Im Register "temp" sind die Daten gespeichert.
16
ldi buffer, 0x62
17
ldi temp, 0x80
18
sts buffer, temp
Wenn jemand eine Idee hat wie man das am besten realisieren kann.
Bin für jede Hilfe Dankbar
Gruß DJANGO
@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
@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
@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.
@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/doc0856.pdf
ist dein Freund
MfG
Falk
@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
@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