(AVR Studio) Zusammenhang List File und BYTE Reservierung im .DSEG

Einstein-de

Neues Mitglied
10. Okt. 2010
3
0
0
Sprachen
Hallo zusammen,

ich bin neu hier und befasse mich seit kurzen mit der Programmierung von
Mikrocontroller in Assembler.

Jetzt bin ich auf ein Problem gestostoßen wo ich nicht mehr weiter weiß
und auch im Internet nichts wirklich dazu finde.

Wenn ich in AVR Studio BYTE's im .DSEG Speicher wird dies doch in der
List-Datei verschlüsselt dargestellt.

Genauso wie wenn ich Dateien im .CSEG Speicher oder ??


Jetzt die Frage, wie hängt das zusammen wie ist diese "Verschlüsselung"
zu verstehen gibt es da ein "Muster"??


Bsp.

.DSEG
.BYTE1
.BYTE2
.BYTE2 ;Reservierung von BYTE's im DESG

.CSEG
BYTE2
BYTE1
BYTE1 ;Reservierung von BYTE's im CSEG


.DESEG
BYTE1
BYTE1
BYTE2 ;Erneute Reservierung von BYTE's im DESG

Wie wird dieses Beispiel in der List dargestellt, wie hängt es zusammen
und was BEDEUTE DIESE "BEZEICHNUNG".

Vielen Dank im Voraus für eure Hilfe

MFG Tom
 
Hallo Tom,

willkommen in unserem Forum.

Im AVR gibt es drei Speicherbereiche,
  • das Code Segment (Programmspeicher Flash),
  • das Data Segment (Datenspeicher/Arbeitsspeicher SRAM)
  • das Eeprom Segment (Datenspeicher Eeprom)
.CSEG, .DSEG und .ESEG sind Anweisungen an den Assembler, die ihm sagen, wo er Daten abzulegen hat oder wo er Speicherbereiche erstellen soll.

Nach .CSEG kommt dein Programm oder auch konstante Daten wie zum Beispiel eine Codetabelle BCD-nach-Siebensegmentanzeige (.db -> DefineByte).

Nach .DSEG definierst du Speicherbereiche für Variablen im SRAM, Beispiel

.DSEG
MeineVariable: .byte 1 ; Die Variable ist ein Byte gross. Zugriff mit sts, lds, ld, st usw.
MeineVariable2: .byte 2; Diese variable ist 2 Byte gross

Im Listfile sieht es dann so aus:
Code:
.DSEG
000060           MeineVariable:  .byte 1  ; Die Variable ist ein Byte gross. Zugriff mit sts, lds, ld, st usw.
000061           MeineVariable2:  .byte 2; Diese variable ist 2 Byte gross
Im Eeprom kannst du auch Daten ablegen, Beispiel:

Code:
.ESEG
.org 0x12  ; hier kannst du den Adresszeiger optional setzen, die Daten werden also ab Adresse 0x12 abgelegt (geht auch bei .CSEG und .DSEG)
.db 0x20, 0x60

Im List File sieht es dann so aus:

Code:
.ESEG
 .org 0x12  ; hier kannst du den Adresszeiger optional setzen, die Daten werden also ab Adresse 0x12 abgelegt (geht auch bei .CSEG und .DSEG)
000012 20
000013 60        .db 0x20, 0x60


Im List File siehst du immer an der Assembleranweisung, zu welchem Segment Daten oder Labels gehören. Wird kein Eeprom Segment angegeben, erzeugt der Assembler kein .eep File.

Mit .ORG kannst du im entsprechenden Segment den Adresszeiger definieren, also den Startpunkt von Daten, Code oder Labels festlegen. Hier musst du natürlich genau wissen, was du machst ;)

Schau dir auch einmal die Hilfe "Assembler Help" im AVR Studio unter dem Menüpunkt Help an und suche auch einmal im Bereich FAQ des Forums nach Assembler-Grundlagen.


Vielleicht hilft dir das zum Verständnis schon mal weiter.

Grüße,
Dirk
 
Hi Danke für deine schnelle und kompetente Antwort, hat mich auch schon wirklich weiter gebracht.

Aber warum Speichert die .List Datei dass in z.b

#
000060 MeineVariable: .byte 1
#
000061 MeineVariable2: .byte 2

ist das 000060 wegen den unterschiedlichen MC ??
und warum erst ab 60 rein von der Logig her müsste es ja mit 000001
Anfangen wenn man es so sieht.

Was ist dann also mit 0 bis 60 ?? wir da nicht reingespeichter??

MFG

Tom
 
Hi Tom,

vielleicht erklärt es das Bild im Anhang besser (Beispiel ATmega128). Ab Adresse 0x60 fängt das interen SRAM an, zuvor kommen noch die 32 Arbeitsregister und der "untere" IO-Register-Bereich.

Ein bisschen verwirrend ist der "obere" IO-Register-Bereich, der fängt nämlich auch ab 0x60 an. Der Bereich ist nicht in allen Mikrocontrollern vorhanden, nur in den "größeren".

Dirk
 

Anhänge

  • Memory.png
    Memory.png
    29,7 KB · Aufrufe: 9
Aha

Hallo,

danke nochmals für die Antwort.

Ich habe es jetzt soweit so verstanden das ich im sram die ersten 96 Byte schon fest vergeben sind für das Register und die I/O Register.
Und danach kann ich jetzt erste meine Bytes Reservieren da hier die ersten freien Bytes Reservierbar sind.

Wenn ich jetzt die Bytes in denn EEPROM oder Flashspeier Speicher hat das nichts damit zu tuhen.

Jetzt wollte ich mal ein Programm programmieren das mir die unterschiedlichen orte mal in der list Datei ausgibt, funktioniert nur nicht :( .





;Versuch Speicherdirektiven
.INCLUDE "m16def.inc"
.LIST ;Erzeuge Listening

.CSEG
Zahl1: .BYTE 1 ;Hier wird ein Byte in denn CSEG gespeichert
Zahl2: .BYTE 1 ;Hier noch eins
Ergebnis1: .BYTE 2 ;Und hier 2Byte

.DSEG
Zahl3: .BYTE 1 ;Hier wird ein Byte in denn DSEG gespeichert
Zahl4: .BYTE 1 ;Hier noch eins
Ergebnis2: .BYTE 2 ;Und hier 2Byte

.ESEG
Zahl5: .BYTE 1 ;Hier wird ein Byte in den ESEG gespeicher
Zahl6: .BYTE 1 ;Hier noch eins
Ergebnis3: .BYTE 2 ;Und hier 2Byte

.CSEG
Zahl7: .BYTE 1 ;Hier wird erneut ein Byte in den CSEG gespeicher
Zahl8: .BYTE 1 ;Hier noch eins
Ergebnis4: .BYTE 2 ;Und hier 2Byte



.CSEG
RJMP Start
.ORG $2A
Start: LDI r16,5
STS Zahl1,r16


Wenn das Programm laufen würde könnte ich mir das ganze in der list Datei ja selbst mal anschauen.

Vielen Dank


Tom
 
Hi
Ich habe es jetzt soweit so verstanden das ich im sram die ersten 96 Byte schon fest vergeben sind für das Register und die I/O Register.
Und danach kann ich jetzt erste meine Bytes Reservieren da hier die ersten freien Bytes Reservierbar sind.
Nicht die ersten Byte, die ersten Adressen ! Das bedeutet, dein SRam ist etwas höher adressiert.
Um z.B. eine Adresse einer Variablen zu lesen, kannst du das X- Y- oder Z-Register benutzen. (bei einem Atmega8)
Lies dir mal den Beitrag im FAQ : "keine Angst vor Assembler" durch. Ich glaub, da habe ich den Zugriff auf die Adressen der Variablen ausgiebig erklärt.
Ergänzend möchte ich darauf hinweisen, das der Stack ebenfalls den SRam benutzt, nur entgegen deiner Variablenliste, also von oben nach unten. Damit es nicht zum Überschreiben der Bereiche durch Variablenzuweisungen oder Stack kommt, muß entsprechend Platz gelassen werden, d. h. du hast nicht (!) den gesamten SRam für Variablen zur Verfügung.
Gruß oldmax
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)