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. 58<br />
10 Schleifen, Zeitverzögerungen und Co.<br />
Hier wer<strong>de</strong>n Zeitbeziehungen in Schleifen vermittelt.<br />
10.1 8-Bit-Schleifen<br />
Co<strong>de</strong> einer 8-Bit-Schleife<br />
Eine Zeitschleife mit einem 8-Bit-Register sieht in Assembler folgen<strong>de</strong>rmaßen aus:<br />
.equ c1 = 200 ; Anzahl Durchläufe <strong>de</strong>r Schleife<br />
ldi R16,c1 ; La<strong>de</strong> Register mit Schleifenwert<br />
Loop: ; Schleifenbeginn<br />
<strong>de</strong>c R16 ; Registerwert um Eins verringern<br />
brne Loop ; wenn nicht Null dann Schleifenbeginn<br />
Praktischerweise gibt die Konstante c1 die Anzahl Schleifendurchläufe direkt an. Mit ihr kann die<br />
Anzahl <strong>de</strong>r Durchläufe und damit die Verzögerung variiert wer<strong>de</strong>n. Da in ein 8-Bit-Register nur<br />
Zahlen bis 255 passen, ist die Leistungsfähigkeit arg eng beschränkt.<br />
Prozessortakte<br />
Für die Zeitverzögerung mit einer solchen Schleife sind zwei Größen maßgebend:<br />
• die Anzahl Prozessortakte, die die Schleife benötigt, und<br />
• die Zeitdauer eines Prozessortakts.<br />
Die Anzahl Prozessortakte, die die einzelnen Instruktionen benötigen, stehen in <strong>de</strong>n Datenbüchern<br />
<strong>de</strong>r AVRs. Und zwar ziemlich weit hinten, unter "Instruction Set Summary", in <strong>de</strong>r Spalte<br />
"#Clocks". Demnach ergibt sich folgen<strong>de</strong>s Bild:<br />
.equ c1 = 200 ; 0 Takte, macht <strong>de</strong>r Assembler alleine<br />
ldi R16,c1 ; 1 Takt<br />
Loop: ; Schleifenbeginn<br />
<strong>de</strong>c R16 ; 1 Takt<br />
brne Loop ; 2 Takte wenn nicht Null, 1 Takt bei Null<br />
Damit setzt sich die Anzahl Takte folgen<strong>de</strong>rmaßen zusammen:<br />
1. La<strong>de</strong>n: 1 Takt, Anzahl Durchläufe: 1 mal<br />
2. Schleife mit Verzweigung an <strong>de</strong>n Schleifenbeginn: 3 Takte, Anzahl Durchläufe: c1 - 1 mal<br />
3. Schleife ohne Verzweigung an <strong>de</strong>n Schleifenbeginn: 2 Takte, Anzahl Durchläufe: 1 mal<br />
Damit ergibt sich die Anzahl Takte nt zu: nt = 1 + 3*(c1-1) + 2 o<strong>de</strong>r mit aufgelöster Klammer zu: nt<br />
= 1 + 3*c1 - 3 + 2 o<strong>de</strong>r halt noch einfacher zu: nt = 3*c1 Jetzt haben wir die Anzahl Takte.<br />
Taktfrequenz <strong>de</strong>s AVR<br />
Die Dauer eines Takts ergibt sich aus <strong>de</strong>r Taktfrequenz <strong>de</strong>s AVR. Die ist gar nicht so einfach zu ermitteln,<br />
weil es so viele Möglichkeiten gibt, sie auszuwählen o<strong>de</strong>r zu verstellen:<br />
• AVRs ohne interne Oszillatoren: diese brauchen entwe<strong>de</strong>r<br />
• einen externen Quarz,<br />
• einen externen Keramikresonator, o<strong>de</strong>r<br />
• einen externen Oszillator