Attiny85 PWM Not Working
No need to assign OCR0A on every overlow, only reassign it when it changes. This code removes the ISR so is shorter and simpler (and works)...

#include &lt;avr/io.h&gt;
#include &lt;avr/interrupt.h&gt;
#include &lt;util/delay.h&gt;

double dutyCycle = 50;

int main() {

    DDRB = (1 &lt;&lt; PORTB0); // Set PB0 as output

    TCCR0A = (1 &lt;&lt; COM0A1) | (1 &lt;&lt; WGM00) | (1 &lt;&lt; WGM01); // Clear OC0A on compare, WGMxx selscts fast mode

    TCCR0B = (1 &lt;&lt; CS00); // Set prescalar and start timer

    while (1) {

        OCR0A = (dutyCycle / 100.0) * 255.0;

        _delay_ms(100);
        dutyCycle = dutyCycle + 15;

        if (dutyCycle &gt; 100) {
            dutyCycle = 0;
        }


    }

    return 0;
}


If you ever really need to use an ISR (unlike in this case), there are complications. For example, you are writing to the variable dutyCycle in the main loop, and reading from it in the ISR. This means the variable must be volatile. You also probably want to do avoid doing any floating point inside an ISR, so better to compute the final value in the main thread and then pass only the new byte to the ISR so it can do its job and return as quickly as possible.