Forum: Mikrocontroller und Digitale Elektronik Wertezuweisung


von juppi (Gast)


Lesenswert?

Hallo

MpLab 8.46
Pic12f675

NameSpeicherAdresse    equ  H'40'
DatenKonstante2       equ  H'40'

Seit längerer Zeit wieder mal Pic.

Jetzt mußte ich feststellen das die Wertezuweisung
scheinbar nicht eindeutig ist.

im.Beispiel soll die Datenkonstant2 als wert Hex40 deklariert werden.
Danach auf die Speicherzellen ADR NameSpeicherAdresse Hex40 geladen 
werden.

Bei verschiedenen Darstellungen der Zuweisung wird der Wert 
DatenKonstante2
als SpeicherAdresse im File Register angezeigt.

Läuft da was nicht richtig,oder sehe ich nicht richtig?

Gruß

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> im Beispiel soll die Datenkonstante2 als Wert Hex40 deklariert werden.

DatenKonstante2       equ  40H

oder

DatenKonstante2       equ  0x40

> Danach auf die Speicherzellen ADR NameSpeicherAdresse Hex40 geladen
> werden.

NameSpeicherAdresse   equ  40H

Anwendung als Beispiel (nicht geklärt ob dein PIC12 die Befehle MOVLW 
und MOVWF kennt so wie der PIC16). Die Schreibweise in eckigen Klammern 
[irgendwas] bedeutet "Inhalt von Irgendwas".

MOVLW DatenKonstante2     ; [W] = 0x40
MOVWF NameSpeicherAdresse ; [NameSpeicherAdresse] = 0x40

s. Seite 2 und 18 in
http://www.ece.vt.edu/cel/ece2504/PIC_Guide_v1.5.pdf

von Stefan B. (stefan) Benutzerseite


Lesenswert?

ADD: Beim Debuggen und Nachvollziehen kannst du dir das Leben einfacher 
machen, wenn du unterschiedliche Werte benutzt ;-)

DatenKonstante2       equ  23H
NameSpeicherAdresse   equ  40H

Wenn der Code dann macht, was du willst, dann ändere DatenKonstante2 
zurück auf 40H.

von juppi (Gast)


Lesenswert?

Hallo

Mit den Befehlen gibt es keine Probleme.


NameSpeicherAdresse   equ  H'40'
DatenKonstante2       equ  H'40'

Bei dieser Schreibweise,woher weiss der Compiler
was Konstante ist oder Speicheradresse?

Gruß

von juppi (Gast)


Lesenswert?

Hallo
>Wenn der Code dann macht, was du willst, dann ändere DatenKonstante2
>zurück auf 40H.

Das hatte ich schon versucht,scheint nichts besseres zu geben.

Gruß

von Ohforf S. (ohforf)


Lesenswert?

juppi schrieb:
> Bei dieser Schreibweise,woher weiss der Compiler
> was Konstante ist oder Speicheradresse?

Der Assembler weiss garnix.
Mit dem "equ" schreibst du nicht ins RAM.

von Karl H. (kbuchegg)


Lesenswert?

Wobei die wichtigste Frage für mich immer noch ist:
Was willst du eigentlich machen?

Aus dem ganzen Gestammel geht das für mich immer noch nicht hervor. Ich 
denke allerdings dass du die Sache falsch angehst.

Meine Vermutung ist, dass du mit den equ festlegen willst, wo im 
Speicher welcher Wert abzulegen ist. Das müsste IMHO in etwa so 
aussehen, wobei ich nicht weiß, wie die Syntax bei deinem Assembler 
aussehen muss


NameSpeicherAdresse    equ  H'40'
DatenKonstante2       equ  H'40'


org  NameSpeicherAdresse
     db  DatenKonstante2


aber das ist alles nur eine Vermutung, basierend auf dem was ich denke 
was du machen willst

von Stefan B. (stefan) Benutzerseite


Lesenswert?

juppi schrieb:

> NameSpeicherAdresse   equ  H'40'
> DatenKonstante2       equ  H'40'
>
> Bei dieser Schreibweise,woher weiss der Compiler
> was Konstante ist oder Speicheradresse?

Weiss er nicht. Hier werden nur symbolische Namen für Werte (hier zwei 
identische) definiert. Wenn die symbolischen Namen dann benutzt werden, 
geht die Funktion/Bedeutung aus dem Codestück hervor.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Karl heinz Buchegger schrieb:

> NameSpeicherAdresse    equ  H'40'
> DatenKonstante2       equ  H'40'
>
>
> org  NameSpeicherAdresse
>      db  DatenKonstante2

Das ist die "statische" Schreibweise. Hier wird bereits zur 
Assemblierzeit der Wert 40H (DatenKonstante2) in der Speicherstelle 
40H (NameSpeicherAdresse) hinterlegt.

Meine Schreibweise oben (MOV...) zeigt die "dynamische" Methode. Dort 
wird zur Laufzeit des Programms der Wert 40H (DatenKonstante2) ins 
Arbeitsregister W geladen und vom Register W aus in die Speicherstelle 
40H (NameSpeicherAdresse).

von DerElektrischeReiter (Gast)


Lesenswert?

equ reserviert nix. Da wird nur einer Variablem im Assembler (=Programm 
das die Übersetzung z.B. in ein *.hex file macht) ein Wert zugewiesen. 
der equ lamder so erstmal nicht in deinem PIC.

RES reserviert was.

cu

von Lehrmann M. (ubimbo)


Lesenswert?

DerElektrischeReiter schrieb:
> RES reserviert was.

Hab ich ja beim PIC noch nie gehört ...

von juppi (Gast)


Lesenswert?

>NameSpeicherAdresse   equ  H'40'
>DatenKonstante2       equ  H'40'

NameSpeicherAdresse ist Ramspeicherstelle
DatenKonstante2 sollte eine Konstante sein welche keinen Ram benutzt,
dachte ich jedenfalls.
Werde mit Org die Konstanten festlegen und dann Auslesen.
(mit RetlW.)
DatenKonstante2       equ  H'40'
Bei dieser Variante kann ich aber schöner mit Movlw  DatenKonstante2 .
lesen.
Wollte mal wissen ob es einen schon untergekommen ist?

@Hallo Karl Heinz
>Aus dem ganzen Gestammel geht das für mich immer noch nicht hervor. Ich
>denke allerdings dass du die Sache falsch angehst.

Wenn du so ran gehst ,dann hasst du nicht gedacht.
Du handelst wie ein Altes "Knetchweib" und das ist noch harmlos.
Du solltest auch einmal deine Handlungsweise überdenken!

Danke für die Antworten.

Gruß

von Peter D. (peda)


Lesenswert?

EQU definiert ein Symbol, d.h. weist einer Zahl einen Namen zu.
Dieser Name darf dann überall verwendet werden, wo eine Zahl verwendet 
werden kann.
Der Assembler ersetzt dann einfach wieder den Namen durch die definierte 
Zahl.

Erst der Befehl, der diese Zahl verwendet, bestimmt ihre Bedeutung 
(Adresse, Operand, Konstante usw.).

Ich kenne den PIC nicht, daher hier mal als Beispiel 8051-Code
Beim 8051 sind mit einer EQU-Anweisung unter anderem folgende Befehle 
erlaubt:
1
mumpitz equ 080h
2
3
jmp     mumpitz                 ; springe zu Code-Adresse 80h
4
add     a, mumpitz              ; addiere a + 80h
5
mov     mumpitz, #mumpitz       ; lade Daten-Adresse 80h mit dem Wert 80h
6
db      mumpitz                 ; definiere Byte 80h
7
setb    mumpitz                 ; setze Bit 80h
8
cjne    r7, #mumpitz, mumpitz   ; vergleiche R7 mit 80h, springe zu 80h, wenn unleich


Peter

von Karl H. (kbuchegg)


Lesenswert?

juppi schrieb:

> @Hallo Karl Heinz
>>Aus dem ganzen Gestammel geht das für mich immer noch nicht hervor. Ich
>>denke allerdings dass du die Sache falsch angehst.
>
> Wenn du so ran gehst ,dann hasst du nicht gedacht.
> Du handelst wie ein Altes "Knetchweib" und das ist noch harmlos.
> Du solltest auch einmal deine Handlungsweise überdenken!

Hmm.
Und ich dachte immer, wenn mehrere Antworter nicht verstanden haben, 
worauf eine Frage abzielt, dass dann unter Umständen ganz einfach die 
Fragestellung schlecht formuliert ist.

Wie man sich doch täuschen kann.

von juppi (Gast)


Lesenswert?

#define    Frequenz    d'20'
#define    RamEnde      H'5F'
#define    EEDiverenz  H'10'
#define    geschw_adr  1  ;adresse de ee_speichers 1
#define    wartezeit1_adr   0  ;wartezeit 1-255 sec im ee_p speicher 0
#define    frequenz_adr  2  ;eespeicher 2
#define    CONFIG_ADDR  1  ;adresse 1 des proms

#define    DATIN  H'05'    ;bit fuer serinabfrage
#define    TAKT  H'02'    ;taktausgabe  4049 + 4021
#define    LADE  H'04'    ;ladebitausgabe 4049 + 4021
#define    DAT  H'01'  ;Datausg 4049 + 4021

So werden z.B Konstanten definiert.(mußnoch genau testen)
Habe ich aber vor 2 Jahren in den Beispielen nicht gesehen.


ABCDA____   equ    H'42'  soll Konstante sein
ABCDE____   equ    H'42'  soll Speicherstelle sein

Fälschlicherweise kann man Konstanten auch so Definieren??!!
Wenn ich so eine Konstante ABCDA definiere wird sie ins File Register 
eingetragen.
Will ich jetzt den Speicherplatz ABCDE definieren geht es nicht,
da schon von ABCDA besetzt.
Wenn jetzt in dem Namen der Letzte Buchstabe (A mit E) getauscht wird
geht alles.
Es wird immer der Name eingetragen (Sichtbar im File Register)
welcher Alphabetisch weiter am Anfang steht.
Man sieht den Eintrag.

@Peter Dannegger
Die Anwendung der Definationen und Zuweisungen sind doch kein Problem.
Mir geht es um den Syntax.
@Karl heinz Buchegger
Wenn du die Frage nicht verstehen willst,dann Antworte nicht
oder höflicher.
Du würdest sagen eine ausgekotzte Antwort.;-)))

P.S.
DATIN  H'05'    ;bit fuer serinabfrage
TAKT  H'02'    ;taktausgabe  4049 + 4021
LADE  H'04'    ;ladebitausgabe 4049 + 4021
DAT  H'01'  ;Datausg 4049 + 4021

das geht auch,sind Konstanten.

Gruß

von juppi (Gast)


Lesenswert?

P.S.
>DATIN  H'05'    ;bit fuer serinabfrage
>TAKT  H'02'    ;taktausgabe  4049 + 4021
>LADE  H'04'    ;ladebitausgabe 4049 + 4021
>DAT   H'01'  ;Datausg 4049 + 4021
Fehler

DATIN equ H'05'    ;bit fuer serinabfrage
>TAKT equ H'02'    ;taktausgabe  4049 + 4021
>LADE equ H'04'    ;ladebitausgabe 4049 + 4021
>DAT  equ H'01'  ;Datausg 4049 + 4021
geht

besser
#define    DATIN  H'05'

von Stefan B. (stefan) Benutzerseite


Lesenswert?

juppi schrieb:

> #define    LADE  H'04'    ;ladebitausgabe 4049 + 4021
> ABCDA____   equ    H'42'  soll Konstante sein

Beides definiert symbolische Namen für Hexadezimalwerte (LADE und 
ABCDA____).

Je nach den verwendeten Tools funktioniert die eine Schreibweise oder 
die andere oder beide. Ein C-Präprozessor kommt mit #define zurecht; ein 
Assembler mit EQU. Genaueres steht in dem Handbuch der verwendeten 
Tools.

Beispielsweise kann es möglich sein, dass man seinen Assemblerquelltext 
zuerst durch den C-Präprozessor behandelt und danach dem Assembler 
zuführt. In diesem Fall kann man im Quelltext auch #define Anweisungen 
benutzen. Das ist eine typische Arbeitsweise für Assemblercode im 
AVR-GCC.

> Fälschlicherweise kann man Konstanten auch so Definieren??!!

Deine Schreibweise definiert was anderes als echte Konstanten. Unter 
einer Konstante verstehe ich die Werte H'42' und H'04', wenn diese als 
Daten im Programm abgelegt bzw. benutzt werden. Die Art der Benutzung 
macht einen Wert zu einer Konstanten (oder etwas anderem). Wie du die 
symbolischen Namen benutzt, sieht man mangels Quelltext nicht.

> Wenn ich so eine Konstante ABCDA definiere wird sie ins File Register
> eingetragen.
> Will ich jetzt den Speicherplatz ABCDE definieren geht es nicht,
> da schon von ABCDA besetzt.
> Wenn jetzt in dem Namen der Letzte Buchstabe (A mit E) getauscht wird
> geht alles.
> Es wird immer der Name eingetragen (Sichtbar im File Register)
> welcher Alphabetisch weiter am Anfang steht.
> Man sieht den Eintrag.

Das kann ein Problem der IDE bzw. des Debuggers sein, der sich in der 
Darstellung bei einem auftretenden Wert (H'42') einen symbolischen Namen 
dafür im Quelltext sucht und den ersten gefundenen nimmt (ABCDA____).

IMHO ist das mehr ein Schönheitsfehler beim Debuggen als ein wirkliches 
Problem. Um das genauer zu betrachten bzw. der Spekulation nachzugehen, 
bräuchte man einen Quelltext und einen Screenshot des Problems beim 
Debuggen.

von Peter D. (peda)


Lesenswert?

juppi schrieb:
> So werden z.B Konstanten definiert.(mußnoch genau testen)

Nein.

#define bedeutet, da ist ein C-Präprozessor am Werke.
#define ist noch mehr unbestimmt als EQU.

EQU ersetzt immer nur Zahlen.

#define ersetzt einen Text durch einen anderen Text.
Der Text kann eine Zahl sein, muß aber nicht.
Zusätzlich kann #define auch Argumente ersetzen.


Per EQU definierte Symbole kann man sich im Listing ausgeben lassen mit 
ihrem Wert. Das ist sinnvoll, wenn der Wert keine Zahl ist, sondern eine 
konstante Berechnung z.B. mit einer anderen EQU-Anweisung.

#define sind im Listing nicht mehr sichtbar, sie werden eben durch den 
Text ersetzt.


Peter

von juppi (Gast)


Lesenswert?

@Peter
> So werden z.B Konstanten definiert.(mußnoch genau testen)

>Nein.

Wenn ich  mit #define arbeite kann ich meine Werte definieren.
Läuft!
Definiere ich etwas Anderes wird dies beim Test erkannt.

>#define bedeutet, da ist ein C-Präprozessor am Werke.
>#define ist noch mehr unbestimmt als EQU.

>EQU ersetzt immer nur Zahlen.

richtig!

Mit Equ kann ich aber schon gesetzte  Namen,
später durch einen anderen Überschreiben wenn ich die gleiche ADr
benutze und der neue Namen in der alphabetischen Wertigkeit
vor dem Alten Wert steht.

Wenn man es kennt ist alles o.k.,
sonst kann es zu eigenartigen Fehlverhalten kommen.

Am besten mit MPLab testen,ist schlecht erklärbar.

Gruß

von DerElektrischeReiter (Gast)


Lesenswert?

Zum Thema RES:

http://ww1.microchip.com/downloads/en/devicedoc/33014j.pdf

Seite 107.

Vielleicht generell für diese Diskussion ganz hilfreich ;)

cu

p.s. #define gibbs nicht nur in c, sondern auch im PIC-Assembler

von spess53 (Gast)


Lesenswert?

Hi

>#define gibbs nicht nur in c, sondern auch im PIC-Assembler

Der AVR-Assembler2 auch.

MfG Spess

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.