; ***************************************************** ; * Sprungziele innerhalb eines Makros: Es geht! * ; * Zeigt die Anwendung von Makros mit dem ATMEL AVR * ; * Assembler, nur ein Testprogramm für das * ; * ATMEL STK200 Board, (C) 2000 Gerhard Schmidt * ; * Fehler bitte an info@avr-asm-tutorial.net * ; ***************************************************** ; .NOLIST .INCLUDE "C:\avrtools\appnotes\8515def.inc" .LIST ; ; Verwendete Register ; .DEF mpr=R16 ; Vielzweckregister ; ; Der folgende Code ist ein Makro, das einen Sprung ; zu einem Ziel innerhalb und einen Sprung zu einem ; Ziel ausserhalb des Makros enthält. Beide Befehle ; werden vom Assembler korrekt übersetzt. ; .MACRO TestMacro inc mpr ; Erhöhe das Register mpr brne mjmp ; Wenn kein Überlauf, dann überspringe rjmp ovf ; Springe zu Ziel ausserhalb des Makros mjmp: .ENDMACRO ; .LISTMAC ; ; Beginn des Hauptprogrammes ; ldi mpr,0xFF ; PortB (LEDs) ist Ausgang out DDRB,mpr ; an Datenrichtungsregister ; ldi mpr,0xFE ; Setze Register auf 254 testmacro ; Füge das Makro einmal ein (1xINC) testmacro ; Füge es noch einmal ein (+1xINC) ; Da bei der Ausführung bis hier ein Überlauf passiert sein muss, ; wird der nun folgende Code nicht ausgeführt. Wenn er ausgeführt ; würde, würden alle LEDs an sein. ; outp: out PORTB,mpr loop: rjmp loop ; und Ende in einer Schleife ; ; Der Überlauf ist passiertund dieser Code wird ausgeführt: ; ovf: ldi mpr,0xFF ; Alle LEDs ausschalten out PORTB,mpr ; auf Port B rjmp loop ; Springe zur Endlosschleife ; ; Nach der Ausführung sollten alle LEDs PB.0 to PB.7 aus sein.