{"id":2260,"date":"2017-06-29T23:25:28","date_gmt":"2017-06-29T21:25:28","guid":{"rendered":"https:\/\/makerspace-rheinfelden.ch\/blog\/?p=2260"},"modified":"2017-06-29T23:25:28","modified_gmt":"2017-06-29T21:25:28","slug":"mikrocontroller-mal-anders","status":"publish","type":"post","link":"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/mikrocontroller-mal-anders\/","title":{"rendered":"Mikrocontroller \u2013\u00a0mal anders\u2026"},"content":{"rendered":"<p>Wer meine letzten Artikel gelesen hat weiss, dass ich die uralte Programmiersprache Forth gerne auf Mikrocontrollern einsetze. Aber wieso eine 45 Jahre alte Sprache Heute noch einsetzen?<\/p>\n<p>Der erste Teil dieses Blog-Beitrags beschreibt kurz meine Motivation und wo aus meiner Sicht die Vorteile gegen\u00fcber Arduino liegen. Das wird abgeschlossen mit einem sch\u00f6nen Beispiel (Multitasking!). Der zweite Teil sollte eigentlich eine L\u00f6sung f\u00fcr ein bekanntes Problem in der Elektronik aufzeigen. Sollte? Nun, der Artikel wurde l\u00e4nger als geplant und daher verschiebe ich das auf einen sp\u00e4teren Artikel. \ud83d\ude00<\/p>\n<h2>Fort auf STM32<\/h2>\n<p>Nun denn\u2026 wieso also eine 45 Jahre alte Programmiersprache einsetzten? Heute hat jeder Mikrocontroller mehr Leistung als die gr\u00f6ssten Computer vor 45 Jahren. Aus dieser Erkenntnis folgt, dass man einen aktuellen Mikrocontroller als Ersatz f\u00fcr einen ganzen Computer nutzen kann. Klingt seltsam, bringt aber einen genialen Vorteil beim Schreiben von Programmen.<\/p>\n<p>Bei Arduino schreibt man das Programm auf dem PC, kompiliert dieses in der Arduino IDE und \u00fcbertr\u00e4g das bin\u00e4re Programm auf den Mikrocontroller, wo es dann ausgef\u00fchrt wird. Bei Fort kann man direkt auf dem Mikrocontroller entwickeln. Jeder Befehl wird sofort kompiliert und ausgef\u00fchrt. Man kann also St\u00fcck f\u00fcr St\u00fcck das Programm aus den einfachsten Bestandteilen zusammenbauen und jede Komponente sofort testen.<\/p>\n<p>Das erkauft man sich aber mit einer extrem ungewohnten Art der Programmierung. Forth ist Stack-Orientiert. Erst werden die Werte auf den Stack gelegt und danach von einem Befehl verarbeitet. Auf jeelabs.org gibt es <a href=\"http:\/\/jeelabs.org\/article\/1612b\/\">eine gute Einf\u00fchrung<\/a>\u00a0in Forth, ich will das hier nicht wiederholen.<\/p>\n<h2>Multitasking in Forth<\/h2>\n<p>Wie einfach ist es doch eine LED blinken zu lassen mit einem Mikrocontroller. LED ein, kurz warten, LED aus, kurz warten \u2013 wiederholen. Nur, was macht man, wenn man eine zweite LED mit einem anderen Rhythmus blinken lassen will?<\/p>\n<p>Das ist nur ein einfaches Beispiel und betrifft nicht nur LEDs. Immer wieder will man mehrere Sachen gleichzeitig machen. Die Arduino Umgebung kann aber kein Multitasking \u2013 kann also nicht mehrere Dinge gleichzeitig erledigen. Ganz richtig ist das nicht, denn durch Interrupts kann das &#8222;Hauptprogramm&#8220; jederzeit unterbrochen werden und das Resultat ist fast wie Multitasking. Man k\u00f6nnte das LED-Blinken also so l\u00f6sen:<\/p>\n<ul>\n<li>Eine Funktion f\u00fcr die erste LED als Interrupt an TIMER1 anh\u00e4ngen.<\/li>\n<li>Eine Funktion f\u00fcr die zweite LED an TIMER2 anh\u00e4ngen.<\/li>\n<li>Beide Timer konfigurieren.<\/li>\n<li>Endlosschleife im Hauptprogramm ausf\u00fchren (Interrupts unterbrechen und schalten die LEDs)<\/li>\n<\/ul>\n<p>Das funktioniert, ist aber kompliziert, schwierig zu debuggen und allzu viele von diesen Timern gibt es auch nicht.<\/p>\n<p>Forth kann &#8222;kooperatives Multitasking&#8220;. Es k\u00f6nnen daher mehrere Funktionen (beinahe) gleichzeitig ausgef\u00fchrt werden, solange sie regelm\u00e4ssig die Kontrolle an andere Funktionen abgeben. Sie m\u00fcssen also Kooperieren (daher der Name &#8222;kooperatives Multitasking). Diese Kooperation ist in Forth in einigen Funktionen eingebaut. Zum Beispiel in &#8222;ms&#8220;, das dem &#8222;delay&#8220; aus Arduino entspricht. Also jedes Mal, wenn das Programm warten soll, wird die Kontrolle automatisch an eine andere Komponente \u00fcbergeben \u2013 genial!<\/p>\n<ul>\n<li>Die Funktion 1 schaltet die LED ein, wartet, schaltet die LED aus, wartet \u2013 wiederholen.<\/li>\n<li>Die Funktion 2 macht das selbe mit einer anderen LED.<\/li>\n<li>Beide Funktionen werden als Hintergrundprozess gestartet<\/li>\n<\/ul>\n<h3>Wie sieht das nun aus?<\/h3>\n<p>So sieht das Programm in Forth aus:<\/p>\n<pre>PA4 constant LED-A \\ Port PA4 nennen wir LED-A\r\nPA5 constant LED-B \\ Port PA5 ist LED-B\r\n\r\ntask: a-blink      \\ Speicher reservieren f\u00fcr Hintergrundprozess\r\n: a-blink&amp; ( - )   \\ Hintergrundprozess definieren\r\n  a-blink activate\r\n  OMODE-PP LED-A io-mode! \\ Pin von LED-A in Push-Pull Modus setzen\r\n  begin\r\n    LED-A iox!     \\ Pin LED-A umschalten\r\n    250 ms         \\ 250 ms warten - dahinter steckt das Multitasking\r\n  again ;          \\ Endlosschleife von begin zu again\r\n\r\ntask: b-blink      \\ Speicher reservieren f\u00fcr Hintergrundprozess\r\n: b-blink&amp; ( - )   \\ Hintergrundprozess definieren\r\n  b-blink activate\r\n  OMODE-PP LED-B io-mode! \\ Pin von LED-B in Push-Pull Modus setzen\r\n  begin\r\n    LED-B iox!     \\ Pin LED-B umschalten\r\n    300 ms         \\ 300 ms warten - dahinter steckt das Multitasking\r\n  again ;          \\ Endlosschleife von begin zu again\r\n\r\na-blink&amp;           \\ Hintergrundprozess f\u00fcr LED-A starten\r\nb-blink&amp;           \\ und f\u00fcr LED-B\r\nmultitask          \\ Multitasker aktivieren - LEDs blinken!<\/pre>\n<p>Ich habe euch gewarnt :). Die Sprache ist sehr ungewohnt. Aber dieses Beispiel zeigt, wie viel Potenzial in solch einer L\u00f6sung steckt.<\/p>\n<p>Und nicht vergessen, jede dieser Zeilen kann einzeln, direkt auf dem Mikrocontroller eingegeben werden. Kein Kompilieren, kein \u00dcbertragen, kein Reset des Mikrocontrollers bei jeder \u00c4nderung. Nach der Eingabe der letzten Zeile blinken die LEDs und die n\u00e4chsten Befehle k\u00f6nnen eingegeben werden. Auch diese &#8222;Konsole&#8220; auf dem Mikrocontroller ist ein eigener &#8222;Prozess&#8220;, der mit den anderen Hintergrundprozessen kooperiert.<\/p>\n","protected":false},"excerpt":{"rendered":"Wer meine letzten Artikel gelesen hat weiss, dass ich die uralte Programmiersprache Forth gerne auf Mikrocontrollern einsetze. Aber wieso eine 45 Jahre alte Sprache Heute noch einsetzen? Der erste Teil dieses Blog-Beitrags beschreibt kurz meine Motivation und wo aus meiner Sicht die Vorteile gegen\u00fcber Arduino liegen. Das wird abgeschlossen mit einem sch\u00f6nen Beispiel (Multitasking!). Der&#8230; <br \/><br \/><a class=\"view-article\" href=\"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/mikrocontroller-mal-anders\/\">Weiterlesen \u2192<\/a>","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[24],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v17.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mikrocontroller \u2013\u00a0mal anders\u2026 - Makerspace FabLab Rheinfelden\" \/>\n<meta property=\"og:description\" content=\"Wer meine letzten Artikel gelesen hat weiss, dass ich die uralte Programmiersprache Forth gerne auf Mikrocontrollern einsetze. Aber wieso eine 45 Jahre alte Sprache Heute noch einsetzen? Der erste Teil dieses Blog-Beitrags beschreibt kurz meine Motivation und wo aus meiner Sicht die Vorteile gegen\u00fcber Arduino liegen. Das wird abgeschlossen mit einem sch\u00f6nen Beispiel (Multitasking!). Der... Weiterlesen \u2192\" \/>\n<meta property=\"og:url\" content=\"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/mikrocontroller-mal-anders\/\" \/>\n<meta property=\"og:site_name\" content=\"Makerspace FabLab Rheinfelden\" \/>\n<meta property=\"article:published_time\" content=\"2017-06-29T21:25:28+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Thomas\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"4\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/#website\",\"url\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/\",\"name\":\"Makerspace FabLab Rheinfelden\",\"description\":\"Webseite des Vereins Makerspace Fablab Rheinfelden\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/mikrocontroller-mal-anders\/#webpage\",\"url\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/mikrocontroller-mal-anders\/\",\"name\":\"Mikrocontroller \\u2013\\u00a0mal anders\\u2026 - Makerspace FabLab Rheinfelden\",\"isPartOf\":{\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/#website\"},\"datePublished\":\"2017-06-29T21:25:28+00:00\",\"dateModified\":\"2017-06-29T21:25:28+00:00\",\"author\":{\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/#\/schema\/person\/188b0e4e97fe9b53bb9144561896e487\"},\"breadcrumb\":{\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/mikrocontroller-mal-anders\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/mikrocontroller-mal-anders\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/mikrocontroller-mal-anders\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mikrocontroller \\u2013\\u00a0mal anders\\u2026\"}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/#\/schema\/person\/188b0e4e97fe9b53bb9144561896e487\",\"name\":\"Thomas\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2016\/01\/DSC_2415_A-small-120x120.jpg\",\"contentUrl\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2016\/01\/DSC_2415_A-small-120x120.jpg\",\"caption\":\"Thomas\"},\"url\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/author\/tht\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"de_DE","og_type":"article","og_title":"Mikrocontroller \u2013\u00a0mal anders\u2026 - Makerspace FabLab Rheinfelden","og_description":"Wer meine letzten Artikel gelesen hat weiss, dass ich die uralte Programmiersprache Forth gerne auf Mikrocontrollern einsetze. Aber wieso eine 45 Jahre alte Sprache Heute noch einsetzen? Der erste Teil dieses Blog-Beitrags beschreibt kurz meine Motivation und wo aus meiner Sicht die Vorteile gegen\u00fcber Arduino liegen. Das wird abgeschlossen mit einem sch\u00f6nen Beispiel (Multitasking!). Der... Weiterlesen \u2192","og_url":"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/mikrocontroller-mal-anders\/","og_site_name":"Makerspace FabLab Rheinfelden","article_published_time":"2017-06-29T21:25:28+00:00","twitter_card":"summary","twitter_misc":{"Verfasst von":"Thomas","Gesch\u00e4tzte Lesezeit":"4\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebSite","@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/#website","url":"https:\/\/makerspace-rheinfelden.ch\/blog\/","name":"Makerspace FabLab Rheinfelden","description":"Webseite des Vereins Makerspace Fablab Rheinfelden","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/makerspace-rheinfelden.ch\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/mikrocontroller-mal-anders\/#webpage","url":"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/mikrocontroller-mal-anders\/","name":"Mikrocontroller \u2013\u00a0mal anders\u2026 - Makerspace FabLab Rheinfelden","isPartOf":{"@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/#website"},"datePublished":"2017-06-29T21:25:28+00:00","dateModified":"2017-06-29T21:25:28+00:00","author":{"@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/#\/schema\/person\/188b0e4e97fe9b53bb9144561896e487"},"breadcrumb":{"@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/mikrocontroller-mal-anders\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/mikrocontroller-mal-anders\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/mikrocontroller-mal-anders\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/makerspace-rheinfelden.ch\/blog\/"},{"@type":"ListItem","position":2,"name":"Mikrocontroller \u2013\u00a0mal anders\u2026"}]},{"@type":"Person","@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/#\/schema\/person\/188b0e4e97fe9b53bb9144561896e487","name":"Thomas","image":{"@type":"ImageObject","@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/#personlogo","inLanguage":"de","url":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2016\/01\/DSC_2415_A-small-120x120.jpg","contentUrl":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2016\/01\/DSC_2415_A-small-120x120.jpg","caption":"Thomas"},"url":"https:\/\/makerspace-rheinfelden.ch\/blog\/author\/tht\/"}]}},"_links":{"self":[{"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/posts\/2260"}],"collection":[{"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/comments?post=2260"}],"version-history":[{"count":3,"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/posts\/2260\/revisions"}],"predecessor-version":[{"id":2275,"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/posts\/2260\/revisions\/2275"}],"wp:attachment":[{"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/media?parent=2260"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/categories?post=2260"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/tags?post=2260"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}