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 ---
Idée, bugs, propositions .......
Problème de séquence I2C entre deux PIC
Serge
Amateur
Amateur
Messages : 163
Enregistré en : septembre 2018

#1 Message par Serge » dim. 26 avr. 2020 16:11 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous.

J'essaye de faire dialoguer deux pic (18F4620 avec 18F2620), et un afficheur I2C
Les trois sont sur la même ligne SCL et SDA avec Résistance de rappel de 10K

Jusque là tout va bien.
J'écris sur l'afficheur sans problème particulier

Mais dès que je dialogue entre les deux PIC, ça se complique:

Mon PIC Maitre est le 18F4620 qui dialogue aussi avec l'afficheur.
Le Pic Esclave 18F2620 fonctionne parfois, et c'est le "parfois" qui me dérange.
En effet, par moment, il envoie l'Acknowlege (SSPCON2.6) avant la fin de transmission de l'adresse (SSPSTAT.2)
et cela provoque bien-sûr une erreur de comm.
Je n'arrive pas à trouver la raison, car parfois celà fonctionne

Le maitre envoie la séquence sans interruption (INTCON.7=0)
et l'esclave reçois les séquences sur l' interruption (PIR1.3) seule Interruption active. (pas de hiérarchie)

Si Quelqu'un a une idée du sujet ?
Merci pour votre aide.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par Serge le dim. 26 avr. 2020 20:49, modifié 1 fois.

Problème de séquence I2C entre deux PIC
Serge
Amateur
Amateur
Messages : 163
Enregistré en : septembre 2018

#2 Message par Serge » dim. 26 avr. 2020 16:35 lien vers la Data-Sheet : Cliquez ici

Voici ce que donne l'oscillo.

Le PIC qui intervient après l'adresse n'est pas normal.

20200426_162212.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Problème de séquence I2C entre deux PIC
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » dim. 26 avr. 2020 19:00 lien vers la Data-Sheet : Cliquez ici

 ! Message de modération :
Bonjour Serge,

Quel est ton langage de programmation que je puisse déplacer ton sujet dans la bonne catégorie ?
Comme cela parle de PIC il faut sélectionner une catégorie de langage .

Voici le lien pour mettre correctement ta DS en ligne.
Mettre le lien de sa Data-Sheet

Merci de ta compréhension.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Problème de séquence I2C entre deux PIC
Serge
Amateur
Amateur
Messages : 163
Enregistré en : septembre 2018

#4 Message par Serge » dim. 26 avr. 2020 20:38 lien vers la Data-Sheet : Cliquez ici

Bonjour Jérémy.

Ok pour le lien je vais le changer.

Le langage que j'utilise est Pic Basic Pro, mais en fait j'utilise les registre du MSSP pas son language car il n'est pas très fonctionnel depuis les modules intégrés dans les PIC.

Voici un exemple de mon code:
exemple.txt
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par Serge le lun. 27 avr. 2020 13:20, modifié 1 fois.

Problème de séquence I2C entre deux PIC
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#5 Message par satinas » lun. 27 avr. 2020 08:37 lien vers la Data-Sheet : Cliquez ici

Bonjour,

SSPSTAT.2 = 1 ' Transmission de l'adresse
Ces lignes ne sont pas nécessaires, le bit est read-only.

Le pic esclave n'acquitte pas l'adresse.
Le problème se produit avec et sans afficheur connecté ?
Tu as testé avec des distances plus courtes ?

Problème de séquence I2C entre deux PIC
Serge
Amateur
Amateur
Messages : 163
Enregistré en : septembre 2018

#6 Message par Serge » lun. 27 avr. 2020 13:01 lien vers la Data-Sheet : Cliquez ici

Bonjour Satinas.

Merci pour l'info du SSPSTAT.2=1 inutil.

Distance entre PIC (pistes) 10 Cm environ (j'ai réussi des échanges à plus de 5m...)
Avec ou sans affichage, c'est pareil.
La séquence avec l'afficheur ne bug pas et est beaucoup plus longue (1m blindé).

J'ai changé le "While not SSPSTAT.0 : wend de l'interruption de l'esclave

par:
do
if SSPSTAT.0 then ' Attente buffer plein
poubelle = SSPBUF ' Effacement de l'adresse dans buffer
exit
endif
loop
do
if SSPSTAT.0 then ' Attente buffer plein
data_i2c = SSPBUF ' Lecture data
exit
endif
loop ' (ajouter un temps de sortie)

Et bien que ce soit pareil, ça fonctionne déjà beaucoup mieux.

Je comprend pas pourquoi .....?

Problème de séquence I2C entre deux PIC
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#7 Message par satinas » lun. 27 avr. 2020 13:29 lien vers la Data-Sheet : Cliquez ici

A la compilation il y a peut être plus d'instructions donc des petits delais supplémentaires.

Si tu n'as pas mis d'interruption sur le start, et si l'adresse n'est pas acquittée, l'erreur s'est produite avant que le flag IF passe à 1 et que l'interruption soit déclenchée, donc le soft n'a encore rien fait. Voir timing page 176.

Il y a au moins 2 Silicon Datasheet Errata qui parlent d'I2C, dans Documents.
https://www.microchip.com/wwwproducts/en/PIC18F2620

Problème de séquence I2C entre deux PIC
Serge
Amateur
Amateur
Messages : 163
Enregistré en : septembre 2018

#8 Message par Serge » lun. 27 avr. 2020 14:29 lien vers la Data-Sheet : Cliquez ici

Oui, il semble que le Do/loop soit plus performant que le while/wend

merci pour l'info.

Je vais poursuivre mon application, car en lecture, j'ai plus à gérer et je redoute les PB.
et reviendrai tenir au courant des résultats.

Merci.

Problème de séquence I2C entre deux PIC
Serge
Amateur
Amateur
Messages : 163
Enregistré en : septembre 2018

#9 Message par Serge » ven. 1 mai 2020 13:26 lien vers la Data-Sheet : Cliquez ici

Bonjour.

Et bien finalement, ça ne fonctionne pas mieux.
Ca marche de temps en temps, et ça plante très vite.....
avec un manque d'acknowledge derrière le premier data sans explication apparente car ça fonctionne aussi par moment.....

Voici mon code Sur le PIC Maître pour envoyer une séquence I2c:

Envoie_Sequence:
'arret des interruptions
INTCON.7=0

do while SSPCON2 << 3+SSPSTAT.2 <>0 : loop ' Pas de Transmission en cours
SSPCON2.0 = 1 ' Condition Start sur le bit SEN
do while SSPCON2.0 : loop ' Attente fin de la condition START

SSPBUF = Pic2620_cm_ea ' Adresse 1 ecriture ($82)
do while SSPSTAT.2 : loop ' Attente fin transmission
do while SSPCON2.6 : loop ' Attente de l'acknowledge

SSPBUF = octet(0) ' Premier Octet à envoyer
do while SSPSTAT.2 : loop ' Attente fin transmission
do while SSPCON2.6 : loop ' Attente de l'acknowledge

SSPBUF = octet(1) ' Deuxième Octet à envoyer
do while SSPSTAT.2 : loop ' Attente fin transmission
do while SSPCON2.6 : loop ' Attente de l'acknowledge

SSPBUF = octet(2) ' troisième Octet à envoyer
do while SSPSTAT.2 : loop ' Attente fin transmission
do while SSPCON2.6 : loop ' Attente de l'acknowledge

SSPCON2.2 = 1 ' PEN copndition STOP
do while SSPCON2.2 : loop ' attente Bus Libre

INTCON.7=1

return


et voici le code sur le Pic Esclave dans l'interruption PIR1.3

Int:

if PIR1.3 and not SSPSTAT.2 and not SSPSTAT.5 then 'Flag de l'I2c ' Si c'est l'adresse en écriture...

do while not SSPSTAT.0 : loop ' Attente buffer plein
poubelle = SSPBUF ' Effacement de l'adresse pic2620_cm_EA dans buffer
do while SSPSTAT.0 : loop ' attente buffer vide

do while not SSPSTAT.0 : loop ' Attente buffer plein
premier_data = SSPBUF ' Les 20 premières commandes n'ont qu'un Octet
do while SSPSTAT.0 : loop ' attente buffer vide

do while not SSPSTAT.0 : loop ' Attente buffer plein
data_2= SSPBUF ' Lecture data
do while SSPSTAT.0 : loop ' attente buffer vide

do while not SSPSTAT.0 : loop ' Attente buffer plein
data_3= SSPBUF ' Lecture data
do while SSPSTAT.0 : loop ' attente buffer vide


recu=1
PIR1.3=0
endif

resume
enable
End

si quelqu'un comprend ce qui peut se passer ?

Merci pour votre aide.

Problème de séquence I2C entre deux PIC
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#10 Message par satinas » ven. 1 mai 2020 15:13 lien vers la Data-Sheet : Cliquez ici

Bonjour Serge et à tous,

Si une interruption est autorisée, lorsque son flag d'interruption est levé, il faut le remettre à zéro à tous les coups, sinon l'interruption va se relancer en permanence, et le pic ne répondra plus, bien que pas planté.
Même si tu penses que cela ne devrait pas se produire, il faut prévoir le cas, c'est de la programmation défensive, il faut prévoir un message d'erreur.
Donc

Code : Tout sélectionner

if PIR1.3
  if not SSPSTAT.2 and not SSPSTAT.5 then 'Flag de l'I2c ' Si c'est l'adresse en écriture...

    do while not SSPSTAT.0 : loop ' Attente buffer plein
    poubelle = SSPBUF ' Effacement de l'adresse pic2620_cm_EA dans buffer
    do while SSPSTAT.0 : loop ' attente buffer vide
 
    do while not SSPSTAT.0 : loop ' Attente buffer plein
    premier_data = SSPBUF ' Les 20 premières commandes n'ont qu'un Octet
    do while SSPSTAT.0 : loop ' attente buffer vide
 
    do while not SSPSTAT.0 : loop ' Attente buffer plein
    data_2= SSPBUF ' Lecture data
    do while SSPSTAT.0 : loop ' attente buffer vide
 
    do while not SSPSTAT.0 : loop ' Attente buffer plein
    data_3= SSPBUF ' Lecture data
    do while SSPSTAT.0 : loop ' attente buffer vide

    recu=1

  else
    if SSPSTAT.0
      poubelle = SSPBUF
    endif

  endif
  PIR1.3=0
endif

Attention, quand tu fais PIR1.3 = 0 après le 8ème bit, il se peut que derrière le flag d'interruption repasse à 1 sur le 9ème bit, voir timing.
Si tu utilises une routine d'interruption, il vaut mieux recevoir les octets un par un, plutôt que la bloquer pour recevoir plusieurs octets.

Fais un essai avec une boucle qui scrute le flag pour voir ce que cela donne
Modifié en dernier par satinas le ven. 1 mai 2020 15:33, modifié 1 fois.


Retourner vers « Le forum Fantas-PIC »

Qui est en ligne

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