Version 0.0 : 25/10/2022
rev : 06/12/2022

Etude Projet Portier Audiophone DTMF 2022
avec PIC18F27K42 en pdip 28


Présentation
Schémas
Affectations des Pins MCUs
Le BUS audio numérique
Les Outils

Prototypage pour validation des différents constituants du projet :
test , partie IOC (Boutons Poussoirs)

1er test Decodeur Hardware DTMF9170B : problemos !
2em test Decodeur Hardware DTMF9170B ..OK
Test envoi séquence C89*#ABC avec SQA Analyser

Test génerateur DTMF via sortie PWM 18F27K42 avec fichiers Wav (en ASM)
Test génerateur DTMF via sortie PWM 18F27K42 avec fichier Wav (MikroC Pro 7.60)

Test génerateur DTMF via sortie PWM 18F27K42 algorytme (DDS) de Roman Black (MikroC Pro 7.60)
Test génerateur DTMF .. idem ..mais avec MPLAB XC8 (rev 06/12/2022)

Simulation : injection du signal DTMF PIC sur carte HOME Audio et visu sur le BUS


lien :
Décodeur DTMF software (Arduino the Simple)

docu :
PIC Datasheet MCU (en pdip28 ,PIC18FxxK42 DS 40001919B rev 2017)



Présentation
Portier Audio / video /numerique, liaison entre deux postes espacés de ~200 metres
Communication entre un module nommé HOME et un autre module nommé STREET

situé à environ 200M de distance.
* Transport de la voix dans les 2 sens
* Transport d'informations tout ou rien dans les 2 sens
La liaison entre les 2 modules se fait sur UN BUS bidirectionnel , materialisé par une paire téléphonique classique.

Usage de modules spécialisés DTMF : Emetteur et Recepteur
largement utilisés en Téléphonie, pour le tranport d'information logiques .
Ici utilisés pour relier les 2 MCU ( 1 PIC18F27K42 sur chaque module)
1 info DTMF = 1 couple de 2 frequence simultanées. (et normalisées)

Nota :
Le choix s'est porté sur des circuits specialisés , déja éprouvés et fiables, par rapport à une solution SOFWTARE 100%.
où la génération (Emetteur) est assez facile, mais la partie Reception / décodage est plutot (trop) ardue et de moindre fiabilité.
il faut etre tres bon en Maths pour comprendre et comment appliquer
l'algorithme de Goertzel s'y rattachant.
et de ce fait , le PIC a finalement peu de charge de travail !



Les schémas :
(C) H.Toussaint, réalisés sous Kickad
rev 25/10/2022

images/t_Schema_HOME_V5.0.gif
Schéma HOME V5.0.6 (PIC) Portier Audiophone DTMF.sch
images/t_Schema_STREET_V5.1.gif
Schéma STREET V5.1.6 (PIC) Portier Audiophone DTMF.sch




Répartition et affectations des Pins du PIC18F
usage d'une feuille excel ! pour faciliter le codage en C avec MPLAB XC8

Version HOME

images/t_Affectation_Pins_HOME_18F27K42_schema_20221024.gif
usage d'une feuille excel ! :
Affectation_Pin_HOME_2022-1024.xls

Version STREET

images/t_Affectation_Pins_STREET_18F27K42_schema_20221024.gif
usage d'une feuille excel ! :
Affectation_Pin_STREET_2022-1024.xls

MCC ne sera pas utilisé sous MPLABX
Copié / collé depuis excel , des définitions et initialisations, dans le main.c
ou un fichier annexe. *.h

Certaines Pins du PIC doivent être re-routées via la fonction PPS
Peripherique Pin Selection
telle que :
NCO output via RA7PPS=0x26; /RA7->NCO1:NCO1;

L'UART TX sera utilisé pour le traçage/debugging du / des programme
mais aussi pour alimenter une "Led de vie " clignotante avec l'envoi d'un petit message " i am alive"
permettant de visualiser qu'un programme TOURNE !

La Sortie NCO coté STREET , permet l'emission d'un message vocal / musical, issu d'un fichier RTTL
.. tel que "PinkPanther" de durée 7sec
sinon à voir aussi avec l'usage d'un fichier Wav "Vous avez du courrier !" en memoire flash

Usage du mode d'interruption IOC
Interrupt On change
On peut affecter cette interruption sur n'importe quelle pin ( d'Entree !)
avec Interruption sur Front Montant , ou sur front Descendant ou les Deux !
Un flag spécifique au PORT et au bit surveillé de ce port est alors monté ..
pour pouvoir y associer un traitement particulier.
Les 4 Boutons Poussoirs ( B.P.) du PortA, coté HOME, seront traités ainsi, sur Front MONTANT
Aux repos état zero, appui passe à +5V .. front montant.
Le switch Courrier a 2 etats stables ... Traité avec Front Montant et Fron Descendant.

Un timer 16 bits ( TMR1) cadencera, via une interruption vectorisée, tout le programme
avec une periode de 100mS.
Cette base de temps permettra conjointement :
un decomptage de 30 sec à ZerO , et de 3sec à zero. via l'usage de decompteur/compteur
donc avec une definition temporelle de 0,1 sec.
Un autre Timer (TMR4) sera conjointement utilisé en annexe, pour realiser d'autres temporisation
si necessaire ou independante du timming general.



Le BUS :

Le Transport Vocal , Bidirectionel
Un Micro et un Ampli BF de chaque coté
Un systeme de commande MUTE Micro et/ou MUTE HP
Se partage le BUS , avec un etage amplificateur emetteur commun et 1 seule charge sur le collecteur .
BUS alimenté en +18V via le coté STREET, mais polarisé autour de +9V, au repos
Les dosages Info Numerique, Info Vocale , Signla NCO sont individuels

Le Transport de L'information SONORE ,
via une sortie NCO du PIC STREET, avec dosage volume (amplitude) reliée sur le BUS
avec Le DTMF et le Micro. verouillés OFF, pendant la durée d'envoi du fichier RTTL (ou WAV) sur le BUS
(relié donc au poste MCU HOME)

Le transport de l'info numérique
via le standart télephonique DTMF

L'Emetteur / Encodeur
DTMF HT9200B
* recevant sur ses entrés un code fournit par 4 sorties du PIC (emetteur),
traduit celui ci en une combinaison de 2 frequences tres precises ...
émise sur le BUS, qui sera validé pour cette action
* Décision :
remplacé par generation code DTMF software , via PIC18F ( usage algo. Roman Black, simili DDS)

Le Recepteur /
Decodeur DTMF HT9170B
à l'ecoute sur le BUS, la plupart du temps, et hors transmisssion phonique (vocale)
Un code specifique permettra de mettre la partie VOCALE hors service (Mute Micro , Mute HP)
Si un code reçu est RECONNU , le module enverra une info AU PIC (recepteur) DTMF OK !
afin que celui recupere le code reçu sur les 4 pins de sortie du module DTMF
Celles-ci étant reliées à 4 entrees du PIC (recepteur)
et que le programme du PIC Traite l'action demandée,
ensuite BUS sera libéré pour un eventuel message vocal
ou gardé pour une réponse eventuelle au PIC Emetteur.

Ce fonctionnement est reversible , chaque module HOME ou STREET
ayant un DTMF emetteur et un DTMF Recepteur
* Décision :
on garde une solution HARDWARE pour la detection du code DTMF reçu.


images/t_Interactions DTMF-BUS_2022-1201.gif




Outils

Alim Regulée DC 5V
Pickit3
Oscilloscope Tektronics
Analyser FFT
Terminal YAT + cordon Prolific TTL/USB

Generateur de signaux DTMF ,

via la sortie carte SON du PC,
(petit) programme executable à installer sous win 10, utilise des fichiers *.wav:
DTMF_Generateur_Dial_Waves.zip

Generateur de signaux DTMF
via
une applet line Internet , sortie carte SON PC
Rien à installer sur le PC

Generateur DTMF
avec PIC18F27K42 , sortie PWM via un filtre passe bas.
testé OK à l'oscillo et
analyse FFT..
mais pas encore validé avec un test reel avec decodeur DTMF !

DTMF FFT Analyser
Logiciel PC
TCube_generator_et_FFT.zip
visu des 2 frequences constituant le signal DTMF.
Logiciel PC AUDACITY ..fichiers WAV et FFT analyse


Prototype de Test IOC sur Breadboard :

Uniquemen la partie : récuperation 4 infos Boutons poussoirs et switch
Breadboard marque : K&H type : SD 24

images/t_Proto_Big_breadboard_Audiophone_18F27K42_2022-1024.gif images/t_Test_IOC_interrupt_PortA_4567.gif
Breadboard = Planche à pain (RPC denomination) la partie concernée du schema HOME

nota: les elements du haut de la beadboard sont des co-locataires, non utilisés ici .
Test IOC interrupts 4BP PortA (ABCD) + 1 Switch PORTC (Combine)
UART1 TXrelié à un terminal YAT PC (Win10) , via un cordon prolific USB/TTL)
sur la sortie UART1 TX , on a aussi une led bleue (Led de vie) , pour temoigner de l'activité du PIC.
RC7 RX n'est pas utilisé..mais RC7 utilisé ici comme une entree classique ..disponible
Je l'ai utilisée dans ce cas de figure ,pour definir un mode Bavard ( ou pas) vers le terminal.



La partie Initialisation




La partie corps principal





L'interrupt IOC






1er TEST decodeur HT9170B

avec le générateur WEB de Venea NET..
Probleme : detection trop aleatoire et incorecte
Cause : il faut mettre R1 sur l'entree Pin1 , qui sert à definir le gain
sans R1 le gain est trop grand,ecretage du signal,surmodulation ..etc ..



2em TEST decodeur HT9170B
07/11/2022
Reprise des test , avec oscilloscope
pour verifier le signal en sortie de l'AOP integré dans le HT0170B
sur Pin3 GS



vérificartion que le point de fonctionnement est autour de VCC/2
mesure 2,35V ( mon alim VCC=4.9V) => OK
le signal etait trop fort en amplitude !
( ..pour pouvoir l'entendre avec le petit HP monté en // sur le signal)
diminué drastiquement le niveau du signal, via le réglage séparé du mélangeur de volume, repéré "Google"
:eek: je n'entends plus le signal..mais je le vois !

(Google, car le
generateur vient d'une page web !)
nota: dans mon test je n'ai pas de potar de dosage amplitude!

le niveau de signal se situe autour de 1V cr à cr , sur la composante continue de 2,35V ( en sortie Pin 3 (GS) du HT9170B
remarque : les signaux sont écrétés en sortie generateur ! même à tres bas niveaux.





le tout résumé dans cette image :

images/t_Test_2_decodeur_DTMF_HT9170B_seul_2022-1107.gif images/t_Test_Touche_1.gif
test Touche "D" test touche "1", amplitude 544mV cr cr



Résultat :
tres bonne fiabilité de detection des touches
avec durée 500mS

re_test du DTMF9170 (sans B!)
avec exactement les mêmes conditions que le HT9170B
Cette fois , reagit OK ,
mais SAUF touches # 1, 4, 7 !
niveau DC sortie GS : 2.48V
Quelque soit le niveau du signal, pas de réactions sur touches 1,4,7 (1ere colonne du clavier)
problème sur la détection du 1209hz ?
Tres bizarre , car la touche '*' reagit ..OK et contient aussi la fréquence de 1209Hz.



Test avec SQA analyser

Toujours avec le générateur WEB de Venea NET..
Je n'ai pas assez d'entrée pour connecter D3 => test avec des codes n'affectant pas D3
SQA connecté sur
pin 11 D0,
pin 12 D1,
pin 13 D2
synchro sur DTMF OK pin 15

envoi sequence C89*#ABCD de duree 500mS et gap silence de 100mS
nota:
pourquoi commencer par 'C' => parce que eteint toutes les leds (tirées au +5V) ! (code HHHH)


le DTMF OK apparait comme front montant 4.5µS apres le debut affichage Note D0-D3
...de meme durée que la note , puis retourne au Zero ,apres l'emission de la tonalité.
l'affichage de la note (D0 D3)reste constament
on a donc tout le temps de verifier la valeur de note

images/t_SQA_test_Digits_Leds_decodeur_D0-D3.gif






Test Generation signaux DTMF via sortie PWM 18F27K42 , avec decodeur HT9170B
et Tables fichiers Wav

petite modif du fichier
original de TempsX , pour sortir la série de 16 codes ,
avec un interval de 2,5sec , pour permettre une visu facile de l'etat des 4 leds D3 ..D0 (sur le decodeur),
representant le code binaire d'une touche.
La sortie PWM sur RC4 ...passe par un filtre RC 10K 47nF avant d'attaquer l'entrée du Décodeur HT9170B.

Schema simplifié pour ce test :

images/t_Test_gene_DTMF_ASM_18F27K42_et_HT9170B.gif


Le code asm modifié et chargeur dans ce zip
_DTMF_rev0_asm .zip
remarque :
détection des codes OK, bien que le PIC18F soit en mode OSCILLATEUR interne , SANS QUARTZ !



Version MikroC generateur DTMF (tables fichiers WAV) avec PIC18F27K42

La generation signal DTMF par le PIC permetterai de gagner 4 sorties sur le PIC ! par rapport à un emetteur DTMF hardware HT9200B
16 tables DTMF dans l'espace Flash ROM
Liaison UART avec terminal YAT et touches predefinies pour envoi d'un code DTMF
commande : Note=X ..... avec X compris 0123456789#*ABCD

images/t_YAT_Cde_DTMF_codeur_PIC18F.gif

Test du programme avec un décodeur Hardware HT9170B et 4 leds sur les sortie D0 D3,
schema idem ci dessus
Sortie sur RC2 ( sortie affectable à une autre sortie RCx : choix via PPS selection dans le code)
filtre passe bas 4.7K 47nF .. suivi de 1µF et 100K -> Pin 1 HT9170B

Source MikroC :
PIC18F27K42_Play_DTMF_files_WAV_in_Flash_2022_1113.c
fichier Tables DTMF :
DTMF_16_Tables_code.inc
Chargeur :
18F27K42_Play_DTMF_wav_en_flash_2022-1113.hex

Used RAM (bytes): 554 (7%) Free RAM (bytes): 7616 (93%)
Used ROM (bytes): 96060 (73%) Free ROM (bytes): 35012 (27%)





Test Algorythme Roman Black , générateur signaux DTMF via sortie PWM 18F27K42
avec decodeur HT9170B
, et MikroC

.Hardware :
sortie PWM sur RC2 suivi d'un filtre passe bas 4,7K 47nF ..100K -> decodeur Pin 1 HT9170B

Schema : configuré pour test du programme

images/t_Audiophone_18F27K42_Home_partie_test.gif

Possibilité d'envoyer le code touche via les touches définies dans le Terminal YAT
Terminal_DTMF_decoder_test_2022.yat
rappel du codage :
Table_DTMF_Touches_Frequences.jpg
Usage de PWM MicroC lib


Software :

MikroC pro 7.60
old source :
PIC18F27K42_Roman_Black_DTMF_Generateur_RC2_ou_RC4_MC_2022_1121.c
rev 06/12/2022
18F27K42_Roman_Black_DTMF_Generateur_2022-1206_MC.zip
PIC18F27K42_Roman_Black_DTMF_Generator_2022-1206_MC.hex
PIC18F27K42_Roman_Black_DTMF_Generateur_RC2_ou_RC4_MC_2022_1206.c

PWM Timer2 CCP1 à 65200Hz
UART1 interrpt RX pour saisie au clavier terminal.
la durée du code est realisée via TMR6 => 0,5sec avec argument =0 et en mode pooling
utilisé par ailleurs dans le programme, en mode interrupt avec argument N>0 et Flag_Timer6 ( ie: N=6 => 6x0.5sec)

L'algoritme est basé sur le DDS (Direct Digital Synthesis)
2 sinusoides définies sur 64 pas sont utilisées
l'une sera calée sur F1 , l'autre sur F2
et ensuite la somme des 2 est envoyée via PWM ..
le balayage du compteur sur 24 bits se fait à 62500 hz
on a un coeff de passage à 64 * 65536 / 62500 = 67.108
exemple Touche 1 :
pour generer F1 de 697Hz -> 697 * 67.108 = 46775
pour generer F2 de 1209Hz -> 1209 * 67.108 = 81135

modif : pour pouvoir utiliser RC4 ou RC2 comme sortie PWM
choix fait par état de la pin RB1 RB1=0 => choix RC4 , sinon RB1 =1 => RC2 par défaut

Nota :
il faut penser à réafffecter RC2 comme Pin classique si on affecte RC4 comme sortie PWM
sinon la sortie PWM se fait SUR LES 2 PINS !!! à la fois.

usage de la fonction MikroC

ATTENTION : avec lib PWM mikroC et fonction
PWM1_Set_Duty(pwm1); // ..........sur 8 bits !
necessite ccp1 bit FMT=0;

sinon utiliser
// avec ccp1 bit FMT=1
CCPR1L=0;
CCPR1H=pwm1;


sur terminal YAT




exemple touche A :
images/t_Check_code_A_algo_RomanBlack.gif

Le gros avantage de cette solution est le peu de place occupée ,par rapport à la solution : usage de tables (fichier) WAV:
Used RAM (bytes): 575 (7%) Free RAM (bytes): 7595 (93%)
Used ROM (bytes):
8569 (7%) Free ROM (bytes ... contre 96060 !

Modif du 06/12/2022
Rajout de l'etat des 4 leds en sortie HT9179B montrant le code detecté , apres le code Touche saisi au clavier
...pour faciliter le test visuel.
Nota : l'ordre suit la disposition des touches clavier et non pas le poids binaire des codes

const char Leds_HT9170B[][5]={
"LLLH","LLHL","LLHH","HHLH", // 1 2 3 A
"LHLL","LHLH","LHHL","HHHL", // 4 5 6 B
"LHHH","HLLL","HLLH","HHHH", // 7 8 9 C
"HLHL","HLHH","HHLL","LLLL"}; // 0 * # D
char Sequence[]="123A456B789C0*#D";

exemple avec touche 2
Note R0 C1
2... LLHL.... F1= 697 Hz , F2= 1336 Hz


Test_DTMF_Generator_20221013_11.webm

Discussions , liens :
Mikroe Forum (PWM8 and 10 bits with 18F27K42)
Fantaspic forum (Generateur DTMF 18F27K42)






Test Algorythme Roman Black , générateur signaux DTMF
version
MPLABX XC8 !
Usage de PWM5 et Timer2, sortie aiguillée sur RC4
PWM5 est en 10bits, la valeur est donc multipliée par 4 pour conserver une variation de duty % , equivalente à du 8 bits
et le meme niveau d'amplitude,une fois filtré via la cellue RC 4,7K 47nF
(qu'avec la version MikroC !)

DTMF_Algo_2022-11.xls

images/t_DTMF_algo_xls.gif


le module principal
les principales variables associées
voir le source pour les 2 tables de 64 valeurs :

uint8_t Sin64L[64]=...
uint8_t Sin64H[64]= ..

Nota:
Les compteurs 24bits (contenu dans des longs 32 bits) sont implantés à des adresses figées
de sorte à pouvoir acceder directement au bytes Low
waveA_ou waveB_2 du comptage sur 24 bits

uint32_t waveA __at(0x0020);
uint8_t waveA_2 __at(0x0022);
uint32_t waveB __at(0x0024);
uint8_t waveB_2 __at(0x0026);
uint32_t BDA_periodA __at(0x0028);
uint32_t BDA_periodB __at(0x002C6);

void PWM5_LoadDutyValue(uint16_t dutyValue)
{
// Writing to 8 MSBs of PWM duty cycle in PWMDCH register
PWM5DCH = (dutyValue & 0x03FC)>>2;
// Writing to 2 LSBs of PWM duty cycle in PWMDCL register
PWM5DCL = (dutyValue & 0x0003)<<6;
}

// DTMF selected row and column
uint8_t drow ;
uint8_t dcol ;
uint8_t pwm;
uint16_t pwm_1;

uint16_t Frow_value[4]={ 697, 770, 852, 941}; // Hz
uint16_t Fcol_value[4]={ 1209,1336,1477,1633}; //hz
// 1 2 3 A 697
// 4 5 6 B 770
// 7 8 9 C 1477
// * 0 # D 1633

uint32_t Frow[4]={ 46775 ,51674 , 57177 , 63149};
uint32_t Fcol[4]={ 81135,89657,99120,109589};
drow designe la rangée du clavier
dcol designe la colonne
// exemple 8115 / 67.1088864 = 1209

uint8_t Sequence[17]="123A456B789C*0#D";
i=(drow<<2)+dcol; indice du nom de la touche

BDA_periodA = Frow[drow];
BDA_periodB = Fcol[dcol];
PWM5CONbits.EN=1;
TMR6_Init_500ms(0);
while(PIR9bits.TMR6IF==0)
{

while(PIR4bits.TMR2IF==0); // wait until PWM cycle starts (sync to PWM)
PIR4bits.TMR2IF=0;

PWM5CONbits.EN=1;
// calc the A sinewave,
waveA =waveA + BDA_periodA; // zero-error Accumulation
pwm_1 = Sin64L[waveA_2 & 0x3F]; // Binary Divide output (/65536) and keep 6 bits
// calc the B sinewave, and ADD the 2 waves together
waveB =waveB + BDA_periodB;
pwm_1 =pwm_1+ Sin64H[waveB_2 & 0x3F];
// scale the summed sinewaves and place in PWM module
pwm_1 = (pwm_1 << 1); // gamme 0-400 pour 0-100% for PWM
pwm_1 += 128; // offset pour re-centrer le signal
PWM5_LoadDutyValue(pwm_1);
}
PWM5CONbits.EN=0;

Nota: en fait la multiplication par 4 s'effectue
en ne divisant plus par 2 (comme sur le code original )
et en multipliant par 2 le resultat (instantané) de la somme des 2 sinusoides A et B ( maxima 99+90 ~200)
correspondant chacune aux fréquences F1 ,F2 du signal DTMF


PWM5 Testé OK avec SQA analyser 0 -1000...... pour 0- 98%
Generation des Notes DTMF testées OKavec module Hardware decodeur DTMF HT9170B
Execution Terminal YAT


Affichage sur Terminal YAT


Projet MPLABX : Portier Audiophone 2022
Version : 2022-1119
Compile le Nov 20 2022 a 18:25:55 UTC
avec version XC8 : 2360
Hardware : PIC18F27K42 , FOSC interne =64MHz
UART1 RC6=TX 115200,8,N,1 .. PAS DE RECEPTION sur RX !
Usage de Timer1 x fois 100mS , Timer4 100mS
Config= HOME

Bonjour
Init PWR5 (sortie sur RC5)
Init Timer2 associé à PWM5 , tick=64µS
Test UP
Duty = 128
Duty = 256
Duty = 384
Duty = 512
Duty = 640
Duty = 768
Duty = 896
Duty = 1000

Appui sur touche clavier pour sortir du test
Appui sur touche clavier pour sortir du test
...
Appui sur touche clavier pour sortir du test
Appui sur touche clavier pour sortir du test

Q

Init et test Timer6 -> 8 x 500mS : ..........

Sinewave DTMF generator
Select the 2 DTMF tones
Row : 697 770 852 941 OFF
Col : 1209 1336 1477 1633 OFF

R=0 C=0 F1= 697 Hz F2= 1209 Hz
R=0 C=0 F1= 697 Hz F2= 1209 Hz
R3C3
cde=R3C3
R=3 C=3 F1= 941 Hz F2= 1633 Hz
R2C3
cde=R2C3
R=2 C=3 F1= 852 Hz F2= 1633 Hz




Terminal YAT 115200bds Capture partielle écran SQA Analyser


Software MPLAB XC8
rev 21-1-2022
main_DTMF_XC8_2022-1121.c

rev 06/12/2022
report meme modif que sur la version MikroC
Affichage de l'etat normal à obtenir sur les 4 leds du HT9170B en fonction de la touche Clavier saisie
Source :
main_DTMF_XC8_2022-1206.c
Package :
Generateur_DTMF_18F27K42_PWM5_XC8_2022-1206.zip
Chargeur :
Generateur_DTMF_18F27K42_2022.X.production.hex
Terminal log :
YAT-Log-20221206.log





Simulation signal DTMF PIC vu sur le BUS

usage de
Circuit Maker for Student

La sortie RC2 PWM du PIC est le signal DTMF, remplacé ici par un signal carré 1000Hz

images/t_DTMF_PIC_vu_sur_BUS_2022-1113.gifimages/t_DTMF_PIC_vu_sur_BUS_2022-1113.gif

Les 2 modules , HOME et STREET ,ont en commun la R de charge collecteur 180ohms ( originale, remplacée par 270 ohms)
pour mieux équilibrer le point de fonctionnement Vce des 2 transistors 2N17111
on obtient > 900mV cr cr sur le bus .. le HT9170B decode OK , à partir de 300mV cr cr
Le 2N1711 devrait dissiper < 250mW





.
. A suivre ..



Analyse
Ordinogramme
Chronogramme ..etc
Software



mail to
paulfjujo@free.fr