Menu   Welcome on Na-Prod.com
 

Le port Communication
Pour la Casio AFX/2 (Graph100)


Sommaire
I. Généralités
II. Les ports matériels
III. Les vitesses et leurs valeurs
IV. Initialisation Primaire
V. La configuration de la communication
V.1. Envoi
V.1.1 Theorie
V.1.2 Pratique
V.2. Reception
V.2.1 Theorie
V.2.2 Pratique
VI. Et le reste de la calculatrice
VII. Note sur les methodes
VIII. Mot de la fin
I. Généralités [Top]
Le port communication qu’utilise notre calculatrice est un port de type synchrone pouvant transférer de1200bps à 115200bps.
Nous allons voir comment gérer cette entrée/sortie pour communiquer avec un Pc/Mac ou une autre calculatrice (Ti/Casio G25->65/G100(+)).

II. Les ports matériels [Top]
Ces ports matériels a ne pas confondre avec le port série correspondent avec les éléments d’entrée-sortie comme l’écran ou le port comm à travers le BIOS. Pour ne pas confondre je nommerais un port matériel avec PXXh avec XX, le numéro du port en hexadécimal.
Notation : L=E indique que la valeur d’ecriture=valeur de lecture
L= seule la valeur de lecture est importante (L'Écriture ne fait rien)
E=Seule l’écriture est importante (La lecture ne sert à rien)
L/E=La lecture et écriture ne correspondent pas et servent
1. P0Ah : Contrôle du port série et du clavier
Par défaut : 0Ah L/E

7

6

5

4

3

2

1

0

Val

0

0

0

0

1

0

1

0

Le P0Ah permet de contrôler le clavier (Allumé/Eteint) et de contrôler l’envoi et la réception des octets par le port comm.
Bit 0 : Active ou désactive le contrôle du port comm.
Il met à 1 le bit 0 du P0Eh si un octet a été bien envoyé ou a été reçu.
Bit 1 : Ne peut être enlevé
Bit 2,4,5,7 : Inconnu
Bit 3 : Contrôle l’état du clavier. S'il est à 1, le clavier peut être utilisé sinon le clavier devient inutilisable (désactivé)
Bit 6 : Ce bit met à sa valeur le bit 65 du P0Eh.
ex :S’il est a 1, le bit 6 de P0Eh sera à 1 aussi
2. P0Eh : Témoin de Contrôle du port série
Par défaut : 00h L

7

6

5

4

3

2

1

0

Val

0

0

0

0

0

0

0

0

Le P0Ah permet de voir si un octet a bien été reçu ou envoyé.
Bit 0 : Indique si un octet a bien été reçu ou envoyé.
Bit 1,2,3,4,5,7 : Inconnu
Bit 6 : Ce bit se met à la valeur du bit 6 du P0Ah.
Note: L'utilisation de ces 2 ports dans la communication est superflue et peuvent être remplacés par l'unique P45h.
3. P11h : Met en route le port comm.
Par défaut : 03h L=E

7

6

5

4

3

2

1

0

Val

0

0

0

0

0

0

1

1

Le P11h permet de mettre le port série en marche.
Bit 5 : Met le fil de réception a 4.92V
Bit 6 : Met le fil d’envoi a 4.92 V
Bit 0,1,2,3,4,7 : Inconnu.
4. P44h : Gestion du port comm.
Par défaut : 00h L/E

7

6

5

4

3

2

1

0

Val

0

0

0

0

0

0

0

0

En écriture, met en route la communication à la vitesse souhaitée et au mode que l’on veut
Ex : Mode Envoi à la 2e vitesse 54h

7

6

5

4

3

2

1

0

Val

0

1

0

1

0

1

0

0

Bits de 0 à 3 : Vitesse, numero*4, ex :vitesse 4 = 4*4 = Ch
Bit 4 : Comunication correcte
Bit 5 : Réception (3)
Bit 6 : Envoi (5)
Bit de poids fort : Mode
Bits de poids faible : Vitesse
Note:Si la valeur contient les bits 5 et 6 allumés, la calculatrice pourra alors envoyer et recevoir en même temps.
En lecture, il donne le dernier octet reçu.
5. P45h : Indique l’état du port comm et controle valeur a transferer.
Par défaut : 00h L/E

En lecture, indique l'etat du port comm.

7

6

5

4

3

2

1

0

Val

0

0

0

0

0

0

0

0

Le P45h indique l’état et les erreurs sur le port comm.
Bit 0 : Indique qu'en octet a bien été envoyé
Bit 1 : Indique qu’un octet est reçu
Bit 2 : Indique qu’un octet a été oublié (Un octet est arrivé avant que le précédent ne soit lu)
Bit 3,4 : Erreur lors de la réception
Bits 5,6,7 : Inconnus

En Ecriture, controle le type de valeur a envoyer.

7

6

5

4

3

2

1

0

Val

0

1

0

0

0

0

0

1

Valeur normale 41h
La combinaison 00h rends la communication incoherente.
La combinaison 41h permet une reception et envoi correct.

6. P46h : Buffer d’envoi
Par défaut : ??h E
Le P46h stocke le prochain octet à envoyer.

7. P47h : Met en route le port comm.
Par défaut : ??h E
Le P47h permet de spécifier le type de vitesse à utiliser.

III. Les vitesses et leurs valeurs [Top]

Vitesse

0h

4h
8h

Ch

115200 bps
     
0Bh
76800 bps
     
11h
57800 bps
   
0Bh
17h
38400 bps
   
11h
21h
28800 bps
 
0Bh
17h
2Bh
19200 bps
 
11h
21h
41h
14400 bps
0Bh
17h
2Bh
5Bh
9600 bps
11h
21h
41h
7Fh
7200 bps
17h
2Bh
5Bh
 
4800 bps
21h
41h
7Fh
 
3600 bps
2Bh
5Bh
   
2400 bps
41h
7Fh
   
1800 bps
5Bh
     
1200 bps
7Fh
     

Pour initialiser la vitesse voulue, il faut mettre la valeur en Vert dans P47h.
Ensuite mettre en bits de poids faible da la valeur a mettre dans P44h la valeur en Violet.

Ex : Pour communiquer à 14400bps on mettra :
- 0Bh dans P47h, 70h dans P44h
ou
- 17h dans P47h, 74h dans P44h
ou
- 2Bh dans P47h, 78h dans P44h
ou
- 5Bh dans P47h, 7Ch dans P44h

IV. Initialisation Primaire [Top]

L’initialisation primaire consiste à mettre du courant dans le port communication.
Le P11h gère en effet le courant dans ce port. Donc avant toute communication, il faut activer les bits 5 et 6 du P11h pour que le port soit à 4.92V DC. Un problème mineur se pose : le P11h se remet à sa valeur pas défaut dès que la calculatrice s’éteint et se rallume, donc il faut surveiller le P11h soit désactiver l’interruption du clavier : L’Int 9.
A la fin de communication, il faut donc éteindre les 2 bits 5 et 6 pour éteindre le port.

V. La configuration de la communication [Top]
1. Envoi

1.1 Théorie

Pour l'envoi, on configurera le port de telle sorte que la calculatrice envoie automatiquement le dernier octet mis dans le P46h.
Donc avant l'initialisation, il faudra mettre le premier octet à envoyer dans P46h pour éviter l'envoi d'un octet non voulu.
Donc, on va utiliser les spécifications des ports pour cette initialisation :
1. Initialiser le port (Initialisation Primaire)
2. Mettre 0 dans P44h (Pour initialiser toute communication)
3. Mettre l'identifiant de la Vitesse dans P47h
4. Mettre l’octet à envoyer dans P46h
5. Mettre 41h dans P45h et la vitesse dans P44h (7 puis 0/4/8/C )
6. Attendre que le bit 0 de P45h soit à 1 (Attendre que l'octet est bien envoyé)
7. Soit continuer soit remettre un autre octet dans P46h et retourner à 6
8. Mettre 0 dans P44h (Pour réinitialiser la communication)
9. Désactiver les bits 5 et 6 du P11h

Donc la communication en elle-même se trouve entre 6 et 7.
Notez que cette routine fonctionne avec toutes les vitesses.
Si vous ne desirez pas que cet octet soit envoyé, il est possible d'executer la partie 1 aprés la partie 6 lors de l'initialisation.

1.2. Pratique [Top]
Donc je vais vous traduire en Assembleur la méthode en utilisant les parties précédentes et mettre des commentaires pour plus de compréhension :

;Assembleur 286
;Méthode d’envoi d’un octet 13h à 38400 bps
.partie1:

in al,11h ;prends la valeur de P11h
or al,60h ;active les bits 5 et 6
out 11h,al ;remet en P11h
.partie2:
mov al,0h
out 44h,al ;met 0 dans P44h
.partie3:
mov al,41h;comm correcte
out 45h,al

mov al,21h ;vitesse principale
out 47h,al ;met dans P47h
.partie4:
mov al,13h
out 46h,al
.partie5:
mov al,7C ;communication a 38400bps
out 44h,al
.partie6:
in al,45h ;prends P45h
and al,1 ;ne prends que le bit 0 (1= 00 000 001b)
cmp al,1 ;compare avec 1
jne .partie6 ; si pas 1, re verifie
.partie7: ;on continue
.partie8:
mov al,0h
out 44h,al ;met 0 dans P44h
.partie9 :
in al,11h ;prends la valeur de P11h
and al,9Fh ;désactive les bits 5 et 6
out 11h,al ;remet en P11h
;End

2.Reception [Top]
2.1 Théorie

La réception est un peu plus compliquée car on a un buffer d'un octet donc les valeurs s’empilent et il faut aller vite.

En observant les ports matériels, on s'aperçoit que l'on peut gérer l'arrivée d'un octet par le P0Eh ou bien par le P45h.

Mais nous allons vérifier une arrivée avec P45h car il nous indique aussi s'il y a des erreurs et une double vérification prendrait plus de temps car il faudrait vérifier P0Eh, vérifier P45h et prendre l'octet. On peut faire plus simple en prenant la valeur de P45h, vérifier le bit 1, si à 1, vérifié sur la même valeur déjà stockée les bits d'erreurs et prendre l'octet, certes plus complexe mais plus rapide.

Donc je vais vous décrire la façon comment attendre l'arrivée d'un octet avec la gestion des erreurs :
1. Initialiser le port (Initialisation Primaire)
2. Mettre 0 dans P44h (Pour initialiser toute communication)
3. Mettre l'identifiant de la Vitesse dans P47h
4. Mettre 41h dans P45h et la vitesse dans P44h (7 puis 0/4/8/C )
5. Prendre la valeur de P45h
6. Si le bit 1 est activé et que les bits 3 et 4 sont désactivés, continuer sinon retourner a 5
7. Prendre l'octet dans P44h (ceci va mettre le bit 1 de P45 à 0)
8. Analyser l'octet et s'il vous en faut un autre retourner a 6
9. Mettre 0 dans P44h (Pour réinitialiser la communication)
10. Désactiver les bits 5 et 6 du P11h

2.2 Pratique [Top]

Je vais vous traduire en Assembleur cette méthode pour attendre un octet et quitter , je mettrai aussi des commentaires pour plus de compréhension :


;Assembleur 286
;Méthode de réception d’un octet a 34800bps

.partie1:
in al,11h ;prends la valeur de P11h
or al,60h ;active les bits 5 et 6
out 11h,al ;remet en P11h
.partie2:
mov al,0h
out 44h,al ;met 0 dans P44h
.partie3:

mov al,21h ;vitesse principale
out 47h,al ;met dans P47h
.partie4:
mov al,41h;comm correcte
out 45h,al

mov al,3C ;réception à 38400bps
out 44h,al
.partie5:
in al,45h ;prends P45h
.partie6:
mov ah,al ;copie de sauvegarde
and al,2 ;prends le bit 1
cmp al,2 ;vérifie sa valeur
jne .partie6 ;si 0, re verification
mov al,ah ;reprise de la sauvegarde
and al,18h ;prends les bits 4 et 5
cmp al,0 ;si aucun activé continuer
je noerror
in al,44h ;vide le buffer
jmp .partie5 ;reverifie
noerror:
.partie7:
in al,44h ;prends la valeur reçue
.partie8: ;pas besoin d’analyse
.partie9:
mov al,0h
out 44h,al ;met 0 dans P44h
.partie10:
in al,11h ;prends la valeur de P11h
and al,9Fh ;désactive les bits 5 et 6
out 11h,al ;remet en P11h
;End

VI. Et le reste de la calculatrice [Top]

Cette nouvelle méthode permet en outre de permettre encore l’utilisation de toutes les autres fonctions de la calculatrice notamment le clavier.Mais pour la réception, la vérification d’arrivée doit être rapide et constant donc il n’est pas conseillé de s’absenter pour écrire plusieurs pixels ou vérifier le clavier.Il est même preferable de placer la routine de verification dans une interruption du Timer 1Ch qui est appelée sur Pc environ 18,2fois par secondes et sur la calculatrice environ 50 fois par secondes, ce qui permet de verifier un vitesse jusqu'a 390000bps, ce qui est largement suffisant pour verifier même la vitesse 115000bps.

Il est surtout préférable de vérifier le clavier avec les méthodes de touches multiples pour ne pas attendre et d’afficher un pixel le plus rapidement possible et si possible pixel par pixel pour laisser l'interruption se lancer. Aussi, il semble que l’envoi soit trop rapide donc il est conseillé de mettre entre chaque octet envoyé une ou deux instructions assembleur HLT pour faire plus fluide.

VII. Note sur les méthodes [Top]

Les méthodes précédentes sont faciles d’accès car on peut envoyer ou recevoir quand on veut aprés l'initialisation, c’est à dire que si vous envoyer un octet, après la partie 7 de l’envoi, vous pourrez de suite continuer après la partie 5 de réception. 
Pour changer de mode de reception il n'est pas necessaire de reconfigurer.

VIII. Mot de la fin [Top]
Voilà, j’espère que vous aurez compris et je pense que ces méthodes seront propices a un développement correct de Chat ou outils de communication performants.
Bonne programmation et si vous voulez des précisions :
Superna@ifrance.com



- Na-prod Casio Project – www.Na-Prod.fr.st
Merci à Whyp, BradN et Casio pour la complexité !!
Et a 2072 pour TOUCHE qui a enormement servit !!!