import machine
import time
import micropython
# Reservar búfer de emergencia para excepciones dentro de la ISR
micropython.alloc_emergency_exception_buf(100)
# ============================================================================
# CONFIGURACIÓN DE HARDWARE (GPIO)
# ============================================================================
# LED controlado por la Interrupción del Timer
led_timer = machine.Pin(6, machine.Pin.OUT)
# LEDs controlled por el Bucle Principal (Main Loop)
led_main_1 = machine.Pin(7, machine.Pin.OUT)
led_main_2 = machine.Pin(8, machine.Pin.OUT)
# ============================================================================
# RUTINA DE SERVICIO DE INTERRUPCIÓN (ISR)
# ============================================================================
# NOTA: Debe recibir el objeto timer como argumento, incluso si no se usa.
def isr_parpadeo_led(timer):
led_timer.toggle() # Operación segura y rápida a nivel de registro
print("Interrupcion Led Rojo.")
# ============================================================================
# INICIALIZACIÓN DEL TIMER
# ============================================================================
# Usamos -1 para el Timer Virtual del RP2040/RP2350
temporizador = machine.Timer(-1)
# Configurar el timer para que parpadee cada 200 ms de forma periódica
temporizador.init(period=200, mode=machine.Timer.PERIODIC, callback=isr_parpadeo_led)
print("Sistema iniciado de forma asíncrona...")
print("- GPIO 6: Controlado por Hardware Timer (Cada 200ms)")
print("- GPIO 7 y 8: Controlados por el Bucle Principal (Cada 500ms)")
# ============================================================================
# BUCLE PRINCIPAL (MAIN LOOP)
# ============================================================================
try:
while True:
# Alternar los dos LEDs del hilo principal simultáneamente
led_main_1.toggle()
print("Led Verde")
led_main_2.toggle()
print("Led Azul")
# El sleep de 500ms solo pausa el hilo principal,
# el hardware timer interrumpirá este sleep de forma exacta cada 200ms.
time.sleep_ms(500)
except KeyboardInterrupt:
# Acción correctiva al detener el script
temporizador.deinit()
# Apagar todos los pines por seguridad
led_timer.off()
led_main_1.off()
led_main_2.off()
print("\nPrograma detenido y temporizador desinicializado.")