L'écriture d'un retard de la sous-routine?
J'ai besoin d'écrire un retard de sous-routine. Il devrait délai d'environ 1 seconde. Ça doit être pour 8051 environnement, DS89C430 micrcontroller ( 11.0592 MHz XTAL). Comment puis-je écrire cette sous-routine?
Delay1sec: ...
....
...
....
...
Vous devez vous connecter pour publier un commentaire.
Pour obtenir exactement 1 seconde de retard qui fonctionne également pendant les interruptions, vous devez utiliser une horloge matérielle, pas un logiciel de minuterie. Je vous conseille d'utiliser l'un des disponible à bord des minuteries comme suggéré par Jerry Cercueil.
Voici une approche impliquant une minuterie intégrée et de comptage du minuteur de débordements. Depuis le minuteur est mis à jour toutes les 12 cycles d'horloge par défaut pour maintenir la compatibilité avec le 8051, il sera mis à jour 921,600 fois par seconde. Un peu de multiplication nous dit qu'il faut 50 ms à compter de 0 à 46080, qui nous dit aussi que nous pouvons commencer une 16-bits horloge au 19456 et attendre pour dépassement de 20 fois de retarder pendant 1 seconde*.
Le code pourrait ressembler à quelque chose comme ceci:
Remarque: les frais Généraux de l'exécution des instructions temps exclu de l'exemple.
* Comment les mathématiques se décompose de:
11059200 /12 = 921600
0.05 * 921600 = 46080
65536 - 46080 = 19456 = 0x4C00
Logiciel de retard boucles de déchets de temps processeur et sont perturbés par des interruptions. Cela étant dit, vous pouvez le faire de la codé en dur chemin.
Une approche implique de connaître le nombre de cycles d'horloge par cycle de la machine et le nombre de cycles machine diverses instructions pour exécuter. Selon le fiche de données de, le DS89C430 utilise généralement un cycle de la machine pour chaque instruction octet et nécessite un cycle d'exécution. Le nombre de cycles pour chaque instruction est fournie dans le Ultra-Haute Vitesse de Flash du Microcontrôleur Guide de l'Utilisateur.
Depuis votre fréquence du quartz est 11.0592 MHz, votre routine devra retard pour 11,059,200 cycles d'horloge. Ceci est souvent accompli par boucles imbriquées de longueur connue, et l'intégration de toute boucle supplémentaire d'installation et éventuellement sous-routine d'appel et des instructions de retour*.
La fonction pourrait ressembler à quelque chose comme ceci:
Nous allons voir comment les mathématiques se décompose**:
l1
= 4 * 256 = 1024 cyclesl2
= (1024 + 4) * 256 = 263168 cyclesl3
= (263168 + 4) * 42 = 11053224 cyclesDelay1sec
= 11072668 + 3 + 2 + 2 + 2 + 3 = 11053236 cycles11053236 cycles * 1/11059200 secondes/cycle = 999.461 ms
* La sous-routine d'appel et des instructions de retour peuvent être omis si nécessaire.
** j'ai utilisé Microsoft Excel pour aider avec les calculs liés à la détermination des compteurs de boucle.
Ce microcontrôleur a trois à bord des chronomètres (voir la section 11 de la Manuel de l'utilisateur) connecté au système d'horloge (divisé par 12), c'est donc une question de programmation pour générer une interruption lorsque le temps expire. Depuis la séparation de l'entrée est un peu moins de 1 MHz, et le plus grand compteur de 16 bits, vous aurez besoin de compter 14 interrompt pour atteindre une seconde (au moins si j'ai fait le calcul correctement).
A) Référence à une horloge matérielle.
B) Référence de l'UC de la minuterie. Certains processeurs ont un très large à rebours, c'est à dire 64 bits de large, qui s'exécute à l'horloge.
C) Boucle Du Logiciel. Pour de meilleurs résultats, le code et toutes les données doivent résider dans la mémoire interne qui a la prévisibilité de la durée. L'exécution de la SDRAM peut causer des problèmes de synchronisation.
Vous n'avez pas à compter les cycles d'assemblage pour le faire. Au lieu de cela, vous pouvez "tirer" une impulsion sur la broche (traction élevée avant la boucle, tirez faible après la boucle), la mesure de la largeur d'impulsion à l'aide d'une logique anlayzer, puis changement de nombre de boucles pour régler les timings. Pour de meilleurs résultats, vous devez compenser contre l'externe de l'horloge du PROCESSEUR/cristal, à l'aide d'un compteur de fréquence à mesurer, puis de compenser en étant loin de la fréquence centrale, parce que la plupart bon marché de cristaux ne sont pas morts à la.
Vous pourriez auto-calibrer à l'aide d'un chronomètre pour calculer la boucle de chronométrage.