salut a tous ,
je suis debutant dans la prog des pic , j'utilise un 18F2525 en esclave
j ai quelque souci , jcrois que sa vien de mes intéruption I2C , et sauvegarde des registres,
je suis bloqué et je tourne en rond,
la carte maitre avec qui je communique en interruption m envoit dans un premier temps mon adresse , c est pour cela que je me met en reception dans l'init I2C,
puis ensuite elle m 'envoit 3 octet pour me dire qu'elle est prette a communiquer : 1er octet = adresse
2er octet = type de data
3er octet = data
mes flag de communication sont mis a jour dans la reception , et la je revient dans mon main et rentre dans cette boucle:
if(Flag_I2C.reveil_MITS == oui_ && Flag_I2C.emission_en_cours == non_ && Flag_I2C.reception_en_cours == non_ && Flag_I2C.emission_OK == non_ && Flag_I2C.reception_OK == oui_ )
{
I2C_commande(emission_,mode_MI TS_,_repos_);
Flag_I2C.emission_en_cours = oui_;
}
et la quand le prog execute I2C_commande(emission_,mode_MI TS_,_repos_);
il rentre dans la fonction """""""""void I2C_commande (unsigned char,unsigned char,unsigned char);"""""""" mais ne detecte pas que je suis en emission
et ne fais pas de front descendant sur la pin RC6 (je suis obligé de faire un front descandant sur cette pin pour que la carte maitre se mette en interruption)
alors que si je modifie le prog du maitre en enlevant les 3 premier octet emis pour dire qu il est pret ,
il arrive bien a rentrer dans I2C_commande(emission_,mode_MI TS_,_repos_);
et se mettre en mode emission ou reception
peut etre qu i faut que je sauvegarde les registres , je ne sais pas lequel ,quel varible.......
voila mon probleme je ne comprend pas , si vous voyer d autre erreur sur mon code merci de les dire , sa m aidera beaucoup.
voici mon code: la ou en fichier jointe plus bas
et encore merci pour vos aidesCode:////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// define.h /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #define cAdd_High_Vector_Int 0x0008 #define cAdd_Low_Vector_Int 0x0018 #define Port_in_2 PORTCbits.RC6 #define reveil_hard_MITS_ PORTBbits.RB4 #define adresse_MOI_ ((unsigned char) 0x20) #define mode_MITS_ ((unsigned char) 0x01) #define etat_MITS_ ((unsigned char) 0x02) #define statut_MITS_ ((unsigned char) 0x04) #define OFF_ ((unsigned char) 0x00) #define veille_ ((unsigned char) 0x01) #define reveil_MITS_ ((unsigned char) 0x02) #define _repos_ ((unsigned char) 0x00) #define _arret_ ((unsigned char) 0x07) #define emission_ 1 #define reception_ 2 /***************** Variables pour l'I2C ****************** unsigned char adresse_I2C_E; unsigned char type_I2C_E; unsigned char data_I2C_E; signed char test_transmission; unsigned char adresse_I2C_R; unsigned char type_I2C_R; unsigned char data_I2C_R; unsigned int chargdriver; struct { unsigned commande_valide :1; unsigned emission_OK:1; unsigned reception_OK :1; unsigned emission_en_cours:1; unsigned reception_en_cours:1; unsigned reveil_MITS:1; }Flag_I2C; unsigned char mode_commande_I2C; unsigned char type_commande_I2C; unsigned char data_commande_I2C; unsigned char compteur_I2C; #pragma udata My_Var1 // Variable Save on IT #pragma code /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// MAIN /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include "p18f2525.h" #include"define.h" #include"fonctions.h" #include <i2c.h> #include "I2c.c" #include "Gestion IT.C" #pragma code // return to default code section void main (void) { Init_port(); Init_IT(); Initialisation_Variables(); Init_variables_I2C(); Init_reg_I2C(); while(1) //Boucle principale { if(Flag_I2C.reveil_MITS == oui_ && Flag_I2C.emission_en_cours == non_ && Flag_I2C.reception_en_cours == non_ && Flag_I2C.emission_OK == non_ && Flag_I2C.reception_OK == oui_ ) { I2C_commande(emission_,mode_MITS_,_repos_); Flag_I2C.emission_en_cours = oui_; } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ************************************************************* void Init_port(void) { TRISA=0b11111111; //Configuration du port A TRISB=0b00000101; //Configuration du port B TRISC=0b10011000; //Configuration du port C Port_in_2 = on_; } *************************************************************** void Init_IT(void) { RCONbits.IPEN = 1; //Validation du mode prioritaire des ITs //GIEH = 1 ==> validation des ITs priorite haute //GIEL = 0 ==> validation des ITs priorite basse //TMR0 = 0==> validation de l'IT du timer0 //INT0IE = 0 ==> validation de l'IT INT0 //RBIE = 0 ==> pas d'IT sur le portB //TMR0IF = 0 ==> intialisation du flag timer0 //INT0IF = 0 ==> intialisation du flag INT0 //RBIF = 0 ==> intialisation du flag portB INTCON = 0b10000000; //RBPU = 1 ==> pas de pull up sur le portB //INTDEG0 = 0 ==> front descendant //INTDEG1 = 1 ==> pas d'importance //INTDEG2 = 1 ==> pas d'importance //*=0 unimplemented //TMR0IP = 0==> timer0 en priorite haute //*=0 unimplemented //RBIP = 0 ==> pas d'imporatnce INTCON2 = 0b10110000; PIR2 = 0; //Reset Flag IT PIR1 = 0; //Reset Flag IT IPR1 = 0; IPR2 = 0; PIE1 = 0; //On devalide toute les interruptions sur PIE1 PIE2 = 0; //desactivation des autres ITs PIE1bits.SSPIE = 1; //validation de l'I2C PIPR1bits.SSPIP = 1; //I2C en haute priorite } **************************************************************** void Init_variables_I2C(void) { Flag_MITS.en_veille = non_; Flag_I2C.reveil_MITS = non_; Flag_I2C.emission_en_cours = non_; Flag_I2C.reception_en_cours = non_; Flag_I2C.reception_OK = non_; Flag_I2C.emission_OK = non_; adresse_I2C_E = 0; type_I2C_E = 0; data_I2C_E; adresse_I2C_R = 0; type_I2C_R = 0; data_I2C_R = 0; I2C_commande(reception_,etat_MITS_,reveil_MITS_); } ******************************************************************** void Init_reg_I2C(void) { SSPADD = adresse_MOI_; SSPSTAT = SLEW_OFF ; // slew rate on/off SSPCON1 = 0x36; // select serial mode SSPCON2 = 0x00; // power on state } ******************************************************************* void I2C_commande(unsigned char mode_IT_I2C,unsigned char type_IT_I2C,unsigned char data_IT_I2C) { // switch ( mode_IT_I2C ) { case emission_: //mode emission Port_in_2 = 0; Tempo02(); Port_in_2 = 1; break; case reception_: //mode reception if ( Flag_MITS.en_veille == oui_) { reveil_hard_MITS_ = 0; Tempo02(); reveil_hard_MITS_ = 1; } break; } mode_commande_I2C = mode_IT_I2C; type_commande_I2C = type_IT_I2C; data_commande_I2C = data_IT_I2C; //type de donnée a envoyer ou recevoir compteur_I2C = 0; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// Gestion IT.C ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #pragma code High_Vector = cAdd_High_Vector_Int void Interrupt_High(void) { check_Interrupt_High(); // Call SP interuption High } #pragma code // return to default code section #pragma interrupt check_Interrupt_High save=PROD,section("My_Var1") void check_Interrupt_High(void) { if ( PIR1bits.SSPIF == 1) { IT_I2C(); } } #pragma code // return to default code section /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// I2c.c //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void IT_I2C(void) { INTCONbits.GIE = 0; compteur_I2C++; //incrementation compteur I2C switch(mode_commande_I2C) //emission ou reception { case emission_: //dans le cas emission if ( compteur_I2C == 1 ) //adresse, ecriture { adresse_I2C_R = SSPBUF ; //Lecture adresse } if ( compteur_I2C == 2 ) // donnée,lecture { data_I2C_R = SSPBUF; Flag_I2C.emission_en_cours = oui_; } if( compteur_I2C == 3 ) //adresse lecture { adresse_I2C_R = SSPBUF; SSPCON1bits.CKP = 0; switch (type_commande_I2C) { case mode_MITS_: switch (data_commande_I2C) { case _repos_:{SSPBUF = mode_MITS_ ;}break; case _arret_:{SSPBUF = mode_MITS_ ;}break; } break; case etat_MITS_: switch (data_commande_I2C) { case veille_:{SSPBUF = etat_MITS_;}break; case reveil_MITS_:{SSPBUF = etat_MITS_;}break; } break; if(compteur_I2C == 4 ) { SSPCON1bits.CKP = 0; //on bloque la clock SSPBUF = data_commande_I2C; } if(compteur_I2C == 5 ) { if( SSPSTATbits.P == 1 ) { Flag_I2C.emission_OK = oui_; Flag_I2C.emission_en_cours = non_; } else { Flag_I2C.emission_OK = non_; } Flag_I2C.emission_en_cours = non_; //Reset Flag } break; case reception_: //cas de la reception if ( compteur_I2C == 1 ) { adresse_I2C_R = SSPBUF ; if( chargdriver == non_ ) { compteur_I2C = 0; chargdriver = oui_; } } if(compteur_I2C == 2) { type_I2C_R = SSPBUF; //chargement type } if(compteur_I2C == 3) { data_I2C_R = SSPBUF; //Chargement de la donnee switch (type_commande_I2C) { case etat_MITS_: switch (data_commande_I2C) { case reveil_MITS_: if(adresse_I2C_R == adresse_MOI_ && type_I2C_R == etat_MITS_ && data_I2C_R == reveil_MITS_) { Flag_I2C.commande_valide = oui_; } else { Flag_I2C.commande_valide = non_; } if(Flag_I2C.commande_valide == oui_ ) Flag_I2C.reception_OK = oui_; else { Flag_I2C.reception_OK = non_; PIR2bits.BCLIF = 0; } if(Flag_I2C.reception_OK == oui_) { Flag_I2C.reveil_MITS = oui_; } break; } break; } Flag_I2C.reception_en_cours = non_; //reset flag break; } } SSPCON1bits.CKP = 1; //on relache la clock SSPCON1bits.SSPOV = 0; PIR1bits.SSPIF = 0; //Reset Flag INTCONbits.GIE = 1; }
-----