<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=80.228.181.250</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=80.228.181.250"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/80.228.181.250"/>
	<updated>2026-04-10T23:39:53Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Assembler_Makros&amp;diff=25347</id>
		<title>AVR Assembler Makros</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Assembler_Makros&amp;diff=25347"/>
		<updated>2008-01-04T13:13:35Z</updated>

		<summary type="html">&lt;p&gt;80.228.181.250: es gibt einen eigenen befehl zum subtrahieren von 16bit werten: sbiw&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:AVR]]&lt;br /&gt;
&lt;br /&gt;
Hier entsteht eine Sammlung von verschiedenen nützlichen [[Makro|Makros]] für den [[AVR]] [[Assembler]].&lt;br /&gt;
&lt;br /&gt;
=== 16 Bit Konstante in Z-Pointer laden ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.MACRO SetZPtr ;(Adresse)&lt;br /&gt;
        ldi     ZL, LOW(@0)&lt;br /&gt;
        ldi     ZH, HIGH(@0)&lt;br /&gt;
.ENDMACRO&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Natürlich auch möglich mit X- und Y-Pointer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Speicher==&lt;br /&gt;
=== 2 Register ohne Zwischenspeicher vertauschen ===&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.MACRO SWAP ;(a, b)&lt;br /&gt;
        eor     @0, @1&lt;br /&gt;
        eor     @1, @0&lt;br /&gt;
        eor     @0, @1&lt;br /&gt;
.ENDMACRO&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Arithmetik==&lt;br /&gt;
&lt;br /&gt;
=== Konstante addieren ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.MACRO ADDI ;(a, k)&lt;br /&gt;
        subi    @0, -(@1)&lt;br /&gt;
.ENDMACRO&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konstante addieren (16 Bit) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.MACRO ADDIW ;(RdL:RdH, k)&lt;br /&gt;
        subi    @0L, LOW(-@1)  &lt;br /&gt;
        sbci    @0H, HIGH(-@1)&lt;br /&gt;
.ENDMACRO&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.MACRO ADDIW ;(Rd, k)&lt;br /&gt;
        sbiw    @0, (-@1)&lt;br /&gt;
.ENDMACRO&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==I/O==&lt;br /&gt;
&lt;br /&gt;
Bei grösseren und neueren AVRs sind etliche I/O-Register nicht mit IN/OUT-Befehlen ansprechbar. LDS/STS erreicht zwar alle, ist aber bei kleineren oder älteren ineffizient.&lt;br /&gt;
&lt;br /&gt;
=== Port lesen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.macro input&lt;br /&gt;
  .if @1 &amp;lt; 0x40&lt;br /&gt;
	in	@0, @1&lt;br /&gt;
  .else&lt;br /&gt;
  	lds	@0, @1&lt;br /&gt;
  .endif&lt;br /&gt;
.endm&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Port schreiben ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.macro output&lt;br /&gt;
  .if @0 &amp;lt; 0x40&lt;br /&gt;
	out	@0, @1&lt;br /&gt;
  .else&lt;br /&gt;
  	sts	@0, @1&lt;br /&gt;
  .endif&lt;br /&gt;
.endm&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Portbit abfragen ===&lt;br /&gt;
&lt;br /&gt;
Abfrage eines Bits eines I/O-Ports und Sprung wenn 1/0.&lt;br /&gt;
Überschreibt u.U. ZL.&lt;br /&gt;
&lt;br /&gt;
Branch if Bit in I/O-Register is Set&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.macro bbis ;port,bit,target&lt;br /&gt;
  .if @0 &amp;lt; 0x20&lt;br /&gt;
 	sbic	@0, @1&lt;br /&gt;
	rjmp	@2&lt;br /&gt;
  .elif @0 &amp;lt; 0x40&lt;br /&gt;
	in	zl, @0&lt;br /&gt;
	sbrc	zl, @1&lt;br /&gt;
	rjmp	@2&lt;br /&gt;
  .else&lt;br /&gt;
	lds	zl, @0&lt;br /&gt;
	sbrc	zl, @1&lt;br /&gt;
	rjmp	@2&lt;br /&gt;
  .endif&lt;br /&gt;
.endm&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Branch if Bit in I/O-Register is Cleared&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.macro bbic ;port,bit,target&lt;br /&gt;
  .if @0 &amp;lt; 0x20&lt;br /&gt;
 	sbis	@0, @1&lt;br /&gt;
	rjmp	@2&lt;br /&gt;
  .elif @0 &amp;lt; 0x40&lt;br /&gt;
	in	zl, @0&lt;br /&gt;
	sbrs	zl, @1&lt;br /&gt;
	rjmp	@2&lt;br /&gt;
  .else&lt;br /&gt;
	lds	zl, @0&lt;br /&gt;
	sbrs	zl, @1&lt;br /&gt;
	rjmp	@2&lt;br /&gt;
  .endif&lt;br /&gt;
.endm&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;/div&gt;</summary>
		<author><name>80.228.181.250</name></author>
	</entry>
</feed>