;************************************************** ;avec WDog dans cherche_f ;Fichier debuggé :oubli d'initialiser CMCON=0X07 comparateur off ;Detection 1750Hz et DTMF ......................OK ; Code de blocage 02603 ; Code de déblocage 08471 ; Entrée de signal audio à analyser AN0 (broche 7) ; Sortie BLOQUE/DEBLOQUE (1/0) sur GPIO1 (broche 6) ; Sortie 1750Hz monostable 1 sur GPIO2 (broche 5) ; J.Senlis 2006 ;*************************************************** #include ; inclure le fichier de définition des registres i equ 0x20 j equ 0x21 min equ 0x22 ech equ 0x23 ;stockage de l'échantillon max equ 0x24 diff equ 0x25 calc equ 0x26 nper equ 0x27 ;nbre de périodes analysées 2 4 8 16...Attention x1 equ 0x28 ;réel fourier x2 equ 0x29 y equ 0x2A y1 equ 0x2B ;imaginaire fourier y2 equ 0x2C moy equ 0x2D ; pas utilisée result equ 0x2E ;fréquence trouvée (1) tmp equ 0x2F t0 equ 0x30 ; tempos correspondant aux fréquences cherchées t1 equ 0x31 t2 equ 0x32 t3 equ 0x33 t4 equ 0x34 t5 equ 0x35 t6 equ 0x36 t7 equ 0x37 t8 equ 0x38 cpt equ 0x40 Bloque equ 0x41 ; état bloqué ou débloqué (1/0) Tout equ 0x42 ; 42 Time-out recherche code F1750 equ 0x43 ; 1750 trouvé(1) CPT1750 equ 0x44 ; pour monostable 1750 CPTout equ 0x45 ; cpt time-out ORG 0x0000 ;adresse du reset goto main ;sauter à l'étiquette main ORG 0x0004 ;adresse des interruptions nop nop goto 0X0004 ;placer ici la routine de gestion des interruptions (pas utilisé dans ce TP) ;******************************************************************* nop nop init ;SOUS_PROGAMME Initialisation bsf STATUS,RP0 ;Page1 movlw 0x01 movwf TRISIO ;ANO input le reste output movlw 0x11 movwf ANSEL ;TAD = Tcy/8 ANO analogique call 0x3FF movwf OSCCAL ;calibration horloge bcf STATUS,RP0 ;Page0 movlw 0x03 movwf ADCON0 movlw 0x7 movwf CMCON bcf GPIO,1 nop nop bcf GPIO,2 nop nop movlw 0x09 ;debug movwf T1CON;debug return ;********************************************************************** init_var ;67 5C 51 48 34 2E 28 22 1F movlw 0x67 movwf t0 ;697Hz T/4 :358.6us Tempo = (T/4 -47)/3 -1 movlw 0x5c movwf t1 ;770Hz 324.6 Ox6C movlw 0x51 movwf t2 ;852Hz 293.4 0x62 movlw 0x48 movwf t3 ;941Hz 265.6 0x58 movlw 0x34 movwf t4 ;1209HZ 206.7 0x45 movlw 0x2e movwf t5 ;1336HZ 187.1 0x3E movlw 0x28 movwf t6 ;1447HZ 169.2 0x38 movlw 0x22 movwf t7 ;1633HZ 153 0x33 movlw 0x1F movwf t8 ;1750HZ 142,8 0x27 movlw 0x10 movwf nper ;nombre de périodes analysées ATTENTION modifier plus bas ..divi.. movlw 0x00 movwf Bloque ; O débloqué 1 bloqué movwf CPT1750 ; monostable 1750 movlw 0x40 ; FF = 12sec environ .... à diminuer.... movwf Tout ; compte les essais entre 2 chiffres : 4mini si nper=16 3 tests et 200ms....... 8mini si nper=8 movlw 0x40 movwf F1750 ; compteur pour valider 1750 (4 appels = 73ms) return ;************************************************************************** tempo ;valeur dans cpt durée totale = 3*(cpt+1) decfsz cpt,f ;cpt+1 us goto tempo ;2*(cpt-1)us return ;2us ;************************************************************************* chercher_f ; delay T/4 correspondant à f à chercher dans w résult 0 ou 1 ;************************** clrwdt ;************************* movwf tmp ;pour la tempo movwf cpt ;pour la temporisation movlw 0x00 movwf x1 movwf x2 movwf y1 movwf y2 movwf max movlw 0xFF movwf min ;****************calcul des sommes x2x1 et y2y1 sur 4*nper=échantillons*********** movf nper,w ;nombre de periodes movwf i ;pour compter les boucles movfw 0;debug movwf TMR1H;debug movwf TMR1L;debug boucle1 bsf ADCON0,1 ;début de convertion att1 btfsc ADCON0,1 ;test fin de convertion goto att1 movf ADRESH,W ; movwf ech bcf STATUS,0 addwf x1,f ;ajoute à x2x1 btfsc STATUS,0 incf x2,f bcf STATUS,0 subwf max,w ;le max btfsc STATUS,0 goto fmax1 movf ech,w movwf max fmax1 movf ech,w bcf STATUS,0 subwf min,w ;le min btfss STATUS,0 goto fmin1 movf ech,w movwf min fmin1 movf tmp,w ;init tempo movwf cpt call tempo lect2 bsf ADCON0,1 ;début de convertion att2 btfsc ADCON0,1 ;test fin de convertion goto att2 movf ADRESH,W movwf ech bcf STATUS,0 addwf y1,f btfsc STATUS,0 incf y2,f bcf STATUS,0 subwf max,w ;le max btfsc STATUS,0 goto fmax2 movf ech,w movwf max fmax2 movf ech,w bcf STATUS,0 subwf min,w ;le min btfss STATUS,0 goto fmin2 movf ech,w movwf min fmin2 movf tmp,w movwf cpt call tempo lect3 bsf ADCON0,1 ;début de convertion att3 btfsc ADCON0,1 ;test fin de convertion goto att3 movf ADRESH,W ; movwf ech bsf STATUS,0 subwf x1,f btfss STATUS,0 decf x2,f bsf STATUS,0 subwf max,w ;le max btfsc STATUS,0 goto fmax3 movf ech,w movwf max fmax3 movf ech,w bsf STATUS,0 subwf min,w ;le min btfss STATUS,0 goto fmin3 movf ech,w movwf min fmin3 movf tmp,w movwf cpt call tempo lect4 bsf ADCON0,1 ;début de convertion att4 btfsc ADCON0,1 ;test fin de convertion goto att4 movf ADRESH,W ; movwf ech bsf STATUS,0 subwf y1,f btfss STATUS,0 decf y2,f bsf STATUS,0 subwf max,w ;le max btfsc STATUS,0 goto fmax4 movf ech,w movwf max fmax4 movf ech,w bsf STATUS,0 subwf min,w ;le min btfss STATUS,0 goto fmin4 movf ech,w movwf min fmin4 movf tmp,w movwf cpt movlw 2 bsf STATUS,0 subwf cpt,f ;tempo plus courte à cause du test.. call tempo decfsz i,f goto boucle1 ;**********************fin du calcul des sommes algebriques sur nper périodes**************************************************************** btfss x2,7 ;test signe x2 goto xpos comf x2,f ;valeurs absolues comf x1,f bcf STATUS,0 movlw 0 addwf x1,f btfsc STATUS,0 incf x2,f xpos btfss y2,7 ;test signe y2 goto ypos comf y2,f ;valeurs absolues comf y1,f bcf STATUS,0 movlw 0 addwf x1,f btfsc STATUS,0 incf y2,f ypos movlw 3 ;*******diviser par le nombre de periodes ATTENTION nper = 2*2*2*2 à modifier si nper change movwf i divi bcf STATUS,0 rrf x2,f rrf x1,f bcf STATUS,0 rrf y2,f rrf y1,f decfsz i,f goto divi movf min,w ;amplitude bcf STATUS,0 subwf max,w movwf diff bcf STATUS,0 rrf diff,f movf x1,w ;calcul x+y/2 si x>y sinon y+x/2 bcf STATUS,0 subwf y1,w btfss STATUS,0 goto posi bcf STATUS,0 rrf x1,w addwf y1,w goto fposi posi bcf STATUS,0 rrf y1,w addwf x1,w fposi bcf STATUS,0 ; movlw 0x5 ;modif**** seuil fixe ; movwf diff ;modif**** subwf diff,w ;test si >diff frequence détectée btfss STATUS,0 goto sup movlw 0x00 ; pas détecté goto fsup sup movlw 0x01 ; détecté fsup movwf result return ;*********************************Fin de test une fréquence************************** cherche_1750 movf t8,w ;1750? call chercher_f movf result,w btfsc STATUS,2 goto fin_1750 ;si pas trouvé decfsz F1750,f goto fin_1750 ; si duree pas suffisante bsf GPIO,2 ; sortie 2 à 1 movlw 0x40 movwf F1750 ; compteur pour valider 1750 (3 appels) movwf CPT1750 ; monostable 1750 fin_1750 movf CPT1750,w btfss STATUS,2 decfsz CPT1750,f goto finfin_1750 bcf GPIO,2 finfin_1750 return ;************************************************************ test bsf GPIO,1 movlw 0X0A call tempo bcf GPIO,1 movlw 0X0A call tempo goto test ;************************************************************ ;************************************************************ main ;PROGRAMME PRINCIPAL call init ;initialisation call init_var ; goto test debut movf Bloque,w btfss STATUS,2 goto cherche_debloque cherche_bloque movf Tout,W movwf CPTout chiffre0 call cherche_1750 movf t3,w call chercher_f movf result,w btfss STATUS,2 goto c_0 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto chiffre0 goto debut c_0 movf t5,w call chercher_f movf result,w btfss STATUS,2 goto cchiffre1 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto chiffre0 goto debut cchiffre1 movf Tout,W movwf CPTout chiffre1 call cherche_1750 movf t0,w call chercher_f movf result,w btfss STATUS,2 goto c_1 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto chiffre1 goto debut c_1 movf t5,w call chercher_f movf result,w btfss STATUS,2 goto cchiffre2 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto chiffre1 goto debut cchiffre2 movf Tout,W movwf CPTout chiffre2 call cherche_1750 movf t6,w call chercher_f movf result,w btfss STATUS,2 goto c_2 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto chiffre2 goto debut c_2 movf t1,w call chercher_f movf result,w btfss STATUS,2 goto cchiffre3 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto chiffre2 goto debut cchiffre3 movf Tout,W movwf CPTout chiffre3 call cherche_1750 movf t3,w call chercher_f movf result,w btfss STATUS,2 goto c_3 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto chiffre3 goto debut c_3 movf t5,w call chercher_f movf result,w btfss STATUS,2 goto cchiffre4 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto chiffre3 goto debut cchiffre4 movf Tout,W movwf CPTout chiffre4 call cherche_1750 movf t6,w call chercher_f movf result,w btfss STATUS,2 goto c_4 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto chiffre4 goto debut c_4 movf t0,w call chercher_f movf result,w btfss STATUS,2 goto cchiffrefin ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto chiffre4 goto debut cchiffrefin movlw 0x01 movwf Bloque ;code de blocage détecté bsf GPIO,1 nop nop goto debut ;infini ; goto infini ; decfsz Tout ; goto c_1 ; goto ;c_1 cherche_debloque movf Tout,W movwf CPTout dchiffre0 call cherche_1750 movf t3,w call chercher_f movf result,w btfss STATUS,2 goto dc_0 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto dchiffre0 goto debut dc_0 movf t5,w call chercher_f movf result,w btfss STATUS,2 goto dcchiffre1 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto dchiffre0 goto debut dcchiffre1 movf Tout,W movwf CPTout dchiffre1 call cherche_1750 movf t2,w call chercher_f movf result,w btfss STATUS,2 goto dc_1 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto dchiffre1 goto debut dc_1 movf t5,w call chercher_f movf result,w btfss STATUS,2 goto dcchiffre2 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto dchiffre1 goto debut dcchiffre2 movf Tout,W movwf CPTout dchiffre2 call cherche_1750 movf t1,w call chercher_f movf result,w btfss STATUS,2 goto dc_2 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto dchiffre2 goto debut dc_2 movf t4,w call chercher_f movf result,w btfss STATUS,2 goto dcchiffre3 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto dchiffre2 goto debut dcchiffre3 movf Tout,W movwf CPTout dchiffre3 call cherche_1750 movf t2,w call chercher_f movf result,w btfss STATUS,2 goto dc_3 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto dchiffre3 goto debut dc_3 movf t4,w call chercher_f movf result,w btfss STATUS,2 goto dcchiffre4 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto dchiffre3 goto debut dcchiffre4 movf Tout,W movwf CPTout dchiffre4 call cherche_1750 movf t0,w call chercher_f movf result,w btfss STATUS,2 goto dc_4 ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto dchiffre4 goto debut dc_4 movf t4,w call chercher_f movf result,w btfss STATUS,2 goto dcchiffrefin ; freq trouvée decfsz CPTout,f ; freq pas trouvé goto dchiffre4 goto debut dcchiffrefin movlw 0x00 movwf Bloque ;code de déblocage détecté bcf GPIO,1 nop nop goto debut ;aller à debut END