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
Je teste ta solution, mais en fait ma boucle avait aussi une condition "else" sur le mode lecture...
Donc mon else remettait à 0 le flag éventuel.
Je n'avais pas mis dans le texte pour ne pas compliquer l'explication.
Cependant je ne faisais pas tout à fait pareil que ce que tu me propose (je ne vidais pas le buffer)...
Alors je teste.....
merci.
Donc mon else remettait à 0 le flag éventuel.
Je n'avais pas mis dans le texte pour ne pas compliquer l'explication.
Cependant je ne faisais pas tout à fait pareil que ce que tu me propose (je ne vidais pas le buffer)...
Alors je teste.....
merci.
Problème de séquence I2C entre deux PIC
J'ai testé ta solution, et pour le moment, ça fonctionne super bien.......
(j'aime pas dire ça trop vite, j'ai toujours peur que ça plante)
Comment ce" buffer" pouvait il être plein ????
C'est difficile de penser à la vitesse de la µs !!!
J'apprends l'humilité avec l'informatique !
15 jours que j'ai "tout" essayé dans tous les sens.... mais pas ce truc là.
Par ailleur, celà explique que ça ne plante pas avec l'afficheur. C'est bien un soucis de réception (esclave)
Du coup j'avance sur le mode lecture... et là, ça marche pas vraiment. je ne visualise pas complètement le pointeur.
J'ai déjà fait fonctionner en mode lecture, mais je me souviens plus ce que j'avais écrit. (c'est l'âge!)
Voici mon code complet pour les deux modes, Ecriture et lecture.
Trop content que l'écriture fonctionne (pour le moment....)
Merci
(j'aime pas dire ça trop vite, j'ai toujours peur que ça plante)
Comment ce" buffer" pouvait il être plein ????
C'est difficile de penser à la vitesse de la µs !!!
J'apprends l'humilité avec l'informatique !
15 jours que j'ai "tout" essayé dans tous les sens.... mais pas ce truc là.
Par ailleur, celà explique que ça ne plante pas avec l'afficheur. C'est bien un soucis de réception (esclave)
Du coup j'avance sur le mode lecture... et là, ça marche pas vraiment. je ne visualise pas complètement le pointeur.
J'ai déjà fait fonctionner en mode lecture, mais je me souviens plus ce que j'avais écrit. (c'est l'âge!)
Voici mon code complet pour les deux modes, Ecriture et lecture.
Code : Tout sélectionner
'Maître:'
Ecriture: ' Programme d''écriture de données par I2C sur le pic esclave'
'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
pauseus 10
return
Lecture: ' Programme de lectures de données par I2C sur le pic esclave '
INTCON.7=0 'arret des interruptions'
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_la ' Adresse 1 Lecture ($83)'
do while SSPSTAT.2 : loop ' Attente fin transmission'
do while SSPCON2.6 : loop ' Attente de l''acknowledge' ' CKP Passe à 0 => SSPCON1.4=0 le bus est en attente de l''esclave'
SSPCON2.3 = 1 ' RCEN 1= Enable mode réception I2c'
reponse(1)=SSPBUF
SSPCON2.5 = 0 ' préparation de l''Acknowledge'
SSPCON2.4 = 1 ' Envoie de l''Acknowledge'
do while SSPCON2.4 : loop ' Attente fin d''acknowledge'
SSPCON2.3 = 1 ' RCEN 1= Enable mode réception I2c'
reponse(2)=SSPBUF
SSPCON2.4 = 1 ' Envoie de l''Acknowledge'
do while SSPCON2.4 : loop ' Attente fin d''acknowledge'
SSPCON2.3 = 1 ' RCEN 1= Enable mode réception I2c'
reponse(3)=SSPBUF
SSPCON2.4 = 1 ' Envoie de l''Acknowledge'
do while SSPCON2.4 : loop ' Attente fin d''acknowledge'
SSPCON2.3 = 1 ' RCEN 1= Enable mode réception I2c'
reponse(4)=SSPBUF
SSPCON2.5 = 1 ' préparation du non Acknowledge'
SSPCON2.4 = 1 ' Envoie du non Acknowledge'
do while SSPCON2.4 : loop
gosub stop_i2c
INTCON.7=1
return
' et sur le PIC Esclave'
disable
Int:
if PIR1.3 then
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
'Jusque là, ça fonctionne pour recevoir les 4 octets du Maître.
Ensuite... ça marche plus pour envoyer vers une lecture du Maître.'
elseif SSPSTAT.2 and not SSPSTAT.5 then ' Si non, c''est l''adresse en mode Lecture'
do while not SSPSTAT.0 : loop ' Attente buffer plein'
poubelle = SSPBUF ' Effacement de l''adresse dans buffer (CKP=0 automatiquement)'
envoie=hb/256 ' Calcul de l''Octet (poid fort du "Word")'
SSPBUF=envoie ' Premier octet à envoyer'
SSPCON1.4 = 1 ' CKP Esclave: 1= CLK'
do while SSPSTAT.0 : loop ' Attente buffer vide'
envoie=hb-(envoie*256) ' Calcul de l''octet (poid faible du "Word")'
SSPBUF=envoie ' Deuxième octet à envoyer'
SSPCON1.4 = 1 ' CKP Esclave: 0= Blocage CLK'
do while SSPSTAT.0 : loop ' Attente buffer vide'
envoie=gd/256 ' Calcul de l''Octet (poid fort du "Word") 2ème mot'
SSPBUF=envoie ' troisième octet à envoyer'
SSPCON1.4 = 1 ' CKP Esclave: 0= Blocage CLK'
do while SSPSTAT.0 : loop ' Attente buffer vide'
envoie=gd-(envoie*256)
SSPBUF=envoie ' quatrième octet à envoyer'
SSPCON1.4 = 1 ' CKP Esclave: 0= Blocage CLK'
do while SSPSTAT.0 : loop ' Attente buffer vide'
else
if SSPSTAT.0 then
poubelle = SSPBUF
endif
endif
PIR1.3=0
endif
resume
enable
End
Trop content que l'écriture fonctionne (pour le moment....)
Merci
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par Serge le ven. 1 mai 2020 17:05, modifié 1 fois.
Problème de séquence I2C entre deux PIC
viewtopic.php?p=10728#p10728
Il vaut mieux partir du simple et ajouter petit à petit, et sauvegarder souvent.
Une réception d'octet dans un buffer pas encore vidé, lève très souvent un bit d'erreur, SSPOV en I2C, il est à surveiller.
Je les regarde pas trop les bits d'erreur, mais par contre je rajoute du sécuritaire partout
Reste à savoir si l'I2C continue à marcher avec SSPOV = 1, d'après la doc, non.
Si tu reçois plusieurs octets dans l'interruption, il est important de mettre à zéro le flag d'interruption à la fin de la routine.
Il vaut mieux partir du simple et ajouter petit à petit, et sauvegarder souvent.
Une réception d'octet dans un buffer pas encore vidé, lève très souvent un bit d'erreur, SSPOV en I2C, il est à surveiller.
Je les regarde pas trop les bits d'erreur, mais par contre je rajoute du sécuritaire partout
Reste à savoir si l'I2C continue à marcher avec SSPOV = 1, d'après la doc, non.
Si tu reçois plusieurs octets dans l'interruption, il est important de mettre à zéro le flag d'interruption à la fin de la routine.
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
C'est toujours un problème d'Anockledge non reçu. et toujours après le premier Octet.
Mais avec toujours les mêmes essais, et parfois ça fonctionne, et parfois il manque un acknowledge...!
On dirait que le pic n'est pas prévu pour fonctionner avec plusieurs Octets à la suite, sans repasser par une autre interruption+adresse....
Mais ça fonctionne parfois avec 4 octets à la suite, alors pourquoi pas toujours ?
C'est cornéllien !
Mais avec toujours les mêmes essais, et parfois ça fonctionne, et parfois il manque un acknowledge...!
On dirait que le pic n'est pas prévu pour fonctionner avec plusieurs Octets à la suite, sans repasser par une autre interruption+adresse....
Mais ça fonctionne parfois avec 4 octets à la suite, alors pourquoi pas toujours ?
C'est cornéllien !
Problème de séquence I2C entre deux PIC
satinas a écrit :Tu as essayé le même programme dans une boucle de scrutation de l'interrupt flag, sans autoriser les interruptions ?
Essaie de mettre une tempo de durée 5 périodes SCL juste avant le PIR1.3 = 0
Non, pas encore, mais si on ne gère pas par interruption sur l'esclave, alors on créra encore plus de "lattence" à la réponse ?
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
Retourner vers « Le forum Fantas-PIC »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 7 invités


