mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RAM-Bereich im PIC 16F84A reservieren


Autor: Dieter Kohtz (dikomoe) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, Gemeinde,

bei Sprut findet sich zum Thema Speicher-Reservieung folgendes Beispiel:

Beispiel:         ORG    0x20
 Wert    RES    1       ; Wert bedeutet ab sofort 0x20, Wert ist eine 1 
Byte große  Variable
 Pointer RES    3       ; Wert bedeutet ab sofort 0x21, Pointer kann als 
3 Byte große  Variable dienen
 Temp    RES    1       ; Wert bedeutet ab sofort 0x24

         MOVLW  Wert    ; W wird mit dem Zahlenwert 0x20 beschrieben
         MOVWF  Temp    ; nun wird der Inhalt von W in die Zelle mit der 
Adresse 0x24 kopiert

Wenn ich es anwende, werden die entsprechende Zellen im Programmspeicher 
und nicht im RAM reserviert. Wie stelle ich es an, eine bestimmte Zahl 
von Zellen im RAM zu reservieren?

Danke im voraus.
Dieter

Autor: Teo Derix (teoderix)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Mit Speicher sind die File-Register gemeint!
RAM reserviert man im allgemeinen mit einer Variable.
Da du aber in Assembler programmierst, ist das alleinig deine Aufgabe, 
während des Programmierens dafür zu sorgen, das DU in nicht anderweitig 
verwendest.

Beschreibe doch mal was du machen willst. Dann lassen sich 
Missverständnisse schneller ausräumen.

Autor: --- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cblock  20

Autor: --- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
endc

Autor: Dieter Kohtz (dikomoe) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
--- schrieb:
> cblock  20

--- schrieb:
> endc

Hallo, Gast,

20h ist wohl die Anfangsadresse, aber wie definiere ich den zu 
reservierenden Bereich?

Autor: --- (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
...\MPASM Suite\hlpMPASMAsm.chm -> Directives

Zu ploet oder zu faul?

Autor: Thomas Elger (picalic)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Hallo Dieter,

im Prinzip hast Du zwei sinnvolle Möglichkeiten:
- A: für Assemblierung im "absolute" Mode
    CBLOCK 0x20
var1:1            ;Variable belegt ein Byte
var2              ;1 Byte ist Default, ":1" kann auch weggelassen werden
var3:3            ;reserviert drei Bytes
var4:0            ;reserviert kein Byte,
var5:2            ;var4 und var5 haben also die gleiche Adresse
    ENDC

- B: für Projekte mit relozierbaren Adressen (die entgültige Adresse 
legt dann der Linker fest, falls keine Adresse der Sektion angegeben 
ist)
DATA0 udata 0x20
var1 RES 1            ;Variable belegt ein Byte
var2 RES 1            
var3 RES 3            ;reserviert drei Bytes
var4                  ;reserviert kein Byte,
var5 RES 2            ;var4 und var5 haben also die gleiche Adresse

: Bearbeitet durch User
Autor: Dieter Kohtz (dikomoe) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Euch Allen

Alle Unklarheiten beseitigt. (Da muss Sprut wohl ein Fehler unterlaufen 
sein. In einem seiner Lernbeispiele ist die Methode mit cblock/endc 
erklärt.)

Autor: W.S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieter Kohtz (dikomoe) schrieb:
> Da muss Sprut wohl ein Fehler unterlaufen sein.

Nicht unbedingt. Immerhin hat das alles seine Geschichte von so rund 25 
Jahren und mehr. Vermutlich bezieht sich bei Sprut da auf einen 
mittlerweile veralteten Stand der Technik - und das wär's dann.

Ich hatte mich vor Urzeiten über die Erbärmlichkeit des damaligen 
PIC-Assemblers PICALC schwarz geärgert und mir deshalb meinen eigenen 
Assembler geschrieben.
Und der beherrscht Segmente, wie es sich gehört:
            SEG RAM
            ORG 20h
Karlheinz:  DS  1
aFloat:     DS  4

            ORG     70h
RetteW:     DS      1
RetteFSR:   DS      1
RetteFlags: DS      1


            SEG CODE 
            ORG      2007h
Config:     DATA     11111100110010b
            ORG      2100h
MyEEProm:   .....

          ORG 0
          CLRF    Status
          CLRF    PCLATH
          GOTO    Start

          ORG     4
Interrupt:
          MOVWF    RetteW         ; W retten
          SWAPF    Status,W       ; Flags in W holen
  ...usw.

Nun hab ich den MicroChip-Assembler seitdem nicht weiter verfolgt, aber 
inzwischen kennt der gewiß auch Segmente. Also guck mal in dessen 
Dokumentation nach Segmenten.

W.S.

Autor: Volker SK (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieter Kohtz (dikomoe) schrieb:
> Alle Unklarheiten beseitigt. (Da muss Sprut wohl ein Fehler unterlaufen
> sein. In einem seiner Lernbeispiele ist die Methode mit cblock/endc
> erklärt.)

Irgendwie geht hier was total durcheinander. "cblock" ist eine Anweisung 
in der Programmierung im (alten) "absolute mode". "ORG" ist aus dem 
moderneren "relocatable mode" und bezieht sich allerdings auf 
Programmspeicher (ROM).

Das Beispiel von Thomas Elger (-B) und natürlich der User's Guide (z.B. 
4.62 udata - BEGIN AN OBJECT FILE UNINITIALIZED DATA SECTION) zeigen wie 
es aktuell (relocatable) gemacht wird, falls wirklich die Notwendigkeit 
bestehen sollte, dass Variablen an bestimmten Adressen liegen müssen.

Autor: Volker SK (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Teo D. schrieb:
> Da du aber in Assembler programmierst, ist das alleinig deine Aufgabe,
> während des Programmierens dafür zu sorgen, das DU in nicht anderweitig
> verwendest.

Das ist schon sehr lange nicht mehr so ;-)

Beitrag #5016985 wurde vom Autor gelöscht.
Autor: Dieter Kohtz (dikomoe) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Volker S. schrieb:
> Irgendwie geht hier was total durcheinander.
Volker S. schrieb:
> Programmierung im (alten) "absolute mode".

Über diesen mode bin ich bisher nicht hinausgekommen und habe auch nicht 
die Absicht, es zu tun.

Nochmals Danke für Eure Beiträge.
Dieter

Autor: (º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Über diesen mode bin ich bisher nicht hinausgekommen und habe auch nicht
> die Absicht, es zu tun.

Solang es bei Assembler pur bleibt, sei es dir unbenommen.
Aber lass mal, schon der Bequemlichkeit wegen, ein paar C-Objekte
dazukommen. Da wird sich deine Meinung schon noch aendern.

Autor: vloki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieter Kohtz (dikomoe) schrieb:
> Über diesen mode bin ich bisher nicht hinausgekommen und habe auch nicht
> die Absicht, es zu tun.

Geht bis jetzt ja auch immer noch "absolut".

(((((
In MPLABX kann man  anscheinend schon Projekte mit mehreren Assembler 
Dateien nur noch "relocatable" anlegen.
Der Support für absolut wird wohl irgendwann gar nicht mehr da sein. 
Wozu auch beides unterstützen wenn der "alte" Stil nichts hat, was 
relocatable nicht genauso möglich is. Im Programmcode ändert sich 
wirklich sehr wenig. Die Schlüsselworte CODE -> ORG und CBLOCK -> (z.B.) 
udata.
)))))

Autor: Volker SK (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, weicht jetzt etwas vom Thema ab, aber es würde mich echt mal 
interessieren, wann der Linker MPLINK kam, der relocatable Code 
ermöglichte.
Vor ~20 Jahren, oder gibt es den schon länger?

Hier 
http://datasheetarchive.kr/files/microchip/10/tool... 
sind schon relocatable Beispiele von 1998.

Autor: Thomas Elger (picalic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vloki schrieb:
> Wozu auch beides unterstützen wenn der "alte" Stil nichts hat, was
> relocatable nicht genauso möglich is.

Auch wenn ich den Vorteil von "relocable" durchaus sehe und inzwischen 
neue Projekte nicht mehr "absolute" mache, ist der alte absolute Mode 
manchmal doch weniger "zickig", was das Herumrechnen mit Adressen 
betrifft. Beispiel hier:
Beitrag "MPLAB - Makro für PC-relative Addresse"

Autor: Thomas Elger (picalic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vloki schrieb:
> Der Support für absolut wird wohl irgendwann gar nicht mehr da sein.

Na, ich hoffe aber, daß CBLOCK erhalten bleibt - das benutze ich nämlich 
munter auch bei "relocatable" Code! Wie soll man denn sonst sinnvoll 
Offset-Adressen für eine Variablen-Struktur erzeugen?

z.B. sowas:
#define NSERVOS 5   ;Anzahl Servos

;Struktur für Servo-Daten:
  CBLOCK 0
flags             ;Steuer- und Statusbits
currentpw: 2      ;aktuelle Stellung
middle: 2         ;Mitte
leftlimit:2
rightlimit:2
SIZESERVO:0       ;Länge der Struktur
  ENDC

LINEAR0  udata
servodata res NSERVOS*SIZESERVO        ;Array mit Servodaten

: Bearbeitet durch User
Autor: Dieter Kohtz (dikomoe) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas E. schrieb:
> im Prinzip hast Du zwei sinnvolle Möglichkeiten:
> - A: für Assemblierung im "absolute" Mode    CBLOCK 0x20
> var1:1            ;Variable belegt ein Byte
> var2              ;1 Byte ist Default, ":1" kann auch weggelassen werden
> var3:3            ;reserviert drei Bytes
> var4:0            ;reserviert kein Byte,
> var5:2            ;var4 und var5 haben also die gleiche Adresse
>     ENDC

Liebe Leute,
der obige Beitrag war der einzige, der mir wirklich geholfen hat.
Mehr brauche ich nicht, selbst wenn es relocatable wäre. Ich denke es 
ist an der Zeit, den thread zu beenden, oder?
Beste Grüße
Dieter

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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.