<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pummelpete</id>
		<title>RN-Wissen.de - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pummelpete"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/Pummelpete"/>
		<updated>2026-04-11T20:44:43Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=PTC/NTC&amp;diff=12310</id>
		<title>PTC/NTC</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=PTC/NTC&amp;diff=12310"/>
				<updated>2007-06-28T12:49:35Z</updated>
		
		<summary type="html">&lt;p&gt;Pummelpete: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NTCs (''Negative Temperature Coefficient'')oder Heißleiter  sind stromleitende Materialien, die bei hohen Temperaturen Strom besser leiten als bei tiefen, das heißt, mit steigender Temperatur sinkt ihr elektrischer Widerstand. &lt;br /&gt;
&lt;br /&gt;
Anders gesagt: sie haben einen negativen Temperaturkoeffizienten. Davon leitet sich auch ihr zweiter Name ab: NTC steht für (engl.) ''negative temperature coefficient''.&lt;br /&gt;
&lt;br /&gt;
Unter anderem gibt es auch PTC's (''positive temperature coeffiecient'') diese leiten den Strom besser umso kälter es wird. Sie haben einen positiven Temperaturkoeffizienten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ntc.gif]]&lt;br /&gt;
&lt;br /&gt;
Ein NTC-Widerstand ändert seinen Widerstand meist nicht linear. Hier ein Beispieldiagramm eines typischen NTC-Widerstandes:&lt;br /&gt;
&lt;br /&gt;
[[Bild:ntcdiagramm.gif]]&lt;br /&gt;
&lt;br /&gt;
==Typische NTCs/PTCs==&lt;br /&gt;
===PTCs:===&lt;br /&gt;
Recht beliebt sind die PTCs der KTY-Reihe z.B KTY81-110. Sie sind sehr günstig (ca. 0,50€) und bieten für die meisten Anwendungen ausreichende Genauigkeit.&lt;br /&gt;
Wenn höhere Anforderungen an Genauigkeit und Linearität gestellt werden, eignen sich die PT100/PT1000 Sensoren. Jedoch sind diese auch erheblich teurer.&lt;br /&gt;
&lt;br /&gt;
===NTCs:===&lt;br /&gt;
-?&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
*[[Sensorarten]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Sensoren]]&lt;/div&gt;</summary>
		<author><name>Pummelpete</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=PTC/NTC&amp;diff=12309</id>
		<title>PTC/NTC</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=PTC/NTC&amp;diff=12309"/>
				<updated>2007-06-28T12:45:52Z</updated>
		
		<summary type="html">&lt;p&gt;Pummelpete: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NTCs (''Negative Temperature Coefficient'')oder Heißleiter  sind stromleitende Materialien, die bei hohen Temperaturen Strom besser leiten als bei tiefen, das heißt, mit steigender Temperatur sinkt ihr elektrischer Widerstand. &lt;br /&gt;
&lt;br /&gt;
Anders gesagt: sie haben einen negativen Temperaturkoeffizienten. Davon leitet sich auch ihr zweiter Name ab: NTC steht für (engl.) ''negative temperature coefficient''.&lt;br /&gt;
&lt;br /&gt;
Unter anderem gibt es auch PTC's (''positive temperature coeffiecient'') diese leiten den Strom besser umso kälter es wird. Sie haben einen positiven Temperaturkoeffizienten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ntc.gif]]&lt;br /&gt;
&lt;br /&gt;
Ein NTC-Widerstand ändert seinen Widerstand meist nicht linear. Hier ein Beispieldiagramm eines typischen NTC-Widerstandes:&lt;br /&gt;
&lt;br /&gt;
[[Bild:ntcdiagramm.gif]]&lt;br /&gt;
&lt;br /&gt;
==Typische NTCs/PTCs==&lt;br /&gt;
PTCs: &amp;lt;/n&amp;gt;&lt;br /&gt;
Recht beliebt sind die PTCs der KTY-Reihe z.B KTY81-110. Sie sind sehr günstig (ca. 0,50€) und bieten für die meisten Anwendungen ausreichende Genauigkeit.&lt;br /&gt;
Wenn höhere Anforderungen an Genauigkeit und Linearität gestellt werden, eignen sich die PT100/PT1000 Sensoren.&lt;br /&gt;
&lt;br /&gt;
NTCs:&lt;br /&gt;
-?&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
*[[Sensorarten]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Sensoren]]&lt;/div&gt;</summary>
		<author><name>Pummelpete</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=PTC/NTC&amp;diff=12308</id>
		<title>PTC/NTC</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=PTC/NTC&amp;diff=12308"/>
				<updated>2007-06-28T12:43:26Z</updated>
		
		<summary type="html">&lt;p&gt;Pummelpete: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NTCs (''Negative Temperature Coefficient'')oder Heißleiter  sind stromleitende Materialien, die bei hohen Temperaturen Strom besser leiten als bei tiefen, das heißt, mit steigender Temperatur sinkt ihr elektrischer Widerstand. &lt;br /&gt;
&lt;br /&gt;
Anders gesagt: sie haben einen negativen Temperaturkoeffizienten. Davon leitet sich auch ihr zweiter Name ab: NTC steht für (engl.) ''negative temperature coefficient''.&lt;br /&gt;
&lt;br /&gt;
Unter anderem gibt es auch PTC's (''positive temperature coeffiecient'') diese leiten den Strom besser umso kälter es wird. Sie haben einen positiven Temperaturkoeffizienten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ntc.gif]]&lt;br /&gt;
&lt;br /&gt;
Ein NTC-Widerstand ändert seinen Widerstand meist nicht linear. Hier ein Beispieldiagramm eines typischen NTC-Widerstandes:&lt;br /&gt;
&lt;br /&gt;
[[Bild:ntcdiagramm.gif]]&lt;br /&gt;
&lt;br /&gt;
==Typische NTCs/PTCs==&lt;br /&gt;
PTCs:&lt;br /&gt;
Recht beliebt sind die PTCs der KTY-Reihe z.B KTY81-110. Sie sind sehr günstig (ca. 0,50€) und bieten für die meisten Anwendungen ausreichende Genauigkeit.&lt;br /&gt;
Wenn höhere Anforderungen an Genauigkeit und Linearität gestellt werden, eignen sich die PT100/PT1000 Sensoren.&lt;br /&gt;
&lt;br /&gt;
NTCs:&lt;br /&gt;
-?&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
*[[Sensorarten]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Sensoren]]&lt;/div&gt;</summary>
		<author><name>Pummelpete</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=PTC/NTC&amp;diff=12306</id>
		<title>PTC/NTC</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=PTC/NTC&amp;diff=12306"/>
				<updated>2007-06-28T12:27:35Z</updated>
		
		<summary type="html">&lt;p&gt;Pummelpete: NTC wurde nach PTC/NTC verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NTCs (''Negative Temperature Coefficient'')oder Heißleiter  sind stromleitende Materialien, die bei hohen Temperaturen Strom besser leiten als bei tiefen, das heißt, mit steigender Temperatur sinkt ihr elektrischer Widerstand. &lt;br /&gt;
&lt;br /&gt;
Anders gesagt: sie haben einen negativen Temperaturkoeffizienten. Davon leitet sich auch ihr zweiter Name ab: NTC steht für (engl.) ''negative temperature coefficient''.&lt;br /&gt;
&lt;br /&gt;
Unter anderem gibt es auch PTC's (''positive temperature coeffiecient'') diese leiten den Strom besser umso kälter es wird. Sie haben einen positiven Temperaturkoeffizienten.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ntc.gif]]&lt;br /&gt;
&lt;br /&gt;
Ein NTC-Widerstand ändert seinen Widerstand meist nicht linear. Hier ein Beispieldiagramm eines typischen NTC-Widerstandes:&lt;br /&gt;
&lt;br /&gt;
[[Bild:ntcdiagramm.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
*[[Sensorarten]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Sensoren]]&lt;/div&gt;</summary>
		<author><name>Pummelpete</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=NTC&amp;diff=12307</id>
		<title>NTC</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=NTC&amp;diff=12307"/>
				<updated>2007-06-28T12:27:35Z</updated>
		
		<summary type="html">&lt;p&gt;Pummelpete: NTC wurde nach PTC/NTC verschoben: NTC und PTC werden erwähnt bzw. sollten zusammen behandelt werden.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[PTC/NTC]]&lt;/div&gt;</summary>
		<author><name>Pummelpete</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Warteschleife&amp;diff=12305</id>
		<title>Warteschleife</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Warteschleife&amp;diff=12305"/>
				<updated>2007-06-28T12:08:56Z</updated>
		
		<summary type="html">&lt;p&gt;Pummelpete: Link hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Oft sieht man den Versuch, Warteschleifen in C durch Zählschleifen zu realisieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void wait ()&lt;br /&gt;
{&lt;br /&gt;
   int i;&lt;br /&gt;
        &lt;br /&gt;
   for (i=0; i&amp;lt;50; i++);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[avr-gcc]] mit Optimierung erzeugt daraus&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wait:&lt;br /&gt;
   ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
und das ist auch völlig in Ordnung, wenn man ein Blick in die C-Spezifikation wagt.&lt;br /&gt;
Die Schleife hat ''keine'' Wirkung auf die Welt! Sie sagt: &lt;br /&gt;
:''&amp;quot;Führe 50 mal ''&amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt;'' aus&amp;quot;''&lt;br /&gt;
Und 50 mal Nichtstun ist eben nichts Tun...&lt;br /&gt;
&lt;br /&gt;
Falls man wirklich auf diese Art warten möchte, hilft folgendes: Man gaukelt dem Compiler vor, es gäbe etwas unheimlich wichtiges in der Schleife zu tun, von dem er nichts mitbekommt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void wait ()&lt;br /&gt;
{&lt;br /&gt;
   int i;&lt;br /&gt;
   &lt;br /&gt;
   for (i=0; i&amp;lt;50; i++)&lt;br /&gt;
      __asm__ __volatile (&amp;quot;; nur ein asm-Kommentar&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
daraus entsteht&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wait:&lt;br /&gt;
   ldi r24,lo8(49)&lt;br /&gt;
   ldi r25,hi8(49)&lt;br /&gt;
.L5:&lt;br /&gt;
/* #APP */&lt;br /&gt;
   ; nur ein asm-Kommentar&lt;br /&gt;
/* #NOAPP */&lt;br /&gt;
   sbiw r24,1&lt;br /&gt;
   sbrs r25,7&lt;br /&gt;
   rjmp .L5&lt;br /&gt;
   ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Schleife wird nun 50 mal durchlaufen.&lt;br /&gt;
&lt;br /&gt;
Wir bemerken, daß das inline Assembler nicht in Code resultiert&lt;br /&gt;
und daß die Schleifenvariable nicht hochzählt, sondern hinunter. &lt;br /&gt;
Auch diese Optimierung ist ok, denn &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; wird nirgends verwendet.&lt;br /&gt;
&lt;br /&gt;
Daß bei dem Beispiel der gewünschte Code erzeugt wird, ist mehr oder weniger Glückssache.&lt;br /&gt;
Ein Compiler transformiert seine Eingabe in ein Assembler- oder Maschinenprogramm, das die gleiche Wirkung hat. ''Wie'' dies genau geschieht, ist in aller Regel nicht festgelegt, &lt;br /&gt;
sondern nur, ''daß'' es passiert &lt;br /&gt;
&amp;amp;#150; ansonsten ist der Compiler selbst fehlerhaft oder implementiert kein&amp;amp;nbsp;C.&lt;br /&gt;
&lt;br /&gt;
In dem lezten Beispiel der Warteschleife ist die Bedeutung des C-Codes etwa &lt;br /&gt;
:''&amp;quot;führe 50 mal das Inline-Assembler-Muster ''&amp;lt;tt&amp;gt;&amp;quot;; nur ein asm-Kommentar&amp;quot;&amp;lt;/tt&amp;gt;'' in den Code ein&amp;quot;''&lt;br /&gt;
Dies wäre auch möglich komplett ohne Schleife(nvariable), indem der Compiler diese wegoptimiert und nur das Inline Assembler 50 mal hintereinander ausgibt. &lt;br /&gt;
Das Resultat wäre im Maschinencode dann wiederum absolut ohne Effekt. &lt;br /&gt;
Bei gcc geschieht dies aber bestenfalls mit der Optimierungsstufe &amp;lt;tt&amp;gt;-O3&amp;lt;/tt&amp;gt;, die für&lt;br /&gt;
AVR absolut nicht zu empfehlen ist. (Oder indem man von Hand die Optionen setzt, die diese&lt;br /&gt;
Optimierungsstrategie nach sich zieht.)&lt;br /&gt;
&lt;br /&gt;
Eine Möglichkeit, dem auf C-Ebene zu begegnen, ist die Schleifenvariable&amp;amp;nbsp;&amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt;&lt;br /&gt;
als volatile zu deklarieren, so daß sie angelegt werden und genau so wie codiert verwendet werden muss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void wait ()&lt;br /&gt;
{&lt;br /&gt;
   int volatile i;&lt;br /&gt;
   &lt;br /&gt;
   for (i=0; i&amp;lt;50; i++)&lt;br /&gt;
      ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das hat allerdings noch andere Konsequenzen, nämlich das Erzwingen des Framepointers&lt;br /&gt;
(bei avr-gcc im Y-Register r28:r29),&lt;br /&gt;
denn&amp;amp;nbsp;&amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; lebt jetzt nicht mehr in einem Register, sondern im Frame und wird wirklich jedesmal von dort gelesen und geschrieben, was recht breiten Code ergibt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wait:&lt;br /&gt;
/* prologue: frame size=2 */&lt;br /&gt;
	push r28&lt;br /&gt;
	push r29&lt;br /&gt;
	in r28,__SP_L__&lt;br /&gt;
	in r29,__SP_H__&lt;br /&gt;
	sbiw r28,2&lt;br /&gt;
	in __tmp_reg__,__SREG__&lt;br /&gt;
	cli&lt;br /&gt;
	out __SP_H__,r29&lt;br /&gt;
	out __SREG__,__tmp_reg__&lt;br /&gt;
	out __SP_L__,r28&lt;br /&gt;
/* prologue end (size=10) */&lt;br /&gt;
	std Y+1,__zero_reg__&lt;br /&gt;
	std Y+2,__zero_reg__&lt;br /&gt;
	ldd r24,Y+1&lt;br /&gt;
	ldd r25,Y+2&lt;br /&gt;
	sbiw r24,50&lt;br /&gt;
	brge .L7&lt;br /&gt;
.L5:&lt;br /&gt;
	ldd r24,Y+1&lt;br /&gt;
	ldd r25,Y+2&lt;br /&gt;
	adiw r24,1&lt;br /&gt;
	std Y+1,r24&lt;br /&gt;
	std Y+2,r25&lt;br /&gt;
	ldd r24,Y+1&lt;br /&gt;
	ldd r25,Y+2&lt;br /&gt;
	sbiw r24,50&lt;br /&gt;
	brlt .L5&lt;br /&gt;
.L7:&lt;br /&gt;
/* epilogue: frame size=2 */&lt;br /&gt;
	adiw r28,2&lt;br /&gt;
	in __tmp_reg__,__SREG__&lt;br /&gt;
	cli&lt;br /&gt;
	out __SP_H__,r29&lt;br /&gt;
	out __SREG__,__tmp_reg__&lt;br /&gt;
	out __SP_L__,r28&lt;br /&gt;
	pop r29&lt;br /&gt;
	pop r28&lt;br /&gt;
	ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das ist der totale Overkill. &lt;br /&gt;
Inakzeptabel breiter Code und ein einzelner Schleifendurchlauf dauert viele Instruktionen, &lt;br /&gt;
so dass die verstrichene Zeit nur recht grobkörnig eingestellt werden kann, denn ein Durchlauf dauert 18 Zyklen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Näher am Ziel liegt ein Ausbau der asm-Variante, indem man dort erzwingt, daß &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt;&lt;br /&gt;
wirklich vom Compiler angelegt wird. Das kann nur dadurch sichergestellt werden,&lt;br /&gt;
daß es verwendet wird. Dazu wird erzwungen, daß &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; in ein Register geladen wird.&lt;br /&gt;
Wir steuern also die Reload-Phase (die Phase, die Variablen in Register verteilt) von gcc.&lt;br /&gt;
Da diese Ausgabe möglicherweise öfter zu bewältigen ist, wurde der erzwungene Reload&lt;br /&gt;
als Makro definiert, der noch eine asm-Ausgabe macht, was reloadet wird:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define RELOAD(reg,var) \&lt;br /&gt;
   __asm__ __volatile (&amp;quot;;RELOAD &amp;quot; reg &amp;quot; with &amp;quot; #var : &amp;quot;=&amp;quot; reg (var) : &amp;quot;0&amp;quot; (var) : &amp;quot;memory&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
void wait ()&lt;br /&gt;
{&lt;br /&gt;
   int i;&lt;br /&gt;
   &lt;br /&gt;
   for (i=0; i&amp;lt;50; i++)&lt;br /&gt;
      RELOAD (&amp;quot;r&amp;quot;, i);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Makro im Beispiel löst auf zu&lt;br /&gt;
 __asm__ __volatile (&amp;quot;;RELOAD r with i&amp;quot; : &amp;quot;=r&amp;quot; (i) : &amp;quot;0&amp;quot; (i) : &amp;quot;memory&amp;quot;)&lt;br /&gt;
Das bedeutet, daß &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; in ein Register der Registerklasse &amp;lt;tt&amp;gt;r&amp;lt;/tt&amp;gt; geladen wird.&lt;br /&gt;
In allen GCC-Versionen steht dieses &amp;lt;tt&amp;gt;r&amp;lt;/tt&amp;gt; für ein Standard-Register (GPR).&lt;br /&gt;
Der erzeugte Code sieht nun besser aus, ist aber immer noch abhängig vom Optimierungsgrad&lt;br /&gt;
etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wait:&lt;br /&gt;
   ldi r24,lo8(0)&lt;br /&gt;
   ldi r25,hi8(0)&lt;br /&gt;
.L5:&lt;br /&gt;
/* #APP */&lt;br /&gt;
   ;RELOAD r with i&lt;br /&gt;
/* #NOAPP */&lt;br /&gt;
   adiw r24,1&lt;br /&gt;
   cpi r24,50&lt;br /&gt;
   cpc r25,__zero_reg__&lt;br /&gt;
   brlt .L5&lt;br /&gt;
   ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere reine C-Variante, die näher am Ziel liegt, könnte so aussehen. Das &amp;lt;tt&amp;gt;(void)&amp;lt;/tt&amp;gt; vermeidet eine Warnung, weil &amp;lt;tt&amp;gt;dummy&amp;lt;/tt&amp;gt; nicht verwendet wird:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void wait ()&lt;br /&gt;
{&lt;br /&gt;
   int i;&lt;br /&gt;
   &lt;br /&gt;
   for (i=0; i&amp;lt;50; i++)&lt;br /&gt;
   {&lt;br /&gt;
      static unsigned char volatile dummy;&lt;br /&gt;
      (void) (dummy = i);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Was zu diesem Code führt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wait:&lt;br /&gt;
	ldi r24,lo8(0)&lt;br /&gt;
	ldi r25,hi8(0)&lt;br /&gt;
.L5:&lt;br /&gt;
	sts dummy.0,r24&lt;br /&gt;
	adiw r24,1&lt;br /&gt;
	cpi r24,50&lt;br /&gt;
	cpc r25,__zero_reg__&lt;br /&gt;
	brlt .L5&lt;br /&gt;
	ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
oder so was&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void wait ()&lt;br /&gt;
{&lt;br /&gt;
   int i;&lt;br /&gt;
   &lt;br /&gt;
   for (i=0; i&amp;lt;50; i++)&lt;br /&gt;
      (void) (int * volatile) &amp;amp;i;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
was wieder den minimalen Code ergibt wie beim erzwungenen Reload:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wait:&lt;br /&gt;
   ldi r24,lo8(0)&lt;br /&gt;
   ldi r25,hi8(0)&lt;br /&gt;
.L5:&lt;br /&gt;
   adiw r24,1&lt;br /&gt;
   cpi r24,50&lt;br /&gt;
   cpc r25,__zero_reg__&lt;br /&gt;
   brlt .L5&lt;br /&gt;
   ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Fazit=&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Die einzig sichere Lösung, einen bestimmten Code generieren zu lassen, ist und bleibt das Gewünschte komplett in (Inline) Assembler auszudrücken.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Das kann dann so aussehen für eine feste Anzahl von Schleifendurchläufen von 1 bis 255, hier für 50 Durchläufe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void wait()&lt;br /&gt;
{&lt;br /&gt;
   unsigned char i = 0;&lt;br /&gt;
&lt;br /&gt;
   __asm__ __volatile (&lt;br /&gt;
      &amp;quot;0:               &amp;quot;    &amp;quot;\n\t&amp;quot;&lt;br /&gt;
      &amp;quot;subi %0, 1       &amp;quot;    &amp;quot;\n\t&amp;quot;&lt;br /&gt;
      &amp;quot;cpi  %0, lo8(%2) &amp;quot;    &amp;quot;\n\t&amp;quot;&lt;br /&gt;
      &amp;quot;brlo 0b          &amp;quot;  &lt;br /&gt;
      : &amp;quot;=d&amp;quot; (i)&lt;br /&gt;
      : &amp;quot;0&amp;quot; (i), &amp;quot;M&amp;quot; (50)&lt;br /&gt;
   );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Und wenn ein 16-Bit-Wert übergeben möchte, dann könnte es so aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void wait (unsigned short num)&lt;br /&gt;
{&lt;br /&gt;
   unsigned short i = 0;&lt;br /&gt;
&lt;br /&gt;
   __asm__ __volatile (&lt;br /&gt;
      &amp;quot;0:                &amp;quot;   &amp;quot;\n\t&amp;quot;&lt;br /&gt;
      &amp;quot;cp   %A0, %A2     &amp;quot;   &amp;quot;\n\t&amp;quot;&lt;br /&gt;
      &amp;quot;cpc  %B0, %B2     &amp;quot;   &amp;quot;\n\t&amp;quot;&lt;br /&gt;
      &amp;quot;brsh 1f           &amp;quot;   &amp;quot;\n\t&amp;quot;&lt;br /&gt;
      &amp;quot;subi %A0, lo8(-1) &amp;quot;   &amp;quot;\n\t&amp;quot;&lt;br /&gt;
      &amp;quot;sbci %B0, hi8(-1) &amp;quot;   &amp;quot;\n\t&amp;quot;&lt;br /&gt;
      &amp;quot;rjmp 0b           &amp;quot;   &amp;quot;\n\t&amp;quot;&lt;br /&gt;
      &amp;quot;1:                &amp;quot;&lt;br /&gt;
      : &amp;quot;=d&amp;quot; (i)&lt;br /&gt;
      : &amp;quot;0&amp;quot; (i), &amp;quot;r&amp;quot; (num)&lt;br /&gt;
   );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=delay.h=&lt;br /&gt;
Durch den Header (Include-Datei) &amp;lt;tt&amp;gt;avr/delay.h&amp;lt;/tt&amp;gt; werden zwei Funktionen (als &amp;lt;tt&amp;gt;static inline&amp;lt;/tt&amp;gt; implementiert) zur Verfügung gestellt, die mit minimalem Overhead eine bestimmte Anzahl von Maschinenzyklen verstreichen lassen:&lt;br /&gt;
;&amp;lt;tt&amp;gt;void _delay_loop_1 (uint8_t count)&amp;lt;/tt&amp;gt;: Dauert &amp;lt;tt&amp;gt;3&amp;amp;middot;count-1&amp;lt;/tt&amp;gt; Zyklen&lt;br /&gt;
;&amp;lt;tt&amp;gt;void _delay_loop_2 (uint16_t count)&amp;lt;/tt&amp;gt;: Dauert &amp;lt;tt&amp;gt;4&amp;amp;middot;count-1&amp;lt;/tt&amp;gt; Zyklen&lt;br /&gt;
Dabei wird &amp;lt;tt&amp;gt;count=0&amp;lt;/tt&amp;gt; wie 256 (&amp;lt;math&amp;gt;2^8&amp;lt;/math&amp;gt;) bzw. 65536 (&amp;lt;math&amp;gt;2^{16}&amp;lt;/math&amp;gt;) genommen. Zyklen für den Funktionsaufruf müssen keine zugerechnet werden, da es Inline-Funktionen sind. Jedoch muss die Schleifenvariable vorgeladen werden und wenn [[Interrupt]]s aktiv sind, kommen deren Zeiten hinzu, falls in der Schleife ne [[IRQ]] auftritt. Jede Inline-Funktion ist 4 Bytes lang.&lt;br /&gt;
&lt;br /&gt;
=Tip: Nützliches Tool=&lt;br /&gt;
Ein sehr praktisches Tool, um Schleifen von beliebiger Dauer zu erzeugen, kann man hier herunterladen: http://www.home.unix-ag.org/tjabo/avr/AVRdelayloop.html.&lt;br /&gt;
Man gibt einfach die Taktfrequenz, die gewünschte Zeit und drei Register ein und das Programm erzeugt einen passenden Assembler Code.&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[avr-gcc]]&lt;br /&gt;
* [[Inline-Assembler in avr-gcc|Inline-Assembler]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;br /&gt;
[[Kategorie:Quellcode Assembler AVR]]&lt;br /&gt;
[[Kategorie:Software]]&lt;/div&gt;</summary>
		<author><name>Pummelpete</name></author>	</entry>

	</feed>