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 en I²C
LCD en I²C
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour ,
Encore une grosse soirée à essayer , sans rien du tout . Même pas un caractère qui s'affiche furtivement . Rien de rien ! . J'abandonne , je vais en acheter d'autres !
Merci à vous pour le temps passé, mais il ne veut rien savoir cet écran ! Je reste quand même en colère contre les gens qui vendent des trucs pareils !
Encore une grosse soirée à essayer , sans rien du tout . Même pas un caractère qui s'affiche furtivement . Rien de rien ! . J'abandonne , je vais en acheter d'autres !
Merci à vous pour le temps passé, mais il ne veut rien savoir cet écran ! Je reste quand même en colère contre les gens qui vendent des trucs pareils !
LCD en I²C
- paulfjujo

Maître- Messages : 3260
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
e vais vous faire une photo + un schéma de ce que j'ai fait . exactement .
un exemple qui est censé fonctionner :
(avec adresse 0x74 au lieu de 0x76 !)
Code : Tout sélectionner
//http://www.avrfreaks.net/forum/batron-i2c-lcd-display-stays-blank
The LCD display is working.
There is indeed a difference in the Batron LCD display used in Avr Applnote AVR155, and the batron that i used.
AVR155 uses Batron BT21605V-SRE-I2C-COG
I Use BATRON BTHQ 21605AV-YETF-LED04-I2C-5V
The ..COG type means Chip-On-Glas. While
mine is an LCD mounted on a PCB.
The contrast LCD reset and the Contrast steering signals are brought outside on the COG type. On the PCB version these features have to be set via I2C commands.
So the fact that my LCD screen stayed BLANK was due to a contrast problem.
After initialising the constrast Values the LCD worked.
You can find a list of initialisation command on the website DATA-MODULE AG
www.data-module.de Click further on
- Support
- Driver
- PCF2119 BT21605
Here they are anyhow.
//Initialisation sample and Ram writing routine for PCF2119
void Display_init(void)
{
Reset=1;
delay_ms(5);
Reset=0;
delay_ms(5000);
iic_start();
iic_write(0x76); // i2c slave Address
iic_write(0x00); // Control byte for Instruction
iic_write(0x34); // DL: 8 bits, M: 16 by two line display, SL: 1:18, H: normal instruction set
iic_write(0x0C); // D: Display on, C: curser off, B: blink off
iic_write(0x06); // I/D: increment, S: no shift
iic_write(0x35); // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set
iic_write(0x04); // P: left to right, Q: top to bottom
iic_write(0x10); // TC1: 0, TC2: 0
iic_write(0x42); // HV Stages 3
iic_write(0x9f); // set Vlcd, store to VA
iic_write(0x34); // DL: 8 bits, M: two line, SL: 1:18, H: normal instruction set
iic_write(0x80); // DDRAM Address set to 00hex
iic_write(0x02); // return home
iic_stop();
}
void Write_text(void)
{
int i;
iic_start();
iic_write(0x76); // i2c slave Address
iic_write(0x00); // Control byte for Instruction
iic_write(0x80); // DDRAM Address set to 00hex
iic_stop();
iic_start();
iic_write(0x76); // i2c slave Adress
iic_write(0x40); // Control byte for Data
for (i=1;i<=16;i++)
{
iic_write(0xC0+i); // Write ABCDE....
}
iic_stop();
iic_start();
iic_write(0x76); // i2c slave Adress
iic_write(0x00); // Control byte for Instruction
iic_write(0xc0); // DDRAM Address set to 10hex
iic_stop();
iic_start();
iic_write(0x76); // i2c slave Address
iic_write(0x40); // Control byte for Data
for (i=1;i<=16;i++)
{
iic_write(0xe0+i); // Write abcde....
}
iic_stop();
}
void upside_down(void)
{
iic_start();
iic_write(0x76);
iic_write(0x00); // Control byte for Instruction
iic_write(0x35); // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set
iic_write(0x07); // P=1; Q=1;
iic_stop();
}
void normal(void)
{
iic_start();
iic_write(0x76);
iic_write(0x00); // Control byte for Instruction
iic_write(0x35); // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set
iic_write(0x04); // P=0; Q=0;
iic_stop();
}
Thanks for all reply's
Fabrizio
------
In the Application_Note they say we need to add an Character_Offset 0X80 to the written
characters. I tried to write 0xD0, with the same result, blank screen.
Thanks for help,
Fabrizio
il y aussi cette discution sur microchip
http://www.microchip.com/forums/m529926-p2.aspx
Est-ce que au niveau connectique, tu pourrais l'utiliser en mode parrallele ?
A voir si une commande I2C software ( bit bang) qui serait au plus pres de la specification
de commande de ce PCF2119 ne serait pas plus pratique ...
certains Device I2C ne suivant pas assez scrupuleusement la norme I2C
le I2C Hardware du PIC ne s'en soucit pas.
exemple from germany
Code : Tout sélectionner
#include <avr/pgmspace.h>
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <avr/interrupt.h>
#include "LCD.h"
#include <util/delay.h>
#define sbi(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define cbi(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define ibi(ADDRESS,BIT) (ADDRESS ^= (1<<BIT))
#define NO_I2C_ACK 0
#define OK_I2C_ACK 1
#define DDR_LCD DDRC
#define PORT_LCD PORTC
#define PIN_LCD PINC
#define SDA PC4
#define SCL PC5
#define Wartezeit 0
void LCD_init()
{
i2cInit();
Display_init();
}
void SetLowSDA()
{
PORT_LCD &= ~(1<<SDA);
_delay_ms(Wartezeit);
}
void SetHighSDA()
{
PORT_LCD |= (1<<SDA);
_delay_ms(Wartezeit);
}
void SetLowSCL()
{
PORT_LCD &= ~(1<<SCL);
_delay_ms(Wartezeit);
}
void SetHighSCL()
{
PORT_LCD |= (1<<SCL);
_delay_ms(Wartezeit);
}
/*************************/
/* To initialize the bus */
/*************************/
void i2cInit()
{
PORT_LCD &= ~(1<<SCL);
PORT_LCD &= ~(1<<SDA);
DDR_LCD |= (1<<SCL)|(1<<SDA);
SetHighSCL();
SetLowSDA();
SetHighSDA();
}
/*************************/
/* Start Data Transfer */
/*************************/
void i2cStart()
{
DDR_LCD |= (1<<SCL)|(1<<SDA);
SetHighSCL();
SetHighSDA();
SetHighSCL();
SetLowSDA();
SetLowSCL();
SetHighSDA();
}
/*************************/
/* Stop Transfer */
/*************************/
void i2cStop()
{
DDR_LCD |= (1<<SCL)|(1<<SDA);
SetLowSCL();
SetLowSDA();
SetHighSCL();
SetLowSDA();
SetHighSCL();
SetHighSDA();
}
/*************************/
/* Write Transfer */
/*************************/
int i2cWrite(char a)
{
DDR_LCD |= (1<<SCL)|(1<<SDA);
int i;
int return_ack;
for (i=0; i<8; i++)
{
SetLowSCL();
if (a & 0x80)
SetHighSDA();
else
SetLowSDA();
SetHighSCL();
a <<= 1;
}
SetLowSCL();
/* ack Read */
SetHighSDA();
SetHighSCL();
DDR_LCD &= ~(1<<SDA);
if (PIN_LCD & (1<<SDA))
return_ack = NO_I2C_ACK;
else
return_ack = OK_I2C_ACK;
SetLowSCL();
return(return_ack);
}
/*************************/
/* Read Transfer */
/*************************/
char i2cRead(int ack)
{
int i;
char caracter = 0x00;
DDR_LCD |= (1<<SCL)|(1<<SDA);
SetLowSCL();
SetHighSDA();
for (i=0; i<8; i++)
{
caracter = caracter << 1;
SetHighSCL();
DDR_LCD &= ~(1<<SDA);
if (PINC & (1<<SDA))
caracter = caracter + 1;
SetLowSCL();
}
DDR_LCD |= (1<<SCL)|(1<<SDA);
if (ack)
{
SetLowSDA();
}
SetHighSCL();
SetLowSCL();
return (caracter);
}
void Display_init(void)
{
//normal Instructions
LCD_write_Config(0b00100110); // DL: 8 bits, M: 16 by two line display, SL: 1:18, H: normal instruction set
LCD_write_Config(0b00001100); // D: Display on, C: curser off, B: blink off
LCD_write_Config(0b00000110); // I/D: increment, S: no shift
//extended Instructions
LCD_write_Config(0x35); // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set
LCD_write_Config(0x04); // P: left to right, Q: top to bottom
LCD_write_Config(0x10); // TC1: 0, TC2: 0
LCD_write_Config(0x42); // HV Stages 3
LCD_write_Config(0x9f); // set Vlcd, store to VA
//normal Instructions
LCD_write_Config(0x34); // DL: 8 bits, M: 16 by two line display, SL: 1:18, H: normal instruction set
LCD_home();
}
void LCD_write_char(uint8_t a)
{
a+=128;
i2cStart();
i2cWrite(0x76); //Display adress
i2cWrite(0x40); //Write to DDRAM
i2cWrite(a); //Write Data
i2cStop();
}
void LCD_write_command(uint8_t a)
{
i2cStart();
i2cWrite(0x76); //Display adress
i2cWrite(0x80); //Register Select Control Write
i2cWrite(a); //Write Data
i2cStop();
}
void LCD_write_Config(uint8_t a)
{
i2cStart();
i2cWrite(0x76); //Display adress
i2cWrite(0x00); //Register Select Config Register
i2cWrite(a); //Write Data
i2cStop();
}
void LCD_line_2()
{
LCD_home();
for (uint8_t i = 0; i < 40;i++)
{
LCD_move_right();
}
}
void LCD_move_right()
{
LCD_write_Config(0b00010100);
}
void LCD_move_left()
{
LCD_write_Config(0b00010000);
}
void LCD_home()
{
LCD_write_command(0x02);
}
void LCD_write_text(const char* ptext)
{
while(ptext[0]!=0)
{
LCD_write_char(ptext[0]);
ptext++;
}
}
void LCD_clear()
{
LCD_home();
for (uint8_t i = 0; i < 56; i++)
{
LCD_write_char(' ');
}
LCD_home();
}
void LCD_start()
{
i2cInit();
Display_init();
_delay_ms(10);
LCD_clear();
LCD_write_text(" FHWT 2011");
LCD_line_2();
LCD_write_text(" BMS");
}
void LCD()
{
}
Tu es dans quelle region ?
moi je suis à l'est de Lyon, à 20kms,
LCD en I²C
Si j'ai bien compris le datasheet...
Le second octet transmis met RS a 1 automatiquement
rs => bit 0x40
Le bit 0x80 doit être à 1
(fig 31 du datasheet)
0x00 c est la commande
0xC0 c est l'affichage
Le second coup
a nouveau adresse
puis second octet avec le bit 0x80 à 0
(donc 0x00 commandes et 0x40 pour l'affichage)
suivis de de n datas
Si j'ai bien compris le datasheet...
La séquence d’écriture se fait comme ça;
Le second octet transmis met RS a 1 automatiquement
rs => bit 0x40
Le bit 0x80 doit être à 1
(fig 31 du datasheet)
0x00 c est la commande
0xC0 c est l'affichage
Le second coup
a nouveau adresse
puis second octet avec le bit 0x80 à 0
(donc 0x00 commandes et 0x40 pour l'affichage)
suivis de de n datas
Si j'ai bien compris le datasheet...
La séquence d’écriture se fait comme ça;
// Affiche des caractères
int i;
I2C1_Start();
I2C1_Wr(LCD_ADDR); // I2C slave Address
I2C1_Wr(0xC0); // Control byte for Instruction
I2C1_Wr(LCD_ADDR); // I2C slave Adress
I2C1_Wr(0x40); // Control byte for Data
for (i=1;i<=16;i++) {
I2C1_Wr(0xC0+i); // Write ABCDE....
}
I2C1_Stop();
// commandes
int i;
I2C1_Start();
I2C1_Wr(LCD_ADDR); // I2C slave Address
I2C1_Wr(0x00); // Control byte for Instruction
I2C1_Wr(LCD_ADDR); // I2C slave Adress
I2C1_Wr(0x00); // Control byte for Data
;
;commandes au moins 1 commande
;
I2C1_Stop();
LCD en I²C
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Voici le montage que j'ai effectué sur ma plaque d'essai. J'ai fabriqué le petit câble de liaison. les alimentations sont en 3.3V en sont toutes en commun . Je sert d'un autre PORT pour alimenté le rétro-éclairage . Les broches I2C sont prises sur l'emplacement de l'EEPROM ( que j'ai enlevée) ainsi je profite des résistances de pull-up pour l'I2C de la plaque . Et enfin le circuit le PCF2119 est alimenté aussi en 3.3V sur une autre broche , les masses sont bien évidemment commune . En gros j'ai viré l'EEprom en Place et je l'ai remplacé par mon écran pour l'I2C.



Allez j'essaye une dernière fois grâce à vos codes.
Oui c'est le même . Peut-être que je fais une erreur quand j'essaye de l'adapter à mikroC . le voici dans ma version .
Je ne sais pas , je connais pas .
Je suis dans les PO , ca fait loin !



Allez j'essaye une dernière fois grâce à vos codes.
un exemple qui est censé fonctionner :
Oui c'est le même . Peut-être que je fais une erreur quand j'essaye de l'adapter à mikroC . le voici dans ma version .
Code : Tout sélectionner
//Initialisation sample and Ram writing routine for PCF2119
void Ecran_init(void)
{
I2C1_Start();
I2C1_Wr (0x74); // i2c slave Address
I2C1_Wr(0x00); // Control byte for Instruction
I2C1_Wr(0x34); // DL: 8 bits, M: 16 by two line display, SL: 1:18, H: normal instruction set
I2C1_Wr(0x0C); // D: Display on, C: curser off, B: blink off
I2C1_Wr(0x06); // I/D: increment, S: no shift
I2C1_Wr(0x35); // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set
I2C1_Wr(0x04); // P: left to right, Q: top to bottom
I2C1_Wr(0x10); // TC1: 0, TC2: 0
I2C1_Wr(0x42); // HV Stages 3
I2C1_Wr(0x9f); // set Vlcd, store to VA
I2C1_Wr(0x34); // DL: 8 bits, M: two line, SL: 1:18, H: normal instruction set
I2C1_Wr(0x80); // DDRAM Address set to 00hex
I2C1_Wr(0x02); // return home
I2C1_Stop();
delay_ms(500);
}
void Write_text(void)
{
int i;
I2C1_Start();
I2C1_Wr(0x74); // i2c slave Address
I2C1_Wr(0x00); // Control byte for Instruction
I2C1_Wr(0x80); // DDRAM Address set to 00hex
I2C1_Stop();
I2C1_Start();
I2C1_Wr(0x74); // i2c slave Adress
I2C1_Wr(0x40); // Control byte for Data
for (i=1;i<=16;i++)
{
I2C1_Wr(0xC0+i); // Write ABCDE....
}
I2C1_Stop();
I2C1_Start();
I2C1_Wr(0x74); // i2c slave Adress
I2C1_Wr(0x00); // Control byte for Instruction
I2C1_Wr(0xc0); // DDRAM Address set to 10hex
I2C1_Stop();
I2C1_Start();
I2C1_Wr(0x74); // i2c slave Address
I2C1_Wr(0x40); // Control byte for Data
for (i=1;i<=16;i++)
{
I2C1_Wr(0xe0+i); // Write abcde....
}
I2C1_Stop();
}
void upside_down(void)
{
I2C1_Start();
I2C1_Wr(0x74);
I2C1_Wr(0x00); // Control byte for Instruction
I2C1_Wr(0x35); // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set
I2C1_Wr(0x07); // P=1; Q=1;
I2C1_Stop();
}
void normal(void)
{
I2C1_Start();
I2C1_Wr(0x74);
I2C1_Wr(0x00); // Control byte for Instruction
I2C1_Wr(0x35); // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set
I2C1_Wr(0x04); // P=0; Q=0;
I2C1_Stop ();
}
/*################################################################################*/
/*###################### PROGRAMME PRINCIPAL #############################*/
/*################################################################################*/
void main()
{
ANSELD = 0;
PORTD = 0;
TRISD = 0;
Delay_ms(100); // Attente pour stabilisation apres l'allumage
I2C1_Init(100000); // Initialisation de l'I2C
LATD = 1; // Allume une led pour declenchement analyseur logique
Ecran_init(); // On va initialiser notre écran
/*################################################################################*/
/*######################### BOUCLE INFINIE ###############################*/
/*################################################################################*/
while(1)
{
Write_text();
Delay_ms(2000);
}
}
Est-ce que au niveau connectique, tu pourrais l'utiliser en mode parrallele ?
Je ne sais pas , je connais pas .
Tu es dans quelle region ?
moi je suis à l'est de Lyon, à 20kms,
Je suis dans les PO , ca fait loin !
LCD en I²C
LCD en I²C
LCD en I²C
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Pat a écrit :Source du message Le second octet transmis met RS a 1 automatiquement
Non Pat c'est à nous de le mettre à 1 . Pour choisir dans quel registre on va écrire .
Pat a écrit :Source du message Le bit 0x80 doit être à 1
Ca j'ai pas compris ?
Par contre je viens de me rendre compte d'un truc . Bizarre les ordres ne sont pas , ou sont mal envoyés . Je voulais vérifier l'initialisation . Parce que entre celle de du Net et celle qu'on a faite, il ni as que la configuration "extended" qui change pour le contraste et autres bricoles .
Et voila ce que je j'observe à l'analyseur avec ce programme ! ;
programme d’initialisation:
Code : Tout sélectionner
I2C1_Start();
I2C1_Wr(0x74); // i2c slave Address
I2C1_Wr(0x00); // Control byte for Instruction
I2C1_Wr(0x34); // DL: 8 bits, M: 16 by two line display, SL: 1:18, H: normal instruction set
I2C1_Wr(0x0C); // D: Display on, C: curser off, B: blink off
I2C1_Wr(0x06); // I/D: increment, S: no shift
I2C1_Stop();
I2C1_Start();
I2C1_Wr(0x74); // i2c slave Address
I2C1_Wr(0x00); // Control byte for Instruction
I2C1_Wr(0x35); // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set
I2C1_Wr(0x04); // P: left to right, Q: top to bottom
I2C1_Wr(0x10); // TC1: 0, TC2: 0
I2C1_Wr(0x42); // HV Stages 3
I2C1_Wr(0x9f); // set Vlcd, store to VA
I2C1_Wr(0x34); // DL: 8 bits, M: two line, SL: 1:18, H: normal instruction set
I2C1_Wr(0x80); // DDRAM Address set to 00hex
I2C1_Wr(0x02); // return home
I2C1_Stop();
Seulement 8 octets sont envoyés en I2C ? comment cela se fait ? Forcement l’initialisation se fait mal
Je pense que l'initialisation est plus compliquée que ca. Je comprends pas comment réglé soit le mode basic , standard ou extended ? le tableau en page 28 est flou .
LCD en I²C
Non Pat c'est à nous de le mettre à 1 . Pour choisir dans quel registre on va écrire .
Bien sur que c est à nous de le mettre !
ça fait plusieurs post que j’essaie de te l'expliquer...
bit de poids 0X40
page 27
il faut envoyé 2 fois à la suite fig 31
start
0x74
0x80 nouveau control byte
1 commande
0x0 le même control byte
1 commande
stop
pour les data
start
0x74
0xC0 nouveau control byte
1 data
0x40 le même control byte
1 data
stop
LCD en I²C
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Je sais pas si j'ai compris Pat , j'ai essayé d’écrire ceci .
Pas mieux , écran toujours vide .
Qu'est ce que je remarque ! . avec le code ou il y as les fonctions extended ( 0x35) , à l'analyseur , le code s’arrête juste après la commande 0X35 , quand je l’enlève ça va mieux .
Quand j’essaie d’écrire les 16 octets , avec la boucle "for i" un seul octet part après ca s’arrête .
Code : Tout sélectionner
int i = 0;
//Initialisation sample and Ram writing routine for PCF2119
void Ecran_init()
{
I2C1_Start();
I2C1_Wr(0x74); // i2c slave Address
I2C1_Wr(0x80); // Control byte for Instruction
I2C1_Wr(0x34); // DL: 8 bits, M: 16 by two line display, SL: 1:18, H: normal instruction set
I2C1_Wr(0x00);
I2C1_Wr(0x0C); // D: Display on, C: curser off, B: blink off
I2C1_Wr(0x00);
I2C1_Wr(0x06); // I/D: increment, S: no shift
I2C1_Stop();
delay_ms(5);
}
/*################################################################################*/
/*###################### PROGRAMME PRINCIPAL #############################*/
/*################################################################################*/
void main()
{
ANSELB = 0; // Configure les broches en digital
ANSELC = 0;
ANSELD = 0;
PORTB = 0; // PORTB en sortie
PORTC = 0;
PORTD = 0;
TRISB = 0; // Mise a 0 du port B
TRISC = 0;
TRISD = 0;
Delay_ms(100); // Attente pour stabilisation apres l'allumage
I2C1_Init(100000); // Initialisation de l'I2C
Delay_ms(100);
/*################################################################################*/
/*######################### BOUCLE INFINIE ###############################*/
/*################################################################################*/
while(1)
{
LATD = 1;
Ecran_init();
LATD = 0;
// On ecrit du texte
i = 1 ;
I2C1_Start();
I2C1_Wr(0x74); // i2c slave Adress
I2C1_Wr(0xC0); // Control byte for Data
I2C1_Wr(0x80+i);
I2C1_Wr(0x40);
for (i=2;i>=16;i++)
{
I2C1_Wr(0x80+i); // Write ABCDE....
Delay_ms(2);
}
I2C1_Stop();
Delay_ms(1000);
}
}
Pas mieux , écran toujours vide .
Qu'est ce que je remarque ! . avec le code ou il y as les fonctions extended ( 0x35) , à l'analyseur , le code s’arrête juste après la commande 0X35 , quand je l’enlève ça va mieux .
Quand j’essaie d’écrire les 16 octets , avec la boucle "for i" un seul octet part après ca s’arrête .
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités

