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 ---

Mise en oeuvre LCD 2X16 I2C

Forum général en BASIC et PASCAL !

Modérateur : Gérard

pspic
Passionné
Passionné
Messages : 357
Enregistré en : septembre 2017
Localisation : 68

Mise en oeuvre LCD 2X16 I2C

Messagepar pspic » jeu. 7 sept. 2017 12:06

Bonjour,
Depuis des jours, j’essaye de mettre en oeuvre un afficheur LCD 2x16 + module I2C (PCF9474) avec :
_ compilateur MikroBasic Pro V7.1.0
_ EasyPic5
_ PIC 18F2420 8Mhz:
_ Libstock : htps://libstock.mikroe.com/projects/dow ... .0.0.0.zip dont code ci-dessous
J’ai adapté l’adresse du module I2C à $27
La compilation ne génère pas d’erreur et pourtant je n’arrive pas à faire fonctionner.
Qui peux m’aider à trouver une solution à mon problème ou m’indiquer un autre code en Mikrobasic qui fonctionne.

Code : Tout sélectionner

 program I2C_LCD

' Declarations section
symbol _LCD_FIRST_ROW         = $80     'Move cursor to the 1st row
symbol _LCD_SECOND_ROW        = $C0    'Move cursor to the 2nd row
symbol _LCD_THIRD_ROW         = $94     'Move cursor to the 3rd row
symbol _LCD_FOURTH_ROW        = $D4     'Move cursor to the 4th row
symbol _LCD_CLEAR             = $01     'Clear display
symbol _LCD_RETURN_HOME       = $02     'Return cursor to home position, returns a shifted display to
                                       'its original position. Display data RAM is unaffected.
symbol _LCD_CURSOR_OFF        = $0C     'Turn off cursor
symbol _LCD_UNDERLINE_ON      = $0E     'Underline cursor on
symbol _LCD_BLINK_CURSOR_ON   = $0F     'Blink cursor on
symbol _LCD_MOVE_CURSOR_LEFT  = $10     'Move cursor left without changing display data RAM
symbol _LCD_MOVE_CURSOR_RIGHT = $14     'Move cursor right without changing display data RAM
symbol _LCD_TURN_ON           = $0C     'Turn Lcd display on
symbol _LCD_TURN_OFF          = $08     'Turn Lcd display off
symbol _LCD_SHIFT_LEFT        = $18     'Shift display left without changing display data RAM
symbol _LCD_SHIFT_RIGHT       = $1E     'Shift display right without changing display data RAM

' LCD Definitions
symbol LCD_ADDR = $27     'Mod. $4E

' Lcd constants
Dim txt1 as string[10]
Dim txt2 as string[20]
Dim txt3 as string[10]
Dim txt4 as string[10]

sub procedure I2C_LCD_Cmd(Dim out_char as byte)

    Dim hi_n, lo_n as byte
    Dim rs as byte

    rs = 0

    hi_n = out_char and $F0
    lo_n = (out_char << 4) and $F0

    I2C1_Start()
    I2C1_Is_Idle()
    I2C1_Wr(LCD_ADDR)
    I2C1_Is_Idle()
    I2C1_Wr(hi_n or rs or $04 or $08)
    I2C1_Is_Idle()
    Delay_us(50)
    I2C1_Wr(hi_n or rs or $00 or $08)
    I2C1_Is_Idle()
    Delay_us(100)
    I2C1_Wr(lo_n or rs or $04 or $08)
    I2C1_Is_Idle()
    Delay_us(50)
    I2C1_Wr(lo_n or rs or $00 or $08)
    I2C1_Is_Idle()
    I2C1_stop()

    if(out_char = $01) then
        Delay_ms(2)
    end if
end sub

sub procedure I2C_LCD_Chr(Dim row as byte, Dim column as byte, Dim out_char as byte)

    Dim hi_n, lo_n as byte
    Dim rs as byte

    rs = 1

    select case (row)

        case 1
        I2C_LCD_Cmd($80 + (column - 1))
        case 2
        I2C_LCD_Cmd($C0 + (column - 1))
        case 3
        I2C_LCD_Cmd($94 + (column - 1))
        case 4
        I2C_LCD_Cmd($D4 + (column - 1))
    end select

    hi_n = out_char and $F0
    lo_n = (out_char << 4) and $F0

    I2C1_Start()
    I2C1_Is_Idle()
    I2C1_Wr(LCD_ADDR)
    I2C1_Is_Idle()
    I2C1_Wr(hi_n or rs or $04 or $08)
    I2C1_Is_Idle()
    Delay_us(50)
    I2C1_Wr(hi_n or rs or $00 or $08)
    I2C1_Is_Idle()
    Delay_us(100)
    I2C1_Wr(lo_n or rs or $04 or $08)
    I2C1_Is_Idle()
    Delay_us(50)
    I2C1_Wr(lo_n or rs or $00 or $08)
    I2C1_Is_Idle()
    I2C1_stop()
end sub

sub procedure I2C_LCD_Chr_Cp(Dim out_char as byte)

    Dim hi_n, lo_n as byte
    Dim rs as byte
   
    rs = $01

    hi_n = out_char and $F0
    lo_n = (out_char << 4) and $F0

    I2C1_Start()
    I2C1_Is_Idle()
    I2C1_Wr(LCD_ADDR)
    I2C1_Is_Idle()
    I2C1_Wr(hi_n or rs or $04 or $08)
    I2C1_Is_Idle()
    Delay_us(50)
    I2C1_Wr(hi_n or rs or $00 or $08)
    I2C1_Is_Idle()
    Delay_us(100)
    I2C1_Wr(lo_n or rs or $04 or $08)
    I2C1_Is_Idle()
    Delay_us(50)
    I2C1_Wr(lo_n or rs or $00 or $08)
    I2C1_Is_Idle()
    I2C1_stop()
end sub


sub procedure I2C_LCD_Init()

    Dim rs as byte

    I2C1_Start()
    I2C1_Is_Idle()
    I2C1_Wr(LCD_ADDR)
    I2C1_Is_Idle()

    Delay_ms(30)

    I2C1_Wr($30 or rs or $04 or $08)
    I2C1_Is_Idle()
    Delay_us(50)
    I2C1_Wr($30 or rs or $00 or $08)
    I2C1_Is_Idle()

    Delay_ms(10)

    I2C1_Wr($30 or rs or $04 or $08)
    I2C1_Is_Idle()
    Delay_us(50)
    I2C1_Wr($30 or rs or $00 or $08)
    I2C1_Is_Idle()

    Delay_ms(10)

    I2C1_Wr($30 or rs or $04 or $08)
    I2C1_Is_Idle()
    Delay_us(50)
    I2C1_Wr($30 or rs or $00 or $08)
    I2C1_Is_Idle()

    Delay_ms(10)

    I2C1_Wr($20 or rs or $04 or $08)
    I2C1_Is_Idle()
    Delay_us(50)
    I2C1_Wr($20 or rs or $00 or $08)
    I2C1_Is_Idle()
    I2C1_Stop()

    Delay_ms(10)

    I2C_LCD_Cmd($28)
    I2C_LCD_Cmd($06)
end sub

sub procedure I2C_LCD_Out(Dim row as byte, Dim column as byte, Dim byref text as string)
    Dim i as byte

    for i = 0 to Strlen(text) - 1
        I2C_LCD_Chr(row, column, text[i])
        column = column + 1
    next i
end sub

sub procedure I2C_LCD_Out_Cp(dim byref text as string)
    Dim i as byte

    for i = 0 to Strlen(text) - 1
         I2C_LCD_Chr_Cp(text[i])
    next i
end sub

main:
'   Main program
    ADCON1 = $0F     'Mod. ANSELA = $00
    TRISA = $00
    PORTA = $00
    LATA = $00
   
    txt1 = "I2C LCD"
    txt2 = "16x2, 20x2, 20x4"
    txt3 = "PIC12F1840"
    txt4 = "4 MHz"

    I2C1_Init(100000)

    I2C_LCD_Init()
    I2C_LCD_Cmd(_LCD_CURSOR_OFF)
    I2C_LCD_Cmd(_LCD_CLEAR)
    I2C_Lcd_Out(1,1,txt1)                 ' Write text in first row
    I2C_Lcd_Out(2,1,txt2)                 ' Write text in second row
    I2C_Lcd_Out(3,1,txt3)                 ' Write text in third row
    I2C_Lcd_Out(4,1,txt4)                 ' Write text in fourth row

    while(TRUE)

    Wend
end.

Avatar de l’utilisateur
paulfjujo
Expert
Expert
Messages : 2597
Enregistré en : juillet 2015
Localisation : 01800
Contact :

Mise en oeuvre LCD 2X16 I2C

Messagepar paulfjujo » jeu. 7 sept. 2017 15:05

bonjour,

PCF9474 ? sur ?
ou PCF8754
ou pCF8754A

en principe on met un lien sur le composant visé
je suppose fortement que ce soit celui -ci
PCA9674 ? à confirmer

J’ai adapté l’adresse du module I2C à $27



essaie $27<<1 soit 0x4E ou $4E
la difference entre le monde ARDUINO et le monde PIC
on suppose les pins AD0,AD1,AD2 (complement d'adresse) au niveau 1

ARDUINO utilise l'adresse DEVICE sur 7 bits
avec les PIC l'adresse WRITE ... sur 8 bits ( en ajoutant le bit R/W) = 0 pour WRITE , ou 1 pour READ
voir
plus de details et explicages ICI

tu peux essayer ce programme (MikroC à adapter ..) pour verifier si ton LCD est bien VU sur le bus I2C.
Bien verifier si il y a des pullUp resistance (2,7K à 4,7K) sur SCL et SDA du bus I2C
Aide toi, le ciel ou FantasPic t'aidera

pspic
Passionné
Passionné
Messages : 357
Enregistré en : septembre 2017
Localisation : 68

Mise en oeuvre LCD 2X16 I2C

Messagepar pspic » jeu. 7 sept. 2017 16:45

Merci pour cette réponse rapide.
Le module I2C est équipé d'un PCF8574AT : http://www.ebay.fr/itm/Ecran-LCD-affich ... 2749.l2649.
J'ai déjà essayé l'adresse $4E sans résultat.
J'ai scanné l'adresse avec un bout de code Arduino, il trouve $3F.
Un décalage de cette adresse de 1 vers la gauche ne règle pas le problème.
Je vais essayer ton programme en C.

Avatar de l’utilisateur
paulfjujo
Expert
Expert
Messages : 2597
Enregistré en : juillet 2015
Localisation : 01800
Contact :

Mise en oeuvre LCD 2X16 I2C

Messagepar paulfjujo » jeu. 7 sept. 2017 19:20

L'adresse de base du device PCF8754A est 0x38 avec les 3 bits d'adresse à 1.
L'Adresse d'ECRITURE est 0x70 car il faut faire un decalage à gauche de 1 bit AVANT de les rajouter le bit R/W
soit Adresse finale = (0x38 +(0b00000111) << 1 soit (0X3F<<1 )= > 0x7E
ou autre combinaison suivant l'agencement des 3 bits d'adresse A0 A1 A2
La premiere adresse en Lecture etant Adresse +1

plus de details et explicagesICI

il faut eviter d'utiliser des programmes ARDUINO avec les PIC..
Aide toi, le ciel ou FantasPic t'aidera

pspic
Passionné
Passionné
Messages : 357
Enregistré en : septembre 2017
Localisation : 68

Mise en oeuvre LCD 2X16 I2C

Messagepar pspic » jeu. 7 sept. 2017 19:55

Merci je vais regarder ceci de prêt
J'avais trouver ce tableau dans la datasheet:
AdrPCF8574A.JPG

Faut il considérer que si les 3 straps sont enlevés cela correspond à 111 ?
Sinon, je vais oublier ce code Libstock et écrire des tests moi même.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Avatar de l’utilisateur
paulfjujo
Expert
Expert
Messages : 2597
Enregistré en : juillet 2015
Localisation : 01800
Contact :

Mise en oeuvre LCD 2X16 I2C

Messagepar paulfjujo » jeu. 7 sept. 2017 20:46

la réponse est pourtant clairement explicité en detail dans le lien fournit au post precedent
plus de details .... en cliquant surICI

A quoi ça sert que Ducros se decarcasse !
je jette l'éponge.
Aide toi, le ciel ou FantasPic t'aidera

pspic
Passionné
Passionné
Messages : 357
Enregistré en : septembre 2017
Localisation : 68

Mise en oeuvre LCD 2X16 I2C

Messagepar pspic » sam. 9 sept. 2017 14:20

paulfjujo a écrit :la réponse est pourtant clairement explicité en detail dans le lien fournit au post precedent
plus de details .... en cliquant surICI

A quoi ça sert que Ducros se decarcasse !
je jette l'éponge.

Bonjour,
Désolé d’avoir abusé de ta patience.
Dans Edit project de MikroBasic il fallait sélectionner : HS oscillator, PLL enabled (Clock frequency = 4x Fosc1)
Voir le programme ici :
Test écran LCD 2x16 en liaison I2C avec un PIC.pdf
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Avatar de l’utilisateur
paulfjujo
Expert
Expert
Messages : 2597
Enregistré en : juillet 2015
Localisation : 01800
Contact :

Mise en oeuvre LCD 2X16 I2C

Messagepar paulfjujo » sam. 9 sept. 2017 17:13

bonjour à tous,


:bravo:

belle presentation ..
Tout est bien qui fini bien ..
Aide toi, le ciel ou FantasPic t'aidera

Jérémy
Administrateur du site
Administrateur du site
Messages : 2725
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

Mise en oeuvre LCD 2X16 I2C

Messagepar Jérémy » sam. 9 sept. 2017 17:51

Bonjour ,

Oui très joli boulot !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

pspic
Passionné
Passionné
Messages : 357
Enregistré en : septembre 2017
Localisation : 68

Mise en oeuvre LCD 2X16 I2C

Messagepar pspic » dim. 10 sept. 2017 09:14

Bonjour, un petit complément:
Comme j'utilise un quartz de 8MHz il faut dans "Edit Project" de MikroBasic, sélectionner HS oscillator, PLL enabled (Clock frequency = 4x Fosc1) et MCU clock frequency à 32.
CorOsc.JPG
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.


Retourner vers « Langage BASIC & PASCAL »

Qui est en ligne

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