mikrocontroller.net

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


Autor: Markus D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
  #include <p16f884.inc>
  #include <lcd.asm>
  
;    config FOSC = INTIO67
;    config WDTEN = OFF, LVP = OFF, MCLRE = OFF

    org 1
    GOTO  init

;-------Initialisierung-------

init:  CALL  lcd  
    
start:  NOP
  GOTO  start    

  END
So und im lcd.asm File steht test halber nur.
    #include <p16f884.inc>
lcd:  NOP
  RETURN
  
  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ß

Autor: DAC (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: DAC (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
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.

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
  #include <p16f884.inc>
  
;    config FOSC = INTIO67
;    config WDTEN = OFF, LVP = OFF, MCLRE = OFF

    org 1
    GOTO  init

;-------Initialisierung-------

init:  CALL  lcd  
    
start:  NOP
  GOTO  start    


  #include <lcd.asm>

  END

Funktioniert zumindest bei meinen Programmen bisher immer.
Die lcd.asm würde dann so aussehen:
lcd:  NOP
  RETURN

Autor: DAC (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: DAC (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: DAC (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jop das wäre echt klass =) ich freue mich schon

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.