PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATmega16 und Array



slope
01.02.2005, 13:14
Hallo,

ich bin noch recht neu in der Materie, deshalb bitte ich um Entschuldigung, sollte dieses Thema gar nicht hier rein passen. Ich hoffe trotzdem, dass mir jemand helfen kann:

Ich benutze das AVRStudio, um ein paar Dinge in Assembler mit dem ATmega16 Befehlssatz zu schreiben. Ich möchte nun eine Art "Array" anlegen, ein Label welches dann im Programm als "Platzhalter" verwendet wird. Um das deutlich zu machen, hier der Code, welcher leider nicht so funktioniert, wie ich es mir vorstelle:



.include "m16def.inc"

.def TEMP = R16
.SET array = $02a

.CSEG

CLR TEMP

LDI TEMP, 0x3f
STS array, TEMP

LDI TEMP, 0x06
STS array+1, TEMP




START: CLR R17
LDS R17, array



Ich hoffe es wird klar, was ich vor habe. Ich möchte einfach mit "array+1" oder "array+2" dann entsprechend die Werte abrufen, welche ich zuvor gespeichert habe.

In der letzte Zeile steht "LDS R17, array" - und dies funktioniert auch, d.h. der Wert 0x3f steht danach im Register R17. Leider klappt aber ""LDS R17, array+1" nicht, was ich mir nicht erklären kann.

Ich hoffe jemand kann mir helfen. Falls das da oben der falsche Ansatz ist, dann bitte ich um ein paar Vorschläge, wie man sowas wie ein Array (entsprechend mit +1, +2 darauf zugreifen) realisieren kann.


Vielen Dank!

01.02.2005, 13:44
Hallo

.SET array = $02a sollte falsch sein

richtig

.SET array = $060

STS = Store direkt to SRAM

MFG

JanB
05.02.2005, 20:22
Hallo,
probier mal so:



;sinnloser Code, nur als Beispiel


.cseg ;im ROM

; ...
ldi R16,0x25
sts array+2,R16
ldi R16, 0x44
sts array+3,R16
; ...
lds r16,array+2
...
lds r16,array+3
; ...

.dseg ;im RAM

array: ;Label für das Array
.byte 100 ;100 bytes reservieren für das Array




Schreib mal ob es so klappt,
und ob es das ist, was du willst.

Gruß Jan

slope
05.02.2005, 20:31
Ist das nicht genau dasselbe, was ich auch mache? TEMP ist bei mir ja ein Register, ansonsten benutze ich auch LDI und STS.
Daher verstehe ich Deinen Ansatz jetzt gerade nicht...

JanB
05.02.2005, 20:47
Hallo,

Ist das nicht genau dasselbe, was ich auch mache?
Hast du probiert, ob es funktioniert ?
Wenn ja, und dein Ansatz nicht, dann ist es wohl nicht dasselbe.

Beim AVR musst du immer bedenken, das der
Flash-Speicher wordweise organisiert ist, und nicht byteweise.
Das RAM dagegen byteweise.
Da kommt der Assembler leicht schon mal "durcheinander",
wenn man ROM und RAM nicht ganz klar trennt.
Oder ist es der Programmierer, der da durcheinander kommt ?
Woher soll der ASM wissen wo $80 ist bei .SET xyz=$80 ??
Das 128igste Wort im ROM , also das 256igste Byte
oder das 128 Byte im RAM also das 64igste Word, oder was ?
und was ist dann +1 ?
plus ein Byte oder plus ein Word, also 2 Byte ?
Frage über Fragen ?

Teste mal meinen Ansatz.

Gruß Jan