beginner_de
beginner_de
beginner_de
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Avr-Asm-Tutorial S. 27<br />
Der Pfad, an <strong>de</strong>m sich die Hea<strong>de</strong>r-Datei befin<strong>de</strong>t, kann natürlich weggelassen wer<strong>de</strong>n, wenn sie sich<br />
im gleichen Verzeichnis wie die Assemblerdatei befin<strong>de</strong>t. An<strong>de</strong>rnfalls ist <strong>de</strong>r Pfad entsprechend <strong>de</strong>n<br />
eigenen Verhältnissen anzupassen.<br />
Das Auflisten <strong>de</strong>r Datei beim Übersetzen kann nervig sein, weil solche Hea<strong>de</strong>r-Dateien sehr lang<br />
sind, beim Auflisten <strong>de</strong>s übersetzten Co<strong>de</strong>s (entstehen<strong>de</strong> .lst-Datei) entsprechend lange Listen von<br />
meist uninteressanten (weil trivialen) Informationen produzieren. Das Abschalten vor <strong>de</strong>m Einlesen<br />
<strong>de</strong>r Hea<strong>de</strong>r-Datei spart je<strong>de</strong> Menge Papier beim Ausdrucken <strong>de</strong>r List-Datei. Es lohnt sich aber,<br />
einen kurzen Blick in die Inclu<strong>de</strong>-Datei zu werfen. Zu Beginn <strong>de</strong>r Datei wird mit<br />
.DEVICE AT90S8515 ; Festlegung <strong>de</strong>s Ziel<strong>de</strong>vices<br />
<strong>de</strong>r Zielchip <strong>de</strong>finiert. Das wie<strong>de</strong>rum bewirkt, dass Instruktionen, die auf <strong>de</strong>m Zielchip nicht <strong>de</strong>finiert<br />
sind, vom Assembler mit einer Fehlermeldung zurückgewiesen wer<strong>de</strong>n. Die Device-Anweisung<br />
an <strong>de</strong>n Assembler braucht also beim Einlesen <strong>de</strong>r Hea<strong>de</strong>r-Datei nicht noch einmal in <strong>de</strong>n<br />
Quellco<strong>de</strong> eingegeben wer<strong>de</strong>n (ergäbe eine Fehlermeldung).<br />
Hier sind z.B. auch die Register XH, XL, YH, YL, ZH und ZL <strong>de</strong>finiert, die beim byteweisen Zugriff<br />
auf die Doppelregister X, Y und Z benötigt wer<strong>de</strong>n. Ferner sind darin alle Port-Speicherstellen<br />
<strong>de</strong>finiert, z. B. erfolgt hier die Übersetzung von PORTB in hex 18. Schließlich sind hier auch alle<br />
Port-Bits mit <strong>de</strong>njenigen Namen registriert, die im Datenblatt <strong>de</strong>s jeweiligen Chips verwen<strong>de</strong>t wer<strong>de</strong>n.<br />
So wird hier z.B. das Portbit 3 beim Einlesen von Port B als PINB3 übersetzt, exakt so wie es<br />
auch im Datenblatt heißt.<br />
Mit an<strong>de</strong>ren Worten: vergisst man die Einbindung <strong>de</strong>r Inclu<strong>de</strong>-Datei <strong>de</strong>s Chips zu Beginn <strong>de</strong>s Programmes,<br />
dann hagelt es Fehlermeldungen, weil <strong>de</strong>r Assembler nur Bahnhof versteht. Die resultieren<strong>de</strong>n<br />
Fehlermeldungen sind nicht immer sehr aussagekräftig, weil fehlen<strong>de</strong> Labels und Konstanten<br />
von manchem ATMEL-Assembler nicht mit einer Fehlermeldung quittiert wer<strong>de</strong>n. Statt<strong>de</strong>ssen<br />
nimmt <strong>de</strong>r Assembler einfach an, die fehlen<strong>de</strong> Konstante sei Null und übersetzt einfach weiter. Man<br />
kann sich leicht vorstellen, welches Chaos dabei herauskommt. Der arglose Programmierer <strong>de</strong>nkt:<br />
alles in Ordnung. In Wirklichkeit wird ein ziemlicher Käse im Chip ausgeführt.<br />
In <strong>de</strong>n Kopf <strong>de</strong>s Programmes gehören insbeson<strong>de</strong>re auch die Register-Definitionen, also z.B.<br />
.DEF mpr = R16 ; Das Register R16 mit einem Namen belegen<br />
Das hat <strong>de</strong>n Vorteil, dass man eine vollständige Liste <strong>de</strong>r Register erhält und sofort sehen kann, welche<br />
Register verwen<strong>de</strong>t wer<strong>de</strong>n und welche noch frei sind. Das Umbenennen vermei<strong>de</strong>t nicht nur<br />
Verwendungskonflikte, die Namen sind auch aussagekräftiger.<br />
Ferner gehört in <strong>de</strong>n Kopf die Definition von Konstanten, die <strong>de</strong>n gesamten Programmablauf beeinflussen<br />
können. So eine Konstante wäre z.B. die Oszillatorfrequenz <strong>de</strong>s Chips, wenn im Programm<br />
später die serielle Schnittstelle verwen<strong>de</strong>t wer<strong>de</strong>n soll. Mit<br />
.EQU fq = 4000000 ; Quarzfrequenz festlegen<br />
zu Beginn <strong>de</strong>r Assemblerdatei sieht man sofort, für welchen Takt das Programm geschrieben ist.<br />
Beim Umschreiben auf eine an<strong>de</strong>re Frequenz muss nur diese Zahl geän<strong>de</strong>rt wer<strong>de</strong>n und man<br />
braucht nicht <strong>de</strong>n gesamten Quelltext nach <strong>de</strong>m Auftauchen von 4000000 zu durchsuchen.<br />
5.3 Angaben zum Programmbeginn<br />
Nach <strong>de</strong>m Kopf sollte <strong>de</strong>r Programmco<strong>de</strong> beginnen. Am Beginn je<strong>de</strong>s Co<strong>de</strong>s stehen die Reset- und<br />
Interrupt-Vektoren (später dazu mehr). Da diese relative Sprünge enthalten müssen, folgen darauf<br />
am besten die Interrupt-Service-Routinen. Danach ist ein guter Platz für abgeschlossene Unterpro-