Forum: Mikrocontroller und Digitale Elektronik at90s8535 - auf ram zugreifen


von Leo (Gast)


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?

von Leo (Gast)


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?

von Frickler (Gast)


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:
1
*(volatile unsigned int*)0x1002 = 0xaa;
2
 124:  8a ea         ldi  r24, 0xAA  ; 170
3
 126:  90 e0         ldi  r25, 0x00  ; 0
4
 128:  90 93 03 10   sts  0x1003, r25
5
 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.

von Leo (Gast)


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?

von Leo (Gast)


Angehängte Dateien:

Lesenswert?

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

von Oliver J. (skriptkiddy)


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

von holger (Gast)


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.

von Oliver J. (skriptkiddy)


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.

von Oliver J. (skriptkiddy)


Lesenswert?

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

ldi  r24, 0xAA   --> 8a ea

von holger (Gast)


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;)

von Leo (Gast)


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.

von Leo (Gast)


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.

von Oliver J. (skriptkiddy)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.