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
Interrupt Timer strappée
- paulfjujo

Maître- Messages : 3288
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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)
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)
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Interrupt Timer strappée
-
Jérémy

Administrateur du site- Messages : 2758
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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
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
Interrupt Timer strappée
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
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
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
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
Bon c'est pas IPR1 j'ai reluuuuuu et tu as bien mis le bit TMR1IP A zéro désolé fausse piste
a+
c'est quoi a la fin de ta compil? pour te dire que tu utilises les 2 vecteurs int ?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
a+
Interrupt Timer strappée
Interrupt Timer strappée
Bonjour jeremy rentré du froid
on a deja évoqué le sujet et je vois que je ne l'est pas convaincu, je te suis la dessus a 100%
A+
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

Maître- Messages : 3288
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonsoir Maï
merçi de t'interresser à mon probleme
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);
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 ..
A suivre ...
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
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 ..
A suivre ...Interrupt Timer strappée
- paulfjujo

Maître- Messages : 3288
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
j'ai trouvé mon erreur
mis en evidence avec le Write F= valeur du flag AVANT la boucle
oubli des parentheses !
c'est tellement gros ..
// 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
oubli des parentheses !c'est tellement gros ..
Interrupt Timer strappée
Interrupt Timer strappée
c'est bien, il n'y avait que toi pour voir cela
je renouvelle mon conseil de faire un grand nettoyage
Exemple
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+
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+
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités

