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

[...] weiter im Programm<br />

Jetzt muss das "Unterprogramm" allerdings anstelle <strong>de</strong>s RET natürlich ebenfalls eine RJMP-Instruktion<br />

bekommen und zum Label Zurueck: verzweigen. Da <strong>de</strong>r Programmco<strong>de</strong> dann aber nicht<br />

mehr von an<strong>de</strong>ren Stellen im Programmco<strong>de</strong> aufgerufen wer<strong>de</strong>n kann (die Rückkehr funktioniert<br />

jetzt nicht mehr), ist die Springerei ziemlich sinnlos. Auf je<strong>de</strong>n Fall haben wir jetzt auch das relative<br />

Springen mit RJMP gelernt.<br />

RCALL und RJMP sind auf je<strong>de</strong>n Fall unbedingte Verzweigungen. Ob sie ausgeführt wer<strong>de</strong>n hängt<br />

nicht von irgendwelchen weiteren Bedingungen ab. Zum bedingten Ausführen eines Unterprogrammes<br />

muss das Unterprogramm mit einer bedingten Verzweigungsinstruktion kombiniert wer<strong>de</strong>n, <strong>de</strong>r<br />

unter bestimmten Bedingungen das Unterprogramm ausführt o<strong>de</strong>r <strong>de</strong>n Aufruf eben überspringt. Für<br />

solche bedingten Verzweigungen zu einem Unterprogramm eignen sich die bei<strong>de</strong>n folgen<strong>de</strong>n Instruktionen<br />

i<strong>de</strong>al. Soll in Abhängigkeit vom Zustand eines Bits in einem Register zu einem Unterprogramm<br />

o<strong>de</strong>r einem an<strong>de</strong>ren Programmteil verzweigt wer<strong>de</strong>n, dann geht das so:<br />

SBRC R1,7 ; Überspringe die folgen<strong>de</strong> Instruktion wenn Bit 7 im Register R1 Null ist<br />

RCALL UpLabel ; Rufe Unterprogramm auf<br />

Hier wird <strong>de</strong>r RCALL zum Unterprogramm UpLabel: nur ausgeführt, wenn das Bit 7 im Register<br />

R1 eine Eins ist, weil die Instruktion bei einer Null (Clear) übersprungen wird. Will man auf die<br />

umgekehrte Bedingung hin ausführen, so kommt statt SBRC die analoge Instruktion SBRS zum<br />

Einsatz. Die auf SBRC/SBRS folgen<strong>de</strong> Instruktion kann sowohl eine Ein-Wort- als auch eine Zwei-<br />

Wort-Instruktion sein, <strong>de</strong>r Prozessor weiß über die Länge <strong>de</strong>r Instruktionen korrekt Bescheid und<br />

überspringt dann eben um die richtige Anzahl Instruktionsworte. Zum Überspringen von mehr als<br />

einer Instruktion kann dieser bedingte Sprung natürlich nicht benutzt wer<strong>de</strong>n.<br />

Soll ein Überspringen nur dann erfolgen, wenn zwei Registerinhalte gleich sind, dann bietet sich die<br />

etwas exotische Instruktion<br />

CPSE R1,R2 ; Vergleiche R1 und R2, springe wenn gleich<br />

RCALL UpIrgendwas ; Rufe irgendwas<br />

Der wird selten gebraucht und ist ein Mauerblümchen.<br />

Man kann aber auch in Abhängigkeit von bestimmten Port-Bits die nächste Instruktion überspringen.<br />

Die entsprechen<strong>de</strong>n Instruktionen heißen SBIC und SBIS, also etwa so:<br />

SBIC PINB,0 ; Überspringe wenn Bit 0 Null ist<br />

RJMP EinZiel ; Springe zum Label EinZiel<br />

Hier wird die RJMP-Instruktion nur übersprungen, wenn das Bit 0 im Eingabeport PINB gera<strong>de</strong><br />

Null ist. Also wird das Programm an dieser Stelle nur dann zum Programmteil EinZiel: verzweigen,<br />

wenn das Portbit 0 Eins ist. Das ist etwas verwirrend, da die Kombination von SBIC und RJMP etwas<br />

umgekehrt wirkt als sprachlich naheliegend ist. Das umgekehrte Sprungverhalten kann anstelle<br />

von SBIC mit SBIS erreicht wer<strong>de</strong>n. Lei<strong>de</strong>r kommen als Ports bei <strong>de</strong>n bei<strong>de</strong>n Instruktionen nur die<br />

unteren 32 infrage, für die oberen 32 Ports können diese Instruktionen nicht verwen<strong>de</strong>t wer<strong>de</strong>n.<br />

Nun noch die Exotenanwendung für <strong>de</strong>n absoluten Spezialisten. Nehmen wir mal an, sie hätten vier<br />

Eingänge am AVR, an <strong>de</strong>nen ein Bitklavier angeschlossen sei (vier kleine Schalterchen). Je nach<strong>de</strong>m,<br />

welche <strong>de</strong>r vier Schalter eingestellt sei, soll <strong>de</strong>r AVR 16 verschie<strong>de</strong>ne Tätigkeiten vollführen.<br />

Nun könnten Sie selbstverständlich <strong>de</strong>n Porteingang lesen und mit je<strong>de</strong> Menge Branch-Anweisungen<br />

schon herausfin<strong>de</strong>n, welches <strong>de</strong>r 16 Programmteile <strong>de</strong>nn heute gewünscht wird. Sie können<br />

aber auch eine Tabelle mit je einer Sprunginstruktion auf die sechzehn Routinen machen, etwa so:<br />

MeinTab:

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!