CAMPAC - Eléments techniques
Le Campac de Futaba est basé sur une liaison type I2C, c'est à dire qu'il utilise en plus de la masse et de l'alimentation 5V deux fils SDA pour les données et SCL pour l'horloge.
Le protocole de dialogue I2C peut être trouvé et expliqué en de nombreux endroits, donc je ne m'étends pas dessus. Je reviens juste sur ce qui est nécessaire.
Les premières mémoires étaient des 16k avec un dialogue I2C classique : Une condition de départ donne le top pour transmettre 8 bits de commande et attendre un bit accusé de réception, ensuite, transmission d'une adresse pour une écriture ou attente des données lues dans la mémoire. Il peut y avoir ensuite une condition d'arrêt, mais ce n'est pas obligatoire.
La condition de départ c'est un front descendant de SDA survenant pendant que SCL est à l'état haut. Si je le précise maintenant c'est parceque là j'ai eu des misères.
Les 8 bits de commande pour les 24LCxx c'est toujours 1010bbbc avec c = 0 pour une écriture, 1 pour une lecture.
Pour une 64k, l'adresse nécessite plus qu'un seul octet et ce sont donc deux octets qui suivent l'octet de commande.
Pour Futaba, le protocole reste avec un dialogue sur 2 octets seulement, l'octet de commande de format 00aaaaac où aaaaa est le poids fort de l'adresse suivi d'un octet, le poids faible d'adresse. On arrive ainsi à un espace adressable sur 13 bits soit de 8 ko soit encore de 64 kbits.
Une mémoire de 512k s'adresse sur 16 bits, mais Futaba ne peut utiliser cette mémoire avec son protocole qui ne permet que 13 bits d'adresse. En effet, le 00 en tête de l'octet de commande est obligatoire pour différencier une 64k d'une 16k qui elle commence par 10.
L'utilisation d'une 512k avec le CampacSL ne peut donc se faire que par juxtaposition de 8 banques de 64k. La banque courante est mémorisée dans l'EEPROM du PIC et modifiée par la procédure que vous avez constatée dans le mode d'emploi à l'aide du poussoir.
Le travail du PIC est donc de convertir le protocole FUTABA en un protocole classique de mémoire 24LCxx avec xx compris entre 64 et 512. Il doit donc lire l'octet de commande, envoyer à la mémoire un octet de commande qui commencera par 1010, lire le type de commande (ecriture ou lecture) et selon le cas lire la mémoire pour transmettre les données au Campac ou obtenir du Campac les données à écrire dans la mémoire. Ce n'est pas simple, il ya quelques lignes de programme à écrire.
Ce travail du PIC est présenté sur le diagramme ci dessous. Cliquez sur l'image pour l'agrandir puis sur le symbole de mise à la taille réelle en bas à droite dans l'image.
L'exemple ci-dessus montre l'écriture à l'adresse 0x250 de la valeur 0x85. 0x indique une valeur hexadécimale.
A l'instatnt t=0 on a la condition de départ suivie d'une commande d'écriture. Ne pas oublier le bit d'acquitement de chaque octet si vous voulez bien suivre le dialogue. Un PIC cadencé à 4 MHz n'est pas assez rapide pour faire ce travail, d'où le choix d'un quartz 20 MHz gérant l'horloge. Une fréquence moindre aurait fait l'affaire, mais qui peut le plus peut le moins...
Le problème rencontré vient de la reconnaissance par le programme de la condition de départ. On peut penser en effet que rien n'est plus simple que de reconnaitre un front descendant de SDA et de vérifier qu'il a bien lieu pendant un état haut de SCL. Et bien oui et non. Avec la FF9, le programme écrit fonctionne bien. Ce programme scrute en permanence les entrées, recherche une variation de ces entrées et traite si il le reconnait la condition de départ. Avec la FX14, le signal est semblable, mais si dans 90% des cas cette reconnaissance se fait bien, de temps en temps, elle échoue et le Campac n'est pas reconnu. Et je ne sais par pourquoi.
J'ai donc modifié le programme de reconnaissance en faisant tourner en boucle simple le programme qui attend un IRQ sur changement d'état de SDA. De là, si ce changement est un front bas et si SCL est haut, on part en traitement de condition de départ. Là, avec la FX14, ça marche assez bien. Mais avec la FF9, de temps en temps, la reconaissance de la condition de départ ne se fait pas et le Campac n'est pas reconnu. Allez donc savoir pourquoi, à cette heure je n'ai pas trouvé. On pouvait penser que l'informatique était une science exacte et répétitive, là on est plutôt dans la logique floue...
Maigre consolation, ni le Mempac de Puzin ni l'ultrapac qu'on trouve proposé sur le net ne fonctionne avec la FX14. Par contre, le Campac Futaba fonctionne bien sur les deux radio.
Pour ceux que ça interesse, voici la zone incriminée. Pour la FX14, le paramètre Radio est à 14, pour la FF9 il est à 9.
Org 4 ; vecteur IRQ
if Radio ==14
clrf Cmd
movfw GPIO
andlw BinSDACampac + BinSCLCampac
sublw BinSCLCampac
btfsc STATUS,Z
incf Cmd
bcf INTCON,GPIF
endif
retfie
;=========================
AtCommande:
AtCondDepart:
if Radio ==
9
movfw GPIO
andlw BinSDACampac + BinSCLCampac
movwf Cmd ; Etat à t0 dans Cmd
SCLMemoireIN
AtFront:
btfss SCLMemoire ; Appui sur le poussoir
goto BanqueActive ; pour indiquer la banque active
movfw Cmd
movwf SvCmd ; Etat à t0 dans SvCmd
movfw GPIO
andlw BinSDACampac + BinSCLCampac
movwf Cmd ; Etat à t1 dans Cmd
movfw GPIO
movwf SvCmdM
movfw Cmd
xorwf SvCmd,W
sublw BinSDACampac
btfss STATUS,Z
goto AtFront
movfw Cmd
sublw BinSCLCampac
btfss STATUS,Z
goto AtFront
btfss SvCmdM,BitSCLCampac
goto AtFront
endif
if Radio ==
14
movlw b'11001000'
movwf INTCON
SCLMemoireIN
AtStart:
btfss SCLMemoire ; Appui sur le poussoir
goto BanqueActive ; pour indiquer la banque active
btfss Cmd,0
goto AtStart
clrf INTCON
endif
Si certains veulent aller plus loin, ils peuvent prendre directement contact avec moi à mon adresse sylvain.lichtenberger et c'est chez ac-lyon.fr.
Il y a quand même encore un petit dysfonctionnement avec la FX14 : pendant le fonctionnement normal de la radio, on peut bouger les trims. Cette manoeuvre est bien prise en compte, mais mal mémorisée. C'est à dire que quand on éteint et rallume la radio, on ne revient pas toujours sur la bonne position pour les trims. C'est le seul cas où j'ai constaté un défaut de mémorisation, toujours dû à une mauvaise reconnaissance de la condition de départ. Comme en cours de vol, il n'y a pas appel à la mémoire autrement que pour écrire la position des trims en vue du prochain redémarrage de la radio, il n'y a pas de risque pour le modèle.
A suivre ?