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

LCD I2C
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 953
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#11 Message par venom » sam. 24 févr. 2018 23:05 lien vers la Data-Sheet : Cliquez ici

Bonsoir paulfjujo et les autres.

Merci pour ce partage précieux. 8-) Je vais analysé et voir le fonctionnement de ton code pour voir d’où peut venir mon erreur.
J'ai fait différant tests de mon coté. (avant ta réponse) je penche pour un problème d'adresse du module i²c.
J'ai quand même par désespoir :lol: lacer ton .hex brut dans mon pic, j'ai bien les leds en PORTD qui s'allume mais rien a l’écran. :? :mur:
[HS]en mode fatigue ce soir j’arrête pour aujourd'hui[/HS]







@++
Mon site web
Mon discord : venom#4888

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

#12 Message par paulfjujo » dim. 25 févr. 2018 09:23 lien vers la Data-Sheet : Cliquez ici

bonjour,

Tu n'as surement pas la meme adresse .. je l'ai precisé dans le programme source .

j'utilise ceci , quand je ne connais pas ou j'ai un doute sur un adressage I2C ..
liste tous les devices rencontres sur le bus I2C ..
mais il faut une sortie UART pour debugger....
RC6 sortie TX UART1 hardware ! ou voir plus bas..

Code : Tout sélectionner



unsigned char  check_device
(unsigned char dev_address,char Bavard)
{
char Cx,OK;
unsigned char k1;
OK=0;
if(
Bavard>0)
{
strConstRamCpy(txt,"Device @ ");
k1=strlen(txt);
ByteToStr(dev_address,CRam1);
strcat(txt,CRam1);
UART1_Write_Text(txt);
}
// if(dev_address==160) Synchro_SQ50=1;
 SSP1CON1.B7=0;  //WCOL_bit
 I2C1_Start();
 Cx=I2C1_Wr(dev_address);
  if(Cx == -1)             //check if collision happened
   {
    Cx = SSPBUF;            //empty the buffer,
    SSPCON1.WCOL=0;     // clear the collision status bit
    }
  I2C_Stop();
// Synchro_SQ50=0;
if( Cx!=)
 {
  OK=0;
  if(Bavard>0)UART1_Write_CText(" not found");
 }
 else
 
{
   OK=1;
   I2_Adresses_Devices[k]=dev_address;
    if(Bavard>0)
    {
      strConstRamCpy(CRam1, " Device #   find at @        ");
      *(CRam1+9)=k+48;
      ByteToStr(dev_address,CRam1+21);
      UART1_Write_Text(CRam1);
      UART1_Write_CText(" soit ");
      ByteToHex(dev_address,CRam1);
      UART1_Write_Text(CRam1);
      CRLF1();

     }
     k++;
  }
 I2C1_Stop();
 Delay_ms(50);
 while(I2C1_Is_Idle()==0);
 if(Bavard>0) CRLF1();
 return(OK);
}



//dans le main program
//apres init  variables...

unsigned int i,j,k,l,m,n;
unsigned char TEXTE [80];
unsigned char *txt;
unsigned char CRam1[24];
unsigned char Adr=0;
unsigned char I2_Adresses_Devices[9];



for(
i=0;i<8;i++)   I2_Adresses_Devices[i]=0;
  i=0;
  j=1;
   k=0;
  // domain to explore de 32 à 240
  // if more than 1 device is on the bus, you will discover all !
  for (Adr=32;Adr<254;Adr=Adr+2)
  {
   if (PORTA.B5==0)   // mode bavard ou pas 
   c1=check_device(Adr,1)  ;
   else
     c1
=check_device(Adr,0)  ;
   Delay_ms(50);
   }

 


exemple de resultat :
List Write Adress I2C Devices (from @32 to 254) :
Device #1 @4E
Device #2 @A0
Device #3 @A8
Device #4 @AA
Device #5 @D0
Device #6
Device #7
Device #8


un UART#3 software en ASM, pas cher ! qui ne mobilisera q"une seul PIN RA2 en sortie
et tres peu de ressource PIC
prevu pour FOSC=16MHz => 19200,8,N,1
pour un 18F, sinon remplacer LATA par PORTA pour un 16F
ou autre PIN de sortie ...

humour!! un peu d' ASM dans ce monde de C , ça fait du bien .

Code : Tout sélectionner

#ifndef CR
#define CR 13
#define LF 10
#endif

// la Pin de sortie est definie dans le main program
 
sbit TX3_Pin at LATA.B2;
 
sbit TX3_Pin_Direction at TRISA.B2;

unsigned char c3 absolute 0x0020;
unsigned char RS_Count;
unsigned char  RS_tmp;
unsigned char RS_Delay  ;

void UART3_Write(unsigned char c1);         // ecrit 1 char
void UART3_Write_Text(unsigned char *T);    // ecrit un texte situé en RAM
void UART3_Write_CText(const char *txt3);    // ecrit un texte en dur (situé en ROM)
void CRLF3(void) ;                     // envoit saut de Ligne  13 , 10   ( CR LF)


void UART3_Write_CText(const char *txt3)
 {
   while (*
txt3)
     {
     
UART3_Write(*txt3++);
    
// Delay_us(500);
     
}
}

void UART3_Write_Text(unsigned char *T)    // at adress  0x002 taille 42 bytes
{
  while(*(
T)>0)     // verif sur VBRAY en mode ASCII
   
{
    
UART3_Write(*(T++));   // c3 variable globale
   
}
}

void CRLF3()
{
 
UART3_Write(CR);
 
UART3_Write(LF);
}


void UART3_Write(unsigned char cc)      // 16MHz 19200 bauds (OK avec Fosc interne!)
{
    
c3=~cc;    // complement du caractere !
    // avec TX3_PIN => RA2
  
_asm{
    
RSsend2:
        
movlw   8                8 bits
        movwf   _RS_Count        
compteur de bits envoyés
        bcf     LATA
,2            bit de start
        call    RSdelai2        
tempo
       
//   rrf        _c1,f        ; on recupere dans C le bit à envoyer
       //  syntaxe à revoir en fonction du PIC utilisé   rrcf avec 18F87J50
    
L00:
        
rrf    _c3,1        on recupere dans C le bit à envoyer
        btfsc   STATUS
,C        bit à envoyer ?
        goto    
L10                oui
        bsf     LATA
,2          sinon 0
        
goto    L20                on continue sur la tempo
    L10
:
        
bcf     LATA,2          bit à 1
    L20
:
        
call    RSdelai2                tempo
        decfsz  _RS_Count
,1        on decremente le compteur de bits envoyés
        
goto    L00                on continue sur les bits suivants
        bsf     LATA
,2         bit de stop
        call    RSdelai2        
tempo pour bit de stop
         call    RSdelai2        
tempo pour bit de stop
        
goto    LA1

    RSdelai2
:                 // 52µS   duree d'un  bit  à 19200 bauds
         
MOVLW 28 ;
         
MOVWF _RS_tmp ;
    
RS00:
         
NOP;                ; fait parti de la tempo!
         
NOP;
         
NOP;
         
NOP;
        
// NOP;
         
DECFSZ _RS_tmp,;
         GOTO   
RS00 ;
         
NOP;
         
NOP;
         
NOP;
         RETURN ;

    
LA1:    nop;
   }
 }

 
Aide toi, le ciel ou FantasPic t'aidera

LCD I2C
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 953
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#13 Message par venom » dim. 25 févr. 2018 15:53 lien vers la Data-Sheet : Cliquez ici

Bonjour Paul,

Oui, j'ai bien évidement changer l'adresse avant de lancer le .hex (omis de le précisé) :oops: :wink:

Je suis parti de ce tableau pou r l'adresse

Pour ce qui est de tes codes, ça permet de scanner tout les modules brancher sur le SDA SCL via un terminal UART c'est bien ça ? Si c'est bien ça c'est top. Je me demander justement si ce type de chose existait. :-D

D’après tes commentaires dans le code, je dois inclure ça dans mon code ? ou je créer un nouveau projet ? J'ai peur de faire des bêtises :oops:
J'avoue ne pas trop savoir quoi en faire (surtout du code asm) :eek:

ps: sa pourrait faire l'objet d'un outil maison sa non ? une platine sur la-quel on relirait et scannerait un i²c ? :-D Fin si c'est possible.


Merci ! de ta patience et partager tes connaissances.



@++
Mon site web
Mon discord : venom#4888

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

#14 Message par paulfjujo » lun. 26 févr. 2018 09:57 lien vers la Data-Sheet : Cliquez ici

venom a écrit :Je suis parti de ce tableau pou r l'adresse


OK, pour ce tableau, mais MIKROC utilise les adresses 8 bits (avec la librairie I2C) (adresse device + bit Lecture/ecriture )
contraitrement au monde ARDUINO qui utilise les adresses 7 bits. (adresse device).
mais ne pas oublier la config des les 3 bits d'adresse hardware A0 A1 A2 !
Pour ce qui est de tes codes, ça permet de scanner tout les modules brancher sur le SDA SCL via un terminal UART c'est bien ça ?

Oui

D’après tes commentaires dans le code, je dois inclure ça dans mon code ? ou je créer un nouveau projet ? J'ai peur de faire des bêtises
J'avoue ne pas trop savoir quoi en faire (surtout du code asm)


Ce n'est pas indispensable , mais tu peux le tester au moins 1 fois..
Des que tu est sur d el'adresse I2C .. tu vires ce dode !

et soit tu utilise l'UART1 Hardware de ce PIC (bibliotheque MikroC UART)

soit tu incorpores tout l'ensemble (avec UART3) dans ton fichier .
en verifiant que FOSC=16MHZ pour 19200 bauds ( sinon tu auras 9600 bds at 8MHz , 4800Bds at 4MHz)

sa pourrait faire l'objet d'un outil maison sa non ? une platine sur la-quel on relirait et scannerait un i²c ? :-D Fin si c'est possible.


Oui ,bien sur, un petit 12F1840 en DIP 8 suffirait amplement ..


A+
Aide toi, le ciel ou FantasPic t'aidera

LCD I2C
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 953
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#15 Message par venom » jeu. 8 mars 2018 23:31 lien vers la Data-Sheet : Cliquez ici

Bonsoir le forum.

paulfjujo a écrit :Oui ,bien sur, un petit 12F1840 en DIP 8 suffirait amplement ..


8-) Cool surement mon future projet. ça peut s’avérer utile. :langue:

Revenons a nos mouton. J'ai discuter avec paulfjujo de son "code scan i2c" Il m'a renvoyé une version fonctionnel. j'ai du changer 2, 3 trucs rien de méchant. :wink:

Voici ce que ma renvoyé le terminal :

Code : Tout sélectionner

Test Presence device I2C en mode Bavard
Device 
@  32 not found 
Device 
@  34 not found 
Device 
@  38 not found 
Device 
@  42 not found 
Device 
@  46 not found 
Device 
@  50 not found 
Device 
@  54 not found 
Device 
@  56 not found 
Device 
@  60 not found 
Device 
@  64 not found 
Device 
@  68 not found 
Device 
@  72 not found 
Device 
@  76 not found 
Device 
@  80 not found 
Device 
@  84 not found 
Device 
@  86 not found 
Device 
@  90 not found 
Device 
@  94 not found 
Device 
@  98 not found 
Device 
@ 102 not found 
Device 
@ 106 not found 
Device 
@ 110 not found 
Device 
@ 118 not found 
Device 
@ 126 Device #0  find at @ 32 soit 20
Device @ 130 not found


Je suppose que le Device @ 126 correspond a mon PCF8574AT ? En revanche je dois tirer quel conclusion du résultat ? :-D que l'adresse du PCF8574AT et 0x20 ?

Je posterai le code du scan plus tard car il y a encore du bug (sauf si vous en avez besoin de suite pour d’éventuel test).
D'avance merci






@++
Mon site web
Mon discord : venom#4888

LCD I2C
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#16 Message par Gérard » ven. 9 mars 2018 17:47 lien vers la Data-Sheet : Cliquez ici

Bonjour,
Regarde ici en page 5 tu trouveras l'adresse du PCF.
Je ne vois que une solution pour h20, c'est que ton chip est un PCF8574 (pas de A) et que le bit R/W ne soit pas pris en compte.
Attends d'autres avis.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

LCD I2C
pspic
Passioné
Passioné
Messages : 357
Âge : 77
Enregistré en : septembre 2017
Localisation : 68

#17 Message par pspic » ven. 9 mars 2018 19:48 lien vers la Data-Sheet : Cliquez ici

Si tu as un Arduino sous la main, tu peux utiliser ceci: http://bateaux.trucs.free.fr/scanneur_i2c.html pour trouver l'adresse de ton module sur 7 bits.
Tu devrai trouver la même adresse qu'avec le code de Paulfjujo
Je pense que l'adresse Write est $40 et Read est $41 pour ton module.
AdrPCF8574.JPG
.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

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

#18 Message par paulfjujo » ven. 9 mars 2018 21:09 lien vers la Data-Sheet : Cliquez ici

j'ai du changer 2, 3 trucs rien de méchant. :wink:



bizarre ce resultat ?
peux-tu reposter le code complet que tu as utilisé ?


Nota @126 en decimal soit 7E en hexadecimal
c'est bien à cette adresse là.. sur 8 bits ( inclus donc le bit R/W à 0)
et non pas 0x20 ????

attention PCF8754A adresse de base Ecriture 0x7E (avec A0,A1,A2=1)
Aide toi, le ciel ou FantasPic t'aidera

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

#19 Message par paulfjujo » sam. 10 mars 2018 17:37 lien vers la Data-Sheet : Cliquez ici

bizarre , mon dernier post à disparu ??


Version LCD I2C pour un LCD 4x20 car avec un PCF8574T (sans le A!)
+ sortie UART
+ decouverte device I2C .. il est bien trouvé en 0x4E ..

nota: mode "bavard" géré par l'etat de la pin RA3 1=bavard 2= restreint

Code : Tout sélectionner

//    pic : 16f887 4MHz      //
// rev Paulfjujo

#define Version "180310"
#define Directory "C:\\_MikroC\\_MesProjets_MikroC\\_16F887_Dip40_tests"
#define Projet "16F887_test_LCD_I2C_1803.mcppi"
#define Source "_16F887_LCD_I2C_test_"

// config
//CONFIG1 : $2007 : 0x2CF4
//CONFIG2 : $2008 : 0x0600

#define LCD_4x20
#define LCD_ADDR 0x4E        // adresse du PCF8574A = 0x7E. adresse du PCF8574 = 0x4E


// PCF8574 I2C LCD Port Definition
// P7,P6,P5,P4 = Data, P3=Backlight (BL), P2=E, P1=RW, P0=RS
#define LCD_BL 0x08
#define LCD_EN 0x04
#define LCD_RW 0x02
#define LCD_RS 0x01

// ref : ODT OCM-20416D-A2023 LCD Module  8/4/1999
// LCD Command
#define LCD_CLEAR 0x01
#define LCD_HOME  0x02
#define Display_ON 0x0C
#define Display_OFF 0x08
#define LCD_LINE1 0x80      // 0x00 + bit D7=1
#define LCD_LINE2 0xC0      // 0x40 + bit D7=1
#define LCD_LINE3 0x94      // 0x14 + bit D7=1
#define LCD_LINE4 0xD4      // 0x54 + bit D7=1

#define FOSC 4  // MHz

const code char mesg0[]="Mikroc 7.10 16F887 dip40 LCD4x20 I2C2 "Version"\n\r";
const code char mesg1[]="                    ";
const code char * Messages[]={mesg0,mesg1};
const char txt1[] = "I2C LCD  4x20  PCF8574T ";
const char txt2[] = "MCU PIC16f887 en DIP40";  // TEXTE dans le CODE FLASH ROM
unsigned char TEXTE[48];  // TEXTE en RAM
unsigned char *txt;
unsigned char CRam1[20];
unsigned char  I2C_Adresses_Devices[8];

sbit Bavard at RA3_bit ;
sbit Bavard_Dir at TRISA3_bit ;
sbit Led at RA4_bit ;
sbit Led_Dir at TRISA4_bit ;

unsigned int i,j,k;
unsigned char Addr;
unsigned char  donnee;
static unsigned char Nb;
unsigned int Etat;
unsigned int EA0;  // analog input
unsigned int v;

#define With_LCD_I2C
#define BAVARD  PORTA,3


void UART1_Write_CText(const char *txt);

unsigned char I2C_PCF8574_Write(unsigned char  Adr,unsigned char value);
void LCD_init_4x20(void);
void LCD_putcmd(unsigned char d,unsigned char cmdtype);
void LCD_putch(unsigned char d);
void LCD_Write_text(char *s);
void LCD_Write_CText(const char *txt) ;
void LCDHandler(char c);

void strConstRamCpy(unsigned char *dest, const code char *source);
void Check_Device(unsigned char dev_address, char mode);
void CRLF1(void);

void Erase_Line(int L);


void Check_Device(unsigned char dev_address,char Mode_Bavard)
{
char Cx;

unsigned char k1;
if(
Mode_Bavard>0)
{
UART1_Write_CText(" I2C Device at @ ");
  ByteToHex(dev_address,CRam1);
  UART1_Write_Text(CRam1);
}
 //if(dev_address==160) Synchro_SQ50=1;
 SSPCON.B7=0;  //WCOL_bit
 I2C1_Start();
 Cx=I2C1_Wr(dev_address);
  if(Cx == -1)             //check if collision happened
   {
    Cx = SSPBUF;            //empty the buffer,
    SSPCON.WCOL=0;     // clear the collision status bit
    }
  I2C_Stop();
 //Synchro_SQ50=0;
 if( Cx!=)
 {
  if(Mode_Bavard>0)UART1_Write_CText(" not found");
 }
 else
 
{
   I2C_Adresses_Devices[k]=dev_address;
    if(Mode_Bavard>0)
    {

      UART1_Write_CText(" ... soit ");
      ByteToStr (dev_address,CRam1);
      UART1_Write_Text(CRam1);
      UART1_Write_CText("  Found OK  ");
      CRLF1();
     }
     Nb++;
  }
 I2C1_Stop();
 Delay_ms(50);
 while(I2C1_Is_Idle()==0);
 if(Mode_Bavard>0) CRLF1();
}

// --- Copie le texte depuis FLASH ROM vers RAM
void strConstRamCpy(unsigned char *dest, const code char *source)
 {
  while (*source)*dest++ = *source++ ;
  *dest = 0 ;    // terminateur
}

    
void UART1_Write_CText
(const char *txt)
 {
   while (*txt)
     {
     UART1_Write(*txt++);
    // Delay_us(500);
     }
}
void CRLF1(void)
{
UART1_Write(13);
UART1_Write(10);
}

 void LCD_CLS(void)
 {
   Erase_Line(4);
    Erase_Line(3);
     Erase_Line(2);
      Erase_Line(1);
 }

void Erase_Line(int L)
{
switch(
L)
 {
 case 1:
  {
   LCD_putcmd(LCD_LINE1,1);
  LCD_Write_CText(mesg1);
  // LCD_Write_CText("                    ");
   LCD_putcmd(LCD_LINE1,1);
   break;
  }
  case 2:
  {
   LCD_putcmd(LCD_LINE2,1);
   LCD_Write_CText(mesg1);
   LCD_putcmd(LCD_LINE2,1);
    break;
  }
  case 3:
  {
   LCD_putcmd(LCD_LINE3,1);
  LCD_Write_CText(mesg1);
   LCD_putcmd(LCD_LINE3,1);
    break;
  }
  case 4 :
  {
   LCD_putcmd(LCD_LINE4,1);
   LCD_Write_CText(mesg1);
   LCD_putcmd(LCD_LINE4,1);
    break;
  }
 }
}

 //========== LCD 4x20 sur bus I2C ================================

 unsigned char I2C_PCF8574_Write(unsigned char Adr,unsigned char value)
{
 unsigned char S,dummy;
 I2C1_Start();
 S = I2C1_Wr( Adr );
 if(== -1)        //check if bus collision happened
 {
   dummy = SSPBUF;        //upon bus collision detection clear the buffer,
   SSPCON.WCOL=0;    // clear the bus collision Etat bit
 }
 S = I2C1_Wr(value);
 I2C1_Stop();
 return(S);
}
/*
  PCA8574 I2C LCD Routine
  LCD Data PCA8574: P7,P6,P5,P4
  LCD Control: P3: Back Light, P2: E-Enable, P1:RW, P0: RS
*/
void LCD_putcmd(unsigned char d,unsigned char cmdtype)
{
  unsigned char lcddata;
  // Put the Upper 4 bits data
  lcddata = (& 0xF0)|LCD_BL;
  Etat=I2C_PCF8574_Write(Addr,lcddata | LCD_EN);
  Delay_us(50);
  // Write Enable Pulse E: Hi -> Lo
  Etat=I2C_PCF8574_Write(Addr,lcddata & ~LCD_EN);
  Delay_us(50);      // Delay 1us for 16 MHz Internal Clock
  // cmdtype = 0; One cycle write, cmdtype = 1; Two cycle writes
  if (cmdtype) {
    // Put the Lower 4 bits data
    lcddata = ((<< 4) & 0xF0)|LCD_BL;
    Etat=I2C_PCF8574_Write(Addr,lcddata | LCD_EN);
    Delay_us(10);    // Delay 2us for 16 MHz Internal Clock
    // Write Enable Pulse E: Hi -> Lo
    Etat=I2C_PCF8574_Write(Addr,lcddata & ~LCD_EN);
    Delay_ms(5);    // Delay 1us for 16 MHz Internal Clock
  }
}

void LCD_putch(unsigned char d)
{
  unsigned char lcddata;
  // Put the Upper 4 bits data
  lcddata = (& 0xF0)|LCD_BL|LCD_RS;
  Etat=I2C_PCF8574_Write(Addr,lcddata | LCD_EN);
  Delay_us(10);      // Delay 2us for 16 MHz Internal Clock
  // Write Enable Pulse E: Hi -> Lo
  Etat=I2C_PCF8574_Write(Addr,lcddata & ~LCD_EN);
  Delay_us(10);      // Delay 1us for 16 MHz Internal Clock
  // Put the Lower 4 bit data
  lcddata = ((<< 4) & 0xF0)|LCD_BL|LCD_RS;
  Etat=I2C_PCF8574_Write(Addr,lcddata | LCD_EN);
  Delay_us(10);      // Delay 2us for 16 MHz Internal Clock
  // Write Enable Pulse E: Hi -> Lo
  Etat=I2C_PCF8574_Write(Addr,lcddata & ~LCD_EN);
  Delay_us(25);      // Delay 1us for 16 MHz Internal Clock
}

void LCD_init_4x20(void)
{
  // Wait for more than 15 ms after VCC rises to 4.5 V
  Delay_ms(1000);
  // Send Command 0x30
  LCD_putcmd(0x30,0);
  // Wait for more than 4.1 ms
  Delay_ms(100);
  // Send Command 0x30
  LCD_putcmd(0x30,0);
  // Wait for more than 100 us
  Delay_ms(25);
  // Send Command 0x30
  LCD_putcmd(0x30,0);
    Delay_ms(25);
  // Function set: Set interface to be 4 bits long (only 1 cycle write).
  LCD_putcmd(0x25,0);
    Delay_ms(20);
  // Function set: DL=0;Interface is 4 bits, N=1; 2 Lines, F=0; 5x8 dots font)
  LCD_putcmd(0x28,1);
    Delay_ms(20);
  // Display Off: D=0; Display off, C=0; Cursor Off, B=0; Blinking Off
  LCD_putcmd(0x08,1);
    Delay_ms(20);
  // Display Clear
  LCD_putcmd(LCD_CLEAR,1);
    Delay_ms(100);
  // Entry Mode Set: I/D=1; Increament, S=0; No shift
  LCD_putcmd(0x06,1);
    Delay_ms(20);
  // Display On, Cursor Off
  LCD_putcmd(0x0C,1);
    Delay_ms(20);
}

void LCD_putsRom(const code char *s)
{
int i=0;
  while((*!= 0)&& (i<20))
  {
    LCD_putch(*s);
    s++;i++;
  }
}

void LCD_Write_Text( char *s)
{
int i=0;
  while((*!= 0)&& (i<20))
  {
    LCD_putch(*s);
    s++;
    i++;
  }
}

void LCD_Write_CText(const char *txt)
{
   while (*txt)
   LCD_putch(*txt++);
 }

void LCDHandler(char c) {
  LCD_putch(c);
}


void main()
{
  OSCCON=0;
  OSCCON.IRCF2=1;   // 4MHz
  OSCCON.IRCF1=1;
  OSCCON.IRCF0=0;
  OSCCON.SCS=1;
  //OSCCON=0b01110001 ; // 8MHz (111) & SCS=1  (sinon 4 MHz par defaut)
  //OSCCON=0b01100001 ; // 4 MHz par defaut
  //OSCCON = 0b11110010;   // configuration osc interne 32Mhz  (avec PLL)

    ANSEL  = 0x01; // Configure AN0 as analog
    ANSELH = 0;
    TRISA=0xFF;
    Bavard_Dir=1;
    Led_Dir=0;
    Led=0;
    TRISB=0xFF;
    TRISC = 0xFF;
    PORTC = 0x00;
    TRISD=0;   // 8 leds
    PORTD = 0;
    C1ON_bit = 0;                      // Disable comparators
    C2ON_bit = 0;
    EA0=0;

    // 1er test hardware
    // pour verif FOSC

    for (j=0;j<3;j++)
    {
     Led=!Led;
     Delay_ms(1000);
    }
    txt=TEXTE;

    UART1_Init(9600);
    // test sortie TX UART
    TXREG='A'; Delay_ms(10);
    TXREG='B'; Delay_ms(10);
    TXREG='C'; Delay_ms(10);
    CRLF1();
    CRLF1();
    UART1_Write_CText(mesg0);
    UART1_Write_CText("Test LCD en mode I2C\r\n");
    UART1_Write_CText(txt1); CRLF1();
    UART1_Write_CText(txt2); CRLF1();
    CRLF1();

    UART1_Write_CText(" Init I2C à 100KHz\r\n");
    I2C1_Init(100000);

    Delay_ms(500);                         // ajout delay 500ms

    if (Bavard==1)
       UART1_Write_CText(" Pin RA3 à 1 => mode Bavard ACTIF \r\n") ;
       else
         UART1_Write_CText
(" Pin RA3 à 0 => mode Bavard désactivé \r\n") ;
    
    Nb
=0;   // Nb de device sur le bus
    for (i=32;i< 254;i=i+2)  // adresse paires seulement ( adresse impaire  Lecture)
    {
     if (Bavard==1)     // RA3 au 0V
        Check_Device(i,1)  ;
          else   
          Check_Device
(i,0)  ;
     }
    CRLF1();
    // si on est pas en mode Bavard
    //  si les details ne sont pas affichés
    // on affichera que les devices decouverts sur le bus
    if ((Bavard==0) &&(Nb>0))
     {
         UART1_Write_CText(" Device sur le bus I2C \r\n") ;
         for (i=0;i<Nb;i++)
         {
          UART1_Write_CText(" Device trouvé at @ ");
          ByteToHex(I2C_Adresses_Devices[i],CRam1);
          UART1_Write_Text(CRam1);
          UART1_Write_CText("h ... soit ");
          ByteToStr (I2C_Adresses_Devices[i],CRam1);
          UART1_Write_Text(CRam1);
          CRLF1();
          }
     }
    UART1_Write_CText(" Fin de recherche device \r\n") ;
    CRLF1();
    
    Addr
=LCD_ADDR;   // 4E   A0=1 A1=1 A2=1
    LCD_init_4x20();
    Delay_ms(50);
    LCD_putcmd(LCD_CLEAR,1);
    Delay_ms(50);// LCD Clear
    LCD_CLS();
    Delay_ms(1000);
    
    ADC_Init
();
    
   j
=0;
   do
   
{
       // Presentation sur LCD
     LCD_putcmd(LCD_LINE1,1);
     Delay_ms(50);  // sans ce delai ,les 3 premiers caracteres sont bouffes sur le LCD
     LCD_Write_CText("16F887    Q= 4MHz    ");
     LCD_putcmd(LCD_LINE2,1);
     Delay_ms(50);  // sans ce delai ,les 3 premiers caracteres sont bouffes sur le LCD
     LCD_Write_CText("Version I2C  400Khz ");
     LCD_putcmd(LCD_LINE3,1);
     Delay_ms(50);
   
     EA0
=ADC_Read(0) ;
     // 1ere façon      //12345678901234567890
     strConstRamCpy(txt,"EA0 = 00000  pts     ");
     WordToStr(v, CRam1);
     k=strlen(CRam1);
     strncpy(txt+6,CRam1,k-1);
     LCD_Write_Text(txt);

     UART1_Write_Text(txt);
     
     
// si Ualim =4.096V     4mV par point
     v=EA0  <<2;
     CRam1[0] = (v/10000);
     if ((v/10000)==0) CRam1[0] =' '; else CRam1[0] = (v/10000)+48;
     CRam1[1] = ((v/1000)%10)+48;
     CRam1[2] ='.';
     CRam1[3] = ((v/100)%10)+48;
     CRam1[4] = ((v/10)%10)+48;
     CRam1[5]  = 0;
     LCD_putcmd(LCD_LINE4,1);
     Delay_ms(50);  // sans ce delai ,les 3 premiers caracteres sont bouffes sur le LCD
     LCD_Write_CText("Voltage = ");
     LCD_putcmd(LCD_LINE4+10,1);  Delay_ms(50);
     LCD_Write_Text(CRam1);
     LCD_putcmd(LCD_LINE4+17,1); Delay_ms(50);
     LCD_Write_CText("V");
     
     UART1_Write_CText
(" soit  ");
     UART1_Write_Text(CRam1);
     UART1_Write_CText(" V \r\n");
     Delay_ms(2000);
    Led=!Led;
    }
    while(1);
}
 

/*



ABC

Mikroc 7.10 16F887 dip40 LCD4x20 I2C2 180310
Test LCD en mode I2C
I2C LCD  4x20  PCF8574T
MCU PIC16f887 en DIP40

 Init I2C à 100KHz
 Pin RA3 à 0 => mode Bavard désactivé

 Device sur le bus I2C
 Device trouvé at @ 4Eh ... soit  78
 Fin de recherche device

EA0 =   710  pts      soit   0.25 V
EA0 =   250  pts      soit   0.54 V
EA0 =   540  pts      soit   0.29 V


si RA3=1;

I2C Device at @ 3C not found
 I2C Device at @ 3E not found
 I2C Device at @ 40 not found
 I2C Device at @ 42 not found
 I2C Device at @ 44 not found
 I2C Device at @ 46 not found
 I2C Device at @ 48 not found
 I2C Device at @ 4A not found
 I2C Device at @ 4C not found
 I2C Device at @ 4E ... soit  78  Found OK

 I2C Device at @ 50 not found
 I2C Device at @ 52 not found
 I2C Device at @ 54 not found
 I2C Device at @ 56 not found
 I2C Device at @ 58 not found
 I2C Device at @ 5A not found
 I2C Device at @ 5C not found
 */


sur le terminal Ecran

ABC <-- envoi direct part TXREG

Mikroc 7.10 16F887 dip40 LCD4x20 I2C2 180310
Test LCD en mode I2C
I2C LCD 4x20 PCF8574T
MCU PIC16f887 en DIP40

Init I2C à 100KHz
Pin RA3 à 0 => mode Bavard désactivé

Device sur le bus I2C
Device trouvé at @ 4Eh ... soit 78
Fin de recherche device

EA0 = 710 pts soit 0.25 V
EA0 = 250 pts soit 0.54 V
EA0 = 540 pts soit 0.29 V


si RA3=1;

I2C Device at @ 3C not found
I2C Device at @ 3E not found
I2C Device at @ 40 not found
I2C Device at @ 42 not found
I2C Device at @ 44 not found
I2C Device at @ 46 not found
I2C Device at @ 48 not found
I2C Device at @ 4A not found
I2C Device at @ 4C not found
I2C Device at @ 4E ... soit 78 Found OK

I2C Device at @ 50 not found
I2C Device at @ 52 not found
I2C Device at @ 54 not found
I2C Device at @ 56 not found
I2C Device at @ 58 not found
I2C Device at @ 5A not found
I2C Device at @ 5C not found


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

LCD I2C
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 953
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#20 Message par venom » sam. 10 mars 2018 22:29 lien vers la Data-Sheet : Cliquez ici

Bonsoir a tous,

@Paulfjujo
Voici le code que j'ai utilisé et qui ma donner le résultat ci-dessus:

Code : Tout sélectionner

///////////////////////////////
// rev 08/03/2018
// cocher la librairie Conversion !

// donne un nom a la patte RA4 du microcontorleur "led"
sbit led at RA4_bit;
sbit Led_dir at TRISA.B4;

// déclaration pour scan i2c
unsigned int i,j,k,l,m,n;
unsigned char TEXTE [80];
unsigned char *txt;
unsigned char CRam1[24];
unsigned char Adr=0;
unsigned char c1;
unsigned char I2_Adresses_Devices[9];

int Nb_device_sur_le_bus_I2C =0;

#define CR 13
#define LF 10




void CRLF1(void)  // changement de ligne sur terminal
{
    UART1_Write(CR);
    UART1_Write(LF);
}


// procedure de paulfjujo pour envoyé du TEXTE en uart avec les pic 16F
void UART1_Write_CText(const char *txt)
 {
   while (*txt)
     {
     UART1_Write(*txt++);
    // Delay_us(500);
     }
}


// Ajout pour scan i2c
 void strConstRamCpy(char *dest, const char *source) {
  while(*source) *dest++ = *source++ ;
  *dest = 0 ;    // terminateur
}


// Ajout pour scan i2c
unsigned char  check_device(unsigned char dev_address,char Bavard)
{
char Cx,OK;
unsigned char k1;
OK=0;
if(
Bavard>0)
{
strConstRamCpy(txt,"Device @ ");
k1=strlen(txt);
ByteToStr(dev_address,CRam1);
strcat(txt,CRam1);
UART1_Write_Text(txt);
}
 SSPCON.B7=0;  //WCOL_bit      à tester, sinon  mettre en commentaire !!!!!!!!!!!!!!!!!!!!!
 I2C1_Start();
 Cx=I2C1_Wr(dev_address);
  if(Cx == -1)             //check if collision happened
   {
    Cx = SSPBUF;            //empty the buffer,
    SSPCON.WCOL=0;     // à tester ,sinon  du mettre en commentaire !!!!!!!!!!!!!!!!!!!!!
    }
  I2C_Stop();

if(
 Cx!=)
 {
  OK=0;
  if(Bavard>0)UART1_Write_CText(" not found \r\n");
 }
 else
 
{
   OK=1;
   I2_Adresses_Devices[k]=dev_address;
    if(Bavard>0)
    {
      strConstRamCpy(CRam1, " Device #   find at @        \r\n");
      *(CRam1+9)=k+48;
      ByteToStr(dev_address,CRam1+21);
      UART1_Write_Text(CRam1);
      UART1_Write_CText(" soit ");
      ByteToHex(dev_address,CRam1);
      UART1_Write_Text(CRam1);
      CRLF1();
     }
     k++;
  }
 I2C1_Stop();
 Delay_ms(50);
 while(I2C1_Is_Idle()==0);
 if(Bavard>0);
 return(OK);
}



//////////////////////////////////////////////////////////////////////////////
////////////////////////////////debut du code/////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
void main()
{
  OSCCON = 0b01110001;            // oscilateur interne sur 8Mhz
  while(OSCCON.HTS==0);           // boucle en attendant de voir le flag à 1 (verifie que OSCCON est bien STABLE)

  C1ON_bit = 0;                   // Désactiver les comparateurs
  C2ON_bit = 0;                   // Désactiver les comparateurs

  ANSEL  = 0;                     // Configurer les broches AN comme numériques
  ANSELH = 0;

 // TRISA = 0x00;             // RA5 en entree pour  mode BAVARD
  TRISA= 0b11111111;          // tout les port A en Entrée = 1, sauf
  Led=0;
  TRISC= 0b10111111;          // RC7 en entree RC6 en Sortie


  UART1_Init(9600);               // Initialise connection UART a 9600 bps
  Delay_ms(500);                  // Attendre que le module UART se stabilise

  I2C1_Init(100000);              // Initialise le bus I2C Bus a 100Khz
  Delay_ms(500);                  // Attendre que le module I2C se stabilise

  UART1_Write_CText("Test Presence device I2C en mode ");
  if (PORTA.B5==0)
       UART1_Write_CText("Aveugle\r\n");
  else
      UART1_Write_CText
("Bavard\r\n");
  // Ajout pour scan i2c
  for(i=0;i<8;i++)   I2_Adresses_Devices[i]=0;
  i=0;
  j=1;
   k=0;

// domain to explore de 32 à 240
// if more than 1 device is on the bus, you will discover all !

// la pin RA5 sert à rendre le programme Bavard ou pas ,
//  donc avec resultat sur terminal ou en aveugle
// si RA5 est à 1 ( par defaut RA5=1 si non connectée au 0V)
//  on utilse ce parametre dans la fonction
// c1=check_device(Adr,1)  ;   //  mode Bavard , on visualise les details sur l'ecran
// si RA5 est à 0
// c1=check_device(Adr,0)  ;  // mode aveugle
//  la fonction check_device(Adr,x) retourne une valeur , que l'on range ici dans "c1"
// on s'en sert surtout si on est en mode Aveugle (Bavard=0) pour tester si le device
// a été vu sur le bus I2C


  for (Adr=32;Adr<254;Adr=Adr+2)
  {
   if (PORTA.B5==0)   // mode silencieux
       /*c1=check_device(Adr,0)  ;
      else*/
        c1=check_device(Adr,1)  ;
   // possibilité d'usage du retour dans c1
   if(c1>0) Nb_device_sur_le_bus_I2C++;
   Delay_ms(50);
   }

   UART1_Write_CText("Nb de device trouvé I2C sur le bus I2C :\r\n");
   IntToStr(Nb_device_sur_le_bus_I2C,CRam1);
   UART1_Write_Text(CRam1);
   CRLF1();    // saut de ligne
  do
  
{
    led = 1; // allume la led
    delay_ms(100);
    led = 0; // eteint la led
    delay_ms(100);
    }
     while(1);
 }


Je suis même tomber sur ta page qui a l'air de bien expliqué la chose. Mais j'ai du mal a tout saisir :oops: :sifflotte:

Avec ton dernier code voici ce que j'obtiens :
En mode bavard

Code : Tout sélectionner

ABC



Mikroc 7.10 16F887 dip40 LCD4x20 I2C2 180310


Test LCD en mode I2C
I2C LCD  4x20  PCF8574T 

MCU PIC16f887 en DIP40



 Init I2C à 100KHz

 Pin RA3 à 1 
=> mode Bavard ACTIF 

 I2C Device at 
@ 60 not found
 I2C Device at 
@ 62 not found
 I2C Device at 
@ 64 not found
 I2C Device at 
@ 66 not found
 I2C Device at 
@ 68 not found
 I2C Device at 
@ 6A not found
 I2C Device at 
@ 6C not found
 I2C Device at 
@ 6E not found
 I2C Device at 
@ 70 not found
 I2C Device at 
@ 72 not found
 I2C Device at 
@ 74 not found
 I2C Device at 
@ 76 not found
 I2C Device at 
@ 78 not found
 I2C Device at 
@ 7A not found
 I2C Device at 
@ 7C not found
 
 I2C Device at 
@ 7E ... soit 126  Found OK  

 I2C Device at 
@ 80 not found
 I2C Device at 
@ 82 not found
 I2C Device at 
@ 84 not found
 I2C Device at 
@ 86 not found
 I2C Device at 
@ 88 not found
 I2C Device at 
@ 8A not found
 I2C Device at 
@ 8C not found
 I2C Device at 
@ 8E not found
 I2C Device at 
@ 90 not found
 I2C Device at 
@ 92 not found
 I2C Device at 
@ 94 not found
 I2C Device at 
@ 96 not found
 I2C Device at 
@ 98 not found
 I2C Device at 
@ 9A not found
 I2C Device at 
@ 9C not found
 I2C Device at 
@ 9E not found
 I2C Device at 
@ A0 not found
 I2C Device at 
@ A2 not found
 I2C Device at 
@ A4 not found
 I2C Device at 
@ A6 not found
 I2C Device at 
@ A8 not found
 I2C Device at 
@ AA not found
 I2C Device at 
@ AC not found
 I2C Device at 
@ AE not found
 I2C Device at 
@ B0 not found
 I2C Device at 
@ B2 not found
 I2C Device at 
@ B4 not found
 I2C Device at 
@ B6 not found
 I2C Device at 
@ B8 not found
 I2C Device at 
@ BA not found
 I2C Device at 
@ BC not found
 I2C Device at 
@ BE not found
 I2C Device at 
@ C0 not found
 I2C Device at 
@ C2 not found
 I2C Device at 
@ C4 not found
 I2C Device at 
@ C6 not found
 I2C Device at 
@ C8 not found
 I2C Device at 
@ CA not found
 I2C Device at 
@ CC not found
 I2C Device at 
@ CE not found
 I2C Device at 
@ D0 not found
 I2C Device at 
@ D2 not found
 I2C Device at 
@ D4 not found
 I2C Device at 
@ D6 not found
 I2C Device at 
@ D8 not found
 I2C Device at 
@ DA not found
 I2C Device at 
@ DC not found
 I2C Device at 
@ DE not found
 I2C Device at 
@ E0 not found
 I2C Device at 
@ E2 not found
 I2C Device at 
@ E4 not found
 I2C Device at 
@ E6 not found
 I2C Device at 
@ E8 not found
 I2C Device at 
@ EA not found
 I2C Device at 
@ EC not found
 I2C Device at 
@ EE not found
 I2C Device at 
@ F0 not found
 I2C Device at 
@ F2 not found
 I2C Device at 
@ F4 not found
 I2C Device at 
@ F6 not found
 I2C Device at 
@ F8 not found
 I2C Device at 
@ FA not found
 I2C Device at 
@ FC not found
 Fin de recherche device

ça se rapproche de ton résultat :-D

En mode non bavard :

Code : Tout sélectionner

ABC
Mikroc 7.10 16F887 dip40 LCD4x20 I2C2 180310
Test LCD en mode I2C
I2C LCD  4x20  PCF8574T 
MCU PIC16f887 en DIP40
 Init I2C à 100KHz
 Pin RA3 à 0 
=> mode Bavard désactivé 

 Device sur le bus I2C 
 Device trouvé at 
@ FFh ... soit 255
 Fin de recherche device 




@pspic
Je n'ai malheureusement pas de arduino avec moi. Je n'ai pas encore passer le cap des ces petites bêbêtes :-D






@++
Modifié en dernier par venom le dim. 11 mars 2018 11:42, modifié 2 fois.
Mon site web
Mon discord : venom#4888


Retourner vers « Langage C »

Qui est en ligne

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