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
Configuration liaison I2C entre deux PICs !
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Dur dur.
J'avance un peu. j'arrive en appuyant sur mon Bouton à l’écran à effectué une tache en reception ; Mais je ne sais pas trop ce que c'est que cette tache.
Voici le programme de reception ( partie utile )Comme vous le voyez je patauge encore avec l'ACSII .
J'ai donc après 2 appuis sur le BP, le texte I2C= qui s'affiche avec trois petits triangles rectangles a la suite .
J’en déduis que j'arrive à recevoir des données en I2C, et que je remplis le buffer, je l'affiche car j'arrive a la taille maximal du buffer non ? mais il est remplis pas avec les valeurs attendues
J'avance un peu. j'arrive en appuyant sur mon Bouton à l’écran à effectué une tache en reception ; Mais je ne sais pas trop ce que c'est que cette tache.
Voici le programme de reception ( partie utile )Comme vous le voyez je patauge encore avec l'ACSII .
Code : Tout sélectionner
// Déclaration des variables utilisées -------------------------------------------
char Rx_I2C_Buffer[50];
char P_Variable[32]; // Tableau contenant les caractéres des 8 variables de 3 chiffres ( 3x8=24) + 6 espaces + 2 terminateur = 32
unsigned short RegistreI2C;
unsigned int Registre, Flag_Data_OK=0, Flag_I2C_OK=0, i=0, Flag_Erreur=0, compteur = 95,Index_Buffer=0;
// Fin des variables----------------------------------------------------------------
// Début Interruption---------------------------------------------------------------
void interrupt (){
if (PIR1.SSP1IF) // On check le FLAG de l'INT et si elle est autorisée
{
RegistreI2C = SSP1BUF;
//RegistreI2C = I2C1_Rd(0); // On lit et stock dans le buffer
if ((RegistreI2C == 'A') ||(RegistreI2C == 65) || (Index_Buffer>=3)) // Si on recoit "CR" ou qu'on dépasse la taille du buffer
{
Flag_I2C_OK = 1; // On léve le drapeau pour indiqué que le mot est fini
Rx_I2C_Buffer[Index_Buffer]=0; // terminateur de string
}
else
{
Rx_I2C_Buffer[Index_Buffer]= RegistreI2C; // On enregistre la lettre à l'emplacement de l'index dans le buffer
Index_Buffer ++ ; // On incremente l'index pour la lettre suivante
}
PIR1.SSPIF = 0; // Réarme le flag
}
}
// Fin Interruption ----------------------------------------------------------------
//##################################################################################
//######################### PROGRAMME PRINCIPAL #########################
//##################################################################################
void main() {
ANSELB = 0x00; // Configure le PORTB en digital pour le LCD
ANSELC = 0x00; // PORTC en digital
ANSELD = 0x00; // PORTD en digital
ANSELE = 0x00; // PORTD en digital
TRISB = 0x00; // PORTB en sortie
TRISC = 0x00; // PORTC en sortie
TRISD = 0xFF; // PORTD en entrée
TRISE = 0x00; // PORTD en sortie
//----- config. interrutpion ------------------------------------------------------
INTCON.GIE = 1; // Activation Global des INT
INTCON.PEIE = 1; // Active l'INT sur periphérique
PIE1.RC1IE = 1; // Active l'INT sur reception EUSART
PIR1.RC1IF = 0; // bit=0 --> buffer vide
PIE1.SSP1IE = 1; // Active l'INT sur SSP
PIR1.SSP1IF = 0; // Flag de l'I2C
//---------------------------------------------------------------------------------
UART1_Init(9600); // Initialisation de l'UART
delay_ms(100); // Petite pause
Lcd_Init(); // Initialisation du LCD
Lcd_Cmd (_LCD_CLEAR); // On efface l'écran
Lcd_Cmd (_LCD_CURSOR_OFF);// On arrete le clignotement du curseur
delay_ms(100); // Petite pause
SSPM1_bit = 0x06;
SSP1ADD = 0x78;
I2C1_Init(100000);
//####################### BOUCLE INFINIE ####################################
while (1)
{
if (Flag_I2C_OK == 1) // reception d'un mot dans le buffer
{
PORTE.B0 = 1 ;delay_ms(100);PORTE.B0 = 0 ;
Lcd_Out (2, 7, "I2C=");
Lcd_Out (2, 11, Rx_I2C_Buffer); // On l'affiche sur le LCD
delay_ms(2000); // Petite pause
Lcd_Out (2, 7," "); // On l'efface
Flag_I2C_OK = 0; // on rearme notre drapeau
Index_Buffer = 0; // on raz l'index
}
J'ai donc après 2 appuis sur le BP, le texte I2C= qui s'affiche avec trois petits triangles rectangles a la suite .
J’en déduis que j'arrive à recevoir des données en I2C, et que je remplis le buffer, je l'affiche car j'arrive a la taille maximal du buffer non ? mais il est remplis pas avec les valeurs attendues
Configuration liaison I2C entre deux PICs !
- paulfjujo
Expert- Messages : 2598
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonsoir,
Je n'ai pas testé ton programme,mais
65 ou 'A' c'est pareil
par contre il manque le test du CR
Je n'ai pas testé ton programme,mais
Code : Tout sélectionner
if ((RegistreI2C == 'A') ||(RegistreI2C == 65) || (Index_Buffer>=3)) // Si on recoit "CR" ou qu'on dépasse la taille du buffer
65 ou 'A' c'est pareil
par contre il manque le test du CR
Code : Tout sélectionner
if ((RegistreI2C == 'A') ||(RegistreI2C == 13) || (Index_Buffer>=3)) // Si on recoit "CR" ou qu'on dépasse la taille du buffer
Configuration liaison I2C entre deux PICs !
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Oui Paulfjujo, tu as raison .
J'ai fais tellement de test que maintenant j'essaye de verrouiller mes infos , alors j'ai mis 'A' ou 65 car je n'étais pas sur de moi .
Pour le test du CR , je vais ré-essayer car j'ai fais des modifs hier soir .
Je vous tiens au jus.
J'ai fais tellement de test que maintenant j'essaye de verrouiller mes infos , alors j'ai mis 'A' ou 65 car je n'étais pas sur de moi .
Pour le test du CR , je vais ré-essayer car j'ai fais des modifs hier soir .
Je vous tiens au jus.
Configuration liaison I2C entre deux PICs !
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Quand ça veut pas ben ça veut pas .
Voici le code émission amélioré . Une sous routine permettant d'envoyer proprement une donnée . j'envoie 5 données de suite de la valeur binaire 63 à 68 . donc qui comprends un 65 dedans . A la fin de l'envoi de ces 5 données j'envoie un CR.
durant la fonction je vois bien mon texte "test" qui clignote au rythme des envois . Je pense que de ce cote je suis bon , si la procédure I2C est bien celle-ci .
I2C_start , envoie de l'adresse esclave ici 0x69 . puis envoi d'une donnée , puis I2C_stop .
Cote reception le point délicat je pense.
Quoi que je fasse , le seul moyen de finir la reception c'est d'arriver à la limite du buffer ; je ne reçois jamais de CRou le 65 . J'ai donc bien mon flag de reception I2C qui se lève ( avec affichage du texte) seulement après l'avoir remplit de 4 lettres . Les lettres sont des symbol triangle rectangle ( angle à 90° en haut a gauche), 4 symbols s'affiche à la place des données envoyées .
Je ne suis pas certain de bien vider mon buffer à la lecture de celui-ci . sinon je ne vois pas trop d'ou ca peut venir . Tout inidque qu'il recoit bien quelques chose mais pas la bonne chose ou alors qu'il l'affiche mal .
J'ai un doute sur cette ligne . Code trouvé sur la toile
Voici le code émission amélioré . Une sous routine permettant d'envoyer proprement une donnée . j'envoie 5 données de suite de la valeur binaire 63 à 68 . donc qui comprends un 65 dedans . A la fin de l'envoi de ces 5 données j'envoie un CR.
durant la fonction je vois bien mon texte "test" qui clignote au rythme des envois . Je pense que de ce cote je suis bon , si la procédure I2C est bien celle-ci .
I2C_start , envoie de l'adresse esclave ici 0x69 . puis envoi d'une donnée , puis I2C_stop .
Code : Tout sélectionner
void Envoi_I2C(unsigned int donnee){
I2C2_Start();
I2C2_Wr(0x69); // adresse de l'eclave
I2C2_Wr(donnee);
I2C2_Stop();
}
void Tx_I2C_OnClick() {
TFT_Set_Font(TFT_defaultFont, CL_YELLOW, FO_HORIZONTAL);
TFT_Write_Text("TX_I2C", 130, 45); // On ecrit un mot sur l'écran pour verifier l'execution de la fonction
delay_ms(250);
TFT_Set_Brush(1, CL_BLACK, 0, LEFT_TO_RIGHT, CL_BLACK, CL_WHITE); // On efface le texte par un rectangle noir
TFT_Rectangle(130,48, 200,60);
I2C2_Init(100000);
delay_ms(100);
for (i=0;i<=5;i++)
{
TFT_Write_Text("test ", 130, 45);
Envoi_I2C(63+i);
delay_ms(150);
TFT_Set_Brush(1, CL_BLACK, 0, LEFT_TO_RIGHT, CL_BLACK, CL_WHITE); // On efface le texte par un rectangle noir
TFT_Rectangle(130,48, 200,60);
delay_ms(150);
}
Envoi_I2C(13); // Envoi d'un CR
TFT_Set_Brush(1, CL_BLACK, 0, LEFT_TO_RIGHT, CL_BLACK, CL_WHITE); // On efface le texte par un rectangle noir
TFT_Rectangle(130,48, 200,60);
delay_ms(100);
}
Cote reception le point délicat je pense.
Quoi que je fasse , le seul moyen de finir la reception c'est d'arriver à la limite du buffer ; je ne reçois jamais de CRou le 65 . J'ai donc bien mon flag de reception I2C qui se lève ( avec affichage du texte) seulement après l'avoir remplit de 4 lettres . Les lettres sont des symbol triangle rectangle ( angle à 90° en haut a gauche), 4 symbols s'affiche à la place des données envoyées .
Je ne suis pas certain de bien vider mon buffer à la lecture de celui-ci . sinon je ne vois pas trop d'ou ca peut venir . Tout inidque qu'il recoit bien quelques chose mais pas la bonne chose ou alors qu'il l'affiche mal .
Code : Tout sélectionner
/*##################################################################################
Programme de test pour liaison UART-USB sur carte EasyPIC_V7 avec ecran PIC18FJ
Fait par Jérémy sur FantasPic.fr
- Version du "23-01-2016"
- MikroC version 6.6.2
- PIC 18F46K22 FOSC à 8MHZ, Quartz extrene de 8Mhz, PLL désactivée
- Data-Shit du PIC : http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf
- manuel et schéma de la carte : http://www.mikroe.com/downloads/get/1711/easypic_v7_manual_v104c.pdf
#################################################################################*/
#define BP0 PORTD.B0
#define BP1 PORTD.B1
#define BP6 PORTD.B6
#define BP7 PORTD.B7
// Connections de l'écran LCD
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// Fin connections LCD
// Déclaration des variables utilisées -------------------------------------------
char Rx_I2C_Buffer[50];
char Rx_buffer[50];
char P_compteur[7]; // tableau contenant mon compteur de 5 chiffres ( int) + 2 pour le terminateur de string /0
char P_Variable[32]; // Tableau contenant les caractéres des 8 variables de 3 chiffres ( 3x8=24) + 6 espaces + 2 terminateur = 32
char texte[55]= "1---5----10----15----20----25----30"; // Tablmeua contenant du texte
unsigned short RegistreI2C;
unsigned int Registre, j, Flag_Data_OK=0, Flag_I2C_OK=0, i=0, Flag_Erreur=0, compteur = 95,Index_Buffer=0;
unsigned int var0=100, var1=101,var2=102, var3=103, var4=104, var5=105, var6=106, var7=110;
// Fin des variables----------------------------------------------------------------
// Début Interruption---------------------------------------------------------------
void interrupt (){
if (PIR1.SSP1IF == 1 ) // On check le FLAG de l'INT et si elle est autorisée
{
PIR1.SSP1IF = 0; // Réarme le flag
RegistreI2C = SSP1BUF; // Lecture du buffer qui efface celui-ci
if ((RegistreI2C == 13) ||(RegistreI2C == 65) || (Index_Buffer>=4) ) // Si on recoit "CR" ou qu'on dépasse la taille du buffer
{
Flag_I2C_OK = 1; // On léve le drapeau pour indiqué que le mot est fini
Rx_I2C_Buffer[Index_Buffer]=0; // terminateur de string
}
else
{
Rx_I2C_Buffer[Index_Buffer]= RegistreI2C; // On enregistre la lettre à l'emplacement de l'index dans le buffer
Index_Buffer ++ ; // On incremente l'index pour la lettre suivante
}
}
}
// Fin Interruption ----------------------------------------------------------------
//##################################################################################
//######################### PROGRAMME PRINCIPAL #########################
//##################################################################################
void main() {
ANSELB = 0x00; // Configure le PORTB en digital pour le LCD
ANSELC = 0x00; // PORTC en digital
ANSELD = 0x00; // PORTD en digital
ANSELE = 0x00; // PORTD en digital
TRISB = 0x00; // PORTB en sortie
TRISC = 0b00011000; // PORTC en sortie
TRISD = 0xFF; // PORTD en entrée
TRISE = 0x00; // PORTD en sortie
//----- config. interrutpion ------------------------------------------------------
INTCON.GIE = 1; // Activation Global des INT
INTCON.PEIE = 1; // Active l'INT sur periphérique
PIE1.RC1IE = 1; // Active l'INT sur reception EUSART
PIR1.RC1IF = 0; // bit=0 --> buffer vide
PIE1.SSP1IE = 1; // Active l'INT sur SSP
PIR1.SSP1IF = 0; // Flag de l'I2C
//---------------------------------------------------------------------------------
UART1_Init(9600); // Initialisation de l'UART
delay_ms(100); // Petite pause
Lcd_Init(); // Initialisation du LCD
Lcd_Cmd (_LCD_CLEAR); // On efface l'écran
Lcd_Cmd (_LCD_CURSOR_OFF);// On arrete le clignotement du curseur
delay_ms(100); // Petite pause
SSPM1_bit = 0x06;
SSP1ADD = 0x69;
I2C1_Init(100000);
//####################### BOUCLE INFINIE ####################################
while (1)
{
if (Flag_I2C_OK == 1) // reception d'un mot dans le buffer
{
PORTE.B0 = 1 ;delay_ms(100);PORTE.B0 = 0 ; // clignote une led pour verification
Lcd_Out (2, 7, "I2C=");
Lcd_Out (2, 11, Rx_I2C_Buffer); // On affiche le buffer sur le LCD
delay_ms(2000); // Petite pause
Lcd_Out (2, 7," "); // On l'efface
Flag_I2C_OK = 0; // on rearme notre drapeau
Index_Buffer = 0; // on raz l'index
}
}
}
J'ai un doute sur cette ligne . Code trouvé sur la toile
Code : Tout sélectionner
SSPM1_bit = 0x06; // I2C slave mode 7 bits adresse
Configuration liaison I2C entre deux PICs !
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour à tous,
Bon j'ai sortis l'analyseur logique avant de baisser les bras ...... .
Je pense avoir un probléme d'envoi car voici ce que j'ai sur la ligne quand j’appuie sur mon bouton "envoi"
On voit 7 trames identiques ! je vous en ai mis qu'une pour zoomer . je ne comprends pas le read from slave 0x34 ? . lecture depuis l'esclave en 0x34 ????
J’écris normalement et je ne lis pas, et en plus à l'adresse 0x69 et non 0x34.
de plus il n'y a pas le CR . j'en déduis que je n'envoie pas les bonnes choses, ou plutôt que ça envoie mal .
Je cherche des infos sur cette vitesse d'initialisation dont il parle dans l'aide mikroC .
Peut etre que sur le PIC18Fj de l'écran il ne faut pas mettre 100 KHz ?
Bon j'ai sortis l'analyseur logique avant de baisser les bras ...... .
Je pense avoir un probléme d'envoi car voici ce que j'ai sur la ligne quand j’appuie sur mon bouton "envoi"
On voit 7 trames identiques ! je vous en ai mis qu'une pour zoomer . je ne comprends pas le read from slave 0x34 ? . lecture depuis l'esclave en 0x34 ????
J’écris normalement et je ne lis pas, et en plus à l'adresse 0x69 et non 0x34.
de plus il n'y a pas le CR . j'en déduis que je n'envoie pas les bonnes choses, ou plutôt que ça envoie mal .
Je cherche des infos sur cette vitesse d'initialisation dont il parle dans l'aide mikroC .
Description Initializes I²C with desired clock (refer to device data sheet for correct values in respect with Fosc). Needs to be called before using other functions of I²C Library.
Peut etre que sur le PIC18Fj de l'écran il ne faut pas mettre 100 KHz ?
Configuration liaison I2C entre deux PICs !
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bon j'ai résolu le problème du Read à la place du Write . il s'agit de l'adresse de l'esclave qui avait un "1" a la fin plutot qu'un "0" . Donc il comprends comme un read.
Je m'oriente vers une erreur d’émission plutôt ! donc de configuration du master. je cherche , je cherche ....
J e reviens surce que j'ai dit ; pëut être a cause de l'accusé de reception qui ne se fait pas en reception .
Je m'oriente vers une erreur d’émission plutôt ! donc de configuration du master. je cherche , je cherche ....
J e reviens surce que j'ai dit ; pëut être a cause de l'accusé de reception qui ne se fait pas en reception .
Configuration liaison I2C entre deux PICs !
Configuration liaison I2C entre deux PICs !
-
pic18f4580
Membre- Messages : 11
- Enregistré en : mai 2016
Configuration liaison I2C entre deux PICs !
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Je reprendrais certainement bientôt, car c'est tout de même utile de savoir faire communiquer deux PICs en I2C !
Ca me saoule de ne pas avoir réussis ! Si tu as eu quelques pistes ou vues des erreurs n'hésite pas , à partager, ça pourrait toujours aider à trouver la solution
Ca me saoule de ne pas avoir réussis ! Si tu as eu quelques pistes ou vues des erreurs n'hésite pas , à partager, ça pourrait toujours aider à trouver la solution
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 114 invités