hallo an alle!
frage: ist es möglich (und wie), in avr-studio bereits erstellte
codeschnipsel (zb. lcd-routinen oder die legendäre
danegger-tastenentprellung) einfach zu "includen" ohne den gesamten
code per copy und paste einfügen zu müssen? (wegen der
übersichtlichkeit...)
also prinzipiell nur schreiben zu müssen:
.include "hab-ich-schonmal-erstellt"
und irgendwo im listing dann
rcall "routine aus hab-ich schonmal-erstellt"
ist vielleicht zu banal, aber bin bis jetzt nicht schlauer geworden.
die in den unterschiedlichen teilen verwendeten register/ deklarationen
muß ich dann sicher irgendwie auf einen gemeinsamen nenner bringen,
oder?
danke im voraus!
ihr wollt mir jetzt aber nicht verklickern, daß niemand eine antwort
weiß.....bzw. sich schonmal eine ähnliche frage gestellt hat?
oder stehe ich auf der schwarzen liste?
aha! das war von mir mal nur geraten. ein praktisches beispiel dazu habe
ich noch nicht gesehen. daher wollte ich quasi nur mal die korrekte
syntax wissen.
Ein praktisches Beispiel dazu hast Du sicher schon
gesehen :-)
Oder beginnen Deine Codes nie mit
.include "4433def.inc"
(oder wlchen Przessor Du dann auch immer benutzt).
.include "irgendwas.xyz"
macht keine Magie! Die Anweisung bewirkt, dass diese Zeile
durch den Inhalt der Datei "irgendwas.xyz" ersetzt wird.
Mehr passiert da nicht. Ob in dieser Datei nun irgendwelche
Definitionen drinn sind oder Quellcode oder Fonttabellen
oder ... ist dem .include voellig Wurscht.
ja, das haste natürlich recht. leider kann ich dem fertigen quelltext ja
nicht ansehen, was wo eingesetzt wurde. bin gerade am experimentieren
und hab erstmal -zig fehler wegen codesegment-überschneidung. also das
includefile so kurz wie möglich gehalten (besteht nur aus direkt
benötigten registerdefinitionen und einzelnen subroutinen) und .org100
(übern daumen) an den reset-einsprung des programms geschrieben, das
die include-datei enthalten soll. bleiben noch zwei overlap-fehler:
beide in der interrupt-einsprungtabelle. das ganze sieht so aus:
.include "8515def.inc"
.include "D:\Work\ASMs\lcdrout.asm"
.def leer=r13
.def voll=r14
.def offset=r15
.def akku=r16
.def sekunde=r21
.def minute=r22
.def stunde=r23
.def oflow=r24
.cseg
.org 00
rjmp reset >>>Fehler1
.org 07
rjmp timer >>>Fehler2
.org 110
reset:
hier geht das programm los.........
Fehler1:error: Overlap in .cseg: addr=0x0 conflicts with 0x0:0x27
Fehler2:error: Overlap in .cseg: addr=0x7 conflicts with 0x0:0x27
ich kann (sollte) doch aber die vektortabelle nicht irgendwo
hinschieben, oder? an welcher stelle genau wird das include-file
eingesetzt?
oh, ah! ich habs. man kann natürlich auch den include-befehl hinter die
vektortabelle schreiben, dann lösen sich die (zwei)probleme in
wohlgefallen auf. dann halt noch den offset für den beginn des
programms und es geht (zumindest zu assemblieren).
vielen dank!
Wozu Offset zum Beginn des Programms?
Hinter den Interrupt-Sprüngen kann das Programm beginnen. Dazu muss man
die absolute Adresse des Programmbeginns nicht wissen, es genügt, wenn
der erste Eintrag der Sprungtabelle darauf verweist.
...
stimmt; jetzt wo du es sagtst. hab den offset nochmal weggenommen, und
es gibt keine cseg-überschneidungen mehr. naja, hab ich vorhin als
gegenmittel genommen, als das include noch an der falschen stelle
stand. aber wenn man sichs im ponyprog anguckt, ist da wirklich viel
platz zwischendurch.
was ich nicht kapiere (siehe angehängten screenshot): wenn ich sage,
daß das codesegment ab $10 anfangen soll, warum ist dann bei dieser
adresse lt. ponyprog alles leer und es geht erst ab $20 los? und ganz
oben (zeile $00) müßte doch die vektortabelle stehen, oder? da gibts
doch aber nur einträge bei $00,$01 und $0E,$0F. sollte ich nicht bei
$07 meinen timer-interrupt-vektor sehen? oder bin ich gerade völlig
aufm holzweg?
Zu schnell abgeschickt...
Der Flash-Speicher ist wortorientiert. Eine Adresse in AVR-Studio
bezeichnet eine 16-Bit-Zelle. Diese wird von Pony als zwei Bytes
dargestellt.
EEPROM und SRAM sind aber 8-Bit-organisiert.
...
Wenn dich die Bits&Bytes interessieren, dann aktiviere mal die Ausgabe
der List-Datei. In dieser siehst du zu den ASM-Codes auch die
zugehörigen Hexcodes. Alternativ kannst du mittels Onlinehilfe die
Binärcodes der ASM-Befehle einsehen. Cursor auf ASM-Befehl, F1-Taste...
funzt nicht, ggrrr!
läßt sich assemblieren, simulieren, sogar executieren!
programm läuft durch, aber die in die include-datei ausgelagerte
lcd-routine kriegt offensichtlich das init nicht hin.
wenn ich längere haare hätte, könnte ich sie mir ausreißen.....
Dann schau dich mal hier im Forum um. Es gab in letzter Zeit etliche
Probleme mit HD44780-kompatiblen LCDs. Die Initialisierung erfordert
ein anderes Timing als ein "echtes" HD44780. Ich selbst habe damit
aber noch keine Erfahrung, mit den 8x24 (MS50530) und dem 4x27 (2 mal
44730-kompatibel in Naktchipausführung) komme ich aber gut klar.
...
naja, prizipiell sollte das init funktionieren. sogar mit
busy-flag-abfrage ohne warteschleifen... hab gestern ein programm
geschrieben, das eine einfache digitaluhr realisiert und in diesem
programm halt meine anfang der woche fertige lcd-routine ("hallo
welt" kann die allemal...) per copy und paste reinkopiert. hat
funktioniert. heute habe ich nichts weiter versucht, als eben diese
routine per include-datei einzubinden, sodass ich nur den zählerteil im
hauptprogramm relisieren muß. genauer gesagt, läuft der zähler als
interrupt-routine und die datenkonvertierung als unterprogramm.
wahrscheinlich liegt der fehler irgendwo in der reihenfolge der
deklarationen und portinitialisierungen, da diese teils im main, teils
in der include-datei funktionieren.