{"id":187,"date":"2015-12-29T16:23:04","date_gmt":"2015-12-29T15:23:04","guid":{"rendered":"http:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/?page_id=187"},"modified":"2016-01-26T10:32:34","modified_gmt":"2016-01-26T09:32:34","slug":"mikrocontroller","status":"publish","type":"page","link":"https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/gruppen\/anzeige\/mikrocontroller\/","title":{"rendered":"Mikrocontroller"},"content":{"rendered":"<p>An der Programmierung und Planung sowie Beschaltung des Microcontrollers arbeiten 4 Personen.<\/p>\n<p>Aufgabe des Microcontrolllers (Atmega32) ist es, \u00fcber Kommunikationsschnittstellen zu anderen Gruppen, Informationen wie beispielsweise der Highscore oder das Batterie-Signal zu erhalten und diese Informationen so aufzubereiten und auszugeben, dass dem Benutzer \u00fcber die LED-Matrix die \u00fcbergebenen\u00a0Informationen angezeigt werden k\u00f6nnen.<\/p>\n<p><strong>Zur Ansteuerung\u00a0<\/strong><\/p>\n<p>Mithilfe eines Atmega32 wird die\u00a0LED-Matrix zeilenweise angesteuert und pro Zeile werden jeweils die Pins an den\u00a0LED&#8217;s auf bestimmte Potentiale gesetzt, die gerade Leuchten sollen. Dies geschieht mit\u00a0einer so hohen Frequenz (mehr als 25 frames pro Sekunde), dass das Auge ein zusammenhangendes Bild wahrnimmt.<br \/>\nDas folgende Bild soll die darauffolgende Erkl\u00e4rung der Funktionsweise verdeutlichen:<\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/Schaltung-mit-Reihensystem_PNG.png\"><img loading=\"lazy\" class=\"wp-image-202 aligncenter\" src=\"http:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/Schaltung-mit-Reihensystem_PNG-300x242.png\" alt=\"Schaltung mit Reihensystem_PNG\" width=\"400\" height=\"322\" srcset=\"https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/Schaltung-mit-Reihensystem_PNG-300x242.png 300w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/Schaltung-mit-Reihensystem_PNG-100x81.png 100w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/Schaltung-mit-Reihensystem_PNG-150x121.png 150w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/Schaltung-mit-Reihensystem_PNG-200x161.png 200w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/Schaltung-mit-Reihensystem_PNG-450x362.png 450w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/Schaltung-mit-Reihensystem_PNG-600x483.png 600w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/Schaltung-mit-Reihensystem_PNG.png 606w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/a><strong>Abbildung 1: Prinzipieller Aufbau der LED-Matrix mit 3 Spalten&amp; 3 Zeilen<\/strong><\/p>\n<p style=\"text-align: left\">\n<p style=\"text-align: left\">Damit nun z.B. LED 1 leuchtet, muss der Pin IN1 auf High und der Pin OUT1 auf Low<br \/>\ngesetzt werden, damit die Spannung \u00fcber der Diode positiv ist und diese leitet. Damit<br \/>\nz.B. die erste Zeile leuchtet, m\u00fcssen zus\u00e4tzlich OUT2 und OUT3 auf High gesetzt werden.<br \/>\nDas Setzen der Pins soll mit Hilfe von Schieberegistern erfolgen, die seriell vom \u00b5C gesteuert werden, welche Output Pins auf welchem Potential sein sollen. Getaktet werden die<br \/>\nRegister mit zwei PWM-Signalen des Controllers, eines davon wird als Shift-Clock, das<br \/>\nandere als Latch-Clock verwendet. Letztere hat in der finalen Schaltung ein sechzehntel\u00a0der<br \/>\nFrequenz der Shift-Clock, da die Zeilen und Spalten parallel mit Daten versorgt werden<br \/>\nund wir jeweils 16 davon haben. Die Schieberegister werden sich sp\u00e4ter auf derselben<br \/>\nPlatine wie die LED-Matrix befinden; die Daten sowie die Taktsignale werden dann \u00fcber<br \/>\neinen 10-Pin Stecker \u00fcbertragen. Das Eagle-Schematic dazu ist in folgender Abbildung 2 zu sehen.<\/p>\n<p style=\"text-align: left\">Die Information dar\u00fcber, was gerade angezeigt werden soll(u.A. Highscore-Wert,aktueller Punktestand, aktuelle Spielzeit), wird \u00fcber SPI von der Spiellogik empfangen empfangen und dann im uC verarbeitet. Dabei werden pro \u00dcbertragungsvorgang 3 Bytes \u00fcbertragen. Die 8 unterschiedlichen Informationstypen der Datenpakete sind \u00fcber 3 Bits zu unterschieden. Hierbei ist kurz zu sagen, dass f\u00fcr den Buchstabendatentyp die ASCII-Tabelle verwendet wurde.<\/p>\n<p><strong>Quelltext und Programmierkonzepte<\/strong><\/p>\n<p>Sowohl zum Senden der Daten an die Schieberegister, als auch f\u00fcr das Empfangen der Daten der Spiellogik sowie das Auslesen des Akkustands war einige Programmierarbeit notwendig. Diese wird im Folgenden Schritt f\u00fcr Schritt betrachtet.<\/p>\n<p><strong>ADU<\/strong><\/p>\n<p>\u00dcber den Bus erhalten wir von der Energieversorgungsgruppe einen Spannungswert, welcher bei 12-14V liegen sollte. Da der ADU des ATMEGA32 allerdings keine gro\u00dfen Spannungen vertr\u00e4gt, ist es n\u00f6tig, die Spannung mit Hilfe eines Spannungsteilers bestehend aus einem 10k Ohm und eines 1k Ohm Widerstands herunterzubrechen.<br \/>\nWas den Programmieraufwand angeht, ist der ADU eine der leichteren Aufgaben, was aber keineswegs bedeutet, dass der Code kurz ist. Wir haben uns daf\u00fcr entschieden, den Code in folgende Untermethoden aufzuteilen:<\/p>\n<ul>\n<li>Eine Methode, die alle erforderlichen Bits im Kontrollregister des ADU setzt<\/li>\n<li>Eine Methode, die die Spannungsmessung ausl\u00f6st und den gemessenen Wert zur\u00fcckgibt<\/li>\n<li>ein Abschnitt in der main-Methode, der die ausgelesenen Werte verarbeitet<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/Schaltplan3.png\"><img loading=\"lazy\" class=\"wp-image-374 size-full aligncenter\" src=\"http:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/Schaltplan3.png\" alt=\"Schaltplan des Microcontrollers\" width=\"417\" height=\"593\" srcset=\"https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/Schaltplan3.png 417w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/Schaltplan3-211x300.png 211w\" sizes=\"(max-width: 417px) 100vw, 417px\" \/><\/a><\/p>\n<p style=\"text-align: center\"><strong>Abbildung 2: Schaltplan des \u00b5C<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p>Die ersten beiden Methoden sind im folgenden zu sehen:<\/p>\n<p><a href=\"http:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeADU.png\"><img loading=\"lazy\" class=\" wp-image-389\" src=\"http:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeADU.png\" alt=\"Abbildung 2: CodesAnzeige\/ADU\" width=\"666\" height=\"410\" srcset=\"https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeADU.png 744w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeADU-300x185.png 300w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeADU-624x384.png 624w\" sizes=\"(max-width: 666px) 100vw, 666px\" \/><\/a><\/p>\n<p style=\"text-align: center\"><strong>Abbildung 3: CodesAnzeige\/ADU<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p>Bei der intialisierung des ADU wird zun\u00e4chst eine Umwandlung gestartet &#8211; dies wird empfohlen, damit der ADU &#8220;warml\u00e4uft&#8220;. Aufgerufen werden die beiden Methoden jeweils in der main-Methode: ADC\\_init einmalig zum Begin, vor der while-Schleife und ADC\\_Read jeweils dann, wenn ein Counter, der im Hintergrund l\u00e4uft, seinen Maximalwert erreicht hat. Mit Hilfe einer weiteren Methode, welche im Grunde nur if-Abfragen enth\u00e4lt wird der Spannungswert in einen Character umgewandelt, welcher sp\u00e4ter in die Schieberegister geschoben werden kann, um den Akkustand anzuzeigen.<\/p>\n<p><strong>SPI<\/strong><\/p>\n<p>Die Umsetzung des SPI ist \u00e4hnlich konzipiert wie die des ADU: Auch hier gibt es wieder eine Methode zur initialisierung, eine zum Empfang- und zur Auswertung der Daten und einen Abschnitt in der main-Methode, der das ganze ausl\u00f6st:<\/p>\n<p><a href=\"http:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeSPI1.png\"><img loading=\"lazy\" class=\"wp-image-387\" src=\"http:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeSPI1.png\" alt=\"Abbildung :CodesAnzeige\/SPI1\" width=\"638\" height=\"696\" srcset=\"https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeSPI1.png 1022w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeSPI1-275x300.png 275w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeSPI1-938x1024.png 938w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeSPI1-624x681.png 624w\" sizes=\"(max-width: 638px) 100vw, 638px\" \/><\/a><\/p>\n<p style=\"text-align: center\"><strong>Abbildung 4: CodeAnzeige\/SPI1<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p>Die Methode zur Initialisierung des SPI-Moduls des ATMEGA32 ist dabei vollst\u00e4ndig aus dem Datenblatt des Herstellers \u00fcbernommen, die Methode zum Empfang wurde von uns erweitert.<br \/>\nZun\u00e4chst wird der erste Character verarbeitet: die ersten drei Bit geben an, was empfangen wird. Aus dieser Information und der Schnittstellen\u00fcbersicht kann man erschlie\u00dfen, wieviele Bytes nun empfangen werden m\u00fcssen. Diese Information wird in der Variable &#8220;ByteMax&#8220; gespeichert, welche sp\u00e4ter (sofern keine Buchstaben f\u00fcr den Hiscorenamen empfangen wurden) als Abbruchbedingung genutzt wird. Zudem wird, wenn ein Buchstabe empfangen wird, das Boolean &#8220;istBuchstabe&#8220; auf &#8220;true&#8220; gesetzt, was n\u00f6tig ist, da diese gesondert behandelt werden m\u00fcssen und andere Abbruchbedingungen erf\u00fcllen m\u00fcssen, damit das Empfangen der Daten beendet wird.<br \/>\nIm Anschluss daran wird, falls es sich nicht um Buchstaben handelt, der empfangene Character in ein Hilfsarray (&#8220;ZS&#8220;) geschrieben. Dabei ist jedoch zu beachten, dass im ersten Character noch die Information enthalten ist, was gerade empfangen wird. Diese wird vor dem speichern noch von dem Wert abgezogen.<br \/>\nDa beim Highscorenamen der erste Character keine Informationen enth\u00e4lt, die gespeichert werden m\u00fcssen, wird dort erst der zweite Character und alle folgenden in das Hilfsarray gespeichert.<br \/>\nDie empfangenen Daten werden beim Beenden des Empfangs alle in ein struct gespeichert, welches die relevanten Informationen f\u00fcr die Anzeige enth\u00e4lt:<\/p>\n<p><a href=\"http:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeSPI2.png\"><img loading=\"lazy\" class=\"wp-image-388\" src=\"http:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeSPI2.png\" alt=\"Abbildung :CodeAnzeige\/SPI2\" width=\"1200\" height=\"463\" srcset=\"https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeSPI2.png 1161w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeSPI2-300x116.png 300w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeSPI2-1024x395.png 1024w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeSPI2-624x241.png 624w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" \/><\/a><\/p>\n<p style=\"text-align: center\"><strong>Abbildung 5: CodeAnzeige\/SPI2<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p>Nachdem der letzte Buchstabe empfangen wird, was durch eine &#8220;0x00&#8220; im Datenregister des SPI signalisiert wird, werden die Werte in dem Array von der Methode &#8220;Buchstabenwandler()&#8220; noch von den ASCII-Werten in die Nummern im Alphabet umgewandelt, welche in der Bibliothek, die im folgenden beschrieben ist, hinterlegt sind. Aufgerufen wird die Methode, wenn die Spiellogik den Slave-Select Pin auf low setzt, mit Hilfe einer if-Abfrage in der main-Methode.<\/p>\n<p><strong>Bibliothek f\u00fcr die Buchstaben<\/strong><\/p>\n<p>Um den Code etwas \u00fcbersichtlicher zu gestalten, haben wir die einzelnen Zeilen der Buchstaben in Arrays abgespeichert und in einer Bibliotheksdatei gespeichert. Als Beispiel dient hier der Buchstabe A:<\/p>\n<p>A[5] = {0b11011111,0b10101111,0b10001111,0b10101111,b10101111}<\/p>\n<p>Zur Anzeige des Buchstabens &#8218;A&#8216; werden zun\u00e4chst die entsprechenden Drains an der Spalte auf 0 oder 1 geschaltet (man beachte, dass 0 eine leuchtende Spalte zur Folge hat, da eine 1 einem Kurzschluss auf GND entspricht) und anschlie\u00dfend die zugeh\u00f6rige Zeile auf GND geschaltet (hier wiederum eine 1 an der gew\u00fcnschten Stelle!). Dazu m\u00fcssen die entsprechenden Daten an die Schieberegister gesendet werden, was mit einer weiteren Untermethode passiert.<\/p>\n<p><strong>USART<\/strong><\/p>\n<p>Zum \u00dcbertragen der Daten haben wir uns f\u00fcr die Emulation von USART mit Hilfe von Bit-Banging entschieden. Der Grund daf\u00fcr ist ganz einfach der, dass USART immer Stop-Bits schickt, die die Daten in unseren Schieberegistern durcheinander bringen w\u00fcrden, und zur Folge h\u00e4tten, dass wir 2 Zeilen und 2 Spalten nicht mehr kontrollieren k\u00f6nnten.<br \/>\nDaher simulieren wir das USART Modul mit der Methode &#8220;BitBanger&#8220;, welche im folgenden zu sehen ist:<\/p>\n<p><a href=\"http:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeBitbanger.png\"><img loading=\"lazy\" class=\"wp-image-386\" src=\"http:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeBitbanger.png\" alt=\"Abbildung : CodesAnzeige\/BitBanger\" width=\"1200\" height=\"1045\" srcset=\"https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeBitbanger.png 1132w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeBitbanger-300x261.png 300w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeBitbanger-1024x892.png 1024w, https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-content\/uploads\/sites\/13\/2015\/12\/CodeBitbanger-624x544.png 624w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" \/><\/a><\/p>\n<p style=\"text-align: center\"><strong>Abbildung 6: CodesAnzeige\/BitBanger<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p>Wie bereits angesprochen werden von dieser Methode zun\u00e4chst die Daten in die Spaltenregister geschoben und im Anschluss die entsprechende Zeile angeschaltet, indem in die Zeilenregister eine 1 an die richtige Stelle geschoben wird.<br \/>\nWir benutzen f\u00fcr die Zeilen und Spalten jeweils eine Shift-Clock und einen Datenpin. Die getrennte Ansteuerung wird \u00fcber getrennte Latch-Clocks der Register realisiert.<br \/>\n\u00dcbergeben werden dem BitBanger die 3 Character, die die Zeilen der drei Buchstaben widerspiegeln und die Zeile, die gerade angesteuert wird. Die drei &#8220;nutzlosen&#8220; Bits in den Buchstaben-Charactern wurden bereits beim Aufruf des BitBangers entfernt, der in der main-Methode zu finden ist.<\/p>\n<p><strong>main-Methode<\/strong><\/p>\n<p>In der main-Methode werden im Gro\u00dfen und Ganzen lediglich Variablen deklariert und initialisiert und in regelm\u00e4\u00dfigen Abst\u00e4nden geschaut, ob die Spiellogik etwas schickt oder der Akkustand \u00fcberpr\u00fcft werden sollte. Falls weder das eine noch das andere zutrifft, wird (momentan) nur der Highscorename auf der Matrix angezeigt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>An der Programmierung und Planung sowie Beschaltung des Microcontrollers arbeiten 4 Personen. Aufgabe des Microcontrolllers (Atmega32) ist es, \u00fcber Kommunikationsschnittstellen zu anderen Gruppen, Informationen wie beispielsweise der Highscore oder das Batterie-Signal zu erhalten und diese Informationen so aufzubereiten und auszugeben, dass dem Benutzer \u00fcber die LED-Matrix die \u00fcbergebenen\u00a0Informationen angezeigt werden k\u00f6nnen. Zur Ansteuerung\u00a0 Mithilfe eines [&hellip;]<\/p>\n","protected":false},"author":23,"featured_media":0,"parent":184,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-json\/wp\/v2\/pages\/187"}],"collection":[{"href":"https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-json\/wp\/v2\/users\/23"}],"replies":[{"embeddable":true,"href":"https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-json\/wp\/v2\/comments?post=187"}],"version-history":[{"count":25,"href":"https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-json\/wp\/v2\/pages\/187\/revisions"}],"predecessor-version":[{"id":406,"href":"https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-json\/wp\/v2\/pages\/187\/revisions\/406"}],"up":[{"embeddable":true,"href":"https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-json\/wp\/v2\/pages\/184"}],"wp:attachment":[{"href":"https:\/\/service.projektlabor.tu-berlin.de\/wordpress\/stefan\/wp-json\/wp\/v2\/media?parent=187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}