Heute 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:
- ATTiny Core von GoogleCode herunterladen (Download the latest version …)
- 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.
- Ö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:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960attiny84at8.name=ATtiny84 @ 8 MHz (internal oscillator; BOD disabled)# The following do NOT work...# attiny84at8.upload.using=avrispv2# attiny84at8.upload.using=Pololu USB AVR Programmer# The following DO work (pick one)...attiny84at8.upload.using=arduino:arduinoisp# attiny84at8.upload.protocol=avrispv2# attiny84at8.upload.using=pololuattiny84at8.upload.maximum_size=8192# Default clock (slowly rising power; long delay to clock; 8 MHz internal)# Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 64 ms; [CKSEL=0010 SUT=10]; default value# Brown-out detection disabled; [BODLEVEL=111]# Preserve EEPROM memory through the Chip Erase cycle; [EESAVE=0]attiny84at8.bootloader.low_fuses=0xE2attiny84at8.bootloader.high_fuses=0xD7attiny84at8.bootloader.extended_fuses=0xFFattiny84at8.bootloader.path=emptyattiny84at8.bootloader.file=empty84at8.hexattiny84at8.build.mcu=attiny84attiny84at8.build.f_cpu=8000000Lattiny84at8.build.core=tiny###########################################################################attiny84at1.name=ATtiny84 @ 1 MHz (internal oscillator; BOD disabled)# The following do NOT work...# attiny84at1.upload.using=avrispv2# attiny84at1.upload.using=Pololu USB AVR Programmer# The following DO work (pick one)...attiny84at1.upload.using=arduino:arduinoisp# attiny84at1.upload.protocol=avrispv2# attiny84at1.upload.using=pololuattiny84at1.upload.maximum_size=8192# Default clock (slowly rising power; long delay to clock; 8 MHz internal; divide clock by 8)# Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 64 ms; [CKSEL=0010 SUT=10]; default value# Divide clock by 8 internally; [CKDIV8=0]# Brown-out detection disabled; [BODLEVEL=111]# Preserve EEPROM memory through the Chip Erase cycle; [EESAVE=0]attiny84at1.bootloader.low_fuses=0x62attiny84at1.bootloader.high_fuses=0xD7attiny84at1.bootloader.extended_fuses=0xFFattiny84at1.bootloader.path=emptyattiny84at1.bootloader.file=empty84at1.hexattiny84at1.build.mcu=attiny84attiny84at1.build.f_cpu=1000000Lattiny84at1.build.core=tiny###########################################################################
Tipp: Faule Kollegen benennen einfach die „Prospective Boards.txt“ in boards.txt um […] - Nun sollte in der Arduino IDE unter Tools –> Board eine Liste von ATTinys hinzugekommen sein:
ATTiny84 mit Arduino verdrahten
Nun 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:
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.
Arduino als ISP programmieren
Nun verbindet den Arduino über ein USB-Kabel mit dem PC und startet die Arduino IDE.
- Unter Datei –> Beispiele den Eintrag ArduinoISP auswählen
- Unter Tools –> Board den Arduino UNO auswählen
- Unter Programer den Eintrag AVR ISP auswählen
- 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/* Blink Turns on an LED on for one second, then off for one second, repeatedly. This example code is in the public domain. */ // Pin 13 has an LED connected on most Arduino boards. // give it a name: int led = 2; // the setup routine runs once when you press reset: void setup() { // initialize the digital pin as an output. pinMode(led, OUTPUT); } // the loop routine runs over and over again forever: void loop() { digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second } |
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:
1 2 3 |
Binäre Sketchgröße: 888 Bytes (von einem Maximum von 8.192 Bytes) avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny84 avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny84 |
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:
1 |
avrdude: stk500_getsync(): not in sync: resp=0x00 |
LED anschließen und Upload testen
Trennt 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:
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:
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.
- Wählt in der Arduino IDE unter Tools –> Board den Eintrag „ATtiny84 @ 8 MHz (internal oscillator; BOD disabled)„
- Unter Tools wählt ihr „Bootloader installieren„
- 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:
1 2 3 4 |
In file included from /home/dz/sketchbook/libraries/JeeLib/JeeLib.h:7, from gas_meter_tiny84_test.ino:8: /home/dz/sketchbook/libraries/JeeLib/Ports.h:682: error: ‘Serial’ was not declared in this scope /home/dz/sketchbook/libraries/JeeLib/Ports.h:683: error: ‘Serial’ was not declared in this scope |
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:
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…):
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! 🙂
[…] und den Bootloader (8 Mhz Clock! Mit 1 Mhz passiert zumindest bei mir nichts…) flashen. In diesem Artikel habe ich das bereits […]
Super Anleitung! Vielen Dank. Hat perfekt geklappt.
Liebe Grüße
Stefan“
Oh, hoher Besuch! Vielen Dank! 🙂
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 😉
bekomme den attiny core nicht installiert habe deine anleitung genau befolgt kannst du mir helfen
habs doch noch hinbekommen der vorordner avr störte kleiner fehler große wirkung
@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.
@Reinhard. welche Meldungen bekommst du ? ich habe auch 3 Tagen lang an den Tiny85 rumgemacht.
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 …
Was muss ich zusätzlich beachten, wenn ich den Attiny84V-10PU mit einem Arduino Micro programmieren will.
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%
Alles klar.
Habe die Erklärung von Boxtec genommen, damit hat es sofort funktioniert.
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