Forum: Mikrocontroller und Digitale Elektronik Pic16f884 + 2 Assembler zusammen Compilieren


von Markus D. (Gast)


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ß

von DAC (Gast)


Lesenswert?

Du musst jetzt statt ORG die Direktive CODE verwenden. Schau mal in die 
MPASM-Hilfe, dort wird das im Kontext 'absolute/relocatable code 
objects' oder so erläutert.

von Michael (Gast)


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.

von DAC (Gast)


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.

von Sven S. (stepp64) Benutzerseite


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

von DAC (Gast)


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.

von Sven S. (stepp64) Benutzerseite


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

von DAC (Gast)


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

von Sven S. (stepp64) Benutzerseite


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

von Markus D. (Gast)


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ß

von DAC (Gast)


Lesenswert?

Heute habe ich leider keine Zeit um hier zu schreiben, werde aber bis 
zum Wochenende mal schauen was ich machen kann. Es sind nur ein paar 
wenige Dinge zu beachten, so schwer ist das nicht.

Bis dann

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Super. Dann versteh ich das ja vielleicht auch mal und kann es das 
nächste mal richtig machen. Ich hab halt 95% meiner PIC 
Programmierkenntnisse von sprut.de und wenn ich mich recht erinnere, 
geht der Autor dort nirgens auf diesen Mode ein. Schade eigentlich, da 
die Seite ansonsten sehr gut ist.

Ciao

von Markus D. (Gast)


Lesenswert?

jop das wäre echt klass =) ich freue mich schon

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.