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ß
> 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
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.
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ß
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ß
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.
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
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.
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).
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
>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ß
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
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.
#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ß
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.
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
@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ß