Le port Communication
Pour la Casio AFX/2 (Graph100)
Sommaire
I. Généralités [Top]
Le port communication quutilise 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 dentré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 decriture=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
|
N°
|
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 lenvoi 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 :Sil 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
|
N°
|
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
|
N°
|
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 denvoi a 4.92 V
Bit 0,1,2,3,4,7 : Inconnu.
4. P44h : Gestion du port comm.
Par défaut : 00h L/E
|
N°
|
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 lon veut
Ex : Mode Envoi à la 2e vitesse 54h
|
N°
|
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.
|
N°
|
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 quun octet est reçu
Bit 2 : Indique quun 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.
|
N°
|
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 denvoi
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]
Linitialisation 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 linterruption
du clavier : LInt 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 loctet à 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 denvoi dun 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 sempilent 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 dun 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 danalyse
.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 lutilisation
de toutes les autres fonctions de la calculatrice notamment le clavier.Mais
pour la réception, la vérification darrivée doit
être rapide et constant donc il nest pas conseillé de sabsenter
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 dafficher
un pixel le plus rapidement possible et si possible pixel par pixel pour laisser
l'interruption se lancer. Aussi, il semble que lenvoi 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 daccès
car on peut envoyer ou recevoir quand on veut aprés l'initialisation,
cest à dire que si vous envoyer un octet, après la partie
7 de lenvoi, 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à, jespè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 !!!