Autor Tema: problemas con dtmf  (Leído 1479 veces)

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

Desconectado joseydoris

  • PIC12
  • **
  • Mensajes: 58
problemas con dtmf
« en: 17 de Octubre de 2013, 02:24:19 »
Un saludo:Estoy trabajando con el pcd 3312(generador de tonos) y cm8870(decodificador de tonos).El decodificador funciona bien con un telefono,pero con el pcd 3312 no puedo generar los numeros a discar.Estoy con el 12f629 oscilador interno,no se si sera la frecuencia del cristal o que sera,pero no anda ni empujado.En el simulador (sim84)rota el registro contador y por cada rotacion da un pulso bajo el reloj(creo que es asi).Esta codigo lo encontre en el foro(no me acuerdo de quien es,que me disculpe)pero le he cambiado los retardos arriba y abajo y sigue igual.Si alguien me puede ayudar se lo agradeceria.Att jose


                 movlw .5                   ;en este caso envía el 5
                 call dtmf                    ;llama a la subrutina
                 call retardo_60ms      ;llama a la sub de retardo
                                                 ;para que suene unos 60ms
                 movlw .31                 ;con este número detiene la salida del tono
                                                 ;puede ser cualquier número que termine con 5 unos...
                 call dtmf                    ;lo envía
                 call retardo_40ms      ;suponiendo que enviamos otro dígito
                                                 ;tiene que haber un tiempo con silencio
                                                 ;entre dígito y dígito.

dtmf            movwf digito            ;carga el número a enviar en dígito
                  movlw d'5'                ;carga el contador en 5
                  movwf contador        ;va a contar cinco veces
                  bsf portb,rb4             ;se asegura que el pulso del clock esté en uno, en este caso es rb4
dtmf_bucle  bsf portb,rb3             ;saca el dato a transmitir por rb3
                  btfss digito,0             ;si el bit a transmitir es uno lo deja como está
                  bcf portb,rb3             ;si no lo pone en cero
                  bcf portb,rb4             ;flanco de bajada del clock, transmite el bit
                  nop                          ;el tiempo de retardo es 5 uS
                  nop                          ;para una frecuencia de 100khz aprox.
                  nop                 
                  nop                   
                  bsf portb,rb4             ;sube el pulso de reloj
                  rrf digito,1                ;va rotando el bit a transmitir
                  bcf status,c               ;limpia el carry
                  decfsz contador,1      ;si llegó a cero el contador, sale del bucle
                  goto dtmf_bucle        ;vuelve al bucle
                  return                      ;retorna al programa