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
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#141 Message par paulfjujo » jeu. 13 août 2020 17:22 lien vers la Data-Sheet : Cliquez ici

bonjour,

In fine ,on voit bien que ce soit MikroC ou MikroBasic
il faut mettre les mains dans le cambouis à fond ... pour les nouveaux PIC18 qui se sont grandement étoffés en fonctionalités et en nombre de pages Datasheet ...
L'I2C Hardware (qui n'est pas, ou plus du MSSP !) donne bien du fil à retordre
meme sur Microchip forum. I2C example code from Microchip
J'e n conclu qu'il faudrait revenir à l'ASM ou simili ASM
vu qu'il faut quasiment tout traiter principalement au niveau registre et bit d'etat , + interruptions mutiples ...
Ce qui manque dans la datasheet , c'est un Diagramme des interruptions
qui devra etre d'ailleurs tres difficile à faire pour tenir dans un format A4 . =>format A3 ,A2.. humour!! A0 ? quand meme pas !

18F87J50_Interrupts.jpg


je vais donc m'atteler sur les details de cette note microchip
Existe-il d'autre literature traitant exclusivement l' I2C Hardware (non MSSP)
j'ai vu de videos tuto microchip mais sur l'ancien I2C MSSP.

coté MPLAB XC8 et MCC
encore faut-il bien comprendre tout le code généré par celui ci ..

un analyser logique sur le bus I2C presente aussi des limites pour etudier cet I2C
vu qu'il y a trop d'interference interne hardware
et je n'ai pas d' ICD debugger ..
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

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

#142 Message par satinas » ven. 14 août 2020 06:56 lien vers la Data-Sheet : Cliquez ici

Bonjour

J'ai des 18F27K42, mais je n'ai pas regardé l'i2c.
Tu les as pourtant testés, quel type de problème as-tu rencontré ?
http://paulfjujo.free.fr/_18F27K42/PIC1 ... _Tests.htm

Problème de séquence I2C entre deux PIC
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#143 Message par paulfjujo » ven. 14 août 2020 12:31 lien vers la Data-Sheet : Cliquez ici

Bonjour Satinas et à tous ,

satinas a écrit :Bonjour

J'ai des 18F27K42, mais je n'ai pas regardé l'i2c.
Tu les as pourtant testés, quel type de problème as-tu rencontré ?
http://paulfjujo.free.fr/_18F27K42/PIC1 ... _Tests.htm



oui, tout est OK avec la lib I2C Software
qui utilise I2C Start,Wr,Rd,Stop, .. fonctions detaillées assez classiques ( PIC Maitre avec differents devices sur le BUS)
On peut spooler le bus pour y decouvrir les adresses des devices connectés dessus
c'est OK .

MAIS avec la version évoluée , I2C Hardware , quasi pas documentée en HELP mikroC
fonctions compactées du genre:
dummy[0]=0x00; // l'adresse du registre,
dummy[1]=0x00; // la valeur à y ecrire
k=I2C1_Wr(i,dummy ,1, _I2C_END_MODE_STOP ); // 1 seule valeur ecrite
// la taille de la table de transfert peut etre tres grande !
le dialogue I2C n'est correct QUE SI ON CONNAIT PRECISEMENT L'ADRESSE DU DEVICE CONNECTé
sinon l'operation est bloquée .. :mur: programme coincé.

ce PIC a des mecanismes internes liés à l'I2C , genre State Machine
et je pense qu'il faudrait tester individuellement chaque pas
d'avance , via tous les flag et interrupts liés à cet I2C .Hardware

il existe un bit BTO I2C bus timeout sur ce pic
mais sous MikroC ,
:furieux: je ne vois pas comment sortir de la fonction d'ecriture Mikroc
si ça bloque en interne
..mikroC ne donne pas les sources de ses lib !

:idea: ... quelques heures plus tard ....

j'ai trouvé , ou plutot deviné (...par rapport au bit BTO I2C)
dans le tas de fonctions de la lib I2C
le "Help" est null car couvre trop de PIC differents ..

Code : Tout sélectionner


void I2C1_SetTimeoutCallback
(unsigned long timeout, void (*i2c1_timeout)(char));


This function checks for a I²C timeout condition in a user defined time period, after which it jumps to a callback function if this condition is met.
Different I²C operations can cause a timeout (read, write, start and repeated start) so user may test which one caused it, as in the example below.
Parameters :
timeout: Represents a number of while loops in which the I²C timeout condition is checked.
Depending on the architecture (PIC16, PIC16ENH or PIC18) the generated code (i.e. the execution time) may vary for the same value of this parameter.
i2c1_timeout: pointer to the callback function. Callback function must be written according to this function prototype :


nota : la plupart des autres fonctions donne un code error
comme I2C1_Init(100000); ?
ou les fonction "remappable" ?
on est pourtant avec un PIC avec PPS !

:sifflotte:
Séparer le bon grain de l'ivraie

toujours est-il qu'avec ce code , je ne reste plus bloqué sur la detection d'adresses sur le bus I2C
:cry: MAIS EFFETS DE BORDS NEFASTES sur l'affichage LCD !

Code : Tout sélectionner



// define callback function
void I2C1_TimeoutCallback(char errorCode) {

   if (errorCode == _I2C_TIMEOUT_RD) {
     // do something if timeout is caused during read
      I2C1_Count_Read_Errors++;
     //CPrint ("\r\n Error on Read\r\n");
   }

   if (errorCode == _I2C_TIMEOUT_WR) {
     // do something if timeout is caused during write
      I2C1_Count_Write_Errors++;
     // CPrint ("\r\n Error on Write\r\n");
   }
}


...
 main ...

   I2C1_Init();
    //void I2C1_SetTimeoutCallback(unsigned long timeout, void (*i2c1_timeout)(char));
    I2C1_SetTimeoutCallback(1000,I2C1_TimeoutCallback);
    I2C1_Count_Read_Errors=0;
    I2C1_Count_Write_Errors=0;

 CPrint(" Test presence device(s) sur le bus I2C1  \r\n");
  //i=0x27; // =39 =  adresse connue du LCD        ...OK
   j=0;
   for (i=31 ; i<126;i=i+2)
   {
    dummy[0]=0x00;
    dummy[1]=0x00;
    k=I2C1_Wr(i,dummy ,1, _I2C_END_MODE_STOP );
    if (k==0) 
    
{
      CPrint(" Device found at 0x");
      ByteToHex(i,CRam1);
      Print (CRam1);
      CPrint(" soit ");
      ByteToStr(i,CRam1);
      Print (CRam1);   CRLF1();
        Delay_ms(100);
        I2C_Adresses_Devices[j]=i;
        j++;
        j=j& 0x0007;    // limité à  8 maxi
     }
   }
   CRLF1();


resultat sur terminal

Init I2C1 HARDWARE
Test presence device(s) sur le bus I2C1
Device found at 0x27 soit 39 <---- le LCD avec PCF8754
Device found at 0x57 soit 87 <------ la RTC DS3231 (connecté mais non encore utilisée)

Init LCD I2C x20 PCF8754 @0x27
Init Steps = 9 sur 9


le resultat adresse I2C est un peu deroutant, car format device sur 7 bits
alors que jusqu'à peu, les lib I2C demandaient des adresses sur 8 bits !
ceci est du à la migration Microchip et ARM
:furieux: et MikroE suit aussi .. on va retrouver du codage façon "arduino" d'ici peu dans mikroC


à noter que ici , le mecanisme de traitement d'error est assez obscure
if (errorCode == _I2C_TIMEOUT_WR) ?
d'ou vient cet etat _I2C_TIMEOUT_WR ?
caché dans la lib ?
que faire dans ce traitement d'erreur !


il s'avere que je rentre dans cette routine de traitement d'erreur à CHAQUE I2C_Wr
le probleme reste entier ...(avec MikroC)

Je vais ouvrir un autre poste dans la partie Langage C , car je pollue ici , le cours de ce post
désolé..
exit
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Le forum Fantas-PIC »

Qui est en ligne

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