Time / Delays — pymcu.time#
from pymcu.time import delay_ms, delay_us
Busy-wait delay functions calibrated to the target clock frequency. No hardware timer is consumed — delay loops use counted CPU instruction cycles.
delay_ms(ms: uint16)#
Busy-wait for approximately ms milliseconds.
msmay be a runtime variable (uint16).Maximum: 65 535 ms (~65 seconds).
On AVR at 16 MHz: 21 outer × 255 inner × 3 cycles ≈ 1 ms per iteration.
delay_us(us: uint8)#
Busy-wait for approximately us microseconds.
usmay be a runtime variable (uint8).Maximum: 255 µs.
Accurate for
us >= 4on ATmega328P at 16 MHz.
Example#
from pymcu.time import delay_ms, delay_us
from pymcu.hal.gpio import Pin
def main():
led = Pin("PB5", Pin.OUT)
while True:
led.high()
delay_ms(500)
led.low()
delay_ms(500)
Notes#
Interrupts are not disabled during delay loops. An ISR executing during a delay will extend it by the ISR duration.
For precise, non-blocking timing, use hardware timer interrupts (
@interrupt+ Timer0/1/2).delay_ms(0)returns immediately without spinning.
millis() and micros()#
For elapsed-time measurements, use millis() and micros():
from pymcu.time import millis, micros
from pymcu.types import uint32
start: uint32 = millis()
# ... do work ...
elapsed: uint32 = millis() - start
These use a Timer0 overflow ISR to maintain a 32-bit counter. They require Timer0 to be
running with prescaler 64 (the default). The counter is read atomically under CLI/SEI.