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

I2C Hardw avec PIC18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » sam. 15 août 2020 12:16 lien vers la Data-Sheet : Cliquez ici

Bonjour,
ce post est quelque peu lié à celui-ci , car concerne les PIC avec I2C Hardware (et non plus MSSP Hardware)
donc I2C nettement plus compliqué.. quand on lit la datasheet !

I2C_module_block_diagram_18F27K42.jpg


Pas de probleme specifiques rencontrés avec ce PIC , jusqu'à ce jour , avec la version utilisant l' I2C Classique .
avec fonctions séparées : I2C_Start, I2C_Wr, I2C_Rd, I2C_Idle, I2C Restartn I2C_Stop

Mais découverte de problemes avec la version I2C HARDW (new style : par bloc) et un LCD 4x20 avec PCF8754
pour une commande de celui ci en I2C .
Au debut je pilotais le LCD directement avec son adresse connue
0x27 sur 7 bits , déja une grosse difference avec l'habituelle adress device sur 8 bits (incluant le bit R/W) = 0x4E !
pas de problemes détectés...
Mais j'ai voulu rajouter un RTC DS32131 et faire un pooling du bus I2C pour decouvrir les adresses des devices presents
connectés sur le bus I2C1.
Là, ça coince , programme bloqué dès la rencontre avec une adresse non reconnue !

:furieux: fonctions NON RENSEIGNEES DANS LE HELP de la librairie I2C !

ma seule documentation provient de cet echange avec Mikroe Team

MikroE_team_answer_I2C_Hardw_18F27K42.jpg



exemples avec RTC DS3231

pour ecriture :

Code : Tout sélectionner



#define   LCD_ADDR  0x27  // soit 0x4E >> 1 ; // mode HARDWARE adresse sur 7 bits
#define DS3231_ADDR     0x68   // I2C Hardware : sur 7 bits  RTC DS3231
//#define DS3231_ADDR    0xD0   // I2C Software :  sur 8 bits  RTC DS3231
char dummy[16];    // table d'echange pour ecriture ou lecture I2C
unsigned char Addr=DS3231_ADDR ;
....
dummy[0]=0x0E ; // 14em registre de la RTC   pour activer SQWE à 1Hz
dummy[1]=0x10 ;
Etat=I2C1_Wr(Addr,dummy ,2, _I2C_END_MODE_STOP );


avec Addr = Adresse du device =0x68
dummy[]= table d'echange
dummy[0]=0x0E ; adresse du registre du device concerné
dummy[0]=0x10 ; Valeur à ecrire dans le registre
2 = nombre de byte à ecrirer
_I2C_END_MODE_STOP => NACK en fin de transfer

le gros probleme est que si l'adresse ne correspond pas .. le programme reste bloqué sur l'ecriture I2C
malgré que MikroE specifie que l'utilisateur n'a pas besoin d'autre chose que les fonctions I2C Hardware de base

dans la librairie MikroC I2C liée à ce PIC ,

Lib_I2Cremappable_18F27K42.jpg


nota: cette librairie ne contient pas les fonctions I2C HARDWARE par blocs !
car pour moi, c'est plutot une librairie Software ( qui a l'avantage de ne pas poser de problemes (connus par moi-meme !)

il y a cette fonction

Code : Tout sélectionner

// set timeout period and callback function
   //I2C1_SetTimeoutCallback(unsigned long timeout, void (*i2c1_timeout)(char));
   I2C1_SetTimeoutCallback(1000, I2C1_TimeoutCallback); 


j'ai donc essayé de l'activer , pour passer outre du blocage sur adresse inconnue
avec l'appel de ce traitement

Code : Tout sélectionner



 void I2C1_TimeoutCallback
(char errorCode) {
   if (errorCode == _I2C_TIMEOUT_RD) {
     // do something if timeout is caused during read
     U1TXB='?';
   }
   if (errorCode == _I2C_TIMEOUT_WR) {
     // do something if timeout is caused during write
      U1TXB='µ';
      I2C1ERR=0;
   }
 


1) je ne vois pas d'ou proviennent les codes d'erreurs ! noyés dans le code le librairie ?
2) Ne sachant pas COMMENT EXPLOITER et TRAITER ces codes d'erreur
j'ai rajouté un tracage ,via l'envoi d'un caractere ? ou µ sur l'UART1 => visu sur terminal

La partie software du TEST Pooling devices sur le bus I2C1 :

Code : Tout sélectionner


   UART1_Write_CText
(" Init I2C1 HARDWARE \r\n");
   I2C1_Init();      // <-- non documenté dans le HELP  
   // set timeout period and callback function
   //I2C1_SetTimeoutCallback(unsigned long timeout, void (*i2c1_timeout)(char));
   I2C1_SetTimeoutCallback(1000, I2C1_TimeoutCallback);
 
   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<125;i=i+2)  // adresse impaire + R/W bit=0  => adresse 8 bits paire
   {
    dummy[0]=0x00;  // adresse registre 0
    dummy[1]=0x00; //  valeur 0 
    k=I2C1_Wr(i,dummy ,1, _I2C_END_MODE_STOP );  // <-- non documenté dans le HELP  
    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;  // stockage des adresses devices trouvés sur le bus
       j++;
       j=j& 0x0007;    // limité à  8 maxi
     }
   }
   CRLF1();
 


le resultat sur terminal
Init I2C1 HARDWARE
Test presence device(s) sur le bus I2C1
µµµµ Device found at 0x27 soit 39
µµµµµµµµµµµµµµµµµµµµµµµ Device found at 0x57 soit 87
µµµµµµµµµµµµµµµµµµ
Init LCD I2C x20 PCF8754 @0x27
Init Steps = 9 sur 9
Ecriture sur 4 lignes de 20 chars



on voit bien , qu'on passe OUTRE l'error _I2C_TIMEOUT_WR)
avec l'affichage des µµµµ lorsque l'adresse device est inconnue
et que la detection de la presence du LCD(PCF8754) et de la RTC3231 est bien détectée .

l'init LCD se passe bien ensuite SANS ERREURS (µ) ( avec adresse Connue!)

Test avec RTC : Lecture des registres time et date en 1 seule passe !

Code : Tout sélectionner


void _read_all_DS3231
(void)      // Lecture Date et heure seulement OK
{   char IT;
     IT=  GIE_bit;
    GIE_bit=0;// relecture RTC   en BCD
      tmp[0]=; // adresse du 1er registre
      I2C1_Rd( DS3231_ADDR, tmp, 7, _I2C_END_MODE_STOP );        //was 18 =all register
      second=tmp[0];  // la 1ere value lue ecrase le contenu existant
      minute=tmp[1];
      heure=tmp[2];
      jS=tmp[3] & 0x0007;  // 1 à 7
      if (jS>7) jS=0;
      jour=tmp[4];
      mois=tmp[5] & 0x1F; ;
      Annee=tmp[6];
      Month=Bcd2Dec(mois);
      Sec= Bcd2Dec(second);
    if (IT>0)   GIE_bit=1;
 }
 
 
void Display_Date_Time
(char Visu)
{
   unsigned char cx,mx,hx;
   [b] read_all_DS3231();   // lecture en bloc des 7 registre[/b]
    time[0]=0;
    date[0]=0;
     BCD_To_Ascii(heure,time) ;   time[2]='H';
     BCD_To_Ascii(minute,time+);  time[5]='M';
     BCD_To_Ascii(second,time+6);   time[8]='S';time[9]=0;
     BCD_To_Ascii(jour,date); date[2]='/';
     BCD_To_Ascii(mois,date+3); date[5]='/';
     BCD_To_Ascii(Annee,date+6); date[8]=0;
     Month=Bcd2Dec(mois);
     Sec= Bcd2Dec(second);
   if( Visu==1)
   {   UART1_Write_Text(date);
    CPrint(Blancs);
     UART1_Write_Text(time);
    CPrint(Blancs);
     }
  }
 --------------------------------------
 ... main ....
  UART1_Write_CText(" Relecture  RTC DS3231\r\n");
   Display_Date_Time(1);
   CRLF1();
  


resultat sur terminal
Relecture RTC DS3231
?15/08/20 18H15M36S
....etc ....
?15/08/20 18H15M22S EA1 Brut = 4095 Pts
?15/08/20 18H15M11S EA1 Brut = 4095 Pts



on voit ici qu'il y a systematiquement une ERROR _I2C_TIMEOUT_RD sur chaque lecture
avec le traçage du ?

oops pour l'instant , je ne peux que dire que ça tombe en marche !
sans pouvoir avoir une explication plausible ..

si on regarde quelles sont les librairies utilisées sous MikroC
en depiotant la 1ere ligne de la fenetre résultat de compilation "Messages" qui a une longueur de 810 caracteres !
probleme signalé il y a plus de 2 ans à MikroE Team .. passe en dernier plan
sachant le support pour les PIC18FxxQ10 est demandé depuis 2017 .. sans retour à ce jour!

en attandant , j'ai fait une macro sous notepad++ qui la redecompose en morceaux pour avoir la liste des lib !

extrait de la 1ere ligne "Messages"
_Lib_Math.mcl" "
_Lib_MathDouble.mcl" "
_Lib_System.mcl" "
_Lib_Delays.mcl" "
_Lib_CType.mcl" "
_Lib_CString.mcl" "
_Lib_CStdlib.mcl" "
_Lib_Conversions.mcl" "
_Lib_ADC_K40.mcl" "
_Lib_PPS_2xK42.mcl" "
_Lib_UART_Remappable_K42_83.mcl" "
_Lib_I2C_Remappable_K42.mcl"



l'I2C 18Fxxk42 serait concerné par les 3 dernieres lib !


en attendant je vous mets mon projet MikroC actuel
gere UART1 19200,8,N,1 , LCD 4x20 I2C via PFC8754, RTC DS3231, Mesure analog 12 bits sur EA0
(debut essai NCO ..)
PIC18F27K42_UART1_ADC12b_LCD_4x20_PCF8754_I2C1_Hw_RTC_DS3231_2020_0816.zip


extrait du listing (partie I2C_Wr) pour les Férus ASM

extraitdu_listing.txt


version triée sous excel 97, mieux lisible ( enlever l'extension .txt !)
extraitdu_listing_I2C_WR_19F27K42.xls.txt


A SUIVRE ....
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Retourner vers « Langage C »

Qui est en ligne

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