Hallo zusammen,
derzeit versuche ich mich an relocatable code. Ich verwende MPLAB 8.9. Dazu habe ich im Projekt 2 ASM-Files angelegt:
1. Main.ASM - verwendet z. LCD_Init, LCD-Ausgabe aus File 2
2. LCD_Lib.ASM -verwendet Variablen und Labels aus File 1
In beiden Dateien werden mit GLOBAL und EXTERN bezeichnete Variablen und Subroutinen verwendet. Die Subroutinen in LCD_Lib.ASM können aus Main.ASM heraus problemlos aufgerufen werden, ebenso wie die Verwendung gemeinsam genutzer Variablen (GLOBAL, EXTERN). Das funktioniert.
Das Prinzip: Um die Verwendung verschiedener PIC's zu erleichetern, da ich den Programmcode so mit geringstmöglichen Änderungen weiterverwenden kann, verwende ich für PORTS und auch für Pins Platzhalter, also Labels in dieser Form:
LED_PORT EQU PORTA
LCD_LAT EQU LATA
usw...
LCD_DAT EQU RA0 (ich verwende bevorzugt mein 2Wire-Interface)
LCD_CLK EQU RA1
LED EQU RA2
#DEFINE LED_ON bsf LCD_PORT,LED
Das Problem: Wie kann ich diese Lables LCD... in beiden ASM-Files gleichermaßen verwenden?
Im File LCD_Lib.ASM werden diese Labels als ungülti bezeichnet, da diese erneut definiert werden un das nicht zulässig ist. Ichfinde nichts, was mir da weiterhilft.
Frage: Wie erreiche ich, daß ein in Main.ASM zugewisern Label auch in LCD_Lib.ASM verwendet werden kann?
Freue mich auf hilfreiche Antworten!
mfG Ottmar
Ich hatte mir eine Datei angelegt wo die konfig enthalten war. Diese habe ich in allen Dateien per include eingefügt. Im der Datei war z.b. die inc Datei des Pics, Pic Taktfrequenz, Bus Geschwindigkeit usw. Zumindest konnte ich so durch einmaliges festlegen es in mehreren Dateien nutzen. Eine andere Möglichkeit habe ich nicht hingekriegt.
Sonniger Gruß aus Spanien (Urlaub)
Cobra
@Cobra
Wenn ich mit den genannten ASM-Files alle Labels so wie vorstehend weglasse und nur mit Variablen und Subs arbeite, klappt alles wunderbar!
Ah! O:-) Die Erleuchtung! Ich verstehe! Diese Labels sind kein Variablen, keine Subroutine und müssen also gleichermaßen in beiden Dateien vorhanden sein,wie z.B. #INCLUDE <P18F14K22.INC> welches ich ja bereits in 1+2 eingschlossen habe! Der Inhalt sind auch alles Labels!
Jaaaa! Dann brauche ich ja nur dieses eine prozessorspezische #include 18F14K22_LCD_2Wire.INC in1+2 einzufügen
Das probiere ich gleich aus, bin gespannt!
Wenn's klappt, warst Du es, der mir auf das richtige Pferd geholfen hat!
na dann - schönen Urlaub! Hier im Schwabenland herrscht Sauwetter!
mfG Ottmar
das müsste auch mit "extern" gehen. In der einen Datei unter global definieren, in der anderen mit extern definieren. Ich habe irgendwo auf der Festplatte solch selbst geschriebenen Dateien hier greife ich mit C auf Assembler Variablen zu.
Ich hatte hier schon einmal eine Interrupt Routine hochgeladen, da hatte ich Variablen mit extern und global definiert.
https://www.pic-microcontroller.de/dlattach/?attach=2874
Danke für die Rückmeldungen!
Danke PIC18 für den Hinweis auf Deine Datei-Vorlage!
Damit meine ich ist aber der Problempunkt nicht getroffen. Wie in meinem 2.Post mitgeteilt, funktioniert ja bereits in beiden ASM-Files die Verwendung von gemeinsam genutzten Variablen, und Subroutinen perfekt, da diese entsprechend mit GLOBAL und EXTERN deklariert sind. Das klappt alles!
Es ging nir nur um LABEL, sowie mitgeteilt z.B. Deklaration in MAain.ASM
LCD_PORT EQU PORTA.
LCD_CLK EQU RA0
Beim Aufruf in LCD_Lib.ASM ->
bsf LCD_LAT, LCD_CLK
etc erzeugt dies eine Fehlermeldung, daß gleiche Labels nicht erneut definiert werden dürfen. Mal sehen, bin gerade dabei die Dateien umzubauen und die Labels als include-file in beide ASM-Files einzufügen.
Danke einstweilen!
Stand der Dinge:
Nachdem wie von Cobra angeregt, ich den relocatable Code zuächst mal für den 16F628 ERFOLGREICH umgesetzt habe, wurde ich mit ERFOLG belohnt.
1. File 'Main.ASM" wurden sämliche Deklarationen von Labels (#define, equ) DIREKT nach dem CONFIG-WORD angeordnet
2. im File "LCD_Lib.ASM" wurde sämtliche Deklaration von Labels DIREKKTl nach " #INCLUDE <p16F628A.inc> angeordnet.
Nachdem der Code mittels Pickit3 auf den PIC übertragen war, lief alles reibungslos!
Danke an alle, besonders an Cobra!
Ottmar