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
I2C Hardw avec PIC18F27K42
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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 !
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 !
fonctions NON RENSEIGNEES DANS LE HELP de la librairie I2C !
ma seule documentation provient de cet echange avec Mikroe Team
exemples avec RTC DS3231
pour ecriture :
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 ,
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
j'ai donc essayé de l'activer , pour passer outre du blocage sur adresse inconnue
avec l'appel de ce traitement
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 :
le resultat sur terminal
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 !
resultat sur terminal
on voit ici qu'il y a systematiquement une ERROR _I2C_TIMEOUT_RD sur chaque lecture
avec le traçage du ?
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"
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 ..)
extrait du listing (partie I2C_Wr) pour les Férus ASM
version triée sous excel 97, mieux lisible ( enlever l'extension .txt !)
A SUIVRE ....
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 !
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 !
fonctions NON RENSEIGNEES DANS LE HELP de la librairie I2C !
ma seule documentation provient de cet echange avec Mikroe Team
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 ,
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]=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+3 ); 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 ?
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 ..)
extrait du listing (partie I2C_Wr) pour les Férus ASM
version triée sous excel 97, mieux lisible ( enlever l'extension .txt !)
A SUIVRE ....
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 47 invités