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
![]() |
Schéma HOME V5.0.6 (PIC) Portier Audiophone DTMF.sch |
![]() |
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
usage d'une feuille excel ! : Affectation_Pin_HOME_2022-1024.xls
Version STREET
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.
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
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 :
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
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 :
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
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
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 :
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
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
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