The ATTiny85 is incredibly trivial to get code running on in C (and less trivial in Rust, but probably still easier than what this blog post makes it out to be) if you eschew the complexity of Arduino and USB (micronucleus).
Here is all the source code for a blinker in AVR-C:
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB |= BV(0);
while (1) {
PORTB |= BV(0);
_delay_ms(500);
PORTB &= ~BV(0);
_delay_ms(500);
}
}
Here is how you build and flash it (with a USBASP programmer, but feel free to buy anything else): avr-gcc -std=c11 -DF_CPU=16000000UL -mmcu=attiny85 -o blink blink.c
avr-objcopy -O ihex blink.hex blink
avrdude -c usbasp -p attiny85 -U flash:w:blink.hex:i
Not quite as convenient as using micronucleus and USB, but far simpler to debug/understand and generally more flexible.If you insist on using micronucleus, then as I understand it the only thing which changes is you need to build the command line tool micronucleus counterpart and do something like:
micronucleus --timeout 60 --run --no-ansi blink.hex
Really the problem here is that Arduino tried to present embedded development as a simple idea, and when this pristine abstraction breaks down inevitably, things get really confusing really fast.