ATTiny watchdog and interrupt
Disassembling the delay code indicates it uses micros which needs interrupts on to work.

void delay(unsigned long ms)
{
 27a:   cf 92           push    r12
 27c:   df 92           push    r13
 27e:   ef 92           push    r14
 280:   ff 92           push    r15
 282:   cf 93           push    r28
 284:   df 93           push    r29
 286:   6b 01           movw    r12, r22
 288:   7c 01           movw    r14, r24
    uint16_t start = (uint16_t)micros();
 28a:   d3 df           rcall   .-90        ; 0x232 &lt;micros&gt;
 28c:   eb 01           movw    r28, r22

    while (ms &gt; 0) {
 28e:   c1 14           cp  r12, r1
 290:   d1 04           cpc r13, r1
 292:   e1 04           cpc r14, r1
 294:   f1 04           cpc r15, r1
 296:   79 f0           breq    .+30        ; 0x2b6 &lt;delay+0x3c&gt;
        yield();
 298:   ea d0           rcall   .+468       ; 0x46e &lt;yield&gt;
        if (((uint16_t)micros() - start) &gt;= 1000) {
 29a:   cb df           rcall   .-106       ; 0x232 &lt;micros&gt;
 29c:   6c 1b           sub r22, r28
 29e:   7d 0b           sbc r23, r29
 2a0:   68 3e           cpi r22, 0xE8   ; 232
 2a2:   73 40           sbci    r23, 0x03   ; 3
 2a4:   a0 f3           brcs    .-24        ; 0x28e &lt;delay+0x14&gt;
            ms--;
 2a6:   81 e0           ldi r24, 0x01   ; 1
 2a8:   c8 1a           sub r12, r24
 2aa:   d1 08           sbc r13, r1
 2ac:   e1 08           sbc r14, r1
 2ae:   f1 08           sbc r15, r1
            start += 1000;
 2b0:   c8 51           subi    r28, 0x18   ; 24
 2b2:   dc 4f           sbci    r29, 0xFC   ; 252
 2b4:   ec cf           rjmp    .-40        ; 0x28e &lt;delay+0x14&gt;
        }
    }
}
 2b6:   df 91           pop r29
 2b8:   cf 91           pop r28
 2ba:   ff 90           pop r15
 2bc:   ef 90           pop r14
 2be:   df 90           pop r13
 2c0:   cf 90           pop r12
 2c2:   08 95           ret




That appears to confirm that the code in wiring.c is indeed what is being used on the ATtiny85 core:



void delay(unsigned long ms)
{
    uint16_t start = (uint16_t)micros();

    while (ms &gt; 0) {
        yield();
        if (((uint16_t)micros() - start) &gt;= 1000) {
            ms--;
            start += 1000;
        }
    }
}


Turning interrupts off and then doing a delay is a Bad IdeaTM.




  So i would rather have a counter for the watchdog in order to wait for the specified time?


Using the watchdog timer is certainly one way of waiting for 4 seconds.