ATTiny84 mit Arduino Uno programmieren

Arduino LogoHeute kam meine ersehnte Reichelt-Bestellung an, die ich bereits in einem der letzten Beiträge angekündigt hatte.

Mit im Gepäck waren drei ATTiny84V-10PU, die ich über meinen Arduino UNO als batteriebetriebene, kabellose Funk-Sensoren für Temperatur, Luftdruck, Helligkeit, etc. programmieren wollte.

Zum Beginn müssen diese kleinen ATTinys jedoch mit einem Bootloader und einem jeweiligen Sketch geflasht werden. Da ich dabei ein paar kleinere Probleme hatte, möchte ich euch an meiner Lösung teilhaben lassen.Zum Flashen des ATTiny84 mit einem Arduino UNO benötigt ihr außer ein paar JumperWires und einem Breadboard erstmal nichts. Später zum Test mit dem Blink-Sketch wird noch eine LED mit einem 220 Ohm Vorwiderstand und im Idealfall ein kleines Batteriepack benötigt.

ATTiny Core in der Arduino IDE installieren

Ich habe folgendes HowTo mit der aktuellen Arduino IDE 1.0.5 getestet. Von Haus aus kann man mit dieser IDE die ATTinys nicht als Board auswählen; dafür muss zuerst der ATTiny Core heruntergeladen werden:

  1. ATTiny Core von GoogleCode herunterladen (Download the latest version …)
  2. Die ZIP öffnen (arduino-tiny-0100-0017.zip) und die Ordner bootloaders und cores, sowie die Datei „Prospective Boards.txt“ nach „C:\Program Files (x86)\Arduino\hardware\tiny“ kopieren – je nach Installationspfad der Arduino IDE. Existiert der Ordner hardware oder tiny noch nicht, erstellt sie einfach.
  3. Öffnet die Datei „Prospective Boards.txt“ und kopiert euch die Abschnitte eures ATTiny-Models entsprechend heraus, fügt sie auf gleicher Ebene in eine neue Datei boards.txt ein und speichert sie ab. Bei mir sieht die Datei wie folgt aus:

    Tipp: Faule Kollegen benennen einfach die „Prospective Boards.txt“ in boards.txt um […]
  4. Nun sollte in der Arduino IDE unter Tools –> Board eine Liste von ATTinys hinzugekommen sein:
    ATTiny Boards in der IDE

ATTiny84 mit Arduino verdrahten

ATtiny44-84Nun muss der ATTiny84 mit dem Arduino Uno über das Breadboard verkabelt werden. Dabei gebe ich auf Seiten des Arduino die Pin-Beschriftung an, wie sie auf dem Board aufgedruckt ist. Am ATTiny84 wird zuerst der Hardware-PIN (also, das physische Füßchen) nach dem Diagramm rechts genannt, und in Klammern der „logische“ Pin, wie er später in den Sketchen angegeben wird.

  • Arduino 5V an ATtiny84 Pin 1 (VCC +)
  • Arduino GND an ATTiny84 Pin 14 (GND -)
  • Arduino Pin 10 an ATtiny84 Pin 4 (Reset)
  • Arduino Pin 11 an ATTiny84 Pin 7 (Pin 6, PWM, Analog Input 7)
  • Arduino Pin 12 an ATTiny84 Pin 8 (Pin 5, Analog Input 5, PWM, MISO)
  • Arduino Pin 13 an ATTiny84 Pin 9 (Pin 4, Analog Input 4, SCK)

Ich habe eine kurze Grafik in Fritzing erstellt (130917_ATTiny-mit-Arduino-Uno-Programmieren-Fritzing).

Wichtig: Obige Pin-Map ist NUR für die Verdrahtung; die Angabe der Arduino-Pin-Nummern stimmt NICHT für den Arduino-Core von Goolge Code. Die richtigen Arduino-Pins für diesen Core sind folgende:

ATtiny84 Pins mit Arduino Core

Bitte ignoriert die Aufschrift des 14-Pin-Chips – es gab keine Vorlage für den ATTiny84, sodass ich einen anderen 14-Pin-Chip genommen habe. Oben/Unten erkennt man an der halbkreisförmigen Aussparung am Chip, die sowohl in der Belegung als auch in unterer Grafik erkennbar ist.

ATTiny mit Arduino verbinden

Arduino als ISP programmieren

Nun verbindet den Arduino über ein USB-Kabel mit dem PC und startet die Arduino IDE.

  1. Unter Datei –> Beispiele den Eintrag ArduinoISP auswählen
  2. Unter Tools –> Board den Arduino UNO auswählen
  3. Unter Programer den Eintrag AVR ISP auswählen
  4. Den Sketch hochladen

Diesen Vorgang muss man immer dann wiederholen, wenn man einen ATTiny mittels des Arduinos programmieren möchte, und zwischenzeitlich einen anderen Sketch auf den UNO eingespielt hat.

Blink-Sketch auf ATTiny84 flashen

Unter Datei öffnen wir Beispiele –> 01.Basics –> Blink und ändern den Wert der Variable „led“ wie folgt ab:

  • int led = 13;“ –> „int led = 2;

An Pin 8 (D2) schließen wir später zum Test eine kleine LED an um zu prüfen ob unser ATTiny84 richtig geflasht wurde.

Der komplette Sketch sieht so aus:

Nun wählen wir unter Tools –> Board –> ATTiny84 (internal 1MHz clock) aus, und unter Tools -> Programer den Eintrag Arduino as ISP.

Den geöffneten Blink-Sketch laden wir mit einem klick auf den Upload-Button hoch.

Hat alles geklappt erscheint folgendem Meldung im Log. Die beiden „avrdude„-Zeilen können dabei ignoriert werden:

Erscheint folgende Fehlermeldung nach dem erfolgten Upload, habt ihr u.U. eine falsche/alte Version des ATTiny Core heruntergeladen oder das falsche ATTiny-Board ausgewählt. Auch ein Ab- und wieder Anstecken des USB-Kabels an den Arduino hat bei mir geholfen:

LED anschließen und Upload testen

Plus/Minus einer einfachen LEDTrennt zuerst die USB-Verbindung zum Arduino UNO, damit ihr nicht versehentlich Kontakte beim Stecken brückt, die etwas beschädigen könnten.

Nun steckt eine kleine LED auf das Breadboard.

An die Anode (+, langes Bein) kommt ein 220 Ohm-Widerstand (Rot-Rot-Braun-Gold) der an Pin 5 (Pin 8 logisch, PWM) des ATTiny84 kommt, die Kathode (, kurzes Bein) verbindet ihr mit dem GND des ATTiny/Arduino.

Hier ein Fritzing-Schaltbild:

ATTiny84 an Arduino mit LED zum Test

Verbindet den Arduino Uno wieder mit dem USB-Stecker, über den er mit Strom versorgt wird. Die LED am ATTiny84 sollte nun zu blinken anfangen.

Ich habe zusätzlich, weil ich plane den ATTiny84 über 3 AAA-Batterien zu betreiben, VCC+ und GND welche vom Arduino UNO zum ATTiny84 gehen entfernt, und stattdessen +/- des Batteriehalters an den ATTiny84 angeschlossen – hat mit 4,6V prima funktioniert.

Die fertige Schaltung sind in Real dann so aus:

Die fertige Verkabelung mit leuchtender LED
Die fertige Verkabelung mit leuchtender LED

ATTiny84 von 1MHz auf 8MHz umstellen

Für manche Libraries oder Anwendungsfälle reicht die Taktrate von 1MHz, die standardmäßig bei neuen ATTiny’s gesetzt ist, nicht aus.

Der ATTiny84V-10PU kann max. mit 8MHz getaktet werden, die 20PU-Variante mit 20MHz.

Um von 1 auf 8 MHz umzustellen muss der Bootloader auf dem ATTiny neu installiert werden. Dieser setzt FUSE-Bits anhand derer die Taktfrequenz eingestellt werden kann.

  1. Wählt in der Arduino IDE unter Tools –> Board den Eintrag „ATtiny84 @ 8 MHz (internal oscillator; BOD disabled)
  2. Unter Tools wählt ihr „Bootloader installieren
  3. Erscheint im Log-Fenster die üblichen Wartungen (s.o.) ohne Fehler, hat alles geklappt

Vorsicht ist geboten bei der Auswahl des Boards mit „external clock“ – der ATTiny wird dann nicht funktionieren/reagieren, bis tatsächlich ein externer Taktgeber angeschlossen wird!

Auf umgedrehten Weg könnt ihr den ATTiny wieder auf 1MHz zurücktakten.

Wichtige Info zu den PIN-Belegungen

Ich habe mir heute den Nachmittag um die Ohren geschlagen und einige wertvolle Erfahrungen gesammelt, die nur spärlich bei Google zu finden sind.

Ich nutzte ursprünglich den ATtiny Core von GitHub und musste beim Versuch, die JeeLib für tiefe Schlafzustände (Sleepy::loseSomeTime()) des ATTiny’s zu nutzen feststellen, dass mir das Ganze immer mit folgendem Fehler abbrach:

Nach langer Suche bin ich auf diesem Post gestoßen, in dem dazu geraten wurde, den ATtiny-Core von Google Code zu verwenden – damit seien die Probleme behoben.

Und tatsächlich lässt sich damit die JeeLib kompilieren – dafür hatte ich ein anderes, sehr ärgerliches und dummes Problem: Ich habe mich an die falsche PIN-Map gehalten!

D.h. ich verwendete diese hier, und habe mich stundenlang gewundert, weshalb die LED nicht blinken will, obwohl ich als Pin die Nr. 8 angegeben habe:

ATtiny44-84

Im Arduino-Forum konnte man mir nicht helfen. Ich habe daraufhin Nathan von chantrell.net kontaktiert, der die TinyTX-Platinen zur Verfügung stellt. In seiner ersten Antwort hat er mir bereits die Lösung genannt: Folgendes ist die RICHTIGE Pin-Belegung für den Arduino Core (umso peinlicher, dass es sogar im Titel steht…):

ATtiny84 Pins mit Arduino Core

Also, Breadboard raus, Tiny84 drauf und neu verkabelt – und als Pin im Blink-Sketch die Nr. 2 statt 8 angegeben – und siehe da, es blinkt! 🙂

Bastian
Bastian

Seit 2006 bin ich täglich im IT-Umfeld unterwegs und interessiere mich für technische Lösungen im Hard- und Softwarebereich, die einem den Alltag erleichtern. Zu meinen Hobbies zählt der 3D-Druck, das Tüfteln, Scripten, eine eigene Holzwerkstatt, sowie der unqualifizierte Umgang mit dem Lötkolben.

Artikel: 126

14 Kommentare

  1. Vielen Dank für die ausführliche Anleitung! Noch ein Kommentar zur Fehlermeldung:
    „avrdude: stk500_getsync(): not in sync: resp=0x00“

    Ich nutze Ubuntu und hatte Arduino über die Paketquellen (also apt-get install arduino) installiert. Ich habe Stunden lang im Internet nach Lösungen für die oben genannte Fehlermeldung gesucht und Google bestätigt mir, dass ich damit nicht alleine bin. Letztlich bestand die Lösung bei darin, Arduino Version 1.05 direkt von der Arduino-Website runterzuladen anstatt die Version aus den Paketquellen zu verwenden. Mit der Binary direkt von Arduino hat alles direkt geklappt. Kein Anpassen der Baudrate, kein extra Kondensator, kein manuelles Ausschalten eines Auto-Resets – es läuft einfach 🙂

    Wollte das hier nur erwähnen, um anderen die Mühe zu ersparen 😉

  2. @Jörg. Du glücklicher! Ich probiere jetzt eine Woche daran herum einen ATtiny84 zu programmieren. Ich schaffe es nicht. Probiere ich den BOOloader zu installieren bekomme ich eine ganze Ladung Java-Fehlermeldungen. Probiere ich des Programm direkt hineinzuschieben bekomme ich die Fehlermeldung: Arduino: 1.6.2 (Windows 8.1), Platine: „ATtiny84 (internal 1 MHz clock)“

    Die ausgewählte Platine benötigt den ‚arduino‘-Kern (nicht installiert).

    Ich habe das Arduino IDE wohl schon fünfmal installiert. Auch auf einem anderen Rechner – dieselben Fehlermeldungen. Ich habe schon langsam keine Lust mehr. Ist da irgendjemand, der mir helfen kann?

    • Ich hatte das selbe Problem wie du.

      ie ganzen Beschreibungen im Internet funktionieren nur bei älteren Versionen der arduino Software.

      Ich bin nach folgender Seite
      http://highlowtech.org/?p=1695
      vorgegeangen und es hat dann Funktioniert, kein Fehler mehr von wegen „Kern nicht installiert“ oder so.

  3. hallo
    VIELEN Dank für die umfassende Anleitung.
    Endlich mal einer (von zweien), der auch beschreibt, dass im UNO das ISP.ino geladen werden muss. Alle andern scheinen das als „gegeben“ vorauszusetzen.
    Ich warte zwar noch auf einen Programming shield, aber zumindest hat’s mit einem Tiny-ISP und ein paar jumperkabeln für einen tiny84 auf einem breadboard geklappt.
    Auch das !!nachträgliche!! Umstellen auf 8MHz clock ist toll beschrieben. er blinkt nun in der erwarteten Frequenz.
    Nun geht’s an die richtigen Programme …

  4. Hallo,
    bekomme Fehlermeldungen.
    Hat das was mit der aktuellen IDE 1.6.6 zu tun?
    Den Arduino als ISP programmieren hat scheinbar geklappt.
    Nur beim flashen des Blink-Programms kam die Fehlermeldung(letzte Zeile).

    Arduino: 1.6.6 (Windows 7), Board: „ATtiny44 @ 1 MHz (internal oscillator; BOD disabled)“

    Warnung: platform.txt aus dem Kern ‚Arduino Tiny‘ enthält veraltete tools.avrdude.cmd.path={runtime.ide.path}/hardware/tools/avr/bin/avrdude und wurde automatisch zu tools.avrdude.cmd.path={path}/bin/avrdude konvertiert. Erwägen Sie eine Aktualisierung dieses Kerns.
    Warnung: platform.txt aus dem Kern ‚Arduino Tiny‘ enthält veraltete tools.avrdude.config.path={runtime.ide.path}/hardware/tools/avr/etc/avrdude.conf und wurde automatisch zu tools.avrdude.config.path={path}/etc/avrdude.conf konvertiert. Erwägen Sie eine Aktualisierung dieses Kerns.
    Warnung: platform.txt aus dem Kern ‚Arduino Tiny‘ enthält veraltete recipe.ar.pattern=“{compiler.path}{compiler.ar.cmd}“ {compiler.ar.flags} „{build.path}/{archive_file}“ „{object_file}“ und wurde automatisch zu recipe.ar.pattern=“{compiler.path}{compiler.ar.cmd}“ {compiler.ar.flags} „{archive_file_path}“ „{object_file}“ konvertiert. Erwägen Sie eine Aktualisierung dieses Kerns.
    Warnung: platform.txt aus dem Kern ‚Arduino Tiny‘ enthält veraltete recipe.c.combine.pattern=“{compiler.path}{compiler.c.elf.cmd}“ {compiler.c.elf.flags} -mmcu={build.mcu} -o „{build.path}/{build.project_name}.elf“ {object_files} „{build.path}/{archive_file}“ „-L{build.path}“ -lm und wurde automatisch zu recipe.c.combine.pattern=“{compiler.path}{compiler.c.elf.cmd}“ {compiler.c.elf.flags} -mmcu={build.mcu} -o „{build.path}/{build.project_name}.elf“ {object_files} „{archive_file_path}“ „-L{build.path}“ -lm konvertiert. Erwägen Sie eine Aktualisierung dieses Kerns.
    Das Board Tiny:bootloaders:attiny84at1 definiert keine „build.board“-Einstellung. Sie wurde automatisch auf BOOTLOADERS_ATTINY84AT1 festgelegt.
    Das Board Tiny:bootloaders:attiny44at1 definiert keine „build.board“-Einstellung. Sie wurde automatisch auf BOOTLOADERS_ATTINY44AT1 festgelegt.
    Das Board Tiny:bootloaders:attiny84at16 definiert keine „build.board“-Einstellung. Sie wurde automatisch auf BOOTLOADERS_ATTINY84AT16 festgelegt.
    Das Board Tiny:bootloaders:attiny84at8 definiert keine „build.board“-Einstellung. Sie wurde automatisch auf BOOTLOADERS_ATTINY84AT8 festgelegt.
    Das Board Tiny:bootloaders:attiny44at8 definiert keine „build.board“-Einstellung. Sie wurde automatisch auf BOOTLOADERS_ATTINY44AT8 festgelegt.
    exec: „avr-g++“: executable file not found in %PATH%

  5. Hi Bastian,
    klasse Anleitung.
    Wenn ich nun den ‘Google’ arduino-tiny-core installiert habe, kann ich dann noch Libraries nutzen?
    Ich benötige die ‘Manchester’ oder ‘VirtualWire’ Lib zum EMPFANGEN von Daten.
    Die verwenden einen Timer. Weißt du wie/welchen Timer ich noch mit dem Tiny-Core nutzen kann?
    Ich bekomme keine mit dem Bootloader zum laufen 🙁 – benötige aber den Serial.println() vom Core.
    ralphi

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert