retour index

Exemple d’utilisation d’un processeur PIC pour la composition d’un numéro de téléphone,
selon la norme DTMF ‘Dual Tone Multiple Frequency’.

Plusieurs versions de ce genre de générateur ont déjà été proposés, y compris par le fabricant du processeur (Microchip : AN543, AN655, AN616).
J’ai réalisé un mélange de tout cela, et adapté au PIC16F628, qui pour un prix très raisonnable offre des possibilités très évoluée (3 timers par exemples, et un générateur de PWM).
Ce que je présente aujourd’hui, est extrait d’une réalisation plus complexe, dans laquelle une tonalité d’attente devait aussi être générée.
J’utilise le PWM et le Timer 2 pour générer la tonalité d’attente et la tonalité de fréquence haute en cours de composition. Le Timer 0 sert à générer la tonalité basse, alors que le Timer 1 sert de base de temps, à environ 1 seconde (à 4 pour 1000 prêt), pour d’autres parties du programme, et ½ seconde pour les impulsions de composition du numéro.

La génération de fréquence par un processeur est relativement aisée. Ce qui l’est un peu moins, c’est la transformation du signal carré généré en une sinusoïde suffisamment pure pour être acceptée par les centraux téléphoniques.
D’après Mr Fourier, le développement en série d’un signal carré donne des coefficients nuls pour tous les harmoniques pairs, c’est à dire que les termes en 2f, 4f, etc.. sont nuls. Il ne reste que des coefficients pour les harmonique impairs (3f, 5f, etc..) Voilà qui va nous simplifier la vie.
Les fréquences utilisées par le téléphone sont :


697Hz, 770Hz, 852Hz, 941Hz pour la tonalité basse, et
1209Hz, 1336Hz, 1477Hz, 1633Hz pour la tonalité haute.

Si par exemple, l’harmonique 2 de la première fréquence était présente, (1394Hz), il serait absolument impératif de la faire disparaître quasi complètement, étant dans la plage des fréquences de la tonalité haute, tout en laissant passer la fréquence haute de cette plage basse (941Hz). Pas simple à réaliser... Heureusement, et conformément aux calculs de Mr Fourier, la première harmonique générée sera l’harmonique 3 à 2091Hz, beaucoup plus éloignée.

Les combinaisons de fréquences à produire sont les suivantes :


La fréquence de 1633 Hz ne sert pas , étant affectée aux quatre lettres A, B, C, D, non utilisée dans le cas de la composition d'un numéro.
Il y a deux parties à considérer dans cette étude :

Commençons par la partie programmation.

  • Le programme
  • Le processeur utilisé est un PIC 16F628 de chez Microchip. Pourquoi ce processeur ?
    Je pourrais dire pourquoi pas, mais il y a tout de même des raisons :
    D’abord c’est un processeur RISC ‘Reduced Instructions Set Core). Avec un jeux de 35 instructions faciles à retenir, on fait tout, et en plus, rapidement. 1 cycle par instruction.
    Rien à voir avec les processeurs qui se retrouvent avec 3 ou 4 octets de code rien que pour une instruction.
    Les programmes de développement sont gratuitement accessibles, et les outils très peu chers (je ne suis pas payé par Microchip...)
    Le brochage de ce processeur est commun à toute une série, ayant d’autres performances, et compatibles avec les anciens, comme le 16F84 bien connu, ce qui permet de faire évoluer son montage, sans reprendre à chaque coup le dessin du circuit. (un sacré avantage..)
    Enfin, ces circuits sont d’un prix tout à fait raisonnable et l’approvisionnement en est facile.
    Après toute cette pommade, revenons au programme.
    Le listing est donné dans le fichier joint zippé, extrait.zip.
    Je ne donne que les parties relatives à la fonction décrite ici, le programme complet faisant bien d’autres choses.
    La fréquence du quartz est de 11,059Mhz, valeur courante dans les systèmes de communication, et qui nous permet d’obtenir une bonne précision sur les valeurs générées.
    D’abord à l’initialisation, il faut paramétrer les trois timers :
    Timer0 :
    La source du timer0 est fixée sur l’horloge interne, par le bit 5 du registre " OPTION " à 0.
    Le bit 5 du registre INTCON à 0, arrête le timer0. Il sera mis en route quand ce sera nécessaire.
    Timer1 :
    Sur l’horloge interne (Fquartz / 4), et prescaler à 0, interruption autorisée par le bit 0 (TMR1IE) du registre PIE1 (en bank 1).
    Timer2 :
    Réglé au départ pour générer la tonalité d’attente.
    Les deux bits T2CKPS1 et PS0 à 10 donne un prescaler de 16. Le module comparateur CCP1 est utilisé pour faire fonctionner le PWM, en positionnant les bits 2, 3, 4 et 5 du registre CCP1CON.
    Le registre PR2 permettra de fixer la fréquence générée.
    La notice du 16F628 nous donne la relation :
    PWM période = (PR2 + 1) * 4 * Tosc * prescale TMR2,
    ce qui nous permet de tirer la valeur à mettre dans PR2 pour une fréquence donnée :
    PR2 +1 = PWM période / (4 * Tosc * TMR2 prescale) .

    Les valeurs à donner à PR2, pour obtenir chacune des 4 fréquences sont les suivantes :
    avec Tosc = 1 / 11059 = 90,4ns, soit 4 * Tosc = 361,7ns et prescaler = 16


    Les écarts sur les valeurs nominales sont largement acceptables, puisque toujours inférieures à 2/1000.

    Pour la génération de la tonalité basse, le timer TMR0 n’ayant que 8 bits, on utilise un compteur complémentaire qui va compter le nombre de fois que le TMR0 recycle avec la valeur de preset.
    Le fonctionnement est le suivant :
    On utilise deux tables, donnant l’une, le nombre de fois que le timer doit tourner, et l’autre, la valeur du chargement de TMR0.
    Quand la génération commence, on charge le TMR0 avec la valeur de la table table_tmr0_2, et la sortie est mise à 0. Le Compteur est chargé avec la valeur lue dans la table table_tmr0_1. Chaque instruction, incrémente le TMR0, jusqu’à 0xFF où une interruption est déclenchée.
    On décompte alors le compteur, et on recharge TMR0 avec la valeur de la table_tmr0_2, ainsi de suite jusqu’à ce que le compteur soit à 0. A ce moment, la sortie est mise à 1, et le compteur est rechargé à la valeur de la table_tmr0_1, puis le cycle reprend, jusqu’à ce que l’on décide d’arrêter le Timer0.
    Ainsi, pour la fréquence de 697Hz, on charge le TMR0 avec 0x39 (57) et on fait tourner 9 fois le timer, avant de générer un changement de sortie.
    Le nombre d’instruction entre l’entrée de la fonction d’interruption et l’instruction de rechargement du TMR0 a une influence sur la fréquence de sortie.
    C’est pour cette raison que le traitement de l’interruption du TMR0 est traitée immédiatement après les préliminaires, laissant toute liberté pour travailler sur le reste du programme, sans interférer avec le réglage de fréquence.

    Pour éviter de retourner interroger les tables à chaque passage, les valeurs pour la fréquence en cours de génération sont stockées dans deux registres temporaires mem_Cpt1 pour la table 1, et mem_tmr0 pour la table 2.

    Donc, pour générer un double tonalité, il faut récupérer les paramètres relatifs à chaque générateur. Pour cela, on utilise 3 tables. Les deux premières ont déjà été mentionnées ci-dessus, et la troisième, table_pwm, donne la valeur à charger dans le registre PR2 du Timer2.
    Ensuite, on charge les registres avec les valeurs lues et mémorisées dans des registres temporaires.
    Puis, lorsque tout est en place, on libère les deux timers, par leur flags TMR2ON et T0IE.
    La composition d’un numéro de téléphone suppose que l’on a stocké quelque part dans un buffer, la suite des chiffres à envoyer.
    Cela est fait par une autre partie du programme, non décrite ici, et qui gère aussi la saisie au clavier..
    Le numéro est stocké dans le buffer appelé InBuf, et sa longueur est dans un registre ‘L_num'.
    La fonction " composition " du programme proposé s’occupe de récupérer les chiffres les uns après les autres, et de lancer la génération des tonalités.
    Chaque tonalité doit durer un temps quelconque, supérieur à 100ms pour être pris en compte.
    J’ai choisi 0,5 seconde, parce que c’est facile à compter, à partir du compteur de secondes installé par le timer1.
    Avec la fréquence quartz choisie, le Timer1 doit recycler 38 fois pour cadencer la seconde.
    Si au passage à 19, on bascule un flag, on obtient notre fenêtre d’une demi seconde.
    La génération des tonalités ne commence que quand ce flag monte à 1, et s’arrête quand il redescend.
    Chaque chiffre est représenté par une combinaison de fréquences. Ces combinaisons sont données par une quatrième table table_ton, dont chaque sortie fournie 2 valeurs dans l’octet de sortie. Par les quatre bits de poids fort, on défini l’entrée des tables tmr0_1 et 2, et par les quatre bits de poids faible, on défini l’entrée de la table table_pwm.
    Je pense que les commentaires du listing devraient suffire à expliquer le reste..

  • Le schéma
  • Il est donné par le fichier PDF joint
    Rien de particulier autour du processeur. Les points à signaler résident dans les filtres de sortie.
    Ce sont deux filtres passe-bas, à contre-réaction multiples.
    J’avais essayé d’abord de réaliser des filtres passe bande simples, mais pour rejeter correctement l’harmonique 3 de la fréquence la plus basse, on avait une atténuation inadmissible sur la fréquence la plus élevée.
    Il aurai alors fallu réaliser un filtre à plusieurs amplis opérationnels, ce qui sortait des limites du matériel autorisé.
    Je me suis donc contenté de filtres passe-bas, qui font parfaitement l’affaire, la première harmonique qui pourrait être gênante se trouve atténuée de plus de 30 db.
    Cette atténuation est nécessaire, afin que le signal envoyé soit pris en compte par le central.
    Quelques essais préliminaires, avec une atténuation moindre m’ont démontré cette nécessité. Rien de dramatique. Le central vous ignore tout simplement. C’est déprimant...
    Revenons à ces filtres.
    Le circuit utilisé est très classique, mais complété par un filtre passe-bas en entrée, 2 résistances et un condensateur.
    Chaque sortie du PIC rentre sur un filtre différent, les limites de bande n’étant pas les mêmes.
    Les deux fréquences issues des ces filtres sont appliquées à un troisième ampli op, monté en sommateur, tout à fait classique, dont la sortie est dirigée vers la ligne téléphonique par l’intermédiaire d’un transfo de ligne 600 ohms.
    Ce transfo est absolument nécessaire, afin d’isoler notre montage de la ligne téléphonique.

    retour index