Index des articles > Programmation > Les niveaux de gris - Techniques de base

Les niveaux de gris - Techniques de base

Article posté par geogeo

Les niveaux de gris - Techniques de base


Cette article s'inspire de l'original en Anglais que vous pouvez trouver sur le site de la TICT Team.


Introduction:

Ce tutorial explique les techniques de base sur l'implantation des niveaux de gris (4 gris) sur TI89/TI92+ et V200.
Vous ne trouverez aucunes lignes de code dans ce document, mais je ne pense pas que ça soit nécessaire pour apprendre les techniques de base par tous les programmeurs en donnant le maximum de code (connaître votre ennemi est-elle la première étape pour le battre? :-)


Comment tromper le matériel pour afficher des niveaux de gris?

Pour me rendre la tache plus facile, je vais d'abord expliquer comment sont réalisé les niveaux de gris sur les calculatrices HW1 puis j'expliquerais les différences avec les HW2 plus tard.

Chaque TI89/TI92+ ou V200 comporte un contrôleur LCD qui est capable d'afficher des images monochrome sur l'écran de la calculatrice. Les données qui sont affichés sur le LCD ce trouve dans une partie de la mémoire nommée "mémoire vidéo" (LCD-Memory). Cette zone mémoire est située dans la RAM et chaque bit correspond à un pixel du LCD. Si le bit est activé, le pixel correspondant sera noir (Allumé), si le bit est à 0, le pixel sera blanc (éteint). La l'adresse de début de la mémoire vidéo dans la RAM est normalement unique, mais heureusement, le contrôleur LCD peut être programmé et ce placer n'importe où dans la RAM ainsi faisant office de mémoire vidéo. En effet changer l'adresse qui indiquera la zone de la nouvelle mémoire vidéo.

La programmation du contrôleur LCD est situé dans une autre partie de la RAM, il suffit juste d'écrire l'adresse de début de la nouvelle partie de la mémoire vidéo dans un port spécifique.

Maintenant voyons les détails pour réaliser 4 niveaux de gris différents. Pour réaliser 4 niveaux de gris il nous faut 2 plans (2^x ou x représente le nombre de plans, soit 2^2=4 couleurs...), vous pouvez pensé à réaliser 2 mémoires vidéo séparées. Le premier plan sera nommé Plan1 et le deuxième Plan2, par convention sous TIGCC on utilise Plan0 pour le premier plan et Plan1 pour le deuxième.

Voici maintenant les différents niveaux de gris que l'on peut produire avec ses plans:

WHITE (Blanc): Le bit correspondant est à 0 dans le Plan1 et le bit correspondant dans le Plan2 est à zéro aussi.
LIGHTGRAY (Gris Clair): Le bit correspondant est à 1 dans le Plan1 et le bit correspondant est à zéro dans le Plan2.
DARKGRAY (Gris Foncé): Le bit correspondant est à 0 dans le Plan1 et le bit correspondant est à 1 dans le Plan2.
BLACK (Noir): Le bit correspondant dans le Plan1 est à 1 et le bit correspondant dans le Plan2 est à 1 aussi.

Malheureusement le contrôleur LCD ne supporte par les niveaux de gris. Comment tromper le matériel pour réaliser les niveaux de gris? La TI89/TI92+ et V200 possèdent des interruptions qui ce déclenchent périodiquement ou lors de la manifestation d'un périphérique (voir article sur les interruptions), pour les niveaux de gris l'interruption n°1 à 350 Hz a été choisie de ce fait, elle exécutera le programme ce chargeant d'afficher les plans des niveaux de gris 350 fois par secondes mais ce n'est pas tout à fait vrai à cause de la fréquence du LCD qui n'est que de 90 Hz. Le programme de l'interruption ce charge de programmer le contrôleur LCD pour ce situer soit sur la zone mémoire du Plan1 ou du Plan2, de tel sorte, rapidement affichant les plans et dupant ainsi l'?il qui voit des niveaux de gris alors que ce n'est qu'une succession très rapide de plans monochrome.

Mais il y a un autre tour de magie nécessaire pour afficher les 4 niveaux de gris, si vous affichez le Plan1 aussi longtemps que le Plan2, nous obtenons seulement les pixels Noir et Blanc l'utilisateur ne verra aucune différence entre le Gris Clair et le Gris Foncé. Par conséquent nous afficherons 66% du temps de l'interruption le Plan1 et le reste du temps soit 34% le Plan2, maintenant nous avons 4 niveaux de gris et cela fonctionne parfaitement sans scintillements sur HW1.

http://perso.wanadoo.fr/tisofts/tigen/images/hw1gray.gif



Quelle est la différence sur HW2?

Les utilisateurs des HW2 on plus noté que les niveaux de gris clignotes mais légèrement (dépendant lorsque l'état des batteries est faible), auparavant le problème était plus important mais il a été résolus.
Maintenant: Quelle est la cause des clignotements sur HW2?

Comme nous l'avons vu avant, les niveaux de gris sur HW1 sont réalisés en commutant les adresses des Plans par la programmation du contrôleur LCD. La commutation elle-même peut être exécuté rapidement car nous écrivons seulement des adresses dans une zone précise dans un temps presque nul pour le processeur.

Sur HW2 la situation a complètement changée. TI a introduit un nouveau contrôleur LCD possédant une RAM (interne), le LCD-Controller RAM. Pour commuter entre les deux plans, nous ne pouvons plus reprogrammer le contrôleur LCD pour employer une autre partie de la RAM normale comme mémoire vidéo mais nous devons copier entièrement le contenu de chaque plan dans la mémoire vidéo (dans le LCD-Controller RAM). Étant donné que le LCD-Memory est de 3840 octets (même sur un TI-89), cette quantité de mémoire doit être copiée beaucoup de fois par seconde entre la RAM normale et la RAM du contrôleur LCD. Cette opération de copie doit être effectuée encore par l'auto interruption n°1.

Disons que nous avons besoin environs de 15 images par secondes. Étant donné qu'une image ce compose en 2 plans, chacune, de 3840 octets, le programme de l'interruption doit copier 3840*2*15=115 200 octets = 115 Koctets par seconde entre la mémoire RAM normale et la RAM du contrôleur LCD. Si vous comparez ceci à l'écriture de 60 octets (2*15*2=60) par seconde au port du contrôleur LCD sur HW1, il est évidant que les niveaux de gris sur HW2 scintilles.

Il y a quelques méthodes pour améliorer les niveaux de gris sur HW2, mais je pense que ça suffit, vous connaissez maintenant les mécanismes de base pour réaliser des niveaux de gris sur HW1 et HW2.

http://perso.wanadoo.fr/tisofts/tigen/images/hw2gray.gif



Double-Buffering et niveaux de gris (Idée pour une nouvelle approche).

Le Double-Buffering est une méthode où un programme affiche l'image sur l'écran pendant qu'une autre est stockée dans une partie de la RAM. Si la création de la nouvelle image dans la zone invisible est finie, le programme l'affiche et cache l'ancienne qui devient donc invisible... Si la commutation entre les deux images peut être exécutée rapidement, vous ne verrez aucun clignotement du tout.
Le double-Buffering est utilisé dans tous les jeux demandant l'affichage de beaucoup de sprites et permet aussi de donner des animations fluides....
Dans les dernière version de TIGCC le double-buffering est supporté directement par les routines qui s'occupe de la création des niveaux de gris, mais beaucoup de programmes utilise une approche personnalisée tel que:

1. Afficher le Plan1/Plan2 de l'image 1 et générer l'image 2 dans un autre buffer de la mémoire (2 plans).

2. Copier l'image 2 invisible donc le buffer dans les plans visible Plan1/Plan2.

Comme vous pouvez voir c'est extrêmement inefficacement sur les deux versions de matériel. Pour chaque image produite autour de 8 Ko sont copiés, ce qui n'est pas vraiment nécessaire !!

Supposons que nous avons fait une petite modification sur l'implantation des niveaux de gris et que nous avons 4 plans. Ok, ce qui nous fait autour de 16 Ko de RAM au lieu de 8 Ko, mais si un programme veut employer le double-buffering, il utilisera bien plus de mémoire. Supposons que nous avons 2 nouvelles fonctions:

1. void SetDisplayedPair(short x)
2. short GetDisplayedPair()

La première fonction prend comme argument 0 ou 1. Si l'argument est à 0, l'interruption commutera les plans, soit passer du plan1 au plan2 et l'afficher et inversement. Si l'argument est à 1, il effectuera la même opération que les plan1 et 2 mais avec les plan3 et 4 et les affichera. Si les autres routines sont également modifiées pour être utilisé avec 4 plans (au lieu de 2) nous pourrons faire le Double-double-Buffering sans frais supplémentaire avec la copie de 8 Ko chaque fois.

A savoir que cette approche est déjà disponible dans les dernières version de TIGCC. Je vous invite à vous renseigner dans la documentation de TIGCC ou vous faire part de cette approche dans un prochaine article.

Grand remerciements aux auteurs anglais: TICT Team.

Copyright 2004 by ANNEHEIM Geoffrey

>> Vos commentaires [7]

Bonne idée, mais... :: [Commentaire n°1]

Posté par Sasume le 24/02/2004
C'est une très bonne idée d'écrire ce genre de tutoriaux, mais :
- Il y a encore des fautes de français.
- Il y a des erreurs : si on affiche les deux plans pendant autant de temps chacun, on aura 3 niveaux de gris, et pas seulement du noir et blanc.
- Les explications sont difficiles à comprendre
- Les shémas aussi


hum :: [Commentaire n°2]

Posté par geogeo le 24/02/2004
- Il y a des erreurs : si on affiche les deux plans pendant autant de temps chacun, on aura 3 niveaux de gris, et pas seulement du noir et blanc.


3 Niveaux de gris ça me paraît bizarre?

- Les explications sont difficiles à comprendre

Pourtant ils sont clairs.

- Les shémas aussi


Je ne vois pas de schémas plus explicites.


[Commentaire n°3]

Posté par Sasume le 24/02/2004
3 Niveaux de gris ça me paraît bizarre?
Ben j'ai peut-être mal compris ce que tu disais : si on affiche 2 plans en alternant, en échageant de plans à intervalles réguliers, on se retrouve avec 3 niveaux de gris.
Et si c'est bizarre, ou peu commun ou que personne ne te l'a dit, peut-être que je me trompe, mais c'est ce que je pense (même si personne ne me l'a dit : j'ai réfléchi, et ce n'est pas bien difficile à comprendre).

À propos des explications, ta réponse me paraît assez peu utile, puisque je te dis que je trouve que les explications sont difficiles à comprendre, et tu me réponds qu'elles sont claires...
Elles le sont pour toi qui a écrit l'article, mais tu dois te mettre dans la peau de celui qui lit l'article et qui a besoin de comprendre des notions qui te sont implicites à toi.

Et pour les shémas, je ne comprends pas trop ce que signifient les rectangles et les flèches. Tu pourrais éventuellement mettre une légende.


[Commentaire n°4]

Posté par geogeo le 24/02/2004
ok ok je verrais ça quand j'aurais du temps à perdre.


[Commentaire n°5]

Posté par Sasume le 24/02/2004
Pour ce qui est des 3 niveaux de gris, tu n'est vraiment pas doué, parce qu'ils en parlent dans l'article dont tu t'es servi de source...


[Commentaire n°6]

Posté par Riri le 19/05/2004
Effectivement, si tu affiches les deux images autant de temps, tu n'auras que trois niveaux de gris, il faut afficher le plan foncer pendant environ 2/3 du temps et le plan clair pendant 1/3 du temps pour avoir 4 niveaux de gris.
Désolé pour la date de mon poste par rapport aux précédents.


[Commentaire n°7]

Posté par Nounours le 26/07/2004
moi je trouve que les explicaitons sont claires (meme pour moi qui debute en programmation)


Poster un commentaire


Seuls les membres peuvent poster des commentaires