My programmer is the Arduino Uno running the ArduinoISP sketch, and my IDE is v22.
When I select the ATtiny85@16mhz option, it programs the chip and then runs at 1/16 the speed of the 1mhz option. At that, the external crystal appears not to be doing anything (as I can remove it from the circuit and the program still slowly chugs along)
The ATtiny85@8mhz option appears to be running at 1/8 the speed.
The 1mhz option appears to be running at around the right speed.
I am basing this estimation on two things:
The delay time in the blink example (it is roughly 1 second at 1mhz, 8 seconds at 8mhz and 16 seconds at 16mhz)
Serial.println works at 1mhz and sends gibberish at any of the other clock speed.
I feel like there is something fundamental that I am missing here. Any help would be appreciated.
Like several Atmel MCUs, the ATtiny85 comes from the factory set to run on the 8MHz internal oscillator divided by 8, so 1MHz, which is consistent with your observations. The fuses need to be set to use an external crystal. See the datasheet, but setting the Low Fuse Byte to 0xFF should work for you.
The boards.txt file associated with the core appears to already be doing that as far as I can tell:
attiny85at16.name=ATtiny85 @ 16 MHz (external crystal; 4.3 V BOD)
# The following do NOT work...
# attiny85at16.upload.using=avrispv2
# attiny85at16.upload.using=Pololu USB AVR Programmer
# The following DO work (pick one)...
attiny85at16.upload.using=arduino:arduinoisp
# attiny85at16.upload.protocol=avrispv2
# attiny85at16.upload.using=pololu
attiny85at16.upload.maximum_size=8192
# Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms; [CKSEL=1111 SUT=11]
# Brown-out detection level at VCC=4.3 V; [BODLEVEL=100]
# Preserve EEPROM memory through the Chip Erase cycle; [EESAVE=0]
# Serial program downloading (SPI) enabled; [SPIEN=0]
attiny85at16.bootloader.low_fuses=0xFF
attiny85at16.bootloader.high_fuses=0xD4
attiny85at16.bootloader.extended_fuses=0xFF
attiny85at16.bootloader.path=empty
attiny85at16.bootloader.file=empty85at16.hex
attiny85at16.bootloader.unlock_bits=0xFF
attiny85at16.bootloader.lock_bits=0xFF
attiny85at16.build.mcu=attiny85
attiny85at16.build.f_cpu=16000000L
attiny85at16.build.core=tiny
This is the point I am particularly confused about.