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 sur le langage C !

Modérateur : Jérémy

[Resolu] Test mini OLED SSD1306 128x32 18F27K42
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#81 Message par djviper16 » jeu. 16 déc. 2021 22:41

Bonsoir,

satinas a écrit :Source du message Pour les caractères accentués, tu peux les mettre dans le fichier source, xc8 affiche juste un warning. Après tu récupères ou tu te fais un fichier font étendu de 256 caractères plutôt que 128.

Quel fichier source ?
Quand j'insère 4 lignes supplémentaires en bas de mon tableau "fonts" pour avoir le "é" en position ASCII 130, et que je demande un "é", l'afficheur me sort un caractère entièrement allumé (5 colonnes à 0xFF).

Code : Tout sélectionner

...
0x0C, 0x50, 0x50, 0x50, 0x3C, // y
0x44, 0x64, 0x54, 0x4C, 0x44, // z
0x00, 0x08, 0x36, 0x41, 0x41, // {
0x00, 0x00, 0x7F, 0x00, 0x00, // |
0x41, 0x41, 0x36, 0x08, 0x00, // }
0x02, 0x01, 0x02, 0x04, 0x02,  // ~
0xFF, 0xFF, 0xFF, 0xFF, 0xFF,        
0xFF
, 0xFF, 0xFF, 0xFF, 0xFF,        
0xFF
, 0xFF, 0xFF, 0xFF, 0xFF,        
0x38
, 0x54, 0x56, 0x55, 0x18 // é        


satinas a écrit :Source du message En plaçant le premier octet à envoyer dans I2C1TXB avant l'envoi du START, il n'est plus nécessaire d'attendre la fin du START.

Exact, ça fonctionne nickel !

satinas a écrit :Source du message un putch() plus rapide

Ça aussi c'est nickel...

satinas a écrit :Source du message Je ne vois pas où est définie la fonction printf(), xc8 doit l'incorporer.

Dans stdio.h, j'ai ça :

Code : Tout sélectionner


int printf
(const char *__restrict, ...);
int fprintf(FILE *__restrict, const char *__restrict, ...);
int sprintf(char *__restrict, const char *__restrict, ...);
int snprintf(char *__restrict, size_t, const char *__restrict, ...); 


satinas a écrit :Source du message Il semble que la première écriture se fait sans RAZ_buffer1() préalable.

Ah oui, c'est corrigé. J'ai mis ça après les init I2C et écran.

satinas a écrit :Source du message Le première paramètre de Oled_print() est une chaîne, donc un pointeur sur des caractères.

Tu peux m'en dire plus ? Dans la déclaration de ma fonction, j'indique que le premier paramètre est un "unsigned int" :

Code : Tout sélectionner

void Oled_print(unsigned int characters, unsigned char page, unsigned char column); 


satinas a écrit :Source du message A part ça, vous les faites tourner à quelle vitesse ces oleds, ils répondent à 400kHz ?

J'ai gardé ta config, mon horloge I2C est à 100kHz. D'ailleurs dans la doc ils disent 500kHz alors je ne pige pas.

À moins que tu parles du contrôleur de l'écran lui-même ?
J'ai essayé SSD1306_SET_DISPLAY_CLOCK_DIV_RATIO = 0xF0, Je ne vois aucune différence avec 0x80, ça fonctionne normalement.
J'ai aussi joué avec le diviseur, à 0x84 par exemple ça scintille à mort (même à 0x81 c'est perceptible), et l'éclairage est beaucoup plus fort.

Ça m'intéresserait d'augmenter la vitesse de l'écran parce qu'on voit le balayage du rafraichissement et ça donne un effet, mais c'est pas très agréable, mais je crois bien qu'on est déjà au max avec 0xF0 à moins que j'ai loupé un truc ?

A+

[Resolu] Test mini OLED SSD1306 128x32 18F27K42
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#82 Message par satinas » ven. 17 déc. 2021 08:05

Bonjour,

Il faut que tu prennes l'habitude de regarder les warnings affichés lors de la compilation, ils ne sont pas là pour rien :)
A la compil xc8 t'explique de façon détaillée qu'il y a un problème avec le premier paramètre de la fonction Oled_print(). Tu déclares un unsigned int, ensuite tu lui envoies des chaînes de caractères, cela te choque ou pas ? Ca marche quand même mais ça pourrait ne pas marcher.

Si je mets "Héllo" dans une chaîne C en tapant le code 130, xc8 m'affiche un warning indiquant qu'il n'aime pas ça, il ne veut pas d'ascii étendu. Pas grave il compile quand même, mais en examinant ce warning :
main1.c:103:24: warning: illegal character encoding in string literal [-Winvalid-source-encoding]
char *toto = "H<E9>llo";

On est passé de 0x82(130) à 0xe9. En regardant le fichier source main.c avec un éditeur hexa, il y a bien 0xe9 dedans. Il y aussi 0xe9 dans le fichier HEX injecté dans le pic. On est en plein dans le problème des multiples encodages ascii étendus. Pour contourner ça, la doc xc8 Character And String Constants préconise d'utiliser l'octal :
char *toto = "H\202llo"; Le warning disparaît et il stocke bien 0x82(130) dans le fichier HEX.

Pour la vitesse i2c, je parle de la fréquence du signal SCL générée par le pic, que tu peux vérifier à l'oscillo. Après faut aussi prendre en compte le temps de réaction du lcd selon les commandes envoyées, voir documentation.
Actuellement I2C1CLK = 0x03; sélectionne comme source d'horloge i2c l'oscillateur interne MFINTOSC (500kHz), et I2C1CON2 = 0x00; donne Fscl = 500/5 = 100kHz, basse vitesse i2c. Pour passer en haute vitesse 400kHz, il faut sélectionner avec I2C1CLK un autre oscillateur FOSC, FOSC/4, HFINTOSC ou utiliser un timer. Peut être Paul ou Temps-x on déja fait des essais en ce sens. Je regarderai cela un peu plus tard.

[Resolu] Test mini OLED SSD1306 128x32 18F27K42
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#83 Message par djviper16 » ven. 17 déc. 2021 23:55

Bonsoir,

Tu vas rire mais je viens de comprendre un truc, pour voir les warnings dont tu me parles il faut faire "clean and build project", alors que moi je faisais tout le temps "make and program device". Du coup je ne voyais pas ces fameux warnings :sifflotte:

J'ai remplacé mon paramètre foireux par

Code : Tout sélectionner

void Oled_print(const char characters[], unsigned char page, unsigned char column);
et le warning a disparu.

Concernant le "é", j'ai agrandi mon tableau "fonts" et j'ai placé la ligne suivante à la 233ème position (0xE9) :

Code : Tout sélectionner

0x38, 0x54, 0x56, 0x55, 0x18  // é        

Et maintenant ça fonctionne, quand je tape "Oled_print(Héllo);" ça s'affiche correctement, c'est super et ça m'évite d'utiliser l'octal.
Il me reste à générer le code hexa des autres caractères spéciaux et les insérer à leur tour dans mon fichier "fonts".

J'ai essayé en utilisant un autre oscillateur et rien ne fonctionne à part le "MFINTOSC". J'ai bien 100kHz à l'oscillo.

Edit : Je joins de nouveau le projet avec les erreurs corrigées et le tableau "fonts.h" intégrant les caractères spéciaux (j'en ai fait une 10ène) :
SSD1306_ext_characters.X.zip
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.


Retourner vers « Langage C »

Qui est en ligne

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