{"id":1131,"date":"2016-01-26T13:50:09","date_gmt":"2016-01-26T13:50:09","guid":{"rendered":"http:\/\/wp.andreas.bieri.name\/myblog\/?p=1131"},"modified":"2016-01-26T13:50:09","modified_gmt":"2016-01-26T13:50:09","slug":"democode-tastenentprellung-mikro-c","status":"publish","type":"post","link":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/26\/democode-tastenentprellung-mikro-c\/","title":{"rendered":"Democode Tastenentprellung (Mikro C)"},"content":{"rendered":"<p>Der Mikro C Compiler verh\u00e4lt sich etwas anders als die Arduino Umgebung, darum hier eine angepasste Version der Tastenentprellungsroutine. F\u00fcr die Arduino-Version siehe <a href=\"http:\/\/wp.andreas.bieri.name\/myblog\/index.php\/2016\/01\/26\/democode-tastenentprellung\/\">hier<\/a>.<\/p>\n<p>Link: <a href=\"http:\/\/www.mikrocontroller.net\/articles\/AVR-Tutorial:_Tasten\">http:\/\/www.mikrocontroller.net\/articles\/AVR-Tutorial:_Tasten<\/a><\/p>\n<p>&nbsp;<\/p>\n<p><strong>Debounced_Keys_example.c<\/strong><\/p>\n<p><span style=\"color: #3366ff;\">\/* ========================================================================<\/span><br \/>\n<span style=\"color: #3366ff;\"> * Tasteneingaben<\/span><br \/>\n<span style=\"color: #3366ff;\"> * erweitertes Beispielprogramm nach Idee von Peter Dannegger, portiert auf mikroC Pro<\/span><br \/>\n<span style=\"color: #3366ff;\"> * &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/span><br \/>\n<span style=\"color: #3366ff;\"> * Version: 1.0 f\u00fcr mikroC Pro<\/span><br \/>\n<span style=\"color: #3366ff;\"> * Liest bis zu 8 Taster an einem Port aus und entprellt sie, es k\u00f6nnen kurze und lange<\/span><br \/>\n<span style=\"color: #3366ff;\"> * Tastendr\u00fccke erkannt werden, ebenso gibt es eine Autorepeat-Funktion<\/span><br \/>\n<span style=\"color: #3366ff;\"> * &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/span><br \/>\n<span style=\"color: #3366ff;\"> * zur Portierung:<\/span><br \/>\n<span style=\"color: #3366ff;\"> * 1) mikroC Pro kennt #warning nicht<\/span><br \/>\n<span style=\"color: #3366ff;\"> * 2) includes sind nicht n\u00f6tig, \u00fcber search paths einbindbar (aus Arduino)<\/span><br \/>\n<span style=\"color: #3366ff;\"> * 3) typedef m\u00fcssen im lokalen File stehen, unit8_t etc.<\/span><br \/>\n<span style=\"color: #3366ff;\"> * 4) sei(),cli() ist als Macro nachgebildet<\/span><br \/>\n<span style=\"color: #3366ff;\"> * 5) Interrupts so: void timerinterrupt( void ) org IVT_ADDR_TIMER0_OVF<\/span><br \/>\n<span style=\"color: #3366ff;\"> * Definitionen in ATMEGA16.c (Ctrl-Alt-D)<\/span><br \/>\n<span style=\"color: #3366ff;\">* ========================================================================<\/span><br \/>\n<span style=\"color: #3366ff;\"> *\/<\/span><\/p>\n<pre>\/\/#include &lt;stdint.h&gt;\n\/\/#include &lt;io.h&gt;\n\/\/#include &lt;interrupt.h&gt;\n\n#ifndef F_CPU\n#define F_CPU 8000000 \/\/ processor clock frequency\n\/\/#warning kein F_CPU definiert\n#endif\n\n#define KEY_DDR DDRB \/\/ alles Tasten am Port B gleichzeitig auslesbar\n#define KEY_PORT PORTB\n#define KEY_PIN PINB\n#define KEY0 0\n#define KEY1 1\n#define KEY2 2\n#define KEY3 3\n#define ALL_KEYS (1&lt;&lt;KEY0 | 1&lt;&lt;KEY1 | 1&lt;&lt;KEY2 | 1&lt;&lt;KEY3)\n\n#define REPEAT_MASK (1&lt;&lt;KEY2 | 1&lt;&lt;KEY3) \/\/ repeat: key2\n#define REPEAT_START 100 \/\/ after 1000ms\n#define REPEAT_NEXT 10 \/\/ every 100ms\n#define LONG_MASK (1&lt;&lt;KEY1) \/\/ secondary action on long press: key1\n#define LONG_START 100 \/\/ after 1000ms\n#define LONG_NEXT 10 \/\/ every 100ms\n\n#define LED_DDR DDRC\n#define LED_PORT PORTC\n#define LED0 0\n#define LED1 1\n#define LED2 2\n\n#define CLI SREG_I_bit = 0;\n#define SEI SREG_I_bit = 1;\n\ntypedef unsigned short uint8_t;\ntypedef signed int int16_t;\n\nvolatile uint8_t key_state; \/\/ debounced and noninverted key state:\n \/\/ bit = 0: key pressed\nvolatile uint8_t key_press; \/\/ key press detect\nvolatile uint8_t key_rpt; \/\/ key long press and repeat\nvolatile uint8_t key_long; \/\/ key long press no repeat\n<\/pre>\n<pre>void timerinterrupt( void ) org IVT_ADDR_TIMER0_OVF \/\/ every 10ms\n{\n static uint8_t ct0, ct1, rpt, secac;\n volatile uint8_t i;\n\n TCNT0 = (uint8_t)(int16_t)-(F_CPU \/ 1024 * 10e-3 + 0.5); \/\/ preload for 10ms\n\n i = key_state ^ KEY_PIN; \/\/ key changed ?\n ct0 = ~( ct0 &amp; i ); \/\/ reset or count ct0\n ct1 = ct0 ^ (ct1 &amp; i); \/\/ reset or count ct1\n i &amp;= ct0 &amp; ct1; \/\/ count until roll over ?\n key_state ^= i; \/\/ then toggle debounced state\n key_press |= key_state &amp; i; \/\/ 0-&gt;1: key press detect\n \/\/ missing: reset key repeat when key is released\n\n if( (key_state &amp; LONG_MASK) == 0 ) \/\/ check secondary function\n secac = LONG_START; \/\/ start delay\n if( --secac == 0 ){\n key_long |= key_state &amp; LONG_MASK;\n }\n if( (key_state &amp; REPEAT_MASK) == 0 ) \/\/ check repeat function\n rpt = REPEAT_START; \/\/ start delay\n if( --rpt == 0 ){\n rpt = REPEAT_NEXT; \/\/ repeat delay\n key_rpt |= key_state &amp; REPEAT_MASK;\n }\n}\n<\/pre>\n<pre>\/\/\n\/\/ check if a key has been pressed. Each pressed key is reported only once\n\/\/\nuint8_t get_key_press( uint8_t key_mask )\n{\n CLI \/\/ interrupt disable\n key_mask &amp;= key_press; \/\/ read key(s)\n key_press ^= key_mask; \/\/ clear key(s)\n SEI\n return key_mask;\n}\n<\/pre>\n<pre>\/\/\n\/\/ check if a key has been pressed long enough such that the\n\/\/ key repeat functionality kicks in. After a small setup delay\n\/\/ the key is reported beeing pressed in subsequent calls\n\/\/ to this function. This simulates the user repeatedly\n\/\/ pressing and releasing the key.\n\/\/\nuint8_t get_key_rpt( uint8_t key_mask )\n{\n CLI; \/\/ read and clear atomic !\n key_mask &amp;= key_rpt; \/\/ read key(s)\n key_rpt ^= key_mask; \/\/ clear key(s)\n SEI;\n return key_mask;\n}\n<\/pre>\n<pre>\/\/\n\/\/ check if a key has been pressed long enough such that the\n\/\/ secondary functionality kicks in.\n\/\/\nuint8_t get_key_long( uint8_t key_mask )\n{\n CLI; \/\/ read and clear atomic !\n key_mask &amp;= key_long; \/\/ read key(s)\n key_long ^= key_mask; \/\/ clear key(s)\n SEI;\n return key_mask;\n}\n<\/pre>\n<pre>\/\/\n\/\/ read key state and key press atomic !\n\/\/\nuint8_t get_key_short( uint8_t key_mask )\n{\n CLI;\n return get_key_press( ~key_state &amp; key_mask );\n}\n<\/pre>\n<pre>void main( void )\n{\n uint8_t j;\n KEY_DDR &amp;= ~ALL_KEYS; \/\/ konfigure key port for input\n KEY_PORT |= ALL_KEYS; \/\/ and turn on pull up resistors\n\n TCCR0 = (1&lt;&lt;CS02)|(1&lt;&lt;CS00); \/\/ divide by 1024\n TIMSK = 1&lt;&lt;TOIE0; \/\/ enable timer interrupt\n\n LED_PORT = 0xFF; \/\/ switch on all LEDs\n LED_DDR = 0xFF;\n\n SEI; \/\/ enable interrupts\n\n while(1){\n if( get_key_short( 1&lt;&lt;KEY0 )) \/\/ kurzer Tastendruck schaltet LED um\n LED_PORT ^= 1&lt;&lt;LED0;\n if( get_key_long (1&lt;&lt;KEY1 )) \/\/ langer Tastendruck schaltet LED um\n LED_PORT ^= 1&lt;&lt;LED1;\n\n \/\/ langer Tastendruck mit Autorepeat, die LEDS schalten sich der Reihe nach um,\n \/\/ solange die Taste gedr\u00fcckt bleibt\n if( get_key_press( 1&lt;&lt;KEY2 ) || get_key_rpt( 1&lt;&lt;KEY2 ))\n { j = LED_PORT;\n j = (j &amp; 0x07) | ((j &lt;&lt; 1) &amp; 0xF0);\n if( j &lt; 0xF0 )\n j |= 0x08;\n LED_PORT = j;\n }\n\n \/\/ und invertieren\n if( get_key_press( 1&lt;&lt;KEY3 ) || get_key_rpt( 1&lt;&lt;KEY3 ))\n {\n LED_PORT ^= 0xF8;\n }\n }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Der Mikro C Compiler verh\u00e4lt sich etwas anders als die Arduino Umgebung, darum hier eine angepasste Version der Tastenentprellungsroutine. F\u00fcr die Arduino-Version siehe hier. Link: http:\/\/www.mikrocontroller.net\/articles\/AVR-Tutorial:_Tasten &nbsp; Debounced_Keys_example.c \/* ======================================================================== * Tasteneingaben * erweitertes Beispielprogramm nach Idee von Peter Dannegger, portiert auf mikroC Pro * &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; * Version: 1.0 f\u00fcr mikroC Pro * Liest bis [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[11],"tags":[38],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v18.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Democode Tastenentprellung (Mikro C) - Merkbar.<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/52.29.166.97\/myblog\/2016\/01\/26\/democode-tastenentprellung-mikro-c\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Democode Tastenentprellung (Mikro C) - Merkbar.\" \/>\n<meta property=\"og:description\" content=\"Der Mikro C Compiler verh\u00e4lt sich etwas anders als die Arduino Umgebung, darum hier eine angepasste Version der Tastenentprellungsroutine. F\u00fcr die Arduino-Version siehe hier. Link: http:\/\/www.mikrocontroller.net\/articles\/AVR-Tutorial:_Tasten &nbsp; Debounced_Keys_example.c \/* ======================================================================== * Tasteneingaben * erweitertes Beispielprogramm nach Idee von Peter Dannegger, portiert auf mikroC Pro * &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; * Version: 1.0 f\u00fcr mikroC Pro * Liest bis [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/52.29.166.97\/myblog\/2016\/01\/26\/democode-tastenentprellung-mikro-c\/\" \/>\n<meta property=\"og:site_name\" content=\"Merkbar.\" \/>\n<meta property=\"article:published_time\" content=\"2016-01-26T13:50:09+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"wp_blogadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/#website\",\"url\":\"http:\/\/52.29.166.97\/myblog\/\",\"name\":\"Merkbar.\",\"description\":\"IT, Elektronik und Mathematik\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/52.29.166.97\/myblog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/2016\/01\/26\/democode-tastenentprellung-mikro-c\/#webpage\",\"url\":\"http:\/\/52.29.166.97\/myblog\/2016\/01\/26\/democode-tastenentprellung-mikro-c\/\",\"name\":\"Democode Tastenentprellung (Mikro C) - Merkbar.\",\"isPartOf\":{\"@id\":\"http:\/\/52.29.166.97\/myblog\/#website\"},\"datePublished\":\"2016-01-26T13:50:09+00:00\",\"dateModified\":\"2016-01-26T13:50:09+00:00\",\"author\":{\"@id\":\"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d\"},\"breadcrumb\":{\"@id\":\"http:\/\/52.29.166.97\/myblog\/2016\/01\/26\/democode-tastenentprellung-mikro-c\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/52.29.166.97\/myblog\/2016\/01\/26\/democode-tastenentprellung-mikro-c\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/2016\/01\/26\/democode-tastenentprellung-mikro-c\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"http:\/\/52.29.166.97\/myblog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Democode Tastenentprellung (Mikro C)\"}]},{\"@type\":\"Person\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d\",\"name\":\"wp_blogadmin\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g\",\"caption\":\"wp_blogadmin\"},\"url\":\"http:\/\/wp.andreas.bieri.name\/myblog\/author\/wp_blogadmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Democode Tastenentprellung (Mikro C) - Merkbar.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/52.29.166.97\/myblog\/2016\/01\/26\/democode-tastenentprellung-mikro-c\/","og_locale":"de_DE","og_type":"article","og_title":"Democode Tastenentprellung (Mikro C) - Merkbar.","og_description":"Der Mikro C Compiler verh\u00e4lt sich etwas anders als die Arduino Umgebung, darum hier eine angepasste Version der Tastenentprellungsroutine. F\u00fcr die Arduino-Version siehe hier. Link: http:\/\/www.mikrocontroller.net\/articles\/AVR-Tutorial:_Tasten &nbsp; Debounced_Keys_example.c \/* ======================================================================== * Tasteneingaben * erweitertes Beispielprogramm nach Idee von Peter Dannegger, portiert auf mikroC Pro * &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; * Version: 1.0 f\u00fcr mikroC Pro * Liest bis [&hellip;]","og_url":"http:\/\/52.29.166.97\/myblog\/2016\/01\/26\/democode-tastenentprellung-mikro-c\/","og_site_name":"Merkbar.","article_published_time":"2016-01-26T13:50:09+00:00","twitter_card":"summary","twitter_misc":{"Verfasst von":"wp_blogadmin","Gesch\u00e4tzte Lesezeit":"4 Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebSite","@id":"http:\/\/52.29.166.97\/myblog\/#website","url":"http:\/\/52.29.166.97\/myblog\/","name":"Merkbar.","description":"IT, Elektronik und Mathematik","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/52.29.166.97\/myblog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"de"},{"@type":"WebPage","@id":"http:\/\/52.29.166.97\/myblog\/2016\/01\/26\/democode-tastenentprellung-mikro-c\/#webpage","url":"http:\/\/52.29.166.97\/myblog\/2016\/01\/26\/democode-tastenentprellung-mikro-c\/","name":"Democode Tastenentprellung (Mikro C) - Merkbar.","isPartOf":{"@id":"http:\/\/52.29.166.97\/myblog\/#website"},"datePublished":"2016-01-26T13:50:09+00:00","dateModified":"2016-01-26T13:50:09+00:00","author":{"@id":"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d"},"breadcrumb":{"@id":"http:\/\/52.29.166.97\/myblog\/2016\/01\/26\/democode-tastenentprellung-mikro-c\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["http:\/\/52.29.166.97\/myblog\/2016\/01\/26\/democode-tastenentprellung-mikro-c\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/52.29.166.97\/myblog\/2016\/01\/26\/democode-tastenentprellung-mikro-c\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"http:\/\/52.29.166.97\/myblog\/"},{"@type":"ListItem","position":2,"name":"Democode Tastenentprellung (Mikro C)"}]},{"@type":"Person","@id":"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d","name":"wp_blogadmin","image":{"@type":"ImageObject","@id":"http:\/\/52.29.166.97\/myblog\/#personlogo","inLanguage":"de","url":"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g","contentUrl":"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g","caption":"wp_blogadmin"},"url":"http:\/\/wp.andreas.bieri.name\/myblog\/author\/wp_blogadmin\/"}]}},"_links":{"self":[{"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/posts\/1131"}],"collection":[{"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/comments?post=1131"}],"version-history":[{"count":0,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/posts\/1131\/revisions"}],"wp:attachment":[{"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/media?parent=1131"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/categories?post=1131"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/tags?post=1131"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}