Utilizo un ATSAMD21 para generar una señal personalizada con la ayuda de un generador PWM.
Básicamente, configuro TCC0 como un generador PWM, y uso su interrupción de desbordamiento para configurar los registros CC para el siguiente pulso. Todo funciona bien, la señal se ve como debería ser. Sin embargo, como es importante que la interrupción ocurra antes del cambio de polaridad más corto posible en mi señal, quise verificar la latencia de la interrupción para detectar un posible caso de falla. Eso debería ser tan simple como verificar el registro COUNT
al comienzo de la interrupción, ¿no es así?
Sin embargo, el registro COUNT
siempre se lee como cero.
No importa si uso REG_TCC0_COUNT
o TCC0->COUNT.bit.COUNT
, siempre se lee como 0. Puedo estar seguro de que el valor real del contador no es cero, porque el temporizador está configurado en un reloj muy rápido generador, y en el osciloscopio puedo ver que la latencia de interrupción típica es donde el contador ya debería estar alrededor de 100.
Curiosamente, puedo escribir en el registro COUNT
. Si lo hago, puedo verificar que el siguiente pulso se acorte en la cantidad correspondiente. Y después de escribir, si lo leo, leo el valor que acabo de escribir.
Como el mismo procesador se usa en Arduino Zero, este problema ya se había preguntado en los foros de Arduino hace unos años, pero todavía no hay respuesta:
Una de las soluciones propuestas fue esperar a que se borrara SYNCBUSY
, pero no funcionó, ni para el póster en el foro de Arduino, ni para mí.