keyer16F628_1447Cet article est une application de l’UART, une des techniques de communication disponibles sur les PIC. USART, aussi appelé SCI, Interface de Communication Série est un dispositif qui peut être configuré en mode asynchrone full duplex ou en mode synchrone half duplex, maître ou esclave, pour communiquer avec des terminaux CRT, des ordinateurs personnels ou d’autres périphériques. Il s’agit dans ce projet d’établir une liaison entre mon ordinateur personnel et une machine construite autour d’un PIC disposant de l’USART.

1. Description du projet

1.1. Postulat de départ

Le manipulateur électronique décrit dans l’article précédent servira de base au projet. Je prévois de porter le programme du 12F675 avec un minimum de modifications vers un processeur disposant de l’USART et d’un peu plus de mémoire pour pouvoir y télécharger des messages à partir de mon ordinateur personnel. Mon choix s’est porté sur le 16F628 que j’avais en stock. En plus de l’USART, il dispose de 2K de mémoire FLASH, d’une EEPROM de 128 mots, de 1 ADC (pas directement voir ci-dessous). Je pourrais donc réutiliser le petit clavier de 9 touches. Il me faut réaliser une application hôte sur le PC qui commandera le PIC, et une interface, sur le PIC client. L’interface logicielle côté PIC devra être conçue comme un module indépendant réutilisable, utilisant un protocole de communication simple et un minimum de ressources.

1.2. Composants

1.2.1. Liaison série: asynchrone, convertisseur RS232 TTL MAX3232.

1.2.2. usartELoader: interface de chargement de l’EEPROM.
L’interface résidente sur le PIC est conçue comme un Bootloader. Le 16F628 ne disposant pas des possibilités d’écriture de son propre programme (self-programming), l’interface se limitera à l’écriture en EEPROM et à sa lecture pour en afficher le contenu.

Environnement de développement : MPLAB IDE v8.92.

Langage de programmation : assembleur MPASMWIN v5.51 pour obtenir un code compact. Moins de 170 mots mémoire, les quelques variables utilisées (moins de 10) sont temporaires et peuvent êtres redéfinies par l’application utilisateur.

Implantation : l’interface est logée en fin de mémoire.

Lignes de communication Emission/Réception : bornes TX et RX du PIC.

1.2.3. keyer16F628: manipulateur électronique.
Programme keyer12F675 porté sur le 16F628. Voir description dans l’article précedent.

1.2.4. keyerELoader: application hôte de gestion des messages préenregistrés du manipulateur électronique.

Environnement de développement et langage de programmation : IDE Microsoft Visual Studio C# 2010 Express.

Lignes de communication Emission/Réception : port série RS232.

2. Description fonctionnelle.

Le schéma figure 1 ci-dessous montre la distribution des composants de l’application.

Figure 1: keyer16F628 Schéma fonctionnel

Figure 1: keyer16F628 Schéma fonctionnel

3. Protocole de communication

L’interface usartELoader est munie d’un protocole de communication simple fonctionnant en half-duplex, l’émetteur attend toujours une réponse avant d’envoyer le message suivant.

Déclenchement: au reset, à la mise sous tension, usartELoader attend un code de LOGIN. Au bout d’un temps réglable (login timeout), en l’absence de réception de ce code, LOGOUT est exécuté et l’application utilisateur keyer16F628 est lancée. A réception du LOGIN le client renvoi le code et l’adresse d’implantation de usartELoader. L’application hôte keyerELoader est maintenant maître du PIC. UsartELoader se met en attente d’une commande de l’hôte.

Format de la trame de transmission:
une trame de transmission (ne pas confondre avec la trame  UART qui sera décrite plus loin) est composée de n bytes de 8 bits sous la forme qqbbbb,.. où qq= query code identifiant la trame et bb = byte de donnée ou d’adresse. Dans ce qui va suivre le sens de la transmission est vu du côté PIC: TX = émission du PIC vers l’hôte, RX = réception en provenance de l’hôte. La trame TX se termine par 0A (new line).

LOGIN:
Format RX: « L »
Description: au reset, à la mise sous tension, attente de ce code pendant le temps de connexion
Format TX: « L »aaaa0A
Description: LOGIN accepté , aaaa = 16 bits adresse d’implantation de usartELoader.

LOGOUT:
Format RX: « X »
Description: sortie de usartELoader et exécution de keyer16F628, généré au timeout ou envoyé par l’hôte.

WRITE EEPROM:
Format RX: « E »aaaaddddck
Description: demande d’écriture, aaaa = 16 bits adresse , dddd = 16 bits donnée, ck = 8 bits de poids faible de la somme de contrôle.

WRITE ACK:
Format TX: « K »0A
Description: accusé de réception de l’écriture.

DATA ERROR:
Format TX: « ! »0A
Description: erreur d’écriture.

CHEKSUM ERROR:
Format TX: « ? »0A
Description: erreur de la somme de contrôle.

BOUNDARY ERROR:
Format TX: « $ »0A
Description: erreur d’écriture hors limite.

PRINT EEPROM:
Format RX: « P »aaaa
Description: demande de la donnée située à l’adresse aaaa = 16 bits adresse.

PRINT EEPROM:
Format TX: « P »dddd0A
Description: donnée dddd à afficher.

4. Structure d’une trame UART

Notre trame UART est constituée des bits suivants :

  • un bit de start servant à la synchronisation du récepteur,
  • 8 bits de données,
  • pas de bit de parité,
  • un bit de stop.

5. Interface usartELoader

5.1. Description

Le module usartELoader, figure 2 ci-dessous, démarre à la mise sous tension, au reset du PIC. Une première boucle attend la réception de la trame de LOGIN. En cas de non réception dans le délai fixé (timeout) une trame de LOGOUT est générée. A réception, s’il s’agit d’une trame de LOGIN, usartELoader traite le LOGIN, enclenche sa boucle principale et se met sous contrôle du programme hôte keyerELoader. S’il s’agit d’une trame non identifiée, une trame de LOGOUT est générée.

Figure 2: usartELoader

Figure 2: usartELoader

5.2. Paramètres d’installation

L’interface usartELoader a besoin des paramètres suivants:

  • EEPROM_SIZE: taille de l’EEPROM,
  • FLASH_PROG_SIZE: taille la mémoire FLASH,

Dans le cas du 16F628 qui a 2K de mémoire FLASH et 128 mots d’EEPROM:

  • EEPROM_SIZE = 7F,
  • FLASH_PROG_SIZE = 7FF.
5.3. Paramètres du TIMER

Le délai de LOGIN est réglé par les paramètres suivants:

  • ELOADER_TIMER1_OVF: nombre de débordement de TIMER1,
  • ELOADER_TIMER1: Base de TIMER1,
  • ELOADER_T1CKPS  valeur du prédiviseur.

Avec un oscillateur XTAL = 4 MHz, le délai est fixé à 25 s environ avec les valeurs suivantes:

  • ELOADER_TIMER1_OVF = 200,
  • ELOADER_TIMER1 = 0,
  • ELOADER_T1CKPS  = 2.

Bien entendu, d’autres combinaisons sont possibles pour obtenir le même résultat. Le logiciel keyerELoader décrit plus loin, fournit les outils pour calculer différentes combinaisons de TIMER1, TIMER1_OVF, T1CKPS en fonction de la fréquence d’horloge et du délai souhaité. Ce délai pratique pour le test, s’ avère assez long à l’usage courant, il est intéressant de la réduire à moins de 10s environ.

5.4. Paramètres de l’UART

Ces paramètres servent à régler les 2 registres d’émission TXSTA et de réception RCSTA:

  • SPBRG_VALUE: Baud Rate (nombre de bits/s),
  • SPBRG_BRGH: Haute ou basse vitesse pour le calcul de SPBRG.

Avec un oscillateur XTAL = 4 MHz et une vitesse de 9600 Bauds les valeurs sont:

  • SPBRG_VALUE = 25,
  • SPBRG_BRGH = 1 Haute vitesse.

Le logiciel keyerELoader décrit plus loin, fournit les outils pour calculer différentes valeurs SPBRG et le taux d’erreur. Attention cependant à bien prendre en compte les ordres de grandeur du temps. Avec les valeurs choisies,
le temps d’émission d’une trame UART = (1s / 9600 bauds) * 10 bits = 1042 us, temps 1000 fois plus long que la durée du cycle de base d’une instruction
avec une horloge à 4MHz = 4/4 = 1 us.

6. Application keyerELoader

6.1. Description

L’application keyerELoader permet d’enregistrer les messages du manipulateur dans le PIC. Elle fournit en outre l’affichage de l’EEPROM et des outils pour aider à paramétrer usartELoader. Elle utilise pour la liaison série la classe SerialPort. Un bon exemple d’application de cette classe est donné sur le site Microsoft Most Valued Professionals par Noah Coad dans le SerialPortTerminal. Visual Studio offre la prise en charge de la localisation des applications Windows, ainsi une option de keyerELoader permet de choisir le français ou l’ anglais.

6.2. Fenêtre principale – Onglet Edition

La fenêtre principale, figure 3 ci-dessous, permet:

  • d’entrer les paramètres de transmission,
  • d’ouvrir le port,
  • de se connecter au PIC (LOGIN) ou de se déconnecter (LOGOUT),
  • de saisir l’indicatif, les messages et leur propriété,
  • d’envoyer les messages au PIC,
  • de visualiser l’EEPROM,
  • de suivre les opérations sur le journal (LOG).
Figure 3: keyerELoader - Fenêtre principale

Figure 3: keyerELoader – Fenêtre principale

6.3. Fenêtre principale – Onglet Paramètres

La fenêtre, figure 4 ci-dessous, présente tous les paramètres de l’application. L’application est livrée avec les valeurs par défaut liées au 16F628. Ces valeurs peuvent être adaptées à un autre PIC. Pour prendre en compte les changements, enregistrer, quitter l’application et relancer.

Adresse EEPROM de départ:
Indiquer ici, en hexadécimal, l’adresse à partir de laquelle l’indicatif et les messages seront enregistrés. Important: usartELoader enregistre l’indicatif et les messages dans un buffer de l’EEPROM qui peut être placé librement dans l’EEPROM, adresse et dimension maximale définies par le programme utilisateur. A l’intérieur de ce buffer, l’indicatif et les messages sont de longueur variable. Les données de l’EEPROM extérieure à ce buffer ne sont pas modifiées. Ceci permet de garder des informations propres à l’application utilisateur.

Taille maximale du buffer EEPROM:
Indiquer ici, la longueur maximale du buffer des messages réservé dans l’EEPROM. Description du buffer:

  • indicatif n bytes = aaaa…aa00 où aa = caractère de l’indicatif, 00 = fin,
  • message n bytes = 02iiaaaa…aa0002 = en-tête,  ii = identifiant du message, aa = caractère du message, 00 = fin.

Longueur maximale du message:
Indiquer ici, la longueur maximale du texte du message qui pourra être saisi. Quelle que soit la longueur maximale indiquée, la longueur totale des messages+caractères d’entête et de fin+indicatif <= Taille maximum du buffer de l’EEPROM.

Identifiant du message:
L’identifiant n’est autre que le numéro du bouton qui commande l’émission du message. Se reporter à l’article précédent manipulateur électronique 12F675.

Intervalle de temps du timer:
Temps en ms de rafraichissement de la liste des ports disponibles. Ne pas modifier sauf si dysfonctionnement.

Figure 4: keyerELoader - Paramètres

Figure 4: keyerELoader – Paramètres

6.4. Outils

Le chapitre outils du menu offre 2 calculateurs pour aider à paramétrer usartELoader: l’un pour la vitesse transmission, l’autre pour le délai d’attente  à la connexion (Login timeout).

6.4.1. Calculateur de SPBRG

La fenêtre, figure 5 ci-dessous, présente le calculateur. On se reportera utilement au document de MICROCHIP qui explique le calcul.

Paramètres:

  • fréquence de l’oscillateur en Hz: 4 MHz par défaut,
  • taux d’erreur accepté en %: 4 % maximum,
  • la case cochée sert à garder les derniers paramètres.

Le Tableau présente les combinaisons possibles sur 7 colonnes:

  • SPBRG (SPeed  Baud Rate Generator),
  • Débit calculé en basse vitesse en Baud,
  • Taux d’erreur,
  • Débit désiré en basse vitesse en Baud,
  • Débit calculé en haute vitesse en Baud,
  • Taux d’erreur,
  • Débit désiré en haute vitesse en Baud.
Figure 5: keyerELoader - Calculateur du SPBRG

Figure 5: keyerELoader – Calculateur du SPBRG

6.4.2. Calculateur de délai d’attente de connexion

La fenêtre, figure 6 ci-dessous, présente le calculateur.

Paramètres:

  • fréquence de l’oscillateur en Hz: 4 MHz par défaut,
  • délai en seconde: 100 s maximum,
  • la case cochée sert à garder les derniers paramètres.

Le Tableau présente les combinaisons possibles sur 4 colonnes:

  • Prédiviseur du TIMER1,
  • Base de comptage de TIMER1, le compteur est incrémenté à partir de cette valeur,
  • Nombre de débordements de TIMER1,
  • Délai en seconde.
Figure 6: keyerELoader - Calculateur du délai d'attente de connexion

Figure 6: keyerELoader – Calculateur du délai d’attente de connexion

 

7. Migration du code du PIC 12F675 vers le PIC 16F628

7.1. Description

Le code est installé dans la mémoire du 16F628 au-dessus du code de usartELoader comme le montre la figure 1. Un premier coup de compilateur déroule une longue liste d’erreurs. C’est impressionnant mais pas vraiment méchant. Voici dans l’ordre les adaptations réalisées:

  • assignation des PORTS,
  • reprogrammation de l’ADC,
  • gestion des interruptions.
7.2. Assignation des PORTS
Figure 7: assignation des ports

Figure 7: assignation des ports

Où l’on vérifie l’efficacité de nos définitions. La table figure 7, ci-contre, montre la projection du 12F675 vers le 16F628. Il faut noter que l’ ADC consomme 2 broches. Ont été ajoutés, les liaisons UART pour usartELoader. Cette partie du travail a été réalisé facilement  par l’utilisation des #define.

7.3. Reprogrammation de l’ADC

Le 16F628 ne dispose pas directement de l’ADC mais comme je disposais du 16F628, j’ai fait avec ce que j’avais. Dans sa note AN700 MICROCHIP décrit comment câbler et programmer le Delta Sigma ADC. J’ai repris trait pour trait son schéma, mot pour mot le code. Un bon exemple d’application de la note AN700 est donné sur le site de SPRUT à l’article « PIC-Lernbeispiel: ADC mit Komparator aufbauen ».

Figure 8: Extrait figure 1 note AN700 MICROCHIP

Figure 8: Extrait figure 1 note AN700 MICROCHIP

La figure 8, ci-contre, montre le diagramme du circuit qui, transposé sur le PIC nécessite 2 ports: AN et CMP et un intégrateur. C’est un peu plus lourd que le 12F675 et aussi 1000 fois plus lent. Pour obtenir un résultat sur 10 bits, avec le 12F675 nous sommes dans l’ordre de la us, ici nous sommes dans l’ordre de la ms. Mais pour un clavier manuel cela est acceptable.
Le code de la routine ADC du 12F6275 est chargé de fournir les registres ADRESH et ADRESL à la routine keystroke. Le travail a consisté à remplacer le code de la routine par celui de la note AN700, les registres ADRESL et ADRESH qui n’existent plus dans le 16F628 ont été simplement ajoutés dans la RAM pour conserver la compatibilité avec le programme. Les premiers essais ayant montré un fonctionnement aléatoire des touches j’ai ajouté un bout de code pour prélever une série d’échantillons et ne garder que le résultat le plus grand. Avec cette méthode, j’obtiens un fonctionnement plus sûr. Les résistances du clavier, figure 9 ci-dessous,  sont toujours dans le même rapport 3:1 mais leurs valeurs ont été adaptées. Après essais, j’ai opté pour  3K et 1K.

Figure 9: Clavier et intégrateur

Figure 9: Clavier et intégrateur

Méthode d’étalonnage

Comme pour le 12F675, de la précision de l’étalonnage du clavier dépendra le fonctionnement précis du clavier. Le clavier a été ré-étalonné. Cela est fait facilement en utilisant keyerELoader, l’EEPROM, à l’oreille par l’écoute du signal différent émis à la pression de chaque touche. Le programme enregistre en EEPROM les valeurs obtenues à chaque pression de touche (#define __ADRES_TRON). Commencer par attribuer dans la table ADC_Vth_TABLE à chaque touche un intervalle assez large. Lire ensuite le résultat dans l’EEPROM en utilisant KeyerELoader. Retoucher et réduire l’intervalle. Peaufiner jusqu’à obtenir un intervalle qui marche à tous les coups. Désactiver (#define    __ADRES_TRON). Voici les nouveaux paramètres:

; Fitted after real analyze

#define KPAD_00_MAX (1016+16)  ;key 0,0 (maximum maximorum)
#define KPAD_00_MIN (1016-4)   ;key 0,0
#define KPAD_10_MAX (757+5)    ;key 1,0
#define KPAD_10_MIN (757-5)    ;key 1,0
#define KPAD_20_MAX (605+5)    ;key 2,0
#define KPAD_20_MIN (605-5)    ;key 2,0
; Row 1
#define KPAD_01_MAX (502+6)    ;key 0,1
#define KPAD_01_MIN (502-6)    ;key 0,1
#define KPAD_11_MAX (438+5)    ;key 1,1
#define KPAD_11_MIN (438-5)    ;key 1,1
#define KPAD_21_MAX (385+5)    ;key 2,1
#define KPAD_21_MIN (385-5)    ;key 2,1
; Row 2
#define KPAD_02_MAX (345+5)    ;key 0,2
#define KPAD_02_MIN (345-5)    ;key 0,2
#define KPAD_12_MAX (308+7)    ;key 1,2
#define KPAD_12_MIN (308-8)    ;key 1,2
#define KPAD_22_MAX (287+5)    ;key 2,2
#define KPAD_22_MIN (287-5)    ;key 2,2

; NO KEY
#define KPAD_FF_MAX 256        ; no key
#define KPAD_FF_MIN 0          ; no key

On se reportera à l’article précédent du 12F6275. A ce stade le clavier ne sait pas encore quelle fonction activer. Une liste d’assignation lie la touche à sa fonction. Le clavier peut ainsi être personnalisé. En cas de changement d’assignation de touche de message il faut aussi modifier le paramètre Identifiant du Message dans keyerELoader (voir ci-dessus).

7.4. Schéma

La figure 10, ci-dessous, montre le circuit recâblé avec le 16F628. Le MAX3232 n’y est pas représenté. Voir au paragraphe 8, ci-dessous, la connexion.

Figure 10: Schéma CW Keyer 16F628 RS232

Figure 10: Schéma CW Keyer 16F628 RS232

Download  Télécharger tous les programmes sources, hex, exe, et fichiers: usartELoader: interface de liaison série EEPROM Loader avec petit programme démo. + keyer16F628+usartELoader: CW keyer avec liaison série + keyerELoader VISUAL C# 2010 projet complet avec sources et exe+Schémas Kicad+Schémas Inkscape.

Figure 11: module MAX3232 DB9

Figure 11: module MAX3232 DB9

8. Liaison RS232

L’interface PC est le convertisseur TTL/RS232 MAX3232. Comme le montre la photo qui introduit l’article, j’utilise un petit circuit pas plus grand qu’un timbre-poste acheté sur Ebay pour moins de 1 euro frais de port inclus. Ce circuit est livré complet, câblé, prêt à l’emploi, avec le MAX3232, une petite LED témoin, la prise DB9 et 4 fils de liaison à enficher d’une vingtaine de cm. Le circuit est sérigraphié. Relier RX à l’entrée RX du PIC, TX à TX du PIC, GND à la masse, VCC à VDD = 5V.

9. Tests – Réglages

Le circuit a été monté sur platine d’expérimentation comme le montre la figure 12 ci-dessous. Le clavier, est réduit à ses parties essentielles: ses résistances, et un fil muni d’une pointe de touche qui joue le rôle de bouton (voir figure 9). A noter la liaison simple au module MAX3232 qui est alimenté en 5V comme le PIC. Il est relié au PC par un câble direct, récupéré sur un vieux modem mais une connexion avec les 3 fils utiles (broches 2, 3, 5 de la DB9) peut être réalisée.

Figure 12: keyer16F628 sur platine d'expérimentation

Figure 12: keyer16F628 sur platine d’expérimentation

A suivre..

 

Index des articles de la catégorie microcontroleur