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 : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#51 Message par paulfjujo » ven. 26 févr. 2021 20:37

bonsoir,
Merci !

:+1:
je vais regarder ça de pres ..

à suivre ...
Aide toi, le ciel ou FantasPic t'aidera

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

#52 Message par paulfjujo » sam. 27 févr. 2021 19:55

oops
doublon !
Modifié en dernier par paulfjujo le dim. 28 févr. 2021 09:50, modifié 2 fois.
Aide toi, le ciel ou FantasPic t'aidera

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

#53 Message par paulfjujo » sam. 27 févr. 2021 20:02

Hello,
Bonsoir,

Toujours du fil à retordre avec le 18F27K42 en I2C1 Hardware , mais SANS la lib MikroC !
(bien que ça marche nickel avec ! .. mais pas l'OLED !,
:sifflotte: ce qui explique mon entêtement à ne pas utiliser la lib MikroC ..

Code : Tout sélectionner


    CPrint
(" Active sortie SQW=1Hz: \r\n");
    tmp[0]=0x0E; tmp[1]=0x40; // set SQW output  Start oscillateur
    p1=&tmp[0];
     SQA=1;
    I2C1ADB1 =  DS3231_ADDR;     // Load address  0xD0 with write = 0  
    I2C1TXB = *(p1++);            // Load beginning slave register address to write
    I2C1CNT = 2;                  // Load with size of array to write PLUS 1 for reg
    I2C1CON0_S = 1;               // Set Start to get things going
    while(I2C1CNT)                // While count is true
    {  SQA=1;
       while(!I2C1STAT1_TXBE);   // Wait until buffer is empty before loading
       I2C1TXB = *(p1++);  
       SQA
=0;                    // Load next byte to transmit, hardware decrements count
    }
    SQA=1;
    while (I2C1PIR_PCIF==0) { }; // PCIF is set after the STOP
    I2C1PIR_PCIF = 0;            // Clear Stop condition IF
    I2C1PIR_SCIF = 0;             // Clear Start condition IF
    I2C1STAT1_CLRBF = 1;
    SQA=0;
    CPrint(" vu OK avec SQA , 0x0E et 0x40 \r\n");
   
    CPrint
(" #2 Active sortie SQW=1Hz: \r\n");
    Wait_TimeOut_Only(100,0);
    tmp[0]=0x0E; tmp[1]=0x40; // set SQW output  Start oscillateur
    p1=&tmp[0];
    SQA = 1 ;

    I2C1PIR_PCIF = 0;    // clear STOP bit flag
    I2C1ADB1 =  DS3231_ADDR;      // Load address with write = 0
    I2C1TXB = *(p1++);            // Load beginning slave register address to write
    I2C1CNT = 2;                  // Load with size of array to write PLUS 1 for reg
    I2C1CON0_S = 1;
    while(I2C1CNT>0)                // While count is true
    {
        while(!I2C1STAT1_TXBE);   // Wait until buffer is empty before loading
        I2C1TXB = *(p1++);
    }
     while (I2C1PIR_PCIF==0) { }; // PCIF is set after the STOP
     I2C1PIR_PCIF = 0;            // Clear Stop condition IF
         I2C1PIR_SCIF = 0;             // Clear Start condition IF
    I2C1STAT1_CLRBF = 1;
    SQA=0;
    CPrint(" vu BAD avec SQA , seulement 0x0E !manque 0x40 \r\n");

    Wait_TimeOut_Only(30,0);  // delay de 30x100mS   0=delay only   1=delay ou Keyboard touch
 


au 1er passage d'init SQW output, j'obtiens bien toute la trame I2C OK
device adresse +RW=0, 0x0E, 0x40
mais au 2 em passage
je n'ai qu'une trame , qui parait correcte .. mais trop courte ??
Device Adresse+RW=0, Ox0E ..mais pas la valeursuivante 0x40!

:mur: WHY ?


le tout etant dans le main programme, il n'y a normalement pas de phenomene lié à la réentrance..

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

Test mini OLED SSD1306 20x10mm 128x32 18F27K42
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#54 Message par Jérémy » sam. 27 févr. 2021 20:05

:bravo: pour la persévérance ( et pourtant on est pas sur Mars !)
C'est en faisant des erreurs, que l'on apprend le mieux !!!

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

#55 Message par satinas » sam. 27 févr. 2021 21:34

Bonsoir,
Dans la première trame I2C, tu envoies 2 ou 3 octets data ?
La trame correcte fait 3 octets data sur l'image, car il n'y a pas de stop !

J'avais pas fait de while (I2C1CNT), je sais pas si c'est bon ou pas, j'ai utilisé une autre variable, décrémentée dans la boucle.
Tu remplis I2C1TXB ensuite tu fais I2C1CNT = 2, peut être que cela donne 1+2 data au lieu de 2 data.
Le { } peut remplacer le ; après le while, donc { }; c'est redondant.

Teste d'abord avec ça, à envoyer plusieurs fois -> adresse + 0x0E + 0x40 :

Code : Tout sélectionner

    I2C1ADB1 =  DS3231_ADDR;      // Load address  0xD0 with write = 0 
    I2C1CNT = 2;                  // Load with size of array to write PLUS 1 for reg
    I2C1TXB = *(p1++);            // Load beginning slave register address to write
    I2C1PIR_PCIF = 0;             // Clear Stop condition IF
    I2C1CON0_S = 1;               // Set Start to get things going
    while (!I2C1STAT1_TXBE) ;     // Wait until buffer is empty before loading
    I2C1TXB = *(p1++); 
    while (!I2C1PIR_PCIF) ;       // PCIF is set after the STOP


dans mes tests je faisais plutôt

Code : Tout sélectionner

    while (!I2C1STAT0bits.BFRE) ; // attente bus libre
    I2C1ADB1 =  DS3231_ADDR;      // Load address  0xD0 with write = 0 
    I2C1CNT = 2;                  // Load with size of array to write PLUS 1 for reg
    I2C1TXB = *(p1++);            // Load beginning slave register address to write
    I2C1CON0_S = 1;               // Set Start to get things going
    while (!I2C1STAT1_TXBE) ;     // Wait until buffer is empty before loading
    I2C1TXB = *(p1++); 

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

#56 Message par paulfjujo » dim. 28 févr. 2021 15:16

satinas a écrit :Dans la première trame I2C, tu envoies 2 ou 3 octets data ?


j'envoie l'adresse device (0x68+bitR/W + 2 bytes de datas : 0x0E et 0x40)

satinas a écrit :La trame correcte fait 3 octets data sur l'image, car il n'y a pas de stop !

Si , le stop est bien présent en fin de trame ( lettre P)

si j'en crois la figure 33-19 I2C Master 7bits adress transmission + 2 data (pdf joint)
on voit que ICxCNT=02 pour l'adresse
I2CxCNT =1 pour data#1
I2CxCNT 0 pour data#2
I2CxCNT est deja à zero pendant l'envoi de data #2 !
et se termine par un stop.

Vraiment étrange comportement :

Seul le 1 er envoi est OK
le 2em envoi l'adresse device + data 0xAA qui correspond à l'indice 2 de ma table ?? avec un NACK
tmp[0]=0x0E; tmp[1]=0x40;tmp[2]=0xAA;tmp[3]=0x55;
comment est-ce possible ? puisque j'initialise le pointeur p1 sur le debut de ma table

et pour le 3em envoi, j'ai adresse device + data 0x40 ???? avec NACK

Là c'est trop fort !
AUCUNE MAITRISE de l'envoi ..

figure 33-19 I2C Matser datasheet DS400019 PIC18F..serie 42

Il y a cette notion de MSB of I2C1TXB 4 bits de poids fort D7,D6,D5,D4) de data #1 , le transfert LSB data#1 se ferait avec TBE=0 ?
avec software writes I2CxTXB au front montant de TXBE
et l'ecriture de MSB ( errare ?? ce devrait etre LSB) au front descendant de TXBE
et le second byte data #2 serait au 2e front montant de TXBE ?

Pourquoi parler de MSB sur un Byte ? ( un quartet ?)
d'autan que cette notion de MSB n'apparait plus pour le 2em data , pas de transition de TXBE apres bit D4

avec ce datagram on ne sait pas trop, qui fait quoi ? le hard ou le soft ( le programme qu'on ecrit !)

une errata de datasheet ?
PIC18F27K42_I2C_Master_7bit_adress_Transimmion_40001919F_p569.pdf


Capture1_ok.JPG

Capture2.JPG

Capture3.JPG


:!!: dois je abandonner pour n'utiliser que MPLABX ?
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

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

#57 Message par satinas » dim. 28 févr. 2021 15:55

J'ai pas compris pour le MSB et le LSB, où tu lis ça ?
Ah oui, il dit juste qu'on met en premier sur SDA, le bit de poids fort de I2C1TXB (MSB) . Logique, l'i2c transmet MSB first, comme le SPI et pas comme l'uart.

Tu t'obstines, pourquoi ne pas essayer ce que je t'ai demandé de tester, sans la boucle. Il n' y a que 2 octets à envoyer.
En envoyant en permanence la trame, tu peux voir à l'oscillo analogique ce que cela donne, si une trame est plus courte tu le verras.
PS Au cas où tu l 'aurais pas remarqué, j'essaye de te ramener à mon code qui a marché du premier coup sur l'Oled :-)

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

#58 Message par paulfjujo » dim. 28 févr. 2021 17:09

satinas a écrit :J'ai pas compris pour le MSB et le LSB, où tu lis ça ?


en fait , c'est plutot le fait que TXBE occupe une largeur de 4 bits (D7..D4) qui me laissait à penser cette notion de
MSB et LSB , alors que MSB est ecrit MSb .. :!!: le petit 'b' fait toute la difference.

J'ai testé le programme#2 , envoi de 2 bytes .. ne marche pas,

j'avais testé aussi le 2em , en sauvant mon source sous un autre nom (lié à la date !)
mais MikroC a tendance à toujours le sauver dans son propre directory , au lieu de mon directory Projet..
bien qu'ayant defini les "paths" via Edit search path !!
je recompilais donc l'ancienne version ...au lieu du source definit dans le projet en cours .. que de temps perdu!
Dans ce cas, je referme le projet et MikroC et le relance pour etre sûr ..

Re_testé à l'instant :
:+1:
OK pour le 1er programme.. testé sur 3 envois consécutifs OK
sans utiliser de boucle ..
Merci !

par contre , je pense qu'il faudrait utiliser I2C1CNT pour l'envoi d'un bloc de datas ?
exemple : pour l'envoi des 7 bytes d'init de la RTC SS,MN,HH,JS,JJ,MM,AA
ou bloc /page eeprom I2C ..
Aide toi, le ciel ou FantasPic t'aidera

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

#59 Message par satinas » dim. 28 févr. 2021 17:21

Le module i2c1 utilise I2C1CNT pour sa propre cuisine interne, et surtout pour envoyer le Stop lorsque i2C1CNT arrive à 0.
Il faut bien sûr le renseigner au départ, c'est obligatoire.
Après pour la boucle qui remplit le registre I2C1TXB, autant créer sa propre variable, on sait combien d'octets on veut envoyer.
On doit aussi pouvoir boucler en utilisant I2C1CNT, mais il faut y aller petit à petit, en partant d'un truc qui marche.

La fonction OledData envoie déjà un buffer, pas de problème.
Dans le code C du 18F47Q10, il y a 2 fonctions, une qui écrit un buffer dans l'eeprom, avec lancement auto du cycle d'écriture à chaque franchissement de page, et la seconde qui attend que le cycle d'écriture soit terminé en interrogeant en permanence l'adresse i2c de l'eeprom jusqu'à réception d'un acknoledge.

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

#60 Message par paulfjujo » lun. 1 mars 2021 08:24

bojour Jeremy,

Jérémy a écrit ::bravo: pour la persévérance ( et pourtant on est pas sur Mars !)



like Matt Damon ?

Ca y est ! on y est arrivé ...(en Mars)
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 46 invités