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

<RESOLU>UART2 et UART1 en interrupt avec 18F47K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2598
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » sam. 29 août 2020 16:28 lien vers la Data-Sheet : Cliquez ici

bonjour à tous,

j'utilise un PIC 18F47K42 en DIP 40
pour tester l' UART2 ET l'UART1 en mode interrupt

le PIC est en mode oscillateur interne FOSC 64MHz

Hardware:
UART1 en RC6 TX et RC7 RX => cordon prolific TTL/USB terminal YAT
UART2 en RB5 TX et RB2 RX => cordon prolific TTL/USB terminal YAT
1 led en RA4 ave cpull up de 2,7K
et 1R de 10K en pullup sur pin 1 MCLR
2 pins -> alim VDD +4.5V
2 pins -> to Gnd
et l'ICSP connecté au Pickit4
MPLABX IDE pour charger le programme dans le PIC


:!!: et je suis confronté à une phenomene bizarre :
Test avec 2 terminaux , un sur COM25 et un sur COM26 ( liaisons UARTx via cordon prolific au PC)
l'ecriture (envoi) de chaque UART est aiguillé sur un terminal
les 2 ecrans terminaux affichent bien les envois de chaque UART.... OK

MAIS dans le sens Envoi depuis un terminal
com UART2 ... on observe l'echo terminal (ecriture en bleu) et le retour de la reception
via le message recu 2 : xxxxxxxx <- message envoyé ..OK

mais là ou ça ce corse ( j'ai rien contre l'ile de beauté !)
c'est lorsque j'envoie un message du terminal (UART1)
j'ai l'echo du message envoyé (en bleu)
MAIS c'est sur UART2 que le message apparait en retour !
et j'ai sur UART1 recu 1 : ( RIEN !, pas de message)
je suis pourtant bien rentré dans l'interruption RX UART1 !

pourquoi UART2 me renvoi ce que UART1 devrait renvoyer ?


la capture des 2 ecrans montre le probleme ( avec TimeStamp activé pour le synchronisme des evenements)

Interference_UART1_sur_UART2.jpg


mon projet mikroC

_18F47K42_2xUart.zip


Ce PIC donne pas mal de fil à retordre ( rien ne vaut le 18F46K22 qui est declaré obsoltète)
tout comme ma Megane 100ch ... et on me propose à la place une Zoe de 135ch Ecologique ????? à 30 000€ et 245kms d'autonomie en hiver
pour l'instant je fais de la resistance ...mais avec un vignette Crit'Air type 4 ???

:sifflotte: 2 Zoe (+ 1 bout de centrale nucleaire) = 1 Mustang ?
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par paulfjujo le mar. 1 sept. 2020 17:15, modifié 2 fois.
Aide toi, le ciel ou FantasPic t'aidera

UART2 et UART1 en interrupt avec 18F47K42
pspic
Passionné
Passionné
Messages : 357
Âge : 77
Enregistré en : septembre 2017
Localisation : 68

#2 Message par pspic » sam. 29 août 2020 17:54 lien vers la Data-Sheet : Cliquez ici

paulfjujo a écrit :bonjour à tous,
:sifflotte: 2 Zoe (+ 1 bout de centrale nucleaire) = 1 Mustang ?

Il faut savoir lire entre les lignes !

UART2 et UART1 en interrupt avec 18F47K42
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 963
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#3 Message par venom » sam. 29 août 2020 20:14 lien vers la Data-Sheet : Cliquez ici

Salut paulfjujo, pspic et a tous.

:shock: tu rencontre toujours des trucs. Décidément, l'électronique est très très complexe. D'un composant a un autre rien ne va plus. Je ne serais t'aider désolé.

Pour ce qui est des voitures électriques, je suis d'accord avec ta résonance.
Voiture électrique = moins polluante. Mais avec le nucléaire en amont je n'en suis pas si sûr. :-D






@++
Mon site web
Mon discord : venom#4888

UART2 et UART1 en interrupt avec 18F47K42
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2618
Enregistré en : juillet 2016
Localisation : Terre

#4 Message par Temps-x » sam. 29 août 2020 21:24 lien vers la Data-Sheet : Cliquez ici

Bonsoir paulfjujo, pspic, venom, et tout le forum,

Beaucoup plus difficile que Arduino ...... dehors!!

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

UART2 et UART1 en interrupt avec 18F47K42
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#5 Message par satinas » dim. 30 août 2020 16:02 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,

j'ai fait quelques essais avec un 18F27K42 et MpLabX.

avec MVECEN = 0 et IPEN = 0, on est compatible 16F, une seule ISR, relogeable
avec MVECEN = 0 et IPEN = 1, on est compatible 18F standard, 2 ISR high et low priority, relogeables.
avec MVECEN = 1, on a une table relogeable de 81 vecteurs, et chaque type d'interruption a sa propre ISR, et sa priorité high ou low.

En testant les 2 ports série, pas de problème rencontré en compatibilité 16F, et 18F high priority.
J'ai essayé de passer l'int série en low priority avec IPEN à 1, mais elle ne répond pas.
Autre problème, si rien n'est connecté sur l'uart, il y a parfois des tas de réceptions parasites, j'ai vu que tu mets des pullups sur les pins série, c'est utile ?

18F27K42_xc8_uart.c

Par contre pas eu le temps de regarder l'I2C.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

UART2 et UART1 en interrupt avec 18F47K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2598
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#6 Message par paulfjujo » dim. 30 août 2020 19:40 lien vers la Data-Sheet : Cliquez ici

Bonsoir Satinas,

Merçi pour ton aide,

En fait , je n'ai pas testeé l'UART2 sur le 18F27K42 en DIP28 mais uniquement sur le 18F47K42 en dip 40
Dans ton test , tu renvoies immedatement le caractere reçu sur la sortie TX

L'UART2 repond bien sur IT rx2
le message envoyé est bien stocké dans mon Buffer2

mais c'est l'UART1 qui me pose soucis,
Hors si dans l'IT reception je renvois , comme toi, le caractere reçu c1 ,
via U1TXB=c1 ; je recupere bien mon message envoyé sur le terminal !

mais rien n'est stocké dans mon Buffer1

par contre , je ne vois pas du tout comment fait l'UART2 pour envoyer sur le TX UART2 ce qui vient de RX UART1 ?
gros mystere ..

si j'utilise uniquement l'UART1 , NO problemo !

les 2 interrupts sont vraiment symetriques , au numero de port uart pres.

=======================================================================

Ce matin , TEST de ton programme UART1 RC6 RC7 et UART2 RB1 RB2 avec 18F27K42
Avec ISR et sans buffer de reception
ça ne peut pas suivre un flux contigu de datas ,
surtout à 38400 bds .. je pense que c'est NORMAL

Test_program_Satinas_18F27K42_UART1_UART2.jpg




test avec envoi d'un seul caractere:
lettre A envoyé sur chaque terminal
en retour sur les 2 terminaux,
je retrouve la lettre C au lieu de la lettre A => normal ( test avec use_ISR) renvoi c+2 => 'A'+2='C'

(11:50:51.837) A
(11:50:51.851) aC111111111111111


(11:50:55.026) A
(11:50:55.066) bC22222


je vais tester ensuite , avec buffer de reception .... à suivre
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

UART2 et UART1 en interrupt avec 18F47K42
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#7 Message par satinas » lun. 31 août 2020 14:48 lien vers la Data-Sheet : Cliquez ici

Bonjour Paul

Dans mon exemple on a IPEN = 1, donc 2 ISR high et low, et on définit une priorité high/low pour chaque type d'interruption.
Par défaut U1RXIP et U2RXIP sont à 1, les 2 int sont donc en priorité high, et elles exécutent l'ISR high, qui renvoie c+2.
Là ça marche.

J'ai essayé (voir lignes commentées) de mettre U1RXIP et U2RXIP à 0, ce qui met la priorité low aux 2 int uart.
Dans ce cas c'est l'ISR low qui est appelée, et elle renvoie c+3.
MAIS CELA NE MARCHE PAS, le pic ne renvoie plus rien !

J'ai essayé de debugger, mais les breakpoints MpLabX 5.35 marchent très mal, il ne s'arrête pas, quelle plaie ce truc.
Et en version 5.40 plus de full asm, il faudra passer par un programme C et y intégrer de l'asm.

UART2 et UART1 en interrupt avec 18F47K42
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#8 Message par satinas » lun. 31 août 2020 15:23 lien vers la Data-Sheet : Cliquez ici

Les int low priority ne marchaient pas parce que j'avais oublié de les activer avec GIEL, donc

Code : Tout sélectionner

  INTCON0bits.IPEN = 1;                 // int priority enabled
  INTCON0bits.GIEL = 1;                 // int low priority enabled
  INTCON0bits.GIEH = 1;                 // int high priority enabled

UART2 et UART1 en interrupt avec 18F47K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2598
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#9 Message par paulfjujo » lun. 31 août 2020 19:33 lien vers la Data-Sheet : Cliquez ici

bonsoir,

Resultats du test 2 uarts avec IT en mode High interrupt
avec buffers de reception

:sifflotte: presque OK
presque car j'ai à chaque envoi message sur UART2
un CR qui manque en fin de message Buffer2 (reception UART2)
et un CR qui apparait sur l'autre UART1


(19:14:57.894) <LF>
(19:14:58.601) hello, ici COM26
(19:14:58.885)
(19:14:58.885) <LF> UART1 Reçu : hello, ici COM26 <---- OK
(19:14:58.919) <LF> TEST UART1 sur COM26
(19:14:58.919) <LF> TEST UART1 sur COM26
(19:14:59.910) <LF> TEST UART1 sur COM26
(19:15:00.926) <LF> TEST UART1 sur COM26
(19:15:01.932) <LF> <--- interfrence avec envoi sur UART2
(19:15:02.944) <LF> TEST UART1 sur COM26
(19:15:02.975) <LF> TEST UART1 sur COM26
(19:15:03.965) <LF> TEST UART1 sur COM26
(19:15:04.972) <LF> TEST UART1 sur COM26
(19:15:06.006) <LF> TEST UART1 sur COM26
(19:15:06.995) <LF> <--- interfrence avec envoi sur UART2
(19:15:08.010) <LF> TEST UART1 sur COM26
(19:15:08.010) <LF> TEST UART1 sur COM26
(19:15:09.019) <LF> TEST UART1 sur COM26
(19:15:10.033) <LF> TEST UART1 sur COM26
(19:15:11.042) <LF>
(19:15:11.172) hello, ici COM26
(19:15:12.039)
(19:15:12.039) <LF> UART1 Reçu : hello, ici COM26 <---- OK
(19:15:12.085) <LF> TEST UART1 sur COM26
(19:15:12.085) <LF> TEST UART1 sur COM26
(19:15:13.066) <LF> TEST UART1 sur COM26
(19:15:14.076) <LF> TEST UART1 sur COM26
(19:15:15.126) <LF> TEST UART1 sur COM26
(19:15:16.093) <LF>

===========================================================*
* (19:14:54.853) TEST UART2 sur COM25
(19:14:54.867) <LF> TEST UART2 sur COM25
(19:14:55.868) <LF> TEST UART2 sur COM25
(19:14:56.884) <LF> TEST UART2 sur COM25
(19:14:57.887) <LF> TEST UART2 sur COM25
(19:14:58.907) <LF> TEST UART2 sur COM25
(19:14:59.940) <LF> TEST UART2 sur COM25
(19:15:00.926) <LF> TEST UART2 sur COM25
(19:15:01.937) <LF>
(19:15:02.592) Hello, là COM25
(19:15:02.934)
(19:15:02.934) <LF> UART2 Reçu : Hello, là COM25 TEST UART2 sur COM25 <--- manque le CR !
(19:15:02.974) <LF> TEST UART2 sur COM25
(19:15:03.965) <LF> TEST UART2 sur COM25
(19:15:04.977) <LF> TEST UART2 sur COM25
(19:15:05.985) <LF> TEST UART2 sur COM25
(19:15:06.995) <LF>
(19:15:07.184) Hello, là COM25
(19:15:07.993)
(19:15:07.993) <LF> UART2 Reçu : Hello, là COM25 TEST UART2 sur COM25 <--- manque le CR !
(19:15:08.051) <LF> TEST UART2 sur COM25
(19:15:09.023) <LF> TEST UART2 sur COM25
(19:15:10.032) <LF> TEST UART2 sur COM25
(19:15:11.044) <LF> TEST UART2 sur COM25
(19:15:12.060) <LF> TEST UART2 sur COM25
(19:15:13.072) <LF> TEST UART2 sur COM25
(19:15:14.080) <LF> TEST UART2 sur COM25
(19:15:15.090) <LF>
*


Test_UART1_sur_UART2_presque_OK.jpg


extrait du main

Code : Tout sélectionner


while 
(1)
  { 
  strcpy
(Buffer1," TEST UART1 sur COM26 \r\n");
  Print1(Buffer1);
  strcpy(Buffer2," TEST UART2 sur COM25 \r\n");
  Print2(Buffer2); 
      
     LATAbits
.LATA4 = !LATAbits.LATA4; 
     
     RAZ_Buffer1
();
     RAZ_Buffer2();
     __delay_ms(1000);
     if ( Flag_Buffer1==1)
     {   
         txt
=&TEXTE[0];
         strcpy(txt,"\r\n UART1 Reçu : ");
         Print1(txt);
         Print1(Buffer1);
         Flag_Buffer1=0;
         CRLF1();
     }   
     if 
( Flag_Buffer2==1)
     {
         txt=&TEXTE[0];
         strcpy(txt,"\r\n UART2 Reçu : ");
         Print2(txt);
         Print2(Buffer2);
         Flag_Buffer2=0;
         CRLF2();
     }    
  
}



UART1_UAR2_Test_18F27K42_MPLABX.zip



A suivre ... la version 18F47K42 !
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

UART2 et UART1 en interrupt avec 18F47K42
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#10 Message par satinas » mar. 1 sept. 2020 08:01 lien vers la Data-Sheet : Cliquez ici

Bonjour
1. ligne IPEN = 1 superflue
2. dans RAZ_Buffer1(void) tu fais Flag_Buffer2=0 au lieu de Flag_Buffer1=0
3. dans CRLF2(void) tu remplis U1TXB au lieu de U2TXB


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : paulfjujo et 118 invités