Autor Tema: Generar DTMF directamente desde el PIC en ASM  (Leído 2673 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado PICdevJerez

  • PIC10
  • *
  • Mensajes: 12
Generar DTMF directamente desde el PIC en ASM
« en: 15 de Enero de 2015, 18:04:13 »
Hola chicos, aquí os incluyo otra humilde aportación para este foro que de tanto me ha servido.
Se trata de Generar Tonos telefónicos DTMF (doble tono multifrecuencia) directamente desde el PIC de 8 bits usando una salida PWM.
Os incluyo las rutinas de interrupción, las macros, la configuración necesaria y las tablas de muestreo de las ondas.
Está todo en el archivo .asm que adjunto.
Usa las instrucciones BRW y LSRF ya que lo he diseñado para el PIC 16F1507, pero os incluyo en los comentarios cómo adaptarlo a otros PICs.
A la salida PWM de vuestro PIC le ponéis un sencillo filtro RC (resistencia 1KOhm-condensador 100nF), pero os aconsejo que sea doble, en la captura del osciloscopio podéis ver la diferencia de ruido entre usar sólo un filtro(línea azul) y usar uno doble (línea amarilla).

Está fraccionado ya que forma parte de un proyecto mayor que no os puedo incluir completo.
Aquí os copio el código (sin las tablas que son muy largas) pero en el .asm está todo.

Espero que os sea de utilidad. Gracias.

Código: ASM
  1. ;;GENERADOR DE DTMF (Doble Tono Multifrecuencia)
  2. ;;DIRECTAMENTE DESDE EL PIC
  3. ;;
  4. ;;Emplea las siguientes instrucciones de
  5. ;;los Mid-Range 8 bits PICs (49 instrucciones o más):
  6. ;;    LSRF
  7. ;;En aquellos PICs que no la soporten se puede sustituir
  8. ;;por RRF File y luego BCF File,7
  9. ;;    BRW
  10. ;;Si vuestro PIC no tiene esta instrucción deberéis
  11. ;;alinear las rutinas Onda_Colu y Onda_Fila (con ORG)
  12. ;;y sustituir BRW por ADDWF PCL,F
  13. ;;
  14. ;;Os incluyo la rutina de interrupción (ISR),
  15. ;;los parámetros de configuración,
  16. ;;las macros y las tablas de valores
  17. ;;Emplea 1 PWM (ó CCP) y 3 TMR:
  18. ;;TMR0: Controla el cambio de altura de la onda
  19. ;;TMR1: Controla la duración del pulso o el silencio
  20. ;;TMR2: Usada por el módulo PWM
  21. ;;Configurad el PIC para 16MHz
  22.  
  23. ;;  PICdevJerez - Jerez de la Frontera - España
  24.  
  25.  
  26. #ifndef         Carry
  27.         #define Carry   STATUS,C
  28. #endif
  29.  
  30.  
  31. ;La duración de cada tono ha de ser superior a 40ms
  32. ;La duración la pausa ha de ser superior a 40ms
  33. ;Se asigna un valor de 246 a TMR1H para que la pausa
  34. ;o el tono duren unos 70ms aprox.
  35.  
  36. Marcar  MACRO   Fila,Columna
  37.         movlw   Fila
  38.         movwf   IncFila
  39.         movlw   Columna
  40.         movwf   IncColu
  41.         clrf    TMR0
  42.         bsf     INTCON,TMR0IE
  43.         clrf    TMR1L
  44.         movlw   .246
  45.         movwf   TMR1H
  46.         bsf     T1CON,TMR1ON
  47.         btfsc   T1CON,TMR1ON   
  48.         goto    $-1
  49.         clrf    TMR1L
  50.         movlw   .246
  51.         movwf   TMR1H
  52.         bsf     T1CON,TMR1ON
  53.         btfsc   T1CON,TMR1ON   
  54.         goto    $-1
  55.         endM
  56.  
  57.  
  58. IncColu equ     .120
  59. IncFila equ     .121
  60. DutyColu        equ     .122
  61. DutyFila        equ     .123
  62. PosColu equ     .124
  63. PosFila equ     .125
  64.  
  65. ;La frecuencia base es simple de comprender:
  66. ;(FOSC/4) / TMR0 / PRES(TMR0) / SAMPLES
  67. ; 4MIPS  / 256  /     2       /  256
  68. #define FREC_BASE       .30;
  69.  
  70.  
  71. ;Dejamos que el MPASM nos calcule el salto que hemos de
  72. ;dar en cada interrupción del TMR0, como empleamos números
  73. ;naturales de 8 bits, hay una desviación por redondeo.
  74. ;El estándar requiere que la desviación de frecuencia no exceda
  75. ;del 1.8%, aunque se tolera hasta un 2% de desviación
  76. ;                 FRECUENCIA REQUERIDA   FRECUENCIA REAL OBTENIDA
  77. #define FILA1   (.697/FREC_BASE);         694Hz
  78. #define FILA4   (.770/FREC_BASE)+1;       783Hz
  79. #define FILA7   (.852/FREC_BASE);         844Hz
  80. #define FILA0   (.941/FREC_BASE);         936Hz
  81. #define COLU1   (.1209/FREC_BASE);       1205Hz
  82. #define COLU2   (.1336/FREC_BASE);       1327Hz
  83. #define COLU3   (.1477/FREC_BASE);       1477Hz
  84.  
  85. ;Número 1      : FILA1 + COLU1
  86. ;Número 2   : FILA1 + COLU2
  87. ;Número 3   : FILA1 + COLU3
  88. ;Número 4   : FILA4 + COLU1
  89. ;Número 5   : FILA4 + COLU2
  90. ;Número 6   : FILA4 + COLU3
  91. ;Número 7   : FILA7 + COLU1
  92. ;Número 8   : FILA7 + COLU2
  93. ;Número 9   : FILA7 + COLU3
  94. ;Número 0   : FILA0 + COLU2
  95. ;Asterisco  : FILA0 + COLU1
  96. ;Almohadilla: FILA0 + COLU3
  97.  
  98.  
  99.         org     0x0000
  100.         goto    configuracion
  101.  
  102.         org     0x0004
  103. ISR:
  104.         banksel 0
  105.         btfsc   INTCON,TMR0IF
  106.         goto    intTMR0
  107.  
  108.   intTMR1:      bcf     INTCON,TMR0IE
  109.         bcf     T1CON,TMR1ON
  110.         bcf     PIR1,TMR1IF
  111.         bsf     INTCON,IOCIE
  112.         banksel PWM4DCH
  113.         clrf    PWM4DCH
  114.         clrf    PWM4DCL
  115.         retfie
  116.  
  117.   intTMR0:      bcf     INTCON,TMR0IF
  118.         banksel PWM4DCH
  119.         clrf    PWM4DCL
  120.         movf    DutyColu,W
  121.         addwf   DutyFila
  122.         rrf     DutyFila
  123.         btfsc   STATUS,C
  124.         bsf     PWM4DCL,6
  125.         lsrf    DutyFila
  126.         btfsc   STATUS,C
  127.         bsf     PWM4DCL,7
  128.         movf    DutyFila,W
  129.         movwf   PWM4DCH
  130.  
  131.         movf    IncFila,W
  132.         addwf   PosFila,F
  133.         movf    PosFila,W
  134. ;Si vuestro PIC no incluye la instrucción BRW
  135. ;aquí tendréis que hacer algo parecido a esto
  136. ;MOVLW  (HIGH Onda_Fila)
  137. ;MOVWF  PCLATH
  138.         call    Onda_Fila
  139.         movwf   DutyFila
  140.  
  141.         movf    IncColu,W
  142.         addwf   PosColu,F
  143.         movf    PosColu,W
  144. ;... y aquí lo mismo con Onda_Colu
  145.         call    Onda_Colu
  146.         movwf   DutyColu
  147.         retfie
  148.  
  149.  
  150. configuracion:
  151.  
  152. ;TMR0: FOSC/4 - PRESCALER  2:1 - INTERRUPCION DESACTIVADA
  153. ;Cuidado porque el OPTION_REG cambia mucho de un PIC a otro
  154.         banksel OPTION_REG
  155.         movlw   b'01000000'             ;WPUEN:Activado;TMR0CS:Fosc/4;PRE=2
  156.         movwf   OPTION_REG
  157.        
  158.  
  159. ;TMR1: LFINTOSC - PRESCALER 1:1 - APAGADO
  160.         banksel T1CON
  161.         movlw   b'11000000'
  162.         movwf   T1CON
  163.  
  164. ;TMR2: POST 1:1 - PRE 1:1 - ENCENDIDO
  165.         banksel T2CON
  166.         movlw   b'00000100'
  167.         movwf   T2CON
  168.  
  169. ;PWM4 (CCPx): ACTIVADO - SALIDA PIN ACTIVADO
  170.         banksel PWM4CON
  171.         clrf    PWM4DCL
  172.         clrf    PWM4DCH
  173.         movlw   b'11000000'
  174.         movwf   PWM4CON
  175.  
  176. ;PR2: .127
  177. ;A 16MHz nos da una frecuencia de salida de 31.250Hz,
  178. ;perfecto para el ancho de banda requerido, pero
  179. ;OS ACONSEJO un doble filtro RC 100nF y 1KOhm
  180.         banksel PR2
  181.         movlw   .127
  182.         movwf   PR2    
  183.  
  184.         clrf    PosColu
  185.         clrf    PosFila
  186.  
  187.         banksel 0
  188.         clrf    PIR1
  189.         bsf     INTCON,PEIE
  190.         bsf     INTCON,GIE
  191.  
  192.  
  193. ;EJEMPLO DE USO DE LAS MACROS
  194. ;Marcamos el número 0123456789*#
  195.  
  196.         Marcar  FILA0,COLU2;0
  197.         Marcar  FILA1,COLU1;1
  198.         Marcar  FILA1,COLU2;2
  199.         Marcar  FILA1,COLU3;3
  200.         Marcar  FILA4,COLU1;4
  201.         Marcar  FILA4,COLU2;5
  202.         Marcar  FILA4,COLU3;6
  203.         Marcar  FILA7,COLU1;7
  204.         Marcar  FILA7,COLU2;8
  205.         Marcar  FILA7,COLU3;9
  206.         Marcar  FILA0,COLU1;*
  207.         Marcar  FILA0,COLU3;#


 

anything