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
LCD I2C
Bonsoir paulfjujo et les autres.
Merci pour ce partage précieux. 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 lacer ton .hex brut dans mon pic, j'ai bien les leds en PORTD qui s'allume mais rien a l’écran.
[HS]en mode fatigue ce soir j’arrête pour aujourd'hui[/HS]
@++
Merci pour ce partage précieux. 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 lacer ton .hex brut dans mon pic, j'ai bien les leds en PORTD qui s'allume mais rien a l’écran.
[HS]en mode fatigue ce soir j’arrête pour aujourd'hui[/HS]
@++
LCD I2C
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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..
exemple de resultat :
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 ...
un peu d' ASM dans ce monde de C , ça fait du bien .
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!=0 )
{
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 ...
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 = 1 ?
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,F ;
GOTO RS00 ;
NOP;
NOP;
NOP;
RETURN ;
LA1: nop;
}
}
LCD I2C
Bonjour Paul,
Oui, j'ai bien évidement changer l'adresse avant de lancer le .hex (omis de le précisé)
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’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)
ps: sa pourrait faire l'objet d'un outil maison sa non ? une platine sur la-quel on relirait et scannerait un i²c ? Fin si c'est possible.
de ta patience et partager tes connaissances.
@++
Oui, j'ai bien évidement changer l'adresse avant de lancer le .hex (omis de le précisé)
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’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)
ps: sa pourrait faire l'objet d'un outil maison sa non ? une platine sur la-quel on relirait et scannerait un i²c ? Fin si c'est possible.
de ta patience et partager tes connaissances.
@++
LCD I2C
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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 ? Fin si c'est possible.
Oui ,bien sur, un petit 12F1840 en DIP 8 suffirait amplement ..
A+
LCD I2C
Bonsoir le forum.
Cool surement mon future projet. ça peut s’avérer utile.
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.
Voici ce que ma renvoyé le terminal :
Je suppose que le Device @ 126 correspond a mon PCF8574AT ? En revanche je dois tirer quel conclusion du résultat ? 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
@++
paulfjujo a écrit :Oui ,bien sur, un petit 12F1840 en DIP 8 suffirait amplement ..
Cool surement mon future projet. ça peut s’avérer utile.
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.
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 ? 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
@++
LCD I2C
- Gérard
Expert- Messages : 1640
- Âge : 65
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
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.
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.
LCD I2C
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.
.
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.
.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
LCD I2C
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
j'ai du changer 2, 3 trucs rien de méchant.
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)
LCD I2C
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
sur le terminal Ecran
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!=0 )
{
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(S == -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 = (d & 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 = ((d << 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 = (d & 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 = ((d << 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((*s != 0)&& (i<20))
{
LCD_putch(*s);
s++;i++;
}
}
void LCD_Write_Text( char *s)
{int i=0;
while((*s != 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
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
LCD I2C
Bonsoir a tous,
@Paulfjujo
Voici le code que j'ai utilisé et qui ma donner le résultat ci-dessus:
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
Avec ton dernier code voici ce que j'obtiens :
En mode bavard
ça se rapproche de ton résultat
En mode non bavard :
@pspic
Je n'ai malheureusement pas de arduino avec moi. Je n'ai pas encore passer le cap des ces petites bêbêtes
@++
@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!=0 )
{
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
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
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
@++
Modifié en dernier par venom le dim. 11 mars 2018 11:42, modifié 2 fois.
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 34 invités