mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik codeschnipsel in avr studio


Autor: Klaus Bröntgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Klaus Bröntgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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

Autor: Klaus Bröntgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Bröntgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Hannes Lux (hannes)
Datum:

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

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

...

Autor: Klaus Bröntgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Klaus Bröntgen (Gast)
Datum:

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

nochmals danke!

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Klaus Bröntgen (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Assembler rechnet mit Worten (16 Bit, 2 Bytes), Pony mit Bytes...

...

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Klaus Bröntgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Klaus Bröntgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...auch nicht uninteressant....

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eben...

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

> oder stehe ich auf der schwarzen liste?

...

Autor: Klaus Bröntgen (Gast)
Datum:

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

Autor: Klaus Bröntgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.....

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Klaus Bröntgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.