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 ---
Problème de séquence I2C entre deux PIC
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.
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
Problème de séquence I2C entre deux PIC
Problème de séquence I2C entre deux PIC
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:
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:
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
Problème de séquence I2C entre deux PIC
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
endif
loop
do
if SSPSTAT.0 then ' Attente buffer plein
data_i2c = SSPBUF ' Lecture data
endif
loop ' (ajouter un temps de sortie)
Et bien que ce soit pareil, ça fonctionne déjà beaucoup mieux.
Je comprend pas pourquoi .....?
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
endif
loop
do
if SSPSTAT.0 then ' Attente buffer plein
data_i2c = SSPBUF ' Lecture data
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
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
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
Problème de séquence I2C entre deux PIC
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.
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
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
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
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 4 invités