Atmel 328-Prozessor als AD-Wandler für Raspberry Pi

[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ür Raspberry Pi

Der Microcontroller ATmega328P im DIL-Gehäuse 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 Microcontroller ist im Hobbybereich sehr bekannt, da die Arduino-Boards mit diesem Microcontroller arbeiten.
Der AD-Wandler des Microcontrollers hat eine ausreichende Auflösung mit 10 Bit und es können bis zu 5 Eingänge angeschlossen werden. Damit kann er als Ersatz für einen AD-Wandlerbaustein benutzt werden.

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ötigte Programm ist bereits übersetzt in den Beispielen enthalten.
Die Kosten für den Prozessor sind mit einigen Euro etwa so hoch wie für einen AD-Wandler.

Nachteil ist die etwas komplizierte Inbetriebnahme. Die ist deshalb so lang geworden, da viele einzelne Schritte und Überprüfungen aufgenommen wurden.

Das interne Programm des 328-Microcontroller ist in den Beispielen enthalten.

Das Programm kann zwei AD-Kanäle auslesen und eine Leuchtdiode ansteuern. Weitere Funktionen sind in Planung, wie ein Frequenzmesser, ein Anschluss für eine Infrarotfernsteuerung und Drehencoder.

Das Programm des Microcontrollers kann mit dem Raspberry in den Controller übertragen werden. Es ist also kein extra Programmiergerät erforderlich.
Voraussetzung ist, dass der Microcontroller den internen 8MHz RC-Oszillator aktiviert hat. Das ist bei fabrikneuen Microcontrollern der Fall.
Die Grundeinstellung des Microcontrollers, also auch die Steuerung der Oszillatoren wird über ‘Fuses’ 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.
Falls man einen bereits programmierten Prozessor erhält, dann kann dieser den internen Oszillator abgeschaltet haben. In diesem Fall funktioniert bereits das Auslesen der ‘Fuses’ nicht.
Dann braucht man entweder ein spezielles Programmiergerät oder muss den GPIO#4 als Taktquelle aktivieren. Eine Anleitung dazu ist am Ende des Artikels zu finden.

Einkaufsliste

  • ATmega 328 P-PU (DIL-Gehäuse)
  • Steckbrett
  • Präzisionsfassung 28 pol, DIL 28 pol, 0.3 breit. Die Fassung ist für 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üsse des Prozessors sind ab Fabrik nicht genau parallel ausgerichtet. Vorsichtig auf einer glatten Platte ausrichten.
  • Leuchtdiode. Der längere Anschluss ist die Anode und wird mit ‘+ 3.3V’ verbunden.
  • Widerstand 1kOhm
  • Kondensator, Keramik 100nF, min 10V
  • Trimmpotentiometer zum Test
  • Steckbrücken Buchse-Stecker, 7 Stück oder 8
  • Kabelbrücken fürs Steckbrett

Inbetriebnahme

Aufbau der Verkabelung, Programmierung des Prozessors und Aktivieren der scratchClient-Software.

Elektrischer Aufbau

Strom des Rpi abschalten.

Prozessor auf dem Steckbrett aufbauen.

atmel_Steckplatine

VCC des Prozessors wird aus 3.3V des Raspberry versorgt.
SPI-Verbindung MISO, MOSI, SCK und SS an CS0 des RPI.
RESET des Prozessors Pin 1 an GPIO24
LED mit Serienwiderstand 1kOhm von Port PB1, Pin 15.
ADC-Eingänge am atmega328 sind ADC0 und ADC1, Pin 23, 24.

Prozessor im Sockel

So sieht der Controller im Sockel auf dem Steckbrett aus.

 

Programmiersoftware auf dem Rpi installieren

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install python-dev pip
sudo pip install spidev intelhex

Den SPI-Treiber aktivieren. Der ist über raspi-config zu starten, (enable SPI).
Oder über
sudo modprobe spi_bcm2708

Programmiersoftware in /home/pi kopieren

Das Archiv laden und auf dem RPi in /home/pi speichern und auspacken.

tar xzvf program_328.tar.gz

Überprüfen der Hardware und der Programme

Die folgenden Schritte prüfen, ob die Verkabelung korrekt ist und die Programmierung des Controllers möglich ist.

Fuses auslesen

cd ~/program_328
sudo python src/program.py -rf

Die Ausgabe sollte folgendermassen aussehen

PROGRAMMING_READ_CALIBRATION_BYTE b0 10110000
 PROGRAMMING_READ_EXTENDED_FUSE_BITS ff 11111111
 BODLEVEL0 1
 BODLEVEL1 1
 BODLEVEL2 1
 PROGRAMMING_READ_FUSE_BITS e2 11100010
 CKSEL0 0 ENABLED
 CKSEL1 1
 CKSEL2 0 ENABLED
 CKSEL3 0 ENABLED
 SUT0 0 ENABLED
 SUT1 1
 CKOUT 1
 CKDIV8 0
 PROGRAMMING_READ_FUSE_HIGH_BITS d9 11011001
 BOOTRST 1
 BOOTSZ0 0 ENABLED
 BOOTSZ1 0 ENABLED
 EESAVE 1
 WDTON 1
 SPIEN 0 ENABLED
 DWEN 1
 RSTDISBL 1
 PROGRAMMING_READ_LOCK_BITS ff 11111111

Wenn es Fehlermeldungen gibt (Device not in sync), dann liegt ggf ein Schaltfehler vor oder der Prozessor ist bereits mit unpassenden Fuses programmiert.
Dann erst mal nicht weitermachen und Verkabelung überprüfen. Wenn diese stimmt, dann externen Takt anschliessen.

Aktuelles Programm auslesen

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 Überprüfung der Kommunikation.

cd ~/program_328
sudo python src/program.py -r

Die Ausgabe sollte wie folgt aussehen

python src/program.py -r
 ('read', 'out.hex')
 programming_readCode
 programming_enable
 ('PROGRAMMING_ENABLE', [172, 83, 0, 0])
 (0, [255, 255, 83, 0])
 programming_enable end
 programming_disable
 programming_readCode ende
 ok

Test-Programm in den Controller laden

Sind die bisherigen Schritte erfolgreich, dann kann man das erste Testprogramm in den Prozessor laden. Es sollte die LED blinken lassen.

cd ~/program_328
sudo python src/program.py -p 328/steckbrett_328_blink.hex

Jetzt sollte die LED langsam blinken.

Fuses für Oszillator programmieren

Der Microcontroller läuft 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äuft dann mit 8MHz, was bei 3.3V Betriebsspannung das Maximum ist für diesen Controller.

Die Fuses nur programmieren, wenn es bei den vorherigen Schritten keine Fehler gab und die LED auch blinkt.

cd ~/program_328
sudo python src/program.py -wf

Das Blinken hört kurz auf, und sollte dann deutlich schneller wieder anfangen, 5 mal die Sekunde.
Jetzt der Oszillator konfiguriert  und der Controller läuft mit 8MHz.

Anwendungsprogramm in den Controller laden

Jetzt kann das eigentliche Anwendungsprogramm geladen werden. Es sorgt für regelmässiges Auslesen der AD-Werte ADC0, ADC1.
cd ~/program_328
sudo python src/program.py -p 328/steckbrett_328.hex

Nach dem Programmieren oder Einschalten des RPI mit dem Steckbrett sollte die LED 5 mal leuchten.

Anwendungsprogramm – Testprogramme

Die LED blinken lassen, lange hell und kurz dunkel.
cd ~/program_328
sudo python src/test_blink.py

Auslesen der Version des 328-Programms
cd ~/program_328
sudo python src/test_get_version.py

Die Anzeige sollte ’93 09′ sein; die zweite Zahl kann höher sein.

Auslesen der adc_0-Werte
cd ~/program_328
sudo python src/test_adc_0.py

Scratch-Verbindung

Wenn die Tests für die Anwendungssoftware funktionieren, kann die Verbindung mit Scratch in Betrieb genommen werden.

cd ~/scratchClient
sudo python src/scratchClient.py -config config/config_adc_atmel328.xml

Die Konfiguration kann über Parameter angepasst werden und erlaubt das An-Abschalten der AD-Kanäle. Die Referenzspannung kann 3.3-V sein oder die interne 1.1V-Referenz.
Die 1.1V-Referenz kann z.B. mit einem Temperatursensor TMP036 benutzt werden.

Die 3.3V-Referenz ist ideal, wenn Potentiometer ausgelesen werden.

Die Werte der AD-Wandler werden als ‘adc_0’ und ‘adc_1’ an Scratch geschickt, Wertebereich 0..1023.
Befehle von Scratch an den Controller sind ‘led_off’, ‘led_on’.

SPI-Kommunikation zwischen RPi und Controller

Der Controller muss alle Befehle, die vom RPi gesendet werden überprüfen und die entsprechende Aktion ausführen. Der Controller muss das so schnell erledigen, dass die nächste Anfrage des RPi schon die korrekten Daten erhalten kann.

Die Übertragungsrate kann deshalb nur relativ langsam sein mit 240kHz. Das ist aber bei der Kommunikation mit Scratch kein Problem.

Trotz dieser Beschränkungen wurde SPI gewählt, da diese Verbindungen bereits zum Programmieren des Controllers vorhanden sind.

Anhang: GPIO#4 des RPi als Taktgenerator für den 328

Der GPIO#4-Pin kann als Taktausgang konfiguriert werden. Das dafür notwendige Programm ist im bin/-Verzeichnis enthalten, Es basiert auf Code von guzunty.org.

GPIO#4 mit den XCLK-Eingang des Controllers verbinden.  Dann das Programm bin/gz_clock_1.92MHz starten.

cd bin
chmod +x gz_clock_1.92MHz 
sudo ./gz_clock_1.92MHz

Die Ausgabefrequenz ist ca 2MHz.

Während das Programm läuft, das Auslesen und Schreiben der Fuses ausführen.
Dann diese Verbindung wieder trennen.

Update history:
2014-04-01 Fixed connections of LED