02.05.2013 Aufrufe

beginner_de

beginner_de

beginner_de

MEHR ANZEIGEN
WENIGER ANZEIGEN

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. 61<br />

Loop: ; Schleifenbeginn<br />

sbiw R24,1 ; Doppelregisterwert um Eins verringern<br />

brne Loop ; wenn nicht Null dann wie<strong>de</strong>r Schleifenbeginn<br />

Die Konstante c1 gibt wie<strong>de</strong>r die Anzahl Schleifendurchläufe direkt an. Da in ein 16-Bit-Register<br />

Zahlen bis 65535 passen, ist die Schleife 256 mal leistungsfähiger als ein einzelnes 8-Bit-Register.<br />

Die Instruktion "SBIW R24,1" verringert das Doppelregister wortweise, d.h. nicht nur <strong>de</strong>r Inhalt<br />

von R24 wird um eins verringert, bei einem Unterlauf von R24 wird auch das nächsthöhere Register<br />

R25 um Eins verringert. Das Doppelregister aus R24 und R25 (besser als R25:R24 benannt) eignet<br />

sich für solche Schleifen beson<strong>de</strong>rs gut, weil die Doppelregister X (R27:R26), Y (R29:R28) und<br />

Z (R31:R30) neben <strong>de</strong>n 16-Bit-Operationen ADIW und SBIW auch noch an<strong>de</strong>re Instruktionen kennen,<br />

und daher für <strong>de</strong>n schnö<strong>de</strong>n Zweck einer Schleife zu scha<strong>de</strong> sind und R25:R24 eben nur ADIW<br />

und SBIW können.<br />

Prozessortakte<br />

Die Anzahl Prozessortakte, die die einzelnen Instruktionen benötigen, steht wie<strong>de</strong>r in <strong>de</strong>n Datenbüchern<br />

<strong>de</strong>r AVRs. Demnach ergibt sich für die 16-Bit-Schleife folgen<strong>de</strong>s Bild:<br />

.equ c1 = 50000 ; 0 Takte, macht <strong>de</strong>r Assembler alleine<br />

ldi R25,HIGH(c1) ; 1 Takt<br />

ldi R24,LOW(c1) ; 1 Takt<br />

Loop: ; Schleifenbeginn<br />

sbiw R24,1 ; 2 Takte<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: 2 Takte, Anzahl Durchläufe: 1 mal<br />

2. Schleife mit Verzweigung an <strong>de</strong>n Schleifenbeginn: 4 Takte, Anzahl Durchläufe: c1 - 1 mal<br />

3. Schleife ohne Verzweigung an <strong>de</strong>n Schleifenbeginn: 3 Takte, Anzahl Durchläufe: 1 mal<br />

Damit ergibt sich die Anzahl Takte nt zu: nt = 2 + 4*(c1-1) + 3 o<strong>de</strong>r mit aufgelöster Klammer zu: nt<br />

= 2 + 4*c1 - 4 + 3 o<strong>de</strong>r noch einfacher zu: nt = 4*c1 + 1.<br />

Zeitverzögerung<br />

Die Maximalzahl an Takten ergibt sich, wenn c1 zu Beginn auf 0 gesetzt wird, dann wird die<br />

Schleife 65536 mal durchlaufen. Maximal sind also 4*65536+1 = 262145 Takte Verzögerung möglich.<br />

Mit <strong>de</strong>r Anzahl Prozessortakte von oben (c1=50000, nc=4*c1+1) und 1,2 MHz Takt ergibt sich<br />

eine Verzögerung von 166,7 ms. Variable Zeitverzögerungen unterschiedlicher Länge sind manchmal<br />

nötig. Dies kann z.B. <strong>de</strong>r Fall sein, wenn die gleiche Software bei verschie<strong>de</strong>nen Taktfrequenzen<br />

laufen soll. Dann sollte die Software so flexibel gestrickt sein, dass nur die Taktfrequenz geän<strong>de</strong>rt<br />

wird und sich die Zeitschleifen automatisch anpassen. So ein Stück Software ist im Folgen<strong>de</strong>n<br />

gezeigt. Zwei verschie<strong>de</strong>ne Zeitverzögerungen sind als Rechenbeispiele angegeben (1 ms, 100 ms).<br />

;<br />

; Verzoegerung 16-Bit mit variabler Dauer<br />

;<br />

.inclu<strong>de</strong> "tn13<strong>de</strong>f.inc"<br />

;<br />

; Hardware-abhaengige Konstante<br />

;<br />

.equ fc = 1200000 ; Prozessortakt (<strong>de</strong>fault)<br />

;<br />

; Meine Konstante

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!