Problema de sincronización de cbi / sbi Atmega8

0

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
    
pregunta Ankit

1 respuesta

0

Después de un poco de solución de problemas encontré la respuesta.

Estaba viendo un comportamiento bastante esporádico con respecto al tiempo. A veces obtendría el tiempo correcto de 62.5ns y otras veces no.

Después de eliminar todas las posibilidades, tenía que ser el cristal.

Reemplazando el cristal solucionó el problema. Todos los tiempos son ahora correctos

    
respondido por el Ankit

Lea otras preguntas en las etiquetas