Programming the ATTiny85, Arduino Style
by Thatcher
This is a sort of a continuation of the last post. In the last post,
I showed how to load the ATTiny85 cores into the Arduino IDE.
If that worked for you, cool! This how to actually program the chip.
If it didn't work... put a comment somewhere. I'll try to help.
Anyway, programming the ATTiny is very easy.
The only thing you really need to do is set up a target board.
This is either a breadboard, perfboard, or PCB circuit that interfaces
the ATTiny to an Arduino board. The circuit should have
these connections:
This is called ISP circuit. The chips communicate over SPI via this configuration. |
but it also has four wires for communication. It does this using a
protocol called SPI. The four connections are SCK (clock),
MISO and MOSI (communication), and Reset (resets the chips
when it is done). That circuit connects the SCK, MISO, and MOSI pins
of both chips to the corresponding one on the other chip.
The reset pins of the two chips are not connected, however.
The Master (Arduino in this case) has a digital pin connected to the
actual reset pin of the slave (ATTiny85). On the Arduino Uno and
Duemilanove (and some other ones of the same shape), SCK is pin 13,
MISO pin 12, MOSI pin 11, and reset pin 10. The ATTiny85 pinout is below.
The breadboard programmer above isn't the only way making
a target board.I made one out of a small piece of perf board,
a DIP 8 socket, a five-pin header, and a bunch of wires.
It is is the same circuit as the breadboard, only more permanent.
Same connections, though.
Once you have one of these target boards, either on a breadboard or
perfboard (or something else), we can actually program it.
The first thing to do is upload the ArduinoISP sketch onto
the Arduino board. You find it here:
And then upload it. What it does is a couple of things: the first thing it
does is emulate an AVRISP programmer. The computer asks what
it is, and it says it is a AVR programmer instead of a more
generic serial device.
The computer sends it the program (in hexadecimal form) and then it
goes to its second function. It loads the program hex file onto the
other chip via SPI and then relays whether or not the operation
worked to the computer.
So connect your target board, make sure everything is connected,
and (IMPORTANT!) set the Tools/Board Menu to ATtiny85
(w/ Arduino as ISP). Note: you may have to put a 110 ohm resistor
between reset and power on the Arduino board. Then you can upload
your program. I used this one. It is for the board that I fixed in the
last post!
int toast = 0;
int toast = 0;
void setup(){
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
PORTB = B0000100;
}
/*
0 - H
1 _ H
2 - L
3 - H
*/
void loop(){
PORTB = B0001011;
delay(int(random(2000))*10);
toast = int(random(4));
for(int i = 0; i <= int(random(5,12)); i++){
delay(int(random(30, 60)));
digitalWrite(toast, LOW);
delay(int(random(30,60)));
digitalWrite(toast, HIGH);
delay(40);
PORTB = B0001011;
}
//delay(10000);
}
That should do it. You'll get this message in the bottom window:
If another set of text appeared, something is wrong. Here is a
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
PORTB = B0000100;
}
/*
0 - H
1 _ H
2 - L
3 - H
*/
void loop(){
PORTB = B0001011;
delay(int(random(2000))*10);
toast = int(random(4));
for(int i = 0; i <= int(random(5,12)); i++){
delay(int(random(30, 60)));
digitalWrite(toast, LOW);
delay(int(random(30,60)));
digitalWrite(toast, HIGH);
delay(40);
PORTB = B0001011;
}
//delay(10000);
}
That should do it. You'll get this message in the bottom window:
good site for finding out what the errors mean. Otherwise just
Google it. Now you can test the chips on a breadboard or a
PCB or something... I really hope this helps people. I just
love the ATTiny chips because they're so small yet can still
do many of the same things as a normal Arduino. Remember,
though, not every function works.