Programmera ATtiny85 via en arduino

etta är en guide för att föra över kod till attiny från start till slut med tankar kring processen.

Vad du behöver är en arduino, en ATtiny, sladdar, fyra LED lampor i olika färger, resistorer som passar respektive LED och en Kondensator 10uF (eller 100uF och har du inte det så finns det andra mer komplexa lösningar att läsa om här).

Målet är att få igång ett vanligt blinkprogram på ATtiny85. Detta känns som absolut standard för alla arduino program och det är där man börjar innan man ger sig på mer avancerade projekt.

Det finns väldigt mycket om denna enhet och samtidigt väldigt lite. Anledingen till att det finns lite är för att det är upp till dig att inse att du kan ta de flesta projekt och sedan krympa ner det till ATtiny85:s formfaktor. Dessutom så är inte denna ATtiny ensam härre på teppan för mindre styr enheter utan ett av många olika val. I vårt fall så har vi valt dett chip för att det har ett gott ryckte och att den har en låg kostnad (<10kr per enhet). Länk till tillverkaren produktblad http://www.microchip.com/wwwproducts/en/ATtiny85. Produktbladet som hör till fån samma sida (pdf 3,7 MB).

Här finns det att läsa det mesta om enheten. https://github.com/SpenceKonde/ATTinyCore/blob/master/avr/extras/ATtiny_x5.md

x5 pin mapping

1 Förbereda arduinon

Eftersom att ATtinyn saknar de delar för att prata med datorn så är den vanligaste metoden att använda en arduino som programmerare. Alternativt en specifik enhet som man kan köpa som passar exakt det chip som man tänker programmera. Denna typ av enhet kallas för ISP vilket är kort för In-System Programming.

1.1 installera arduino som isp

Ladda upp exempelprogrammet till arduinon. I de flesta android IDEna finns ett antal exempel varav ett av dem heter Android as ISP.

I mitt fall är det en arduino uno som kommer att agera isp som jag för över detta programmet till.

Ställ in arduino/genuino uno
Porten exempelvis COM17 (brukar stå vilken som gäller)
Programemrare AVRISP mkII

1.2 Koppla in så att du ser hur ISPn arbetar

Följ exempelprogrammets instruktioner med att sätta in pins. Det är nämligen så att det finns tre stycken lampor som man kan koppla in för att se hur det går för programmeringen. Jag har citerat där det står nedan:

/ Put an LED (with resistor) on the following pins:
 / 9: Heartbeat - shows the programmer is running
 / 8: Error - Lights up if something goes wrong (use red if that makes sense)
 / 7: Programming - In communication with the slave

Förklaring för vad detta innebär. Heartbeat är för att visa att rätt program är igång och det ser man genom att lampan pulserar. En av lamporna visar om det går fel i processen. Den sista visar när kretsen programmeras och blinkar medan överföringen till ATtinyn via arduinon sker.

Ett tips när du kopplar in led lamporna är att använda jorden bredvid pinsen. Denna jord på arduino kortet är markerad med GND och är mellan pinhål 13 och pinhålet med texten AREF. Det finns tre sammanlagt stycken GND på kortet. Vilket kortar ner i alla fall en sladd.

1.3 koppla sladdarna mellan ATtinyn och arduinon

För att ATtinyn ska kunna få program från datorn behöver den kopplas in på ett speciellt sätt till arduinon. Följ dessa anvisningarna och titta på fotot samt illustrationerna som vägledning.

Sätt en 10 uF (eller 100 uF) mellan GND och RESET.

Koppla sedan upp attinyn med sladdar till de olika ingångarna så här. Där jag har illustrerat med pilar (->)  från attinyn vart respektive pin ska kopplas till för ingång på arduinon.

ATMEL ATTINY85 -> ARDUINO

                  +-\/-+
         D 10 <- 1|    |8  -> 5V
                 2|    |7  -> D 13
                 3|    |6  -> D 12
          GND <- 4|    |5  -> D 11
                  +----+

High low tech har gjort en fin illustration (om du är nyfiken har de även gjort en guide som går att läsa här på highlowtech. Tyvärr verkar deras verksamhet ha upphört).

Nu ska attinyn vara redo för att ta emot mjkvara via arduinon.

2.1 Ställ in arduinos IDE inställnigar

Öppna inställningsfönstret och fyll i följande

Kryssa i medelanden under uppladdnig.
Sätt varningar till standard.

Klistrar du in denna länken till ATtiny drazzy ATTinyCore: http://drazzy.com/package_drazzy.com_index.json

arduinoIdePreferences

2.2 installera attiny

Gå in i boarddsmanager.
Sök på attiny och klicka installera.

boardsManager

2.2.1 Tips på vart man hittar länkar om ovan inte fungerar

På arduinos hemsida länkar de till en lista med dessa jason filer för alla enheter som de känner till som det finns stöd för. Tänk på att ATtiny85 kallas även x5 och tillhör utbudet ATtinyCore. Går man in i variants i biblioteket för attiny hittar man att David A. Mellis har skrivit det mesta för just ATtiny85 och daterats till 2007 men många har gjort förbättringar som inte någon har tagit cred för.

https://github.com/arduino/Arduino/wiki/Unofficial-list-of-3rd-party-boards-support-urls

I mina efterforskningar hittade jag att den som är verkar som nuvarande huvudutvecklare för ATtiny heter Spence Konde och kallar sig Dr Azzy. Spence underhåller ATtinyCore som är en heltäckande samling av alla de senaste biblioteken för alla attiny chip. Den senaste versionen av ATtinyCore i skrivande stund är 1.1.4.

2.2.2 Cosa är ett annat alternativ

Jag vet inte vad Cosa är fullt ut men det är en person som har gafflat Dr Azzys arbete och gjort sin egna grej (öppen källkod ger sådana möjligheter). Cosa beskrivs som följande på deras hemsida Cosa is an object-oriented platform for Arduino. Får kolla in det en annan gång. Denna Mikael som är huvudutvecklare av denna tolkare verkar ha jobbat på ericsson länge. Om det har någon betydelse.
https://github.com/mikaelpatel/Cosa

Cosa: https://raw.githubusercontent.com/mikaelpatel/Cosa/master/package_cosa_index.json

 

3 Bränna bootloader

Chippet är ifrån fabrik instruerat hastigheten till 1 Hz. Vilket inte gör så mycket tycker jag. Det verkar vara ett krav att ”bränna” om den. De flesta väljer 8 Hz.

3.1 Bränn bootloaderinställningar

Det finns otroligt många alternativ. I arduino IDE välj från menyn. Samt Man bränner till internal.

Board: ATtiny25/45/85
Timer 1 Clock: CPU
B.OD.: B.OD. Disabled
LTO (1.6.11+ only): Disabled
Chip: ATtiny85
Clock: 8 MHz (internal)
Port: COM17 (eller vad du har för något just nu)
Programmer: Arduino as ISP

När allt ser ut så klicka på Burn Bootloader för att ”bränna” inställningarna.

arduinoIdeTools

4 Nu kan du skicka över skisser

Exempelvis blinkaren. Tänk på att ändra i exemplet med blinkaren till en port som finns på kortet D0-D5. Så om det står internal eller 13 så byt det till en siffra mellan 0 och 5 (på bilden kör jag med 3).

5 Andra alternativ

Här kommer nu sådant jag har sammanställt vad var inställningsmöjlighet innebär. Inställningarna för bootloadern som jag angav tidigare är inte satt i sten om man vet vad man gör. Jag har en del kvar att reda ut för att förstå allt själv. Min förhoppning är att du har nytta av detta för att kunna själv fortsätta utreda vad som kan förbättras.

5.1 Speciella Funktioner

Board: ATtiny25/45/85

Inga konstigheter.

Timer 1 Clock: CPU

Möjliga val Val att göra:
64MHz
32MHz
CPU (verkar vettigt men jag vet ej varför)

B.OD.: B.OD. Disabled

Finns frya val
B.O.D. Enabled (2.7v)
B.O.D. Disabled
B.O.D. Enabled (4.3v)
B.O.D. Enabled (1.8v)

B. O. D. står för brown out detect vilket på svenska blir uppmärksamma uppbränning. Jag skulle tolka det som en brandvarnare men jag kan ha fel. Det är märkligt att detta är frånslaget som standard nu när det kanske skulle vara bra att ha det tillslaget på något av lägena. Jag översätter rakt av från en engelsk text detta:

Brown-out detection övervakar kontinuerligt Vcc och är kopplat till chippets reset state (BOR) om strömmen går under ett visst läge. Det är en god ide för långsamt stigande nätaggregat eller när det är förväntat att strömmen kan falla under den mängd energi som krävs för att driva chippet på den frekvens den är ställd till. Med BOD frånslaget kan det hänga chippet till det att chippet manuellt återställs. BOD ökar strömförbrukningen något vilket kan vara dåligt för lågenergilösningar.

Studerar en alternativen 1.8v, 2.7v, 4.3v så undrar jag på vilket ”håll” som detta tillstånd för att de skulle agera som voltgränserna skulle slå igång. Jag skulle anta att exempelvis om en väljer 1.8v så slår reset igång när strömmen faller till 1.8v. Tänker man på det så står det inte specifikt så det skulle kunna innebära att när Vcc strömmen faller med 1.8v så utlöses reset. Jag har sett flimer där enheten kan trimmas ner till mycket liten energiförbrukning, till 0.2v och 0.01v. I sådana lågenergifall skulle en reset inte slås på eller kanske slås på i onödan av att strömmen går under den punkten direkt efter att strömmen slås till om en exempelvis har ett 3.7v batteri. Detta behöver utredas.

LTO (1.6.11+ only): Disabled

Jag undrar om versionen gäller arduino IDE. Det skulle betyda att man väljer disabled när man använder använder eclipse/atom men det verkar konstigt.

Val:
Enabled
Disbabled

Chip: ATtiny85

Inga konstigheter

Clock: 8 MHz (internal)

Det är viktigt att välja internal för external i det här fallet är arduinon vilket blir en missmatchning som kan kanske orsaka att något går snett. Är det ett projekt som ska hålla tiden med watchdog så har jag sett att 16 Hz använts. Kan vara det här man ändrar om man har någon speciell kristall som jag läst om i förbifarten.

Internal:
8 MHz
1 MHz
16 MHz (PLL clock, x5, x61 only)

Det är konstigt att 20 MHz inte finns med men det står med i specifikationerna för kortet men det skulle kunna vara så att det kommer när väl någon har lyckats att skriva in det i biblioteket. För alla funktioner som är här kommer ju ATtinyCore.

Port: COM17 (eller vad du har för något just nu)

Välj den som passar bäst. På linux är det exempelvis oftast /dev/ttyACM0

Programmer: Arduino as ISP

Inga konstigheter

5.2 Hintar mumbo jumbo

I specifikationerna kan man läsa om stöd för en del andra funktioner. Men de är inte valbara vad jag kan se i menyerna. Dessutom så ligger de utanför mitt kunskapsområde. Jag har med dem för att om jag en dag förstår dem eller uppdaterar denna guide när biblioteken uppdaterats att innehålla dessa.

I2C i kombination med hårdvaru USI i Wire biblioteket. Oklart vad det är för något.

Stöd för SPI genom biblioteket. USI jobbar med DI/DO i mastermode. Fungerar tydligen ej med MISO/MOSI. Slavläge är DI MOSI och DO MISO. Undar om de har skrivit fel och DI samt DO är D 0 respektive D 1 pinsen.

Seriell support via mjukvara. Använd interrupts. TX är AIN0, RX är AIN1. Det står att en får tänka på att kommandot Serial.begin() gör dessa pins oanvändbara för annat. Dessutom ska man tänka på att det blir fel om man läser och skriver samtidigt vilket betyder att det är någon sorts envägskommunikation med mjukvaru seriell kommunikation (”the usual SoftwareSerial library” står det).

För att seriell mjukvarukommunikation ska fungera bra kan en behöva kalibrera den interna oscilatorn eller pll klockan (det finns sketcher för detta). Det har att göra med att klockan är kalibrerad till +/- 10% i de flesta fall medan seriell kommunikation bara fungerar med ett fåtals procents avvikelse.

6. Andra resurser om detta

Genomgående har jag refererat till ett antal andra som du kan gå tillbaka till och läsa mer i.

Vill du se film så rekomenderar jag denna: https://m.youtube.com/watch?v=c8andV3OWr8

Publicerat av

passar

Speak as you fly

Lämna en kommentar

Denna webbplats använder Akismet för att minska skräppost. Lär dig om hur din kommentarsdata bearbetas.