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

watchdog et timer
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#11 Message par satinas » mer. 8 sept. 2021 16:56 lien vers la Data-Sheet : Cliquez ici

The Timer0 interrupt cannot wake the processor from Sleep since the timer is frozen during Sleep.
TMR0 = 61; juste avant le sleep, pas besoin d'arrêter l'interruption.
Au fait, et TMR0IF_bit ?
Modifié en dernier par satinas le mer. 8 sept. 2021 17:05, modifié 1 fois.

watchdog et 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 » mer. 8 sept. 2021 17:02 lien vers la Data-Sheet : Cliquez ici

satinas a écrit :Source du message
Si tu écartes une erreur, elle te reviendra sous une autre forme.

Code : Tout sélectionner
char CPT_LOC=0;
do {
...
delay_ms(50);
CPT_LOC++;
if (CPT_LOC >= 3) break;
} while (F_Sleep_OK == 0); // Attente de la réponse
F_Sleep_OK = 0; // RAZ flag

Ou alors du mets un compteur d'erreurs, que tu affiches, j'ai cru vois passer un lcd.


Tu mets le doigts où ca fait mal, mais je pense qu'on s'éloigne de la problématique actuelle. je tente quand même une réponse rapide.
Au départ j'avais simplement la commande pour mettre en veille le module.
Puis je me suis dis comme le module m’envoie une réponse pourquoi ne pas l'utiliser. Alors j'ai rajouter la boucle qui attends de recevoir la bonne réponse.
Oui mais voila, si la réponse n'arrive jamais ou est mauvaise, alors je reste coincé ici. j'ai donc rajouté une tentative de re-envoie ( 3 fois) .
A partir deux la il ne me reste que deux possibilités. Soit j'ignore l'erreur et je sors de ma boucle, soit je reset le module radio et le pic pour repartir de zéro. J'ai choisi d’ignorer l'erreur pour le moment. :sifflotte:

Pour revenir à nos moutons et Après plusieurs minutes toujours pas de bug.
Je vais donc rajouter une fonction avec le module radio qui implique aussi la réception UART par interruption !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

watchdog et timer
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#13 Message par Jérémy » mer. 8 sept. 2021 17:07 lien vers la Data-Sheet : Cliquez ici

satinas a écrit :Source du message The Timer0 interrupt cannot wake the processor from Sleep since the timer is frozen during Sleep.
TMR0 = 61; juste avant le sleep, pas besoin d'arrêter l'interrutpion.


Malheureusement je ne peux pas faire cela. Car avant de relancer le timer0 de 300ms je dois réveiller le module radio afin de pouvoir vérifier si je ne reçois rien.

Au fait, et TMR0IF_bit ?

C'est le flag d'interruption qu'il faut remettre à zero âpres le débordement du timer !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

watchdog et timer
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#14 Message par satinas » mer. 8 sept. 2021 17:15 lien vers la Data-Sheet : Cliquez ici

Oui il est conseillé de mettre à zéro TMR0IF juste avant TMR0IE, même si c'est inutile le plus souvent, car il est à 0 au reset, et remis à zéro dans l'interruption, mais quand on bidouille TMR0IE, une interruption peut très bien démarrer aussi sec s'il est à 1 pour une raison ou une autre.

watchdog et timer
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#15 Message par Jérémy » mer. 8 sept. 2021 17:53 lien vers la Data-Sheet : Cliquez ici

J'ai voulu rajouter la fonction de sortie de veille du module radio !
Afin de simuler la fonction je l'ai directement mise dans la boucle comme si , elle s’effectuait en permanence .

Code : Tout sélectionner

 while (1){

     if (F_Sleep == 1){   // C'est l'heure de dormir
        F_Sleep = 0;
        TMR0IE_bit = 0 ;
        
        LED_R 
= 0;
        SWDTEN_bit = 1;     // j'active le watchdog configurer sur 2s
        asm sleep ;         // j'endors le PIC pour 2 secondes et il se reveilera grace au watchdog pour uneb durer determiner par le timer 0
        asm nop ;
        SWDTEN_bit = 0;     // Je désactive le watchdog
      
        LED_R 
= 1;
        TMR0       = 61;    // TMR0 Preload = 61
        CPT_100ms  = 0 ;
        TMR0IF_bit = 0 ;
        TMR0IE_bit = 1 ;
      }


    AMB_WUP = 0;
    delay_ms(20);
    AMB_WUP = 1;
    delay_ms(10);
 }   


Donc pour moi je devrais voir apparaitre :
- soit une impulsion de 300ms si le TIMER0 lève le flag juste après le delay_ms(10);
- soit une impulsion de 330ms max si le Timer0 lève le flag juste avant le delayèms(20);
- ou tout autre valeur comprise entre 300 et 330 ms .

Je vous laisse regarder le résultat .
je ne sais plus quoi en déduire !
Je précise que je n'ai aucune informations qui circule sur le bus UART, car je l'écoute avec realterm.
IMG_20210908_174349.jpg


J'a ides largeur de 900ms à 5s !!!!!!
Je ne comprends pas comment c'est possible
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

watchdog et timer
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#16 Message par Jérémy » mer. 8 sept. 2021 18:00 lien vers la Data-Sheet : Cliquez ici

en mettant un simple delay_ms(30); en lieu et place j'ai la même chose ??? :mur: :mur: :mur: :mur:

Code : Tout sélectionner

 while (1){

     if (F_Sleep == 1){   // C'est l'heure de dormir
        F_Sleep = 0;
        TMR0IE_bit = 0 ;
        
        LED_R 
= 0;
        SWDTEN_bit = 1;     // j'active le watchdog configurer sur 2s
        asm sleep ;         // j'endors le PIC pour 2 secondes et il se reveilera grace au watchdog pour uneb durer determiner par le timer 0
        asm nop ;
        SWDTEN_bit = 0;     // Je désactive le watchdog

        LED_R = 1;
        TMR0       = 61;    // TMR0 Preload = 61
        CPT_100ms  = 0 ;
        TMR0IF_bit = 0 ;
        TMR0IE_bit = 1 ;
      }

    delay_ms(30);
   }


Si je l’enlève tout redeviens parfait ! J'ai une couille dans le potage
C'est en faisant des erreurs, que l'on apprend le mieux !!!

watchdog et timer
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#17 Message par satinas » mer. 8 sept. 2021 18:13 lien vers la Data-Sheet : Cliquez ici

volatile unsigned int CPT_100ms=0;
Toutes les variables globales utilisées dans les interruptions en volatile
J'aurais dû le voir avant, mais tu es censé le savoir :)
Pas sûr que ce soit la cause du problème, mais cela participe.

watchdog et timer
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#18 Message par Jérémy » mer. 8 sept. 2021 18:27 lien vers la Data-Sheet : Cliquez ici

Ben je n'ai quasiment JAMAIS utilisé ce "qualificatif" ! si peu que je m'en souviens pas.


Quand je regarde une traduction :
Le qualificatif volatile implique qu'une variable peut changer sa valeur pendant l'exécution indépendamment du programme. Utilisez le modificateur volatile pour indiquer qu'une variable peut être modifiée par une routine d'arrière-plan, une routine d'interruption ou un port d'E/S. Déclarer un objet volatile avertit le compilateur de ne pas faire d'hypothèses concernant la valeur d'un objet lors de l'évaluation des expressions dans lesquelles il apparaît car la valeur peut être modifiée à tout moment.


Autant dire que toute mes valeurs dans les interruptions UART doivent être misent en "volatiles".
Je vais faire des test avec cette nouvelle informations importantes. et je reviens .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

watchdog et timer
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#19 Message par Jérémy » mer. 8 sept. 2021 19:15 lien vers la Data-Sheet : Cliquez ici

Me revoilou!

j'ai l'impression qu'il y a du mieux. Je n'ai pas eu de grande trame >600ms . Quelques unes un peu plus longue que 300ms, mais rien de bizarre car cela dépend aussi du module radio et de son temps de réponse vu que j'attends ses réponses.
Ce que qui me chagrine ce sont celles qui sontplus courtes (270ms ) . En étant logique comment est ce possible !

Soit le F_Sleep est modifié ailleurs dans le code par je ne sais pas où !
Soit la valeur du registre Timer0 est modifié quelques part !

Je pense que cela dépasse mes compétences
C'est en faisant des erreurs, que l'on apprend le mieux !!!

watchdog et timer
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#20 Message par satinas » mer. 8 sept. 2021 19:45 lien vers la Data-Sheet : Cliquez ici

Si ça marche plus comme il faut, tu reviens à l'étape précédente qui fonctionnait, et tu prévois les 2 versions du code, on pourra les regarder.
J'espère que tu as enlevé la partie TMR2, qui est très bizarre.


Retourner vers « Langage C »

Qui est en ligne

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