from array import array
import micropython
from machine import Pin, Timer, disable_irq, enable_irq
from time import sleep_ms
PRIMARY_LED_PIN = 2
SECONDARY_LED_PIN = 4
PRIMARY_TIMER_ID = 0
SECONDARY_TIMER_ID = 1
PRIMARY_PERIOD_MS = 1000
SECONDARY_PERIOD_MS = 500
MAX_TIMER_EVENTS = 20
micropython.alloc_emergency_exception_buf(100)
primary_led = Pin(PRIMARY_LED_PIN, Pin.OUT)
secondary_led = Pin(SECONDARY_LED_PIN, Pin.OUT)
primary_led.off()
secondary_led.off()
primary_timer = Timer(PRIMARY_TIMER_ID)
secondary_timer = Timer(SECONDARY_TIMER_ID)
timer_count = array("I", [0])
def primary_timer_callback(timer):
if timer_count[0] < MAX_TIMER_EVENTS:
timer_count[0] += 1
primary_led.value(1 - primary_led.value())
def secondary_timer_callback(timer):
secondary_led.value(1 - secondary_led.value())
def read_timer_count():
irq_state = disable_irq()
count = timer_count[0]
enable_irq(irq_state)
return count
def stop_timers():
primary_timer.deinit()
secondary_timer.deinit()
primary_led.off()
secondary_led.off()
def main():
timer_count[0] = 0
primary_led.off()
secondary_led.off()
primary_timer.init(
period=PRIMARY_PERIOD_MS,
mode=Timer.PERIODIC,
callback=primary_timer_callback
)
secondary_timer.init(
period=SECONDARY_PERIOD_MS,
mode=Timer.PERIODIC,
callback=secondary_timer_callback
)
print("Hardware timers started")
print("Timer 0 period: 1000 ms")
print("Timer 1 period: 500 ms")
last_reported_count = 0
try:
while True:
count = read_timer_count()
# Print every Timer 0 event
while last_reported_count < count:
last_reported_count += 1
print(
"Timer count:",
last_reported_count
)
# Every 5 seconds
if last_reported_count % 5 == 0:
print(
"5-second interval reached"
)
# Stop after 20 events
if count >= MAX_TIMER_EVENTS:
print("Timer stopped.")
break
sleep_ms(10)
finally:
stop_timers()
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
stop_timers()
print("Exercise 2 stopped by user")