Display 115200 bps RS232 115200_P1000357

1     BUT

 2     Principes de base
2.1   Interface choisie
2.2   Simple buffer
2.3   Réutilisation généraliste
2.4   Choix de la principale commande
2.4.1 Le caractère de tête
2.4.2 Datas

3     Les commandes display
3.1   Les temps display    

4     Le montage
4.1   Physiquement
4.2   Le cœur du montage
4.3   Réalisation

5     Fonctionnalités
5.1   Généralités
5.2   Programmation PIC
5.3   Programmation des vitesses RS232  

6     Conclusions

Si vous arrivez directement sur cette page par un moteur de recherche, vous pouvez avoir accès à la table des matières et à chaque article, en page d'accueil.    L'accès se fait par l'un des deux liens en tête de colonne de droite ----->

ATTENTION à compter du 15/09/2019 les commentaires ne seront plus possibles à causes de quelques imbéciles qui font du spam pour le plaisir de nuire ! désolé  !

 


Préambule

C'est la nécessité qui m'a poussé à réaliser rapidement ce petit montage en vue d'un autre projet qui verra le jour ultérieurement et pour lequel il sera nécessaire... Le titre se suffit à lui même pour savoir de quoi il retourne et cet article offre quelques idées utiles. A chacun d'y trouver ce qui l'intéresse...
Je n'aurai pas le temps de bien relire cet article alors ne m'en veuillez pas trop si il y a quelques petites fautes.... Le plus important me semble de le livrer même avec quelques défauts. A bon entendeur...


1 BUT

Mais ça existe déjà bien entendu ! Oui mais peut être pas tout à fait à l'identique … (Si vous êtes pressés, alors allez directement à la fin de ce paragraphe, mais il est bon d'expliquer "le pourquoi") .
En premier lieu je préfère toujours des éléments que je réalise moi-même, mais pas seulement, car cela est bien pratique pour la maintenance, car on a tous les schémas !.
Je m'explique, je vais installer un kit photovoltaïque en autoconsommation (oh pas grand' chose, 2 panneaux pour 700W maxi), et il va falloir ne pas alimenter bêtement le réseau avec le surplus d'énergie produite. Certes cela ne va pas chercher bien loin, car quelques centaines de watts, au mieux, ne va pas changer la face du monde, mais cette énergie, je l'ai payée par mon investissement qui n'est pas anodin, et au lieu d'en profiter pleinement, j'enrichi encore le producteur d'énergie officiel par ma redistribution.
De plus cela reste une tolérance de réaliser un retour d'énergie vers le réseau (à faible puissance), alors c'est deux bonnes raisons pour lesquelles, joindre l'utile à la réglementation est une bonne chose.
Voilà pourquoi j'envisage de réaliser un routeur photovoltaïque. En résumé pour rester simple ce routeur est un appareil qui regarde en permanence le bilan énergétique entre l'énergie photovoltaïque (qui varie avec les nuages et les heures !!!) et la demande d'énergie de l'habitation qui varie aussi suivant les heures.
On comprend d'emblée qu'il va falloir utiliser le trop d'énergie produite pour chauffer de l'eau dans un cumulus.
Il n'y a pas d'autre alternative simple au stockage d'énergie électrique que ce procédé au niveau individuel. (Les batteries quelles qu'elles soient ne sont pas une méthode pérenne, ont une durée de vie limitée et un coût élevé)
Alors la seule solution est de chauffer l'eau sanitaire de la maison lorsque la demande d'énergie (de la maison) est faible ce qui permet d'absorber utilement ce trop-plein d'énergie.

Quel rapport avec ce display ?

J'y viens..., il va falloir synchroniser tous ces éléments, qui sont tous variables, et en fonction du timing  donné par chaque période du secteur alternatif 50 Hz.
En théorie à chaque alternance (durée 10ms !) il faut donc évaluer le courant disponible, le courant consommé et décider ou non de stocker le surplus d'énergie électrique à chauffer l'eau du cumulus.
Je dis "courant" par dérision, car en réalité c'est beaucoup plus une question de puissance, car il y encore le cosinus phi qui intervient…(Ce routeur sera seulement en énergie active : cos Phi=1)
Mais surtout le courant n'est pas sinusoïdal et il faudra mesurer la surface développée pour en déduire la puissance moyenne. (C'est une intégrale et donc quelques centaines de mesures durant un temps de 10ms rien que pour le courant !)

A parler énergie il faut aussi que le dispositif du routeur ne soit pas une centrale nucléaire et qu'il soit économe. Alors un display LCD 2 ou 4 lignes qui résumera les différents éléments de cette régulation semble tout indiqué. Le seul problème est que ces display sont tous très lents et qu'ils sont assez incompatibles avec une surveillance de sinusoïdes de période 20ms, qui promet d'être ultra rapide puisque en moins d'une seconde il faut faire une 16 à 20 mesures pour 3 signaux analogiques...

Alors travailler à envoyer vers le display à très grande vitesse est la première règle. Rester simple et pratique dans le fonctionnement, est une deuxième règle. Pouvoir réutiliser ce display pour d'autres  montages serait aussi un plus.

2 Principes de base

2.1 Interface choisie

C'est la RS232 qui reste le choix le plus pertinent par sa simplicité, grâce au nombre de liaisons nécessaires au fonctionnement qui reste faible. Une alimentation 5v + et- et un seul fil de réception série RX.
Cependant si l'on a à envoyer un message, on doit savoir si ce montage est occupé ou non, sous peine de créer d'autres problèmes ou de ne pas recevoir correctement un message urgent.
Aussi outre cette interface RS232, un signal BUSY est généré et le routeur saura qu'il ne peut pas encore envoyer son message et qu'il devra différer son envoi.
Ce signal ne fait pas partie de la RS232 et n'est qu'une aide, car il peut être ignoré à condition que le programme principal gère lui-même les temps du display…
La vitesse de transmission est le deuxième élément vital de ce display. Il pourra travailler à 115200 bps, ce qui permet au routeur de ne pas perdre trop de temps à attendre qu'un message soit affiché.
C'est le display équipé un "petit PIC" qui assurera la réception très rapide en sa mémoire, puis mettra son indicateur "Busy" à 1 jusqu'à ce que le display ait bien voulu débuter et terminer son affichage…!
On aurait pu monter à 250 Kbauds, mais il aurait fallu travailler à 20 MHz et avoir un PIC plus important en nombre d'I/O, car avec un 16F688, le nombre de broches aurait été insuffisant en ajoutant les 2 bornes pour le quartz.

2.2 Simple buffer

La réception se fera sur un seul buffer, car autrement on n'aurait pas le temps de gérer un double buffer, mais là ça commence à être un peu compliqué surtout pour un périphérique lent.
Le montage ne doit pas consommer de trop, donc ne pas travailler à vitesse trop élevée. Ce processeur PIC travaillera à 8 MHz suivant son oscillateur interne.

Le processus est résumé ainsi :
- Réception trame
- Set busy
- Temps d'affichage
- Reset busy
- Boucle d'attente d'une nouvelle trame

Comme déjà indiqué, ce signal BUSY n'est qu'une aide pour décharger le montage maître de la surveillance de la disponibilité de l'afficheur, mais n'est pas véritablement nécessaire dans le processus.

2.3 Réutilisation généraliste

Un display LCD est très souvent nécessaire dans beaucoup de montages à microprocesseur, aussi si c'était possible de modifier la vitesse sans avoir à reprogrammer la vitesse de transmission, ce serait très utile...

J'ai essayé le système "autobaud", mais je n'ai pas abouti, alors j'ai préféré faire une solution qui évite de plus de devoir à envoyer un caractère 0x55. Les systèmes divers (et fermés)  ne sont pas tous disposés à envoyer en premier ce caractère 0x55, car il faut aussi que ce soit lors de chaque mise sous tension (MST) display.
Ce sera maintenant possible avec un simple switch à lire à la mise sous tension, et la sélection parmi 8 vitesses proposées séquentiellement à l'écran  .
Cette vitesse sélectionnée est ensuite écrite en EEPROM de façon à ne plus recommencer cette sélection à chaque MST (Mise Sous Tension).
Ce qui serait bien aussi, serait de pouvoir à la fois traiter les commandes spécifiques display, mais aussi de simplifier l'adressage des différentes lignes et positions. Ce sera également possible et tout sera réalisé de façon assez simple.
!

2.4 Choix de la principale commande

2.4.1 Le caractère de tête

De façon pratique, on veut afficher un message sur une ligne particulière à une position (adresse) donnée.
Ainsi une commande d'affichage sera traitée avec un byte d'adresse suivi des données à afficher à partir de cette position.
Il est difficile dans un tel contexte de rapidité de travailler sur des longueurs de message, car cela pose des problèmes de timing qui ne sont pas faciles à résoudre dans le contexte de vitesse.
Aussi un RETURN clôturera systématiquement tout message ou commande pour qu'il puisse être traité mais ne sera pas envoyé réellement au display. Ce return sera applicable à toute commande ou à tout data.

Un data sans return sera cependant transmis au message suivant borné par un return et sera affiché en premier.
Il n'est pas possible de faire une boucle d'attente qui détermine la fin d'un message, car les temps à 8 MHz sont trop serrés pour faire mieux. Et puis cela reste simple et "assez traditionnel".

Une commande principale d'affichage est structurée ainsi :

Un  byte de commande comportant un flag suivi de la ligne et de l'adresse dans la ligne. Ce byte de commande doit comporter le bit7 à 1 comme flag, pour indiquer que c'est une commande principale. Ce bit7 est suivi de 2 bits d'adresse ligne.
Il n'a pas été possible sans faire une usine à gaz de traiter le numéro de ligne de 1 à 4 mais seulement de 0 à 3 ce qui est la même chose sur le fond, car cela aurait nécessité un bit de plus et donc un byte de plus au final !!!.

Voici donc la structure en bits du caractère de commande :  1LLAAAAA
Avec le bit7 à 1, LL la ligne choisie de 0 à  3 et l'adresse AAAAA dans la ligne  sur les derniers 5 bits.

C'est donc le programme du display qui s'appuie sur un PIC 16F688 qui assure la transformation de la commande en adresse réelle pour le display.

2.4.2 Datas

Les datas suivent directement le caractère de commande et sont donc terminés par un caractère return.
Ce caractère a pour seul rôle de donner l'ordre de commencer l'affichage et de passer cette fois en BUSY.
Le temps de vider le buffer dans le display rend donc inaccessible la RS2332 car on ne sait pas à quel rythme le buffer se vide.
L'absence de datas est tout à fait possible pour simplement positionner une adresse, mais la règle est incontournable d'ajouter un Return accolé à la commande.


3 Les commandes display

Elles sont possibles mais celles-ci doivent être traitées comme des datas et ne comportent donc PAS de caractère de tête, mais seulement un habituel return final.
Ces commandes, souvent de durée importante comme display clear, et sont accompagnées du signal BUSY du PIC à la bonne valeur (en ms en lieu et place de 50µs environ pour les autres commandes)

3.1 Les temps display

Ces temps d'exécution display sont traités par des délais fixes et non pas par la commande de lecture "Read Busy" qui n'apporte rien de plus car les temps d'exécution d'une commande sont très proches du temps de lecture du bit "Busy" du display. J'ai donc fait au plus simple quitte à perdre quelques µs, qui seront gérées par le signal Busy généré par le PIC.
La commande de lecture display n'est donc pas utilisée (Elle l'avait été au départ et cela est apparu quasiment inutile en termes de perte de temps et de complication)

4 Le montage115200_P1000355


4.1 Physiquement

C'est un petit circuit imprimé qui vient se "pluguer" sur les 16 signaux des display. (Qu'ils soient de 2 ou 4 lignes, cela ne change strictement rien en tous points hormis que les adresses n'existent (peut-être) pas. A vérifier !

Ainsi que vous pourrez le voir, l'interface réelle utilisée sera à 4 bits car cela  permet de limiter à une valeur acceptable le nombre d'I/O sur le PIC, tout en relativisant le temps d'accès.

On remarquera que ce temps ajouté n'affecte pas directement le progrmme utilisteur du display (routeur ici) mais augmente un tout petit peu de quelques µs le temps de transfert entre le PIC 16F688 et display. Cette augmentation ne pénalisera donc pas le dialogue avec le programme utilisateur du display (router photovoltaïque)


Les display considérés répondent au pinnig suivant le plus répandu :

1 GND
2 Vdd
3 V0
4 RS (Register Select)
5 R/W     (Read Write)
6 E    (Enable)
7 DB0    data        Non utilisé
8 DB1 data        Non utilisé
9 DB2 data        Non utilisé
10 DB3 data        Non utilisé
11 DB4 data
12 DB5    data
13 DB6 data
14 DB7     data
15 A Anode de la LED
16 K    Cathode de la LED

4.2  Le cœur du montage115200_P1000354


C'est un petit PIC 14 pins qui est utilisé : le 16F688 faisant partie des nouveaux PIC Nanowatt technologie. (Ci-contre la toute première version avec quelques modifs)

Ses principaux rôles sont de recevoir à 115200 bps, d'interpréter les commandes "courantes", d'autoriser les commandes directes au display, de transmettre au display et de gérer un indicateur BUSY (Au niveau du PIC ).

Pour rester dans les économies d'énergie,  mais aussi pour utiliser un petit PIC à 14 broches, je n'ai pas opté pour une vitesse de processeur de 20 MHz, mais seulement de 8 Mhz. Cela complique un peu et ne permet sans doute pas  de monter à 230400 bps. (J'ai essayé mais ça ne fonctionne pas !)

A cause de cette vitesse de processeur assez faible, et n'ayant que peu de choses à faire en l'attente de RS232, tout le programme est construit sans aucune interruption. (C'est un vrai plaisir !)
J'avais un instant envisagé d'utiliser l'ULPWU, mais j'y ai renoncé car il ne faut tout de même pas exagérer. Cela compliquait la programmation ICSP et nécessitait de préférence des interruptions. Alors j'ai simplifié !

Les temps étant tellement serrés, je n'ai pas pu ajouter un time out pour gérer la LED display. J'ai prévu un connecteur à 6 pins dont une en détrompeur qui pourrait maintenant être réutilisée pour commander par le programme principal la LED du display (roteur) en réalisant la liaison de la pin 5 du Cn ICSP à la pin 6 du connecteur d'entrée J1. (Le programme actuel n'est pas impacté par cette modif).

4.3 Réalisation115200_P1000356

(Ci-contre une version encore avec une modif pour la Cde de la LED display)
Un petit circuit imprimé de 5.2x2.6 cm vient se placer sur le connecteur 16 broches des display 2 ou 4 lignes (dernière version).
Pour la rigidité on mettra 2 ou 3 pins laiton en 1 et 16 et le reste en petit fil.  Cela permettra de dessouder facilement sans arracher de pastilles en cas de démontage.
J'ai donc réalisé un prototype dont les photos sont représentées. Il y a eu comme d'habitude quelques erreurs et notamment RA3 oublié en tant qu'input seule !!!

Le petit circuit dépasse légèrement vers le haut le CI display, mais en simple face, il faut faire au mieux…

J'ai mis à jour le schéma avec les dernières modifs, qui sont donc incluses (Y compris LED display) . Quant au plan d'implantation, je l'ai corrigé et il DEVRAIT être bon aussi, mais cela reste à vérifier. (C'est en cours)

SCHEMA

115200_schema



IMPLANTATION115200_board



Je tombe toujours dans le travers de pistes trop fines, aussi j'ai dû recharger de soudure, car j'avais peur de quelques coupures  non visibles ou intermittentes ! Cette nouvelle version devrait être plus aboutie et surtout comporter le switch de programmation de la vitesse.

5 Fonctionnalités

5.1 Généralités

Le PIC traite les commandes de type "principales" ou "courantes", c'est-à-dire d'affichage dans une ligne à une adresse donnée suivant la forme rappelée  ci-dessous :
1LLAAAAA
Suivie des datas  bornés par un caractère return (Ox0D). Il n'y a pas de limitation de longueur mais une partie de la mémoire display n'est pas visible et cela peut devenir parfois assez surprenant.

Le PIC gère aussi le signal BUSY à destination du programme pour lequel il travaillera (Routeur dans ce cas présent)

Se voulant réutilisable pour d'autre applications, j'ai prévu que la vitesse de transmission la plus élevée 115200 bps (compatible avec la vitesse d'horloge du PIC ), soit paramétrable facilement et que l'on n'ait plus à la re-paramétrer à chaque MST.
Il y a donc choix à l'aide d'un switch des vitesses proposées à l'écran si on entre à la MST de l'afficheur avec ce même switch activé.
Ce choix est ensuite écrit en EEPROM et restera ainsi jusqu'au prochain changement désiré.

Le PIC traite aussi les commandes spécifiques display moyennant leur envoi comme datas, ce qui les différentie des commandes "principales".

J'avais voulu aussi allumer la led display durant l'entrée d'une commande et quelques secondes après la fin d'affichage, mais j'ai eu des soucis de timing pour la lecture RS232, alors j'ai abandonné. J'aurais aimé le faire pour l'économie d'énergie du montage et le geste… (C'est le programme principal ou un court_circuit au Vcc qui seront de service !)

En ce qui concerne les caractères Chinois, ceux-ci peuvent être transmis normalement en tant que caractère. De même les caractères de la CGRAM devraient pouvoir être affichés. (Essais réalisés, il semble que si ces caractères n'ont pas été chargés, ceux-ci soient ignorés)

5.2  Programmation PIC

En ce qui concerne la programmation, celle-ci se réalise en ICSP grâce à un connecteur dédié prévu à cet effet. Aucun élément discret contraignant n'est connecté à ces pins (Seulement des résistances pures de forte valeur pour fixer les potentiels, ou des sorties vers des bases de transistors pour les LED.

Chaque fois que j'ai utilisé ce circuit 16F688, chaque fois j'ai eu des problèmes de programmation et au final mon PICKIT3 code les autres 16F sans problème s'est révélé mort pour coder ce 16F688, mais bon pour coder un 16F886 ! (???).

5.3 Programmation des vitesses RS232

La programmation des vitesses de transmission se réalise à la MST de l'afficheur associée à son circuit RS232.
Il faut avant toutes choses maintenir le switch appuyé DURANT la MST et l'afficheur commence à afficher dès le relâché du switch avec plusieurs secondes toute la panoplie des vitesses dont certaines ne sont pas traitées car trop peu utilisées.
Certaines faibles vitesses qui utilisent du 1200 bps (Comme pour le compteur LINKY ) ou 2400 bps, voire comme pour le GPS, 9600 bps sont acceptées.
Voici cette liste des vitesses traitées : avec les valeurs SPBRGH et SPBRG

sel_speed    addwf    PCL,f        ; SPBRGH suivi de SPBRG
speed_val
            dt        0,16                         ; 115200    0
            dt        0,34                         ; 57600        1
            dt        0,51                         ; 38400        2
            dt        0,103                       ; 19200        3
            dt        0,207                       ; 9600        4
            dt        0x01                        ; 4800        5     416
            dt        0xA0                        ; 4800        5
            dt        0x03                        ; 2400        6    832
            dt        0x40                        ; 2400        6
            retlw        0x06                    ; 1200        7    1666

            retlw        0x82                ; 1200        7

à partir de 4800 bps, BRGH n'est plus =0  et pour faciliter la mise au point il y a eu quelques modifications d'apparence des pseudo instructions mais c'est strictement la même chose !

Vous avez donc quelques secondes pour appuyer sur la vitesse RS232 qui vous convient et en réponse de la bonne prise en compte, cette valeur est ensuite écrite en EEPROM aux adresses 0 et 1 puis ré-affichée au display et le programme débute réellement à cette vitesse.

A la mise sous tension standard, il y a affichage de la vitesse en cours, (chargée depuis l'EEPROM) car ça permet de se rappeler et évite des recherches de mauvais fonctionnement.

6 Conclusions

Je pense que mon ancien article avec une sérialisation à l'aide d'un CD4015 et un ensemble de clocks reste intéressant, ne serait-ce que pour palier (à) une liaison RS232 déjà utilisée par ailleurs, et dans ces petits PIC, il n'y a en général qu'une seule entrée et sortie RS232.

Pour l'instant, la rapidité et la standardisation RS232 est un atout qui semble inéluctable dans le futur, surtout si on veut se décharger rapidement de la tâche d'affichage sans attendre que le display ait terminé son travail.

De plus c'est une sérieuse économie d'I/O et permet donc d'utiliser des PIC plus petits en nombre de broches.

Je voudrais aussi ajouter pour ceux qui utilisent moins les PIC, et qui se tournent vers d'autres micros (arduino ou autres), que c'est un choix délibéré car à 77 ans je n'ai plus envie de ré-apprendre d'autres assembleurs et encore moins d'utiliser le langage C.(Le Pascal me semblait plus structuré, mais il n'a pas suivi la mode)
A bientôt pour le routeur photovoltaïque...

 

bricolsec






 abus