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