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 ---
Modérateur : Jérémy
Liaison I2C entre deux PIC (Maître-Esclace)
Liaison I2C entre deux PIC (Maître-Esclace)
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
J'ai ce petit outils très très bien pour mon niveau . Il m'a rendu de fières chandelles
analyseur logique
analyseur logique
Liaison I2C entre deux PIC (Maître-Esclace)
- Gérard
Expert- Messages : 1654
- Âge : 65
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
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?
Liaison I2C entre deux PIC (Maître-Esclace)
Liaison I2C entre deux PIC (Maître-Esclace)
Liaison I2C entre deux PIC (Maître-Esclace)
- Gérard
Expert- Messages : 1654
- Âge : 65
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
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.
Liaison I2C entre deux PIC (Maître-Esclace)
-
pic18f4580
Membre- Messages : 11
- Enregistré en : mai 2016
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:
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...
++
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)
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.
@+
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.
@+
Liaison I2C entre deux PIC (Maître-Esclace)
-
pic18f4580
Membre- Messages : 11
- Enregistré en : mai 2016
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.
Bien sûr, c'est géré par
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
Et avec l'esclave :
Ca ne changer rien, l'esclave reçoit toujours en boucle son adresse "2". Mais jamais la donnée "4".
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- Messages : 11
- Enregistré en : mai 2016
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 49 invités