www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik at90s8535 - auf ram zugreifen


Autor: Leo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte den Rambereich gezielt über eine Adresse ansprechen.
Beim at90s8535 beginnt der Rambereich ab der Adresse 0x60. Wenn ich den 
C-Code wie unten gezeigt übersetze, dann kann ich im HEX-File die Daten 
nicht erkennen. Die Daten (0xaa) müsste ich doch im HEX-File sehen 
können.

// write Data into RAM
*(volatile unsigned int*)0x60 = 0xaa;
*(volatile unsigned int*)0x61 = 0xaa;
*(volatile unsigned int*)0x62 = 0xaa;
*(volatile unsigned int*)0x63 = 0xaa;

Was mache ich möglicherweise falsch?

Autor: Leo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verstehe das nicht. Der Rambereich für diesen Typ beginnt bei 0x060 
und der Heap bei 0x015F. Die Daten (0xaa) im Hex File, müsste ich doch 
mit dem Hex Viewer sehen können oder nicht?

Autor: Frickler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leo schrieb:
> Die Daten (0xaa) müsste ich doch im HEX-File sehen
> können.
Am besten du schaust dir mal das Listing an. Dann weißt du ganz genau, 
was der Compiler damit macht. Das passiert bei mir:
*(volatile unsigned int*)0x1002 = 0xaa;
 124:  8a ea         ldi  r24, 0xAA  ; 170
 126:  90 e0         ldi  r25, 0x00  ; 0
 128:  90 93 03 10   sts  0x1003, r25
 12c:  80 93 02 10   sts  0x1002, r24

PS: Außerdem solltest du berücksichtigen, das Integer für den AVR 2 
Byte groß ist.

Autor: Leo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Info.

Das kommt bei mir raus:

// write Data into RAM
*(volatile unsigned char*)0x60 = 0xAA;
34:  8a ea         ldi  r24, 0xAA  ; 170
36:  80 93 60 00   sts  0x0060, r24
3a:  80 e1         ldi  r24, 0x10  ; 16
3c:  97 e2         ldi  r25, 0x27  ; 39

An welcher Adresse steht nun der 1Byte Wert 0xAA?

Autor: Leo (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das Hex File habe ich mal mit einem Hex Viewer analysiert.
Ich kann den Wert 0xAA nicht finden.

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leo schrieb:
> // write Data into RAM
> *(volatile unsigned char*)0x60 = 0xAA;
> 34:  8a ea         ldi  r24, 0xAA  ; 170
> 36:  80 93 60 00   sts  0x0060, r24
> 3a:  80 e1         ldi  r24, 0x10  ; 16
> 3c:  97 e2         ldi  r25, 0x27  ; 39
>
> An welcher Adresse steht nun der 1Byte Wert 0xAA?

Gegenfragen:
Was macht die instruktion ldi?
Was macht die Instruktion sts?
Dann sollte es eigentlich klar sein.

Falls du aber Assembler-resistent sein solltest, dann hilft dir 
vielleicht die Simulation des Programmes.

PS:
Links im Listing steht die Programmspeicher-Adresse mit Opcode(s) (im 
hexfile wiederauffindbar). Rechts der Assemblerbefehl.

Gruß Skriptkiddy

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das Hex File habe ich mal mit einem Hex Viewer analysiert.

Supi! Eine Hex Datei die aus ASCII Zeichen besteht im
HEX Viewer anschauen;) ROFL.

Na gut, auch ganz rechts ist kein AA zu sehen.

Nimm mal die RICHTIGE HEX Datei und schau da rein.

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Außerdem macht es keinen Sinn, ein Hex-File mit einem Hexeditor zu 
öffen. Das ist nämlich eine Textdatei. Die sollte man lieber in einem 
Texteditor öffnen.

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> Na gut, auch ganz rechts ist kein AA zu sehen.

ldi  r24, 0xAA   --> 8a ea

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>holger schrieb:
>> Na gut, auch ganz rechts ist kein AA zu sehen.

>ldi  r24, 0xAA   --> 8a ea

He, he, Der Assembler baut seine Opcodes ja echt fies
zusammen;)

Autor: Leo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Danke für eure Unterstützung. So ganz steige ich noch nicht 
durch.
Ich kann nicht nachvollziehen, ob nun an der Adresse 0x60 der Wert steht 
oder nicht.

Autor: Leo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
// write Data into RAM
*(volatile unsigned char*)0x60 = 0xAA;
34:  8a ea         ldi  r24, 0xAA  ; 170
36:  80 93 60 00   sts  0x0060, r24
3a:  80 e1         ldi  r24, 0x10  ; 16
3c:  97 e2         ldi  r25, 0x27  ; 39

Ich hab mal die Assembleranweisungen auf der Mikrocontroller.net Seite 
durchgelesen, da gibt es auch ein Beispiel:
http://www.mikrocontroller.net/articles/Adressierung

Der Wert 0xAA liegt somit im Register 0x0060.

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leo schrieb:
> Der Wert 0xAA liegt somit im Register 0x0060.
Ab Adresse 0x0060 spricht man nicht mehr von Registern. Das ist RAM.


Gruß Skriptkiddy

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.