<?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=Devusruh</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=Devusruh"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/Devusruh"/>
		<updated>2026-04-11T20:44:52Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Diskussion:RN-Definitionen&amp;diff=17295</id>
		<title>Diskussion:RN-Definitionen</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Diskussion:RN-Definitionen&amp;diff=17295"/>
				<updated>2011-03-08T13:31:04Z</updated>
		
		<summary type="html">&lt;p&gt;Devusruh: Download-Links zeigen ins alte Forum, wo ein Download nicht mehr möglich ist.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== EAGLE-Bibliothek der RN-Definitionen ==&lt;br /&gt;
* Es wäre schön, wenn hier auch ein Download-Link zu der EAGLE-Bibliothek der RN-Definitionen existieren würde.&lt;br /&gt;
&lt;br /&gt;
== Etwas zu den Download-Links im Artikel ==&lt;br /&gt;
* Der Link http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=81 ist leider nicht mehr funktionsfähig, da er ins alte Forum zeigt und dort ohne Login nichts läuft. Da Login ist aber unmöglich, weil es halt das neue Forum gibt, ...&lt;br /&gt;
* Gibt es eine allgemeine Lösung zu dem DL-Problem? Wäre schade, wenn die DLs plötzlich nicht mehr zur Verfügung ständen. Würde mich dazu gern einbringen, wenn Hilfe gebraucht wird.&lt;/div&gt;</summary>
		<author><name>Devusruh</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Diskussion:RN-Definitionen&amp;diff=17294</id>
		<title>Diskussion:RN-Definitionen</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Diskussion:RN-Definitionen&amp;diff=17294"/>
				<updated>2011-03-08T13:29:41Z</updated>
		
		<summary type="html">&lt;p&gt;Devusruh: ein Vorschlag zu der EAGLE-Bibliothek der RN-Definitionen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== EAGLE-Bibliothek der RN-Definitionen ==&lt;br /&gt;
* Es wäre schön, wenn hier auch ein Download-Link zu der EAGLE-Bibliothek der RN-Definitionen existieren würde.&lt;/div&gt;</summary>
		<author><name>Devusruh</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Taster-Abfrage_in_C&amp;diff=17253</id>
		<title>Taster-Abfrage in C</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Taster-Abfrage_in_C&amp;diff=17253"/>
				<updated>2011-02-16T16:42:00Z</updated>
		
		<summary type="html">&lt;p&gt;Devusruh: /* ATmega8 und avr-gcc */ Pullup-Widerstände nur für low-aktive Taster&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Abfrage von Tastern, die an einen [[Mikrocontroller]] angeschlossen sind, wird sich üblicherweise in zwei Phasen aufteilen:&lt;br /&gt;
# Abfrage der Port-Werte, an denen die Taster angeschlossen sind&lt;br /&gt;
# Verarbeitung dieser Werte&lt;br /&gt;
&lt;br /&gt;
Während Punkt&amp;amp;nbsp;1 nur abhängig von der Hardware gelöst werden kann, ist Punkt&amp;amp;nbsp;2 hardware-unabhängig formulierbar. Dieser Artikel legt seinen Fokus auf Punkt&amp;amp;nbsp;2.&lt;br /&gt;
&lt;br /&gt;
=Überblick=&lt;br /&gt;
Die Haupt-Nutzen, welche die hier vorgestellte Taster-Auswertung bietet, sind:&lt;br /&gt;
* Abfrage, ob eine Taste gedrückt wurde und welche Taste dies war&lt;br /&gt;
* Entprellung der Taster&lt;br /&gt;
* Die Abfrage soll &amp;quot;nebenher&amp;quot; geschehen, um die Hauptanwendung nicht zu blockieren oder unnötig Zeit zu verschwenden.&lt;br /&gt;
* Das Verhalten der einzelnen Taster soll zur Laufzeit des Programmes änderbar sein.&lt;br /&gt;
* Evtl. unterscheiden, ob eine Taste kurz oder lange gedrückt wurde&lt;br /&gt;
* Evtl. automatische Wiederholfunktion bei längerem Tastendruck (auto-repeat)&lt;br /&gt;
* Da die Taster-Auswertung unabhängig von der Hardware ist, soll der C-Code dies auch sein: Er ist Standard-C (ANSI-C, ISO C90).&lt;br /&gt;
&lt;br /&gt;
Was die Taster-Auswertung &amp;lt;u&amp;gt;nicht&amp;lt;/u&amp;gt; unterstützt:&lt;br /&gt;
* Erkennung gleichzeitigen Drückens mehrerer Taster (Shift-Funktion)&lt;br /&gt;
* Doppeldrucke (vergleichbar dem Doppel-Click bei einer PC-Maus). Dieses Feature kann relativ leicht hinzu implementiert werden. Damit hätte man bis zu drei verschiedene Funktionen je Taster : kurz, lang und Doppel-Click.&lt;br /&gt;
&lt;br /&gt;
== Funktionsweise == &lt;br /&gt;
&lt;br /&gt;
Zunächst werden die Betriebsmodi für alle Taster eingestellt. In regelmässigen Zeitabständen werden dann die Port-Zustände der auszuwertenden Taster an die Funktion &amp;lt;tt&amp;gt;get_taster&amp;lt;/tt&amp;gt; übermittelt, welche in der globalen Variablen &amp;lt;tt&amp;gt;taster&amp;lt;/tt&amp;gt; das Ergebnis der Auswertung speichert.&lt;br /&gt;
&lt;br /&gt;
Dadurch, daß diese Funktion nur etwa alle 10ms aufgerufen wird, wird automatisch eine Entprellung der Taster erreicht.&lt;br /&gt;
&lt;br /&gt;
Im Hauptprogramm kann der Wert der Variablen &amp;lt;tt&amp;gt;taster&amp;lt;/tt&amp;gt; abgefragt werden und abhängig davon Aktionen ausgeführt/ausgelöst werden. Nachdem &amp;lt;tt&amp;gt;taster&amp;lt;/tt&amp;gt; gelesen wurde wird die Variable geleert und es kann ein weiterer Tastendruck empfangen werden.&lt;br /&gt;
&lt;br /&gt;
=Interface=&lt;br /&gt;
==Funktionen==&lt;br /&gt;
;&amp;lt;tt&amp;gt;void get_taster (const unsigned char num, unsigned char tast)&amp;lt;/tt&amp;gt;: Diese Funktion muss in regelmässigen Abständen aufgerufen werden; sinnvoller Weise durch eine [[ISR|Interrupt Service Routine]], die Funktion ist kurz genug dafür. Die Zeit zwischen zwei aufeinanderfolgenden Aufrufen von &amp;lt;tt&amp;gt;get_taster&amp;lt;/tt&amp;gt; für ''die gleiche Tastennummer'' &amp;lt;tt&amp;gt;num&amp;lt;/tt&amp;gt; wird unten auch als '''Tick''' bezeichnet.&lt;br /&gt;
&lt;br /&gt;
:Als Richtwert für die Dauer eines Ticks kann man sich an 10ms orientieren.&lt;br /&gt;
:{|&lt;br /&gt;
;&amp;lt;tt&amp;gt;num&amp;lt;/tt&amp;gt;: Dies ist die Nummer des Tasters: &amp;lt;tt&amp;gt;0 &amp;lt;= num &amp;lt; NUM_TASTER&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
;&amp;lt;tt&amp;gt;tast&amp;lt;/tt&amp;gt;: Der Wert dieses Taster, wie vom Input-Port gelesen. Die Behandlung kann für low-aktive oder high-aktive Taster erfolgen. Beispiel für [[avr-gcc]]: Taster No.&amp;amp;nbsp;0 an Port B1:&lt;br /&gt;
:&amp;lt;pre&amp;gt;get_taster (0, PINB &amp;amp; (1 &amp;lt;&amp;lt; PB1));&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Datenstrukturen==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;taster&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
volatile signed char taster;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Über diese Variable wird ein erfolgter Tastendruck mitgeteilt. &lt;br /&gt;
* Gab es keinen Tastendruck, dann hat &amp;lt;tt&amp;gt;taster&amp;lt;/tt&amp;gt; den Wert &amp;lt;tt&amp;gt;NO_TASTER&amp;lt;/tt&amp;gt;. &lt;br /&gt;
* Gab es einen (kurzen) Tastendruck, dann wird hier die Nummer der gedrückten Taste gespeichert.&lt;br /&gt;
* Gab es einen langen Tastendruck &amp;amp;ndash; was nur sein kann, wenn der Mode des entsprechenden Tasters &amp;lt;tt&amp;gt;TM_LONG&amp;lt;/tt&amp;gt; ist &amp;amp;ndash;, dann wird hier die Nummer der gedrückten Taste plus &amp;lt;tt&amp;gt;TASTER_LONG&amp;lt;/tt&amp;gt; gespeichert.&lt;br /&gt;
* '''Solange &amp;lt;tt&amp;gt;taster&amp;lt;/tt&amp;gt; ungleich &amp;lt;tt&amp;gt;NO_TASTER&amp;lt;/tt&amp;gt; ist, wird kein neuer Tastendruck entgegen genommen. Nach Verarbeitung eines Taster-Wertes muss daher &amp;lt;tt&amp;gt;taster&amp;lt;/tt&amp;gt; wieder auf &amp;lt;tt&amp;gt;NO_TASTER&amp;lt;/tt&amp;gt; zurückgesetzt werden!''' &amp;lt;tt&amp;gt;taster&amp;lt;/tt&amp;gt; funktioniert also wie ein Tastaturpuffer, in welchen nur ein einziges Zeichen hineinpasst.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;taste_t&amp;lt;/tt&amp;gt;===&lt;br /&gt;
 typedef struct &lt;br /&gt;
 {&lt;br /&gt;
     ...&lt;br /&gt;
 &lt;br /&gt;
     {{comment|Mode des Tasters aus: TM_SHORT, TM_LONG, TM_REPEAT}}&lt;br /&gt;
     unsigned char mode;&lt;br /&gt;
 } taste_t;&lt;br /&gt;
&lt;br /&gt;
Jeder Taster wird im Array &amp;lt;tt&amp;gt;tasten&amp;lt;/tt&amp;gt; durch einen Eintrag repräsentiert. Die einzige interessante Komponente in dieser Struktur ist &amp;lt;tt&amp;gt;mode&amp;lt;/tt&amp;gt;. Indem man dieser Komponente einen der Werte &amp;lt;tt&amp;gt;TM_SHORT&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;TM_LONG&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;TM_REPEAT&amp;lt;/tt&amp;gt; zuordnet, kann man das Verhalten der einzelnen Taster steuern:&lt;br /&gt;
;&amp;lt;tt&amp;gt;tasten[n].mode = TM_SHORT&amp;lt;/tt&amp;gt;: Taster&amp;amp;nbsp;&amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; reagiert auf Druck. Bevor er erneut reagiert, muss er losgelassen werden. &amp;lt;tt&amp;gt;taster&amp;lt;/tt&amp;gt; wird auf&amp;amp;nbsp;n gesetzt.&lt;br /&gt;
;&amp;lt;tt&amp;gt;tasten[n].mode = TM_LONG&amp;lt;/tt&amp;gt;: Der Taster reagiert auf kurzen/langen Druck. Wird er nur kurz gedrückt, wird &amp;lt;tt&amp;gt;taster=n&amp;lt;/tt&amp;gt; gesetzt; wird er lange gedrückt, wird &amp;lt;tt&amp;gt;taster=n+TASTER_LONG&amp;lt;/tt&amp;gt; gesetzt. Die Zeitdauer, ab der ein Druck als lange angesehen wird, kann mir &amp;lt;tt&amp;gt;TASTER_DELAY_LONG&amp;lt;/tt&amp;gt; eingestellt werden.&lt;br /&gt;
;&amp;lt;tt&amp;gt;tasten[n].mode = TM_REPEAT&amp;lt;/tt&amp;gt;: Der Taster hat eine auto-repeat Funktion, d.h. bei dauernd gedrücktem Taster wird in bestimmten Zeitabständen immer wieder &amp;lt;tt&amp;gt;taster=n&amp;lt;/tt&amp;gt; gesetzt.&lt;br /&gt;
Wiederholdauer und Erstverzögerung können mit &amp;lt;tt&amp;gt;TASTER_REPEAT&amp;lt;/tt&amp;gt; resp. &amp;lt;tt&amp;gt;TASTER_REPEAT_DELAY&amp;lt;/tt&amp;gt; angepasst werden.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;tasten&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
taste_t tasten[NUM_TASTER];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;tasten&amp;lt;/tt&amp;gt; ist ein Array der Länge &amp;lt;tt&amp;gt;NUM_TASTEN&amp;lt;/tt&amp;gt;. Jedes Array-Element ist vom Typ &amp;lt;tt&amp;gt;taste_t&amp;lt;/tt&amp;gt;. Dadurch kann wie oben gezeigt der Betriebsmodus eines Tasters eingestellt werden, z.B. für Taster&amp;amp;nbsp;2:&lt;br /&gt;
 tasten[2].mode = TM_REPEAT;&lt;br /&gt;
&lt;br /&gt;
==Defines==&lt;br /&gt;
==Defines (Input)==&lt;br /&gt;
Input Defines dienen dazu, den Code  bzw. die Funktionalität den eigenen Bedürfnissen anzupassen. Nach ihrer Änderung muss der Code neu übersetzt werden.&lt;br /&gt;
;&amp;lt;tt&amp;gt;NUM_TASTER&amp;lt;/tt&amp;gt;: Die Anzahl der Taster, die man behandeln möchte. Das Array &amp;lt;tt&amp;gt;tasten&amp;lt;/tt&amp;gt; hat &amp;lt;tt&amp;gt;NUM_TASTEN&amp;lt;/tt&amp;gt; Elemente (jedes vom Typ &amp;lt;tt&amp;gt;taste_t&amp;lt;/tt&amp;gt;).&lt;br /&gt;
;&amp;lt;tt&amp;gt;TASTER_LEVEL&amp;lt;/tt&amp;gt;: Muss den Wert&amp;amp;nbsp;0 oder&amp;amp;nbsp;1 haben. Mit Wert&amp;amp;nbsp;0 wird ein Taster als aktiv (gedrückt) betrachtet, wenn der Übergabewert &amp;lt;tt&amp;gt;tast&amp;lt;/tt&amp;gt; von &amp;lt;tt&amp;gt;get_taster&amp;lt;/tt&amp;gt; gleich Null ist. Ist er ungleich Null, wird ein Taster als losgelassen angesehen. Dies entspricht low-aktiven Tastern. 0&amp;amp;nbsp;ist der default für dieses Macro, denn es entspricht Tastern, die von einem Port mit [[Pullup]] nach [[GND]] verschaltet sind.&lt;br /&gt;
:Ist dieses Define auf&amp;amp;nbsp;1, dann werden die Taster als high-aktiv behandelt (gedrückt &amp;amp;rarr; &amp;lt;tt&amp;gt;tast&amp;lt;/tt&amp;gt; ungleich&amp;amp;nbsp;0, ungedrückt &amp;amp;rarr; &amp;lt;tt&amp;gt;tast&amp;lt;/tt&amp;gt; gleich&amp;amp;nbsp;0).&lt;br /&gt;
:Dieses Define wirkt auf alle Taster.&lt;br /&gt;
;&amp;lt;tt&amp;gt;TASTER_LONG&amp;lt;/tt&amp;gt;: Wird eine Taste kurz gedrückt, dann wird deren Nummer in &amp;lt;tt&amp;gt;taster&amp;lt;/tt&amp;gt; gespeichert. Wird die Taste lange gedrückt, dann wird deren Nummer plus &amp;lt;tt&amp;gt;TASTER_LONG&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;taster&amp;lt;/tt&amp;gt; gespeichert. Voreinstellung ist&amp;amp;nbsp;16. Wird z.B. Taste No.&amp;amp;nbsp;1 kurz gedrückt, wird &amp;lt;tt&amp;gt;taster&amp;lt;/tt&amp;gt; auf&amp;amp;nbsp;1 gesetzt. Wird sie lange gedrückt und ist &amp;lt;tt&amp;gt;tasten[1].mode = TM_LONG&amp;lt;/tt&amp;gt;, dann wird in &amp;lt;tt&amp;gt;taster&amp;lt;/tt&amp;gt; eine &amp;amp;nbsp;17 gespeichert.&lt;br /&gt;
;&amp;lt;tt&amp;gt;TASTER_REPEAT_DELAY&amp;lt;/tt&amp;gt;: Für &amp;lt;tt&amp;gt;.mode=TM_REPEAT&amp;lt;/tt&amp;gt;: Erstverzögerung in Ticks, nach der bei Dauerdruck eines Tasters der auto-repeat einsetzt.&lt;br /&gt;
;&amp;lt;tt&amp;gt;TASTER_REPEAT&amp;lt;/tt&amp;gt;: Für &amp;lt;tt&amp;gt;.mode=TM_REPEAT&amp;lt;/tt&amp;gt;: Zeitspanne in Ticks zwischen zwei auto-repeats.&lt;br /&gt;
;&amp;lt;tt&amp;gt;TASTER_DELAY_LONG&amp;lt;/tt&amp;gt;: Für &amp;lt;tt&amp;gt;.mode=TM_LONG&amp;lt;/tt&amp;gt;: Wird ein Taster gedrückt und erst wieder losgelassen, nachdem mindestens &amp;lt;tt&amp;gt;TASTER_DELAY_LONG&amp;lt;/tt&amp;gt; Ticks verstrichen sind, ist der Tastendruck &amp;quot;lang&amp;quot;. Ansonsten ist er &amp;quot;kurz&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Defines (Output)==&lt;br /&gt;
Output Defines dienen dazu, &amp;quot;magische Zahlen&amp;quot; aus dem Code heraus zu halten und ihn lesbarer zu machen. Output Defines müssen so bleiben wie sie sind und dürfen nicht verändert werden.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;NO_TASTER&amp;lt;/tt&amp;gt;: Wert, den &amp;lt;tt&amp;gt;taster&amp;lt;/tt&amp;gt; hat, wenn keine Taste gedrückt wurde.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Werte für Komponente &amp;lt;tt&amp;gt;.mode&amp;lt;/tt&amp;gt;:&lt;br /&gt;
;&amp;lt;tt&amp;gt;TM_SHORT&amp;lt;/tt&amp;gt;: Taster reagiert auf Tastendruck.&lt;br /&gt;
;&amp;lt;tt&amp;gt;TM_LONG&amp;lt;/tt&amp;gt;: Taster unterscheidet zwischen kurzem und langem Tastendruck.&lt;br /&gt;
;&amp;lt;tt&amp;gt;TM_REPEAT&amp;lt;/tt&amp;gt;: Taster reagiert auf kurzen Tastendruck. Bei langem Tastendruck auto-repeat.&lt;br /&gt;
&lt;br /&gt;
=Quellcode=&lt;br /&gt;
==taster.c==&lt;br /&gt;
 #include &amp;quot;taster.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 volatile signed char taster = NO_TASTER;&lt;br /&gt;
 &lt;br /&gt;
 taste_t tasten[NUM_TASTER];&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=&amp;quot;#008000&amp;quot;&amp;gt;/*&lt;br /&gt;
  * Aktualisiert 'taster', falls taster==NO_TASTER&lt;br /&gt;
  * num:  Nummer des Tasters von 0...NUM_TASTER-1&lt;br /&gt;
  * TASTER_LEVEL=1:&lt;br /&gt;
  *    tast: ==0 falls der Taster gerade nicht gedrueckt wird&lt;br /&gt;
  *    tast: !=0 falls der Taster gerade gedrueckt wird&lt;br /&gt;
  * TASTER_LEVEL=0:&lt;br /&gt;
  *    tast: !=0 falls der Taster gerade nicht gedrueckt wird&lt;br /&gt;
  *    tast: ==0 falls der Taster gerade gedrueckt wird&lt;br /&gt;
  */&amp;lt;/font&amp;gt;&lt;br /&gt;
 void get_taster (const unsigned char num, unsigned char tast) &lt;br /&gt;
 {&lt;br /&gt;
     const taste_t * const ptast = &amp;amp; tasten[num];&lt;br /&gt;
     const unsigned char taster_old = ptast-&amp;gt;old;&lt;br /&gt;
     unsigned char pressed, press, release, mode, delay;&lt;br /&gt;
 &lt;br /&gt;
 #if TASTER_LEVEL&lt;br /&gt;
     tast = !!tast;&lt;br /&gt;
 #else&lt;br /&gt;
     tast = !tast;&lt;br /&gt;
 #endif&lt;br /&gt;
  &lt;br /&gt;
     {{comment|Was wurde gedrueckt/losgelassen...?}}&lt;br /&gt;
  &lt;br /&gt;
     {{comment|Taster bleibt gedrueckt}}&lt;br /&gt;
     pressed =  taster_old &amp;amp;  tast;&lt;br /&gt;
     {{comment|Taster neu gedrueckt}}&lt;br /&gt;
     press   = ~taster_old &amp;amp;  tast;&lt;br /&gt;
     {{comment|Taster losgelassen}}&lt;br /&gt;
     release =  taster_old &amp;amp; ~tast;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;font color=&amp;quot;#008000&amp;quot;&amp;gt;/* ptast-&amp;gt;old = tast;&lt;br /&gt;
      * Der Cast dient zum Wegwerfen des 'const' Qualifiers. &lt;br /&gt;
      * Die Komponente wurde als 'const' qualifiziert, &lt;br /&gt;
      * damit es einen Fehler gibt, wenn versucht wird,&lt;br /&gt;
      * ihren Wert von aussen zu aendern (private). */&amp;lt;/font&amp;gt;&lt;br /&gt;
     *((unsigned char *) &amp;amp; ptast-&amp;gt;old) = tast;&lt;br /&gt;
  &lt;br /&gt;
     tast = NO_TASTER;&lt;br /&gt;
  &lt;br /&gt;
     mode  = ptast-&amp;gt;mode;&lt;br /&gt;
     delay = ptast-&amp;gt;delay;&lt;br /&gt;
  &lt;br /&gt;
     if (press)&lt;br /&gt;
     {&lt;br /&gt;
         if (mode != TM_LONG)&lt;br /&gt;
             tast = num;&lt;br /&gt;
    &lt;br /&gt;
         delay = 0;&lt;br /&gt;
     }&lt;br /&gt;
     else if (pressed)&lt;br /&gt;
     {&lt;br /&gt;
         if (delay &amp;lt; 0xfe)&lt;br /&gt;
             delay++;&lt;br /&gt;
     }&lt;br /&gt;
     else if (release)&lt;br /&gt;
     {&lt;br /&gt;
         if (mode == TM_LONG &amp;amp;&amp;amp; delay != 0xff)&lt;br /&gt;
             tast = num;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     if (mode == TM_LONG)&lt;br /&gt;
     {&lt;br /&gt;
         if (delay == TASTER_DELAY_LONG)&lt;br /&gt;
         {&lt;br /&gt;
             tast = TASTER_LONG + num;&lt;br /&gt;
             delay = 0xff;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     else if (mode == TM_REPEAT)&lt;br /&gt;
     {&lt;br /&gt;
         if (delay == TASTER_REPEAT_DELAY)&lt;br /&gt;
         {&lt;br /&gt;
             tast = num;&lt;br /&gt;
             delay = TASTER_REPEAT_DELAY - TASTER_REPEAT;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     if (taster == NO_TASTER)&lt;br /&gt;
         taster = tast;&lt;br /&gt;
   &lt;br /&gt;
     {{comment|siehe oben}}&lt;br /&gt;
     *((unsigned char *) &amp;amp; ptast-&amp;gt;delay) = delay;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==taster.h==&lt;br /&gt;
 #ifndef _TASTER_H_&lt;br /&gt;
 #define _TASTER_H_&lt;br /&gt;
 &lt;br /&gt;
 {{comment|Wert fuer taster, wenn nichts gedrückt wurde}}&lt;br /&gt;
 #define NO_TASTER (-1)&lt;br /&gt;
 &lt;br /&gt;
 {{comment|Maximale Anzahl der Taster}}&lt;br /&gt;
 #define NUM_TASTER 4&lt;br /&gt;
 &lt;br /&gt;
 {{comment|0 --&amp;gt; Taster sind low-aktiv}}&lt;br /&gt;
 {{comment|1 --&amp;gt; Taster sind high-aktiv}}&lt;br /&gt;
 #define TASTER_LEVEL 0&lt;br /&gt;
 &lt;br /&gt;
 {{comment|Dieser Offset wird zur Tasten-Nummer addiert,}}&lt;br /&gt;
 {{comment|wenn eine Taste lange gedrückt wurde}}&lt;br /&gt;
 #define TASTER_LONG 16&lt;br /&gt;
 &lt;br /&gt;
 {{comment|Zeitverzögerung (in Ticks), bis zum Beginn von auto-repeat}}&lt;br /&gt;
 #define TASTER_REPEAT_DELAY (60)&lt;br /&gt;
 &lt;br /&gt;
 {{comment|Zeitverzögerung (in Ticks), bis zum nächsten auto-repeat}}&lt;br /&gt;
 #define TASTER_REPEAT       (15)&lt;br /&gt;
 &lt;br /&gt;
 {{comment|Ab dieser Dauer wird der Tastendruck 'lange'}}&lt;br /&gt;
 #define TASTER_DELAY_LONG   (80)&lt;br /&gt;
 &lt;br /&gt;
 typedef struct &lt;br /&gt;
 {&lt;br /&gt;
     {{comment|private}}&lt;br /&gt;
     const unsigned char delay, old;&lt;br /&gt;
 &lt;br /&gt;
     {{comment|Mode des Tasters aus: TM_SHORT, TM_LONG, TM_REPEAT}}&lt;br /&gt;
     unsigned char mode;&lt;br /&gt;
 } taste_t;&lt;br /&gt;
 &lt;br /&gt;
 extern taste_t tasten[];&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=&amp;quot;#008000&amp;quot;&amp;gt;/* In dieser Variable kann abgefragt werden, welche Taste gedrückt wurde.&lt;br /&gt;
    --&amp;gt; NO_TASTER:&lt;br /&gt;
        es wurde nichts gedrückt&lt;br /&gt;
    --&amp;gt; 0..NUM_TASTER-1:&lt;br /&gt;
        Taster Numero 'taster' wurde (kurz) gedrückt&lt;br /&gt;
    --&amp;gt; TASTER_LONG ... TASTER_LONG + NUM_TASTER-1:&lt;br /&gt;
        Taster Numero 'taster-TASTER_LONG' wurde lange gedrückt&lt;br /&gt;
 */&amp;lt;/font&amp;gt;   &lt;br /&gt;
 extern volatile signed char taster;&lt;br /&gt;
 &lt;br /&gt;
 extern void get_taster (const unsigned char num, unsigned char tast);&lt;br /&gt;
 &lt;br /&gt;
 enum&lt;br /&gt;
 {&lt;br /&gt;
     TM_SHORT,&lt;br /&gt;
     TM_LONG,&lt;br /&gt;
     TM_REPEAT&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 #endif {{comment|_TASTER_H_}}&lt;br /&gt;
&lt;br /&gt;
=Anwendungsbeispiel=&lt;br /&gt;
Da ein Anwendungsbeispiel auch die Abfrage der Ports beinhalten muss, ist dieses natürlich nicht mehr hardwareunabhängig.&lt;br /&gt;
==[[ATmega8]] und [[avr-gcc]]==&lt;br /&gt;
Dies nur als Anregung. Auf anderen [[AVR]]s sieht's möglicherweise etwas anders aus.&lt;br /&gt;
 #include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt;font color=&amp;quot;#008000&amp;quot;&amp;gt;/* Wir haben 3 Taster, in taster.h wird also angepasst zu&lt;br /&gt;
 #define NUM_TASTER 3&lt;br /&gt;
 */&amp;lt;/font&amp;gt;&lt;br /&gt;
 #include &amp;quot;taster.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=&amp;quot;#008000&amp;quot;&amp;gt;/* &lt;br /&gt;
  * Die Taster-Ports sind hartcodiert:&lt;br /&gt;
  * #0 --&amp;gt; PortB.4&lt;br /&gt;
  * #1 --&amp;gt; PortC.1&lt;br /&gt;
  * #2 --&amp;gt; PortD.2&lt;br /&gt;
  */&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=&amp;quot;#008000&amp;quot;&amp;gt;/* Bei 1MHz Grundtakt läuft Timer0 alle 256µs über.&lt;br /&gt;
  * Um auf rund 10ms zu kommen, rufen wir get_taster nur&lt;br /&gt;
  * jedes 39. mal auf. */&amp;lt;/font&amp;gt;&lt;br /&gt;
 SIGNAL (SIG_OVERFLOW0)&lt;br /&gt;
 {&lt;br /&gt;
     static unsigned char count_ovl0;&lt;br /&gt;
     unsigned char ovl0 = count_ovl0+1;&lt;br /&gt;
 &lt;br /&gt;
     if (ovl0 &amp;gt;= 39)&lt;br /&gt;
     {&lt;br /&gt;
         get_taster (0, PINB &amp;amp; (1&amp;lt;&amp;lt;PB4));&lt;br /&gt;
         get_taster (1, PINC &amp;amp; (1&amp;lt;&amp;lt;PC1));&lt;br /&gt;
         get_taster (2, PIND &amp;amp; (1&amp;lt;&amp;lt;PD2));&lt;br /&gt;
         &lt;br /&gt;
         ovl0 = 0;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     count_ovl0 = ovl0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void ioinit()&lt;br /&gt;
 {&lt;br /&gt;
     {{comment|Taster sind Input (default nach RESET)}}&lt;br /&gt;
     {{comment|Bei LOW-aktiven an den Tastern die PullUps aktivieren, bei HIGH-aktiven nicht}}&lt;br /&gt;
     #if TASTER_LEVEL&lt;br /&gt;
         ;&lt;br /&gt;
     #else&lt;br /&gt;
         PORTB |= 1 &amp;lt;&amp;lt; PB4;&lt;br /&gt;
         PORTC |= 1 &amp;lt;&amp;lt; PC1;&lt;br /&gt;
         PORTD |= 1 &amp;lt;&amp;lt; PD2;&lt;br /&gt;
     #endif&lt;br /&gt;
&lt;br /&gt;
     {{comment|Timer0 ohne Prescaler starten}}&lt;br /&gt;
     TCCR0 = 1 &amp;lt;&amp;lt; CS00;&lt;br /&gt;
  &lt;br /&gt;
     {{comment|Timer0-Overflow-Interrupt aktivieren}}&lt;br /&gt;
     TIMSK |= (1 &amp;lt;&amp;lt; TOIE0);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
     ioinit();&lt;br /&gt;
  &lt;br /&gt;
     {{comment|Taster konfigurieren (#define NUM_TASTER 3 in taster.h)}}&lt;br /&gt;
     tasten[0].mode = TM_SHORT;&lt;br /&gt;
     tasten[1].mode = TM_LONG;&lt;br /&gt;
     tasten[2].mode = TM_REPEAT;&lt;br /&gt;
  &lt;br /&gt;
     {{comment|Interrupts global aktivieren}}&lt;br /&gt;
     sei();&lt;br /&gt;
 &lt;br /&gt;
     {{comment|Hauptschleife}}&lt;br /&gt;
     while (1)&lt;br /&gt;
     {&lt;br /&gt;
         signed char tast = taster;&lt;br /&gt;
   &lt;br /&gt;
         switch (tast)&lt;br /&gt;
         {&lt;br /&gt;
             default:&lt;br /&gt;
             case NO_TASTER:&lt;br /&gt;
                 break;&lt;br /&gt;
     &lt;br /&gt;
             case 0:&lt;br /&gt;
                 {{comment|Taster 0}}&lt;br /&gt;
                 break;&lt;br /&gt;
     &lt;br /&gt;
             case 1:&lt;br /&gt;
                 {{comment|Taster 1 kurz gedrueckt}}&lt;br /&gt;
                 break;&lt;br /&gt;
     &lt;br /&gt;
             case 1+TASTER_LONG:&lt;br /&gt;
                 {{comment|Taster 1 lange gedrueckt}}&lt;br /&gt;
                 break;&lt;br /&gt;
     &lt;br /&gt;
             case 2:&lt;br /&gt;
                 {{comment|Taster 2}}&lt;br /&gt;
                 break;&lt;br /&gt;
         }&lt;br /&gt;
   &lt;br /&gt;
         if (tast != NO_TASTER)&lt;br /&gt;
             taster = NO_TASTER;&lt;br /&gt;
 &lt;br /&gt;
         {{comment|**********************************}}&lt;br /&gt;
         {{comment|Weiterer Code in der Hauptschleife}}&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[C-Tutorial]]&lt;br /&gt;
* [[avr-gcc]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;/div&gt;</summary>
		<author><name>Devusruh</name></author>	</entry>

	</feed>