' Télécommande par DTMF des fréquences des modules COMTECH ' juillet 2005 ' architecture : PIC 16F84 et décodeur DTMF SSI202 ' le code DTMF représentant la fréquence est interprété par le PIC et traduit en I2C ' module émetteur COMTECH 2G3 avec synthé / PLL SP5055 ' pour des raisons de place mémoire, on n'utilise pas le code DTMF mais sa valeur décimale ' code : D 1 2 3 4 5 6 7 8 9 0 * # A B C ' valeur : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ' donc les valeurs numériques sont entre 0 et 10 ' CMCON=7 'met le 16F628 en mode digital sur le PORT A ' @ DEVICE EC_OSC 'pour graver le 16F628 en oscillateur externe ' DEFINE OSC 4 ' quartz horloge du 16F628 ... 4MHz 'définition des entrées / sorties (voir schéma) TONEen var PORTB.7 '1 si réception d'un code DTMF valide INPUT TONEen E1 var PORTB.3 'Q1 du SSI202 INPUT E1 E2 var PORTB.4 'Q2 du SSI202 INPUT E2 E3 var PORTB.5 'Q3 du SSI202 INPUT E3 E4 var PORTB.6 'Q4 du SSI202 INPUT E4 clk var PORTA.2 OUTPUT clk dta var PORTA.3 OUTPUT dta 'déclaration des variables adresse var BYTE adresse=$C2 'pour le PLL TSA-5055 ' la dernière fréquence utilisée est stockée en EEPROM du PIC (4 octets) ' et relue à chaque reset ' fréquence entre 2300 et 2450 MHz DATA @0,2,3,0,8 ' met 2308 en EEPROM à la programmation du PIC f1 var BYTE '1° digit de la fréquence : toujours 2 READ 0,f1 'lecture du 1° digit de la fréquence f2 var BYTE '2° digit de la fréquence : 3 ou 4 READ 1,f2 'lecture du 2° digit de la fréquence f3 var BYTE '3° digit de la fréquence : entre 3 et 9 READ 2,f3 'lecture du 3° digit de la fréquence f4 var BYTE '4° digit de la fréquence : entre 0 et 9 READ 3,f4 'lecture du 4° digit de la fréquence freqTx var WORD 'fréquence reçue par DTMF freqTx=(f1*1000)+(f2*100)+(f3*10)+f4 'fréquence lue en EEPROM au reset freq_actuelle var WORD 'pour comparaison entre la fréquence actuelle et celle reçue freq_actuelle=freqTx pllbase var WORD 'taux de division à transmettre au 5055 pllbase=8*freqTx 'pas de 125KHz 'Fvco=125 * N : pour un pas de 125KHz 'le taux de division du PLL du 5055 = fréquence émission (en KHz) / 125 (pas de 125KHz) 'exemple pour 1.255MHz, soit 1.255.000KHz /125 = 10.040 soit 8 fois la fréquence reçue par DTMF lo_pll var pllbase.LOWBYTE hi_pll var pllbase.HIGHBYTE b1 var BYTE 'variable utilisée par l'instruction BUTTON b1=0 bcl var BYTE 'compteur de boucles (attente DTMF) bcl=0 tempo var BYTE 'compteur de boucles (délai d'envoi I2C vers 5055) c1 var BYTE '1° code DTMF c2 var BYTE '2° code DTMF c3 var BYTE '3° code DTMF c4 var BYTE '4° code DTMF Q1 var BIT Q2 var BIT Q3 var BIT Q4 var BIT Pause 1000 GOSUB ecrit_dans_5055 '*************************************************************************************** 'attente de code DTMF et analyse de la fréquence à programmer tempo=0 boucle1: 'surveille l'information TONEen, si TONEen est à 1, il y a un code DTMF 'présent sur E1 E2 E3 E4 et on peut passer à decode1 BUTTON TONEen,1,255,0,b1,1,decode1 ' TONEen n'est pas à 1 PAUSE 20 tempo=tempo+1 'incrémentation toutes les 20ms IF tempo>=50 THEN 'au bout de 1s on reprogramme le 5055 tempo=0 GOSUB ecrit_dans_5055 ENDIF GOTO boucle1 decode1: Q1=E1 'lit la valeur de Q1 sur la broche E1 (LSB) Q2=E2 Q3=E3 Q4=E4 c1 = Q1 + 2*Q2 + 4*Q3 + 8*Q4 IF c1=2 THEN 'le premier chiffre reçu doit toujours être 2 GOTO boucle2 ELSE tempo=0 GOTO boucle1 ENDIF boucle2: bcl=0 WHILE bcl<75 'attente du 2° code DTMF pendant 1,5 seconde 'surveille l'information TONEen, si TONEen est à 1, il y a un code DTMF 'présent sur E1 E2 E3 E4 et on peut passer à decode2 BUTTON TONEen,1,255,0,b1,1,decode2 'TONEen n'est pas à 1 PAUSE 20 bcl=bcl+1 WEND tempo=0 GOTO boucle1 decode2: Q1=E1 'lit la valeur de Q1 sur la broche E1 (LSB) Q2=E2 Q3=E3 Q4=E4 c2 = Q1 + 2*Q2 + 4*Q3 + 8*Q4 IF c2=3 OR c2=4 THEN 'le second chiffre reçu doit toujours être 3 ou 4 GOTO boucle3 ELSE tempo=0 GOTO boucle1 ENDIF boucle3: bcl=0 WHILE bcl<75 'attente du 3° code DTMF pendant 1,5 seconde 'surveille l'information TONEen, si TONEen est à 1, il y a un code DTMF 'présent sur E1 E2 E3 E4 et on peut passer à decode3 BUTTON TONEen,1,255,0,b1,1,decode3 'TONEen n'est pas à 1 PAUSE 20 bcl=bcl+1 WEND tempo=0 GOTO boucle1 decode3: Q1=E1 'lit la valeur de Q1 sur la broche E1 (LSB) Q2=E2 Q3=E3 Q4=E4 c3 = Q1 + 2*Q2 + 4*Q3 + 8*Q4 IF c3=0 THEN 'c3 doit être un chiffre tempo=0 GOTO boucle1 ENDIF IF c3>11 THEN 'c3 doit être un chiffre tempo=0 GOTO boucle1 ENDIF 'c3 est un chiffre IF c3=10 THEN c3=0 ' cas de la lettre D GOTO boucle4 boucle4: bcl=0 WHILE bcl<75 'attente du 4° code DTMF pendant 1,5 seconde 'surveille l'information TONEen, si TONEen est à 1, il y a un code DTMF 'présent sur E1 E2 E3 E4 et on peut passer à decode4 BUTTON TONEen,1,255,0,b1,1,decode4 'TONEen n'est pas à 1 PAUSE 20 bcl=bcl+1 WEND tempo=0 GOTO boucle1 decode4: Q1=E1 'lit la valeur de Q1 sur la broche E1 (LSB) Q2=E2 Q3=E3 Q4=E4 c4 = Q1 + 2*Q2 + 4*Q3 + 8*Q4 IF c4=0 THEN 'c4 doit être un chiffre tempo=0 GOTO boucle1 ENDIF IF c4>11 THEN 'c4 doit être un chiffre tempo=0 GOTO boucle1 ENDIF 'c4 est un chiffre IF c4=10 THEN c4=0 ' cas de la lettre D GOTO commande commande: f1=c1 'toujours 2 f2=c2 '3 ou 4 f3=c3 'entre 0 et 9 f4=c4 'entre 0 et 9 freqTx=(f1*1000)+(f2*100)+(f3*10)+f4 IF freqTx>2450 THEN 'fréquence invalide supérieure à 2450 tempo=0 GOTO boucle1 ENDIF pllbase=8*freqTx 'pas de 125KHz IF freqTx<>freq_actuelle THEN 'on sauvegarde si la fréquence a changé GOSUB ecrit_dans_eeprom freq_actuelle=freqTx ENDIF GOSUB ecrit_dans_5055 tempo=0 GOTO boucle1 END '************************************************************************************************************************ 'sous-routines ecrit_dans_5055: I2CWRITE dta,clk,adresse,[hi_pll,lo_pll,$8E] PAUSE 20 RETURN ecrit_dans_eeprom: WRITE 0,f1 WRITE 1,f2 WRITE 2,f3 WRITE 3,f4 RETURN