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?
Genau so wie du's beschreibst, macht man das. Wo ist das Problem? (Klar musst Du Dir ueber Registerbelegungen u.dgl. einig sein.)
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?
Die Interrupt-Sprungtabelle muss am Anfang des Programms stehen, sonst wird das nix... Beispiel: http://www.mikrocontroller.net/forum/read-1-262112.html#262226 ...
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!
ah...stimmt, HanneS....da stehts ja auch schwarz auf weiß! wenn man nur wüßte, wo man suchen muß! nochmals danke!
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?
Der Assembler rechnet mit Worten (16 Bit, 2 Bytes), Pony mit Bytes... ...
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. ...
aha! also ist der eintrag an 0E,0F (=14 und 15 in byte) in wirklichkeit der eintrag an 07 (in word), also mein timer-interrupt!
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...
Eben...
Ich hoffe, dass du inzwischen auch eine Antwort auf deine andere Frage
gefunden hast:
> oder stehe ich auf der schwarzen liste?
...
in mir keimt die hoffnung gleich einem bohnensproß.... :-) wenn magdeburg nicht so weit weg wäre.....
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.