Archiv für die Kategorie Assembler

Elektrisch Programmieren 3: Der Pi Zero als ISP

IMAG1049_1

Im letzten Teil der Serie ging es darum, wie der Programm-Code für den ATtiny aussieht. Da Assembler-Code am besten geeignet ist, um möglichst viel über die Abläufe des Mikrocontrollers zu erfahren, gab es auch eine kleine Einführung in Assembler für den ATtiny. In diesem Teil soll es darum gehen, wie man den Programm-Code in den Flash-Speicher des ATtiny lädt. Normalerweise programmiere ich im Amtel Studio. Damit ist die Verwaltung eines Projekts und die Einstellungen der Chip-spezifischen Konfiguration sehr einfach. Mit einem 886MB großen Installer wird damit allerdings mit Kanonen auf Spatzen geschossen. Ein guter Editor ist völlig ausreichend. Ich habe mir vor einiger Zeit eine Lizenz für Sublime Text zugelegt, da der sich super konfigurieren lässt, es geht natürlich auch mit vim oder irgendein anderer Editor der idealerweise gleich das kompilieren und debuggen unterstützt.

Ist der Code erstellt, braucht es eine Build-Umgebung. Da ich im Folgenden auf dem RasPi entwickele, nutze ich dafür die gcc Werkzeuge und den avra Assembler. Also werden sie und mein auf dem Pi bevorzugter Editor vim auf dem RasPi installiert:

sudo apt-get install gcc-avr binutils-avr avr-libc avra vim

Der avra Assembler bringt die Include-Files mit, die am Anfang des Quell-Codes des Beispielprogramms geladen werden. Dabei stellt sich heraus, dass es einen Unterschied zum avra aus dem AVR Studio gibt: Es gibt nur eine Include-Datei zum ATtiny45 tn45def.inc die vom Inhalt her zwar identisch sein mit der tn85def.inc sollte, jedoch fehlt die Datei tn85def.inc im include-Verzeichnis. Und dann enthält diese Datei ausgerechnet einen Bug beim Bezeichner des OCIE1A-Bits. Also habe ich die Datei /usr/share/avra/tn45def.inc einfach in eine neue Datei /usr/share/avra/tn85def.inc kopiert und in der Zeile 451 die Bezeichnung OCE1A zu OCIE1A korrigiert. Hier die Datei tn85def.inc auf gitHub.com.

Ist der Quell-Code des Timer-gesteuerten Blink-Programms erstellt, kann er kompiliert werden:

 avra -fI -I /usr/share/avra -o TimerBlink.hex TimerBlink.asm

Nun haben wir die hex-Datei, die in den ATtiny geladen werden kann. Eigentlich braucht es dafür einen ISP, einen In-System Programmer für Mikrocontroller. Ich nutze bisher dafür den USBasp, den es ab ca. 5€ im Internet zu kaufen gibt:

Bildschirmfoto 2017-04-24 um 21.16.29

Allerdings geht es mit dem RasPi viel einfacher, da der ja eine SPI-Schnittstelle mitbringt.  Die muss nur mit Hilfe des Konfigurationsprogramms raspi-config unter Interfacing Options aktiviert werden. Und das Tool avrdude braucht nicht mehr, um den Code in den ATtiny zu laden. Die Verdrahtung ist sehr einfach. Dazu werden nur die Pins für den SPI-Port des Pi mit dem SPI-Port des ATtiny verbunden:

  • SCLK: Pi GPIO11  -> ATtiny Pin 7
  • MISO: Pi GPIO9  -> ATtiny Pin 6
  • MOSI: Pi GPIO10  -> ATtiny Pin 5
  • RESET: Pi GPIO25 -> ATtiny Pin 1
  • VCC: Pi 3V3 -> ATtiny Pin 8
  • GND: Pi GND -> ATtiny Pin 4

Durch die Nutzung des SPI-Ports braucht die Programmer-Software nur noch zu wissen, welches System genutzt wird, um dem GPIO-Port für RESET richtig anzusprechen. In der Konfiguration ist bereits das Gerät linuxspi hinterlegt, das über das Device /der/spidev0.0 angesprochen wird. Damit könnte es nach der Installation von avrdude schon losgehen:

sudo apt-get install avrdude

Doch die Baudrate 400000 in der Standard-Konfiguration ist für den Pi viel zu hoch. Daher habe ich mir die Datei ~/.avrduderc im Home-Verzeichnis mit folgendem Inhalt erstellt:

programmer
  id    = "pizero";
  desc  = "Use a Raspberry Pi Zero as ISP via /dev/spidev0.0";
  type  = "linuxspi";
  reset = 25;
  baudrate = 100000;
;

Noch schnell den Benutzer pi in die richtigen Gruppen hinzugefügt:

sudo usermod pi -a -G spi,gpio

Nun kann ich die Programmer-Konfiguration direkt mit avrdude nutzen und die hex-Datei in den ATtiny laden:

pi@zero:~/TimerBlink $ avrdude -c pizero -p t85 -P /dev/spidev0.0 -U flash:w:TimerBlink.hex
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e930B
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "TimerBlink.hex"
avrdude: input file TimerBlink.hex auto detected as Intel Hex
avrdude: writing flash (108 bytes):

Writing | ################################################## | 100% 0.09s

avrdude: 108 bytes of flash written
avrdude: verifying flash memory against TimerBlink.hex:
avrdude: load data flash data from input file TimerBlink.hex:
avrdude: input file TimerBlink.hex auto detected as Intel Hex
avrdude: input file TimerBlink.hex contains 108 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.07s

avrdude: verifying ...
avrdude: 108 bytes of flash verified

avrdude: safemode: Fuses OK (E:FF, H:DF, L:62)

avrdude done.  Thank you.

pi@zero:~/TimerBlink $

Und nun blinkt es Timer-gesteuert und stromsparend Interrupt-geweckt:

IMAG1051-01

, , , , ,

Ein Kommentar

Elektrisch Programmieren 2: ATtiny unter totaler Kontrolle

PIN Layout

Im ersten Teil dieser Einführung in den ATtiny ging es um einen ersten Überblick über den Aufbau eines Mikrocontrollers. Das kleine Kerlchen für gerade einmal 1€ enthält ja ein komplettes System mit CPU, RAM und Flash auf einem winzigen Chip. In der Abbildung oben ist die Belegung der Pins des ATtiny abhängig von der jeweiligen Konfiguration dargestellt. Ein Beinchen kann also einmal mit einem I/O-Port verbunden sein, mal mit dem SPI Modul, mal mit dem Analog-Digital-Coverter. Welche Funktion das ist, hängt von der Konfiguration der jeweiligen Register ab. In diesem Beitrag soll gezeigt werden, wie ein Programm für den ATtiny mit Hilfe von Assembler erstellt wird und wie eine dieser Funktionen – der I/O-Port PB3 (hellgrau) – für einen Timer-gesteuerten Blinker  genutzt wird.

Den Rest des Beitrags lesen »

, , ,

3 Kommentare

Elektrisch Programmieren: Der ATtiny

IMAG0211Es ist fast ein ganzes Jahr her, seit meinem letzen RasPi-Projekt. In dieser Zeit habe ich mich intensiver mit Mikrocontrollern beschäftigt. Der einfache ARM-Prozessor des RasPi war ein guter Einstieg in die Protokolle mit anderen Bauelementen, wie i2c-Sensoren oder EEPROM-Speicherbausteinen. Ich wollte noch kleinere Hardware, noch effizienter im Stromverbrauch, noch näher an der Hardware programmieren. Über den Umweg Arduino habe ich mir die Atmel ATMega Mikrocontroller näher angesehen. Der kompakteste 8bit Atmel Mikrocontroller ist der ATtiny. Den ATtiny85 bekommt man etwa für 1 € und man erhält ein System mit einer 20 MHz CPU, 512 Byte RAM, 8 KB Flash und 512 Byte EEPROM auf gerade einmal 0.73 cm². Programmiert wird er in C oder Assembler. Er versteht 120 (Maschinen-Code) Befehle und unterstützt mit i2c und SPI die wichtigen Industrieprotokolle für Sensoren und andere Mikrocontroller.

Den Rest des Beitrags lesen »

, ,

Ein Kommentar