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

Liaison I2C entre deux PIC (Maître-Esclace)
sylvain54
Avatar de l’utilisateur
Amateur
Amateur
Messages : 194
Âge : 51
Enregistré en : août 2015
Localisation : Dans l'est de la France

#11 Message par sylvain54 » mar. 3 mai 2016 20:44

Jérémy a écrit :Bonjour,

Tu n'as pas d'analyseur logique ? Ca aurait aidé pour voir le problème de dialogue, si c'est un problème du maitre ou de l'esclave


Petite question, tu as quoi comme analyseur logique pour étudier les signaux I2C, SPI etc ... ?

++

Liaison I2C entre deux PIC (Maître-Esclace)
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#12 Message par Jérémy » mar. 3 mai 2016 20:56

J'ai ce petit outils très très bien pour mon niveau . Il m'a rendu de fières chandelles
analyseur logique
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Liaison I2C entre deux PIC (Maître-Esclace)
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1644
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#13 Message par Gérard » mar. 3 mai 2016 23:03

Jérémy a écrit :J'ai ce petit outils très très bien pour mon niveau . Il m'a rendu de fières chandelles
analyseur logique


Tu as quelle version?
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

Liaison I2C entre deux PIC (Maître-Esclace)
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#14 Message par Jérémy » mar. 3 mai 2016 23:13

La même que mon lien. Le SCANALOGIC-2 . Je l'ai acheter chez lextronic, une cinquantaine d'€ je crois
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Liaison I2C entre deux PIC (Maître-Esclace)
sylvain54
Avatar de l’utilisateur
Amateur
Amateur
Messages : 194
Âge : 51
Enregistré en : août 2015
Localisation : Dans l'est de la France

#15 Message par sylvain54 » mer. 4 mai 2016 08:50

Merci pour le lien Jeremy.

Cela fait partie des choses que je compte acheter ou fabriquer.

++

Liaison I2C entre deux PIC (Maître-Esclace)
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1644
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#16 Message par Gérard » mer. 4 mai 2016 11:50

Jérémy a écrit :La même que mon lien. Le SCANALOGIC-2 . Je l'ai acheter chez lextronic, une cinquantaine d'€ je crois


En fait, j'ai cliqué sur le lien en fin de page et je suis tombé sur le site du fabriquant, d'où ma question.
Ca a l'air sympa comme outil.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

Liaison I2C entre deux PIC (Maître-Esclace)
pic18f4580
Membre
Membre
Messages : 11
Enregistré en : mai 2016

#17 Message par pic18f4580 » sam. 7 mai 2016 13:38

Mon problème est l'I2C entre 2 PIC.
Le CAN, qui fonctionne, n'est que le lien entre un des 2 PIC et le PC.

Je regarde ton programme :
viewtopic.php?f=10&t=171&start=10
Tu as fais plus simple pour l'esclave:

Code : Tout sélectionner


fonctionit
()
{   if (
PIR1.SSP1IF// On check le FLAG de l'INT et si elle est autorisée
      
ma_variable SSP1BUF;
           
PIR1.SSPIF 0// Réarme le flag
       
}
}
 

Je récupère ma_variable, et je l'envoie via le CAN au PC dans la foulée.
A l'écran, j'ai en boucle "2", soit l'adresse de l'esclave.
C'est plus simple, mais le résultat est le même.

J'ai essayé de mettre PIR1.SSPIF à 0 plus tard, pour pouvoir passer ici au moins 2 fois pour récupérer la seconde donnée, mais non.... ca plante...
Je regarderai ta fonction maitre...
++

Liaison I2C entre deux PIC (Maître-Esclace)
HULK28
Avatar de l’utilisateur
Amateur
Amateur
Messages : 106
Enregistré en : août 2015
Localisation : IdF

#18 Message par HULK28 » dim. 8 mai 2016 16:32

Bonjour,

normal que ça ne fonctionne pas.
Plusieurs remarques:

1/ ton code est totalement illisible et ne donne pas envie d'y perdre son temps.
2/ On ne fait pas tout ce que tu fais dans une interruption.

Pour le 1/ il faut que tu écrives des fonctions simples et lisibles.
Par exemple:

iddle_I2C();
send_byte_I2C();
etc
Dedans tu y met une fois pour toute les actions à réaliser.
Puis tu appelles tes fonctions pour avoir quelque chose sous la forme:

start_I2C();
send_byte_I2C(...);
restart_I2C();
etc

2/Lorsque un flag est activé il faut faire le traitement hors interruption, sans quoi tu vas rater la moitié des choses.
La programmation réclame un minimum d'organisation pour s'y retrouver facilement.
A force de te casser la tête tu seras contraint de t'y plier comme tout le monde, crois moi.

@+
"Pour la carotte, le lapin est la parfaite incarnation du mal" -Robert Shecley-

Liaison I2C entre deux PIC (Maître-Esclace)
pic18f4580
Membre
Membre
Messages : 11
Enregistré en : mai 2016

#19 Message par pic18f4580 » mer. 11 mai 2016 17:38

Jérémy : J'ai regardé ton code maitre, du moins, le début.
J'en ai pris exemple.
Je suis retourné aux bases car, à force de chercher et de bidouiller désespérément, je me suis égaré et j'ai compliqué le code.
Hulk28 (remarque n°1) : C'est ça qui explique le coté illisible du code.

Par exemple, dans la bibliothèque du compilateur, cette ligne me dérange, car mon PIC n'a pas SSP1CON2bits.

Code : Tout sélectionner

#define StartI2C1()  SSP1CON2bits.SEN=1
#define StartI2C StartI2C1 
 

Bien sûr, c'est géré par

Code : Tout sélectionner

#if defined(__18F64J15) blablabla 

Mais dans le doute... d'où le mélange pas propre qui s'est installé...


Donc, sous maFonctionItTimer() je fais régulièrement ça avec le maitre

Code : Tout sélectionner


    StartI2C
();        // fait SSPCON2bits.SEN=1
    
WriteI2C(2);    // adresse de l'esclave
    
WriteI2C(4);
    
StopI2C();        // fait SSPCON2bits.PEN=1
 


Et avec l'esclave :

Code : Tout sélectionner


fonctionit
()
{    if (
PIR1.SSP1IF// j'ai un message
          
{    donnees_it[0] = 26;
        
donnees_it[1] = SSPBUF;
        
ecriremessageCAN(46,&donnees_it[0],2,DONNEE);
        
//Hulk28 (remarque n°2) :
        //--> cette fonction ne fait que mettre SSPBUF dans un buffer (un simple tableau qui contient la liste des messages CAN à envoyer plus tard.)
        //Elle n'envoie donc rien et ne traite rien.
        //Puis, ce buffer sera vidé et envoyé via le CAN sur itTimer() dans une autre fonction, moins prioritaire.
        
PIR1.SSPIF 0// Réarme le flag    
    
}
}
 


Ca ne changer rien, l'esclave reçoit toujours en boucle son adresse "2". Mais jamais la donnée "4".

Liaison I2C entre deux PIC (Maître-Esclace)
pic18f4580
Membre
Membre
Messages : 11
Enregistré en : mai 2016

#20 Message par pic18f4580 » mer. 11 mai 2016 17:42

C'est curieux, les tabulations sont toujours mal alignées sur ce forum. Y a pas une astuce ?
Quand je tape le texte, c'est bien aligné, mais quand je valide le message ça se décale...


Retourner vers « Langage C »

Qui est en ligne

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