comment afficher meesage à cristaux liquides d'utiliser le téléphone

C

crocklip

Guest
Salut,

J'utilise un PIC 16F877A-
J'essaie de trouver la période d'un signal d'entrée à une broche d'entrée.Pour le faire, je démarrer la minuterie (TMR0) lorsque l'entrée de la broche passe au niveau haut pour la première fois.après 20 périodes du signal d'entrée, je l'arrêter.En faisant cela, je peux diviser la valeur de la minuterie à ce point par 20, puis multiplier le résultat par la durée de la minuterie.Cela devrait me donner la période du signal d'entrée ...Donc ma question est peut-PIC gérer le code suivant:

timer_time = (((0xFF) * (overflow_acc) TMR0) * (1/0.000064));signal_period = (timer_time/20);

où 0.000064 est la période de la minuterie (TMR0)

J'utilise le compilateur C-TECH HI.

Toute aide serait super,

Merci

 
Salut!
Je pense que oui.Mais le meilleur moyen de vérifier cela est de simuler le code dans MPLAB.En passant pourquoi n'utilisez-vous pas la capture de comparer module du contrller.Il suffit d'enregistrer les valeurs des 20 légumes secs et les ajouter pour obtenir le temps total.
Cordialement.

 
Hai,

Il suffit de consulter l'option PCC PIC.C'est la meilleure façon de trouver la période de temps entre deux signaux.Essayez

Cordialement
Gopi

 
Hey,
J'ai vérifié le module CCP qui soutient ce que je veux faire, mais quelque chose qui ne marche pas theres permettez-moi de l'utiliser:
il y aura 6 signaux d'entrée différents dans PortB que j'ai besoin de goûter l'une après l'autre, mais il ya seulement deux comparer / capture broches du PIC (CCP1, CCP2).

Quoi qu'il en soit j'ai essayé de simuler le programme en utilisant la méthode ci-dessus mais il ne semble pas vouloir être en mesure de gérer cette ligne en particulier.

Merci pour l'aide

 
Salut!
Je veux vous dire quelque chose qui va vous aider.Si MPLAB n'est pas la simuler, alors il ya de grandes chances qu'il ne fonctionne pas comme cela s'est déjà produit avec moi.Essayez de briser l'équation en petits équations, puis ajouter les résultats à obtenir le résultat de l'équation complète.Quoi qu'il en soit tenter votre chance.
Cordialement.

 
A peu de choses je remarque au sujet de votre code.Tout d'abord, voulez-vous dire à utiliser:

timer_time = (0x100 * overflow_acc TMR0) * 0.000064;

Ensuite, il semble que vous utilisez un prédiviseur de 64 à 4 MHz d'horloge.Vous seriez plus précis si vous utilisez un prédiviseur de 1 (parce que vous ne connaissez pas la valeur dans le diviseur).Bien sûr, vous aurez à gérer la overflow_acc 64 fois plus souvent.

En outre, si timer_time est un entier et vous multipliez par 0.000064, comme je le propose, vous perdrez la quasi-totalité de votre précision.Avez-vous pensé de l'expression de la période en nous?Si timer_time est une valeur en virgule flottante, ce n'est pas un problème.

 
ainsi, j'ai utilisé 0xFF parce que quand cela est multiplié par le débordement de l'accumulateur, le résultat sera le montant réel de fois la minuterie à vélo.0xFF étant la valeur maximale de la minuterie-bit 8 peut incrémenter d'avant débordement.
Je serais plus qu'heureux de post / e-mail le programme court, si il vous aider à m'aider!
Merci à ce jour

 
Je suppose que je ne suis pas comprendre la nature de votre problème.

Je suppose ce qui suit:

1.Votre code se compile, mais vous obtenez un résultat étrange lorsque vous simuler.
2.Lorsque vous êtes le calendrier, vous déborde TMR0 overflow_acc incrément à chaque fois grâce à une interruption du scrutin ou par TOIF ou autre.
3.Le temps qu'il faut pour TMR0 pour incrémenter par l'un est 0,000064 secondes (64 US).

Si tel est le cas, alors la période est

(Minuterie incréments de temps) = overflow_acc * 256 TMR0
en secondes) = temps ((minuterie incréments de temps) * 0.000064 secondes par tranche
= période de temps (en secondes) / 20

Vous pouvez faire cela en une ligne:

signal_period = (overflow_acc * 256 TMR0 ) * 0,000064 / 20;

Si signal_period est un entier, je veux dire, vous gardez signal_period en nous, afin que vous utiliseriez:

signal_period = (overflow_acc * 256 TMR0 ) * 64 / 20;

Aujourd'hui, environ 255 (0xFF) vs 256 (0x100).TMR0 gammes de 0x00 à 0xFF.Si vous comptez les cycles qu'il faut pour dépassement de vous 0x100 (0xFF - 0x00 0x01).Supposons que, pour une seconde que vous avez overflow_acc = 2 et TMR0 = 255.Utilisation de 255 * TMR0 overflow_acc vous obtenez 765.Maintenant, laisse augmentation une fois de plus pour que déborde et TMR0 overflow_acc augmentation de nous.Maintenant, nous avons overflow_acc = 3 et TMR0 = 0.Utilisation de 255 * TMR0 overflow_acc vous obtenez 765.Voyez-vous un problème ici?

Permettez-moi de savoir si mes hypothèses sont fausses.

 
Jon,

Vous êtes sur place avec vos hypothèses.Je vois vraiment pas pourquoi le programme ne doit pas simuler correctement et qu'il soit frustrant moi trop longtemps.le programme est d'échantillonner la fréquence d'une corde de guitare et de mettre une broche si son trop élevé et un autre si son trop faible et les deux si son égal.Je pense que je devrais simplement inclure le code dans ce message pour le rendre plus facile pour vous.À certains moments, j'ai commenté le code précédent que j'utilisais avant vos suggestions afin de simplement ignorer ce genre de choses.
Espérons que cela peut aider,
Merci

/ / Code de goûter l'entrée d'une corde de guitare (E)
/ / Dont le signal est entrée à la broche RB1
/ / Si la fréquence du signal est trop élevé,
/ / RB0 passe au niveau haut.Si au plus bas RB2 passe au niveau haut.

# Include <pic.h>
# Include <htc.h>
# Include <math.h>
# Define TIMER_PERIOD 0.000064# Define E_STRING 110 / / fréquence de chaîne E

# Define 1/E_STRING CENTER_COUNTvolatile unsigned int overflow_acc;/ / Span guitare note Le
/ / # # # # # # # # # #
/ / BC D EF EF GA GA BC DE
/ / 1 2 3 4 * 5 6
/ /
Recharger char près = 0;
/////////////// Service de routine pour timer 0 //////////////////////// interruption
void interrupt
timer0_isr (void)
(
if (reload == 0) (
/ / Effectuer un changement sur PORTB chaque fois que notre période souhaitée est atteinte.
/ / Note Ce calendrier contient une marge d'erreur.
overflow_acc ;
/ / Effectuer un changement sur le PORTB
)
reload -;
T0IF = 0;
)
////////////////////////////////////////////////// ///////////////////////////////------------------------------------------------ ----------------------------
/ / Boucle principale
//------------------------------------------------ ----------------------------

int main (void)

(
//------------------------------
/ / Initialisation
//------------------------------
timer_time double;
signal_period int;
all_timer int;
dépassement des entiers;
unsigned int i;
TRISB = 2; / / RB1 est entrée
/ / RB0 est ouput, élevée LED
/ / RB2 est ouput, Basse LED
RB1 = 0; / / pas pullups active

T0CS = 0;
/ / PS2 = 1; / / set prédiviseur à 1:64
/ / PS1 = 0; / / '' '' '' '' '' '
/ / PS0 = 1; / / '' '' '' '' '' '
/ / PSA = 0; / / SET DE Prescaler TMR0

TMR0IE = 1; / / permettre d'interrompre le timer overflow
GIE = 1; / / interruption globale permettra

while (1)
if (RB1)
(Break;)while (1)
(
overflow_acc = 0;
TMR0 = 0x00;
for (i = 0; i <20; i )// cycle à 20 périodes
(While (1)
if (! RB1)
(Break;)
while (1)
if (RB1)
(Break;)
)signal_period = (overflow_acc * 256 TMR0 ) * 64 / 20;
/ / Timer_time = (((0xFF) * (overflow_acc) TMR0) * (TIMER_PERIOD));
/ /
/ /
/ / Overflow = ((0xFF) * (overflow_acc));
/ / All_timer = (débordement de TMR0 );
/ / Timer_time = ((all_timer) * (TIMER_PERIOD));

/ / Signal_period = (timer_time/20);

if (<= signal_period CENTER_COUNT)
RB0 = 1;
if (> = signal_period CENTER_COUNT)
RB2 = 1;

)

)

 
Changement

# Define 1/E_STRING CENTER_COUNT

à

# Define 1000000/E_STRING CENTER_COUNT

Puis essayer.Aussi, pour aider à la précision, de remplacer le

signal_period = ****

avec

= TMR0 time_stop;
signal_period = (overflow_acc * 256 time_stop ) 64 / 20 *;

time_stop peut être un octet non signé.

Pour votre demande, vous n'avez pas vraiment besoin autant de précision que signal_period vous obtenez, mais il va probablement fonctionner quand même.

Peut-être que cela fonctionnera

 
l'origine, je voulais en venir les résultats de simulations de RB2 à haute quelle que soit la fréquence d'entrée.Maintenant, je veux en venir RB0 à haute quoi qu'il arrive.BTW devrait pas être le 64us 1US pour la période de timer?(Minuterie freq = 1 MHz).
de toute façon je suis aide d'un simulateur PIC IDE et peut-être le problème réside dans le simulateur.Je vais aller de l'avant et le programme de la puce avec ce que j'ai et voir ce qui se passe.Merci à tous pour l'aide.

 
Vous pouvez soit utiliser 1US ou un prédiviseur de 64 ans.Les deux s'excluent mutuellement alors quoi que vous fassiez, être conforme au long du programme.

J'aime votre code d'origine, où vous avez nommé les constantes (TIMER_PERIOD), etc

Étape par le biais (ou de l'échec à l'intérieur) de votre simulation et d'essayer de donner un sens à ce qui se passe ici.

Bonne chance

 
Salut,

J'ai essayé le code de la puce et branché.Cette fois cependant, contrairement à la simulation, je n'ai pas de sortie à tous.Si quelqu'un peut voir aucun problème avec le code je serais ravi de l'entendre.
Qui a dit "si les travaux d'expérimentation, puis quelque chose s'est mal passé"?!

 

Welcome to EDABoard.com

Sponsor

Back
Top