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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!