Autor Tema: Alarma GSM pero en assembler (aporte)  (Leído 3037 veces)

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

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Alarma GSM pero en assembler (aporte)
« en: 05 de Enero de 2016, 17:45:04 »
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

Código: [Seleccionar]
;******************************************************
; 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. :-)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Alarma GSM pero en assembler (aporte)
« Respuesta #1 en: 05 de Enero de 2016, 18:10:45 »
Gracias por el codigo, interesante para los que no usan mucho ASM. hay cosas que se pueden "mejorar" para que sea mas legible, como el envio de comandos. Tal ves con otro PIC que posea una lectura de la Flash ya que no recuerdo si el 16F268A lo posee. Pero que lo harian mucho mas corto en longitud al codigo. Obviamente no tiene nada de malo como esta realizado.

Te felicito por el poyecto y gracias por compartir

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re:Alarma GSM pero en assembler (aporte)
« Respuesta #2 en: 05 de Enero de 2016, 19:48:18 »
Gracias por el codigo, interesante para los que no usan mucho ASM. hay cosas que se pueden "mejorar" para que sea mas legible, como el envio de comandos. Tal ves con otro PIC que posea una lectura de la Flash ya que no recuerdo si el 16F268A lo posee. Pero que lo harian mucho mas corto en longitud al codigo. Obviamente no tiene nada de malo como esta realizado.

Te felicito por el poyecto y gracias por compartir

Si, estoy totalmente de acuerdo en que hay mucho que mejorar, pero cuando lo realice alla por el 2008 habían muchas cosas que no sabia como hacerlas, por ejemplo nunca había usado el RS232 y tuve que primero aprender a usarlo para luego seguir con el envio de comandos y demás, a eso agregar que las pruebas las realizaba con un teléfono sony ericson que usaba como modem, y cuando le conecte el modem sim340 no funcionaba, y tuve que volver a reescribir casi todo el código, y entonces surgieron cosas como estas:

Código: [Seleccionar]
         movf RCREG,W     ; Borra el buffer
    movf RCREG,W     ; para recibir
    movf RCREG,W     ; el proximo caracter

Siempre me pregunte por que con una sola linea no lo borraba, hasta recientemente que me di cuenta de que el modem inserta una respuesta propia de el ademas del mensaje original.
Quería agregar que este equipo esta funcionando actualmente como sistema de seguridad en casa, y siempre causa sensación cuando alguien ve que de saco mi celular para activarla o desactivarla ! :mrgreen:

Desconectado AG1

  • PIC16
  • ***
  • Mensajes: 105
Re:Alarma GSM pero en assembler (aporte)
« Respuesta #3 en: 05 de Enero de 2016, 21:06:42 »
Hola kapotik:

   Aunque no dudo que el código funcione bien, según el datasheet del PIC PIC16F628A:
     "TRISB<1> and TRISB<2> should both be set to ‘1’ to configure the RB1/RX/DT and RB2/TX/CK pins as inputs. Output drive, when required, is controlled by the peripheral circuitry."


      con lo que en vez de esta instrucción:
      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
 
      debería ser esta otra:
      movlw    b'01001110'   ; RB0 SALIDA      0
                     ; RB1 (RX) = entrada   1
                     ; RB2 (TX) = entrada   1
                     ; RB3 = entrada      1
                     ; RB4 = salida       0
                     ; RB5 = salida       0
                     ; RB6 = entrada      1
                     ; RB7 = salida      0

     He visto el código ASM que genera algún compilador y, para este PIC, asigna TX como entrada.

Salu2:

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re:Alarma GSM pero en assembler (aporte)
« Respuesta #4 en: 05 de Enero de 2016, 22:15:38 »
Hola kapotik:

   Aunque no dudo que el código funcione bien, según el datasheet del PIC PIC16F628A:
     "TRISB<1> and TRISB<2> should both be set to ‘1’ to configure the RB1/RX/DT and RB2/TX/CK pins as inputs. Output drive, when required, is controlled by the peripheral circuitry."


      con lo que en vez de esta instrucción:
      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
 
      debería ser esta otra:
      movlw    b'01001110'   ; RB0 SALIDA      0
                     ; RB1 (RX) = entrada   1
                     ; RB2 (TX) = entrada   1
                     ; RB3 = entrada      1
                     ; RB4 = salida       0
                     ; RB5 = salida       0
                     ; RB6 = entrada      1
                     ; RB7 = salida      0

     He visto el código ASM que genera algún compilador y, para este PIC, asigna TX como entrada.

Salu2:

Yo no soy un experto en esto, pero vos tenes razon, lo que me parece es que cuando se configura el USART lo cambia a como dices tu fijate

Código: [Seleccionar]
; 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


Saludos