{"id":2387,"date":"2013-04-24T08:59:23","date_gmt":"2013-04-24T06:59:23","guid":{"rendered":"http:\/\/www.brennecke.org\/?page_id=2387"},"modified":"2013-04-25T08:29:18","modified_gmt":"2013-04-25T06:29:18","slug":"funktionsweise-der-mikrocontroller","status":"publish","type":"page","link":"https:\/\/www.brennecke.org\/?page_id=2387","title":{"rendered":"Funktionsweise der Mikrocontroller"},"content":{"rendered":"<h2>Generelle Informationen<\/h2>\n<p>Die beiden Mikrocontroller sind sehr \u00e4hnlich beschaltet und nehmen auch vergleichbare Aufgaben wahr. Die Erkl\u00e4rung gliedert sich daher in die Funktionen beider Mikrocontroller und gibt auch Aufschluss \u00fcber die Erzeugung des internen Ablenksignals, mit dem das Videomodul des EE3023 simuliert werden kann.<\/p>\n<h2>Horizontaler Mikrocontroller<\/h2>\n<p>Der horizontale Mikrocontroller \u00fcbernimmt die Erzeugung der horizontalen Sync-Signale f\u00fcr VGA und FBAS. Wenn ein Videosignal anliegt, dann erh\u00e4lt er an einem seiner Interrupt-Eing\u00e4nge (D2 und D3 f\u00fcr INT0 und INT1) das jeweilige Taktsignal. Dieses Taktsignal sorgt f\u00fcr den Aufruf eines Unterprogramms, das den Sync-Impuls am Ausgang C0 ein- und ausschaltet. Der folgende kurze Code f\u00fcr das FBAS-Signal an INT0 verdeutlicht das:<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #0000ff;\">ISR(INT0_vect)<\/span><br \/>\n<span style=\"color: #0000ff;\">{<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0\u00a0 int i;<\/span><br \/>\n<span style=\"color: #0000ff;\">\/\/ Bildlagekorrektur<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0for( i = porch_delay; i &lt; max_delay_time; i++)<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0NOP8;<\/span><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #0000ff;\">\/\/ Sync wird aufgerufen<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0hsync_on;<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0NOP100;<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0\u00a0 hsync_off;<\/span><br \/>\n<span style=\"color: #0000ff;\">}<\/span><\/p>\n<p>&#8222;NOP&#8220; steht dabei f\u00fcr eine Pause, der Mikrocontroller tut in dieser Zeit f\u00fcr einen Taktzyklus\u00a0 nichts. NOP8 meint 8 solcher Pausen, analog ist es bei 100. Das Sync-Signal hat damit eine definierte L\u00e4nge.<\/p>\n<p>Zus\u00e4tzlich wird hier bereits eine Bildlagekorrektur durchgef\u00fchrt, die es erlaubt, das Bild in horizontaler oder vertikaler Richtung exakt einzustellen. Dazu bedient sich das Programm eines Tricks. Der eingehende Sync-Impuls wird nicht direkt weitergegeben, sondern maximal bis zur n\u00e4chsten Zeile verz\u00f6gert. Damit kann man recht genau einstellen, wo die Videozeile am Bildschirm beginnt und wo sie endet. Die Bildlagekorrektur f\u00fcgt dazu einfach weitere Pausen ein, bevor das Sync-Signal ausgegeben wird. Wenn man die Abstufung fein genug w\u00e4hlt, erreicht man eine gute Darstellung auf dem Bildschirm. Die Ermittlung des besten Werts ist allerdings eine aufwendige Sache.\u00a0\u00a0 Eine nachtr\u00e4gliche Einstellbarkeit war im Prototypen vorgesehen, darauf konnte aber nach der Abgleichphase komplett verzichtet werden. Der VGA-Teil l\u00e4uft analog, nur wird hier zwischen VGA (640&#215;480) und SVGA (800&#215;600) unterschieden, weil beide unterschiedliche Timings haben. Die folgenden Bilder demonstrieren die Zeilenlage-Korrektur &#8211; einmal richtig, einmal verstellt.<\/p>\n<p><a href=\"http:\/\/www.brennecke.org\/wp-content\/uploads\/2013\/04\/Testbild-VGA.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-2393\" alt=\"Testbild VGA\" src=\"http:\/\/www.brennecke.org\/wp-content\/uploads\/2013\/04\/Testbild-VGA-300x225.jpg\" width=\"300\" height=\"225\" srcset=\"https:\/\/www.brennecke.org\/wp-content\/uploads\/2013\/04\/Testbild-VGA-300x225.jpg 300w, https:\/\/www.brennecke.org\/wp-content\/uploads\/2013\/04\/Testbild-VGA.jpg 1024w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a> <a href=\"http:\/\/www.brennecke.org\/wp-content\/uploads\/2013\/04\/Testbild-VGA-ohne-Bildlage.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-2394\" alt=\"Testbild VGA ohne Bildlage\" src=\"http:\/\/www.brennecke.org\/wp-content\/uploads\/2013\/04\/Testbild-VGA-ohne-Bildlage-300x225.jpg\" width=\"300\" height=\"225\" srcset=\"https:\/\/www.brennecke.org\/wp-content\/uploads\/2013\/04\/Testbild-VGA-ohne-Bildlage-300x225.jpg 300w, https:\/\/www.brennecke.org\/wp-content\/uploads\/2013\/04\/Testbild-VGA-ohne-Bildlage.jpg 1024w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Die Erkennung von VGA- oder SVGA-Eingangssignalen wird ebenfalls im horizontalen Mikrocontroller durchgef\u00fchrt. Beide unterscheiden sich durch eine unterschiedliche Horizontalfrequenz (31,4 KHz und 37,6 kHz). Es wurde daher ein internes Ablaufz\u00e4hler-Unterprogramm geschaffen, der pr\u00fcft, wie viele Zeilen (INT-Aufrufe) inzwischen eingegangen sind. Innerhalb einer Sekunde sind das entweder 37600 oder 31400. Zur schnelleren Bearbeitung wird der Z\u00e4hler im 76Hz-Takt aufgerufen und pr\u00fcft dann, ob mehr oder weniger als 450 Zeilen dargestellt wurden &#8211; seine Schwelle liegt also bei 450x76Hz=34kHz.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #0000ff;\">ISR(TIMER2_COMPA_vect)<\/span><br \/>\n<span style=\"color: #0000ff;\">{<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 &#8230;<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0if (linecount &gt; 450)\u00a0 \/\/ wird im 76Hz-Takt aufgerufen 450x76Hz=34kHz<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vga_mode = VGA800;<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0else\u00a0\u00a0 \u00a0<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vga_mode = VGA640;<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 &#8230;<\/span><br \/>\n<span style=\"color: #0000ff;\">}\u00a0\u00a0\u00a0<\/span><\/p>\n<p>Die Information, welcher VGA-Modus gew\u00e4hlt wurde, teilt der Mikrocontroller der Au\u00dfenwelt \u00fcber den Ausgang D0 mit.<\/p>\n<h2>Vertikaler Mikrocontroller<\/h2>\n<p>Der vertikale Mikrocontroller arbeitet analog zum horizontalen. Er erh\u00e4lt seine Steuersignale ebenfalls \u00fcber die INT-Eing\u00e4nge D2 und D3, hier sind die Frequenzen allerdings deutlich niedriger mit 50Hz (FBAS) und 60Hz (VGA\/SVGA). Auch hier wird der Verz\u00f6gerungstrick angewendet, um die Bildlage zu optimieren. Die beiden Unterprogramme zur Erzeugung der Sync-Signale erh\u00f6hen zudem noch bei jedem Aufruf einen Z\u00e4hler um 1, damit werden die eingehenden Bilder gez\u00e4hlt.<\/p>\n<p>Dieser Z\u00e4hler wird von einem Ablaufz\u00e4hler-Unterprogramm ausgewertet, das pr\u00fcft, ob seit dem letzten Aufruf eine gewisse Anzahl Bilder (=Aufrufe der Interrupt-Unterprogramme) erzeugt wurden. Ist das der Fall, dann liegt am aktiven Videoeingang ein Signal an. Fehlt dieses Signal aber, dann wird der Z\u00e4hler nicht erh\u00f6ht, und das Ablaufz\u00e4hler-Unterprogramm erkennt, dass kein externes Signal mehr anliegt. Es schaltet dann um auf &#8222;internen Modus&#8220; und teilt dies dem horizontalen Mikrocontroller \u00fcber den Ausgang D6 mit. Gleichzeitig wird noch die passende LED an Ausgang B4 aktiviert.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #0000ff;\">ISR(TIMER1_COMPA_vect)<\/span><br \/>\n<span style=\"color: #0000ff;\">{<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0\u00a0 if (sync_avail &gt; 3)\u00a0<\/span><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #0000ff;\"> \/\/ Das ist der Z\u00e4hler, der von den Interrupt-Unterprogrammen hochgez\u00e4hlt wird<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0{<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0PORTD &amp;= ~(1&lt;&lt;PD6);\u00a0\u00a0 \u00a0\/\/ Interner Generator deaktiviert<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0PORTB |= (1&lt;&lt;PB4);\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ LED deaktivieren (Achtung, LED arbeitet invertiert)<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0}\u00a0\u00a0 \u00a0<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0else<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0{<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0PORTD |= (1&lt;&lt;PD6);\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ Interner Generator eingeschaltet<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0PORTB &amp;= ~(1&lt;&lt;PB4);\u00a0\u00a0 \u00a0\/\/ LED aktivieren (Achtung, LED arbeitet invertiert)<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #0000ff;\">\u00a0\u00a0 \u00a0sync_avail = 0;\u00a0\u00a0\u00a0 <\/span><br \/>\n<span style=\"color: #0000ff;\">}<\/span><\/p>\n<p>Der vertikale Mikrocontroller ist au\u00dferdem f\u00fcr die Ansteuerung der Info-LEDs (an B1-B4) zust\u00e4ndig, die Auskunft geben \u00fcber den jeweils aktiven Modus (intern\/extern und FBAS\/VGA\/SVGA).<\/p>\n<h2>Der interne Modus<\/h2>\n<p>Zur Simulation des Videomoduls des EE3023 und nat\u00fcrlich zur Schonung der Bildr\u00f6hre bei fehlendem Eingangssignal wurde ein interner Modus geschaffen, der selbst\u00e4ndig Sync-Signale erzeugt, wenn kein externes Signal anliegt. Die Erkennung hierf\u00fcr wurde bereits weiter oben beschrieben. In diesem Modus hat der vertikale Mikrocontroller keine weiteren Aufgaben, alle Signale werden komplett vom horizontalen Mikrocontroller erzeugt.<\/p>\n<p>Hier kommt bei FBAS und VGA (intern wird kein SVGA unterst\u00fctzt) gleicherma\u00dfen ein Ablaufz\u00e4hler-Unterprogramm zum Einsatz. Diese Unterprogramme zeichnen sich dadurch aus, dass sie nach einer exakt definierten Zeit aufgerufen werden \u2013 in unserem Falle zum Beginn einer jeden Zeile. \u00dcber Pause-Befehle h\u00e4lt sich der Mikrocontroller w\u00e4hrend der gesamten Zeile im Unterprogramm auf und schaltet wechselweise die Ausg\u00e4nge C1-C4 (f\u00fcr Q1-Q4) aus und ein, so dass dort h\u00f6herfrequente, zur Zeile synchrone Impulse verf\u00fcgbar sind.<\/p>\n<p>Am Ende der Zeile wird ein Zeilenz\u00e4hler um eins erh\u00f6ht, bis die Gesamtzahl an Zeilen erreicht ist (bei VGA 600, bei FBAS 313 wegen des Halbbildverfahrens). Anhand dieses Zeilenz\u00e4hlers werden nun auch die Ausg\u00e4nge B1-B4 (f\u00fcr Q5-Q8) aktiviert, jeweils f\u00fcr eine Dauer einiger Zeilen, so dass dort h\u00f6herfrequente, zum Bild synchrone Impulse verf\u00fcgbar sind.<\/p>\n<p>&nbsp;<\/p>\n<p><a title=\"Schaltungen f\u00fcr die Bildr\u00f6hreneinheit\" href=\"http:\/\/www.brennecke.org\/?page_id=1842\">Zur\u00fcck zur Hauptseite<\/a><\/p>\n<p>&nbsp;<\/p>\n<div class=\"twoclick_social_bookmarks_post_2387 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_2387')){$('.twoclick_social_bookmarks_post_2387').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\":\"Funktionsweise%20der%20Mikrocontroller%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\":\"Funktionsweise%20der%20Mikrocontroller\",\"the_excerpt\":\"Generelle%20Informationen%0D%0ADie%20beiden%20Mikrocontroller%20sind%20sehr%20%C3%A4hnlich%20beschaltet%20und%20nehmen%20auch%20vergleichbare%20Aufgaben%20wahr.%20Die%20Erkl%C3%A4rung%20gliedert%20sich%20daher%20in%20die%20Funktionen%20beider%20Mikrocontroller%20und%20gibt%20auch%20Aufschluss%20%C3%BCber%20die%20Erzeugung%20des%20internen%20Ablenksignals%2C%20mit%20dem%20das%20Videomodul%20des%20EE3023%20simuliert%20werden%20kann.%0D%0AHorizontaler%20Mikrocontroller%0D%0ADer%20horizontale%20Mikrocontroller%20%C3%BCbe%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=2387\",\"post_id\":2387,\"post_title_referrer_track\":\"Funktionsweise+der+Mikrocontroller\",\"display_infobox\":\"on\"});}});\n\/* ]]> *\/<\/script><\/div>","protected":false},"excerpt":{"rendered":"<p>Generelle Informationen Die beiden Mikrocontroller sind sehr \u00e4hnlich beschaltet und nehmen auch vergleichbare Aufgaben wahr. Die Erkl\u00e4rung gliedert sich daher in die Funktionen beider Mikrocontroller und gibt auch Aufschluss \u00fcber die Erzeugung des internen Ablenksignals, mit dem das Videomodul des &hellip; <a href=\"https:\/\/www.brennecke.org\/?page_id=2387\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1842,"menu_order":10,"comment_status":"open","ping_status":"open","template":"","meta":{"footnotes":""},"_links":{"self":[{"href":"https:\/\/www.brennecke.org\/index.php?rest_route=\/wp\/v2\/pages\/2387"}],"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=2387"}],"version-history":[{"count":5,"href":"https:\/\/www.brennecke.org\/index.php?rest_route=\/wp\/v2\/pages\/2387\/revisions"}],"predecessor-version":[{"id":2392,"href":"https:\/\/www.brennecke.org\/index.php?rest_route=\/wp\/v2\/pages\/2387\/revisions\/2392"}],"up":[{"embeddable":true,"href":"https:\/\/www.brennecke.org\/index.php?rest_route=\/wp\/v2\/pages\/1842"}],"wp:attachment":[{"href":"https:\/\/www.brennecke.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2387"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}