Minuteur - Oscillateur par instruction

M

Maverickmax

Guest
Salut

/ * Définir inital Timer 0 / Timer 1 valeur pour ~ 50uS retard * /
) / (OSC_PER_INST)))

# define T_50micros (66536 - (tWord) ((OSC_FREQ / 26000)
/ (OSC_PER_INST)))
# define T_50micros_H (T_50micros / 256)
# define T_50micros_L (T_50micros% 256)

/ * Définir inital Timer 0 / Timer 1 valeur pour ~ 10 ms de retard * /) / (OSC_PER_INST)))

# define T_10ms (66536 - (tWord) ((OSC_FREQ * 100)
/ (OSC_PER_INST)))
# define T_10ms_H (T_10ms / 256)
# define T_10ms_L (T_10ms% 256)

/ * Définir inital Timer 0 / Timer 1 valeur pour ~ 15 ms de retard * /) / (OSC_PER_INST)))

# define T_15ms (66536 - (tWord) ((OSC_FREQ * 67)
/ (OSC_PER_INST)))
# define T_15ms_H (T_10ms / 256)
# define T_15ms_L (T_10ms% 256)

/ * Définir inital Timer 0 / Timer 1 valeur pour ~ 20 ms de retard * /) / (OSC_PER_INST)))

# define T_20ms (66536 - (tWord) ((OSC_FREQ * 20)
/ (OSC_PER_INST)))
# define T_20ms_H (T_10ms / 256)
# define T_20ms_L (T_10ms% 256)Quelqu'un peut-il me dire pourquoi osc / 26000 pour 50US, OSC * 100 pour 10ms, osc * 67 pour les 15ms et OSC * 20 pour les 20ms?

J'utilise le logiciel Keil (Performance Analyser) pour mesurer le temps moyen pour mon temps voulu.Vais-je obtenir le même résultat de ma puce de microcontrôleur?

Maverick Max

 
En 8051 seul cycle machine se compose de 12 cycles d'horloge et des minuteries incrémenté chaque fois par cycle de la machine.Ainsi un timer en cours d'exécution sera incrémenté:
pour OSC_FREQ / OSC_PER_INST fois par second.So le temps pour chaque incrément est OSC_PER_INST / OSC_FREQ.

OSC_FREQ où est la fréquence d'horloge et OSC_PER_INST est de 12.

En 8052 tous les compteurs sont en hausse de comptage de minuteries.Pour générer interruption pendant 20 millisecondes, le chef d'accusation soit
chargé est 0xFFFF - (20 millisecondes / (OSC_PER_INST / OSC_FREQ).

ce qui équivaut à 63536 - ((20 millisecondes * OSC_FREQ) / OSC_PER_INST)
ce qui équivaut à 63536 - ((20 * OSC_FREQ) / OSC_PER_INST) si OSC_FREQ est défini dans KHZ

par exemple si l'on prend OSC_FRQ de 12 MHz, dans ce cas 1 milliseconde besoins augmentation de 1000.
Donc, pour 20 millisecondes, il est 20000.Donc, la macro est correct pendant 20 millisecondes.

Je suis déconcerté par macroes, si OSC_FREQ & OSC_PER_INST sont fixes, ils ne peuvent pas être corrects à ma connaissance.Une simple est de 10 millisecondes il devrait être de 10 pas 100.
# define T_15ms (66536 - (tWord) ((OSC_FREQ * 67) / (OSC_PER_INST)))seront becorrect Si changée à# define T_15ms (66536 - (tWord) ((OSC_FREQ / 67) / (OSC_PER_INST)))
# define T_50micros (66536 - (tWord) ((OSC_FREQ / 26000) / (OSC_PER_INST)))sera correcte s'il a été changé à# define T_50micros (66536 - (tWord) ((OSC_FREQ / 20000) / (OSC_PER_INST)))
# define T_10ms (66536 - (tWord) ((OSC_FREQ * 100) / (OSC_PER_INST)))sera correcte s'il a été changé à# define T_10ms (66536 - (tWord) ((OSC_FREQ / 100) / (OSC_PER_INST)))
pour l'ensemble des macroes ci-dessus OSC_FREQ est en Hz
La logique est15 millisecondes est 67e partie d'une seconde.
1000 / 15 = 66,66666667.10 millisecondes fait partie 100ème de seconde.
1000 / 10 = 10050 millisecondes est 20000ème partie d'une seconde 1000000 / 50 = 20000
Mais ce décalage dans le temps donne raison de l'arrondissement 66.666667-67

Si 20 millisecondes macro également être iwritten de la même manière, il est# define T_20ms (63536 - ((OSC_FREQ / 50) / OSC_PER_INST))
que 20 millisecondes est partie 50 ème de seconde, 1000/20 = 50S'il vous plaît laissez-moi maintenant, si je me trompe ou il ya une certaine logique cachée.

À la vôtre

 

Welcome to EDABoard.com

Sponsor

Back
Top