; ***************************************************** ; * Sprungziele innerhalb eines Makros: Es geht! * ; * Zeigt die Anwendung von Makros mit dem ATMEL AVR * ; * Assembler, nur ein Testprogramm fuer das * ; * ATMEL STK200 Board, (C) 2000 Gerhard Schmidt * ; * Fehler bitte an http://www.avr-asm-tutorial.net * ; ***************************************************** ; .NOLIST .INCLUDE "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 enthaelt. Beide Befehle ; werden vom Assembler korrekt uebersetzt. ; .MACRO TestMacro inc mpr ; Erhoehe das Register mpr brne mjmp ; Wenn kein Ueberlauf, dann ueberspringe 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 ; Fuege das Makro einmal ein (1xINC) testmacro ; Fuege es noch einmal ein (+1xINC) ; Da bei der Ausfuehrung bis hier ein Ueberlauf passiert sein muss, ; wird der nun folgende Code nicht ausgefuehrt. Wenn er ausgefuehrt ; wuerde, wuerden alle LEDs an sein. ; outp: out PORTB,mpr loop: rjmp loop ; und Ende in einer Schleife ; ; Der Ueberlauf ist passiertund dieser Code wird ausgefuehrt: ; ovf: ldi mpr,0xFF ; Alle LEDs ausschalten out PORTB,mpr ; auf Port B rjmp loop ; Springe zur Endlosschleife ; ; Nach der Ausfuehrung sollten alle LEDs PB.0 to PB.7 aus sein.