Pic16f884 + 2 Assembler zusammen Compilieren

Gast #1477201
Lesenswert?

Hi ich habe ein Problem und zwar versuche ich im Moment die Assembler 
Routine von meinem Haupt .asm abzuspalten der Übersicht halber.

Nur ich bin mir nicht ganz sicher wie und wo ich die lcd.asm einbinden 
soll ?!

Mein Haupt .asm File sieht so aus
1
  #include <p16f884.inc>
2
  #include <lcd.asm>
3
  
4
;    config FOSC = INTIO67
5
;    config WDTEN = OFF, LVP = OFF, MCLRE = OFF
6

7
    org 1
8
    GOTO  init
9

10
;-------Initialisierung-------
11

12
init:  CALL  lcd  
13
    
14
start:  NOP
15
  GOTO  start    
16

17
  END
So und im lcd.asm File steht test halber nur.
1
    #include <p16f884.inc>
2
lcd:  NOP
3
  RETURN
4
  
5
  END


So wenn ich das nun in MPLAB Compiliere kommt diese Fehler meldung:

Error[150]   E:\MICROCHIP\PROJEKTE\TEST\LCD.ASM 5 : Labels must be 
defined in a code or data section when making an object file

Error[152]   E:\MICROCHIP\PROJEKTE\TEST\LCD.ASM 5 : Executable code and 
data must be defined in an appropriate section


und der Compile forgang bricht ab.

Woran könnte das liegen was mache ich falsch ?

Gruß
Gast #1477255
Lesenswert?

Ich hätte jetzt eher gesagt, dass das "END" in lcd.asm zuviel ist. Das 
meckert ja auch der Compiler an ("Error[150] 
E:\MICROCHIP\PROJEKTE\TEST\LCD.ASM 5 :..." die 5 steht für die 
Zeile, die ihn stört und da steht nur END drin). Und das "#include 
<p16f887.inc>" in LCD ist auch überflüssig, steht ja schon im Haupt.asm.
Gast #1477303
Lesenswert?

>Ich hätte jetzt eher gesagt, dass das "END" in lcd.asm zuviel ist.

Das passt schon, jedes ASM-File braucht ein Ende.

>Das meckert ja auch der Compiler an ("Error[150]

Da täuscht du dich, die Kernaussage der Fehlermeldung ist:
1
must be defined in a code or data section

und das hat damit zu tun, dass im relocatable mode des MPASM die 
Direktive ORG ignoriert wird. Eine Code Sektion muss durch eine 
Direktive CODE eingeleitet werden.
Persönliche Seite #1477345
Lesenswert?

Wer sagt denn, dass er das im relocatable mode übersetzt?

Ich würde eher behaupten, dass der Fehler daran liegt, weil das #include 
<lcd.asm> am Anfang von der Hauptroutine sthet. Include fügt doch den 
Code aus der angegeben Datei genau an der Stelle ein, wo das Include 
steht. Auch macht das #include <p16f884.inc> in der lcd.asm aus meiner 
Sicht keinen Sinn. Das wäre ja dann ein rekursiver Aufruf. Ich würde es 
so machen:
1
  #include <p16f884.inc>
2
  
3
;    config FOSC = INTIO67
4
;    config WDTEN = OFF, LVP = OFF, MCLRE = OFF
5

6
    org 1
7
    GOTO  init
8

9
;-------Initialisierung-------
10

11
init:  CALL  lcd  
12
    
13
start:  NOP
14
  GOTO  start    
15

16

17
  #include <lcd.asm>
18

19
  END

Funktioniert zumindest bei meinen Programmen bisher immer.
Die lcd.asm würde dann so aussehen:
1
lcd:  NOP
2
  RETURN
Gast #1477407
Lesenswert?

>Wer sagt denn, dass er das im relocatable mode übersetzt?

Wie bekommst du den Linker dazu, aus mehreren .asm-Files ein passendes 
.hex zu erzeugen?

Ein include für das Einbinden von ausführbarem Code zu verwenden ist 
eine böse Sünde ;)
Funktionieren tuts, aber die include-Direktive ist nicht dafür gedacht. 
Somit ist das also ein Hack und keine ordentliche Notation.
Persönliche Seite #1477512
Lesenswert?

Das versteh ich nicht. Ich benutze bei meinem aktuellem Projekt vier 
Quellcode Dateien (für jede Page eine P0.asm bis P3.asm). In P0.asm 
stehen ganz am Ende die Anweisungen:

#include <P1.asm>  ;Programm Teil 2
#include <P2.asm>  ;Programm Teil 3
#include <P3.asm>  ;Programm Teil 4

Die END-Anweisung steht in P3.asm als letzter Befehl.

MPLAB assembliert das ohne Probleme. Ich habe alle 4 Dateien geöffnet 
und ändere ständig in allen rum. Wo ist da jetzt das Problem bzw. was 
mache ich hier nicht richtig?

Gruß
Sven
Gast #1477581
Lesenswert?

>MPLAB assembliert das ohne Probleme. Ich habe alle 4 Dateien geöffnet
>und ändere ständig in allen rum.

Ok, da besteht also Erklärungsbedarf.

Das #include bewirkt nun mal eine Textersetzung, daher kann es so 
funktionieren wie du es gemacht hast. Das END muss dann wirklich am Ende 
des letzten (Befehls-)Blocks stehen.

>Wo ist da jetzt das Problem bzw. was mache ich hier nicht richtig?

Du verzichtest damit eben auf alle Vorteile des relocatable mode. Ich 
sage ja nicht, dass es falsch ist, es ist aber auf jeden Fall kein 
eleganter Weg bzw. klammert einen speziell zu dem Zweck implementierten 
Lösungsweg (den relocatable mode) einfach aus.

Normalerweise muss man bei den .inc Dateien nicht zwischen Ausführbaren 
und Deklarationen/Definitionen unterscheiden, das bürdest du dir damit 
selbst auf.

Ich hoffe es ist verständlich erklärt.

Grüße
Persönliche Seite #1477603
Lesenswert?

Ich glaube ich versteh was du meinst. Ich habe nur nie wirklich 
verstanden, wozu dieser relocatable mode eigentlich gut ist und wie man 
ihn verwendet. Bisher bin ich mit meiner Art und Weise ganz gut zurecht 
gekommen obwohl ich ja zugebe, das es nach 6kByte Assembler doch langsam 
unübersichtlich wird. Deshalb habe ich ja meine Dateien auch aufgeteilt. 
Halt für jede Page eine Datei. Und bisher weiß ich halt nicht, wie man 
es anders bzw besser machen kann, als die Dateien halt einfach hinten 
dran zu hängen. Trozdem danke für die Infos. Bei meinem nächsten Projekt 
kann ich mich ja mal an dem anderen Modus versuchen.

Sven
Gast #1478009
Lesenswert?

Also mit der Lösung von Sven funktioniert es habe es grad getestet.

Also ich wollte mit dem einbinden ins ASM File erreichen das ich zb eine 
fertige LCD Routine habe und diese einfach in ein .asm File auslagern 
möchte so das ich nur noch die lcd.asm file in mein Hauptprogramm 
einbinden kann so das ich alle funktionen aus dem lcd.asm file nutzen 
kann.


Aber gibt es eine elegantere Lösung - ich hatte da was von relocatable 
gelesen.


Wenn jemand eine seite hat wo das gut erklärt hat wäre ich sehr dankbar.

weil ich würde es schon sehr gerne direkt "richtig" machen ;)



Gruß

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren