Hallo
.SET array = $02a sollte falsch sein
richtig
.SET array = $060
STS = Store direkt to SRAM
MFG
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:
Code:.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!
Hallo
.SET array = $02a sollte falsch sein
richtig
.SET array = $060
STS = Store direkt to SRAM
MFG
Hallo,
probier mal so:
Schreib mal ob es so klappt,Code:;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
und ob es das ist, was du willst.
Gruß Jan
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...
Hallo,
Hast du probiert, ob es funktioniert ?Ist das nicht genau dasselbe, was ich auch mache?
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
Lesezeichen