Hola a todos.
Soy muy novato con esto de los PIC, y quisiera modificar este código para usarlo con un 16f628 en lugar del 16f84, ya que este último es casi imposible de encontrar.
Muchas gracias.
Os paso mi código para ver las modificaciones a realizar:
Soy muy novato con esto de los PIC, y quisiera modificar este código para usarlo con un 16f628 en lugar del 16f84, ya que este último es casi imposible de encontrar.
Muchas gracias.
Os paso mi código para ver las modificaciones a realizar:
PHP:
;
;
; DTMF DECODER
list p=16c84; definicion del microcontrolador usado
include "p16c84.inc"; libreria de uso general
__FUSES _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON ; configuracion de los fuses
OPTREG equ 01 ; Definicion de las equivalencias de registros
TRIS_A equ 05 ;
TRIS_B equ 06 ;
relays equ 10 ;
mfcode equ 11 ;
cntdown equ 12 ;
timeout equ 13 ;
slocnt1 equ 14 ;
slocnt2 equ 15 ;
org 0000 ;llama al ensamblador a arrancar en 000H
init goto start
org 0004 ;vector de interrupcion
rtc_interrupt
decfsz slocnt1,F ;decrementa 1st el preescaler
goto rtc_int_1
decfsz slocnt2,F ;decrementa 2nd el preescaler
goto rtc_int_1
bcf relays,4 ;pone el rele 6 en off
bcf PORTB,4
rtc_int_1
decfsz cntdown,F ;la cuenta atrás y pase siguiente si = 0
goto counting ;contar aún si no se llega a cero
bsf timeout,0 ;set timed out bit
bcf INTCON,2 ;Limpiamos la el flag de la interrupcion
retfie ;regresamos
counting
bcf timeout,0 ;Limpiamos el bit del timed out
bcf INTCON,2 ;Limpiamos la el flag de la interrupcion
retfie ;regresamos
; SUBRUTINAS
wait_strobe
btfsc timeout,0 ;miramos si a acabado por timed out
goto set_z ;set Z flag if timeout ocurred
btfss PORTA,4 ;miramos si el Strobe es activo en RA4
goto wait_strobe ;bucle hasta que lo sea
movfw PORTA ;recibe el codigo desde el 8870
movwf mfcode ;Lo guardamos en "mfcode"
bcf mfcode,4 ;nos aseguramos que el strobe no se ve como un dato
bcf STATUS,2 ;regresamos con Z=0 si el tono es decodificado
return
set_z bsf STATUS,2 ;regresamos con Z=1 si el tiempo de espera
return
wait_no_strobe
btfsc PORTA,4 ;miramos si el Strobe es activo en RA4
goto wait_no_strobe ;bucle hasta que no lo sea
return
start_timer
movlw H'54' ;Preescaler activado para 7 segundos
movwf cntdown ;esto lo hacemos para que si hay alguna pausa entre tonos no se alargue mas de 7 segundos.
return
;--------------------------------------------------------;
; INICIO DE LAS RUTINAS DE CONFIGURACION Y DECODIFICACION;
;--------------------------------------------------------;
start movlw B'00100000' ;Pasamos al banco 1
movwf STATUS
clrf TRIS_B ;configuramos todos los pines del puerto B a modo de salida
movlw B'00011111'
movwf TRIS_A ;configuramos todos los pines del puerto A a modo de entrada
movlw B'10000111'
movwf OPTREG ;ponemos : pull-up del port B OFF
; RTCC cuenta del clock interno
; preescaler connectado a RTCC
; el prescaler divide por 256
; "los otros bits no son importantes"
clrw ;limpiamos el registro de trabajo work
movwf STATUS ;regresamos a la pagina del registro 0
clrf PORTB ;ponemos todas las salidas en OFF
clrf relays
clrf timeout
movlw B'10100000'
movwf INTCON ;global,y RTCC interrupts activados
decode call wait_no_strobe ;empieza a correr cuando no hay tono presente
clrf timeout ;establecer condiciones de tiempo de espera hasta más tarde
call wait_strobe ;esperar a recibir un tono
movlw H'0B' ;0B es el codigo para DTMF "*"
subwf mfcode,W ;poner en cero la bandera si "*" se recibió
btfsc STATUS,2 ;skip siguiente si no era un "*"
goto got_star
goto decode ;buscar otro
got_star
call start_timer ;iniciar el tiempo de espera del temporizador
call wait_no_strobe ;esperamos para el tercer tono
call wait_strobe
btfsc STATUS,2 ;abortar si el tiempo de espera se ha acabado
goto decode
movlw H'01'
subwf mfcode,W ;poner en cero la bandera si el tono segundo, era 1
btfsc STATUS,2 ;skip siguiente si no era un 1
goto got_1
movlw H'0A'
subwf mfcode,W ;poner en cero la bandera si el tono segundo fue "0"
btfsc STATUS,2 ;skip siguiente si no era un 0
goto got_2
goto get_# ;esperar # para finalizar la secuencia invalida
;de acuerdo a los próximos 2 tonos, pero no hace la acción hasta que ve un "#".
got_1 call wait_no_strobe
call wait_strobe ;espera al tercer tono
btfsc STATUS,2 ;aborta si se acaba el tiempo de los 7 seg.
goto decode
call wait_no_strobe ;espera hasta que acaba el tono
movf mfcode,W ;recoger, el digito introducido
addwf PCL,F ;saltar hacia adelante,hacia el vector
goto decode ;5D (mf codigo 0000)
goto got_11
goto got_12
goto got_13
goto got_14
goto got_15
goto got_16
goto got_17
goto got_18
goto decode
goto got_10
goto decode ;*
goto decode ;#
goto decode ;5A
goto decode ;5B
goto decode ;5C (mf codigo 1111)
got_10 movlw B'11111111' ;ponemos todas las salidas en on
movwf relays
goto get_#
got_11 bsf relays,0 ;ponemos salida 1 on
goto get_#
got_12 bsf relays,1 ;ponemos salida 2 on
goto get_#
got_13 bsf relays,3 ;ponemos salida 3 on
goto get_#
got_14 bsf relays,2 ;ponemos salida 4 on
goto get_#
got_15 bsf relays,5 ;ponemos salida 5 on
goto get_#
got_16 bsf relays,4 ;ponemos salida 6 on
goto get_#
got_17 bsf relays,6 ;ponemos salida 7 on
goto get_#
got_18 bsf relays,7 ;ponemos salida 8 on
goto get_#
; para llegar aqui la secuendia de tono "*<numa><numb><numc><numd>2" se ha encontrado, Ahora decodificar solicitud
; de acuerdo con los siguientes 2 tonos, pero no realizar la acción hasta que se vea "#"
got_2 call wait_no_strobe
call wait_strobe ;espera al sexto tono
btfsc STATUS,2 ;abortamos si se acaba el tiempo
goto decode
call wait_no_strobe ;esperamos a que acabe el tono
movf mfcode,W ;recoger, dígito introducido
addwf PCL,F ;saltar hacia adelante, hacia el vector
goto decode ;5D (mf codigo 0000)
goto got_01
goto got_02
goto got_03
goto got_04
goto got_05
goto got_06
goto got_07
goto got_08
goto decode
goto got_00
goto decode ;*
goto decode ;#
goto decode ;5A
goto decode ;5B
goto decode ;5C (mf codigo 1111)
got_00 movlw B'0000000'
movwf relays ;ponemos todas las salidas en off
goto get_#
got_01 bcf relays,0 ;ponemos la salida 1 off
goto get_#
got_02 bcf relays,1 ;ponemos la salida 2 off
goto get_#
got_03 bcf relays,3 ;ponemos la salida 3 off
goto get_#
got_04 bcf relays,2 ;ponemos la salida 4 off
goto get_#
got_05 bcf relays,5 ;ponemos la salida 5 Off
goto get_#
got_06 bcf relays,4 ;ponemos la salida 6 Off
goto get_#
got_07 bcf relays,6 ;ponemos la salida 7 Off
goto get_#
got_08 bcf relays,7 ;ponemos la salida 8 Off
goto get_#
get_# call wait_strobe ;esperamos al septimo tono
btfsc STATUS,2 ;abortamos si se acaba el tiempo
goto decode
movlw H'0C' ;0C es el codigo DTMF del "#"
subwf mfcode,W ;Si # es recibido set Z flag
btfsc STATUS,2 ;saltamos al siguiente si no a #
goto got_#
call wait_no_strobe
goto get_# ;Solo # es valido, loop hasta encontrarlo
;o acabemos por timeout
got_# call wait_no_strobe ;esperamos a que acabe el tono
movfw relays ;usar la variable "relays" to set RB
movwf PORTB
goto decode ;todo hecho, comprobamos si hay nueva secuencia y volvemos a repetir todo.
retlw 'v'
retlw '2'
retlw '.'
retlw '1'
retlw '.'
retlw 'E'
retlw 'A'
retlw '3'
retlw 'A'
retlw 'B'
retlw 'N'
retlw 'c'
retlw ' '
retlw '2'
retlw '0'
retlw '1'
retlw '7'
end
Última edición por un moderador: