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

#71 Message par paulfjujo » ven. 19 mars 2021 20:53

merçi pour ton retour

satinas a écrit :Faire le test ou scan device, cela doit être possible avec la flopée de fonctions MCC, je regarderai.
Je suis pas un expert de MCC, trop touffu. C'est quand même la bonne solution pour faciliter la programmation des fonctionnalités du Pic sans partir de zéro. Je l'utilise avec Mplab Xpress en cas d'impasse, .....


in fine, le MCC est peu etre un bon outil pour avoir une meilleur "vision" d'un PIC à etudier
mais qu'on peut certainement se debrouiller SANS...
je me suis déja servi de MCC , pour MikroC, ne serait-ce que pour la config des Pins via PPS ...
PPS variant aussi en fonction du boitier MCU PDIP,SOC ..etc


satinas a écrit :Tu as essayé la fonction I2C1_DevicePresent(uint8_t address) après avoir exécuté le SYSTEM_Initialize() de MCC ?


oui,
j'ai meme essayé de faire l'Init I2C qui est incluse dans le SYSTEM initialise,
APRES le test I2C1_Present ..

satinas a écrit :mais C'est drôle, en compilant ton projet MpLabX, on trouve aussi des warnings signedness dans les fichiers MCC.

oui, j'avais remarqué, d'oû mon interrogation du bien fondé signed par defaut !
peut etre que le passage à CCI finira par harmoniser tout cela ... mais pas coté MikroC
ou peut etre coté Necto Studio MikroC AI

Bonne nuit ..
Aide toi, le ciel ou FantasPic t'aidera

Test mini OLED SSD1306 128x32 18F27K42 [Resolu]
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#72 Message par satinas » ven. 19 mars 2021 22:38

La fonction SYSTEM_Initialize() laisse I2C1CON0.EN à 0.
Si tu ne l'as pas déjà essayé, tente :

SYSTEM_Initialize();
I2C1CON0.EN = 1;
I2C1_DevicePresent(...);
I2C1CON0.EN = 0;

Dans I2C1_MasterOpen() il fait aussi :
RC3I2C = RC4I2C = 0x51;
Il faudra aussi le faire si tu n'as pas prévu des pull-ups avec WPUC sur RC3 et RC4, dans pin_manager.c
I2C1_MasterOpen() est statique, tu ne peux pas l'appeler depuis le main.

Test mini OLED SSD1306 128x32 18F27K42 [Resolu]
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#73 Message par satinas » sam. 20 mars 2021 10:14

Bonjour,
Impossible d'utiliser les fonctions MCC, trop complexe pour moi.
Après essai ok ce matin :

Code : Tout sélectionner

    SYSTEM_Initialize();
    I2C1CON2 = 0x00;
    I2C1CON0bits.EN = 1;
    for (i=2; i<=254; i=i+2) {
      if (I2C1_DevicePresent(i)) {
        sprintf(Buffer2,"Device #%4u present \r\n",i);
        Print(Buffer2);
      }
    }
    I2C1CON0bits.EN = 0;
    I2C1CON2 = 0x18;

Dans la fonction I2C1_DevicePresent() il faut mettre -> I2C1CNT = 0;

Le warning le plus embêtant c'est celui déjà rencontré dans l'envoi de l'adresse i2c.
I2C1ADB1 = address << 1;
I2C1ADB1 et address sont des unsigned char
il y a calcul (décalage), donc address est d'abord converti en int.
Après le décalage on a toujours un int donc l'affectation unsigned char = int peut provoquer 2 warnings, signe et perte de précision.
I2C1ADB1 = (uint8_t)(address << 1);

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

#74 Message par paulfjujo » sam. 20 mars 2021 19:12

bonsoir Satinas,

Je ne vois pas comment tu as détecté /découvert le probleme ,
mais c'est OK maintenant..
Merci !

j'ai essayé d'isoler la cause en masquant tour à tour le bit 0x1x et le 0x08 de I2C1CON2
il apparait ainsi que c'est le bit 4 qui gênait !
choix du registre definissant l'adresse

et aussi I2C1CON0bits.EN = 1; 1 = Enables the I2C module(1,2)
:?: Curieux ! ,
car SYSTEME _Initialize(); initialisait déja l'i2C1 !

Code : Tout sélectionner


void SYSTEM_Initialize
(void)
{
    
INTERRUPT_Initialize();
    
PMD_Initialize();
    
PIN_MANAGER_Initialize();
    
OSCILLATOR_Initialize();
    
ADCC_Initialize();
    
NCO1_Initialize();
    
TMR0_Initialize();
    
UART1_Initialize();
    
I2C1_Initialize();              <-----------
}
 


le fait de remettre I2C1CON0bits.EN = 0; apres le Test presence device
ne gêne meme pas l'init I2C faite au préalable par SYSTEME_Initialize();
Bizarre !
L'Oled et RTC restent ..OK

bit 4 ADB: Address Data Buffer Disable bit
1 = Received address data is loaded into
1 = Received address data is loaded into I2CxRXB
Transmitted address data is loaded from the I2CxTXB
0 = Received address data is loaded only into the I2CxADB
Transmitted address data is loaded from the I2CxADB0/1 registers.


j'ai modifié la routine pour utiliser des entiers signés ..
et j'affiche le nom de (quelques) devices pouvant etre reconnu ..


Code : Tout sélectionner



int16_t I2C1_DevicePresent
(int16_t address)
{
   static int16_t Etat;
    Etat=0;
    I2C1PIRbits.PCIF = 0;                // clear STOP bit flag
    I2C1ADB1 = address;  // load slave addr and R/W
    I2C1CNT = 0; 
    I2C1CON0bits
.= 1;                 // send START + addr
    while (I2C1PIRbits.PCIF == 0);      // wait for STOP                      
    Etat=!I2C1CON1bits.ACKSTAT;
    return Etat;


dans le main, apres
SYSTEM_Initialize();
et presentation

Code : Tout sélectionner

  
   txt
=&TEXTE[0];
     *(txt)=0; 
    CRLF1
(); 
    CPrint
(" Test Presence I2C device (adressage 8 bits)\r\n"); 
    
// I2C1CON2 = 0x00  // <- OK
    I2C1CON2bits.ABD=0; //  ADB=0; // Transmitted address data is loaded from the I2CxADB0/1 registers.      
    I2C1CON0bits.EN = 1;
     for (i=2; i<=253; i=i+2)
    {
     if (I2C1_DevicePresent(i)) 
     
{   
       k
=i>>1;
       sprintf(txt," @ decimal #%4u  soit @Device7bits = 0X%02X ",i,k);
       switch (k)
       {
        case 0x27: 
        case 0x28
: 
        case 0x29
: 
        case 0x2A
: 
        
// case etc ..   
            strcat(txt,"PCF8574 8bits I/O");// de base + 7 autres
            break; 
        case 0x37
:
            strcat(txt,"LCD 2119 2x16cars"); // de base + 7 autres
            break;  
        case 0x38
:
        case 0x39:
        case 0x3A:
        case 0x3B:
        // case etc ..                                 
            strcat(txt,"PCF8574A 8bits I/O"); // de base + 7 autres
            break;  
        case 0x3C
:
            strcat(txt,"OLED SSD1306");
            break;
        case 0x57:
            strcat(txt,"EEPROM 512bytes");
            break;
        case 0x68:
            strcat(txt,"RTC DS3231");
            break;
        default:
            strcat(txt,"non recensé");        
            break
;
       }   
       Print
(txt);CRLF1();
     }
    }
    I2C1CON0bits.EN = 0;
    //I2C1CON2 = 0x18;
    I2C1CON2bits.ABD=1; 
    CRLF1
(); 


resultat

Projet MPLABX :_18F27K42_OLED_SSD1306_RTC_UART_ITRX_2021-03
Compile le Mar 20 2021 a 18:27:08 UTC
avec version XC8 : 2100
Usage de OLED_SSD1306_I2C_Hardw_18Fx7K42_2021-0316.c rev 20/03/2021
Hardware : BASE 18F27K42
Entree ANA sur RA1
Sortie NCO1 10Khz sur RA3
SQA50 synchro Analyser : Sortie sur RC5
Select OLED 0,96 128x32 Jaune/bleu ou Mini-OLED sur I2C1 via Pin RB1
RTC DS3231 sur le bus I2C1 RC3=SCL RC4=SDA
MAJ RTC via UART1 avec RX Interrupt

Test Presence I2C device (adressage 8 bits)
@ decimal # 120 soit @Device7bits = 0X3C OLED SSD1306
@ decimal # 174 soit @Device7bits = 0X57 EEPROM 512bytes
@ decimal # 208 soit @Device7bits = 0X68 RTC DS3231

#1 Active sortie SQW=1Hz:
GO
ok
Etat pin RC0 = 1
RC0=1 donc ,re-Lecture et affichage des 7 Registres DS3231
Registre #0 58
Registre #1 10

Aide toi, le ciel ou FantasPic t'aidera

Test mini OLED SSD1306 128x32 18F27K42 [Resolu]
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#75 Message par satinas » sam. 20 mars 2021 20:50

Bravo :-)

Oui, j'avais buté sur le ADB = 1 dans les essais, sinon c'est la seule différence entre notre init, et celle de MCC. Ensuite MCC fait un méli-mélo de fonctions, de pointeurs de fonctions, de tableau de pointeurs de fonctions, faut s'accrocher :)

Pourquoi la variable locale Etat est static dans la fonction DevicePresent() ?
Dans xc8 ils ont ajouté le type de variable __bit, de taille 1 bit. C'est une variable non adressable, elle ne peut être locale, par contre elle peut être retournée par une fonction. Contrairement à la variable bit de MikroC, qui elle ne peut pas être retournée, d'après leur doc. Exemple d'utilisation de __bit :

Code : Tout sélectionner

typedef __bit bool;
bool I2C1_DevicePresent(int16_t address)
{
  I2C1PIRbits.PCIF = 0;                // clear STOP bit flag
  I2C1ADB1 = address;                  // load slave addr and R/W
  I2C1CNT = 0;
  I2C1CON0bits.S = 1;                  // send START + addr
  while (I2C1PIRbits.PCIF == 0);       // wait for STOP                     
  return !I2C1CON1bits.ACKSTAT;


Le fait de remettre I2C1CON0bits.EN = 0; apres le Test presence device
ne gêne meme pas l'init I2C faite au préalable par SYSTEME_Initialize(); Bizarre !

Il n'y pas de raison que cela gêne, MCC remet tout à zéro y compris ses interruptions. Quand on utillise une de ses fonctions de lecture/écriture, alors il active le bit EN et démarre tout le bouzin, et le nettoie à la fin. Seules les valeurs des SSP1CONx doivent être conservées pour qu'il s'y retrouve.

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

#76 Message par paulfjujo » dim. 21 mars 2021 16:01

bonjour,

Dans xc8 ils ont ajouté le type de variable __bit, de taille 1 bit.


:+1: OK, tu as raison , ça fait plus propre de retourner l'etat d'un bit dans une variable bit plutot qu'un Byte ..

Pourquoi la variable locale Etat est static dans la fonction DevicePresent() ?

je l'avais déclaré en static .. suite aux deboires rencontésICI ..
mais ici , avec une situation un peu differente, car sans usage de pointeur.
Aide toi, le ciel ou FantasPic t'aidera

Test mini OLED SSD1306 128x32 18F27K42 [Resolu]
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#77 Message par djviper16 » dim. 6 juin 2021 22:51

Bonsoir,

Merci pour ce topic, je viens de commander un pickit 4, un écran oled ssd1306 128x64 avec une bande jaune en haut et le reste en bleu.
J'ai un gros projet que j'aimerais vraiment concrétiser alors vu mon faible niveau en programmation ce topic va m'être vraiment très utile. :-)

[Resolu] Test mini OLED SSD1306 128x32 18F27K42
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#78 Message par djviper16 » mer. 15 déc. 2021 22:27

Bonsoir,

Je reviens vers vous après une semaine à décortiquer chaque soir le fonctionnement d'un écran oled 64x128 en I2C.
Je n'avais jamais touché à une communication I2C ni à un écran, et je dois avouer que j'étais complètement perdu tant ça me paraissait complexe.
D'ailleurs je crois que sans l'exemple de "satinas", je n'aurais jamais réussi à configurer la liaison I2C.

Aucun mérite puisque je me suis complètement inspiré de vos programmes, mais je tenais quand même à vous remercier et poster ici le résultat :

MPLAB_X_IDE_v5.50 - XC8
test_aff5_printf.X - Copie.zip


N'hésitez pas à me dire si vous trouvez des coquilles.

La prochaine étape est de naviguer dans un menu à l'aide d'un encodeur rotatif KY-040.

https://www.youtube.com/watch?v=87vc9g_IGBU

PS : Une idée pour utiliser le "extended ASCII" sur MPLAB ? Histoire d'avoir les "é" etc ?
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

[Resolu] Test mini OLED SSD1306 128x32 18F27K42
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#79 Message par satinas » jeu. 16 déc. 2021 06:15

Bonjour, sympa cette appli Oled.

Pour les caractères accentués, tu peux les mettre dans le fichier source, xc8 affiche juste un warning. Après tu récupères ou tu te fais un fichier font étendu de 256 caractères plutôt que 128.

En plaçant le premier octet à envoyer dans I2C1TXB avant l'envoi du START, il n'est plus nécessaire d'attendre la fin du START. Tu peux donc remplacer

Code : Tout sélectionner

  I2C1CON0bits.S = 1;
  while (I2C1CON0bits.S) { }
  while (!I2C1STAT1bits.TXBE) { }
  I2C1TXB = SSD1306_DATA_CONTINUE;
par

Code : Tout sélectionner

  I2C1TXB = SSD1306_DATA_CONTINUE;
  I2C1CON0bits.S = 1;
ensuite tester comme d'habitude le flag I2C1STAT1bits.TXBE avant envoi de chaque octet data.

un putch() plus rapide

Code : Tout sélectionner

  void putch(char lettre_ASCII)
  {
    k = (lettre_ASCII - 32)*5;
    for (i=0; i<5; i++)
    {       
      buffer1[n++] = F7X5[k++];
    }
    buffer1[n++] = 0x00;
  }

Je ne vois pas où est définie la fonction printf(), xc8 doit l'incorporer. Il semble que la première écriture se fait sans RAZ_buffer1() préalable. Le première paramètre de Oled_print() est une chaîne, donc un pointeur sur des caractères.

A part ça, vous les faites tourner à quelle vitesse ces oleds, ils répondent à 400kHz ?

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

#80 Message par Jérémy » jeu. 16 déc. 2021 08:01

:bravo:
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

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