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

#11 Message par Serge » ven. 1 mai 2020 15:33 lien vers la Data-Sheet : Cliquez ici

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.

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

#12 Message par Serge » ven. 1 mai 2020 16:39 lien vers la Data-Sheet : Cliquez ici

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. :lol:


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_2SSPBUF                             ' Lecture data'
            
do while SSPSTAT.0 loop                  ' attente buffer vide'
                
            
do while not SSPSTAT.0 loop           ' Attente buffer plein'
            
data_3SSPBUF                         ' 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....) :sifflotte:
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
satinas
Expert
Expert
Messages : 1497
Enregistré en : novembre 2015

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

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.

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

#14 Message par Serge » ven. 1 mai 2020 17:36 lien vers la Data-Sheet : Cliquez ici

Bon ba.... Mauvaise Nouvelle.

ça plante aussi en écriture maintenant....
Pffff, c'est désespérant.

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

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

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

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

#16 Message par Serge » ven. 1 mai 2020 17:50 lien vers la Data-Sheet : Cliquez ici

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 !

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

#17 Message par Serge » ven. 1 mai 2020 17:52 lien vers la Data-Sheet : Cliquez ici

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
Serge
Amateur
Amateur
Messages : 163
Enregistré en : septembre 2018

#18 Message par Serge » ven. 1 mai 2020 17:56 lien vers la Data-Sheet : Cliquez ici

5 périodes c'est 25µs dans mon cas.

Mais l'acknowledge, c'est le pic qui l'envoie automatiquement, alors on ne gère pas son temps de réponse.
Je comprend pas

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

#19 Message par Serge » ven. 1 mai 2020 17:58 lien vers la Data-Sheet : Cliquez ici

euuu non, 54 µs

mesurés au curseurs.
ça doit être 50 µs

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

#20 Message par satinas » ven. 1 mai 2020 18:03 lien vers la Data-Sheet : Cliquez ici

Un pic qui boucle sur un seul bit est plus rapide qu'une interruption :)

Sauf erreur, quand tu sors de ton interruption, la réception est toujours sur le 9ème bit, et le flag d'interruption repasse à 1, alors qu'il n'y a pas eu de nouvelle réception, regarde le timing page 176


Retourner vers « Le forum Fantas-PIC »

Qui est en ligne

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