Bare ATmega328P Blink
An Arduino Uno without the Uno — the bare AVR chip on a breadboard with crystal, decoupling, and an LED on PB5.
Difficulty: Through-hole. Estimated build time: about 60 minutes. Estimated parts cost: about US$6.00. 9-line bill of materials. Compare supplier offers when available. The Arduino Uno is essentially an ATmega328P plus a USB-serial bridge plus a regulator.
Place the chip and reset pull-up
Push the ATmega328P-PU into the centre of a breadboard so it straddles the gap. Wire pin 1 (RESET) through a 10 kΩ resistor to VCC — without this pull-up the chip will randomly reset on noise or from your finger touching the pin. Bring VCC (pin 7) and AVCC (pin 20) to your 5 V rail, and tie both GND pins (8 and 22) to your ground rail.
Add power decoupling
Place a 100 nF ceramic capacitor between VCC and GND right next to pin 7, and another between AVCC and GND right next to pin 20. AVCC is the analog supply for the ADC; even if you are not using the ADC, leaving it floating or unbypassed is asking for trouble. Add a 10 µF electrolytic across the rails near where power enters the breadboard for bulk decoupling.
Wire the 16 MHz crystal
Connect the 16 MHz crystal between XTAL1 (pin 9) and XTAL2 (pin 10). Place a 22 pF ceramic from each crystal pin to ground — the load capacitors. Keep these traces short and the caps as close to the chip as possible. Without the crystal the chip will fall back to its 8 MHz internal RC oscillator if the fuses say so, but for a stock Arduino-bootloader chip you need the external crystal.
Install the LED on PB5 (digital pin 13)
Wire pin 19 (PB5, the SCK pin / Arduino's pin 13 / Uno's L LED) through a 330 Ω resistor to the anode of an LED, and the LED cathode to ground. This is the standard Arduino blink LED. The resistor limits current to about 9 mA (5 V minus 2 V LED drop, divided by 330 Ω), comfortably within the chip's 20 mA per-pin spec.
Hook up the ICSP header and flash
Drop a 2×3 (six-pin) male header on the breadboard and wire it to the AVR ISP pinout: MISO (pin 18), VCC, SCK (pin 19), MOSI (pin 17), RESET (pin 1), GND. Use an Arduino Uno running the ArduinoISP sketch as your programmer. In the IDE, choose Board → Arduino Uno (or 'ATmega328 on a breadboard' if you prefer the 8 MHz internal-clock variant) and Tools → Burn Bootloader once. After that you can flash any sketch via 'Upload Using Programmer'. The Blink sketch should now run with the LED on PB5 toggling once per second.