Introduzione
La storia continua, ancora un articolo al sapore di pic. Neanche io pensavo di dovermene più occupare ma sbagliavo. E’ stato un mio caro amico radioamatore, col quale da tempo condivido la passione per questi microcontrollori, che mi ha invogliato a portare a termine il progetto che mi accingo subito ad illustrarvi.
Ancora una volta torna prepotentemente il pic 16F1705, questa volta nelle vesti di generatore di segnali DTMF. Nulla di nuovo evidentemente, ma questo circuito all’occorrenza potrebbe essere impiegato in sistemi più o meno complicati, senza l’ausilio di integrati dedicati, riducendo così di molto la complessità circuitale; oppure, essere solamente e semplicemente oggetto di studio, per applicazioni e sviluppi diversi da quello attuale.
Bene, non ripeto qui le virtù di questo piccolo gioiello chiamato 16F1705, ma vi riporto i link del mio precedente articolo, in cui ne ho parlato più diffusamente.
Descrizione
Brevemente, com’è noto ai più, e con riferimento alla tabella che segue, i DTMF sono dei segnali costituiti da coppie di toni ben precisi; per poterli riprodurre in modo corretto, ho prima digitalizzato tali toni con una frequenza di campionamento di 32 Khz e successivamente ho registrato nella memoria del pic solo i dati relativi ad un’onda intera di ognuno di essi.
Alla pressione di un qualsiasi tasto, una routine di lettura, non fa altro che leggere in modo continuo i dati relativi alle due onde corrispondenti, eseguirne la somma ed inviare il risultato ottenuto al convertitore DAC, ottenenso così la riproduzione del corrispondente segnale DTMF.
La qualità dei segnali DTMF generati è veramente buona, ed un semplice filtro passa basso all’uscita del DAC del pic è già sufficiente ad eliminare eventuali segnali spuri. Per testarne la bontà, ho inviato tali segnali alla scheda audio del mio p.c. dandoli in pasto all’ottimo software “Spectrum Lab” di “DL4YHF” Col quale è possibile misurare la frequenza di ogni singolo tono generato, ed ognuno di essi si discosta dal valore standard al massimo di 10 Hz.
Dopo questo test, ho inviato i segnali generati ad una scheda elettronica di una chiave DTMF, impiegante il famoso decoder MT8870; ed i toni sono sempre stati decodificati correttamente senza alcun errore.
Chi volesse utilizzare i dati registrati, compresa la routine di riproduzione su un pic diverso, può farlo inviando i dati da riprodurre al modulo PWM anziché al DAC come in questo caso.
Non esistono pcb o foto della bread board che ho usato per le mie prove, ma potete fidarvi, il funzionamento è assicurato, del resto fa tutto il software e non vi sono componenti particolari.
Credo di non dover aggiungere altro, come vedete dallo schema elettrico, oltre al pic ed alla tastiera c’è solo il filtro RC. Il file asm è corredato da molte indicazioni, ma se vi occorrono ulteriori chiarimenti non esitate a contattarmi.
Saluti e buon divertimento.
IT9DPX #135
(FRANCESCO M.)
A seguire File ASM ed HEX
- DTMF 01 02 2016
- FUNZIONA MOLTO BENE, SEGNALI CONFRONTATI CON SPECTRUM LAB
- GENERA TUTTI I 16 DTMF CORRETTAMENTE
- TASTIERA RIGHE OUT SU RA4 RA5 RC0 RA2
- COLONNE IN SU RA3 RC5 RC4 RA0
PROCESSOR 16F1704 RADIX DEC INCLUDE "P16F1704.INC"
ERRORLEVEL -302 ERRORLEVEL -305
; ORG 130H
CBLOCK 170H SENO PASSO PASSO2 PASSO3 PASSO4 PASSO5 PASSO6 PASSO7 PASSO8 TASTO TEMP1 TEMP2 COL_RIG ENDC
- define C1 PORTA,3
- define C2 PORTC,5
- define C3 PORTC,4
- define C4 PORTA,0
__CONFIG H'8007', H'3FA4' __CONFIG H'8008', H'1FFF'
ORG 00 GOTO VIA
- ----INTERRUPT---------
ORG 04 NOP NOP
- NOP
- NOP
MOVLB 0 MOVLW 138 ;137 ;136 ;135 MOVWF TMR0
MOVLB 2 MOVFW SENO MOVWF DAC1CON1
MOVFW TASTO XORLW .16 BTFSC STATUS,Z GOTO FINE_INT
CALL TX_TONI
FINE_INT
BCF INTCON,2 RETFIE
- ----FINE INTERRUPT-------
VIA
MOVLB 1 MOVLW B'11110000' MOVWF OSCCON
MOVLW B'10100000' MOVWF INTCON
MOVLW B'00110000' MOVWF TRISC MOVLW B'00001001' MOVWF TRISA
CLRF OPTION_REG
MOVLB 2 MOVLW B'10000000' MOVWF DAC1CON0
MOVLW 45+1 MOVWF PASSO MOVLW 26 MOVWF PASSO2
MOVLW 34+1 MOVWF PASSO3 MOVLW 19+1 MOVWF PASSO4
MOVLW 39 MOVWF PASSO5 MOVLW 43 MOVWF PASSO6 MOVLW 25 MOVWF PASSO7 MOVLW 23 MOVWF PASSO8
CLRF TASTO MOVLW 128 MOVWF TEMP1 MOVLW 13 MOVWF TEMP2
MOVLB 10 MOVLW B'10010010' MOVWF OPA1CON
MOVLB 0 MOVLW 135 MOVWF TMR0
MOVLB 3 MOVLW B'00000000' MOVWF ANSELC MOVLW B'00000000' MOVWF ANSELA
ATTESA
NOP NOP NOP CALL TASTIERA MOVWF TASTO GOTO ATTESA
- ----------------------
ONDA_697_HZ
DECFSZ PASSO GOTO LEGGI1 MOVLW 45+1 MOVWF PASSO
LEGGI1
CLRF PCLATH MOVFW PASSO ADDWF PCL
- dati da 180° a 180°
RETLW 0 ;dato finto RETLW 2 RETLW 3 RETLW 5 RETLW 9 RETLW 13 RETLW 18 RETLW 24 RETLW 31 RETLW 38 RETLW 46 RETLW 54 RETLW 62 RETLW 71 RETLW 79 RETLW 86 RETLW 94 RETLW 101 RETLW 107 RETLW 112 RETLW 116 RETLW 120 RETLW 122 RETLW 123 RETLW 123 RETLW 122 RETLW 120 RETLW 116 RETLW 112 RETLW 107 RETLW 101 RETLW 94 RETLW 87 RETLW 79 RETLW 71 RETLW 63 RETLW 54 RETLW 46 RETLW 39 RETLW 31 RETLW 24 RETLW 18 RETLW 13 RETLW 9 RETLW 6 RETLW 3 RETLW 2
- fine dati
- -----------------------
ONDA_1209_HZ
DECFSZ PASSO2 GOTO LEGGI2 MOVLW 27 MOVWF PASSO2
LEGGI2
CLRF PCLATH MOVFW PASSO2 ADDWF PCL
- dati da 180° a 180°
RETLW 0 ;dato finto RETLW 2 RETLW 3 RETLW 8 RETLW 16 RETLW 26 RETLW 39 RETLW 53 RETLW 68 RETLW 82 RETLW 95 RETLW 107 RETLW 116 RETLW 122 RETLW 125 RETLW 125 RETLW 121 RETLW 114 RETLW 104 RETLW 91 RETLW 78 RETLW 63 RETLW 49 RETLW 35 RETLW 23 RETLW 13 RETLW 6 RETLW 2 ; fine dati
- ---------------
ONDA_1633_HZ
DECFSZ PASSO4 GOTO LEGGI4 MOVLW 20 MOVWF PASSO4
LEGGI4
CLRF PCLATH MOVFW PASSO4 ADDWF PCL
- dati da 180° a 180°
RETLW 0 ;dato finto RETLW 2 RETLW 4 RETLW 12 RETLW 25 RETLW 42 RETLW 61 RETLW 80 RETLW 98 RETLW 111 RETLW 120 RETLW 123 RETLW 120 RETLW 111 RETLW 97 RETLW 79 RETLW 60 RETLW 41 RETLW 25 RETLW 12 RETLW 4 ; fine dati
- ------------------
ONDA_852_HZ
DECFSZ PASSO5 GOTO LEGGI5 MOVLW 38 MOVWF PASSO5
LEGGI5
CLRF PCLATH MOVFW PASSO5 ADDWF PCL
- dati da 180° a 180°
RETLW 0 ;dato finto RETLW 2 RETLW 3 RETLW 5 RETLW 9 RETLW 14 RETLW 21 RETLW 28 RETLW 37 RETLW 47 RETLW 57 RETLW 67 RETLW 77 RETLW 86 RETLW 95 RETLW 103 RETLW 110 RETLW 116 RETLW 120 RETLW 122 RETLW 123 RETLW 122 RETLW 120 RETLW 116 RETLW 110 RETLW 103 RETLW 95 RETLW 86 RETLW 77 RETLW 67 RETLW 57 RETLW 47 RETLW 37 RETLW 28 RETLW 21 RETLW 14 RETLW 9 RETLW 5 RETLW 3 ; fine dati
- ....ATTESA...........
RETLW 7 RETLW 8 RETLW 10 RETLW 14 RETLW 18 RETLW 24 RETLW 31 RETLW 39 RETLW 47 RETLW 56 RETLW 64 RETLW 72 RETLW 80 RETLW 87 RETLW 94 RETLW 99 RETLW 104 RETLW 107 RETLW 108 RETLW 108 RETLW 107 RETLW 105 RETLW 101 RETLW 96 RETLW 89 RETLW 82 RETLW 75 RETLW 66 RETLW 58 RETLW 50
- -------ATTESA---------
- -----------------
ONDA_941_HZ
DECFSZ PASSO3 GOTO LEGGI3b MOVLW 34 MOVWF PASSO3
LEGGI3b
MOVLW 1 MOVWF PCLATH MOVFW PASSO3 ADDWF PCL
- dati da 180° a 180°
RETLW 0 ;dato finto RETLW 2 RETLW 3 RETLW 7 RETLW 12 RETLW 19 RETLW 27 RETLW 37 RETLW 48 RETLW 59 RETLW 70 RETLW 81 RETLW 91 RETLW 100 RETLW 108 RETLW 115 RETLW 120 RETLW 122 RETLW 123 RETLW 122 RETLW 118 RETLW 113 RETLW 106 RETLW 98 RETLW 88 RETLW 78 RETLW 67 RETLW 56 RETLW 45 RETLW 34 RETLW 25 RETLW 17 RETLW 10 RETLW 6 RETLW 3
- RETLW 1
- fine dati
- ------------------
ONDA_770_HZ
DECFSZ PASSO6 GOTO LEGGI6 MOVLW 42 MOVWF PASSO6
LEGGI6
MOVLW 1 MOVWF PCLATH MOVFW PASSO6 ADDWF PCL
- dati da 180° a 180°
RETLW 0 ;dato finto RETLW 2 RETLW 3 RETLW 6 RETLW 10 RETLW 15 RETLW 21 RETLW 28 RETLW 36 RETLW 45 RETLW 54 RETLW 63 RETLW 72 RETLW 81 RETLW 89 RETLW 97 RETLW 104 RETLW 110 RETLW 115 RETLW 119 RETLW 122 RETLW 123 RETLW 123 RETLW 121 RETLW 118 RETLW 114 RETLW 109 RETLW 103 RETLW 95 RETLW 87 RETLW 79 RETLW 70 RETLW 61 RETLW 52 RETLW 43 RETLW 34 RETLW 27 RETLW 20 RETLW 14 RETLW 9 RETLW 5 RETLW 3 RETLW 2 ; fine dati
- ------------------
ONDA_1336_HZ
DECFSZ PASSO7 GOTO LEGGI7 MOVLW 24 MOVWF PASSO7
LEGGI7
MOVLW 1 MOVWF PCLATH MOVFW PASSO7 ADDWF PCL
- dati da 180° a 180°
RETLW 0 ;dato finto RETLW 2 RETLW 4 RETLW 10 RETLW 20 RETLW 32 RETLW 47 RETLW 63 RETLW 79 RETLW 94 RETLW 107 RETLW 117 RETLW 123 RETLW 125 RETLW 123 RETLW 117 RETLW 107 RETLW 95 RETLW 80 RETLW 64 RETLW 48 RETLW 33 RETLW 20 RETLW 10 RETLW 4 ; fine dati
- -----------------
ONDA_1477_HZ
DECFSZ PASSO8 GOTO LEGGI8 MOVLW 22 MOVWF PASSO8
LEGGI8
MOVLW 1 MOVWF PCLATH MOVFW PASSO8 ADDWF PCL
- dati da 180° a 180°
RETLW 0 ;dato finto RETLW 2 RETLW 4 RETLW 10 RETLW 21 RETLW 36 RETLW 52 RETLW 70 RETLW 86 RETLW 101 RETLW 113 RETLW 120 RETLW 123 RETLW 121 RETLW 113 RETLW 102 RETLW 87 RETLW 70 RETLW 53 RETLW 36 RETLW 22 RETLW 11 RETLW 4 ; fine dati
TX_TONI
MOVLW 1 MOVWF PCLATH MOVFW TASTO ANDLW 15 ADDWF PCL GOTO NUM_ZER GOTO NUM_1 GOTO NUM_2 GOTO NUM_3 GOTO NUM_4 GOTO NUM_5 GOTO NUM_6 GOTO NUM_7 GOTO NUM_8 GOTO NUM_9 GOTO NUM_A GOTO NUM_B GOTO NUM_C GOTO NUM_D GOTO NUM_AST GOTO NUM_CAN
NUM_ZER
CALL ONDA_941_HZ MOVWF SENO CALL ONDA_1336_HZ ADDWF SENO RETURN
NUM_1
CALL ONDA_697_HZ MOVWF SENO CALL ONDA_1209_HZ ADDWF SENO RETURN
NUM_2
CALL ONDA_697_HZ MOVWF SENO CALL ONDA_1336_HZ ADDWF SENO RETURN
NUM_3
CALL ONDA_697_HZ MOVWF SENO CALL ONDA_1477_HZ ADDWF SENO RETURN
NUM_4
CALL ONDA_770_HZ MOVWF SENO CALL ONDA_1209_HZ ADDWF SENO RETURN
NUM_5
CALL ONDA_770_HZ MOVWF SENO CALL ONDA_1336_HZ ADDWF SENO RETURN
NUM_6
CALL ONDA_770_HZ MOVWF SENO CALL ONDA_1477_HZ ADDWF SENO RETURN
NUM_7
CALL ONDA_852_HZ MOVWF SENO CALL ONDA_1209_HZ ADDWF SENO RETURN
NUM_8
CALL ONDA_852_HZ MOVWF SENO CALL ONDA_1336_HZ ADDWF SENO RETURN
NUM_9
CALL ONDA_852_HZ MOVWF SENO CALL ONDA_1477_HZ ADDWF SENO RETURN
NUM_A
CALL ONDA_697_HZ MOVWF SENO CALL ONDA_1633_HZ ADDWF SENO RETURN
NUM_B
CALL ONDA_770_HZ MOVWF SENO CALL ONDA_1633_HZ ADDWF SENO RETURN
NUM_C
CALL ONDA_852_HZ MOVWF SENO CALL ONDA_1633_HZ ADDWF SENO RETURN
NUM_D
CALL ONDA_941_HZ MOVWF SENO CALL ONDA_1633_HZ ADDWF SENO RETURN
NUM_AST
CALL ONDA_941_HZ MOVWF SENO CALL ONDA_1209_HZ ADDWF SENO RETURN
NUM_CAN
CALL ONDA_941_HZ MOVWF SENO CALL ONDA_1477_HZ ADDWF SENO RETURN
TX_TONIS
- ------TONI BASSI------
BTFSS COL_RIG,0 GOTO TX_TONO_1 CALL ONDA_697_HZ MOVWF SENO GOTO TONI_ALTI
TX_TONO_1
BTFSS COL_RIG,1 GOTO TX_TONO_2 CALL ONDA_770_HZ MOVWF SENO GOTO TONI_ALTI
TX_TONO_2
BTFSS COL_RIG,2 GOTO TX_TONO_3 CALL ONDA_852_HZ MOVWF SENO GOTO TONI_ALTI
TX_TONO_3
BTFSS COL_RIG,3 GOTO TONI_ALTI CALL ONDA_941_HZ MOVWF SENO
- ------TONI ALTI------
TONI_ALTI
BTFSS COL_RIG,4 GOTO TX_TONO_5 CALL ONDA_1209_HZ ADDWF SENO RETURN
TX_TONO_5
BTFSS COL_RIG,5 GOTO TX_TONO_6 CALL ONDA_1336_HZ ADDWF SENO RETURN
TX_TONO_6
BTFSS COL_RIG,6 GOTO TX_TONO_7 CALL ONDA_1477_HZ ADDWF SENO RETURN
TX_TONO_7
BTFSS COL_RIG,7 RETURN CALL ONDA_1633_HZ ADDWF SENO RETURN
- .... tastiera ......
TASTIERA
MOVLB 0 BSF PORTC,0 movlw b'11101111' ; riga 1 movwf PORTA CALL RITARDO btfss C1 retlw .1 btfss C2 retlw .2 btfss C3 retlw .3 btfss C4 retlw .10
movlw b'11011111' ; riga 2
movwf PORTA
CALL RITARDO
btfss C1
retlw .4
btfss C2
retlw .5
btfss C3
retlw .6
btfss C4
retlw .11
movlw b'11111111'
movwf PORTA
BCF PORTC,0 ; riga 4
CALL RITARDO
btfss C1
retlw .7
btfss C2
retlw .8
btfss C3
retlw .9
btfss C4
retlw .12
movlw b'11111011' ; riga 3
movwf PORTA
BSF PORTC,0
CALL RITARDO
btfss C1
retlw .14
btfss C2
retlw .0
btfss C3
retlw .15
btfss C4
retlw .13
movlw b'11111111'
MOVLB 2
MOVLW 128
MOVWF SENO
retlw .16 ; nessun tasto
RITARDO
MOVLW .10 MOVWF TEMP1 DECFSZ TEMP1 GOTO $-1 RETURN
END
- 020000040000FA
- 020000001328C3
- 040002000034003492
- 080008000000000020008A3016
- 1000100095002200700899007908103A03191128F8
- 10002000A5210B1109002100F0309900A0308B00B0
- 1000300030308E0009308C0095012200803098000D
- 100040002E30F1001A30F2002330F3001430F400A7
- 100050002730F5002B30F6001930F7001730F80084
- 10006000F9018030FA000D30FB002A009230910037
- 10007000200087309500230000308E0000308C0077
- 100080000000000000003122F9004028F10B4A284E
- 100090002E30F1008A0171088207003402340334E3
- 1000A000053409340D34123418341F3426342E34F8
- 1000B00036343E3447344F3456345E3465346B3412
- 1000C0007034743478347A347B347B347A347834D2
- 1000D000743470346B3465345E3457344F34473481
- 1000E0003F3436342E3427341F34183412340D3450
- 1000F0000934063403340234F20B80281B30F2003A
- 100100008A01720882070034023403340834103440
- 100110001A3427343534443452345F346B347434F5
- 100120007A347D347D347934723468345B344E34BF
- 100130003F343134233417340D3406340234F40B95
- 10014000A3281430F4008A017408820700340234B2
- 1001500004340C3419342A343D34503462346F344E
- 1001600078347B3478346F3461344F343C34293400
- 1001700019340C340434F50BBF282630F5008A01FD
- 1001800075088207003402340334053409340E3410
- 1001900015341C3425342F34393443344D3456341B
- 1001A0005F3467346E34743478347A347B347A3420
- 1001B000783474346E3467345F3456344D34433499
- 1001C00039342F3425341C3415340E3409340534B5
- 1001D0000334073408340A340E34123418341F340C
- 1001E00027342F34383440344834503457345E3454
- 1001F000633468346B346C346C346B346934653418
- 100200006034593452344B3442343A343234F30B80
- 100210000B292230F30001308A0073088207003472
- 100220000234033407340C3413341B342534303493
- 100230003B34463451345B3464346C347334783436
- 100240007A347B347A34763471346A346234583494
- 100250004E34433438342D342234193411340A34B2
- 1002600006340334F60B36292A30F60001308A00B2
- 100270007608820700340234033406340A340F341B
- 1002800015341C3424342D3436343F34483451343E
- 100290005934613468346E34733477347A347B344F
- 1002A0007B347934763472346D3467345F34573448
- 1002B0004F3446343D3434342B3422341B3414341C
- 1002C0000E340934053403340234F70B692918302D
- 1002D000F70001308A0077088207003402340434C2
- 1002E0000A34143420342F343F344F345E346B34AA
- 1002F00075347B347D347B3475346B345F345034E7
- 1003000040343034213414340A340434F80B8A294C
- 100310001630F80001308A00780882070034023471
- 1003200004340A34153424343434463456346534B1
- 10033000713478347B3479347134663457344634CC
- 100340003534243416340B34043401308A007908EF
- 100350000F398207BA29BF29C429C929CE29D3292F
- 10036000D829DD29E229E729EC29F129F629FB29F9
- 10037000002A052A0721F0006521F0070800462021
- 10038000F0007C20F00708004620F0006521F0070F
- 1003900008004620F0008621F00708003221F00016
- 1003A0007C20F00708003221F0006521F0070800EA
- 1003B0003221F0008621F0070800BB20F0007C20ED
- 1003C000F0070800BB20F0006521F0070800BB2003
- 1003D000F0008621F00708004620F0009F20F0077B
- 1003E00008003221F0009F20F0070800BB20F00039
- 1003F0009F20F00708000721F0009F20F007080069
- 100400000721F0007C20F00708000721F00086217A
- 10041000F00708007C1C0F2A4620F0001D2AFC1C57
- 10042000142A3221F0001D2A7C1D192ABB20F0005D
- 100430001D2AFC1D1D2A0721F0007C1E222A7C207B
- 10044000F0070800FC1E272A6521F00708007C1F22
- 100450002C2A8621F0070800FC1F08009F20F007C7
- 10046000080020000E14EF308C0066228C1D013431
- 100470008E1E02340E1E03340C1C0A34DF308C0036
- 1004800066228C1D04348E1E05340E1E06340C1C90
- 100490000B34FF308C000E1066228C1D07348E1E2C
- 1004A00008340E1E09340C1C0C34FB308C000E1466
- 1004B00066228C1D0E348E1E00340E1E0F340C1C52
- 1004C0000D34FF3022008030F00010340A30FA0082
- 0604D000FA0B682A080087
- 020000040001F9
- 02000E00A43F0D
- 02001000FF1FD0
- 00000001FF

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)