{"id":164,"date":"2014-03-02T21:52:09","date_gmt":"2014-03-02T20:52:09","guid":{"rendered":"http:\/\/heppg.de\/ikg\/wordpress\/?p=164"},"modified":"2016-04-02T17:20:09","modified_gmt":"2016-04-02T15:20:09","slug":"atmel-328-prozessor-als-ad-wandler","status":"publish","type":"post","link":"https:\/\/heppg.de\/ikg\/wordpress\/?p=164","title":{"rendered":"Atmel 328-Prozessor als AD-Wandler f\u00fcr Raspberry Pi"},"content":{"rendered":"<p><a href=\"http:\/\/heppg.de\/ikg\/wordpress\/?p=209\">[english<\/a>]<\/p>\n<p>Siehe auch<br \/>\n<a href=\"http:\/\/heppg.de\/ikg\/wordpress\/?p=134\">MCP3202-AD Wandler am Raspberry PI<\/a><br \/>\n<a href=\"http:\/\/heppg.de\/ikg\/wordpress\/?p=153\">ADS1015 als AD-Wandler am Raspberry Pi<\/a><br \/>\n<a href=\"http:\/\/heppg.de\/ikg\/wordpress\/?p=532\">Arduino UNO, NANO connected to Scratch<\/a><\/p>\n<h1>Atmel 328-Prozessor als AD-Wandler f\u00fcr Raspberry Pi<\/h1>\n<p>Der Microcontroller <a title=\"Datasheet\" href=\"http:\/\/www.atmel.com\/Images\/doc8161.pdf\">ATmega328P <\/a>im DIL-Geh\u00e4use kann auf dem Steckbrett in Betrieb genommen werden.<\/p>\n<p>Der Microcontroller hat viele eingebaute Funktionen, wie z.B. AD-Wandler, Timer, SPI und anderes mehr.<br \/>\nDieser Microcontroller ist im Hobbybereich sehr bekannt, da die Arduino-Boards mit diesem Microcontroller arbeiten.<br \/>\nDer AD-Wandler des Microcontrollers hat eine ausreichende Aufl\u00f6sung mit 10 Bit und es k\u00f6nnen bis zu 5 Eing\u00e4nge angeschlossen werden. Damit kann er als Ersatz f\u00fcr einen AD-Wandlerbaustein benutzt werden.<\/p>\n<p>Der Controller ist einfach an den Raspberry Pi anzuschliessen und sein Programm kann vom RPi aus aufgespielt werden. Wie der Baustein programmiert wird soll hier nicht beschrieben werden. Das ben\u00f6tigte Programm ist bereits \u00fcbersetzt in den Beispielen enthalten.<br \/>\nDie Kosten f\u00fcr den Prozessor sind mit einigen Euro etwa so hoch wie f\u00fcr einen AD-Wandler.<\/p>\n<p>Nachteil ist die etwas komplizierte Inbetriebnahme. Die ist deshalb so lang geworden, da viele einzelne Schritte und \u00dcberpr\u00fcfungen aufgenommen wurden.<\/p>\n<p>Das interne Programm des 328-Microcontroller ist in den Beispielen enthalten.<\/p>\n<p>Das Programm kann zwei AD-Kan\u00e4le auslesen und eine Leuchtdiode ansteuern. Weitere Funktionen sind in Planung, wie ein Frequenzmesser, ein Anschluss f\u00fcr eine Infrarotfernsteuerung und Drehencoder.<\/p>\n<p>Das Programm des Microcontrollers kann mit dem Raspberry in den Controller \u00fcbertragen werden. Es ist also kein extra Programmierger\u00e4t erforderlich.<br \/>\nVoraussetzung ist, dass der Microcontroller den internen 8MHz RC-Oszillator aktiviert hat. Das ist bei fabrikneuen Microcontrollern der Fall.<br \/>\nDie Grundeinstellung des Microcontrollers, also auch die Steuerung der Oszillatoren wird \u00fcber &#8216;Fuses&#8217; eingestellt. Damit kann man den interen Oszillator aktivieren oder es werden Quartz-Oszillatoren oder eine externe Taktquelle aktiviert. Das Problem ist, dass ohne aktiven Oszillator das Programmieren mit dem RPi nicht funktioniert.<br \/>\nFalls man einen bereits programmierten Prozessor erh\u00e4lt, dann kann dieser den internen Oszillator abgeschaltet haben. In diesem Fall funktioniert bereits das Auslesen der &#8216;Fuses&#8217; nicht.<br \/>\nDann braucht man entweder ein spezielles Programmierger\u00e4t oder muss den GPIO#4 als Taktquelle aktivieren. Eine Anleitung dazu ist am Ende des Artikels zu finden.<\/p>\n<p>Einkaufsliste<\/p>\n<ul>\n<li>ATmega 328 P-PU (DIL-Geh\u00e4use)<\/li>\n<li>Steckbrett<\/li>\n<li>Pr\u00e4zisionsfassung 28 pol, DIL 28 pol, 0.3 breit. Die Fassung ist f\u00fcr den Prozessor, damit die Beinchen nicht so leicht verbiegen. Fassung auf verbogene Kontakte kontrollieren (vorsichtig gerade biegen) und ins Steckbrett einsetzen. Den 328 in die Fassung einsetzen. Die F\u00fcsse des Prozessors sind ab Fabrik nicht genau parallel ausgerichtet. Vorsichtig auf einer glatten Platte ausrichten.<\/li>\n<li>Leuchtdiode. Der l\u00e4ngere Anschluss ist die Anode und wird mit &#8216;+ 3.3V&#8217; verbunden.<\/li>\n<li>Widerstand 1kOhm<\/li>\n<li>Kondensator, Keramik 100nF, min 10V<\/li>\n<li>Trimmpotentiometer zum Test<\/li>\n<li>Steckbr\u00fccken Buchse-Stecker, 7 St\u00fcck oder 8<\/li>\n<li>Kabelbr\u00fccken f\u00fcrs Steckbrett<\/li>\n<\/ul>\n<h2>Inbetriebnahme<\/h2>\n<p>Aufbau der Verkabelung, Programmierung des Prozessors und Aktivieren der scratchClient-Software.<\/p>\n<h3>Elektrischer Aufbau<\/h3>\n<p>Strom des Rpi abschalten.<\/p>\n<p>Prozessor auf dem Steckbrett aufbauen.<\/p>\n<p><a href=\"http:\/\/heppg.de\/ikg\/wordpress\/wp-content\/uploads\/2014\/04\/atmel_Steckplatine1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-248\" src=\"http:\/\/heppg.de\/ikg\/wordpress\/wp-content\/uploads\/2014\/04\/atmel_Steckplatine1.png\" alt=\"atmel_Steckplatine\" width=\"2175\" height=\"1581\" \/><\/a><\/p>\n<p>VCC des Prozessors wird aus 3.3V des Raspberry versorgt.<br \/>\nSPI-Verbindung MISO, MOSI, SCK und SS an CS0 des RPI.<br \/>\nRESET des Prozessors Pin 1 an GPIO24<br \/>\nLED mit Serienwiderstand 1kOhm von Port PB1, Pin 15.<br \/>\nADC-Eing\u00e4nge am atmega328 sind ADC0 und ADC1, Pin 23, 24.<\/p>\n<p><a href=\"http:\/\/heppg.de\/ikg\/wordpress\/wp-content\/uploads\/2014\/03\/sockel.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-180 alignleft\" src=\"http:\/\/heppg.de\/ikg\/wordpress\/wp-content\/uploads\/2014\/03\/sockel.jpg\" alt=\"Prozessor im Sockel\" width=\"321\" height=\"217\" \/><\/a><\/p>\n<p>So sieht der Controller im Sockel auf dem Steckbrett aus.<\/p>\n<p>&nbsp;<\/p>\n<h3>Programmiersoftware auf dem Rpi installieren<\/h3>\n<p><span style=\"color: #000080;\"><span style=\"font-family: Courier New,monospace;\"><span style=\"font-size: xx-small;\">sudo apt-get update<br \/>\nsudo apt-get upgrade -y<br \/>\nsudo apt-get install python-dev pip<br \/>\nsudo pip install spidev intelhex<\/span><\/span><\/span><\/p>\n<p>Den SPI-Treiber aktivieren. Der ist \u00fcber raspi-config zu starten, (enable SPI).<br \/>\nOder \u00fcber<br \/>\n<span style=\"color: #000080;\"><span style=\"font-family: Courier New,monospace;\"><span style=\"font-size: xx-small;\">sudo modprobe spi_bcm2708<\/span><\/span><\/span><\/p>\n<p>Programmiersoftware in \/home\/pi kopieren<\/p>\n<p><a title=\"Programmiersoftware und Testprogramme\" href=\"http:\/\/heppg.de\/ikg\/administration\/pi\/program_328\/download\/program_328.tar.gz\">Das Archiv laden<\/a> und auf dem RPi in \/home\/pi speichern und auspacken.<\/p>\n<p><span style=\"color: #000080;\"><span style=\"font-family: Courier New,monospace;\"><span style=\"font-size: xx-small;\">tar xzvf program_328.tar.gz<\/span><\/span><\/span><\/p>\n<h3>\u00dcberpr\u00fcfen der Hardware und der Programme<\/h3>\n<p>Die folgenden Schritte pr\u00fcfen, ob die Verkabelung korrekt ist und die Programmierung des Controllers m\u00f6glich ist.<\/p>\n<h4>Fuses auslesen<\/h4>\n<p><span style=\"color: #000080;\"><span style=\"font-family: Courier New,monospace;\"><span style=\"font-size: xx-small;\">cd ~\/program_328<br \/>\nsudo python src\/program.py -rf<\/span><\/span><\/span><\/p>\n<p>Die Ausgabe sollte folgendermassen aussehen<\/p>\n<pre><span style=\"font-family: Courier New,monospace;\"><span style=\"font-size: xx-small;\">PROGRAMMING_READ_CALIBRATION_BYTE b0 10110000\r\n PROGRAMMING_READ_EXTENDED_FUSE_BITS ff 11111111\r\n BODLEVEL0 1\r\n BODLEVEL1 1\r\n BODLEVEL2 1\r\n PROGRAMMING_READ_FUSE_BITS e2 11100010\r\n CKSEL0 0 ENABLED\r\n CKSEL1 1\r\n CKSEL2 0 ENABLED\r\n CKSEL3 0 ENABLED\r\n SUT0 0 ENABLED\r\n SUT1 1\r\n CKOUT 1\r\n CKDIV8 0\r\n PROGRAMMING_READ_FUSE_HIGH_BITS d9 11011001\r\n BOOTRST 1\r\n BOOTSZ0 0 ENABLED\r\n BOOTSZ1 0 ENABLED\r\n EESAVE 1\r\n WDTON 1\r\n SPIEN 0 ENABLED\r\n DWEN 1\r\n RSTDISBL 1\r\n PROGRAMMING_READ_LOCK_BITS ff 11111111<\/span><\/span><\/pre>\n<p>Wenn es Fehlermeldungen gibt (Device not in sync), dann liegt ggf ein Schaltfehler vor oder der Prozessor ist bereits mit unpassenden Fuses programmiert.<br \/>\nDann erst mal nicht weitermachen und Verkabelung \u00fcberpr\u00fcfen. Wenn diese stimmt, dann externen Takt anschliessen.<\/p>\n<h4>Aktuelles Programm auslesen<\/h4>\n<p>Wenn die Ausgabe stimmt, dann kann man versuchen das aktuelle Programm auszulesen. Das ist bei einem neuen Prozessor noch leer. Hier dient das zu einer weiteren \u00dcberpr\u00fcfung der Kommunikation.<\/p>\n<p><span style=\"color: #000080;\"><span style=\"font-family: Courier New,monospace;\"><span style=\"font-size: xx-small;\">cd ~\/program_328<br \/>\nsudo python src\/program.py -r<\/span><\/span><\/span><\/p>\n<p>Die Ausgabe sollte wie folgt aussehen<\/p>\n<pre><span style=\"font-family: Courier New,monospace;\"><span style=\"font-size: xx-small;\">python src\/program.py -r\r\n ('read', 'out.hex')\r\n programming_readCode\r\n programming_enable\r\n ('PROGRAMMING_ENABLE', [172, 83, 0, 0])\r\n (0, [255, 255, 83, 0])\r\n programming_enable end\r\n programming_disable\r\n programming_readCode ende\r\n ok<\/span><\/span><\/pre>\n<h4>Test-Programm in den Controller laden<\/h4>\n<p>Sind die bisherigen Schritte erfolgreich, dann kann man das erste Testprogramm in den Prozessor laden. Es sollte die LED blinken lassen.<\/p>\n<p><span style=\"color: #000080;\"><span style=\"font-family: Courier New,monospace;\"><span style=\"font-size: xx-small;\">cd ~\/program_328<br \/>\nsudo python src\/program.py -p 328\/steckbrett_328_blink.hex<\/span><\/span><\/span><\/p>\n<p>Jetzt sollte die LED langsam blinken.<\/p>\n<h4>Fuses f\u00fcr Oszillator programmieren<\/h4>\n<p>Der Microcontroller l\u00e4uft bisher mit dem internen Oszilator, aber durch einen Teiler wird die Frequenz auf 1MHz heruntergesetzt. Der Teiler kann mit den Fuses abgeschaltet werden und der Controller l\u00e4uft dann mit 8MHz, was bei 3.3V Betriebsspannung das Maximum ist f\u00fcr diesen Controller.<\/p>\n<p>Die Fuses nur programmieren, wenn es bei den vorherigen Schritten keine Fehler gab und die LED auch blinkt.<\/p>\n<p><span style=\"color: #000080;\"><span style=\"font-family: Courier New,monospace;\"><span style=\"font-size: xx-small;\">cd ~\/program_328<br \/>\nsudo python src\/program.py -wf<\/span><\/span><\/span><\/p>\n<p>Das Blinken h\u00f6rt kurz auf, und sollte dann deutlich schneller wieder anfangen, 5 mal die Sekunde.<br \/>\nJetzt der Oszillator konfiguriert\u00a0 und der Controller l\u00e4uft mit 8MHz.<\/p>\n<h3>Anwendungsprogramm in den Controller laden<\/h3>\n<p>Jetzt kann das eigentliche Anwendungsprogramm geladen werden. Es sorgt f\u00fcr regelm\u00e4ssiges Auslesen der AD-Werte ADC0, ADC1.<br \/>\n<span style=\"color: #000080;\"><span style=\"font-family: Courier New,monospace;\"><span style=\"font-size: xx-small;\">cd ~<\/span><\/span><\/span><span style=\"color: #000080;\"><span style=\"font-family: Courier New,monospace;\"><span style=\"font-size: xx-small;\">\/program_3<\/span><\/span><\/span><span style=\"color: #000080;\"><span style=\"font-family: Courier New,monospace;\"><span style=\"font-size: xx-small;\">28<br \/>\nsudo python src\/program.py -p 328\/steckbrett_328.hex<\/span><\/span><\/span><\/p>\n<p>Nach dem Programmieren oder Einschalten des RPI mit dem Steckbrett sollte die LED 5 mal leuchten.<\/p>\n<h3>Anwendungsprogramm &#8211; Testprogramme<\/h3>\n<p>Die LED blinken lassen, lange hell und kurz dunkel.<br \/>\n<span style=\"color: #000080;\"><span style=\"font-family: Courier New,monospace;\"><span style=\"font-size: xx-small;\">cd ~\/program_328<br \/>\nsudo python src\/test_blink.py<\/span><\/span><\/span><\/p>\n<p>Auslesen der Version des 328-Programms<br \/>\n<span style=\"color: #000080;\"><span style=\"font-family: Courier New,monospace;\"><span style=\"font-size: xx-small;\">cd ~\/program_328<br \/>\nsudo python src\/test_get_version.py<\/span><\/span><\/span><\/p>\n<p>Die Anzeige sollte &#8217;93 09&#8242; sein; die zweite Zahl kann h\u00f6her sein.<\/p>\n<p>Auslesen der adc_0-Werte<br \/>\n<span style=\"color: #000080;\"><span style=\"font-family: Courier New,monospace;\"><span style=\"font-size: xx-small;\">cd ~\/program_328<br \/>\nsudo python src\/test_adc_0.py<\/span><\/span><\/span><\/p>\n<h2>Scratch-Verbindung<\/h2>\n<p>Wenn die Tests f\u00fcr die Anwendungssoftware funktionieren, kann die Verbindung mit Scratch in Betrieb genommen werden.<\/p>\n<p><span style=\"color: #000080;\"><span style=\"font-family: Courier New,monospace;\"><span style=\"font-size: xx-small;\">cd ~\/scratchClient<br \/>\nsudo python src\/scratchClient.py -config config\/config_adc_atmel328.xml<br \/>\n<\/span><\/span><\/span><\/p>\n<p>Die Konfiguration kann \u00fcber Parameter angepasst werden und erlaubt das An-Abschalten der AD-Kan\u00e4le. Die Referenzspannung kann 3.3-V sein oder die interne 1.1V-Referenz.<br \/>\nDie 1.1V-Referenz kann z.B. mit einem Temperatursensor TMP036 benutzt werden.<\/p>\n<p>Die 3.3V-Referenz ist ideal, wenn Potentiometer ausgelesen werden.<\/p>\n<p>Die Werte der AD-Wandler werden als &#8216;adc_0&#8217; und &#8216;adc_1&#8217; an Scratch geschickt, Wertebereich 0..1023.<br \/>\nBefehle von Scratch an den Controller sind &#8216;led_off&#8217;, &#8216;led_on&#8217;.<\/p>\n<h2>SPI-Kommunikation zwischen RPi und Controller<\/h2>\n<p>Der Controller muss alle Befehle, die vom RPi gesendet werden \u00fcberpr\u00fcfen und die entsprechende Aktion ausf\u00fchren. Der Controller muss das so schnell erledigen, dass die n\u00e4chste Anfrage des RPi schon die korrekten Daten erhalten kann.<\/p>\n<p>Die \u00dcbertragungsrate kann deshalb nur relativ langsam sein mit 240kHz. Das ist aber bei der Kommunikation mit Scratch kein Problem.<\/p>\n<p>Trotz dieser Beschr\u00e4nkungen wurde SPI gew\u00e4hlt, da diese Verbindungen bereits zum Programmieren des Controllers vorhanden sind.<\/p>\n<h2>Anhang: GPIO#4 des RPi als Taktgenerator f\u00fcr den 328<\/h2>\n<p>Der GPIO#4-Pin kann als Taktausgang konfiguriert werden. Das daf\u00fcr notwendige Programm ist im bin\/-Verzeichnis enthalten, Es basiert auf Code von guzunty.org.<\/p>\n<p>GPIO#4 mit den XCLK-Eingang des Controllers verbinden.\u00a0 Dann das Programm bin\/gz_clock_1.92MHz starten.<\/p>\n<pre>cd bin\r\nchmod +x gz_clock_1.92MHz \r\nsudo .\/gz_clock_1.92MHz<\/pre>\n<p>Die Ausgabefrequenz ist ca 2MHz.<\/p>\n<p>W\u00e4hrend das Programm l\u00e4uft, das Auslesen und Schreiben der Fuses ausf\u00fchren.<br \/>\nDann diese Verbindung wieder trennen.<\/p>\n<p>Update history:<br \/>\n2014-04-01 Fixed connections of LED<\/p>\n","protected":false},"excerpt":{"rendered":"<p>[english] Siehe auch MCP3202-AD Wandler am Raspberry PI ADS1015 als AD-Wandler am Raspberry Pi Arduino UNO, NANO connected to Scratch Atmel 328-Prozessor als AD-Wandler f\u00fcr Raspberry Pi Der Microcontroller ATmega328P im DIL-Geh\u00e4use kann auf dem Steckbrett in Betrieb genommen werden. Der Microcontroller hat viele eingebaute Funktionen, wie z.B. AD-Wandler, Timer, SPI und anderes mehr. Dieser [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,3],"tags":[],"class_list":["post-164","post","type-post","status-publish","format-standard","hentry","category-analog-digital-wandler","category-scratchclient"],"_links":{"self":[{"href":"https:\/\/heppg.de\/ikg\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/164","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/heppg.de\/ikg\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/heppg.de\/ikg\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/heppg.de\/ikg\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/heppg.de\/ikg\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=164"}],"version-history":[{"count":24,"href":"https:\/\/heppg.de\/ikg\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/164\/revisions"}],"predecessor-version":[{"id":788,"href":"https:\/\/heppg.de\/ikg\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/164\/revisions\/788"}],"wp:attachment":[{"href":"https:\/\/heppg.de\/ikg\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=164"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/heppg.de\/ikg\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=164"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/heppg.de\/ikg\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=164"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}