; ***************************************************** ; * Einen Parameter an ein Makro übergeben: geht! * ; * Zeigt den Gebrauch von Makros beim ATMEL AVR- * ; * Assembler, einfach ein Testprogramm für das * ; * ATMEL STK200 Board, (C) 2000 Gerhard Schmidt * ; * Fehlerberichte an info@avr-asm-tutorial.net * ; ***************************************************** ; .NOLIST .INCLUDE "C:\avrtools\appnotes\8515def.inc" .LIST ; ; Verwendete Register ; .DEF mpr=R16 ; Vielzweckregister ; ; Das folgende Makro enthält ein Sprungziel innerhalb des ; Makros und erhält den Zählerstand mit dem ersten Parameter ; übergeben (@0). ; .MACRO TestMacro ldi mpr,@0 ; Setze mpr auf den Wert des ersten Parameters inc mpr ; Erhöhe um eins brne mjmp ; Wenn kein Überlauf, überspringe nächsten Befehl rjmp ovf ; Springe, wenn Überlauf 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 übergeben, dann um Eins erhöht. ; Wenn dann Null rauskommt, springt die Ausführung nach ovf. ; testmacro(0xff) ; Füge das Makro mit dem Parameter FF ein ; ; Weil ein Überlauf passiert sein muss bei der letzten Erhöhung ; sollte der folgende Code niemals ausgeführt werden. Wenn er ; doch ausgeführt würde, wären alle LEDs an. ; outp: out PORTB,mpr loop: rjmp loop ; und in eine Endlaosschleife ; ; Der Überlauf sollte passiert sein und dieser Code wird ausgeführt: ; ovf: ldi mpr,0xFF ; Alle LEDs aus out PORTB,mpr ; und an Port B rjmp loop ; Springe zur Endlosschleife ; ; Nach der Ausführung sind alle LEDs PB.0 bis PB.7 aus.