{"id":2513,"date":"2013-05-30T10:48:56","date_gmt":"2013-05-30T08:48:56","guid":{"rendered":"http:\/\/www.brennecke.org\/?page_id=2513"},"modified":"2013-05-30T13:33:51","modified_gmt":"2013-05-30T11:33:51","slug":"hinweise-zur-programmierung","status":"publish","type":"page","link":"https:\/\/www.brennecke.org\/?page_id=2513","title":{"rendered":"Hinweise zur Programmierung"},"content":{"rendered":"<h2>Einleitung<\/h2>\n<p>Im folgenden beschreibe ich Hinweise und Tipps zur Entwicklung eigener Programme. Ich gehe dabei davon aus, dass eine gewisse Erfahrung bereits vorliegt &#8211; beispielsweise durch Lesen und Durcharbeiten des <a href=\"http:\/\/www.mikrocontroller.net\/articles\/AVR-GCC-Tutorial\" rel=\"nofollow\">exzelllenten Tutorials auf mikrocontroller.net<\/a>. Meine Entwicklungssprache ist C &#8211; mit Assembler bin ich schon in den 80er Jahren nicht mehr warm geworden.<\/p>\n<p>Zun\u00e4chst muss man sich verdeutlichen, dass der zu programmierende Mikrocontroller zwar potenziell viel kann, erst einmal mit diesen Funktionen gar nichts selbst anfangen kann &#8211; ebenso wie Transistoren, Spulen, Kondensatoren und Widerst\u00e4nde ein Radio bilden, aber genauso gut herumliegen k\u00f6nnen. Genau da setzt das Prinzip dieses Mikrocontroller Labs an &#8211; eine Bibliothek f\u00fcr die Aus- und Eingabe ist vorhanden, wohingegen die eigentliche Aufgabe (beispielsweise die Sensordatenerfassung) selbst gel\u00f6st werden muss. Ich werde dies anhand eines Beispiels verdeutlichen.<\/p>\n<h2>Was wird ben\u00f6tigt?<\/h2>\n<p>Die erstellte Bibliothek besteht aus mehreren Dateien:<\/p>\n<ul>\n<li>mclib.h &#8211; diese Headerdatei muss von allen Programmen eingebunden werden, die das Eingabe-Ausgabesystem benutzen wollen.<\/li>\n<li>mclib.c &#8211; diese Datei enth\u00e4lt die controllerseitigen Funktionen des Eingabe-Ausgabesystem und muss im Arbeitsverzeichnis oder im Pfad verf\u00fcgbar sein.<\/li>\n<li>SendKeys.h &#8211; diese Headerdatei enth\u00e4lt die empfangenen Kommandos des Tastatur- und Touchscreen-Controllers<\/li>\n<li>grafik.h &#8211; diese Headerdatei enth\u00e4lt die Kommandos und Unterkommandos, die der Grafikcontroller empfangen kann.<\/li>\n<\/ul>\n<h2>Eine Beispielanwendung<\/h2>\n<p>Es soll die Lichtst\u00e4rke mit einem LDR erfasst werden. Dank recht hochohmiger Eing\u00e4nge kann ein Spannungsteiler aus LDR und 10kOhm-Widerstand direkt an einen Eingang des AVR angeschlossen werden. Der AVR selbst bietet dazu einen A\/D-Wandler, der nach ein bisschen Verst\u00e4ndnis f\u00fcr die einzelnen Parameter (= zu setzende Bits), die zum Betrieb n\u00f6tig sind, reicht einfach anzusteuern ist:<\/p>\n<pre>DDRA  = 0x00;\r\n\/\/ Setzen einiger Register\r\nADMUX = (0 &lt;&lt; REFS1) | (1 &lt;&lt; REFS0)\u00a0;\r\nADCSRA = (1 &lt;&lt; ADEN) | (1 &lt;&lt; ADSC) | (1 &lt;&lt; ADATE) | (1 &lt;&lt; ADPS2) | (1 &lt;&lt; ADPS1) | (1 &lt;&lt; ADPS0) | (0 &lt;&lt; ADIE)\u00a0;\r\nADCSRB = (0 &lt;&lt; ADTS2) | (0 &lt;&lt; ADTS1) | (0 &lt;&lt; ADTS0) | (0 &lt;&lt; ACME);\r\n\/\/ Los gehts\r\nfor (;;)\r\n{\r\n\/\/ gemessener Wert wird abgefragt und in eine Spannung umgerechnet\r\n    Value = ADCW;\r\n    Value = Value \/ 5.12 + 33;\r\n    x = round(Value);\r\n\r\n\/\/ ein bisschen warten bis zur n\u00e4chsten Erfassung\r\n    _delay_ms(delay);\r\n}\r\n\/\/ Zuletzt Abschalten des A\/D-Wandlers\t\r\nADCSRA = 0x00;<\/pre>\n<p>Soweit kommt man auch durch Lesen des Manuals zum Mikrocontroller und ggf. einiger Beispiele im Internet. Jetzt erfasst man also alle paar Zeiteinheiten einen Messwert &#8211; und nun? Wie bekommt man die Werte nun angezeigt? Genau da setzt die Bibliothek Mikrocontroller Lab an. Sie erlaubt es, einerseits den Wert f\u00fcr &#8222;delay&#8220;, also die Wartezeit bis zur n\u00e4chsten Messung, elegant festzulegen und au\u00dferdem die gemessenen Werte auf den Bildschirm zu bringen. Schauen wir uns das ganze Programm mit den Erweiterungen noch einmal an:<\/p>\n<pre>void Messwerterfassung(void)\r\n{\r\n\/\/ ein paar Variablen vereinbaren\r\nunsigned char c=0;\r\ndouble Value; \r\nunsigned int x;\r\nsigned int delay;\r\nchar String_Buffer[10];\r\n\r\n\/\/ Erstmal den Benutzer informieren, was man vorhat. Er hat nur die M\u00f6glichkeit, auf OK zu dr\u00fccken\r\nMessageBox(MESSAGEBOX_OK, \"Messwerterfassung\", \"Bitte variable Eingangsspannung\", \"zwischen 0 und 5V an Eingang A0\", \"anschlie\u00dfen.\");\r\n\r\n\/\/ Jetzt abfragen, welche Pausen zwischen den Messungen gemacht werden sollen\r\n\/\/ Es wird eine numerische Tastatur angezeigt, zul\u00e4ssig sind nur Werte zwischen 10 und 500\r\n delay = ShowKeyboard(10,500, NUMERIC_KEYBOARD, \"Intervall (10-500ms)\u00a0: \");\r\n\r\n\/\/ Die Funktion kehrt mit einem g\u00fcltigen Wert f\u00fcr value zur\u00fcck (oder \"KEYBOARD_CANCELLED\", falls \"Abbrechen gedr\u00fcckt wurde\r\nif (delay\u00a0!= KEYBOARD_CANCELLED)\r\n{\r\n   \/\/ Jetzt Kommandos an die Grafikeinheit senden\r\n   Send_Command(MODE_QUIT);  \/\/ Aktuellen Modus verlassen, kommt immer als erstes\r\n   Send_Command(MODE_MESSWERTE);   \/\/ Messwerterfassung wird aktiviert\r\n\r\n   \/\/ Es soll erstmal ein Text ausgegeben werden - das ist nettes Beiwerk\r\n   Send_Command(MESSWERTE_TEXT);   \r\n   Send_String(\"Messwerterfassung, Intervall \");\r\n   itoa(delay, String_Buffer,10);    \/\/ Standardbefehl in C zum Wandeln von Zahlen in Strings\r\n   Send_String(String_Buffer);    \r\n   Send_String(\" ms\");    \r\n   \/\/ Der resultierende String hei\u00dft beispielsweise \"Messwerterfassung, Intervall 10 ms\"\r\n\r\n   \/\/ Jetzt sollen Anzeigewerte geschickt werden\r\n   Send_Command(MESSWERTE_WERTE);\r\n   _delay_ms(500);\r\n\r\n   \/\/ Jetzt kommt der schon bekannte Teil von eben\r\n   DDRA  = 0x00;\r\n   ADMUX = (0 &lt;&lt; REFS1) | (1 &lt;&lt; REFS0)\u00a0;    \r\n   ADCSRA = (1 &lt;&lt; ADEN) | (1 &lt;&lt; ADSC) | (1 &lt;&lt; ADATE) | (1 &lt;&lt; ADPS2) | (1 &lt;&lt; ADPS1) | (1 &lt;&lt; ADPS0) | (0 &lt;&lt; ADIE)\u00a0;\r\n   ADCSRB = (0 &lt;&lt; ADTS2) | (0 &lt;&lt; ADTS1) | (0 &lt;&lt; ADTS0) | (0 &lt;&lt; ACME);\r\n   for (;;)\r\n   {\r\n       Value = ADCW;\r\n       Value = Value \/ 5.12 + 33;\r\n       x = round(Value); \/\/ Ein Wert zwischen 34 und 234\r\n\r\n   \/\/ Jetzt senden wir den Wert ganz einfach an die Grafikeinheit\r\n       Send_Value(x);\r\n\r\n   \/\/ Pause f\u00fcr den \u00fcber \"delay\" vorhin festgelegten Zeitraum\r\n       _delay_ms(delay);\r\n\r\n   \/\/ Abfrage des Tastaturcontrollers, ob Taste gedr\u00fcckt wurde\r\n       c = Check_For_Input;  \r\n       if (c==SENDKEY_OK)    \/\/ OK-Taste bet\u00e4tigt, dann bitte abbrechen\r\n           break;\r\n   }\r\n   ADCSRA = 0x00;\t\r\n}\t\r\n}<\/pre>\n<p>Man sieht nun auf dem Bildschirm erst einmal eine Dialogbox, danach eine Abfrage und schlie\u00dflich eine fortlaufende Messkurve. Die Ausgabe eines Textes und die Abfrage der Tastatur sind letztlich nettes Beiwerk, damit man wei\u00df, was passiert und damit das Programm auch ein definiertes Ende hat. Damit entfallen beim Entwickeln genau die Aufgaben, die ansonsten viel Arbeit machen und fehlerbehaftet sind, n\u00e4mlich die Ein-Ausgabe-Routinen.<\/p>\n<p><a href=\"http:\/\/www.brennecke.org\/wp-content\/uploads\/2013\/05\/IMG_5405.jpg\"><img loading=\"lazy\" decoding=\"async\" alt=\"IMG_5405\" src=\"http:\/\/www.brennecke.org\/wp-content\/uploads\/2013\/05\/IMG_5405.jpg\" width=\"1024\" height=\"768\" \/><\/a><\/p>\n<p>Hinter den Funktionen &#8222;Send_Command&#8220;, &#8222;Send_String, &#8222;Send_Value&#8220; und &#8222;Check_For_Input&#8220; verbergen sich Makros zur Abfrage und Bef\u00fcllung der seriellen Schnittstelle. Die gew\u00e4hlte Benennung erleichtert lediglich das Lesen des Codes &#8211; ansonsten st\u00fcnde da &#8222;uart_putc&#8220;, &#8222;uart_puts&#8220; und &#8222;uart_getc&#8220;. Eine vollst\u00e4ndieg Beschreibung aller Kommandos und Funktionen findet sich <a title=\"Die Funktionen im Einzelnen\" href=\"http:\/\/www.brennecke.org\/?page_id=2524\">hier<\/a>.<\/p>\n<p>Wie das ganze im wirklichen Leben aussieht, kann man sich <a href=\"http:\/\/youtu.be\/qvboNE4R5ro\" rel=\"nofollow\">auf youtube in einem Video anschauen<\/a>.<\/p>\n<p><a title=\"Mikrocontroller-Lab 2.0\" href=\"http:\/\/www.brennecke.org\/?page_id=2396\">Zur\u00fcck zur Hauptseite<\/a><\/p>\n<div class=\"twoclick_social_bookmarks_post_2513 social_share_privacy clearfix 1.6.4 locale-de_DE sprite-de_DE\"><\/div><div class=\"twoclick-js\"><script type=\"text\/javascript\">\/* <![CDATA[ *\/\njQuery(document).ready(function($){if($('.twoclick_social_bookmarks_post_2513')){$('.twoclick_social_bookmarks_post_2513').socialSharePrivacy({\"services\":{\"facebook\":{\"status\":\"on\",\"txt_info\":\"2 Klicks f\\u00fcr mehr Datenschutz: Erst wenn Sie hier klicken, wird der Button aktiv und Sie k\\u00f6nnen Ihre Empfehlung an Facebook senden. Schon beim Aktivieren werden Daten an Dritte \\u00fcbertragen - siehe <em>i<\\\/em>.\",\"perma_option\":\"off\",\"action\":\"recommend\",\"language\":\"de_DE\"},\"twitter\":{\"reply_to\":\"\",\"tweet_text\":\"Hinweise%20zur%20Programmierung%20%C2%BB%2053%20Cent\",\"status\":\"on\",\"txt_info\":\"2 Klicks f\\u00fcr mehr Datenschutz: Erst wenn Sie hier klicken, wird der Button aktiv und Sie k\\u00f6nnen Ihre Empfehlung an Twitter senden. Schon beim Aktivieren werden Daten an Dritte \\u00fcbertragen - siehe <em>i<\\\/em>.\",\"perma_option\":\"off\",\"language\":\"de\",\"referrer_track\":\"\"},\"gplus\":{\"status\":\"on\",\"txt_info\":\"2 Klicks f\\u00fcr mehr Datenschutz: Erst wenn Sie hier klicken, wird der Button aktiv und Sie k\\u00f6nnen Ihre Empfehlung an Google+ senden. Schon beim Aktivieren werden Daten an Dritte \\u00fcbertragen - siehe <em>i<\\\/em>.\",\"perma_option\":\"off\",\"referrer_track\":\"\"},\"flattr\":{\"uid\":\"\",\"status\":\"on\",\"the_title\":\"Hinweise%20zur%20Programmierung\",\"the_excerpt\":\"Einleitung%0D%0AIm%20folgenden%20beschreibe%20ich%20Hinweise%20und%20Tipps%20zur%20Entwicklung%20eigener%20Programme.%20Ich%20gehe%20dabei%20davon%20aus%2C%20dass%20eine%20gewisse%20Erfahrung%20bereits%20vorliegt%20-%20beispielsweise%20durch%20Lesen%20und%20Durcharbeiten%20des%20exzelllenten%20Tutorials%20auf%20mikrocontroller.net.%20Meine%20Entwicklungssprache%20ist%20C%20-%20mit%20Assembler%20bin%20ich%20schon%20in%20den%2080er%20Jahren%20nicht%20mehr%20warm%20geworden.%0D%0A%0D%0AZun%C3%A4chst%20muss%20man%20sich%20...\",\"txt_info\":\"2 Klicks f\\u00fcr mehr Datenschutz: Erst wenn Sie hier klicken, wird der Button aktiv und Sie k\\u00f6nnen Ihre Empfehlung an Flattr senden. Schon beim Aktivieren werden Daten an Dritte \\u00fcbertragen - siehe <em>i<\\\/em>.\",\"perma_option\":\"off\"}},\"txt_help\":\"Wenn Sie diese Felder durch einen Klick aktivieren, werden Informationen an Facebook, Twitter, Flattr, Xing, t3n, LinkedIn, Pinterest oder Google eventuell ins Ausland \\u00fcbertragen und unter Umst\\u00e4nden auch dort gespeichert. N\\u00e4heres erfahren Sie durch einen Klick auf das <em>i<\\\/em>.\",\"settings_perma\":\"Dauerhaft aktivieren und Daten\\u00fcber-tragung zustimmen:\",\"info_link\":\"http:\\\/\\\/www.heise.de\\\/ct\\\/artikel\\\/2-Klicks-fuer-mehr-Datenschutz-1333879.html\",\"uri\":\"https:\\\/\\\/www.brennecke.org\\\/?page_id=2513\",\"post_id\":2513,\"post_title_referrer_track\":\"Hinweise+zur+Programmierung\",\"display_infobox\":\"on\"});}});\n\/* ]]> *\/<\/script><\/div>","protected":false},"excerpt":{"rendered":"<p>Einleitung Im folgenden beschreibe ich Hinweise und Tipps zur Entwicklung eigener Programme. Ich gehe dabei davon aus, dass eine gewisse Erfahrung bereits vorliegt &#8211; beispielsweise durch Lesen und Durcharbeiten des exzelllenten Tutorials auf mikrocontroller.net. Meine Entwicklungssprache ist C &#8211; mit &hellip; <a href=\"https:\/\/www.brennecke.org\/?page_id=2513\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":2396,"menu_order":6,"comment_status":"open","ping_status":"open","template":"","meta":{"footnotes":""},"_links":{"self":[{"href":"https:\/\/www.brennecke.org\/index.php?rest_route=\/wp\/v2\/pages\/2513"}],"collection":[{"href":"https:\/\/www.brennecke.org\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.brennecke.org\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.brennecke.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.brennecke.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2513"}],"version-history":[{"count":7,"href":"https:\/\/www.brennecke.org\/index.php?rest_route=\/wp\/v2\/pages\/2513\/revisions"}],"predecessor-version":[{"id":2518,"href":"https:\/\/www.brennecke.org\/index.php?rest_route=\/wp\/v2\/pages\/2513\/revisions\/2518"}],"up":[{"embeddable":true,"href":"https:\/\/www.brennecke.org\/index.php?rest_route=\/wp\/v2\/pages\/2396"}],"wp:attachment":[{"href":"https:\/\/www.brennecke.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2513"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}