Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Was bedeutet extern, global beim PIC
Hi Leutz brauche dringend eine schnelle info
was machen und was bedeuten die Befehle extern, global, res usw also die Pseudobefehle die es sonst och gibt, bei Sprut habe ich nur wenige gefunden, hoffe ihr habt ne andere Seite für mich oder ne gute Beschreibung.
Bitte in Zukunft kein Datum angeben. MfG stegr
Hi, für den Prozessor bedeuten diese Befehle gar nix, das sind Kompiler-definitionen, daher steht beim Sprut nix darüber.
OK schon klar, dass es fürn PIC kein Befehl ist, sorry falsch ausgedrückt.
Benötige aber trotzdem den Befehlssatz halt fürn Assembler LOL
Bin nu unter meinem richtigen Namen On, sorry
Jetzt steh' ich auf dem Schlauch: wenn's nur für den Kompiler und ggf. den Linker ist, gibt's natürlich keine Maschinenbefehle dafür.
Was brauchst du genau ?
mfg
Sorry ich versuchs ma so ok, ich Teile meine Assemblerseiten verschiedenen Unterteilung ein.
Das alles kommt dann in Source File hinein schön geordnet so und nun kommt in einem Prog so etwas vor:
;Externe Variablen
extern DATA_EE_ADDR
extern EEPROM_Daten
extern I2C_EE_pos
extern I2C_EE_bank
extern pin1
extern month
extern day
extern min
extern min10
extern hour
extern hour10
extern output
extern pointstat
;Globale Routinen
global I2C_liste_lesen_datensatz, I2C_liste_schreiben
global data_read_1, data_read_2, data_read_3
global data_read_4, data_read_5
;externe Routinen
extern RS232out
;Variablen
GPR1 UDATA_shr
data_read_1 res 1
data_read_2 res 1
data_read_3 res 1
data_read_4 res 1
data_read_5 res 1
I2C_Listen_routinen code
I2C_liste_lesen_datensatz
btfsc PCdata
goto PCdatenlesen
movlw EE_pos
movwf DATA_EE_ADDR
call EERead
movfw EEPROM_Daten
movwf I2C_EE_pos
movlw EE_bank
movwf DATA_EE_ADDR
call EERead
movfw EEPROM_Daten
movwf I2C_EE_bank
Nun frag ich wie und was hat es mit dem extern, global auf sich ?
Schau, der Compiler (Assembler) fährt ja durch den Source-Code (Text) durch und kommt zu sowas wie "CALL WTLBRNFT". Er braucht an dieser Stelle aber offensichtlich eine Addresse, um den Maschinen Code herzurichten. Wo nimmt er die jetzt her ? Er merkt sich die Stelle und fährt auch durch den restlichen Code durch (Pass 1, vielleicht schon gehört). Findet er nun unterwegs einen Label "WTLBRNFT" , schreibt er sich diese Adresse auf.
Dann fährt er nochmal durch den ganzen Code (Pass 2). Wenn er nun zu dem CALL kommt, geht's ihm gut, denn jetzt hat er ja die Adresse und kann das Statement fix und foxi in Maschinencode übersetzen.
Jetzt hat er EIN Object-Modul fertig. voila.
Ist aber nun "WTLBRNFT" eine Label, der in einer ANDEREN Source des Projektes definiert wird (und daher auch in einem anderen Object-Modul),
geht das obige nicht. Damit der Compiler aber weiß, daß "WTLBRNFT" kein Schreibfehler ist, sondern nur woanders definiert ist, schreibt man "EXTERN WTLBRNFT" rein. Deswegen kann er das statement zwar auch nicht übersetzen (er hat ja die Adresse immer noch nicht), aber er schreibt in das Object Modul eine Nachricht für den Linker, daß "WTLBRNFT" noch eine Adresse braucht und WO im dem Object diese Adresse überall fehlt (kann ja öfters drinstehen)
So.
Jetzt kommt der Linker daher und ist verzweifelt. Er sieht, daß er die Adresse von WTLBRNFT braucht und hat keine Ahnung, in welchen Objectmodule die sein könnte.
Wenn aber der Programmierer, der diese Funktion tatsächlich geschrieben hat, zusätzlich "GLOBAL WTLBRNFT" in die Source geschrieben hat, steht vorne im Objectmodul eine Zeile mit Namen und Adresse von dem Label.
JETZT ist der Linker glücklich, denn überall, wo der Wert fehlt, kann er jetzt was reinschreiben und alle freuen sich.
ALSO: der, der eine Funktion SCHREIBT, kann zusätzlich "GLOBAL" dazu sagen, dann ist die sie für alle anderen Module verwendbar.
Und der, der diese Funktion BRAUCHT, schreibt "EXTERN" dazu.
*schauf* klaro ?
Sauber gemacht Robert, so hat ich mir das ungefair vorgestellt :)
Sau gut erklärt, selbst für die nicht sportlichen Hirne.
Habe im MPLAB IDE unter Hilfe --- Topic... --- Assembler nach einiger Zeit genau dies gefunden :) aber trotz alledem sau gut erklärt, werde mir deine Passage heraus kopieren, für Azubierklärungszwecke. Für meine Azubi nachfolger thx.
KÖnntest du mir vielleicht noch eine kleine Erklärung zu diesem Punkt abgeben ???
GPR1 UDATA_shr
data_read_1 res 1
data_read_2 res 1
data_read_3 res 1
data_read_4 res 1
data_read_5 res 1
Zum udata_shr, _ovr, acs
ich danke dir noch ma
Au weia.
"res 1" heißt mal nur, daß data_read_1 1 Byte lang sein soll.
(REServe 1 Byte)
"udataXXX" sind grundsätzlich daten-Sections mit ein paar Variationen.
Im Gegensatz zu "idata" pfeift sich kein Schwein drum, was da am Anfang drinsteht, das muß du selbst machen (auf NUL setzen z.b). Deswegen haut er dir Dinge wie "DB" etc. auch um die Ohren.
"udata" ist sozusagen das Normale, der Compiler weiß, daß er auf die bankselection aufpassen muß
"udata_acs" sind daten in dem speziellen "Access"-Bereich(nur f. PIC18...)
"udata_shr" sind daten im dem RAM, wo die Bankselection keine Rolle spielt, weil eh alle Banken auf den selben bereich hingreifen.
"udata_ovr" nimmt man, wenn man das GLEICHE Speicherbereich VERSCHIEDEN definieren will.
WO die Schweinebacke des "access" Bereich hat, kann ich nicht sagen, da müßt ich Datashit lesen.
Danke schön, werde bestimmt in meinen 6 Monaten die ich noch habe ab und an, wenn auch selten noch ma en gespräch mit dir haben :) LOL.
Programmiere ein LED-Display also ein komplett eigenes Projekt in einer Firma mit Layouten und Aufbau, Design und Software.
Aha, so richtig all-in-one, respekt.
Nur ein Tip vom Veteranen: Versuch' möglichst genau vom Auftraggeber rauszukriegen, was das Gerät dann tun soll und was nicht.
Sonst hast du jedesmal, wenn du abgeben willst, das Theater mit
"Ah super, sehr hübsch, aber könnten sie nicht ............"
Und wegen diesem "aber" fängst du gleich wieder von vorne an.
Stimmt hast recht :).
Mein Chef wollte neben der C++ Benutzeroberfläche, also das ich einen Text eingebe und über RS232 dann mim PIC verbinde noch was viel besseres, denke das kostet mich aber zu viel Zeit. Er wollte, dass ich eine Phoneboardmatrix so Programmiere, dass ich mit der Tastatur eine SMS shreiben kann, also richtig schön mit Zeit abfrage, wann wurde welche Taste in einerm Zeitraum gedrückt, dann ist es der und der Buchstabe :), OK die auslese Routine habe ich und eigentlich ist es ja nur ein kopieren eine abfrage Schleife, mal schauen was ich da machen kann. Man schreibt sich.
Und zwar habe ich nun 2 Seiten in meinem MPLAB Also 2 ASM Codes
Jede Seite habe ich den ANfang deklariert, so wie es der Compiler wollte mit dem schönen "xxxx code". Nun möchte er die Übertragung trotz alledem nicht starten, sondern er möchte immer wieder Compilieren, hab mir gedacht, da unten steht.
Make: The target "C:\André Welker\M. Display\Programm\Latch\bewegt.o" is up to date.
Make: The target "C:\André Welker\M. Display\Programm\v1.0\ASCII_1.o" is up to date.
Skipping link step. The project contains no linker script.
BUILD FAILED: Thu Feb 17 10:54:53 2005
Kann es nun sein, dass ich, wenn ich mehrer Seiten habe eine Linker Script datei erzeugen muss, wenn ja wie und was steht in Ihr, bin mom am suchen, finde jedoch nichts.
Help->Topics->MPLAB Linker
da mußt du dich durchbeissen, um ein Linkerscript zu erzeugen.
mfg
Hab ich gar net gesehn in der Topic LOL Ok ich bedanke mich :)
also hier ein kleiner Code ausschnitt hoffe weist warum Fehler
Im vy Reg steht H'01'
nun möchte ich es rechts verschieben
rrf vy, 1
nop
bcf STATUS, C
wann shiftet er die 01 auf 80 weiter ????
Er stellt sich auf 00 Carry gesetzt aber er schiebt sie nicht sofort weiter klar ich lösche es dann und vy ist auf 0 und ich bin auf 00 für immer gefangen. Wie bekomme ich es hin, dass er trotz alledem von 01 auf 80 also die 1 um 1 nach rechts verschiebt.
um kein bit im carry zu verlieren, sind zwei befehle nötig
rlf vy, w ; vy wird nicht verändert, aber bit 0 geht ins Carry
rlf vy, f ; jetzt geht bit 0 direkt nach bit 7
[/code]
Ich danke :) war ja klar :) nachdem man es weiß :)
EinsamerUser
22.03.2005, 16:29
I2C_Listen_routinen code
I2C_liste_lesen_datensatz
btfsc PCdata
goto PCdatenlesen
movlw EE_pos
movwf DATA_EE_ADDR
...
wer hat dir eigentlich erlaubt nen Teil aus meinem Programmcode zu veröffentlichen??? Du weist das du unterschrieben hast keine Firmendaten zu veröffentlichen?? [-X
Ach übrigens diese Sache:
"res 1" heißt mal nur, daß data_read_1 1 Byte lang sein soll.
(REServe 1 Byte)
"udataXXX" sind grundsätzlich daten-Sections mit ein paar Variationen.
Im Gegensatz zu "idata" pfeift sich kein Schwein drum, was da am Anfang drinsteht, das muß du selbst machen (auf NUL setzen z.b). Deswegen haut er dir Dinge wie "DB" etc. auch um die Ohren.
"udata" ist sozusagen das Normale, der Compiler weiß, daß er auf die bankselection aufpassen muß
"udata_acs" sind daten in dem speziellen "Access"-Bereich(nur f. PIC18...)
"udata_shr" sind daten im dem RAM, wo die Bankselection keine Rolle spielt, weil eh alle Banken auf den selben bereich hingreifen.
"udata_ovr" nimmt man, wenn man das GLEICHE Speicherbereich VERSCHIEDEN definieren will.
Da gibts ein schönes Buch von Microchip. Nennt sich "MPASM USER'S GUIDE with MPLINK and MPLIB" müsste ein Arbeitskollege von dir haben!!
:mrgreen:
Da gibts ein schönes Buch von Microchip. Nennt sich "MPASM USER'S GUIDE with MPLINK and MPLIB" müsste ein Arbeitskollege von dir haben!!
:mrgreen:
Ehrlich ? Was sie nicht sagen !
EinsamerUser
22.03.2005, 17:35
EinsamerUser hat folgendes geschrieben::
Da gibts ein schönes Buch von Microchip. Nennt sich "MPASM USER'S GUIDE with MPLINK and MPLIB" müsste ein Arbeitskollege von dir haben!!
Ehrlich ? Was sie nicht sagen !
=; Das war nicht an dich.....wollte AEWE nur auf das Buch aufmerksam machen! Damit er sowas mal liest bzw. überhaupt mal darein schaut. ;-)
@einsamerUser: Ok, alles klar.
Meine obigen Weisheiten stammen nichtmal aus Büchern, sondern ganz einfach aus dem Help.
Ich weiß, daß es für geübte (geplagte) Dauer-Datasheet-Leser schwer verständlich ist, wie jemand andere ohne sowas unter dem Kopfkissen überhaupt schlafen kann. Das dauert halt ein Weilchen, bis man ein richtiger Cyber-Schamane ist.
@PicNick:
naja um ehrlich zu sein hab ich diese Kenntniss auch nicht aus einem Buch oder aus dem Help, sondern direkt von einem "Field Applications Engineer" direkt von Microchip *g* ;-)
Naja das Datasheet zähle ich eigentlich mit zum "Help", da zumindest die von Microchip eigentlich ziemlich gut strukturiert und sämtliche Funktionen/Module gut erklärt sind(Im gegensatz zu manch anderen Datasheets).
Allerdings muss ich echt sagen deine Erklärung für GLOBAL und EXTERN ist echt gut und kreativ!! *g* :lol:
:mrgreen: danke, ich tu', was ich kann
(andere können, was sie tun) :oops:
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.