; ***************************************************** ; * Einen Parameter an ein Makro uebergeben: geht! * ; * Zeigt den Gebrauch von Makros beim ATMEL AVR- * ; * Assembler, einfach ein Testprogramm fuer das * ; * ATMEL STK200 Board, (C) 2000 Gerhard Schmidt * ; * Fehlerberichte an http://www.avr-asm-tutorial.net * ; ***************************************************** ; .NOLIST .INCLUDE "8515def.inc" .LIST ; ; Verwendete Register ; .DEF mpr=R16 ; Vielzweckregister ; ; Das folgende Makro enthaelt ein Sprungziel innerhalb des ; Makros und erhaelt den Zaehlerstand mit dem ersten Parameter ; uebergeben (@0). ; .MACRO TestMacro ldi mpr,@0 ; Setze mpr auf den Wert des ersten Parameters inc mpr ; Erhoehe um eins brne mjmp ; Wenn kein Ueberlauf, ueberspringe naechsten Befehl rjmp ovf ; Springe, wenn Ueberlauf erfolgt. 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 ; Hier kommt das Makro: 0xFF wird uebergeben, dann um Eins erhoeht. ; Wenn dann Null rauskommt, springt die Ausfuehrung nach ovf. ; testmacro(0xff) ; Fuege das Makro mit dem Parameter FF ein ; ; Weil ein Ueberlauf passiert sein muss bei der letzten Erhoehung ; sollte der folgende Code niemals ausgefuehrt werden. Wenn er ; doch ausgefuehrt wuerde, waeren alle LEDs an. ; outp: out PORTB,mpr loop: rjmp loop ; und in eine Endlaosschleife ; ; Der Ueberlauf sollte passiert sein und dieser Code wird ausgefuehrt: ; ovf: ldi mpr,0xFF ; Alle LEDs aus out PORTB,mpr ; und an Port B rjmp loop ; Springe zur Endlosschleife ; ; Nach der Ausfuehrung sind alle LEDs PB.0 bis PB.7 aus.