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 |
Peter
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ß
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'
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ß
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.