# [Aporte] Central de Alarma con PIC



## torres.electronico (Mar 8, 2016)

​
Saludos; Bueno, aqui voy a ir subiendo mis avances con este proyecto que lo tengo en un 70% finalizado. 
Basicamente, lo que les voy a compartir en esta oportunidad, es un sistema de alarma domestico, que en lo posible, no va a tener nada que envidiarle a un sistema comercial (DSC,HONEYWELL,X28,etc...).
Habia armado un sistema con opcion salida backup celular (un simple telefono arcaico motorrolla C115), y ahora quiero hacer algo mas complejo para que el usuario pueda sacarle mas jugo a este proyecto.
En el primer proyecto (ver archivo ejemploALARMA), el sistema monitorea 6 entradas todo/nada (pueden conectar sensores magneticos, barreras o PIR) y una entrada extra para uso exclusivo del pulsador de PANICO.
Todo muy lindo hasta acá, pero hoy estaba haciendo el PCB y mientras lo diseñaba, se me pasaron un par de ideas que las quiero poner en practica, por que el sistema tendria que ser lo mas amoldable posible para el cliente... o sea, la opcion de poder configurar los sensores en 3 modos difierentes (Instantaneo-Presente/Ausente-Interior) seria ideal, ya que con ello, podemos luego armar el sistema en modo presente o ausente y darle un valor de importancia a cada sensor segun zona.

Ver el archivo adjunto ALARMA_c115.PDF


----------



## torres.electronico (Mar 9, 2016)

Bueno, voy compartiendo lo que tengo hasta ahora y que esta funcional... deje unos comentarios en el programa por si quieren ir jugando un poco y colaborar.
En la ultima parte del programa, estoy arrancando con lo que va a ser la configuracion de las zonas y tengo que sumarle como programar desde teclado los dos numeros de telefono... 
el teclado tenia en mente hacer algo extra y con comunicacion RF o un simple hilo de pin a pin... lo estoy carburando bien ya que dos display en un proyecto no seria nada barato... quizas meta el display en el teclado y quede mejor... alguna idea, sugerencia, modificacion para mejora? Saludos 




```
'****************************************************************
'*  Name   : BackupCelular_c115.BAS                             *
'*  Author : Alejandro Martin Torres                            *
'*  Notice : Copyright (c) 2015 BIOEEA desarrollos Tecnologicos *
'*  Notice:      Prohibida su venta - www.forosdeelectronica.com    *
'*         : All Rights Reserved                                *
'*  Date   : 05/06/2015                                         *
'*  Version: 1.0                                                *
'*  Notes  :  comandos AT                                       *
'*         :at+cmgf= formato del mensaje (1-0)                  *
'*         :at+cmgs=enviar mensaje                              *
'*         :at+cmgd=borrar mensaje                              *
'*         :at+cbc=estdo bateria                                *
'*         :at+chup=cuelga la llamada                           *
'*         :at+cmod=                                            *
'****************************************************************
include "modedefs.bas"
ADCON1=7
DEFINE OSC 20
  
define LCD_DREG PORTD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 2

LEDROJO VAR PORTA.3
LEDAMARILLO VAR PORTA.4
LEDVERDE VAR PORTA.5

zona1 var PORTB.2
zona2 var PORTB.3
zona3 var PORTB.4
zona4 var PORTB.5
zona5 var PORTB.6
zona6 var PORTB.7

RELE1 VAR PORTC.0
RELE2 VAR PORTC.1
RELE3 VAR PORTC.2
RELE4 var PORTC.4
BIP VAR PORTC.3

OPTION_REG=%10000010        
;INTCON=%10100001           
;TMR0=0 
;T2CON = %00000110
;PR2=124

TRISB=%11111111

;--DEFINICION DE VARIABLES-- 
x var byte
Z VAR BYTE
Z1 VAR BYTE
Z2 VAR BYTE
Z3 var byte
Z4 var byte
Z5 var byte
Z6 var byte
Z7 var byte
m var byte
n var byte
o var byte
SENAL VAR BYTE
NUM0 var byte

TZONA1 var byte
TZONA2 VAR BYTE
TZONA3 VAR BYTE
TZONA4 VAR BYTE
TZONA5 VAR BYTE
TZONA6 VAR BYTE
TIEMPO VAR BYTE

NUMA1 var byte
NUMB1 var byte
NUMC1 var byte
NUMD1 var byte
NUME1 var byte
NUMF1 var byte
NUMG1 var byte
NUMH1 var byte

NUMA2 var byte
NUMB2 var byte
NUMC2 var byte
NUMD2 var byte
NUME2 var byte
NUMF2 var byte
NUMG2 var byte
NUMH2 var byte

COD1 VAR BYTE
COD2 VAR BYTE
COD3 VAR BYTE
COD4 VAR BYTE

contador var byte
;***CODIGO DE AREA*****************
COD1 = 0                         ;* aca colocamos
COD2 = 2                         ;* el codigo
COD3 = 9                         ;* de area de sus
COD4 = 7                         ;* telefonos
;***numero de usuario1*************
NUM0  = 1                        ;*
NUMA1 = 5                        ;*
NUMB1 = 6                        ;* aca colocamos
NUMC1 = 2                        ;* el numero de 
NUMD1 = 5                        ;* telefono
NUME1 = 6                        ;* al que queremos
NUMF1 = 1                        ;* llamar 1ero
NUMG1 = 7                        ;*
NUMH1 = 3                        ;*
;***numero de usuario2*************
NUMA2 = 1                        ;*
NUMB2 = 1                        ;*
NUMC2 = 1                        ;* aca colocamos
NUMD2 = 1                        ;* el numero de
NUME2 = 1                        ;* telefono
NUMF2 = 1                        ;* al que queremos
NUMG2 = 1                        ;* llamar 2do
NUMH2 = 1                        ;*
;**********************************
n = "D"
m = "D"
O = "D"

;***********************************************
ON INTERRUPT GoTo DISPARO
;***********************************************

BOOT:
LCDOUT $FE,1
PAUSE 200
LCDOUT $FE,$80,"-Proyectos  ETI-"
LCDOUT $FE,$C0,"ALARMA BackUP v1"
PAUSE 4000
LCDOUT $FE, 1 
LCDOUT $FE,$80,"- version DEMO -"                                  
FOR CONTADOR = 184 TO 120 STEP -1               'Cuenta atras    
LCDOUT $FE, CONTADOR, 20, 0, 1, "-www.forosdeelectronica.com"      'Imprimir en pantalla
PAUSE 100                                       'Pausa de 0,15 segundos
NEXT CONTADOR                                   'Regresa a CONTADOR
PAUSE 100                                      'Pausa de 2 segundos
FOR CONTADOR = 120 TO 189                       'Cuenta hacia delante
LCDOUT $FE, CONTADOR, 20, 0, 1, "-www.forosdeelectronica.com"      'Imprimir en pantalla
PAUSE 100                                       'Pausa de 0,15 segundos
NEXT CONTADOR 
pause 2000    
IF PORTA.0 = 0 THEN CONFIG
IF PORTA.1 = 0 THEN BACKUP
GOTO BOOT

;*************************************************
;*En esta seccion, tenemos el cuerpo del programa*
;*para el control de la alarma y backup          *
;*************************************************
BACKUP:
SENAL=0
LCDOUT $FE,1
PAUSE 200
LCDOUT $FE,$80,"  MODO ALARMA   "
LCDOUT $FE,$C0,"  DESACTIVADA   "
BACKUP2:
SERIN PORTB.1,T2400,50,BACKUP2,SENAL       ; señal rf proveniente de un llavero o teclado RF
if SENAL="A" then 
    HIGH BIP
    PAUSE 900
    LOW BIP
    GOTO CHECK
   ENDIF
GOTO BACKUP2

;******************************************
;En esta seccion monitoreamos los sensores*
;******************************************
CHECK:
if zona1 = 0 then Z1=1
if zona2 = 0 then Z2=2
if zona3 = 0 then Z3=3
if zona4 = 0 then Z4=4
if zona5 = 0 then Z5=5
if zona6 = 0 then Z6=6
IF PORTB.0=0 THEN Z7=7

if Z1 > 0 THEN ERROR   ;si el sensor esta activado, no dejar armar
if Z2 > 0 THEN ERROR
if Z3 > 0 THEN ERROR
if Z4 > 0 THEN ERROR
if Z5 > 0 THEN ERROR
if Z6 > 0 THEN ERROR
IF Z7 > 0 THEN ERROR
GOTO INICIO

;*******************************************************
;*En esta seccion monitoreamos cuales son las zonas con*
;*errores o problemas que no nos permite armar sistema *
;*******************************************************
ERROR:
LCDOUT $FE,1
PAUSE 200
LCDOUT $FE,$80,"ERROR EN ZONAS: "
LCDOUT $FE,$C0,DEC Z1," ",DEC Z2," ",DEC Z3," ",DEC Z4," ",DEC Z5," ",DEC Z6," ",DEC Z7
PAUSE 2000
Z1=0
Z2=0
Z3=0
Z4=0
Z5=0
Z6=0
Z7=0
GOTO BACKUP

;***************************
;En esta seccion, la alarma trabaja en modo armado
;***************************

INICIO:
LCDOUT $FE,1
PAUSE 200
LCDOUT $FE,$80,"  MODO ALARMA   "
LCDOUT $FE,$C0,"    ACTIVADA    "

RF:
SERIN PORTB.1,T2400,50,ZONAS,SENAL
if SENAL="A" then BACKUP    
if SENAL="B" then DISPARO 
if SENAL="C" then DISPARO
if SENAL="D" then DISPARO

zonas:
if zona1 = 0 then disparo
if zona2 = 0 then disparo
if zona3 = 0 then disparo
if zona4 = 0 then disparo
if zona5 = 0 then disparo
if zona6 = 0 then disparo
IF PORTB.0=0 THEN
   LCDOUT $FE,1
   LCDOUT $FE,$80," ALARMA PANICO  "
   LCDOUT $FE,$C0,"    LLAMANDO    "
   PAUSE 1500
   GOTO DISPARO
  ENDIF
PAUSE 50
goto RF

;**************************************************
;*En esta seccion, se deja un aviso en el display *
;*mencionando que se a tenido un evento y que debe*
;*ser reseteado a modo notificado/enterado.Esto es*
;por si el backup fallo en la comunicacion        *
;**************************************************
EVENTO:
LCDOUT $FE,1
   LCDOUT $FE,$80," HAY UN EVENTO  "
   LCDOUT $FE,$C0," SIN REGISTRAR  "
EVENTO2:
HIGH BIP
SERIN PORTB.1,T2400,800,EVENTO2,SENAL
if SENAL="D" then 
   LCDOUT $FE,1
   LCDOUT $FE,$80,"     ALARMA     "
   LCDOUT $FE,$C0,"   RESTAURADA   "
   PAUSE 1500
   GOTO BACKUP
ENDIF
LOW BIP
PAUSE 500
GOTO EVENTO

;***************************
;===========================
;***************************
CONTEO:
IF Z < 10 THEN HIGH RELE1 : LOW RELE2 : LOW RELE3
IF Z > 17 THEN HIGH RELE3 : LOW RELE1 : LOW RELE2
IF Z > 11 AND Z < 17 THEN HIGH RELE2 : LOW RELE1 : LOW RELE3
RETURN
;***************************
;En esta seccion, voy a sumar todo lo que comente de configuracion
;casi seguro que voy a tener que cambiar varias cosas de arriba.
;por el momento, es lo que hay
;***************************

CONFIG:
LCDOUT $FE,1
PAUSE 200
LCDOUT $FE,$80," MODO PRUEBA DE "
LCDOUT $FE,$C0,"    SISTEMA     "
PAUSE 2000
GOTO INISISTEMA
;***************************

INISISTEMA:
LCDOUT $FE,1
LCDOUT $FE,$80,"    INICIANDO   "
LCDOUT $FE,$C0,"     SISTEMA    "
FOR x = 0 to 4
high bip
pause 800
low bip
next
LCDOUT $FE,1
FOR x = 0 to 25
LCDOUT $FE,$80,"INICIANDO PASO1"
LCDOUT $FE,$C0,"%",DEC Z,"..."
high ledrojo
high ledverde
GOSUB CONTEO
pause 700
low ledrojo
low ledverde
pause 700
Z=Z+1
next
LOW RELE1:LOW RELE2:LOW RELE3
FOR x = 0 to 2
high bip
pause 800
low bip
next

pause 1000
LCDOUT $FE,1
PAUSE 200
LCDOUT $FE,$80,"INICIANDO PASO2"
LCDOUT $FE,$C0,"%30......"
high ledverde
pause 1000

serout2 portc.6,84,["AT",13]
pause 1000
LCDOUT $FE,1
PAUSE 200
LCDOUT $FE,$80,"INICIANDO PASO2"
LCDOUT $FE,$C0,"%50........."
serout2 portc.6,84,["AT",13]
pause 1000
LCDOUT $FE,1
PAUSE 200
LCDOUT $FE,$80,"PASO5 CONECTE EL"
LCDOUT $FE,$C0,"   EQUIPO GSM   "
high ledverde
high bip
PAUSE 2000
LCDOUT $FE,1
PAUSE 200
LCDOUT $FE,$80,"INICIANDO PASO2"
LCDOUT $FE,$C0,"%70..........."
LOW LEDVERDE
LOW BIP
pause 1000
;***MUESTRA LOS DOS NUMEROS DE CELULARES PROGRAMADOS***
LCDOUT $FE,1
PAUSE 200
LCDOUT $FE,$80,DEC NUMA1,DEC NUMB1,DEC NUMC1,DEC NUMD1,DEC NUME1,DEC NUMF1,DEC NUMG1,DEC NUMH1
LCDOUT $FE,$C0,DEC NUMA2,DEC NUMB2,DEC NUMC2,DEC NUMD2,DEC NUME2,DEC NUMF2,DEC NUMG2,DEC NUMH2
PAUSE 5000
;***prueba los NUMEROS DE CELULARES PROGRAMADOS***
LCDOUT $FE,1
PAUSE 200
LCDOUT $FE,$80," PRUEBA COM_CEL "
LCDOUT $FE,$C0,"%90............."
high ledrojo
serout2 portc.6,84,["AT",13]
pause 1000
serout2 portc.6,84,["AT+CMPS=",34,"SM",34,44,34,"SM",34,44,34,"SM",34,13]
pause 1500
serout2 portc.6,84,["AT+CMPS=",34,"ME",34,44,34,"ME",34,44,34,"ME",34,13]
PAUSE 1500
serout2 portc.6,84,["AT+CMGF=1",13] ; pasar modem gsm a modo texto
pause 500
gosub numeroTEL1
PAUSE 300
SEROUT2 portc.6,84,["BIENVENIDO=",m,n,o,26]; enviar
pause 200
gosub numeroTEL1
pause 300
SEROUT2 portc.6,84,["BIENVENIDO=",m,n,o,26]

pause 5000

serout2 portc.6,84,["AT",13]
pause 1000
serout2 portc.6,84,["AT+CMPS=",34,"SM",34,44,34,"SM",34,44,34,"SM",34,13]
pause 1500
serout2 portc.6,84,["AT+CMPS=",34,"ME",34,44,34,"ME",34,44,34,"ME",34,13]
PAUSE 1500
serout2 portc.6,84,["AT+CMGF=1",13] ; pasar modem gsm a modo texto
pause 500
gosub numeroTEL2
PAUSE 300
SEROUT2 portc.6,84,["BIENVENIDO=",m,n,o,26]; enviar
pause 200
gosub numeroTEL2
pause 300
SEROUT2 portc.6,84,["BIENVENIDO=",m,n,o,26]
low ledrojo
pause 300
LCDOUT $FE,1
PAUSE 200
LCDOUT $FE,$80,"FIN PRUEBA SIST "
LCDOUT $FE,$C0,"%100............"
PAUSE 3000
GOTO configSISTEMA

;===fin configuracion modem===
numeroTEL1:
serout2 portc.6,84,["AT+CMGS=",34,DEC COD1,DEC COD2,DEC COD3,DEC COD4,DEC NUM0,DEC NUMA1,DEC NUMB1,DEC NUMC1,DEC NUMD1,DEC NUME1,DEC NUMF1,DEC NUMG1,DEC NUMH1,34,13]
return
numeroTEL2:
serout2 portc.6,84,["AT+CMGS=",34,DEC COD1,DEC COD2,DEC COD3,DEC COD4,DEC NUM0,DEC NUMA2,DEC NUMB2,DEC NUMC2,DEC NUMD2,DEC NUME2,DEC NUMF2,DEC NUMG2,DEC NUMH2,34,13]
return

;DISABLE

DISPARO:
LCDOUT $FE,1
PAUSE 200
LCDOUT $FE,$80,"      ZONA      "
LCDOUT $FE,$C0,"     ALERTA     "
x = 0 
DISPARO1:
IF X = 10 THEN DISPARO2
X=X+1
high bip
pause 800
low bip
SERIN PORTB.1,T2400,300,DISPARO1,SENAL
if SENAL="A" then BACKUP
GOTO DISPARO1


DISPARO2:
HIGH BIP
;IF PORTB.0 = 0 THEN
LCDOUT $FE,1
PAUSE 200
LCDOUT $FE,$80,"    -DISPARO-   "
LCDOUT $FE,$C0,"    LLAMANDO    "
PAUSE 100
HIGH LEDrojo
SEROUT2 portc.6,84,["AT",13]
PAUSE 500
serout2 portc.6,84,["AT",13]
PAUSE 500
serout2 portc.6,84,["AT+CMPS=",34,"SM",34,44,34,"SM",34,44,34,"SM",34,13]
pause 2000
serout2 portc.6,84,["AT+CMPS=",34,"ME",34,44,34,"ME",34,44,34,"ME",34,13]
PAUSE 2000
serout2 portc.6,84,["AT+CMGF=1",13] ; pasar modem gsm a modo texto
pause 500
gosub numeroTEL1 
PAUSE 300
SEROUT2 portc.6,84,["DISPARO ALARMA",26]; enviar
pause 200
gosub NumeroTEL1
pause 300
SEROUT2 portc.6,84,["DISPARO ALARMA",26]; enviar
PAUSE 5000
SEROUT2 portc.6,84,["AT",13]
PAUSE 1000
serout2 portc.6,84,["AT+CMPS=",34,"SM",34,44,34,"SM",34,44,34,"SM",34,13]
pause 2000
serout2 portc.6,84,["AT+CMPS=",34,"ME",34,44,34,"ME",34,44,34,"ME",34,13]
PAUSE 2000
serout2 portc.6,84,["AT+CMGF=1",13] ; pasar modem gsm a modo texto
pause 500
gosub numeroTEL2
PAUSE 300
SEROUT2 portc.6,84,["DISPARO ALARMA",26]; enviar
pause 200
gosub numeroTEL2
pause 300
SEROUT2 portc.6,84,["DISPARO ALARMA",26]; enviar
PAUSE 300
LOW LEDrojo
LOW BIP
GOTO EVENTO
;ENDIF
;INTCON.2=0    
;RESUME
;ENABLE


;configSISTEMA:
;LCDOUT $FE,1
;PAUSE 200
;LCDOUT $FE,$80," CONFIGURACION  "
;LCDOUT $FE,$C0,"     ZONAS      "
;PAUSE 1500
;LCDOUT $FE,1
;PAUSE 200
;LCDOUT $FE,$80,"1(P-A) / 2(Inst)"
;LCDOUT $FE,$C0,"Z1=",dec TZONA1," (Enter)"

;LCDOUT $FE,1
;PAUSE 200
;LCDOUT $FE,$80,"1(P-A) / 2(Inst)"
;LCDOUT $FE,$C0,"Z2=",dec TZONA2," (Enter)"

;LCDOUT $FE,$C0,"Z3=",dec TZONA3," (Enter)"

;LCDOUT $FE,$C0,"Z4=",dec TZONA4," (Enter)"

;LCDOUT $FE,$C0,"Z5=",dec TZONA5," (Enter)"

;LCDOUT $FE,$C0,"Z6=",dec TZONA6," (Enter)"
;goto configSISTEMA

END
```


----------



## Gerson strauss (Mar 9, 2016)

Ya llegan los super programadores a mencionar que tu programa no sirve, por las pausas de tiempo. 

De mi parte te felicito y gracias.


----------



## torres.electronico (Mar 9, 2016)

Hola Gerson, este mismo proyecto esta funcionando por que lo arme y probe hasta sacarle humo  ...
Lo que quizas se venga como modificacion, es usar interrupciones para leer los puertos de los sensores...gracias por tu comentario, si me indicas cual tiempo viste largo, dejamelo ver y te digo si coincido con tu opinion.
Saludos


----------



## Gerson strauss (Mar 9, 2016)

torres.electronico dijo:


> Hola Gerson, este mismo proyecto esta funcionando por que lo arme y probe hasta sacarle humo  ...
> Lo que quizas se venga como modificacion, es usar interrupciones para leer los puertos de los sensores...gracias por tu comentario, si me indicas cual tiempo viste largo, dejamelo ver y te digo si coincido con tu opinion.
> Saludos



No es mi opinión; yo también uso pausas, delays etc. Pero aquí en el foro hay pseudo científicos  que te cortan la cabeza si usas delays en programación.

La pausa mas larga que veo es:  pause 5000.


----------



## torres.electronico (Mar 9, 2016)

eso es por que no esta funcionando ahi y queria que se visualice en proteus el efecto del display. En el modo real, 1 segundo y medio es una eternidad 
Estoy esperando que se prenda papirrin para manguearle elnsoftware vb o alguna idea para programarlo jajaja



 eso es por que no esta funcionando ahi y queria que se visualice en proteus el efecto del display. En el modo real, 1 segundo y medio es una eternidad 
Estoy esperando que se prenda papirrin para manguearle elnsoftware vb o alguna idea para programarlo jajaja


----------



## locodelafonola (Mar 9, 2016)

hola





Gerson strauss dijo:


> Ya llegan los super programadores a mencionar que tu programa no sirve, por las pausas de tiempo.
> 
> De mi parte te felicito y gracias.


 esta hecho en basic., donde los DELAY ., si se usan ., es muy distinto en C y ASM., el DELAY., siempre para o detiene al micro., y eso no esta bien.,  para eso estan los timer


----------



## torres.electronico (Mar 9, 2016)

Las pausas solo las use para disparar modem (necesita unas pausas), pero lo que es el programa en general, no le puse pausas para no tener problemas con los disparos... el 1er intento de este bicho fue con el tmr0 pero los efectos visuales no me gustaban... quizas tendria que reflotar los primeros programas que hice y ver que parche se queda y cuales se van...
Graxias por los aportes...esto es el inicio y se lo puede mejorar, pongo en la lista int timer,int por hardware


----------



## yovi (Mar 9, 2016)

Exelente trabajo,se podria modificar para instalarla en autos.


----------



## locodelafonola (Mar 9, 2016)

hola 





torres.electronico dijo:


> Las pausas solo las use para disparar modem (necesita unas pausas), pero lo que es el programa en general, no le puse pausas para no tener problemas con los disparos... el 1er intento de este bicho fue con el tmr0 pero los efectos visuales no me gustaban... quizas tendria que reflotar los primeros programas que hice y ver que parche se queda y cuales se van...
> Graxias por los aportes...esto es el inicio y se lo puede mejorar, pongo en la lista int timer,int por hardware


 bueno llendo al programa., yo lo veo correcto., y no se nada pero absolutamente NADA de basic​ pero en una alarma esta bien ., porque das una orden o funcion ., y en el caso que "consulte"un periferico o sensor ., se detiene y espera a que responda​ y eso lo veo logico ., porque depende de lo que nos"responde" ., seguimos con las funciones del programa o tomamos otra opcion ., y eso esta correcto aparte de razonable y logico​


----------



## torres.electronico (Mar 9, 2016)

yovi dijo:


> Exelente trabajo,se podria modificar para instalarla en autos.



Si, se podria, pero haciendo una reforma drastica; Le pondria algun modem directamente que es mucho mejor qie el celular... ademas, creo que tengo por ahi el comando at para que mande por sms la latitud-longitud de la triangulacion de antenas y con eso sacar un radio en el cual puede esgar el auto... esto en españa u otro lugar que no sea argentina andaria de 10 
Aca en comodoro, la saguracion de las celdas es terrible y la antena que quizas este a dos cuadras no entras y estas usando otra que esta a 12km arriba de un cerro como me pasa a mi... dependiendo el horario tengo buena señal o mala, osea, si tengo mala es por qie estoy ancñado a la celda de rada tilly, si tengo buena, a la que esta cerca de casa  .... con todo esto quiero decir que un backup celular en un auto, tambien depende de la señal 
Estoy mirando unas librerias de darrel sobre varios tipos de interrupciones... vamos a ver si funca alguna directamente con pbp sin mlab


----------



## Gerson strauss (Mar 9, 2016)

locodelafonola dijo:


> hola esta hecho en basic., donde los DELAY ., si se usan ., es muy distinto en C y ASM., el DELAY., siempre para o detiene al micro., y eso no esta bien.,  para eso estan los timer



¿Y entonces porque existen instrucciones para hacer pausas en todos los lenguajes de programación?


----------



## locodelafonola (Mar 9, 2016)

hola 





Gerson strauss dijo:


> ¿Y entonces porque existen instrucciones para hacer pausas en todos los lenguajes de programación?


 se usa cuando se espera un dato de un periferico (lectura de un LCD ., pulsado de un boton ., sensor de temperatura ) etc .,  pero nunca .,  jamas en un bucle de desarrollo serio​ aca hay un ejemplo claro​ https://www.forosdeelectronica.com/f24/comunicacion-serie-entre-dos-atmega8-141302/#post1087075   ., DELAY NUNCA ¡¡¡¡


----------



## torres.electronico (Mar 10, 2016)

le encontre un detalle al pcb.... me olvide de llevar las dos pistas de alimentacion al secor de borneras de entrada (para los sensores que no son pasivos )... meno mal que tengo espacio por arriba 
bueno, ya puede re-re-re-arrancar mi PC, asi que en un rato sigo subiendo avances


----------



## Saint_ (Mar 12, 2016)

Hola torres.electronico... siento que te estas robando mi proyecto... jajajajja.
basicamente es lo mismo pero difiere en las prestaciones y metodología de implementan del firmware, una de las diferencias es que yo uso un Pic18f4550 para aprovechar su puerto USB y configurar las opciones mediante un terminal HID que tambien estoy implementando bajo VB6, otra diferencia es que estoy trabajando el firmware en CCS PIC.
Para la polémica del uso de los famosos _delays_ soy firme partidario de "donde, como y cuando usarlos"... por ejemplo en la rutina para iniciar al  módem GSM después de activarlo hay que esperar a que este listo para aceptar los comandos AT, una vez el módem admite los comandos AT hago la lectura de los SMSs guardados mediante AT+CMGL="ALL"...pero resulta que la lectura de esos SMS no son inmediatos (al menos cuando se acaba  se encender el modem) y puede tardar hasta 10s en estar listos (esto en el caso particular del módem ENFORA que estoy usando). La forma en que estoy encarando esa lectura de SMSs es usar un bucle y hacer la consulta cada 3s usando el "famoso delay", Quizá alguien diga por ahí "3s de delay... eso es una atrocidad..., etc", pero tomando en cuenta que mientras se inicia el módem no se hace ninguna tarea mas no importa tener al uC "trabado" ... y si alguien diría ... _pero puedes usar un timer_. Pues si, si podría usarlo pero al no tener otra tarea mas que hacer  seria algo así:

_unsigned int1 bandera;
#INT_TIMER1
void irs_timer1()
{
   ...;
   bandera=1;  //señaliza que pasaron 3s.
}
void main()
{
   ...
   ...
   while(bandera==0); //espera a que pasen 3s.
   ...
   ...
}_
y todo ese código seria lo mismo que usara un _delay_ms(3000);_.
Podría alguien decir "en vez de perder tiempo de esa manera mejor poner al uC en modo sleep". Resulta que en la gama 16 de PIC el modo sleep detiene totalmente a los temporizadores excepto al tiemr0 cuando este esta con oscilador externo,pero esi es arina de otro costal....  En la Gama18 de Pic el timer1 puede funcionar en el modo de bajo consumo pero ese es un detalle que por el momento no interesa en lo que estoy haciendo.
Concluyendo afirmo que los delays son perfectamente utilizables siempre que haya un buen criterio para su uso.


----------



## torres.electronico (Mar 12, 2016)

Hola Saint; Es una muy buena idea implementar un micro con soporte USB; Ahorita mismo me estoy dando la cabeza contra el teclado con el tema de configuracion del sistema mediante teclado... por un lado avanzo, y por otro me estanco  ...
Le hago algo a CCS, pero no me es muy practico para proramar por que aun me falta aprender mas y no perderme en el intento. Ahi arranque reformando unas librerias de Darren que estan en ASM y quizas en la proxima actuallizaacion que suba se vean los avances; Hoy me di cuenta que me olvide de sumar el tiempo de desactivacion programable


----------



## torres.electronico (Mar 13, 2016)

bueno... no era de mucho gusto usar dos pic, asi que meti todo en uno solo y como me habia quedado corto de puertos, imlpemente un teclado analogico con bastante exito 



les muestro como hice la seccion del teclado analogico:


```
LECTURA_TECLADO:
ADCIN PORTA.0,TECLA
IF TECLA = 0 THEN GOTO LECTURA_TECLADO
SELECT CASE TECLA
CASE 138             ;TECLA1
T_NUMERO = 1
CASE 156             ;TECLA2
T_NUMERO = 2
CASE 179             ;TECLA3
T_NUMERO = 3
CASE 102             ;TECLA4
T_NUMERO = 4
CASE 112             ;TECLA5
T_NUMERO = 5
CASE 124             ;TECLA6
T_NUMERO = 6
CASE 81              ;TECLA7
T_NUMERO = 7
CASE 87              ;TECLA8
T_NUMERO = 8
CASE 94              ;TECLA9
T_NUMERO = 9
CASE 72              ;TECLA0 
T_NUMERO = 0
CASE 76              ;TECLA#
T_NUMERO = 12
CASE 68              ;TECLA*
T_NUMERO = 11

END SELECT        ' Close SELECT CASE

return
```
en esta version ya logre poder poner una configuracion para poder programar clave nueva en memoria no volatil y numero de telefono (tengo que migrar de micro por que no me dio el espacio para que la configuracion del tel quede guardada en la eeprom  )...
Arrancare desde cero migrando todo a un 18F4550 y sumare tambien la configuracion de los sensores... espero que les sea de agrado lo que hay hasta ahora 
se que se puede mejorar muchisimo, asi que cualquier sugerencia es bienvenida  SALUDOS



MODO DE EMPLEO:
A_para iniciar el sistema en modo ALARMA, colocar jumper en modo RUN 
B_para ver y o configurar los parametros (prueba de hardware,numero de telefono y clave) JUMPER en modo CONFIG.

Modo CONFIG.
NUMERO = 1 TEL
NUMERO = 2 CLAVE NUEVA
NUMERO = 3 PRUEBA HARDWARE (RELAY, LED,MODEM,ETC)
NUMERO = 4 INICIA EN MODO ALARMA

Modo RUN
Al iniciar el sistema, la pantalla queda con el mensaje "MODO ALARMA DESACTIVADA", a la espera de la clave (1234 por defecto) de teclado, o la señal de un control remoto con el mensaje "A" para activar.
La condicion para activar, es que la integridad de los sensores esten en modo reposo, caso contrario, no dejara armar el sistema y mostrara cual zona esta activada.
Cuando se logra activar el sistema, por el momento, "todos" los sensores tienen un delay para desactivacion (esceptuando el boton pulsador de panico).
Para desactivar, se requiere ingresar los 4 digitos de la clave en el teclado, o bien, enviar una señal RF con el mensaje "A".
Todos los eventos de disparo, accionan el modem y deja un mensaje en pantalla "HAY UN EVENTO SIN REGISTRAR"... Para borrar y riniciar, solo requerimos enviar una señal RF o presionar cualquier tecla para desactivar...

Que estaria faltando?
1_Menu para seleccionar modo de armado (Modo Presente/Modo Ausente)
2_Poder configurar todos los sensores para que funcionen como Instantaneos o Presente/Ausente (no funcionan en modo Presente)
3_Poder configurar tiempo de salida
4_Poder configurar tiempo de entrada (Zona1 con demora)
5_Guardar numero de telefono en memoria no volatil

parece mentira, pero falta bastante


----------



## Scooter (Mar 14, 2016)

El ULN ya lleva dentro diodos volantes así que te los puedes ahorrar en el circuito.


----------



## torres.electronico (Mar 14, 2016)

tal cual amigazo, pero estan puesto mas que nada por posibles ruidos en  fuente, sumado a que la hoja de datos recomienda cargas de hasta 9V; De ahi lo dos diodos extras.
Me das una mano con la fuente?
Tenia pensado hacer una fuente con un LM317, ya que podria controlar mas corriente-tension; Me paso en varias oportunidades que la fuente de las alarmas era tan chica, que al conectar sirena interior y exterior en paralelo, se caia mucho la fuente... Que me recomendas? la fente con el LM317 y despues un simple monolitico para alimentar el pic (7805), o que?
abrazo

y otra cosa que queria sumar, es que la fuent en lo posible no se tiene que caer, ya que si estoy usando un teclado resistivo, me v a traer bastantes problemas


----------



## locodelafonola (Mar 14, 2016)

hola 





torres.electronico dijo:


> tal cual amigazo, pero estan puesto mas que nada por posibles ruidos en  fuente, sumado a que la hoja de datos recomienda cargas de hasta 9V; De ahi lo dos diodos extras.
> Me das una mano con la fuente?
> Tenia pensado hacer una fuente con un LM317, ya que podria controlar mas corriente-tension; Me paso en varias oportunidades que la fuente de las alarmas era tan chica, que al conectar sirena interior y exterior en paralelo, se caia mucho la fuente... Que me recomendas? la fente con el LM317 y despues un simple monolitico para alimentar el pic (7805), o que?
> abrazo
> ...


 yo te recomendaria ., que usaras el ULN2803​ que aparte de tener un OP mas., Tiene caracteristicas que te van ayudar en eso​ aparte sale lo mismo ., no hay diferencia en costo ., te dejo el PDF de el​Ver el archivo adjunto 132889


----------



## Dr. Zoidberg (Mar 14, 2016)

Saint_ dijo:


> ...La forma en que estoy encarando esa lectura de SMSs es usar un bucle y hacer la consulta cada 3s usando el "famoso delay", Quizá alguien diga por ahí "3s de delay... eso es una atrocidad..., etc", pero tomando en cuenta que mientras se inicia el módem no se hace ninguna tarea mas no importa tener al uC "trabado"





Saint_ dijo:


> ...Concluyendo afirmo que los delays son perfectamente utilizables siempre que haya un buen criterio para su uso.


----------



## Scooter (Mar 14, 2016)

Desaconsejo el 7805 me ha dado muuuchos problemas. Yo usaba el LM323, que iba sensiblemente mejor sin ser tampoco la panacea. 
Regular corriente no tiene sentido en este circuito. Si lo haces caerá la tensión y la liarás.
Por supuesto fuentes separadas para las cargas, optoacopladores, varistores...
Usa relés de 5V, digo yo.

Y si, a mi 1ms de delay me parece una atrocidad aberrante, nunca he usado uno de mas de 20 o 30µs. Pero para gustos los colores. De delays de segundos enteros ya huelga mi opinión por conocida. Opino que absolutamente siempre hay cosas que hacer.


----------



## torres.electronico (Mar 14, 2016)

Scooter dijo:


> Desaconsejo el 7805 me ha dado muuuchos problemas. Yo usaba el LM323, que iba sensiblemente mejor sin ser tampoco la panacea.
> Regular corriente no tiene sentido en este circuito. Si lo haces caerá la tensión y la liarás.
> Por supuesto fuentes separadas para las cargas, optoacopladores, varistores...
> Usa relés de 5V, digo yo.
> ...



   


Por las dudas, voy a buscar la hoja de datosby ver si aca en la patagobia se consigue el LM323... respecto a la lectura de entradas, lanultima modificacion ya lee por tmr0 mas una bamdera que indique que esta en mod activado, asi que ya esta denteo de losbgustos de susncomentarios...
Igualmente, las lineas de lanprimerq beta, si miran con mas detenimiento, tiene una pausa de 50ms (en lanparte que espera un datonserial) , y los sensores comerciales Alonso, dsc, honepiripipi,etc etc, mandan un tren de pulsos qie supera el segundo; O sea... no hay manera de que no lea un disparo.... igualmente, fue lindo como quedobahora con el tmr0....
En lineas anteriores comente que qieroa usar unas librerias y cuqndonjinte todas esas librwrias de int., se estanco todo... perdi mucho tiempo tratando de entender por que se estanco, asonque para evitar dolores de cabeza/meterme en la cabeza del que armo ñas librerias, volvi de cero implementqndo int que pbp tiene...miren lonque les comento:


```
;***************************
;En esta seccion, la alarma trabaja en modo armado
;***************************

INICIO:
LCDOUT $FE,1
PAUSE 200
LCDOUT $FE,$80,"  MODO ALARMA   "
LCDOUT $FE,$C0,"    ACTIVADA    "

RF:
SERIN PORTB.1,T2400,50,ZONAS,SENAL
if SENAL="A" then BACKUP    
if SENAL="B" then DISPARO 
if SENAL="C" then DISPARO
if SENAL="D" then DISPARO

zonas:
if zona1 = 0 then disparo
if zona2 = 0 then disparo
if zona3 = 0 then disparo
if zona4 = 0 then disparo
if zona5 = 0 then disparo
if zona6 = 0 then disparo
IF PORTB.0=0 THEN
   LCDOUT $FE,1
   LCDOUT $FE,$80," ALARMA PANICO  "
   LCDOUT $FE,$C0,"    LLAMANDO    "
   PAUSE 1500
   GOTO DISPARO
  ENDIF
PAUSE 50
goto RF
```

Seguro victor o retmi tiene la solucion entre manos.



Ojo...no me las seeeeee todas 
Se qie so dejo misnotras obligaciones que me dan de comer, esto lo saco adelante; Pero comonse que aca tengo buenos amigos, quizas entre todos podamos armar algo para alguien que necesite una alarma "como la gente" 
Gracias por la suma de materia gris... Dr, pense que su aporte era para retarme


----------



## Saint_ (Mar 15, 2016)

Hola torres.electronico, veo por ahi un pocible incombeniente en el codigo que subiste.
_RF:
SERIN PORTB.1,T2400,50,ZONAS,SENAL
.
.
.
if zona6 = 0 then disparo
IF PORTB.0=0 THEN
   LCDOUT $FE,1
   LCDOUT $FE,$80," ALARMA PANICO  "
   LCDOUT $FE,$C0,"    LLAMANDO    "
   PAUSE 1500
   GOTO DISPARO
ENDIF
PAUSE 50
goto RF_
Por lo que veo: En la primera linea de codigo se espera un dato por dato serial a 2400bps, hasta ahi todo bien pero en la penultima linea de codigo tienes pause de 50ms (al menos eso asumo) y eso puede causar algún inconveniente.
A 2400bps un byte tardara en llegar 4.16ms y si por "motivo del destino" ese dato serial llega cuando se inicia o mientras se este en el _pause 50_ lastimosamente ese dato se perderá.
Para evitar ese problema podrias:
1) Eliminar el _pause 50_.
2)cambiar de pin de entrada al correspondiente del puerto serie hardware y reducir el pause 50 a uno menor o igual a 4.16ms.
3)usar interrupción de puerto serie y guardar los datos llegados en un buffer para luego leerlo.
4)si por algún motivo los pines del puerto serie están ocupados puedes usar la interrupción externa1 (pic18f) para atender al dato serial que este llegando.


----------



## torres.electronico (Mar 15, 2016)

_SERIN PORTB.1,T2400,50,ZONAS,SENAL

_Significa que al llegar a esta linea, espera una transmision serial por PORTB.1... si al cabo de 50mS no enta nada, salta a la etiqueta "ZONAS"... si entra algo, lo guaarda en la variable "SENAL".
Mira, estos son dos tipos diferentes de sensor PIR...



ambos dos, se  pueden configurar la cantidad de pulsos que queres que mande cuando se  dispara, y como minimo, es un segundo en alto... osea, 50 mS dentro de 1  Segundo, es nada...Igualmente, solo por que lo sugeris, voy a cambiar esta parte y voy a sumar las interrupciones del puerto serie asi solo salta a leer el mensaje cuando entra algo....
ahi consegui unos varistores, pero el LM323 no


----------



## torres.electronico (Mar 16, 2016)

parece mentira, pero acostumbrado a la gama 16F87X, no puedo adecuarme al 18F4550 :cabezon:
primero chancleteo metiendo la pata en la configuracion; O sea, lo hice sin pensar a las apuradas antes de que se vuele la idea, y puses los fueses como si fuera un 877... perdi 40 minutos tratando de entender por que no funcinaba  movia esto, reforme lo otro  y nada de nada ... cuando me di cuenta, busque info al respecto (menos la hoja de datos ) y tampoco pude hacerlo por que se ve que le pegue una vista "muy" gorda... dame dos dias mas que ando con bastante laburo particular, y me voy a mirar la hoja de datos y buscar algun ejemplo; Pero tu idea vale...saludos


----------



## Saint_ (Mar 17, 2016)

los fuses en pic18 pueden ser algo complicados ya que hay varias cosas que configurar.
sugiero que le des mas preferencia a la configuracion del PLL. por ejemplo podrías configurar :

FOSC3:FOSC0:      001X     (XTPLL)  //cristal hasta 4Mhz con pll activado
PLLDIV2LLDIV0:   000  (PLLDIV1) //la frecuencia del cristal entra directamente al pll
CPUDIV1:CPUDIV0:  00                //reloj de la cpu a 48Mhz


----------



## ruben90 (May 15, 2016)

Muy buen aporte. Como todo primer prototipo, (después de armarlo) vienen las mejoras. Solo una duda, los relevadores que activan? No se ven conectados a nada en el esquema?


----------



## torres.electronico (May 16, 2016)

ruben90 dijo:


> Muy buen aporte. Como todo primer prototipo, (después de armarlo) vienen las mejoras. Solo una duda, los relevadores que activan? No se ven conectados a nada en el esquema?



Hola Ruben  tenes un relay para la sirena, y el resto es para la version nueva que tiene control telemetrico con el mismo telefono qaue cito usar como backup


----------



## ruben90 (May 16, 2016)

Utilizas algún integrado para comunicar el micro con el celular? Esa parte me interesa mucho.


----------



## torres.electronico (May 16, 2016)

ruben90 dijo:


> Utilizas algún integrado para comunicar el micro con el celular? Esa parte me interesa mucho.



No, si miras el esqiema, implemento zener para llegar a la tension de 3.3v del bus


----------

