2017-08-10 2 views
0

Y at-il une fonction de retard peut être utilisé pour PIC18F4550 en programmation C, similaire à delay() et delayMicroseconds() dans Arduino?fonction de retard dans pour PIC18F4550

Les fonctions de retard que vous pouvez trouver sont Delay10KTCYx(), Delay10TCYx() et etc, ce qui est très difficile à générer le délai que nous voulions, et le délai le plus bas n'est même pas en millisecondes.

Veuillez chercher vos aides, s'il vous plaît. Merci

+3

http://thinkinbinary.blogspot.nl/2013/04/generating-time-delays.html – Lanting

+2

Le meilleur moyen est d'utiliser la minuterie. Toutes les autres méthodes fonctionnent bien sur un UC très simple, mais échouent sur les plus décents. les retards codés en dur devraient être évités de toute façon comme une très mauvaise habitude de programmation. –

Répondre

1

Lors de la programmation du microcontrôleur, vous devez toujours utiliser les minuteries matérielles sur puce si possible. Il y en a généralement plusieurs et peut-être même une horloge en temps réel. Plutôt que de rechercher une fonction de délai d'occupation, vous devez rechercher un pilote ou une couche HAL autour des temporisateurs matériels présents dans votre pont de conférence. En outre, si vous avez besoin d'une résolution supérieure à 1 ms, notez que les fonctions de "retard" ont tendance à être imprécises.

Occupé retard() fonctions/boucles sont la plupart du temps une solution rapide & amateur sale. Ils sont mauvais parce que:

  • Ils consomment 100% CPU et ainsi 100% de puissance.
  • Ils ont un couplage étroit avec le compilateur et ses réglages. Différents niveaux d'optimisation peuvent casser ces retards.
  • Ils ont un couplage étroit avec l'horloge du système, alors que les pilotes de minuterie sur puce spécifient généralement quelle horloge utiliser en tant que paramètre et ajustent la mise à l'échelle en conséquence.
  • Ils ne sont généralement pas très précis.
  • Dans l'ensemble, ils n'ont pas nécessairement un comportement déterministe.
+0

Je pense que c'est un mauvais conseil pour ce petit micro (PIC18F4550, Flash 32K, SRAM 2K, pas quelque chose qui serait normalement utilisé avec un OS de plus haut niveau). Au démarrage lorsque le programme configure le matériel, des retards peuvent être utilisés en tant qu'exigences matérielles particulières, pendant l'exécution du programme, pendant quelques microsecondes aussi les retards sont la meilleure pratique, ne nécessitant aucune ressource "externe" (telle qu'une minuterie). La fréquence de base des minuteurs est généralement aussi l'horloge du système, donc pas de victoire non plus. Bien sûr, le délai doit être une routine d'assembleur (éventuellement générée). – Jubatian

+0

@Jubatian Non, ce conseil s'applique parfaitement pour un MCU nu en métal. Pour tout programme MCU de toute sorte, vous aurez besoin d'une sorte de minuterie générique. Ceci est mieux mis en œuvre via un RTC ou l'un des périphériques de la minuterie. Une fois que vous avez cela, vous pouvez facilement implémenter une fonction comme 'delay (ms)'. Pour des délais plus courts avec nous, vous devez utiliser une minuterie intégrée sur puce. Et oui, la source sera l'horloge du système, mais si votre pilote de minuterie connaît l'horloge du système et la fréquence désirée, il peut choisir les paramètres pré-scaler en conséquence - ce qui est une grande victoire. – Lundin

+0

Idem pour un code de retard correctement généré (à la fois un paramètre prédéfini et un code généré est le temps de compilation!), Sans utiliser une minuterie précieuse (qui sont également rares sur de si petits micros!). Le code de retard produit un délai minimum garanti (une interruption IT peut l'allonger, mais si le processus global y est sensible, cela n'a pas d'importance s'il se déclenche dans le délai ou ailleurs). Ce que vous suggérez est bon pour le contrôle de processus, là, il est en effet fortement recommandé sur n'importe quoi, mais ce que l'OP demande ressemble plus à un interfaçage HW spécial à une plage de microsecondes. – Jubatian