Introduction: VUSBTiny AVR SPI Programmer

Picture of VUSBTiny AVR SPI Programmer

after making a usbtiny isp programmer and using it for 6 months, i was looking at making another one for carrying around. i like the simplicy of the usbtiny isp design but would like to make it even smaller and take less parts. one thing in the original design that i want to change is to eliminate the use of clock crystal. one solution i found is that v-usb drivers supports the 16.5Mhz internal oscillator on attiny25/45/85 devices. so i start out this project to have usbtiny isp employs v-usb for usb communication. the immediate benefits is that it saves space and have less component counts (no more crystals).


description from

USBtiny is a software implementation of the USB low-speed protocol for the Atmel ATtiny microcontrollers. Of course, it will also work on the ATmega series. The software is written for an AVR clocked at 12 MHz. At this frequency, each bit on the USB bus takes 8 clock cycles, and with a lot of trickery, it is possible to decode and encode the USB waveforms by software. The USB driver needs approximately 1250 to 1350 bytes of flash space (excluding the optional identification strings), depending on the configuration and compiler version, and 46 bytes RAM (excluding stack space). The C interface consists of 3 to 5 functions, depending on the configuration.


description from

V-USB is a software-only implementation of a low-speed USB device for Atmel's AVR microcontrollers, making it possible to build USB hardware with almost any AVR microcontroller, not requiring any additional chip.

video on construction and usage

Step 1: Features and Parts

Picture of Features and Parts

* programming logic from usbtiny isp, mature avr-dude support
* small foot-print
* minimal components
* powers target device

note that the io lines to the target mcus are not protected. you can add 1k-2k resistors to SCK and MOSI and protect against possible wrong connections


based on the works found at

v-usb from framework
usbtiny isp

parts list

* attiny45/85 (85 is more easier to come by)
* 3.6v zener diodes (1n747,BZX79,..avoid 1W types)
* 68ohm resistor x 2
* 1.5K resistor
* mini breadboard 170 tiepoints
* usb cable (dollar shop usb printer cable is fine)
* 1k/2k resistors for io lines protection (optional)

tools required

* a working avr programmer (yes, it's a catch22, we need one to make one)
* working avr programming environment

Step 2: Breadboard Layout, Schematic, and Construction

Picture of Breadboard Layout, Schematic, and Construction


* follow breadboard layout, there ain't that may components, 3 resistors, 2 diodes, 1 cap, plus an 8 pin mcu.
* get a dollar shop usb printer cable cut off the printer end, there will be 4 exposed wire, secure and make them into a 4 pin male header, we will use it to connect to the breadboard. consult schematic for layout and pin assignment (J1).
* watch out for diode polarity.

building and flashing the project

the project was built in a linux ubuntu lucid box with avr-gcc toolchain. it is assumed you already have such an environment, or you can find out from the internet how to setup one up. source codes are gnu gpl v2 licensed from inheritence.

the source code follows a convention recommended by v-usb, you can download the source package vusbtiny.tgz and untarred in into a project directory. within your source directory, there is a main.c, which is my version of modified usbtiny programmer. and a usbdrv sub-directory, which contains the v-usb layer. please observe licensing term from the above two projects when building this. my source on the programmer logic is based on Dick Streefland version and not the ladyada version (although they are almost the same).

for those who do not have a build too-chain, you can use the following binary

click to download vusbtiny.hex

and use avrdude to flash firmware

avrdude -c usbtiny -p t45 -e -V -U flash:w:usbtiny.hex

(if your device is a tiny85, replace -p t45 w/ -p t85)

source can be download here
click to download vusbtiny.tgz

untar the source package into your working directory

tar -zxvf vusbtiny.tgz

* do cd vsubtiny, to change into vusbtiny working directory
* ajust makefile for target device according to the chip you will be using. i.e. PROGRAMMER_MCU=t45 or t85
* do a make
* attach your favorite ISP programmer
* modify makefile and change your avrdude parameters if needed. the stock one assumes USBTiny programmer. i.e. AVRDUDE_PROGRAMMERID=usbtiny
* flash firmware via make install

after flashing firmware, we need to properly set the fuse, we are using pin 1 reset as io in this project

* ppl clock used as required by v-usb layer for usb timing
* reset pin disabled as we need to use it as io

avrdude -c usbtiny -p t45 -V -U lfuse:w:0xe1:m -U hfuse:w:0x5d:m -U efuse:w:0xff:m

this setting disables further programming via 5V SPI as we need the RESET pin (pin1) for io. you will need access to a HVSP programmer to recover the fuse.

Step 3: Usage and Application

Picture of Usage and Application

direct flashing on breadboard

if you are using vusbtiny to flash 8 pin AVR devices, you can just press your target device on top of the programmer device. the programmer had been designed so that the programming pins matches w/ targets. there is one trick though, you will need to isolate pin 2 and 3 on the programmer mcu, as they are the USB D+ and D- pins connecting to the PC. i use a cut of scotch tape to achieve this, you can see it on the photos. show below is a tiny13v "riding" on the tiny45, ready to receive firmware.

ISP flashing via jumper

to program a target circuit via ISP (in-system programming), you need an ISP cable. here i am not using the standard 2x3 or 2x5 pin headers. instead i am using a 1x6 jumper which is more breadboard friendly, you can make 2x3 or 2x5 pin header by mapping them to J2 as shown on the breadboard layout and schematics. the following photo shows an tiny2313 ready to get flashed via ISP.


* cannot flash the firmware? check your original programmer, might need to adjust timing via -B flag in avrdude. try to read chip 1st, may be a bad fuse, may be your chip need an external clock signal. you may need to fix your chip back to default 1st.
* check connections
* if use different io pins, check code and connections
* you may substitute zener diodes w/ 500mw, 400mw types
* you may try reduce R3 value to 1.2K or less
* you are more likely to encounter avrdude timing problems, try -B flag of avrdude, have a shorter USB cable all helps


jessekey7 (author)2016-10-15

this worked avrdude -v -pt85 -cstk500v1 -b19200 -U flash:w:vusbtiny.hex

set com port of programer to 1

jessekey7 (author)2016-09-26

does it need drivers because i says that windoes does not recognise the usb device

PeterK138 (author)2016-06-28

Hi guys correct way to upload that using arduino:
HEX: avrdude -P com3 -b 19200 -c avrisp -p attiny85 -v -e -U flash:w:usbtiny.hex

avrdude -P com3 -b 19200 -c avrisp -p attiny85 -v -e -U lfuse:w:0xff:m -U hfuse:w:0xdf:m

Litreo made it! (author)2015-11-21

Thanks for the project, man! Everything went fine up until flashing the firmware you supplied onto the attiny (I'm using an Attiny45-20SU). After that and after setting the fuses the programmer is not recognised by the computer (either Windows or Linux). I will build another one (identical). I have an Arduino board to use as ISP, do I need to set specific options before flashing the driver? Maybe that's the reason why I can't see the new programmer?

contrechoc made it! (author)2015-09-21

Nice, thank you, the funny piggy back method worked too, but is a little bit unstable :-). The t45 is programmed using the red Sparkfun tiny Programmer, also I used a STK500 (a little bit bigger - avr studio) high voltage programming to reprogram a lost t85...and all this because my beloved avr mkii programmer died after years of service without complaining- i am guilty for that - applying a servo voltage of 7V to it....

stearmanmark (author)2015-08-02

Hello all,

Just finished assembling a USBtinyISP. As always I have double check my soldering and component placement. However when I connect the USB plug to my computer

I get a Power surge window. Reads as follows

Power Surge on Hub USB Port. device has exceeded the power limits.

This a large computer I am sure the little programmer does not exceed the limits.

Any hints ? Seen this before?

Badetise made it! (author)2015-06-08

works great every time!

ricsirke (author)Badetise2015-07-21

Hello Badetise,

Can you explain how could you make it work through the "avrdude: Error: Could not find USBtiny device (0x1781/0xc9f)"?

DerwentR (author)ricsirke2015-07-29

Same problem here :(

RicsiN (author)DerwentR2015-07-29

finally, i made it,
you have to set the fuses of the microcontroller(it works like flashing a program):

remove the div by 8 on the clock

set brown-out detection

disable external reset, so you can use pin1 as i/o, here you can calculate it for a bunch of mc-s, but i tell you the cmd command that did it for me (found it on a forum, but don't remember where):

i used an arduino as an isp -> -c avrisp, but change it according to your choice of progammer

avrdude -c avrisp -p t48 -v -U lfuse:w:0xe1:m -U hfuse:w:0x5d:m -U efuse:w:0xff:m

these settings(except the reset disable) helped me for other projects with atmega48 - i do not need reset disable with this chip because it has more pins, but in case of the tiny it is neccessary.

Have you succeded?

DerwentR (author)RicsiN2015-07-30

Trying to run this command:

avrdude -c avrisp -p t85 -P COM3 -v -U lfuse:w:0x62:m -U hfuse:w:0x5f:m -U efuse:w:0xff:m -U flash:w:vusbtiny.hex

results in avrdude: ser_open(): can't open device "\\.\COM3": Access is denied. My Uno is definitely on COM3 and my PC sometimes hangs when I try to use this command. Same thing happens if I try to use the arduino flag rather than the avrisp one.

Any ideas? Thanks

RicsiN (author)DerwentR2015-07-30

do you use linux?

DerwentR (author)RicsiN2015-07-30

Using Windows at the moment but I can boot into Linux on my laptop if that'll help.

RicsiN (author)DerwentR2015-07-30

Theeen, i think you use your programmer with something else on the computer, try restart the computer

i have never got this access denied message...

DerwentR (author)RicsiN2015-07-29

Ah OK thanks. I was at least on the right lines by changing the usbtiny part. I'll give it a go in the morning and get see how it goes, thanks. I'm trying to program it using an Arduino Uno as the ISP and an ATTiny85.

ANDREIS6 (author)2015-07-01

I built this but it doesnt work.I got the same error as Badetise.

I used 100 ohms instead of 68.They are the probem?

As pull-up i used a 1,8kohm resistor.Also i added a led with a 1,8kohm resistor between Vcc and CND.I also used a 47microfarad electrolitic cap.If anybody can help?


ANDREIS6 (author)ANDREIS62015-07-01

now my pc makes its bing sound and tells me it doesn't recognize it.

Badetise (author)2015-06-04

Hi, I just built this, but when I try to flash a program, it says "avrdude: Error: Could not find USBtiny device (0x1781/0xc9f)". I have double and quintuple checked all of my connections, I am completely stumped. Any help would be greatly appreciated, Thank you!

Nadimul Huq Zulas (author)2015-04-24

For more clear about how to load a hex file in microcontroller you can browse this video.

pouic13 (author)2015-01-12


I realized the programmer with an attiny45 and it's work very well.

But now i want to try with a tiny85 and I can not compile the source.

i recieve this errors and many others:

usbdrv/usbdrv.h:455:6: error: variable ‘usbDescriptorDevice’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
char usbDescriptorDevice[];

Do you have the same results or i don't have the goods ressources?

spiess (author)2012-04-10

This is really a great little project! I built it on a little stripe of of prototype board and arranged it in such a way that one end of the prototype stripe also serves as a usb plug.

Every thing worked perfectly on the first try - so big congratulations for presenting such a useful project and making things so simple and the instructions so precise!


scotth2316 (author)spiess2014-09-15

that is awesome what you did turning the breadboard into a usb stick

CarlB1 made it! (author)2014-08-18

Great Tutorial, I've setup 2 of these on breadboard already, one t45 and one t85. This circuit is just too easy to replicate! I did initially have issues with requiring the use of 'sudo' with avrdude, but this simple rule for udev fixed that.

SUBSYSTEM=="usb", ATTR{idProduct}=="0c9f",ATTRS{idVendor}=="1781", MODE="0660", GROUP="adm"

skootles (author)2014-07-26

Built one of these and it works great! Do you know if there are any limitations? For example, Adafruit's USBtinyISP kit can't program any AVRs that have over 64k of flash like the Atmega1281/1280/2561/2560. I don't have any of those AVRs on hand to test.

Also, I built one and it takes about 2 minutes to burn the Arduino bootloader to an ATmega328. Do you know what could be done to speed that process up, at all?

dan3008 (author)2014-01-22

Wish there was a way of doing this without needing an avr programmer... Ah well, Teach me for looking for the easy way out

dan3008 (author)dan30082014-01-22

Just a thourght, do you know if its possible to get the ATtiny45/85 preprogrammed with vusbtiny?

simpleavr (author)dan30082014-01-23

Not from me. I have not do an AVR for more than one year. On MSP430 now. If you have friends that got a programmer, you can download the hex and have him flash one for you. Or try local avr forums. It might be wiser to get a programmer from ebay. They are about $3 shipped nowadays.

dzervas (author)2013-12-21

When I plug it in the USB i get in dmesg:

[257309.496223] usb 4-1.1: new full-speed USB device number 50 using ehci-pci
[257309.562747] usb 4-1.1: device descriptor read/64, error -32
[257309.732580] usb 4-1.1: device descriptor read/64, error -32
[257309.902371] usb 4-1.1: new full-speed USB device number 51 using ehci-pci
[257309.968926] usb 4-1.1: device descriptor read/64, error -32
[257310.138778] usb 4-1.1: device descriptor read/64, error -32
[257310.308634] usb 4-1.1: new full-speed USB device number 52 using ehci-pci
[257310.714804] usb 4-1.1: device not accepting address 52, error -32
[257313.126003] hub 4-1:1.0: connect-debounce failed, port 1 disabled

Any help appreciated...

keverett458429 (author)2013-09-13

simple probably vacuous question, what is SPI and why would I want to program it? Post a link if it's a fairly good explanation. Thanks in advance

simpleavr (author)keverett4584292013-09-14

There are a few ways to program an avr, SPI (serial peripheral interface) is the simplist way as it only require three signals, Clock, MOSI and MISO (master-in, slave-out and vice versa). SPI is easier to implement (most uses bit-bang style) and require fewer HW resources. See linked docutment from amtel for details.

necko (author)2013-07-06

Need help on swapping PB3 and PB4.
Modified usbconfig.h as below and flash the attiny85.
I monitor reset line.
It stay high for a few seconds and then started pulsing.

I think I have to modified MCUR setting but do not know how.
Can you please help?

thelinuxnerd (author)2013-04-11

I use this udev rule for my actual USBTiny but even though the id is the same it makes me use sudo for the vusbtiny. Any ideas?

ssokolow (author)2013-03-01

Could you clarify where the "1k/2k resistors for io lines protection (optional)" go?

Also, what benefit does the  "optional 0.1uf capacitor" bring, and where does it fit in the circuit diagram? I'm feeling really fuzzy today and I'm having trouble working backwards from the photo of the breadboard.

simpleavr (author)ssokolow2013-03-04

io line resistors protects the device when u accidentally connect high-voltage input and output pins. most builds don't use them to make the project footprint smaller.
the 0.1uF capacitor is just a bypass cap to stablise power supply (like any other projects). if u have one, put it it.
there are many successful builds of this project. google vusbtiny and u can find other's experience / modification to make it work.

ssokolow (author)simpleavr2013-03-05

I haven't tried but I can imagine it might work nicely to solder SMD resistors between two adjacent perfboard holes for compact I/O line resistors (using a heat gun to keep both melted at once) similar to what spless did with all of his resistors in the photo he posted.

As for the I/O line resistors, I got that but I'm not sure where they're supposed to go in the circuit diagram. (That's also my second question about the bypass cap since, lately, I've been jet-lagged and my free time coincides with the time I'm too dozy to make sense of how the breadboard photo maps to the circuit diagram.)

etuardu (author)2013-01-22

Thank you for this guide, I succeeded in programming both an AtTiny45 and an Atmega328.
Note that in this last case I had to wire pin4 of J2 to the Atmega328's SCK (that is pin 19), not to the SCL (that was pin 28).
And I was on Windows7 64bit, if anyone cares.

icarus74 (author)2012-01-14

Great tutorial. I am porting this to a protoboard.

Can the 68Ohm resistors be replaced with any other values (47Ohm, 100Ohm...) and the 150K one be replaced by another value say 1K or 2.2K ?
Would avoid burning fossil-fuel to get only those 2 from the store. Rest, I have pretty-much everything.

Also for your USB printer cable hack, can you explain the header connections ? You only seem to have Vcc and D+ connected to the header, and GND, D- isn't clear from the pic, if they are on their own headers or just plain terminated (left floating).

simpleavr (author)icarus742012-01-16

here are my understanding...
. the 68ohms are current limited (to protect the pins), so u should make them as close to 68 as u can. 47ohm definitely works. sometimes even better than 68ohms if u have a long usb cable.
. the 1.5k is a pullup, so anything between 1k to 5k is fine.
. follow the schematic / diagram, there are only 6/7 parts in this, the schematic also make notes of the 4pin header position. if u are talking about the usb cable itself, they can be different colored wires inside, u sould use a multi-meter to sort out which is which. i.e. measure between the contacts on one end against the 4 exposed wires against a usb pin-out diagram.

good luck on your build.

_Ludo (author)2011-08-09

Did anybody test it under Win7? I got an error saying that the installation could not be done!?

icarus74 (author)_Ludo2012-01-14

As far as I can tell, reading various posts at the Objective-Development site (& forums), very few people seem to have had success in using V-USB under Windows 7. Apparently, some initial / early Win 7 (that too, possibly only on 32-bit mode), installation did work, but people do seem to have issues.

Here's one such thread:[]=8&sid=ffe64be8b944f53757abea58c378899a

nis123 (author)2012-01-07

It is sufficient if i just flash the given HEX file using SinaProg???

simpleavr (author)nis1232012-01-09

never used sinaprog before. if it can accept hex file and works for u in flashing avrs, yes, u can use it as my hex files are no different. u do need to toggle the fuse bit on your target device and u should find out how it's done w/ sinaprog.

8N1 (author)2011-11-30

The usbconfig.h says:
"Please note that D+ must also be connected to interrupt pin INT0!"

Can you tell me what you have done to avoid that?

Thanks for sharing!

simpleavr (author)8N12011-11-30

thanks for your interest.

the default D+ pin is INT0, but it can be changed, for attiny45/85 layout, i used portb.3, we can re-define USB_INTR_VECTOR to be the "pin change" interrupt. and any one of the 6 io pin level change will trigger the interrupt, which includes portb.3.

note that if u are also using some other higher priority interrupts this may fail.

inside usbconfig.h, toward the end of the file, u can see the various options.


//#define USB_INTR_VECTOR INT0_vect
//#define USB_INTR_VECTOR PCINT9_vect

putyn (author)2011-10-03

hey im trying to build a smd version of your tiny avr programmer (will post pictures as soon as i get it finished) and im waiting for the board to arrive anyway my question the programmer uses the 8mhz internal oscillator ?
so i can order this part ATtiny85V-10SU or this ATTINY85-20SH :) ?

simpleavr (author)putyn2011-10-04


use the 20mhz version (attiny85-20??), we need to use a internal oscillator clocked at 16.5Mhz to avoid external crystals.

for more technical details if u need, go to the vusb site for explanations.

good luck w/ your project.

putyn (author)simpleavr2011-10-04

ok thanks for your answer will order this ATTINY85-20SH - can you take a look at my schematic and design if i post them ?

simpleavr (author)putyn2011-10-04

not sure, i think this is the most simple programmer already? are u changing anything? If not, build it and if u ran into problem. Post a comment here I am sure either myself or someone can help.

John_Edward (author)2011-07-08

Thank you for this guide, I made my tiny programmer with the help of this :)
I made mine to a piece of stripboard, and used an Arduino to program the chip.
I'll link my materials here, so people can see how it would fit to a stripboard.
The board could be made smaller if I used more wires instead of jumpers, but It's small enough for me like this :)

I don't take any responsibility for wrong schematics though, these are made from memory and might not be correct:

silverwindro (author)2011-06-28

That ATtiny is bigger, my ATtiny45V is smaller than that one in the clip.
Or am i wrong?

About This Instructable




More by simpleavr:Tix Clock GemsVintage TI DataMath / Sinclair Scientific Calculator EmulatorAVR HVSP Fuse Resetter
Add instructable to: