You plug the USBasp in, Windows chimes, and then nothing works. Device Manager shows a yellow triangle on an “Unknown Device”, and avrdude answers with the line every AVR beginner has met: could not find USB device with vid=0x16c0 pid=0x5dc. The programmer isn’t broken and the cable is fine — Windows simply has no driver that speaks libusb, and USBasp needs one. Zadig installs it in about sixty seconds. Here’s the tool, the exact clicks, and how to undo it if you point it at the wrong device.

⬇ Zadig 2.9 (official build)

Windows 7 → 11 · 5.3 MB · portable, no install · signed drivers

Download Zadig 2.9

Unmodified official build from the libwdi project. Single executable inside the ZIP — nothing is installed on your PC until you press the button in Zadig itself.

What Zadig actually does

A USBasp doesn’t pretend to be a COM port or a keyboard. It’s a raw USB device, and the software talking to it — avrdude, the Arduino IDE, khazama — reaches it through a generic USB library. Windows ships no such driver and no automatic match for vendor ID 16C0, product ID 05DC, so the device sits unclaimed forever.

Zadig is a driver installer, not a driver. It takes one of four generic drivers and binds it to the device you select, generating the .inf and certificate on the fly. That’s why the same tool shows up in guides for the USBasp, for STM32 DFU flashing, for SDR dongles and for game controllers: different hardware, same missing plumbing.

Install the USBasp driver, step by step

  1. Plug the USBasp into a rear USB port, directly on the PC — not through a hub;
  2. Extract the ZIP and run zadig-2.9.exe. It asks for admin rights; that’s expected, driver binding needs them;
  3. Open Options → List All Devices. Without this checkbox the dropdown is usually empty and people give up here;
  4. In the dropdown, select USBasp. Confirm the USB ID underneath reads 16C0 05DC — that’s the proof you picked the right device;
  5. In the driver box on the right, click the little arrows until it shows libusb-win32;
  6. Press Install Driver (or Replace Driver) and wait. It takes ten to thirty seconds and the window may look frozen — let it finish;
  7. Unplug and replug the programmer. In Device Manager it now appears under libusb-win32 devices as USBasp, with no yellow triangle.

Now avrdude -c usbasp -p m328p -v should report the device instead of the vid/pid error.

Which of the four drivers to pick

This is where most people guess, and a wrong guess costs a reinstall. The short version: for USBasp with avrdude or the Arduino IDE, choose libusb-win32.

libusb-win32 The safe pick for USBasp, USBtinyISP and anything driven by classic avrdude 6.x. Implements the old libusb-0.1 API those builds expect;
WinUSB Microsoft’s own generic driver. Correct for newer tools built on libusb-1.0 — avrdude 7.x, dfu-util, STM32 DFU, ST-Link utilities;
libusbK A faster alternative to WinUSB, used by some bulk-transfer tools. Rarely what you want for a programmer;
USB Serial (CDC) Turns the device into a COM port. Not for USBasp — this is for CDC hardware whose own driver is missing.

If you installed libusb-win32 and your tool still can’t see the device, running Zadig again and switching to WinUSB is a perfectly reasonable second attempt. The two are interchangeable at the click level; only the library on the software side decides which one is right.

When it still doesn’t work

The dropdown is empty. Options → List All Devices wasn’t ticked, or the device isn’t enumerating at all. If Device Manager shows nothing new when you replug, suspect a charge-only USB cable — the single most common false alarm on any bench.

“Driver Installation: FAILED (Access denied)”. Zadig wasn’t elevated, or a security suite blocked it. Right-click → Run as administrator, and close any programmer software that might be holding the device open.

The install hangs for minutes. Windows is looking for a driver online. Wait it out once; it completes. Disconnecting from the network first makes it noticeably faster.

You replaced the driver on the wrong device. It happens — List All Devices shows your mouse too. Fix: Device Manager → View → Show hidden devices → right-click the device → Uninstall device, tick Delete the driver software for this device, then replug. Windows restores its own driver. This is why step 4 above says to verify 16C0 05DC before clicking.

avrdude finds the device but says “cannot set sck period”. Good news, actually: the driver is working. That warning comes from old USBasp firmware on clone boards and is usually harmless. If the target genuinely fails to program, fit the slow-SCK jumper (JP3 on most clones) — required when the target’s clock is below about 1.5 MHz, which includes any factory-fresh ATmega running on its 1 MHz internal oscillator.

“Target doesn’t answer” or signature 0x000000. Not a driver problem anymore. Check the ISP cable orientation, that pin 1 matches on both ends, and that the target actually has power.

What else Zadig is for

Keep it on the bench — the same fix applies well beyond AVR work. USBtinyISP and other V-USB programmers need libusb-win32 exactly like the USBasp. STM32 boards in DFU mode, ST-Link clones and dfu-util workflows want WinUSB. SDR dongles and various logic analysers ship with instructions that boil down to “run Zadig, pick WinUSB”.

One important exception: serial adapters and the CH341A programmer do not use Zadig. Those have real manufacturer drivers — the CH341A uses the WCH package, and USB-to-serial chips use their own: CH340, CP2102 or the troublesome PL2303. Running Zadig on a working COM port device only breaks it.

FAQ

Is Zadig safe? Yes. It’s open source, part of the libwdi project by the author of Rufus, and the drivers it installs are digitally signed — no test mode, no Secure Boot fiddling. The risk isn’t the tool, it’s selecting the wrong device in the dropdown.

Do I need to install Zadig? No. It’s a single portable executable; run it, use it, keep it in your tools folder. Nothing is left running in the background.

Does it work on Windows 11? Yes, including 11 24H2. Core Isolation / Memory Integrity does not block these drivers.

Will this give me a COM port? No, and it shouldn’t. A USBasp is not a serial device; there will be no entry under Ports (COM & LPT). Success looks like a clean “USBasp” under libusb-win32 devices.

Do I have to run it again after every reboot? No. The driver binding is permanent, per device. Plug the same USBasp into a different USB port and Windows reuses it. A different USBasp with the same VID/PID also works straight away.

My USBasp worked on the old PC without any of this. Then someone had already run Zadig — or an installer that bundles the same libusb driver — on that machine. Nothing has changed in the hardware.

Can I use it with the Arduino IDE? Yes. Once the driver is bound, choose Tools → Programmer → USBasp and use “Upload Using Programmer”. The IDE calls the same avrdude underneath.

Verdict

The USBasp is a five-dollar programmer that fails at the first hurdle for a reason that has nothing to do with its price: Windows has no generic USB driver to give it. Zadig closes that gap in a minute, with no installer, no signup and no lasting footprint — check the 16C0 05DC ID before you click, pick libusb-win32, and get back to burning bootloaders. If you’ve outgrown ISP programming and want something that reads and writes chips off-board, the TL866II Plus and the XGecu T48 are the natural next bench purchases.