02.05.2013 Aufrufe

beginner_de

beginner_de

beginner_de

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Avr-Asm-Tutorial S. 51<br />

struktionen o<strong>de</strong>r die Lese- und Schreibinstruktionen für das SRAM, die zwei o<strong>de</strong>r mehr Taktzyklen<br />

erfor<strong>de</strong>rn. Hier hilft nur die Instruktionstabelle weiter.<br />

Um genaue Zeitbeziehungen herzustellen, muss man manchmal <strong>de</strong>n Programmablauf um eine bestimmte<br />

Anzahl Taktzyklen verzögern. Dazu gibt es die sinnloseste Instruktion <strong>de</strong>s Prozessors, die<br />

Tu-nix-Instruktion:<br />

NOP<br />

Diese Instruktion heißt "No Operation" und tut nichts außer Prozessorzeit zu verschwen<strong>de</strong>n. Bei<br />

4 MHz Takt braucht es genau vier solcher NOPs, um eine exakte Verzögerung um 1 µs zu erreichen.<br />

Zu viel an<strong>de</strong>rem ist diese Instruktion nicht zu gebrauchen. Für einen Rechteckgenerator von 1 kHz<br />

müssen aber nicht 1000 solcher NOPs kopiert wer<strong>de</strong>n, das geht auch an<strong>de</strong>rs! Dazu braucht es die<br />

Sprunginstruktionen. Mit ihrer Hilfe können Schleifen programmiert wer<strong>de</strong>n, die für eine festgelegte<br />

Anzahl von Läufen <strong>de</strong>n Programmablauf aufhalten und verzögern. Das können 8-Bit-Register<br />

sein, die mit <strong>de</strong>r DEC-Instruktion heruntergezählt wer<strong>de</strong>n, wie z.B. bei<br />

Zaehl:<br />

CLR R1<br />

DEC R1<br />

BRNE Zaehl<br />

Es können aber auch 16-Bit-Zähler sein, wie z.B. bei<br />

Zaehl:<br />

LDI ZH,HIGH(65535)<br />

LDI ZL,LOW(65535)<br />

SBIW ZL,1<br />

BRNE Zaehl<br />

Mit mehr Registern lassen sich mehr Verzögerungen erreichen. Je<strong>de</strong>r dieser Verzögerer kann auf<br />

<strong>de</strong>n jeweiligen Bedarf eingestellt wer<strong>de</strong>n und funktioniert dann quarzgenau, auch ohne Hardware-<br />

Timer. Ein späteres Kapitel gibt mehr Beispiele für Zeitschleifen und zeigt, wie man sie berechnet.<br />

9.4 Makros im Programmablauf<br />

Es kommt vor, dass in einem Programm i<strong>de</strong>ntische o<strong>de</strong>r ähnliche Co<strong>de</strong>-Sequenzen an mehreren<br />

Stellen benötigt wer<strong>de</strong>n. Will o<strong>de</strong>r kann man <strong>de</strong>n Programmteil nicht mittels Unterprogrammen bewältigen,<br />

dann kommt für diese Aufgabe auch ein Makro in Frage. Makros sind Co<strong>de</strong>sequenzen, die<br />

nur einmal entworfen wer<strong>de</strong>n und durch Aufruf <strong>de</strong>s Makronamens in <strong>de</strong>n Programmablauf eingefügt<br />

wer<strong>de</strong>n. Anstelle <strong>de</strong>s Makronamens setzt <strong>de</strong>r Assembler dann die Sequenz im Makro.<br />

Nehmen wir an, es soll die folgen<strong>de</strong> Co<strong>de</strong>sequenz (Verzögerung um 1 µs bei 4 MHz Takt) an mehreren<br />

Programmstellen benötigt wer<strong>de</strong>n. Dann erfolgt irgendwo im Quellco<strong>de</strong> die Definition <strong>de</strong>s<br />

folgen<strong>de</strong>n Makros:<br />

.MACRO Delay1<br />

NOP<br />

NOP<br />

NOP<br />

NOP

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!