-         

Ergebnis 1 bis 5 von 5

Thema: ATmega16 und Array

  1. #1

    ATmega16 und Array

    Anzeige

    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!

  2. #2
    Gast
    Hallo

    .SET array = $02a sollte falsch sein

    richtig

    .SET array = $060

    STS = Store direkt to SRAM

    MFG

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.12.2004
    Ort
    LEV
    Beiträge
    505
    Hallo,
    probier mal so:

    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
    Schreib mal ob es so klappt,
    und ob es das ist, was du willst.

    Gruß Jan

  4. #4
    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...

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.12.2004
    Ort
    LEV
    Beiträge
    505
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •