Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Trouvez l'erreur ? interruption ou timer ?
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#11 Message par Guest » dim. 20 sept. 2015 16:40

bon bien je te laisse bossé on en reparle plus tard si tu veux

bon courage a toi

A+

Trouvez l'erreur ? interruption ou timer ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#12 Message par Jérémy » dim. 20 sept. 2015 16:45

Y'a pas de problème, je peux répondre

C'est juste que la , il faudrait que je ressorte ma plaque et que j'installe tout le matos .... .

J'ai bientôt fini le forum je pense.

je bosse sur une nouveauté, permettant d’améliorer ce forum par rapport aux autres; Faire de la pub c'est dur, le rendre attractif aussi !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Trouvez l'erreur ? interruption ou timer ?
HULK28
Avatar de l’utilisateur
Amateur
Amateur
Messages : 106
Enregistré en : août 2015
Localisation : IdF

#13 Message par HULK28 » lun. 21 sept. 2015 10:56

maï a écrit :HULK28: pourquoi utiliser une 2eme variable qui pourra tout autant être modifié dans le main et ne résout pas ce problème voir le double.A utiliser une seconde variable, autant utiliser une structure de bits plus rapide a gérer dans le main,et plus difficile a modifier (0 ou 1).


Tout dépend de l'application en fait, il faut avoir le temps de traiter en tache de fond.
En interruption on gère les évènements au plus vite, qui doivent se résumer à la prise en compte, en tâche de fond (dans le programme principal) on exécute les actions avec le degré de priorité qui convient en connaissant la durée de chacun.
Il faut programmer avec pour habitude que le programme peut très vite grossir et il faut éviter de perdre une interruption, qui serait par exemple écrasée par une autre priorité.
En utilisant une variable désignée à l'action a produire on affecte celle-ci dans le processus principal.
En principe on gère le cadencement par l'usage de différentes bases de temps (10ms, 100ms, 1s, 1mn, etc) qui assureront la synchronisation rigoureuse entre chaque action à réaliser.


Autre problème si pour X raisons compteur est >31 on ne valide jamais le flag action faire plutôt un test if(compteur >= 31)


C'est l'exact illustration de ce que je viens de dire. Si la condition est compteur=31 faire >=31 sous entend que tu penses que tu vas peut-être raté quelque chose lors du comptage et dépasser 31.

je ne comprend cela:
TMR0H = 0; // on remet le compteur à 0
TMR0L = 0;
Alors que l'int se déclenche sur passage du compteur FFFF-> 0000 mode (16bits) donc ils sont foncement a zero on réinitialise c'est registres si leurs valeur est différent de 0.


C'est tout à fait vrai dans ce cas précis. En général on utilise la réinitialisation du timer lorsqu'il y a un offset (ce qui est le cas à 99%) sinon il ne faut rien faire comme tu l'as dit.


et enfin pourquoi faire un test du flag action?dans int? si action pas terminer c'est qui y a un problème de timing cela risque de bousculer au portion probleme a revoir AMHA

Dans l'exemple l'idée est de ne prendre en compte l'interruption uniquement si l'action est enfin terminée.
Si c'est pour allumer une led c'est sur que ça n'a aucun intérêt, si l'action est d'attendre un résultat qui tarde à arriver, par exemple si une action doit être réalisée si et seulement si une température doit être atteinte, il n'est pas utile de recevoir une nouvelle interruption vu que l'action est déjà en cours et attend la réponse.
Il faut bien comprendre qu'un programme est de nature déterministe, donc tout doit être pensé avec la notion de temps et que chaque cause produit une conséquence qui doit être prévue en valeur et durée, sans quoi c'est le plantage assuré.
"Pour la carotte, le lapin est la parfaite incarnation du mal" -Robert Shecley-

Trouvez l'erreur ? interruption ou timer ?
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#14 Message par Guest » lun. 21 sept. 2015 11:47

bonjour

HULK28 Pour répondre au dernier point utilisation d'une variable supplémentaire, que je trouve inutile car il y a d'autres solution:

Avec
-le timer0 est dédie uniquement a gérer action par exemple rafraîchissement affichage LCD,
-une seule variable mise a jour uniquement dans INT moins de risque
voici le code si vous voyez des erreurs milles excuses

Code : Tout sélectionner

volatile char compteur = 0;

void interrupt()
 {               // Ici c'est la routine d'interruption, on test flag du TMR0
  if (INTCON.TMR0IF == 1)           // egale a 1
    {   
    INTCON.TMR0IF = 0;          // oui remise a zeo flag
    ++compteur;           // On incrémente notre compteur
    }

   if (compteur >=31)
    {
    T0CONbits.TMR0ON =0 ;      // arret TIMER0
    compteur=0;            // remis a zero du compteur   

    }               
}               // et on return

......

main()
{
....
        while(1)             // boucle programme principal
        {
        if (T0CONbits.TMR0ON == 0)    // test Si notre compteur arriver en FIN donc si le trime0 est a l'arret
           T0CONbits.TMR0ON = 1;        // on relance le timer0, avant si besoin on recharge TRM0L TRM0H
            LATC = ~LATC;       // on effectue notre ACTION
            }
          suite            // suite programme
        }
}


quelques soit la situation ça roule tranquille, le timer0 n'est remis en service que lorsque l'on exécute ACTION, la seule contrainte c'est que le timer0 est dédie uniquement a ACTION. on aurait pu aussi désactiver l'int du timer0 dans int et la réactiver dans ACTION
-on peut encore améliorer la situation dans INT en faisant un test de bit sur compteur(plus rapide et moins espace mémoire ) en passant en mode 16bits avec un calcul du temps du timer0 pour que compteur soit le plus petit multiple de la base de 2 exemple compteur=16 il faut faire un test sur le bit 4 de compteur pour arriver a la fin de la tempo

A+

PS comme le c n'est pas ma tasse de the, je me demande s'il ne serait pas plus rationnel de mettre compteur dans la routine INT elle serait plus a l'abri :-)
une dernière observation.Je suis ok pour les flags si plusieurs compteurs, donc mettre ses flags dans une structure de bits et faire la remise a zero du compteur dans int et non pas dans ne main

Trouvez l'erreur ? interruption ou timer ?
HULK28
Avatar de l’utilisateur
Amateur
Amateur
Messages : 106
Enregistré en : août 2015
Localisation : IdF

#15 Message par HULK28 » lun. 21 sept. 2015 17:42

Oui ça fonctionne avec une seule action, c'est ce que j'avais expliqué plus haut.
Seulement ce n'est valable que sur un exemple simple comme ici.

Si tu dois gérer plusieurs cas tu seras obligé de procéder autrement.
"Pour la carotte, le lapin est la parfaite incarnation du mal" -Robert Shecley-


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 43 invités