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