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

Interrupt Timer strappée
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3288
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » lun. 14 mars 2016 11:27

bonjour,

Dans le cadre d'une aplication WIFI3-Click ESP8266 ,
je tourne en rond depuis plusieurs JOURS ! sur un probleme de délai réalisé via
un timer ( Timer0 ou Timer1). avec le principe suivant

Init du timerx
Armement Timer
boucle infinie sur changement d'etat du Flag Timer

Fonctionne tres bien dans le main program , mais le test Flag n'est pas fait dans un sous programme
ou je traite aussi la reception UART2 via attente de remplissage buffer
Chaque caractere recu via Interrupt UART étant rangé dans le buffer..
Je n'ai donc pas la tempo désirée et ne comprends pas comment le programme passe par dessus le test du flag.

Je demande donc à une ame charitable de jeter un oeil sur mon source d'application
WIFI3_18F46k22_UART1_UART2_LCD2119_3_3V_160314.c dans le Zip
(j'ai posé le probleme sur mikroE .. sans reponse)

OU EST LE BUG ?

pour info voici le Test Timer execution dans 3 sous programmes imbriqué
mais sans IT RX UART.
dans le zip : 18F46k22_UART1_Test_Timer1_IT.c

Nota :
j'ai testé avec Timer0 ..ou Timer1 HIGH level interrupt placé en tete de traitement .. idem
meme avec des varaiables declarées en volatile ..( probleme specifique du C18)
Test avec Timer1 en mode Low Interrupt .. idem l'IT UART restant en mode HIGH level ..
avec FOSC=10Mhz ou 40Mhz .. idem
Je pourrais passer par dessus ce probleme en utilisant Delay_ms (qui n'utilise pas d' IT)
mais ça me travaille .. de ne pas comprendre)




WIFI3_18F46k22_UART1_UART2_LCD2119_3_3V_160314.zip
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Interrupt Timer strappée
Jérémy
Administrateur du site
Administrateur du site
Messages : 2758
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#2 Message par Jérémy » lun. 14 mars 2016 13:38

Bonjour Paulfjujo,

Ravie de voie que l'écran LCD puisse servir ;)

Je viens de regarder ton programme au cas ou ! mais c'est trop compliqué pour mon niveau.
Je pourrais te suggérer de diminuer les conditions d'entrée dans les INT .

Par exemple ici :
( (TMR1IE_bit==1) && ( TMR1IF_bit==1))
Tu test si l'INT est activé ET si le flag est levè ! Mais si tu va sur l'INT c'est forcement qu'elle est Activé non ? Je dis peut être une connerie hein !!! Mais bon des fois ça fait voir un soucis !

Bon courage
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Interrupt Timer strappée
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#3 Message par Guest » lun. 14 mars 2016 14:08

Bonjour

j'ai regardé ton soft

Pas vue le registre IPR1,registre de priorité ou non prioritaire (bit 0 pour TIMER1) il n'existe peut-être pas sur ton 18F pas allez voir la DS

Tu te traînes toujours la casserole sur la lecture du buffer avant test des bits FERR et OERR pour UART :mrgreen:
Tu peux aussi amélioré la precision du timer me coûte, rien en cycles comme j'ai proposé ici viewtopic.php?f=10&t=207&start=10

A+

PS: je te rappel que tout INT si a l'instant T valide leurs flag c'est la première qui est traité dans ton soft qui sera prioritaire sur les autres

Interrupt Timer strappée
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#4 Message par Guest » lun. 14 mars 2016 14:34

Bon c'est pas IPR1 j'ai reluuuuuu et tu as bien mis le bit TMR1IP A zéro désolé fausse piste ;)
0 1004 interrupt handler (Interrupts at 0x0008) WIFI3_18F46k22_UART1_UART2_LCD2119_3_3V_160313.c
0 1004 interrupt handler (Interrupt_LOW at 0x0018) WIFI3_18F46k22_UART1_UART2_LCD2119_3_3V_160313.c
c'est quoi a la fin de ta compil? pour te dire que tu utilises les 2 vecteurs int ?
a+

Interrupt Timer strappée
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#5 Message par Guest » lun. 14 mars 2016 14:57

bon je lis le test et je ne comprend pas le fonctionnement du timer1 une explication peut_être? car il y a pas mal de redondance dans ton code


A+

Interrupt Timer strappée
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#6 Message par Guest » lun. 14 mars 2016 17:16

Bonjour jeremy rentré du froid ;)
Jérémy a écrit :Tu test si l'INT est activé ET si le flag est levè ! Mais si tu va sur l'INT c'est forcement qu'elle est Activé non ? Je dis peut être une connerie hein !!! Mais bon des fois ça fait voir un soucis !


on a deja évoqué le sujet et je vois que je ne l'est pas convaincu, je te suis la dessus a 100%

A+

Interrupt Timer strappée
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3288
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#7 Message par paulfjujo » lun. 14 mars 2016 19:41

bonsoir Maï

merçi de t'interresser à mon probleme

maï a écrit :bon je lis le test et je ne comprend pas le fonctionnement du timer1 une explication peut_être? car il y a pas mal de redondance dans ton code
A+



J'initialise le timer1 pour avoir une interruption toute les 100mS
de meme le compteur de passage dans l'IT Cpt1=0
et la valeur Mxètimer1=40 soit 40x100mS => 4 seconde par défaut
mais l'autorisation d'IT timer1 n'est PAS validée.. c'est une init seulement
faite en deburt de programme.
pour la suite j'utilise
Arme_Timer1() ; pour lancer la tempo via Timer1
soit TMR1ON_bit=1; valide le timer
TMR1IE_bit=1; valide l'e passage de L'IT Timer1

dans le traitement de l'IT , j'incremente Cpt1 à chaque passage jusuqu'à la valeur prevue par Max_Timer1
qui permet alors de monter le flag Flag_Timer1=1
à priori ,il n'y a que dans ce cas que le flag devrait passer à 1 ..

C'est vrai dans le programme de test .. mais faux ( BAD!) dans mon application ???
J'ai essayer d'empiler des appels de ce test ..(Re_Re_test) au cas ou il y aurait un probleme de debordement de pile ..
Ce programme tourne bien et realise la fonction demandée
j'ai bien mes 4 secondes et 15 secondes ..
C'est bien l'IT timer1 via qui me fait sortie du While(Flag_Timer1==0);

19:40:16.109> Init UART1 19200 bds
19:40:16.109> Presentation :
19:40:16.109> Projet : 18F46K22_uart_for_Tests.mcppi
19:40:16.109> Version : 13-03-2016
19:40:18.109>
19:40:18.109> Init Timer1 100msec
19:40:18.109>
19:40:18.171> _Re_Re_test
19:40:18.171>
19:40:18.171> Re_test
19:40:18.171> delai 4sec
19:40:22.171> delai 15sec
19:40:37.171> Elapsed
19:40:37.171>
19:40:37.171> _Re_Re_test
19:40:37.171>
19:40:37.171> Re_test
19:40:37.171> delai 4sec
19:40:41.234> delai 15sec


Jérémy a écrit :
Tu test si l'INT est activé ET si le flag est levè ! Mais si tu va sur l'INT c'est forcement qu'elle est Activé non ? Je dis peut être une connerie hein !!! Mais bon des fois ça fait voir un soucis !


Rassurer vous, je le fais EXPRES.
Ce flag Autorisation d'interrupt n'a pas été inventé pour rien.
Si j'utilise les flag d'autorisation d'interrupt , c'est que je veux gerer justement cette autorisation
j'initialise le Timer , mais je n'autorise pas de suite l'IT correspondante.
idem pour la reception UARTx , bloquer les interrupt si j'ai reçu mon taf d'octets ou reconnaissance fin de message.
sinon , on entre dans le mecanisme de gestion des interrupt par n'importe quelle source d'interrupt
meme si on ne voulait pas la traiter !



Concernant la priorité .. j'ai essayé de mettre Timer1 en tete de traitement ..
Probleme inchangé..
J'ai utilisé auparavent le timer0 qui est toujours en High Level ...
d'ailleurs , si on raisonne sur le fait que je sors du while (Flag_Timer1==0);
c'est bien que le Flag_Timer1 est passé à 1 !
ou que je ne le RAZ pas effectivement à chaque fois , dans Arme_Timer1() ?
si l'interrupt Timer1 ne passerait pas du tout .. je resterai plutot coincé dans le while ..que de passer par dessus

Mon probleme semble bien lié au fait de recevoir des IT UART2 RX .. pendant que j'arme Timer1
mais comment ?

J'avais pensé aussi a un debordement de taille buffer .. j'ai mis/ testé jusqu'à 300 octets pour buffer2 ..
qui recoit , taille variable en fonction du Nb de reseau SSID environnant >200 caracteres avant d'afficher son OK terminateur.
sans effet ..

et pourtant les "effets de bords" sont souvent liés à un debordement de table . ??
nota : effet de bord = mon probleme

Je n'ai malheureusement pas d' ICD outil de developpement In Circuit debugger
pour pister le code ..

exit A suivre ...
Aide toi, le ciel ou FantasPic t'aidera

Interrupt Timer strappée
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3288
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#8 Message par paulfjujo » lun. 14 mars 2016 20:35

j'ai trouvé mon erreur


 
// envoi la requete au WIFI3
   UART2_Write_CText("AT+CWLAP\r\n");
  // ok avec Delay donc sans IT
  #ifdef With_Timer1
  // Bad avec timer1
    Max_Timer1=360;         //  =180x100mS at 10 Mhz ou 360x50ms at 40Mhe
    Arme_Timer1();
    UART1_Write('F'); UART1_Write('='); UART1_Write(Flag_Timer1+48);
   while (Flag_Timer1==0) ;
   Max_Timer1=80;      //  80x50=4000  ->4 sec 


mis en evidence avec le Write F= valeur du flag AVANT la boucle
oops oubli des parentheses !
c'est tellement gros ..
Aide toi, le ciel ou FantasPic t'aidera

Interrupt Timer strappée
Jérémy
Administrateur du site
Administrateur du site
Messages : 2758
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#9 Message par Jérémy » lun. 14 mars 2016 20:59

:bravo:

Franchement fallait le voir parmi le code , des fois les coquilles les plus simples , sont les plus difficiles à débusquer !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Interrupt Timer strappée
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#10 Message par Guest » mar. 15 mars 2016 10:25

c'est bien, il n'y avait que toi pour voir cela ;)

je renouvelle mon conseil de faire un grand nettoyage

Exemple

Code : Tout sélectionner

void Arme_Timer1()
{
  TMR1IF_bit         = 0;
  TMR1H         = 0x0B;
  TMR1L         = 0xDC;
  Cpt1=0;
  Flag_Timer1=0;
  TMR1ON_bit=1;     // Timer0 ON
 TMR1IF_bit         = 0;
  }


TMR1IF_bit = 0; a bon, si =1, tu ne serais pas la mais dans l'int , et dans la même, 2 fois dans la routine d'autant plus que tu ne désactives jamais la validation de INT

Allez bonne continuation

A+


Retourner vers « Langage C »

Qui est en ligne

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