home
erste Version am 23.01.2018
letzte Änderung am 23.01.2018

ATtiny85 über die Arduino IDE programmieren


Neulich bin ich beim rumsurfen auf den kleinen, acht-poligen Bruder des ATmega328 gestoßen - den ATtiny.
Was mich neben den geringeren Abmessungen besonders interessierte, war der Betrieb ohne externen Takt bzw. Quarz.
Als ich dann noch realisiert hatte, dass Reichelt mittlerweile diverse Atmel-Prozessoren im Sortiment hat, habe ich mir gleich zehn Exemplare vom ATtiny85 bestellt.
Zum Beispiel bei meinem Kühlschrank-Alarm war der ATmega328 samt Quarz einfach nur Overkill. Der ATtiny wäre dafür sehr viel passender gewesen.

Es gibt hunderte Webseiten, auf denen beschrieben wird, wie man einen ATtiny über einen ArduinoUNO programmieren kann. Diesen Weg hatte ich vor einigen Jahren (in abgewandelter Form) auch genutzt, als ich mir 25 ATmega328-Chips bestellt hatte und da erstmal den Optiboot-Bootloader draufbringen musste, um die Dinger in einem ArduinoUNO nutzen zu können.

Weil ich dieses Breadboard-Heckmeck nicht wieder haben wollte, sollte das diesmal über ein Programmiergerät passieren.
Nach ein paar Recherchen landete dann ein USB ISP-Programmer + Adapter von der Firma Diamex in meinem virtuellen Einkaufskorb.

Und heute kamen zwei Päckchen an: einmal von Reichelt und einmal von Amazon.



Die Doku zum Diamex-Programmer gibts nur online unter diamex.de bzw. konkret hier. Echt spärlich. Aber immerhin ist in der Bedienungsanleitung die Funktion der zwei DIP-Schalter erklärt. Dementsprechend sind die erstmal beide auf ON zu stellen, damit die Versorgungs-Spannung für den ATtiny85 über den USB-Port kommt.

Das Board mit dem Nullkraft-Sockel besitzt fünf zehn-polige Anschlüsse. Die Anschlüsse sind auf der Leiterplatten-Oberseite beschriftet. Demnach ist für den ATtiny85 der oberste Anschluss zu nutzen. Folgt man nun den Leiterbahnen und mappt das auf die Pinbelegung gemäß Bedienungsanleitung zum Programmer, ergibt sich, dass der ATtiny85 ganz unten in den Sockel gesteckt werden muss (Pin-1 in Richtung Verriegelungshebel).

Einen Treiber braucht es unter Linux nicht. Das Ding meldet sich direkt als:
[ 3592.002956] usb 1-1.4: new full-speed USB device number 3 using ehci-pci
[ 3592.090536] usb 1-1.4: New USB device found, idVendor=16c0, idProduct=2a9b
[ 3592.090540] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 3592.090543] usb 1-1.4: Product: AVR-ISP2
[ 3592.090545] usb 1-1.4: Manufacturer: ERFOS
[ 3592.090547] usb 1-1.4: SerialNumber: 19285-66810-590
[ 3592.098837] cdc_acm 1-1.4:1.0: This device cannot do calls on its own. It is not a modem.
[ 3592.098871] cdc_acm 1-1.4:1.0: ttyACM0: USB ACM device
[ 3592.099323] usbcore: registered new interface driver cdc_acm
[ 3592.099326] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters

Aber in der Arduino-IDE ist was zu tun. Bei mir läuft die noch in Version 1.6.12.
Unter Datei / Voreinstellungen / Einstellungen / Zusätzliche Boardverwalter-URLs ist einzufügen:
http://drazzy.com/package_drazzy.com_index.json
Steht da schon was drin (wie z.B. das ESP8266-Package), dann ist die neue URL nach einem Komma anzuhängen.

Nun erscheint unter Werkzeuge / Board / Boardverwalter ein Eintrag für ATTinyCore samt Install-Button (derzeit Version 1.1.4).
Ist die Installation abgeschlossen, kann unter Werkzeuge / Board einer der neuen Einträge mit ATtiny-Modellen ausgewählt werden.
Hier wird nun ATtiny28/45/85 markiert. Danach unter Prozessor den ATtiny85 und unter Clock "1 MHz Internal" einstellen.
Die restlichen Attribute habe ich auf den Defaultwerten belassen. Also Timer1 Clock="CPU", B.O.D.="B.O.D. Disabled" und LTO (1.6.11+ only)="Disabled".

Jetzt fehlt nur noch der passende Eintrag unter Programmer.
Das ist etwas trickiger, weil Änderungen an ~/arduino-1.6.12/hardware/arduino/avr/programmers.txt keine Auswirkung haben.
Zumindest dann nicht, wenn im Home bereits ein Verzeichnis wie etwa ~/.arduino15 existiert.
In diesem Fall wird dann offenbar stattdessen die Datei ~/.arduino15/packages/arduino/hardware/avr/1.6.20/programmers.txt herangezogen.
Warum auch immer die Zahlen in den Verzeichnisnamen so lauten, wie sie lauten ...... Versionsnummernverwirrung .....

Jedenfalls sind in dieser Datei die folgenden Zeilen einzufügen:
diamexavr.name=DIAMEX-AVR
diamexavr.communication=usb
diamexavr.protocol=stk500v2
diamexavr.program.tool=avrdude
diamexavr.program.extra_params=-P{serial.port}
Und ja! Beim Attribut communication braucht es den Wert "usb" - auch wenn es überall anders heißt, dass da "serial" stehen müsse (wahrscheinlich gilt das nur bei diesem lustigen Betriebssystem für Maus-Schubser, bei dem man mit COM-Port-Nummern rumspielen darf).

Als das nun alles soweit vorbereitet war, habe ich mir ein leicht erweitertes Blink-Sketch gebaut:
#define PIN1 1
#define PIN2 2
#define PIN3 3

void setup() {
  pinMode(PIN1, OUTPUT);
  pinMode(PIN2, OUTPUT);
  pinMode(PIN3, OUTPUT);
  tone(PIN3, 1000);
}

void loop() {
  digitalWrite(PIN1, HIGH);
  digitalWrite(PIN2, HIGH);
  delay(500);
  digitalWrite(PIN2, LOW);
  delay(500);

  digitalWrite(PIN1, LOW);
  digitalWrite(PIN2, HIGH);
  delay(500);
  digitalWrite(PIN2, LOW);
  delay(500);
}

Erweitert deswegen, weil mir die Nummerierung der IO-Pins gemäß der zweiten Seite vom Datenblatt nicht ganz klar war.
Das Pinout ist folgendermaßen angegeben:
(PCINT5/RESET/ADC0/dW)
PB5
1

8

VCC
(PCINT3/XTAL1/CLKI/OC1B/ADC3)
PB3
2
          
7
PB2
(SCK/USCK/SCL/ADC1/T0/INT0/PCINT2)
(PCINT4/XTAL2/CLKO/OC1B/ADC2)
PB4
3

6
PB1
(MISO/DO/AIN1/OC0B/OC1A/PCINT1)
GND

4

5
PB0
(MOSI/DI/SDA/AIN0/OC0A/OC1A/AREF/PCINT0)

Durch das Sketch weiß ich nun (ohne erstmal zig Seiten lesen zu müssen), dass die Digitalpins mit PCINTn oder auch PBn benannt sind.
Nachdem ich das Sketch mit Shift+Uploadbutton (für "Hochladen mit Programmer") auf den Chip gebracht hatte, habe ich ihn auf ein Breadboard gesteckt, 5V angeklemmt und bin mit einer LED+220Ω Vorwiderstand die Pins durchgegangen.
Ergebnis: an Pin 6 blinkt es etwa im Sekunden-Takt, an Pin 7 deutlich schneller.
Danach habe ich mir das mal mit dem auf FREQ eingestellten Multimeter angesehen. Für Pin 2 zeigt es den Wert 1.0225 kHz an, für Pin 7 meldet es 01.021 Hz, für Pin 6 dagegen 00.510 Hz. Somit passt das alles zu den gemäß Sketch erwarteten Werten.

Damit kann ich die Teile jetzt prinzipiell programmieren.
Die möglichen Detail-Unterschiede zum ATmega328 sehe ich mir an, sobald ich einen konkreten Einsatzzweck für das erste Exemplar habe.

Spätestens übermorgen kommt dann hoffentlich der bestellte 3D-Drucker ... der wird mich voraussichtlich mehrere Tage voll in Anspruch nehmen. Und bis zur Lieferung gibt es noch reichlich zum Thema K8200 zu lesen - oder auf youtube anzuschauen.