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 ---
- 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 ---
Modérateur : Jérémy
watchdog et timer
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 ?
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- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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.
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 !
watchdog et timer
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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 !
watchdog et timer
watchdog et timer
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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 .
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.
J'a ides largeur de 900ms à 5s !!!!!!
Je ne comprends pas comment c'est possible
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.
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.
watchdog et timer
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
en mettant un simple delay_ms(30); en lieu et place j'ai la même chose ???
Si je l’enlève tout redeviens parfait ! J'ai une couille dans le potage
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
watchdog et timer
watchdog et timer
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Ben je n'ai quasiment JAMAIS utilisé ce "qualificatif" ! si peu que je m'en souviens pas.
Quand je regarde une traduction :
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 .
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 .
watchdog et timer
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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
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
Qui est en ligne
Utilisateurs parcourant ce forum : Google [Bot] et 43 invités