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

Test mini OLED SSD1306 20x10mm 128x32 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1827
Âge : 70
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#41 Message par paulfjujo » mar. 23 févr. 2021 19:32

bonsoir à tous,


Suite a un post sur microchip au sujet de la detection device sur le bus I2C ...

une autre solution sans Delay dans la fonction d'interrogation du device
mais nessessite quand meme un mini delay de 5µS entre chaque scan d'adresse I2C device.
J'ai fait beaucoup d'autres tests pour essayer d'utiliser les bits MMA et PCIF relatifs à la détection du STOP .. mais nib, wallou
puis enfin le bit CNTIF qui est mis à 1 juste avant le STOP (I2C Master 7 bit adress transmission fig 33-19 datasheet)
Ca gaze, mais le delay de 5µS à rajouter doit couvrir le bit de stop manquant, sinon il y a chevauchement
et les devices ne sont plus detectés ( enfin si, TOUS !)!!

Code : Tout sélectionner




sbit I2C1STAT0_BFRE    at I2C1STAT0
.B7;
sbit I2C1STAT1_TXBE    at I2C1STAT1.B5;
sbit I2C1STAT1_CLRBF   at I2C1STAT1.B5;
sbit I2C1CON1_ACK      at I2C1CON1.B4;
sbit I2C1CON1_ACKSTAT  at I2C1CON1.B5;   //0 = Ack was received  1 = No Ack was not received
sbit I2C1CON2_ABD      at I2C1CON2.B4;
sbit I2C1CON0_EN       at I2C1CON0.B7;
sbit I2C1CON0_RSEN     at I2C1CON0.B6;
sbit I2C1CON0_S        at I2C1CON0.B5;
sbit I2C1CON0_MDR      at  I2C1CON0.B3;
sbit I2C1PIR_PCIF      at I2C1PIR.B2 ;
sbit I2C1PIR_SCIF      at I2C1PIR.B0 ;
sbit I2C1STAT1_RXBF    at I2C1STAT1.B0;
sbit I2C1STAT0_MMA     at I2C1STAT0.B5;
sbit I2C1PCIR_PCIF     at I2C1PIR.B2;
sbit I2C1PCIR_CNTIF     at I2C1PIR.B7;



char I2C1_DevicePresent(unsigned char addr)     // voir  Device_detect_02.jpg
 {  static char Status;
    SQA=1;
    I2C1ADB1 = (unsigned char)(addr << 1); // Load slave device address and shift
    I2C1CNT = 0;
    I2C1PCIR_CNTIF=0;
    I2C1CON0_S = 1;
      while(I2C1PCIR_CNTIF==0)
    Status=!I2C1CON1_ACKSTAT;
    SQA=0;
    return Status ;
}



 //--------------------------------------------------------------------------------------------
unsigned char I2cScan(void)
//--------------------------------------------------------------------------------------------
// Scan bus I2C, envoi Start + adresse + Stop
{
  unsigned char addr;
  static unsigned char n ;
  n=0;
  for (addr=1; addr<127; addr++)
  {    if ( I2C1_DevicePresent(addr))
    {
        I2C_Adresses_Devices[n]=addr;
        n++;
    }
     Delay_us(5);   // <----- Delai inter scan
    if(n>7) break;
  }
  return n;
}

 


Device_detect_02.jpg


un autre detail qui m'embete
SCL periode = 10 µS > Frequence I2C = 100KHz
malgré l'init
I2C1CLK = 0x03; // i2c1, 0011 MFINTOSC 500Khz ..OK
je ne vois pas de diviseur associé pour arriver à 100KHz
une idée ?

Je m'attaque maintenant à la lecture RTC SANS lib MikroC , pas tres evident , meme avec les chronogrammes datasheet
bien que l'I2C hardware MikroC soit OK pour la RTC en ecriture ou lecture..







:sifflotte: j'ai trouvé pour eliminer le delay imperatif de 5µS

Code : Tout sélectionner


char I2C1_DevicePresent
(unsigned char addr)     // Device_detect_03.jpg
 
{  static char Status;
    
SQA=1;
    while (!
I2C1STAT0_BFRE) { };     // attente bus libre
    
SQA=0;
    
I2C1ADB1 = (unsigned char)(addr << 1); // Load slave device address and shift
    
I2C1CNT 0;
    
I2C1PCIR_CNTIF=0;
    
I2C1CON0_S 1;
     
SQA=1;
    while(
I2C1PCIR_CNTIF==0)
    
Status=!I2C1CON1_ACKSTAT;
    
SQA=0;
    return 
Status ;
   
//return (!I2C1CON1_ACKSTAT);
}

 


Device_detect_03.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aides toi, le ciel ou FantasPic t'aideras

Test mini OLED SSD1306 20x10mm 128x32 18F27K42
satinas
Confirmé
Confirmé
Messages : 676
Enregistré en : novembre 2015

#42 Message par satinas » mar. 23 févr. 2021 19:50

Bonsoir Paul,

je regarde de loin ce fil de discussion, n'ayant pas fait d'autre test I2c.

C'est quoi le problème exactement ? pb détection du ACK/NAK ou pb détection fin du Stop ?

A priori le bit MMA indique la fin du Stop, après cela me semble un peu normal d'attendre un peu avant de relancer un Start. Peut être le bit BFRE est plus adapté pour détecter le bon moment pour lire l'acknoledge et passer à l'adresse suivante.

Dans le registre I2cxCON2:
FME: Fast Mode Enable bit
1 = SCL is sampled high only once before driving SCL low. (FSCL = FI2CXCLK/4)
0 = SCL is sampled high twice before driving SCL low. (FSCL = FI2CXCLK/5)
Fscl = 500kHz / 5 -> 100kHz

Test mini OLED SSD1306 20x10mm 128x32 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1827
Âge : 70
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#43 Message par paulfjujo » mar. 23 févr. 2021 20:31

bonsoir Satinas,

Ach So !
:+1: merçi pour l'info,

donc avec FME bit=0;
si j'ai bien compris
0 = SCL is sampled Low reste inchangé sampled à = FI2CXCLK/4 ?
pour arriver à un rapport global /5
Aides toi, le ciel ou FantasPic t'aideras

Test mini OLED SSD1306 20x10mm 128x32 18F27K42
satinas
Confirmé
Confirmé
Messages : 676
Enregistré en : novembre 2015

#44 Message par satinas » mar. 23 févr. 2021 20:41

Je sais pas, j'ai juste lu ça dans la doc, il y a 2 figures 33-13/14 affichant les timings dans les cas FME = 0 et FME = 1.

En mettant le test de BFRE juste après le Start, ça marche pas ?
ou un while (MMA || !BFRE) ; juste après le Start

Fallait pas enlever le test de BFRE :)

Test mini OLED SSD1306 20x10mm 128x32 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1827
Âge : 70
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#45 Message par paulfjujo » mer. 24 févr. 2021 17:09

bonjour,

satinas a écrit :En mettant le test de BFRE juste après le Start, ça marche pas ?


NON, bloque des la 1ere adresse device

satinas a écrit :ou un while (MMA || !BFRE) ; juste après le Start


NON, je ne vois qu'un bit STOP !
Aides toi, le ciel ou FantasPic t'aideras

Test mini OLED SSD1306 20x10mm 128x32 18F27K42
satinas
Confirmé
Confirmé
Messages : 676
Enregistré en : novembre 2015

#46 Message par satinas » mer. 24 févr. 2021 17:51

Salut,
j'ai refait un test, effectivement, ça a pas l'air simple. Avec la boucle CNTIF avant lecture de l'acknoledge, ensuite attente bus libre avec BFRE, il détecte bien une adresse avec l'Oled, mais il affiche 0x3D au lieu de 0x3C.
J'avais mis la tempo de 10ms pour faire vite et ben je regrette pas :)

Ok oubli de mettre à 0 CNTIF avant le Start, là c'est bon il voit bien le 0x3C.

MpLabX + PicKit3 met un temps fou (45 secondes) à flasher un programme tout simple dans le 18F27K42, c'est pareil avec le PicKit4 ?

Test mini OLED SSD1306 20x10mm 128x32 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1827
Âge : 70
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#47 Message par paulfjujo » mer. 24 févr. 2021 20:04

satinas a écrit :.
.Avec la boucle CNTIF avant lecture de l'acknoledge, ensuite attente bus libre avec BFRE, il détecte bien une adresse avec l'Oled ?

Oui,

donc, on est reste sur cette version :

Code : Tout sélectionner


char I2C1_DevicePresent
(unsigned char addr)   
 
{  static char Status;
    SQA=1;
    I2C1ADB1 = (unsigned char)(addr << 1); // Load slave device address and shift
    I2C1CNT = 0;
    I2C1PCIR_CNTIF=0;
    I2C1CON0_S = 1;
    SQA=0;
    while(I2C1PCIR_CNTIF==0)
    SQA=1;
    Status=!I2C1CON1_ACKSTAT;
    while (!I2C1STAT0_BFRE) { };
    SQA=0;
    return Status ;
}
 



Test presence device(s) sur le bus I2C1 avec RC1=0
Device(s) trouvés sur le bus
Device #1 at @3C
Device #2 at @57
Device #3 at @68
Active sortie SQW=1Hz: // <- blocage ici sur init sortie SQW RTC 1Hz



malgré la detection de ma RTC OK à l'adresse 7bit 0x68 (et shift gauche => 0xD0)
l'ecriture dans la RTC (de 0x0E et 0x40) ne passe pas ... (avec adresse 0xD0 dans I2C1ADB1)
alors qu'elle passe bien avec la lib I2C hardware de MikroC (avec adresse passe sur 7 bits only 0x68 !)

:mur: donc c'est l'OLED ou la RTC mais pas les 2 !!

satinas a écrit :MpLabX + PicKit3 met un temps fou (45 secondes) à flasher un programme tout simple dans le 18F27K42, c'est pareil avec le PicKit4 ?


MPLAB IPE output windows :

Code : Tout sélectionner


2021
-02-24 19:41:16 +0100 - Programming...
Calculating memory ranges for operation...
Erasing...
The following memory area(s) will be programmed:
program memory: start address = 0x0, end address = 0x4cff
configuration memory
User Id Memory
Programming
/Verify complete
2021
-02-24 19:41:25 +0100 - Programming complete



9 secondes avec Pickit4 !

autre question: comment interpretes-tu le pic entouré de rouge (OLED at 0x3C)
ce serait le ACK .. à zéro puis à 1 pendant largeur 300nS seulement ..

le NACK sur l'adresse suivante , à 1 pendant presque de 10µS ( 1 periode SCL )

Device_detect_04.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aides toi, le ciel ou FantasPic t'aideras

Test mini OLED SSD1306 20x10mm 128x32 18F27K42
satinas
Confirmé
Confirmé
Messages : 676
Enregistré en : novembre 2015

#48 Message par satinas » mer. 24 févr. 2021 20:33

Je pense que la solution finale est le test du bit PCIF comme indiqué sur le forum Microchip, il détecte la fin du stop. Cela évite le test BFRE. Ceci dit, je ne comprends pas pourquoi cela ne fonctionne pas avec le bit MMA, mais bon, c'est comme ça.

Le principe de l'I2C c'est que tout changement d'état de SDA doit se faire avec SCL bas, sinon c'est Start, Restart, Stop ou Erreur. Donc le pic ne pose pas de problème car il se fait avec SCL bas.

Sur la carte Automate de PEDRO, j'ai fait le code pour lire/écrire la RTC DS1307 et la 24C32, en xc8 et en MpAsm, Si tu le (ou les) veux, dis moi. C'est un 18F47Q10, qui lui se flashe en 10 secondes. Aïe, c'est pas un I2C newlook, c'est une ancienne version de l'I2c :( Sur le 18F27K42, je n'ai fait que ce que tu as déjà vu.

Le 18F47Q10 est pas mal car on peut avec un seul bit SSPxIF détecter la fin de chaque étape Start/Restart/WriteByteGetAckNak/ReadByte/SndAckNak/Stop. C'est mieux que les MSSP précédents qui n'en faisaient pas autant.

Test mini OLED SSD1306 20x10mm 128x32 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1827
Âge : 70
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#49 Message par paulfjujo » ven. 26 févr. 2021 14:17

bonjour à tous,

satinas a écrit : Je pense que la solution finale est le test du bit PCIF comme indiqué sur le forum Microchip,
il détecte la fin du stop. Cela évite le test BFRE.


:+1: solution adoptée et enterrinnée..

satinas a écrit :Sur la carte Automate de PEDRO, j'ai fait le code pour lire/écrire la RTC DS1307 et la 24C32, en xc8 et en MpAsm,
Si tu le (ou les) veux, dis moi. C'est un 18F47Q10, qui lui se flashe en 10 secondes.
... c'est une ancienne version de l'I2c
Le 18F47Q10 est pas mal car on peut avec un seul bit SSPxIF détecter la fin de chaque étape Start/Restart/WriteByteGetAckNak/ReadByte/SndAckNak/Stop. C'est mieux que les MSSP précédents qui n'en faisaient pas autant.


J'ai aussi le 18F47Q10 sur les starting blocks , sur ma carte /module microchip CURIOSITY PIC18F47Q10
et aussi un 18F27Q10 sur ma CARTE BASE 18F27Q10 PDIP28
mais ni mikroC , ni Necto Studio ne peut le gérer => MPLABX only !

:sifflotte: donc , tes routines, meme en ASM peuvent m'interesser ..

Cela merite peut-etre d'ouvrir un post special 18Fx2Q10 ?

A+
Aides toi, le ciel ou FantasPic t'aideras

Test mini OLED SSD1306 20x10mm 128x32 18F27K42
satinas
Confirmé
Confirmé
Messages : 676
Enregistré en : novembre 2015

#50 Message par satinas » ven. 26 févr. 2021 16:46

Bonjour, les 2 versions I2C sur le 18F47Q10, en l'état.

18F47Q10_I2C_xc8.txt

18F47Q10_I2C_asm.txt
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.


Retourner vers « Langage C »

Qui est en ligne

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