I picked up a USBtinyISP AVR Programmer Kit, Barebones AVR dev. board and 28-pin ZIF socket from Adafruit on the theory that it would be easier to preprogram the Atmega168 on a dedicated target board. Unfortunately, I followed the SpiffChorder instructions slightly out of order and burned the external clocking fuse before writing the firmware, thus rendering the unclocked devboard useless... so instead I programmed the microcontroller in-circuit later once the 12MHz crystal and associated components were in place to clock it correctly. I used a machine running Debian GNU/Linux and installed their packages for avrdude and avr-libc. You can test the rig after connecting the 6-pin USBtiny cable to CON1 with it set to provide power (and make sure nothing is connected on CON2).

$ sudo avrdude -c usbtiny -p atmega168

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e9406

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Assuming it's all working, unpack the latest SpiffChorder sources (I used 0.99) modify the USBaspLoader firmware Makefile, program the IC and set its fuses.

$ unzip -q SpiffChorder-0.99.zip
$ cd SpiffChorder/USBaspLoader.2008-02-05/firmware
$ sed -i 's/^\(PROGRAMMER = -c\) .*/\1 usbtiny/' Makefile
$ make
avr-gcc -Wall -Os -I. -mmcu=atmega168 -DF_CPU=12000000  -x assembler-with-cpp -c usbdrv/usbdrvasm.S -o usbdrv/usbdrvasm.o
avr-gcc -Wall -Os -I. -mmcu=atmega168 -DF_CPU=12000000  -c usbdrv/oddebug.c -o usbdrv/oddebug.o
avr-gcc -Wall -Os -I. -mmcu=atmega168 -DF_CPU=12000000  -c main.c -o main.o
usbdrv/usbdrv.h:198: warning: ‘usbFunctionDescriptor’ used but never defined
avr-gcc -Wall -Os -I. -mmcu=atmega168 -DF_CPU=12000000  -o main.bin usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o -Wl,--section-start=.text=3800
rm -f main.hex main.eep.hex
avr-objcopy -j .text -j .data -O ihex main.bin main.hex
avr-size main.hex
   text    data     bss     dec     hex filename
      0    2134       0    2134     856 main.hex
$ cp hexfiles/mega168_12mhz.hex main.hex
$ sudo make flash
avrdude -c usbtiny -p atmega168 -U flash:w:main.hex:i

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e9406
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "main.hex"
avrdude: writing flash (16342 bytes):

Writing | ################################################## | 100% 9.58s



avrdude: 16342 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: load data flash data from input file main.hex:
avrdude: input file main.hex contains 16342 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 8.56s



avrdude: verifying ...
avrdude: 16342 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

$ sudo make fuse
avrdude -c usbtiny -p atmega168 -U hfuse:w:0xd5:m -U lfuse:w:0xff:m -U efuse:w:0x00:m
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e9406
avrdude: reading input file "0xd5"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.00s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xd5:avrdude: load data hfuse data from input file 0xd5:
avrdude: input file 0xd5 contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0xff"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.00s
avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xff:
avrdude: load data lfuse data from input file 0xff:
avrdude: input file 0xff contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified
avrdude: reading input file "0x00"
avrdude: writing efuse (1 bytes):

Writing | ################################################## | 100% 0.00s

avrdude: 1 bytes of efuse written
avrdude: verifying efuse memory against 0x00:
avrdude: load data efuse data from input file 0x00:
avrdude: input file 0x00 contains 1 bytes
avrdude: reading on-chip efuse data:

Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: 1 bytes of efuse verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

$ sudo make lock
avrdude -c usbtiny -p atmega168 -U lock:w:0x2f:m

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e9406
avrdude: reading input file "0x2f"
avrdude: writing lock (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of lock written
avrdude: verifying lock memory against 0x2f:
avrdude: load data lock data from input file 0x2f:
avrdude: input file 0x2f contains 1 bytes
avrdude: reading on-chip lock data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of lock verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Now disconnect the programmer and then hold down all three thumb buttons (or short N, C and F to GND) while connecting the circuit via USB. If you have the LEDs wired, you should see LN and LF light up, indicating it's ready for programming through the virtual USBasp programmer.

$ sudo avrdude -c usbasp -p atmega168

avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e9406

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

$ cd ../..
$ sudo make program

Compiling: main.c
avr-gcc -c -mmcu=atmega168 -I. -gdwarf-2 -DF_CPU=12000000UL -Iusbdrv  -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst  -std=gnu99 -MD -MP -MF .dep/main.o.d main.c -o main.o -Ikeymaps/ -include nasa_us.h

Compiling: usbdrv/usbdrv.c
avr-gcc -c -mmcu=atmega168 -I. -gdwarf-2 -DF_CPU=12000000UL -Iusbdrv  -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=usbdrv/usbdrv.lst  -std=gnu99 -MD -MP -MF .dep/usbdrv.o.d usbdrv/usbdrv.c -o usbdrv/usbdrv.o

Compiling: usbdrv/oddebug.c
avr-gcc -c -mmcu=atmega168 -I. -gdwarf-2 -DF_CPU=12000000UL -Iusbdrv  -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=usbdrv/oddebug.lst  -std=gnu99 -MD -MP -MF .dep/oddebug.o.d usbdrv/oddebug.c -o usbdrv/oddebug.o

Assembling: usbdrv/usbdrvasm.S
avr-gcc -c -mmcu=atmega168 -I. -x assembler-with-cpp -Wa,-adhlns=usbdrv/usbdrvasm.lst,-gstabs  -DF_CPU=12000000UL usbdrv/usbdrvasm.S -o usbdrv/usbdrvasm.o

Linking: spiffchorder.elf
avr-gcc -mmcu=atmega168 -I. -gdwarf-2 -DF_CPU=12000000UL -Iusbdrv  -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=usbdrv/usbdrv.o  -std=gnu99 -MD -MP -MF .dep/spiffchorder.elf.d usbdrv/usbdrv.o usbdrv/oddebug.o main.o usbdrv/usbdrvasm.o --output spiffchorder.elf -Wl,-Map=spiffchorder.map,--cref  -Wl,-u,vfprintf -lprintf_min -Wl,-u,vfscanf -lscanf_min

Creating load file for Flash: spiffchorder.hex
avr-objcopy -O ihex -R .eeprom spiffchorder.elf spiffchorder.hex

Creating load file for EEPROM: spiffchorder.eep
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
        --change-section-lma .eeprom=0 -O ihex spiffchorder.elf spiffchorder.eep
avr-objcopy: --change-section-lma .eeprom=0x00000000 never used
avrdude -p atmega168  -c usbasp    -U flash:w:spiffchorder.hex

avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e9406
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: reading input file "spiffchorder.hex"
avrdude: input file spiffchorder.hex auto detected as Intel Hex
avrdude: writing flash (5922 bytes):

Writing | ################################################## | 100% 1.33s



avrdude: 5922 bytes of flash written
avrdude: verifying flash memory against spiffchorder.hex:
avrdude: load data flash data from input file spiffchorder.hex:
avrdude: input file spiffchorder.hex auto detected as Intel Hex
avrdude: input file spiffchorder.hex contains 5922 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.95s



avrdude: verifying ...
avrdude: 5922 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.


back to The Man-Machine...

CC0 To the extent possible under law, the creator of this work has waived all copyright and related or neighboring rights to it.