2 votes

Existe-t-il une fonction standard en C qui permette de définir un délai spécifique en nSec ?

Dans mon application, je dois générer une fonction en C qui fournira une temporisation spécifique en nano secondes. Cette temporisation doit être faite en logiciel car je n'ai plus de temporisateurs matériels dans mon AVR MCU. Mon problème est que je voudrais pouvoir régler la valeur en nanosecondes. L'horloge de mon MCU est de 20MHz (période de 50nS). J'ai pensé à une boucle "for" rapide, comme ;

for (n=0; n<value; n++)

mais cela ne prend pas en compte le nombre de cycles ajoutés à chaque tour de boucle lors de la compilation. Quelqu'un a-t-il des suggestions à faire ? Je n'ai vraiment pas envie d'écrire le code en assembleur.

1voto

dunajski Points 359

Vous nous donnez trop peu d'informations, mais je pense que je peux répondre sans elles, mais cela rend la réponse longue. Commençons par le problème le plus simple, c'est-à-dire que vous avez cette situation où votre action doit être exécutée moins de fois que l'action la plus fréquente est exécutée. Par exemple, vous devez envoyer un octet toutes les 1s mais votre isr s'exécute toutes les 1ms. Donc en bref, vous devez envoyer un octet toutes les 1000 exécutions de l'ISR, puis vous créez un compteur dans l'ISR qui s'incrémente à chaque ISR et quand il atteint 1000, vous envoyez l'octet et mettez le compteur à 0.

ISR()
{
  cnt++;
  if(cnt >= 1000)
  {
    execute(Z);
    cnt = 0;
  }
}

Lorsque vous avez un problème opposé, isr est plus lent que le temps désiré pour exécuter vos actions alors je suis pour revoir votre utilisation des timers. Vous devriez alors faire en sorte que cet ISR s'exécute plus rapidement et ensuite diviser le temps en comptant l'isr exectué comme je l'ai décrit ci-dessus. Ceci a été mentionné dans les commentaires.

Je vous suggère de repenser la façon dont vous utilisez les minuteurs.

0voto

David Grayson Points 22459

Puisque vous utilisez un AVR, vous devriez envisager d'utiliser les fonctions de retard de l'AVR-Libc, _delay_us y _delau_ms qui sont documentés ici :

https://www.nongnu.org/avr-libc/user-manual/group__util__delay.html

Ils sont standard dans le contexte des AVRs, mais pas standard pour tous les environnements C en général.

Quelques exemples de code pour vous aider à démarrer :

#define F_CPU 20000000
#include <util/delay.h>

int main() {
  while (1) {
    _delay_us(0.05);
  }
}

Notez que même si le _delay_us y _delay_ms Les fonctions prennent chacune un double comme argument, toute l'arithmétique en virgule flottante est effectuée au moment de la compilation si possible afin de produire un code efficace pour votre délai.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X