Wie mit unterschiedlichen Datein in umgehen

Begonnen von ^Cobra, 18.01.2024, 17:35:10 CET

Vorheriges Thema - Nächstes Thema

^Cobra

Hallo zusammen,
ich habe schon immer mir es sehr schwer getan mein Projekt in mehre Dateien auf zu teilen.
Mein Problem ist das es sich dann einfach nicht mehr übersetzen lässt.

Beispiel in Asm:
Wait250
	movlw	D'250'		; 250 ms Pause
	movwf	loops

; Warteschleife, Anzahl der Millisekunden steht in loops
wai
	movlw   0,001/1(Fcyc/4)*20 ;.110           ; Zeitkonstante für 1ms berechnung 0,001ms/(1/(Fcyc/4)*SchleifenZyklen)
        movwf   loops2
Wai2    nop                    ; 
        nop
        nop
        nop
        nop
        nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
        decfsz  loops2, F      ; 1 ms vorbei?
        goto    Wai2           ; nein, noch nicht
        decfsz  loops, F       ; alle ms vorbei?
        goto    wai            ; nein, noch nicht
        retlw   0              ; das Warten hat ein Ende

	END                    ; directive 'end of program'

Diese einfache kleine Routine für Verzögerung will ich z.B. auslagern.
Aber wie schaffe ich das ohne Fehlermeldungen?z.B. sagt der mir das die Marken definiert sein müssen im Code. für mich sind die das daher verstehe ich die Meldung leider nicht...

^Cobra

OKa... erkenntnis 1:
der "einfache" Code kann schonmal nicht übersetzt werden. er Mag die Formel nicht... Schade. Meine das habe ich doch
sogar bei euch hier schon gesehen. Werde da mal auf die Suche gehen.

Erkenntnis 2:
Wenn ich den Code im Hauptprogramm aufrufe, und nur dieses File übersetze wird das sauber und richtig mit übersetzt.
Aber ist das der richtige Weg?

Ottmar

Hallo Cobra
Die erste Moeglichkeit Subroutinen ausserhalb des ASM-Files auszufuehren, ist die Verwendung von INCLUDE-DATEI(en) wenn das Programm als "absolut code" verwendet werden soll.
Beiliegend habe ich Dir zwei Dateien angefuegt.
16F1827_HD44780_LCD_4Bit
als Beispiel beigelegt. An dessen ENDE wird mit
#INCLUDE <D:\MPLAB_PROJEKTE\z_LCD\HD44780_4Bit.INC>
die Datei, welche die im ASM-File aufgerufenen Subroutinen enthaelt eingefuegt. Die Pfadangabe richtet sich nach Deinen Gegebenheiten. Nachteil, ist das die gesamte Datei in Dein Programm eingebunden wird, auch wenn Du nur eine Subroutine davon tatsaechlich verwendet hast.

Die andere  Moeglichkeit ist "relocatable code" zu verwenden. Dann werden nur aufgerufene Subroutinen aus dem externen File beim assemblieren aufgenommen.  Dazu genuegt es wenn die Datei als ASM-File in das MPLAB-Projekt aufgenommen ist. Dazu lege ich Dir eine Lektion (leider englisch) bei
"L16 Relocatable (verschiebbarer) Code".

viel Erfolg Ottmar16F1827_HD44780_LCD_4Bit_081408.7z
Like Like x 1 View List


^Cobra


pic18

Zitat von: Ottmar in 18.01.2024, 19:22:21 CETDann werden nur aufgerufene Subroutinen aus dem externen File beim assemblieren aufgenommen
gute Antwort, das habe ich auch nicht gewußt. Wird das mit global Sub und extern Sub gemacht?

Ottmar

global mysub in library.asm
dort steht die sub dann als code
global var1 in library.asm
wenn var1 ausserhalb verwendet werden soll

extern mysub im main.asm
hier wird die sub nur aufgerufen
extern var1 in main.asm
movlw.100.   ;übergabe an sub
movwf var1
 .   Call mysub


^Cobra

Bei mir wird alles nach global als Label error angezeigt. Meine Berechnung wird auch nicht akzeptiert egal was ich da versuche. Sagt operator error. Versteh aber nicht warum. Habe mir deine beispiele angeschaut. Wow, da ist viel hirnschmalz drin. Sehe auch da Berechnungen die der Assembler macht.

Bin einfach zusehr mit tia und codesys verwöhnt... 

Ottmar

Anbei ein lauffähiges Projekt um eine andere Datei (include.inc) mit Subroutinen in ein ASM-File einzufügen. Projekt kann wohl auch in MPLAB-X importiert werden.
Wer will kann ja auch das enthalte Macro ausgliedern und an dessen Stelle die entsprechende inc- Datei einfügen lassen - nur zu Übung :-))
Glaube nun das Vorgehen sinnfällig dargestellt zu haben.
Werde mal schauen ob ich noch ein anschauliches Beispiel für relocatable code in den Tiefen meines PC finden kann.
MfG Ottmar

^Cobra

Vielen Dank für deine Mühen. 
Habe nun deine v8 bei mir installiert und musste schonmal feststellen das wieder gefühlt alles anders ist. 
Habe es auch geschafft deine beispiele zu öffnen. 
Bin inzwischen auf dem Stand das ich glaube das global nicht mehr gebraucht wird?
Meine Berechnung will immer noch nicht gehen. Da muss ich wohl noch üben :D
Werde mich weiter damit beschäftigen 

Ottmar

Zeig doch bitte mal Deinen Code.
Global wird beim Einfügen einer Datei per "include" nicht verwendet.

^Cobra

Hi,
bin dir wirklich sehr dankbar für deine geduld mit mir.

Ich habe nun mal die 2 Asm filse bei gefügt mit der ich grade am probieren bin.

Du hast ja geschrieben das wenn ich das nicht mit "#include" einfüge sondern nur
mit z.b. Call oder goto zu den Funktion springe würde der Rest auch nicht übersetzt werden. Daher habe ich versucht dies zu Testen und daher mit Global und extern rum experementiert. Ebenfalls findes du in nun der Delays die Zeilen:
PicTakt EQU .20
Cloop EQU .250/.20*PicTakt
so funktioniert nun (endlich) die rechnung. ABER:
PicTakt soll eig.in Main stehen und Delays soll das dann von da aus lesen. Und dies kriege ich bis jetzt nicht hin. Dabei ist es egal ob ich #include nutze oder global und extern. Würde halt gerne alles Zentral haben wollen. Also in der Main oder eventuell sogar in einen extra File wo dann sowas wie Pic Takt, Config Wort usw. drin steht.
Will ja versuchen etwas mehr "struktur" in meine dennoch sehr kleinen Programme zu kriegen. z.B. habe ich gesehen du nutzt auch die "IF" anweisung des compilers/Assemblers um für bestimmte LCDs andere einstellungen zu nutzen. Dies würde ich ebenfalls gern verwenden. Auch da kam bis jetzt immer ein geht nicht nur aus. Habe Versucht auf Pictakt zu vergleichen also IF (PicTakt ==.20) . Aber auch da scheitere ich. Grade nochmal probiert und lokal geht es jetzt scheinbar :-\ Ich glaube ich habe mit mein ganzen versuchen mich selbst eingemauert...

Habe übringens in mein Test File 2 weitere Dateien gehabt. Diese habe ich dann wieder gelöscht. Leider meinte der Compiler die seien noch da und hat da immer Fehler raus geschmissen. Erst wo ich das Projekt dann selbst mal geöffnet und wieder geschlossen habe hat der verstanden das es diese Dateien nicht mehr gibt. Ich gehe erstmal davon aus das ich was falsch gemacht habe und suche und suche wo diese Dateien noch auftauchen... naja, soviel von mir.

Gruß

Ottmar

Hi Cobra
Beiliegend Dein in MPASM8.92 lauffähiges Projekt. Bedurfte nur geringer Korrektur.
Anmerkungen vgl. Zip-File.
Viel Erfolg Ottmar

^Cobra


^Cobra

habe es mir nun angeschaut und konnte ich soweit bei mir auch ans laufen bringen.
Musste die lkr Datei neu einbinden da er diesen nicht mehr gefunden hat.
Aber:
Du hast mir netterweise ja alles mögliche kommentiert.
Unter anderem:
; EXTERN   PicTakt     ;ottmar: nur wenn Pictakt von hier aus deklariert ist!
   PicTakt EQU .20    ;-ist nicht der Fallwurde ja schon in Main.ASM deklariert
   ;
Dies steht in der Delays drin. Ich gehe davon aus das du so meinst:
Wenn es in der Main deklariert ist muss Extern Pictakt stehen und die untere Zuweisung auskommentiert werden. Wenn ich das mache kommt denoch ein Fehler. Auch wenn ich PicTakt dann in der Main global setze oder sonst wie. Also ich muss zwingend PicTakt in der Delays.asm definieren. Sonst geht die Berechnung in die Hose. Kannst du mir dazu auch noch ein Tipp geben?

^Cobra

Edit:
Bei mir erzeugt der den ganzen Code, auch wenn davon Teile nicht benutzt wurden. Siehe:
CodeBeispiel.PNG
Dies zeigt der mir ebenfalls bei der MPLAB IDE X v5.15 an.

Ottmar

PicTakt ist keine Variable sonder ein label. Label sind wie preisschilder, man liest was draufsteht, nimmt das zu Kenntnis.

Takt equ 0x55 ; Labelwert wird zugewiesen
Movlw takt.     ; Labelwert ins wreg
Addwf musik.  ; varable + h55
Musik könnte global oder extern sein,Takt aber nicht.

Variablen werden im Programmlauf manipuliert, geaendert. Label behalten ihren einmal zugewiesenen Wert.
Daher EXTERN ist da fehl am Platz.
Nur Variable und Subroutinen können Global oder mit Extern gekennzeichnet werden.

Dazu noch 'ne Frage?

 

Ottmar

Zitat von: ^Cobra in 23.01.2024, 19:13:30 CETEdit:
Bei mir erzeugt der den ganzen Code, auch wenn davon Teile nicht benutzt wurden. Siehe:
CodeBeispiel.PNG
Dies zeigt der mir ebenfalls bei der MPLAB IDE X v5.15 an.

Das ist richti,g da fehlz mir auch im Moment das Verstaendnis. Es wird erst dann ein kleineres Hexfile generiert wenn ich die nicht aufgerufenen subs komplett auskommentiere.
????


^Cobra

Zitat von: Ottmar in 23.01.2024, 20:46:50 CETVariablen werden im Programmlauf manipuliert, geaendert. Label behalten ihren einmal zugewiesenen Wert.
Daher EXTERN ist da fehl am Platz.
Nur Variable und Subroutinen können Global oder mit Extern gekennzeichnet werden.

Dazu noch 'ne Frage?

 
ALso kann man keine globalen Konstanten (Label) erstellen und man muss im jeden file diese dann neu anlegen. So das man z.B. PicTakt nun einmal in der Delays.inc hat, USART.inc ,IMER.inc und in Main.asm
Kann mir kaum vorstellen das es so gewollt ist...

^Cobra

Noch was:
Wenn ich nun ein neues Projekt mache und ich da meine "Delays" verwenden will (darum macht man doch das ganze in einzelne Dateien damit man besser kopieren bzw. wo anders verwenden kann) kommt ein Fehler:
make[2]: *** No rule to make target '../../../Downloads/Cobra_projekt_ottmar\(1\)/Cobra_projekt/Delays.asm', needed by 'build/default/production/_ext/227318014/Delays.o'.  Stop.
make[2]: *** Waiting for unfinished jobs....

Leider weiß ich nun nicht was ich ändern muss :D
Ich habe dann mal die Datei Delays kopiert und in den Projekt Ordner von dem neuen Projekt gepackt und von da aus nochmal in das Projekt neu eingebunden. Dann geht es. Aber ist dies nun der richtige weg? selbes gilt für die p16fXXX.inc datei. Wenn ich PORTA oder sowas verwenden will, muss ich derzeit in dem neuen Asm File die p16fXXX.inc ebenfalls wieder einbinden damit kein Fehler beim übersetzen kommt.Dies würde aber bedeuten das ich bei sogut wie jedem File machen muss. Heißt 10 Files, 10 mal die .inc für den gewählten Pic rein hämmern. Quasi direkt vor dem PicTakt den man auch jedes mal neu eintragen muss... hms... Das muss doch anders gehen aber bei den ganzen Doc. blicke ich nicht durch. :-\

Schnellantwort

Name:
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau

Similar topics (5)