El valor del contador TCC en un controlador ATSAM siempre se lee como cero

0

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í.

    
pregunta vsz

1 respuesta

1

Hay un comando en el registro de control B, que se llama "Forzar la sincronización de lectura COUNT". Parece que el contador no se puede leer sin emitir este comando.

Por ejemplo, esto me funcionó:

while (TCC0->SYNCBUSY.bit.CTRLB);
TCC0->CTRLBSET.bit.CMD = TCC_CTRLBSET_CMD_READSYNC_Val;
while (TCC0->SYNCBUSY.bit.CTRLB);
while (TCC0->SYNCBUSY.bit.COUNT);

Después de esto, el valor del contador se puede leer desde TCC0->COUNT.bit.COUNT . Asumiría que la vara que leí era el valor que tenía cuando emití el comando TCC0->CTRLBSET.bit.CMD = TCC_CTRLBSET_CMD_READSYNC_Val; .

Puede encontrar más información en este (otro tema) del foro de Arduino: enlace

Parece que los foros de Arduino no están tan bien organizados con respecto a las preguntas duplicadas como SE.

    
respondido por el vsz

Lea otras preguntas en las etiquetas