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...
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?
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
Nachtrag
Vielen Dank werde ich mir beides anschauen
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?
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
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...
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
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
Zeig doch bitte mal Deinen Code.
Global wird beim Einfügen einer Datei per "include" nicht verwendet.
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ß
Hi Cobra
Beiliegend Dein in MPASM8.92 lauffähiges Projekt. Bedurfte nur geringer Korrektur.
Anmerkungen vgl. Zip-File.
Viel Erfolg Ottmar
vielen dank. Werde ich mir anschauen.
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?
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.
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?
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.
????
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...
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. :-\
So nachtrag:
Habe nun in der Doc den Hinweiß gefunden:
Man kann den Typ undifniert lassen: p16f1xxx.inc und der wählt dann den richtigen aus (der im Projekt eingestellt ist).
Das macht die Sache schon deutlich einfacher denke ich.
Nun aber:
Ich habe mir nun ein general.inc erzeugt welches die p16f1xxx.inc (https://www.pic-microcontroller.de///p16f1xxx.inc) und den PicTakt enthält. Dieses File
kann ich nun in alle asm File einbinden und habe überall die gleichen Constanten und muss diese auch nur an einer stelle ändern. Damit kann ich erstmal leben denke ich.
Sollte es eine besser Lösung geben gerne erwähnen. Ansonsten ist von meiner Seite aus erstmal der Fall abgeschlossen.
Werde nun mal ein kleines Projekt so versuchen aufzubauen und vermutlich mich in ein neuen Thread melden.
Danke für eure Hilfe.
Ok ich bin mit meinem Latein am Ende und kann da nicht mehr weiterhelfen. Habe aber auch dazugelernt :) !
Weiterhin viel Erfolg!
Ottmar
warum hast Du nicht ganz Oben bei "TODO INSERT INCLUDE CODE HERE"
#include Delays.asm
eingefügt
Hatte ich am amfang. Aber wollte auch den anderen weg, wo der linker den Code zusammen bastelt probieren.
Inzwischen klappt das auch ganz gut.