Hallo zusammen,
ich habe mir in asm ein Programm geschrieben, das für ein 16x2 Display
sämtliche Routinen enthält.
Wie kann ich dieses Programm in mein eigentliches Hauptprogramm
einfügen?
Habe es so versucht: mein Hauptprogramm heißt
messung.asm, dort habe ich an den Anfang .include "LCD_routins.asm"
geschrieben, so heißt mein Programm für die LCD Routinen.
Das Programm Messung habe ich im AVR Studio als entry file markiert.
wenn ich das Ganze nun im Debugger laufen lasse beginnt das Programm
mit dem abarbeiten des LCD_routins.asm und das obwohl
es nicht als entry file gekennzeichnet ist. das wiederum bringt den
Fehler
dass der Stack überläuft, da dieser im messung.asm initialisiert wird
und nicht im Messung.asm.
Wenn ich nun beide Programme zusammen in ein Fenster schreibe läuft es
im
Debugger sowie auf meinem ATMEGA8 problemlos.
Also, wie mache ich das wenn ich mehrere Programme zu einem großen
zusammenbauen möchte ohne alles in ein Fenster zu schreiben?
Gruß
Moschder
Hi
Die Include-Anweisung muss ans Ende vom Hauptprogramm. An den Anfang
kann man nur Include-Dateien setzen, die KEINEN Programmcode enthalten.
MfG Spess
Hi
.org-Anweisungen bewirken, das der nachfolgende Programmcode (in cseg)
bzw. die Speicherstellen (dseg/eseg) an der Adresse beginnen, die in der
Org-Anweisung steht.
Noch mal zur Include-Anweisung: Beim Assemblieren wird der Code,der in
der Include-Datei steht, an dieser Stelle eingefügt. Das geht an jeder
Stelle (hat 6641 natürlich Recht), wo das nicht stört. Ich bevorzuge das
Ende des Hauptprogramms.
Erläuterungen findest du auch in der AVR-Studio-Hilfe:
Assembler->Directives
MfG Spess
wenn ich nun an der ersten möglichen Speicherstelle mit meinem Code
beginnen will, wie muß dann dir org anweisung lauten? Und wann macht es
sinn eben nicht an der ersten Stelle zu beginnen?
Gruß
Moschder
Wo man die Includes einfuegt haengt natuerlich sehr mit deren Inhalt
zusammen. Der ASM ist ein Einpass Assembler. Daher kann man nichts
baruchen was nicht voerher deklariert wurde. Wenn man nun library
funktionalitaet zur Verfuegung stellen will, die spaeter gebraucht
werden kann, dann fuegt man die oben ein, zB HexToByte, ByteToHex, Einen
generischen Algorithmus, der vorher parametrisiert wird, kommt am Ende
hin. Ich hab das main() jeweils unten.
Hi
Der Assembler beginnt automatisch an der Speicherstelle 0. Dort muss der
Sprung zum Anfang des Programms stehen. Der µC fängt nämlich nach jedem
Reset an dieser Stelle an. Zu deiner Frage: '.org 0'. Schadet zwar
nicht, ist aber unnötig.
MfG Spess
Hi
>Wo man die Includes einfuegt haengt natuerlich sehr mit deren Inhalt>zusammen. Der ASM ist ein Einpass Assembler. Daher kann man nichts>baruchen was nicht voerher deklariert wurde. Wenn man nun library...
Über diese Brücke würde ich nicht gehen. Man kann problemlos auf
Unterprogramme zugreifen, die hinter dem Aufruf stehen. Der
AVR-Assembler (mit Sicherheit KEIN Ein-Pass-Assembler) benötigt keine
Forward-Deklarationen. Und eine main() kennt er schon gar nicht. Ich
glaube da bringst du etwas durcheinander.
MfG Spess
Hallo,
@6641:
>Der ASM ist ein Einpass Assembler.
Das bezweifle ich.
Ansonsten:
Der Assembler beginnt mit Programmspeicheradresse 0, wenn man ihm nicht
mit .org was anderes sagt.
Der AVR beginnt beim Reset an Adresse 0. Dort steht üblicherweise ein
Sprung zum eigentliche Programmbeginn. Das ist sinnvoll, weil danach
unmittelbar die IRQ-Vektoren kommen und wenn die nutzen will, muß man
sie sozusagen freilassen.
Eine (bei AVR) für mich allgemeingültige Methode:
1
; ATiny2313
2
3
; 09.03.2008 M'Soft Berlin
4
5
.include "tn2313def.inc" ; erstmal die Prozessordefinition includen
Die leere Struktur benutze ich eigentlich für jedes Programm, die
Reihenfolge der Includes ist egal, die Tabellen (Texte im Flash usw)
lasse ich an Ende.
Es kann nur passieren, daß beim Assemblieren die Meckermeldung kommt,
daß die Sprungweite eines RCALL überschritten wurde, Erste Lösung ist
dann für mich, die Reihenfolge der Includes umzusortieren, der Abstand
hängt ja nur davon ab, welche Routine aus welchem Includen was aufruft.
Oft reicht das schon oder umsortieren der Funktionen innerhalb der
Includes hilft.
Das sind dann alles nur reine Copy-Paste mit etwas überlegung, das
kostet nichtmal Zeit.
Vielleicht hilft das ja jemandem.
Gruß aus Berlin
Michael