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 en BASIC et PASCAL !

Modérateur : Gérard

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

#1 Message par 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.

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

#2 Message par 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

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

#3 Message par 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.

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

#4 Message par 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

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

#5 Message par 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.

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

#6 Message par 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

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

#7 Message par 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.

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

#8 Message par 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

Mise en oeuvre LCD 2X16 I2C
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#9 Message par 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 !!!

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

#10 Message par 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 32 invités