bonjour Satinas et à tous,
Pourquoi 2 variables i1 et Index1 qui semblent faire la même chose, ça complique la lecture du programme.
j'utilise 2 index : i1 et Index1 pour conserver la derniere position dans le buffer1 ,
i1 est mis à 0 quant CR ou Nb de bytes sont atteints.
ça m'a deja servi dans d'autre applis ... mais effectivement superfétatoire dans ce cas là.
on est loin du 16F84 ou il fallait vraiment compter le nb de variables utilisées..
De meme je mets U1RXIE=0 quand j'ai receptionné un message .. pour avoir le temps de le traiter sans qu'aucune perturbation
ou autre message survienne entre temps . Par exemple pour la remise à la date et heure RTC
sinon, un protocole XON XOFF ou CTS RTS autre serait necessaire si l'envoi (sur PIC RX) devait etre aleatoire.
J'ai pus mettre mon probleme mis en evidence avec l'envoi de 'H' sur l'evenement "entrée du traitement IT High"
sur le terminal YAT, bloquant tout si envoi de caractere sur RX UART
(17:04:10.742)HHHHHHHHHHHHHHHHHHHHHHHHHHH..etc ..HHHHHHHHHHHHHHHHH<Warning:
Maximal number of bytes per line exceeded!>
interruption parasite ( non identifiée avec tout le code présent lié à l' I2C OLED, RTC, ADC, NCO1 , SMT1, ..etc
Meme en inhibant 1 par un les modules ...
no way ! )
j'en suis arrivé à
SUPPRIMER tout le code généré par MCC et reduire le code (
DIVISER POUR MIEUX REGNER )
revenir à une init classique (sans MCC) et avec
UART1 en IT High et Timer 2 en Init Low ISR
tout en gardant ma gestion habituelle de l' UART RX avec un buffer à remplir.

Cependant , j'ai un doute :
à savoir si dans la meme IT RXIF, il faut lire le byte suivant dans la FIFO ou laisser
l'interrupt revenir TANT que RXIF est à 1
j'ai testé les 2 cas .. OK
mais en cas d'interrupt multiples en High ISR ????
Attendre une 2em interrupt RXIF pour recuperer le 2em byte , cela pourrait penaliser d'autres interrupts en mode High ISR!
bon à 19200 bds et FOSC 64MHz , c'est peu probable ...
Qu'en pensez vous ?
Par contre je n'ai pas (encore) testé la gestion des erreurs Frame et OVerflow
encore faut-il pouvoir les generer (les erreurs ... via OSCTUNE ? )...
je ferais des essais à 115200 bds ...
où vont_elles survenirt à 115200 bauds ( probablement via la precision limitée de FOSC interne , et OSCTUNE ..et VCC.. et Temperature )
J'en ai profité pour tester Timer2 en mode libre ..
le Timer2 est initialisé avec un tick de 8192µS
T2CLKCON = 0x01; // T2CS 0x01=>FOSC/4
T2HLT = 0x00; // MODE=0 => free runing software gate
T2PR = 0xFF; // PR2 255;
T2TMR = 0x00; // TMR2 0;
T2CON = 0x60 | 0x07 ; // Prescaler =1/64 Poscaler=1/8 => 1/128 ticks= 8192µS
et interrupt compte Cpt_T2> 122 => 999 424 µS .. presque la seconde !
je note ici, que l'interrupt se fait bien BIEN APRES le POSTCALER ..
diagram timer2
TMR2_18F27K42_interrupt.jpg
sur terminal
(18:07:44.000) (0.042) Projet MPLABX :18F27K42_UART1_RX_ITH_TMR2_ITL_2021
(18:07:44.000) (0.000) Compile le Apr 10 2021 a 18:07:00 UTC
(18:07:44.032) (0.031) avec version XC8 : 2100
(18:07:44.032) (0.000) Hardware : BASE 18F27K42 FOSC interne =64MHz
(18:07:44.075) (0.042) Test UART1 RX High Interrupt et Timer2 Low Interrupt
(18:07:46.068) (1.993) IT High et Low armées
(18:07:46.099) (0.030) Init and Start Timer2
(18:07:46.099) (0.000) Raz Buffer1, Arme RX UART IT
(18:07:47.107) (1.008) Timer2 Cp_T2= 1
(18:07:48.116) (1.008) Timer2 Cp_T2= 2
(18:07:49.125) (1.008) Timer2 Cp_T2= 3
(18:07:50.133) (1.008) Timer2 Cp_T2= 4
(18:07:51.141) (1.008) Timer2 Cp_T2= 5
(18:07:52.148) (1.007) Timer2 Cp_T2= 6
(18:07:53.156) (1.008) Timer2 Cp_T2= 7
(18:07:54.165) (1.008) Timer2 Cp_T2= 8
(18:07:54.995) (0.829) Help
(18:07:55.174) (0.178) Timer2 Cp_T2= 9
(18:07:55.189) (0.014)
(18:07:55.189) (0.000) Recu :
(18:07:55.259) (0.069) Help Commandes :
(18:07:55.259) (0.000) MAJ RTC
(18:07:55.259) (0.000) ex: U;03;03;21;15;14;03;# pour 03 mars 2021 , 15H14 Mercredi
(18:07:55.259) (0.000) Help
(18:07:55.259) (0.000) Help
(18:07:56.245) (0.986) Timer2 Cp_T2= 10
(18:07:57.253) (1.008) Timer2 Cp_T2= 11
(18:07:58.261) (1.007) Timer2 Cp_T2= 12
(18:07:59.270) (1.009) Timer2 Cp_T2= 13
(18:08:00.278) (1.008) Timer2 Cp_T2= 14
(18:08:01.286) (1.008) Timer2 Cp_T2= 15
(18:08:02.295) (1.008) Timer2 Cp_T2= 16
(18:08:03.303) (1.008) Timer2 Cp_T2= 17
(18:08:04.103) (0.799) U;18;03;21;18;45;05;#
(18:08:04.312) (0.208) Timer2 Cp_T2= 18
(18:08:04.331) (0.018)
(18:08:04.331) (0.000) Recu :
(18:08:04.331) (0.000) MAJ RTC
(18:08:04.432) (0.100) U;18;03;21;18;45;05;#
(18:08:04.432) (0.000)
(18:08:05.344) (0.912) Timer2 Cp_T2= 19
(18:08:06.352) (1.008) Timer2 Cp_T2= 20
(18:08:07.360) (1.008) Timer2 Cp_T2= 21
Hihg Interrupt
Code : Tout sélectionner
void __interrupt(high_priority) High_Isr(void)
{
unsigned char c1;
if ( (PIR3bits.U1RXIF) && (PIE3bits.U1RXIE) )
{
c1=U1RXB;
if ((c1==13) || (i1>BUFFER1_LEN ) )
{
Flag_Buffer1=1;
Buffer1[i1]=0;
Index1=i1;
i1=0;
PIE3bits.U1RXIE =0;
}
else
{
Buffer1[i1]=c1;
i1++;
Index1=i1;
}
}
} Low Interrupt
Code : Tout sélectionner
void __interrupt(low_priority) lowIsr(void)
{
if(PIE4bits.TMR2IE == 1 && PIR4bits.TMR2IF == 1)
{
tick2_count++; if (tick2_count>122)
{ tick2_count=0;
Cpt_T2++;
}
PIR4bits.TMR2IF=0;
}
} le projet MPLABX XC8
18F27K42_UART1_RX_ITH_TMR2_ITL_2021.zip
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.