Parece que tengo un problema extraño con respecto a las instrucciones de cbi / sbi en Atmega8-16AU.
Lo tengo conectado a un cristal externo de 16Mhz.
Puedo verificar que se está ejecutando a 16Mhz usando _delay_ms(1000)
y verificando con un analizador lógico que efectivamente se produce un retraso de 1 segundo durante el cambio de un pin de salida.
Sin embargo, cuando llamo a la siguiente función de ensamblaje:
asm_toggle:
sbi PORTC,4
cbi PORTC,4
ret
Espero que la PC4 sea ALTA para 2 ciclos de reloj ((1 / 16M) * 2) o 0.125us. Sin embargo, cuando verifico el uso de un analizador lógico, ¡el pin es realmente ALTO para 1.5us! Eso es casi 24 ciclos.
Comprendo que algunos ciclos se usarían para saltar y regresar a la función desde la rutina principal, pero eso no debería afectar el tiempo de ALTA real del pin PC4.
¿Puede alguien explicar qué está pasando aquí? Tengo la sensación de que me estoy perdiendo algo muy básico aquí.
No hay interrupciones en ejecución y mi configuración de fusible es
LFuse : 0xFF
HFuse : 0xC9