Forum: Mikrocontroller und Digitale Elektronik codeschnipsel in avr studio


von Klaus Bröntgen (Gast)


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!

von Klaus Bröntgen (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

Genau so wie du's beschreibst, macht man das.
Wo ist das Problem?

(Klar musst Du Dir ueber Registerbelegungen u.dgl.
einig sein.)

von Klaus Bröntgen (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


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.

von Klaus Bröntgen (Gast)


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?

von Hannes L. (hannes)


Lesenswert?

Die Interrupt-Sprungtabelle muss am Anfang des Programms stehen, sonst
wird das nix...

Beispiel:
http://www.mikrocontroller.net/forum/read-1-262112.html#262226

...

von Klaus Bröntgen (Gast)


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!

von Klaus Bröntgen (Gast)


Lesenswert?

ah...stimmt, HanneS....da stehts ja auch schwarz auf weiß! wenn man nur
wüßte, wo man suchen muß!

nochmals danke!

von Hannes L. (hannes)


Lesenswert?

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.

...

von Klaus Bröntgen (Gast)


Angehängte Dateien:

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?

von Hannes L. (hannes)


Lesenswert?

Der Assembler rechnet mit Worten (16 Bit, 2 Bytes), Pony mit Bytes...

...

von Hannes L. (hannes)


Lesenswert?

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.

...

von Klaus Bröntgen (Gast)


Lesenswert?

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!

von Hannes L. (hannes)


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...

von Klaus Bröntgen (Gast)


Lesenswert?

...auch nicht uninteressant....

von Hannes L. (hannes)


Lesenswert?

Eben...

Ich hoffe, dass du inzwischen auch eine Antwort auf deine andere Frage
gefunden hast:

> oder stehe ich auf der schwarzen liste?

...

von Klaus Bröntgen (Gast)


Lesenswert?

in mir keimt die hoffnung gleich einem bohnensproß.... :-)
wenn magdeburg nicht so weit weg wäre.....

von Klaus Bröntgen (Gast)


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.....

von Hannes L. (hannes)


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.

...

von Klaus Bröntgen (Gast)


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.

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
Noch kein Account? Hier anmelden.