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 : Gérard
Mise en oeuvre LCD 2X16 I2C
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.
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
Expert- Messages : 2598
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
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
Mise en oeuvre LCD 2X16 I2C
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.
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
Expert- Messages : 2598
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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..
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..
Mise en oeuvre LCD 2X16 I2C
Merci je vais regarder ceci de prêt
J'avais trouver ce tableau dans la datasheet:
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.
J'avais trouver ce tableau dans la datasheet:
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
Mise en oeuvre LCD 2X16 I2C
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 :
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Mise en oeuvre LCD 2X16 I2C
Mise en oeuvre LCD 2X16 I2C
Mise en oeuvre LCD 2X16 I2C
Retourner vers « Langage BASIC & PASCAL »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 93 invités