codeschnipsel in avr studio

Gast #266588
Lesenswert?

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!
#266592
Lesenswert?

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.
Gast #266593
Lesenswert?

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?
Gast #266595
Lesenswert?

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!
Gast #266598
Lesenswert?

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?
Angehängte Dateien:
#266602
Lesenswert?

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...
Gast #266606
Lesenswert?

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.....
#266607
Lesenswert?

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.

...
Gast #266608
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren