Buenas, si, ya se que el tema esta algo gastado y hace rato que se ven ejemplos por todos lados, pero me decidi a postearlo ya que no se ve casi nada en lenguaje aseembler, y me parecio una buena idea mostrar como lo hice, y ademas a un nivel muy de principiante y demostrar que no hace falta tener que migrar a otro lenguaje solo por que nadie lo este intentando en este.
Bien en este caso es una alarma domiciliaria de 6 zonas y 1 zona 24h, con reportes por sms, se puede activar y desactivar desde un celular, haciendo una llamada perdida, cuyo numero se encuentre en la lista de contactos en el chip del modem, tambien se pueden activar y desactivar dos salidas de propositos multiples atraves de sms independientemente del estado de la alarma.
Para ello use un PIC16F628a y un modem SIM340, ( el que vendian a $10 por mercadolibre ).
La parte de la recepcion y envio esta sacada del ejemplo de meta
http://electronica-pic.blogspot.com.ar/2008/11/electrnica-pic.html.
Espero le sea util a aguien, Saludos
;******************************************************
; ALARMA DOMICILIARIA gsm
;
; Para habilitar uno o varios numeros para controlar la alarma, los mismos tienen
; que estar grabados en la lista de contactos del chip con el nombre Moren,
; respetando mayusculas y minisculas.
;
; Comandos
; Lamada perdida: Activa y desactiva solo la alarma, devuelve sms con el estado
; SMS "Hola": Activa y desactiva el cerco electrico, devuelve sms con el estado
; SMS "Holas": Prende y apaga las luces del patio, devuelve sms con el estado
;
;
; FALTA
; depurar y optimisar el programa y migrarlo al 16F877a
; HABILITA Y DESABILITAR ZONAS MEDIANTE SMS, LA IDEA SERIA QUE UNA VES
; CHEQUEADO EL COMANDO SMS ACTIVAR UNA POCISION DE UN BIT Y LUEGO TESTEAR
; PARA SABER SI TIENE QUE ESTAR ACTIVA O NO, TIENE QUE HACERSE CON LA ALARMA
; DESACTIVADA. se podria seguir con el metodo empleado para los relay
;0002 zona 1
;0003 zona 2
;0004 zona 3
;0005 zona 4
;0006 zona 5
;0007 zona 6
;0008 zona 7
;*******************************************************************
LIST P=16F628, R=DEC ; Usar el PIC16F628 y sistema decimal
#include "P16F628A.INC" ; Incluye datos de PIC16F628A
__CONFIG _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON & _XT_OSC & _MCLRE_OFF
;*******************************************************************
; CONFIGURACION
;*******************************************************************
;*******************************************************************
; VARIABLES
;*******************************************************************
dat5 EQU 0x21
dat10 EQU 0x20
PDel0 EQU 0x24 ;VARIABLES TEMPORIZADOR
PDel1 EQU 0x25
PDel2 EQU 0x26
PDel0A EQU 0X23
PDel1A EQU 0X22
conta EQU 0X30
contador EQU 0x28 ; variable
dato_serie EQU 0x29 ; dato serie desde la PC
;digito_1 EQU 'n' ; Código de las teclas utilizadas.
;digito_2 EQU 'e' ; Nº a chequear
;digito_3 EQU 'r' ; Chequeamos los ultimos 5 digitos
;digito_4 EQU 'o'
;digito_5 EQU 'M'
clave_1 EQU 'H' ; clave para activar las salidas
clave_2 EQU 'o'
clave_3 EQU 'l'
clave_4 EQU 'a' ; Holas para cerco electrico
clave_5 EQU 's' ; Hola para luces patio
digito_1 EQU 'n'
digito_2 EQU 'e'
digito_3 EQU 'r'
digito_4 EQU 'o'
digito_5 EQU 'M'
;*******************************************************************
ORG 0x00 ; El programa empieza en 0x000
;*******************************************************************
; Inhibe comparadores
;*******************************************************************
movlw 7
movwf CMCON ; CMCON=7 inhibir los comparadores
;************************** Patillas *************************
; ___________
; Techo ZONA 3 in - RA,2 -|1 \__/ 18|- RA,1 - ZONA 2 Habitacion niñas
; Cocina ZONA 4 in - RA,3 -|2 17|- RA,0 - ZONA 1 Habitacion matrimonial
; Living ZONA 5 in - RA,4 -|3 16F628 16|- OSC1 - [XT]
; Cochera ZONA 6 in - RA,5 -|4 15|- OSC1 - [XT]
; GND -|5 14|- Vcc
; Pulso acti cerco out - RB,0 -|6 13|- RB,7 - out- SIRENA
; [RX]- RB,1 -|7 12|- RB,6 - in- Perimetral 24Hs
; [TX]- RB,2 -|8 11|- RB,5 - out- Luces
; Control remoto in - RB,3 -|9 10|- RB,4 - out- LED
; |___________|
;
;**************************************************************
movlw b'00000000' ; valor inicial portA
movwf PORTA
movlw b'00000000' ; valor inicial portB
movwf PORTB
bsf STATUS,RP0 ; Pág 1 RAM
movlw b'00111111'
movwf TRISA ;
movlw b'01001010' ; RB0 SALIDA 0
; RB1 (RX) = entrada 1
; RB2 (TX) = salida 0
; RB3 = entrada 1
; RB4 = salida 0
; RB5 = salida 0
; RB6 = entrada 1
; RB7 = salida 0
movwf TRISB
;*******************************************************************
; BAUD RATE para la comunicación RS232
; y otras definiciones para USART
;*******************************************************************
; Baud Rate = 9600, Sin Paridad, 1 Bit parada
movlw 0x19 ; 0x19=9600 bps (0x0C=19200 bps)
movwf SPBRG
movlw b'00100100' ;
movwf TXSTA ; habilita la transmisión Async
bcf STATUS,RP0 ; RAM PAGE 0
movlw b'10010000' ; habilita de recepción Async
movwf RCSTA
;*******************************************************************
; TIEMPO DE ESTABILIZACION
;*******************************************************************
clrf contador
estab decfsz contador,F
goto estab
movf RCREG,W
movf RCREG,W
movf RCREG,W ; vacía el buffer de recepción
bcf 0x27,1 ; usado por los sms perimetral
bcf 0x27,2 ; en reemplazo de PORTB,6
bcf 0x27,3 ; usado por los sms luces
bcf 0x27,4 ; LIBRE
bcf 0x27,5 ; LIBRE
bcf 0x27,6 ; LIBRE
bcf 0x27,7 ; LIBRE
bcf 0x27,0 ; usado por las zonas
;*******************************************************************
;Inicializacion del sistema
;*******************************************************************
movlw b'00000000' ; desabilita de recepción Async
movwf RCSTA
call rec9 ; espera 10 segundos a que
MODEM call DEMORA ; el MODEM quede en linea
decfsz dat10,1
goto MODEM
movf RCREG,W
movf RCREG,W
movf RCREG,W ; vacía el buffer de recepción
movlw b'10010000' ; habilita de recepción Async
movwf RCSTA
movf RCREG,W
movf RCREG,W
movf RCREG,W ; vacía el buffer de recepción
clrw
call id ; envia comandos AT para activar identificador de llamadas
bsf PORTB,7
call DEMORA1
bcf PORTB,7
call DEMORA1
bsf PORTB,7
call DEMORA1
bcf PORTB,7
call DEMORA1
bsf PORTB,7
call DEMORA1
bcf PORTB,7
call DEMORA1
call linea ; envio mensaje "EN LINEA"
call nada
movlw b'00000000' ; desabilita de recepción Async
movwf RCSTA
call rec4 ; espera 3 segundos antes de enviar
f17f
call DEMORA ; los comandos AT para habilitar
decfsz dat5,1 ; el identificador de llamadas
goto f17f
movlw b'10010000' ; habilita de recepción Async
movwf RCSTA
;--------------------------------------------------------------------
; Lazo principal
;--------------------------------------------------------------------
loop
clrw
btfss PIR1,RCIF ; (5) se fija si hay dato RS232
goto teclado ; no, no llegó
call recibeRS232 ; sí, hay
movwf dato_serie ; guarda dato (para uso de cualquier rutina)
call testeanumero ; llama rutina para testear clave
teclado
btfss PORTB,3
goto perimetral
goto activa
perimetral
btfss PORTB,6 ; chequeo zona 24hs
goto loop ; no detecta nada
goto disparo_7 ; detecto dispara sirena envia sms
activa
call nada ; nop
call sirena
bsf 0x27,2
bsf PORTB,4 ; enciende led
btfsc 0x27,1 ; testear bit de perimetral para activarlo o no
goto jk ; si esta activo sigue
bsf 0x27,1 ; pongo en alto el bit para indicar que esta activo
bsf PORTB,0 ; si no esta activado el cerco electrico
call DEMORA1 ; envio pulso para activarlo
call DEMORA1
call DEMORA1
bcf PORTB,0
jk movlw b'10010000' ; habilita de recepción Async
movwf RCSTA
call nada
call rec4 ; espera 3 segundos antes de enviar
f19
call DEMORA ; los comandos AT para habilitar
decfsz dat5,1 ; el identificador de llamadas
goto f19
call activ ; envio mensaje "ACTIVADO"
call nada
movlw b'00000000' ; desabilita de recepción Async
movwf RCSTA
call rec4 ; espera 3 segundos antes de enviar
f17
call DEMORA ; los comandos AT para habilitar
decfsz dat5,1 ; el identificador de llamadas
goto f17
movlw b'10010000' ; habilita de recepción Async
movwf RCSTA
call id ; envia comandos AT para activar identificador de llamadas
goto acti
acti
btfss PIR1,RCIF ; (5) se fija si hay dato RS232
goto des ; no, no llegó testea el teclado
call recibeRS232 ; sí, hay desactiva
movwf dato_serie ; guarda dato (para uso de cualquier rutina)
call testeanumero ; llama rutina para testear clave
goto des
des
btfss PORTB,3 ; si no hay actividad en el teclado
goto zonas ; testea las zonas
goto desactiva ; si hay desactiva
zonas
btfss PORTA,0 ; chequeo las zonas hasta volver a "acti"
goto zona_2 ; chequea si hay que desactivar si no
goto disparo_1 ; vuelve a chequear las zonas quedando
zona_2
btfss PORTA,1 ; asi el un bucle hasta que ocurra
goto zona_3 ; cualquiera de las dos situaciones
goto disparo_2
zona_3
btfss PORTA,2 ; si se produce un disparo en cualquiera
goto zona_4 ; de sus zonas activa la sirena y avisa
goto disparo_3 ; mediante un sms
zona_4
btfss PORTA,3
goto zona_5
goto disparo_4
zona_5
btfss PORTA,4
goto zona_6
goto disparo_5
zona_6
btfss PORTA,5
goto zona_7
goto disparo_6
zona_7
btfss PORTB,6
goto acti
goto disparo_7
disparo_1
bsf PORTB,7 ; activa la sirena
bsf PORTB,5 ; enciende las luces del patio
call z_1 ; envia mensaje de zona a la que corresponde
call asinc ; cuestiones del USART
goto espera ; entra en rutina para desactivar
disparo_2
bsf PORTB,7 ; activa la sirena
bsf PORTB,5 ; enciende las luces del patio
call z_2 ; envia mensaje de zona a la que corresponde
call asinc ; cuestiones del USART
goto espera ; entra en rutina para desactivar
disparo_3
bsf PORTB,7 ; activa la sirena
bsf PORTB,5 ; enciende las luces del patio
call z_3 ; envia mensaje de zona a la que corresponde
call asinc ; cuestiones del USART
goto espera ; entra en rutina para desactivar
disparo_4
bsf PORTB,7 ; activa la sirena
bsf PORTB,5 ; enciende las luces del patio
call z_4 ; envia mensaje de zona a la que corresponde
call asinc ; cuestiones del USART
goto espera ; entra en rutina para desactivar
disparo_5
bsf PORTB,7 ; activa la sirena
bsf PORTB,5 ; enciende las luces del patio
call z_5 ; envia mensaje de zona a la que corresponde
call asinc ; cuestiones del USART
goto espera ; entra en rutina para desactivar
disparo_6
bsf PORTB,7 ; activa la sirena
bsf PORTB,5 ; enciende las luces del patio
call z_6 ; envia mensaje de zona a la que corresponde
call asinc ; cuestiones del USART
goto espera ; entra en rutina para desactivar
disparo_7
bsf PORTB,7 ; activa la sirena
bsf PORTB,5 ; enciende las luces del patio
bsf 0x27,2 ; activo testeo ex porb6
call z_7 ; envia mensaje de zona a la que corresponde
call asinc ; cuestiones del USART
espera
btfss PORTB,3
goto esp
goto desactiva
esp
btfss PIR1,RCIF ; (5) se fija si hay dato RS232
goto espera ; no, no llegó testea las zonas
call recibeRS232 ; sí, hay desactiva
movwf dato_serie ; guarda dato (para uso de cualquier rutina)
call testeanumero ; llama rutina para testear clave
desactiva
call nada
movlw b'10010000' ; habilita de recepción Async
movwf RCSTA
call nada
bcf PORTB,7 ; desactiva sirena
bcf PORTB,5 ; apaga las luces del patio
bcf 0x27,3 ; pongo a 0 el bit de testeo de las luces
call DEMORA
call sirena
call DEMORA1
call sirena
call DEMORA
bcf PORTB,7 ; desactiva sirena
bcf 0x27,2 ; desactiva testeo EX PORTB,6
bcf PORTB,4 ; apago el led
call desact ; envio mensaje "DESACTIVADO"
call nada
movlw b'00000000' ; desabilita de recepción Async
movwf RCSTA
call rec4 ; espera 3 segundos antes de enviar
f18
call DEMORA ; los comandos AT para habilitar
decfsz dat5,1 ; el identificador de llamadas
goto f18
movlw b'10010000' ; habilita de recepción Async
movwf RCSTA
call id
bcf 0x27,0
goto loop
;***********************************************************************************
; RECIBE CARACTER SERIE - RS232 - DESDE LA PC
;***********************************************************************************
recibeRS232
movf RCREG,W ; guarda dato recibido en acumulador
return
;***********************************************************************************
; ENVIA CARACTER SERIE - RS232 - A LA PC Y ESPERA A QUE HAYA SALIDO
;***********************************************************************************
enviaRS232
movwf TXREG ; envío el dato en acunulador w
bsf STATUS,RP0 ; Pág 1 RAM
Espere
btfss TXSTA,TRMT ; transmision completa si es alto
goto Espere
bcf STATUS,RP0 ; Pág 0 RAM
return
;***********************************************************************************
; MUESTRA DATO
;***********************************************************************************
testeanumero
movwf dato_serie ; Guarda el contenido obtenido del puerto.
xorlw digito_5 ; ¿Es el caracter M?
btfsc STATUS,Z
goto a ; Si,si es chequea el proximo caracter
goto chequea
a movf RCREG,W ; Borra el buffer
movf RCREG,W ; para recibir
movf RCREG,W ; el proximo caracter
loopi btfss PIR1,RCIF ; (5) se fija si hay dato RS232
goto loopi ; no, no llegó
call recibeRS232 ; sí, hay
movwf dato_serie ; guarda dato (para uso de cualquier rutina)
xorlw digito_4 ; ¿Es el caracter o?
btfsc STATUS,Z
goto c ; Si,si es chequea el proximo caracter
goto chequea
c movf RCREG,W ; Borra el buffer
movf RCREG,W ; para recibir
movf RCREG,W ; el proximo caracter
loopo btfss PIR1,RCIF ; (5) se fija si hay dato RS232
goto loopo ; no, no llegó
call recibeRS232 ; sí, hay
movwf dato_serie ; guarda dato (para uso de cualquier rutina)
xorlw digito_3 ; ¿Es el caracter r?
btfsc STATUS,Z
goto m ; Si,si es chequea el proximo caracter
goto chequea
m movf RCREG,W ; Borra el buffer
movf RCREG,W ; para recibir
movf RCREG,W ; el proximo caracter
loopp btfss PIR1,RCIF ; (5) se fija si hay dato RS232
goto loopp ; no, no llegó
call recibeRS232 ; sí, hay
movwf dato_serie ; Recupera el contenido de la tecla pulsada.
xorlw digito_2 ; ¿Es el caracter e?
btfsc STATUS,Z
goto d ; Si,si es chequea el proximo caracter
goto chequea
d movf RCREG,W ; Borra el buffer
movf RCREG,W ; para recibir
movf RCREG,W ; el proximo caracter
loopk btfss PIR1,RCIF ; (5) se fija si hay dato RS232
goto loopk ; no, no llegó
call recibeRS232 ; sí, hay
movwf dato_serie ; Recupera el contenido de la tecla pulsada.
xorlw digito_1 ; ¿Es el caracter n?.
btfsc STATUS,Z
;----------------------------------------------------------------------------
goto bu_s ; Si,si es chequea el proximo caracter
goto chequea
bu_s movlw d'32' ; Cargo Contador = 32 pocisiones
movwf conta
busco
decfsz conta,1 ; Pregunto si ya se ha repetido 10 veces el ciclo?
goto c_1 ; No, repito.-
goto ac ; Si, verifico si hay que activar o desactivar.-
c_1 movf RCREG,W ; Borra el buffer
movf RCREG,W ; para recibir
movf RCREG,W ; el proximo caracter
c_11 btfss PIR1,RCIF ; (5) se fija si hay dato RS232
goto c_11 ; no, no llegó
call recibeRS232 ; sí, hay
movwf dato_serie ; guarda dato (para uso de cualquier rutina)
xorlw clave_1 ; ¿Es el caracter H?
btfsc STATUS,Z
goto c_2 ; Si,si es chequea el proximo caracter
goto busco ; no es vuelvo a chequear
c_2 movf RCREG,W ; Borra el buffer
movf RCREG,W ; para recibir
movf RCREG,W ; el proximo caracter
c_22 btfss PIR1,RCIF ; (5) se fija si hay dato RS232
goto c_22 ; no, no llegó
call recibeRS232 ; sí, hay
movwf dato_serie ; guarda dato (para uso de cualquier rutina)
xorlw clave_2 ; ¿Es el caracter o?
btfsc STATUS,Z
goto c_3 ; Si,si es chequea el proximo caracter
goto chequea
c_3 movf RCREG,W ; Borra el buffer
movf RCREG,W ; para recibir
movf RCREG,W ; el proximo caracter
c_33 btfss PIR1,RCIF ; (5) se fija si hay dato RS232
goto c_33 ; no, no llegó
call recibeRS232 ; sí, hay
movwf dato_serie ; Recupera el contenido de la tecla pulsada.
xorlw clave_3 ; ¿Es el caracter l?
btfsc STATUS,Z
goto c_4 ; Si,si es chequea el proximo caracter
goto chequea
c_4 movf RCREG,W ; Borra el buffer
movf RCREG,W ; para recibir
movf RCREG,W ; el proximo caracter
c_44 btfss PIR1,RCIF ; (5) se fija si hay dato RS232
goto c_44 ; no, no llegó
call recibeRS232 ; sí, hay
movwf dato_serie ; Recupera el contenido de la tecla pulsada.
xorlw clave_4 ; ¿Es el caracter a?.
btfsc STATUS,Z
goto c_5 ; clave chequeada activa relay
goto chequea
c_5 movf RCREG,W ; Borra el buffer
movf RCREG,W ; para recibir
movf RCREG,W ; el proximo caracter
c_55 btfss PIR1,RCIF ; (5) se fija si hay dato RS232
goto c_55 ; no, no llegó
call recibeRS232 ; sí, hay
movwf dato_serie ; Recupera el contenido de la tecla pulsada.
xorlw clave_5 ; ¿Es el caracter s?.
btfsc STATUS,Z
goto sms_2 ; clave chequeada activa 2 relay
goto sms
sms_2
movlw b'00000000' ; desabilita de recepción Async
movwf RCSTA
btfsc 0x27,3 ; si es cero
goto rel2_off
goto rel2_on
return
sms
movlw b'00000000' ; desabilita de recepción Async
movwf RCSTA
btfsc 0x27,1 ; si es cero
goto relay_off
goto relay_on
return
ac
movlw b'00000000' ; desabilita de recepción Async
movwf RCSTA
btfss 0x27,2 ; si esta activada este pin recibira un alto
goto activa ; Nº chequeado activa
goto desactiva ; Nº chequeado esta activada,la desactiva
return
;------------------------------------------------------------
;
;(0D)(0A)RING(0D)(0A)(0D)(0A)+CLIP: "+54261631708
;1",145,"",,"Moren",0(0D)(0A)
;(0D)(0A)NO CARRIER(0D)(0A) 60 pocisiones
;(00)
;(0D)(0A)+CMT: "+5426
;16317081","Moren","14/05/21,04
;:41:51-12"(0D)(0A)Hola(0D)(0A)
;(00)
; -
;------------------------------------------------------------
;***********************************************************************************
;chequea si tiene que activar, desactivar, o ir a espera
;***********************************************************************************
chequea
btfsc 0x27,0 ; si es cero testea EL BIT EX portb 6 si es uno goto espera
goto espera ; rutina para que no entre en bucle infinito cuando
btfss 0X27,2 ; testea el n° ya que si el caracter no era correcto
goto loop ; se salia de "espera" y se volvia a acti
goto acti
return
;----------------------------------------------------------------------
; relay
;----------------------------------------------------------------------
relay_on
bsf PORTB,0 ; cerco electrico
call DEMORA1 ; envio pulso para activarlo
call DEMORA1
call DEMORA1
bcf PORTB,0
bsf 0x27,1
call rec4 ; espera 3 segundos antes de enviar
f_9
call DEMORA ; los comandos AT para habilitar
decfsz dat5,1 ; el identificador de llamadas
goto f_9
movlw b'10010000' ; habilita de recepción Async
movwf RCSTA
call a_v ; envio mensaje "CERCO ELECTRICO ACTIVADO"
call actib ;
call nada
movlw b'00000000' ; desabilita de recepción Async
movwf RCSTA
call rec4 ; espera 3 segundos antes de enviar
f_7
call DEMORA ; los comandos AT para habilitar
decfsz dat5,1 ; el identificador de llamadas
goto f_7
movlw b'10010000' ; habilita de recepción Async
movwf RCSTA
call id ; envia comandos AT para activar identificador de llamadas
goto chequea
relay_off
bsf PORTB,0 ; desactivo el cerco electrico
call DEMORA1 ; envio pulso para desactivarlo
call DEMORA1
call DEMORA1
bcf PORTB,0
bcf 0x27,1
call rec4 ; espera 3 segundos antes de enviar
f_91
call DEMORA ; los comandos AT para habilitar
decfsz dat5,1 ; el identificador de llamadas
goto f_91
movlw b'10010000' ; habilita de recepción Async
movwf RCSTA
call a_v ; envio mensaje "CERCO ELECTRICO DESACTIVADO"
call d_e ;
call nada
movlw b'00000000' ; desabilita de recepción Async
movwf RCSTA
call rec4 ; espera 3 segundos antes de enviar
f_71
call DEMORA ; los comandos AT para habilitar
decfsz dat5,1 ; el identificador de llamadas
goto f_71
movlw b'10010000' ; habilita de recepción Async
movwf RCSTA
call id ; envia comandos AT para activar identificador de llamadas
goto chequea
rel2_on
bsf PORTB,5
bsf 0x27,3
call rec4 ; espera 3 segundos antes de enviar
f_93
call DEMORA ; los comandos AT para habilitar
decfsz dat5,1 ; el identificador de llamadas
goto f_93
movlw b'10010000' ; habilita de recepción Async
movwf RCSTA
call a_vv ; envio mensaje "CERCO ELECTRICO ACTIVADO"
call actib ;
call nada
movlw b'00000000' ; desabilita de recepción Async
movwf RCSTA
call rec4 ; espera 3 segundos antes de enviar
f_73
call DEMORA ; los comandos AT para habilitar
decfsz dat5,1 ; el identificador de llamadas
goto f_73
movlw b'10010000' ; habilita de recepción Async
movwf RCSTA
call id ; envia comandos AT para activar identificador de llamadas
goto chequea
rel2_off
bcf PORTB,5
bcf 0x27,3
call rec4 ; espera 3 segundos antes de enviar
f_911
call DEMORA ; los comandos AT para habilitar
decfsz dat5,1 ; el identificador de llamadas
goto f_911
movlw b'10010000' ; habilita de recepción Async
movwf RCSTA
call a_vv ; envio mensaje "CERCO ELECTRICO DESACTIVADO"
call d_e ;
call nada
movlw b'00000000' ; desabilita de recepción Async
movwf RCSTA
call rec4 ; espera 3 segundos antes de enviar
f_711
call DEMORA ; los comandos AT para habilitar
decfsz dat5,1 ; el identificador de llamadas
goto f_711
movlw b'10010000' ; habilita de recepción Async
movwf RCSTA
call id ; envia comandos AT para activar identificador de llamadas
goto chequea
;**********************************************************************************
;TEMPORIZADOR 1S
;**********************************************************************************
DEMORA movlw .14 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .72 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .247 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;-------------------------------------------------------------
; TEMPORIZADOR 100 MS
;-------------------------------------------------------------
DEMORA1 movlw .110 ; 1 set numero de repeticion (B)
movwf PDel0A ; 1 |
PLoop1A movlw .181 ; 1 set numero de repeticion (A)
movwf PDel1A ; 1 |
PLoop2A clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel1A, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2A ; 2 no, loop
decfsz PDel0A, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1A ; 2 no, loop
PDelL1A goto PDelL2A ; 2 ciclos delay
PDelL2A goto PDelL3A ; 2 ciclos delay
PDelL3A clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;***********************************************************************************
;rutina para que espere
;***********************************************************************************
rec9 clrf dat10
movlw .15 ; 10 SEGUNDOS
movwf dat10
return
rec4 clrf dat5
movlw .3 ; 3 SEGUNDOS
movwf dat5
return
;***********************************************************************************
; MENSAJES
;***********************************************************************************
AT
movlw 'A' ; Envia comandos AT para habilitar
call enviaRS232 ; identificador de llamada
movlw 'T' ; AT+CLIP=1
call enviaRS232
movlw '+'
call enviaRS232
return
id
call AT ; identificador de llamada
movlw 'C'
call enviaRS232
movlw 'L'
call enviaRS232
movlw 'I'
call enviaRS232
movlw 'P'
call enviaRS232
movlw '='
call enviaRS232
movlw '1'
call enviaRS232
call enter
movlw b'00000000' ; desabilita de recepción Async
movwf RCSTA
call nada
call DEMORA1
call DEMORA1
call DEMORA1
call DEMORA1
call DEMORA1
call DEMORA1
movf RCREG,W
movf RCREG,W
movf RCREG,W ; vacía el buffer de recepción
movlw b'10010000' ; habilita de recepción Async
movwf RCSTA
movf RCREG,W
movf RCREG,W
movf RCREG,W ; vacía el buffer de recepción
nada nop ; para el micro para no recibir el OK
nop ; del envio del AT+CLIP=1
nop
nop
nop
nop
nop
nop
nop
return
pdu
call AT ; activo modo texto para sms
movlw 'C'
call enviaRS232
movlw 'M'
call enviaRS232
movlw 'G'
call enviaRS232
movlw 'F'
call enviaRS232
movlw '='
call enviaRS232
movlw '1'
call enviaRS232
call enter
call DEMORA
call AT
movlw 'C'
call enviaRS232
movlw 'M'
call enviaRS232
movlw 'G'
call enviaRS232
movlw 'S'
call enviaRS232
movlw '='
call enviaRS232
call num
return
a_v
call pdu
movlw 'C'
call enviaRS232
movlw 'E'
call enviaRS232
movlw 'R'
call enviaRS232
movlw 'C'
call enviaRS232
movlw 'O'
call enviaRS232
movlw ' '
call enviaRS232
movlw 'E'
call enviaRS232
movlw 'L'
call enviaRS232
movlw 'E'
call enviaRS232
movlw 'C' ;CERCO ELECTRICO
call enviaRS232
movlw 'T'
call enviaRS232
movlw 'R'
call enviaRS232
movlw 'I'
call enviaRS232
movlw 'C'
call enviaRS232
movlw 'O'
call enviaRS232
movlw ' '
call enviaRS232
return
a_vv
call pdu
movlw 'L'
call enviaRS232
movlw 'U'
call enviaRS232
movlw 'C'
call enviaRS232
movlw 'E'
call enviaRS232
movlw 'S'
call enviaRS232
movlw ' '
call enviaRS232 ;LUCES PATIO
movlw 'P'
call enviaRS232
movlw 'A'
call enviaRS232
movlw 'T'
call enviaRS232
movlw 'I'
call enviaRS232
movlw 'O'
call enviaRS232
movlw ' '
call enviaRS232
return
linea
call pdu
movlw 'E'
call enviaRS232
movlw 'N'
call enviaRS232
movlw ' '
call enviaRS232
movlw 'L'
call enviaRS232
movlw 'I' ;EN LINEA
call enviaRS232
movlw 'N'
call enviaRS232
movlw 'E'
call enviaRS232
movlw 'A'
call enviaRS232
call entz
return
activ
call pdu
actib
movlw 'A'
call enviaRS232
movlw 'C'
call enviaRS232
movlw 'T'
call enviaRS232
movlw 'I'
call enviaRS232 ;ACTIVADO
movlw 'V'
call enviaRS232
movlw 'A'
call enviaRS232
movlw 'D'
call enviaRS232
movlw 'O'
call enviaRS232
call entz
return
desact
call pdu
d_e
movlw 'D'
call enviaRS232
movlw 'E'
call enviaRS232
movlw 'S'
call enviaRS232
call actib
return
alarma
call enter
movlw ' '
call enviaRS232
movlw 'D'
call enviaRS232
movlw 'I'
call enviaRS232
movlw 'S'
call enviaRS232
movlw 'P'
call enviaRS232
movlw 'A'
call enviaRS232
movlw 'R'
call enviaRS232
movlw 'O'
call enviaRS232
movlw ' ' ;DISPARO ALARMA
call enviaRS232
movlw 'A'
call enviaRS232
movlw 'L'
call enviaRS232
movlw 'A'
call enviaRS232
movlw 'R'
call enviaRS232
movlw 'M'
call enviaRS232
movlw 'A'
call enviaRS232
call entz
return
num
movlw '"'
call enviaRS232
movlw '2'
call enviaRS232
movlw '6' ; aca se programa el numero al cual tiene que dar aviso
call enviaRS232
movlw '1'
call enviaRS232
movlw '6'
call enviaRS232
movlw '6'
call enviaRS232
movlw '9'
call enviaRS232
movlw '3'
call enviaRS232
movlw '1'
call enviaRS232
movlw '3'
call enviaRS232
movlw '5'
call enviaRS232
movlw '"'
call enviaRS232
call enter
call DEMORA
return
z_1
call zone
movlw '1'
call enviaRS232
movlw ' '
call enviaRS232
movlw 'H'
call enviaRS232
movlw 'A'
call enviaRS232
movlw 'B'
call enviaRS232
movlw 'I'
call enviaRS232
movlw 'T'
call enviaRS232
movlw 'A'
call enviaRS232
movlw 'C'
call enviaRS232
movlw 'I'
call enviaRS232
movlw 'O'
call enviaRS232
movlw 'N'
call enviaRS232
movlw ' '
call enviaRS232
movlw 'M'
call enviaRS232
movlw 'A'
call enviaRS232
movlw 'T'
call enviaRS232
movlw 'R'
call enviaRS232
movlw 'I'
call enviaRS232
movlw 'M'
call enviaRS232
movlw 'O'
call enviaRS232
movlw 'N'
call enviaRS232
movlw 'I'
call enviaRS232
movlw 'A'
call enviaRS232
movlw 'L'
call enviaRS232
call alarma
return
z_2
call zone
movlw '2'
call enviaRS232
movlw ' '
call enviaRS232
movlw 'H'
call enviaRS232
movlw 'A'
call enviaRS232
movlw 'B'
call enviaRS232
movlw 'I'
call enviaRS232
movlw 'T'
call enviaRS232
movlw 'A'
call enviaRS232
movlw 'C'
call enviaRS232
movlw 'I'
call enviaRS232
movlw 'O'
call enviaRS232
movlw 'N'
call enviaRS232
movlw ' '
call enviaRS232
movlw 'N'
call enviaRS232
movlw 'I'
call enviaRS232
movlw 'Ñ'
call enviaRS232
movlw 'A'
call enviaRS232
movlw 'S'
call enviaRS232
call alarma
return
z_3
call zone
movlw '3'
call enviaRS232
movlw ' '
call enviaRS232
movlw 'T'
call enviaRS232
movlw 'E'
call enviaRS232
movlw 'C'
call enviaRS232
movlw 'H'
call enviaRS232
movlw 'O'
call enviaRS232
call alarma
return
z_4
call zone
movlw '4'
call enviaRS232
movlw ' '
call enviaRS232
movlw 'C'
call enviaRS232
movlw 'O'
call enviaRS232
movlw 'C'
call enviaRS232
movlw 'I'
call enviaRS232
movlw 'N'
call enviaRS232
movlw 'A'
call enviaRS232
call alarma
return
z_5
call zone
movlw '5'
call enviaRS232
movlw ' '
call enviaRS232
movlw 'L'
call enviaRS232
movlw 'I'
call enviaRS232
movlw 'V'
call enviaRS232
movlw 'I'
call enviaRS232
movlw 'N'
call enviaRS232
movlw 'G'
call enviaRS232
call alarma
return
z_6
call zone
movlw '6'
call enviaRS232
movlw ' '
call enviaRS232
movlw 'C'
call enviaRS232
movlw 'O'
call enviaRS232
movlw 'C'
call enviaRS232
movlw 'H'
call enviaRS232
movlw 'E'
call enviaRS232
movlw 'R'
call enviaRS232
movlw 'A'
call enviaRS232
call alarma
return
z_7
call zone
movlw '7'
call enviaRS232
movlw ' '
call enviaRS232
movlw 'P'
call enviaRS232
movlw 'E'
call enviaRS232
movlw 'R'
call enviaRS232
movlw 'I'
call enviaRS232
movlw 'M'
call enviaRS232
movlw 'E'
call enviaRS232
movlw 'T'
call enviaRS232
movlw 'R'
call enviaRS232
movlw 'A'
call enviaRS232
movlw 'L'
call enviaRS232
call alarma
return
zone
call pdu
movlw 'Z'
call enviaRS232
movlw 'O'
call enviaRS232
movlw 'N'
call enviaRS232
movlw 'A'
call enviaRS232
movlw '_'
call enviaRS232
return
entz
call enter
call contrz
return
enter
movlw 0X0d ; enter
call enviaRS232
return
contrz
movlw 0x1A ; Control+Z
call enviaRS232
return
asinc
movlw b'00000000'
movwf RCSTA
call DEMORA
movf RCREG,W
movf RCREG,W
movf RCREG,W
movlw b'10010000'
movwf RCSTA
call rec4
movf RCREG,W
movf RCREG,W
movf RCREG,W
bsf 0x27,0
sinc
call DEMORA
decfsz dat5,1
goto sinc
clrw
call id ; envia comandos AT para activar identificador de llamadas
return
sirena
bsf PORTB,7
call DEMORA1
bcf PORTB,7 ; desactiva sirena
return
END
Unas imagenes, me falta un video cortito funcionando que luego lo coloco!
Gracias.