Gracias por sus indicaciones. Voy a revisarlo con mas cuidado y lo intentare de nuevo...
Saludos,
Saludos,
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes Menú//OMAR DAVILA - BLADIMIR VERGARA - JOSE DIAZ
//CONFIGURACION DE PUERTO SERIAL
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)//9600
//DECLARACION DE VARIABLES
int ret=500,ret_alrm=400;//200:1min
********** int ret_env=8000;//RETARDO DE ENVIO 1000=1S
int f1=0,f2=0,f3=0,f4=0,f5=0,f6=0;//BANDERAS DE ALARMAS
int16 uptime,retardo1,retardo2;//CONTADORES DE TIEMPO
int e,n,cap=0,fn,lf=0,lfe,in=0,ie=0,ip=0,inr=0,sms=0,posi=0,hist=0,seg=0,min=0,rep;//OTRAS VARIABLES
int alrm1=pin_C0,alrm2=pin_C1,alrm3=pin_C2,alrm4=pin_C3,alrm5=pin_C4,alrm6=pin_C5,s1=pin_A4,s2=pin_A5;//PINES DE ENTRADA
int ca1=0,ca2=0,ca3=0,ca4=0,ca5=0,ca6=0;//CONTADORES DE ALARMA
int pwr=pin_B0,led_senal=pin_B7,salida1=pin_A0,salida2=pin_A2,alarm_salida1=0,alarm_salida2=0,record=0,alrmH,alrmT;//PINES DE SALIDA
int const nros=12;//NRO MAXIMO DE CONTACTOS A LEER EN SIM
int const etqs=7;//NRO MAXIMO DE SMS DE ETIQUETAS A LEER EN SIM
char c,l;//VARIABLES PARA CARACTER DE ENTRADA Y CODIGO DE SMS ENTRANTE RESPECTIVAMENTE
char ctrlz=26;//combinacion de teclas "ctrl+z"
char pos[2];//POSICION DEL SMS ENTTRANTE
char intentos[2];//INTENTOS DE ENCENDIDO ANTES DE BLOQUEAR LUEGO DE NO DETECTAR PRESENCIA DE MODULO GSM
char NUM[nros][14];//MATRIX DE PARA ALMACENAR CONTACTOS
char ETQ[etqs][21]={"_s/nombre", "_a1", "_a2", "_a3", "_a4", "_a5", "_a6"};//MATRIX PARA LAS ETIQUETAS
char NREM[14];//PARA ALMACENAR TEMPORALMENTE EL NRO DE REMITENTE
void mensaje_etqX_listcontactos (unsigned int etiq,unsigned int cnd);
void fcn_int_rda (void);
void reset(unsigned int x);
void capturar (void);
void ext_nros (void);
void ext_etqs (void);
void inic_nrem (void);
void inic_nrem (void);
void enviar_reporte (unsigned int x);
void check_sal(void);
unsigned int ident_nrem (void);
void leer_nvosms (unsigned int x);
void mensaje_etqX_listcontactos (unsigned int etiq,unsigned int cnd);
void capturar (void);
void encender_modem (void);
void config_modem (void);
//AUTO RESET
void reset(unsigned int x){
switch (x){
case 0:
reset_cpu();
case 1:
write_eeprom(0x00,'1');reset_cpu();
}
}
//BUCLE DE ESPERA DE CAPTURA
void capturar(void)
{
while(cap==0){}
delay_ms(ret_env);
}
//FUNCION DE BLOQUEO
void bloqueo(unsigned int x)
{
switch (x)
{
case 1:
while(true){output_high (led_senal);delay_ms(150);output_low (led_senal);delay_ms(2000);}
case 2:
while(true){output_high (led_senal);delay_ms(150);output_low (led_senal);delay_ms(150);output_high (led_senal);delay_ms(150);output_low (led_senal);delay_ms(2000);}
}
}
//FUNCION DE CAPTURA DINAMICA POR PUERTO SERIAL
void fcn_int_rda(void)
{
c=0x00;
if (kbhit () )
{
c=getc ();
switch (fn)
{
case 0: if (c=='+')
fn=5;
break;
case 1: if (c==('K' || 'R'))
{
NUM[n-1][0]=NULL;
lfe=1;
fn=100;
}
if (c==',')
fn=2;
break;
case 2:
if (c!=',')NUM[n-1][in++]=c;
else
{
NUM[n-1][in++]=NULL;
in=0;
lfe=3;
fn=100;
}
break;
case 3:
if (c=='\n')
lf++;
if (lf==2)
{
lf=0;
fn=4;
}
if (c==('K' || 'R'))
{
lf=0;
lfe=1;
fn=100;
}
break;
case 4:
if (c!='\r')ETQ[e-1][ie++]=c;
else
{
ETQ[e-1][ie++]=NULL;
ie=0;
lfe=3;
fn=100;
}
break;
case 5:
if (c==',')fn=6;
break;
case 6:
if (c!='\r')pos[ip++]=c;
else
{
pos[ip++]=NULL;
sms=1;
fn=99;
}
break;
case 7:
if (c==',')fn=12;
if (c==('K' || 'R'))
{
lfe=1;
fn=100;
}
/*
if (c=='R')
{
if(err<4)
{
err++;
lfe=1;
fn=101;
}
}
*/
break;
case 12: if (c=='2'||c=='4')
{
NREM[inr++]=0x22;
NREM[inr++]='0';
NREM[inr++]=c;
fn=8;
}
break;
case 8: if (c!=',')
NREM[inr++]=c;
else
{
NREM[inr++]=NULL;
fn=9;
}
break;
case 9: if (c=='\n')
fn=10;
break;
case 10: if (c!='\r')
{
l=c;
}
else
{
lfe=3;
fn=100;
}
break;
case 11:
if (c=='+')
{
lfe=3;
fn=100;
}
if (c=='R')
{
lfe=1;
fn=100;
/*if(err<3)
{
err++;
lfe=1;
fn=101;
}
else{
err=0;
lfe=1;
fn=100;
}*/
}
break;
case 20: if (c=='K')
{
lfe=1;
fn=100;
}
break;
case 100: if (c=='\n')
lf++;
if (lf==lfe)
{
lf=0;
lfe=0;
fn=99;
cap=1;
}
break;
case 101: if (c=='\n')
lf++;
if (lf==lfe)
{
lf=0;
lfe=0;
fn=99;
cap=2;
}
break;
default: c=0x00;
break;
}
}
}
//INTERRUPCION DE CAPTURA DE CARACTERES POR RX DE PUERTO SERIAL
#int_rda
void serial_isr()
{
fcn_int_rda () ;
}
///////////////////////////////////////////////////
//INTERRUPCION DE TIEMPO REAL
#int_RTCC
void RTCC_isr(void)
{
retardo1++;
retardo2++;
uptime++;
if (uptime==120){uptime=0; seg++; }
if (seg==60){min++; seg=0; }
}
//FUNCION PARA EXTRAER NROS DESDE LA SIM
void ext_nros(void)
{
int x=0;
n=0;
while (x==0&&n<nros)
{
fn=1;
n++;
printf ("AT+CPBR=%u\r\n",n);
//while (cap==0){}
//cap=0;
capturar();
if (NUM[0][0]== NULL)bloqueo(2);
if (NUM[n-1][0]== NULL)
{
n--;
x=1;
}
delay_ms (ret);
}
}
//FUNCION PARA EXTRAER SMS DE ETIQUETAS DESDE LA SIM
void ext_etqs(void)
{
int x=0;
e=0;
while (x==0 && e<etqs)
{
fn=3;
e++;
printf ("AT+CMGR=%u\r\n",e);
capturar();
if (ETQ[e-1][0]=='_')
{
if(e>1)e--;
x=1;
}
delay_ms (ret);
}alrmH=e-1;alrmT=etqs-1;
}
//FUNCION PARA LIMPIAR VECTOR DE ALMACENAMIENTO DE NRO DE REMITENTE
void inic_nrem(void)
{
for (int i=0; i<=13; i++)
{
NREM[i]=0x00;
}
inr=0x00;
}
void inic_pos(void)
{
pos[0]=0;
pos[1]=0;
ip=0;
posi=0;
}
//FUNCION PARA ENVIO DE SMS DE REPORTES
void enviar_reporte(unsigned int x)
{
printf ("AT+CNMI=0\r\n");
delay_ms (ret);
if (x==0)
{
for (int M=0; M<n; M++)
{
printf ("AT+CMGS=%s\r\n",NUM[M]);
delay_ms (ret);
printf ("SCEMA Ex MERIDA DVD\r\n");
printf ("\r\nESTACION: %s\r\n",ETQ[0]);
printf ("Alarmas: %u/%u\r\nContactos: %u/%u\r\n",alrmH,alrmT,n,nros);
printf ("\r\nCOMANDOS ACEPTADOS:\r\nI: Info\r\nR: Reporte\r\n1: PulsoSalida1\r\n2: PulsoSalida2%c\r\n",ctrlz);
//printf ("%c\r\n",ctrlz);
fn=11;
capturar();
delay_ms (ret);
}
}
if (x==3)
{
printf ("AT+CMGS=%s\r\n",NREM);
delay_ms (ret);
printf ("SCEMA Ex MERIDA DVD\r\n");
printf ("\r\nESTACION: %s\r\n",ETQ[0]);
printf ("Alarmas: %u/%u\r\nContactos: %u/%u\r\n",alrmH,alrmT,n,nros);
printf ("\r\nCOMANDOS ACEPTADOS:\r\nI: Info\r\nR: Reporte\r\n1: PulsoSalida1\r\n2: PulsoSalida2%c\r\n",ctrlz);
//printf ("%c\r\n",ctrlz);
fn=11;
capturar();
delay_ms (ret);
}
if (f1==0&&f2==0&&f3==0&&f4==0&&f5==0&&f6==0)
{
if (x==1)
{
printf ("AT+CMGS=%s\r\n",NREM);
delay_ms (ret);
printf ("Reporte General:\r\n\r\nTOTAL_ALARMAS=0%c\r\n",ctrlz);
fn=11;
capturar();
delay_ms (ret);
}
if (x==2)
{
for (int M=0; M<n; M++)
{
printf ("AT+CMGS=%s\r\n",NUM[M]);
delay_ms (ret);
printf ("Reporte General:\r\n\r\nTOTAL_ALARMAS=0%c\r\n",ctrlz);
fn=11;
capturar();
delay_ms (ret);
}
}
}
else
{
if (x==1)
{
printf ("AT+CMGS=%s\r\n",NREM);
delay_ms (ret);
printf ("Reporte General:\r\n\r\n");
printf ("%s=%u\r\n%s=%u\r\n%s=%u\r\n",ETQ[1],f1,ETQ[2],f2,ETQ[3],f3);
printf ("%s=%u\r\n%s=%u\r\n%s=%u%c\r\n",ETQ[4],f4,ETQ[5],f5,ETQ[6],f6,ctrlz);
//printf ("%c\r\n",ctrlz);
fn=11;
capturar();
delay_ms (ret);
}
if (x==2)
{
for (int M=0; M<n; M++)
{
printf ("AT+CMGS=%s\r\n",NUM[M]);
delay_ms (ret);
printf ("Reporte General:\r\n\r\n");
printf ("%s=%u\r\n%s=%u\r\n%s=%u\r\n",ETQ[1],f1,ETQ[2],f2,ETQ[3],f3);
printf ("%s=%u\r\n%s=%u\r\n%s=%u%c\r\n",ETQ[4],f4,ETQ[5],f5,ETQ[6],f6,ctrlz);
//printf ("%c\r\n",ctrlz);
fn=11;
capturar();
delay_ms (ret);
}
}
}
delay_ms (ret);
}
//FUNCION PARA IDENTIFICAR REMITENTE
unsigned int ident_nrem(void)
{
int cmp,res=0,k=0,j=0;
while (res==0)
{
if (NREM[k]==NUM[j][k])
{
if (k==12)
{
cmp=1; res=1;
}
else k++;
}
else
{
if (j==n)
{
cmp=0; res=1;
}
else
{
k=0;
j++;
}
}
}return (cmp);
}
//FUNCION PARA CHEQUEAR EL ESTADO DE LAS SALIDAS
void check_sal(void)
{
if (alarm_salida1==1&&retardo1>TE_SALIDA1)
{
output_low (salida1);
alarm_salida1=0;
if(record==0&&alarm_salida2==0)
disable_interrupts (int_RTCC);
}
if (alarm_salida2==1&&retardo2>TE_SALIDA2)
{
output_low (salida2);
alarm_salida2=0;
if(record==0&&alarm_salida1==0)
disable_interrupts (int_RTCC);
}
}
//FUNCION PARA PROCESAR LOS SMS ENTRANTES SEGUN LA VALIDEZ DEL REMITENTE
void leer_nvosms (unsigned int x)
{
delay_ms (ret);
fn=7;
printf ("AT+CMGR=%u\r\n",x);
capturar();
delay_ms (ret);
if (ident_nrem () ==1)
{
switch (l)
{
case 0x49:
enviar_reporte (3);
break;
case 0x52:
enviar_reporte (1);
break;
case 0x31:
if(alarm_salida1==0)
{
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_bit);
enable_interrupts (int_RTCC);
alarm_salida1=1;
retardo1=0;
output_high (salida1);
for (int M=0; M<n; M++)
{
printf ("AT+CMGS=%s\r\n",NUM[M]);
delay_ms (500);
printf ("Pulso SALIDA1 activado por:\r\n%s%c\r\n",NREM,ctrlz);
//printf ("%c\r\n",ctrlz);
fn=11;
capturar();
delay_ms (ret);
check_sal();
}
}
break;
case 0x32:
if(alarm_salida2==0)
{
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_bit);
enable_interrupts (int_RTCC);
alarm_salida2=1;
retardo2=0;
output_high (salida2);
for (int M=0; M<n; M++)
{
printf ("AT+CMGS=%s\r\n",NUM[M]);
delay_ms (500);
printf ("Pulso SALIDA2 activado por:\r\n%s%c\r\n",NREM,ctrlz);
//printf ("%c\r\n",ctrlz);
fn=11;
capturar();
delay_ms (ret);
check_sal();
}
}
break;
default:
break;
}
}
l=NULL;
inic_nrem ();
delay_ms (ret);
}
//REPORTE INDIVIDUAL DE ACTIVACION O DESACTIVACION DE ENTRADA DE ALARMA A TODOS LOS CONTACTOS
void mensaje_etqX_listcontactos(unsigned int etiq,unsigned int cnd)
{
if (read_eeprom(0x00)!='1')//VERIFICO QUE NO VENGA DE UN AUTO RESET
{
printf ("AT+CNMI=0\r\n");
delay_ms (ret);
for (int M=0; M<n; M++)
{
printf ("AT+CMGS=%s\r\n",NUM[M]);
delay_ms (ret);
printf ("%s",ETQ[etiq]);
if (cnd==1){printf ("=1"); }
if (cnd==0){printf ("=0"); }
printf ("%c\r\n",ctrlz);
fn=11;
capturar();
delay_ms (ret);
}
fn=0;
delay_ms (5000);
printf ("AT+CNMI=2\r\n");
}
}
//FUNCION PARA ENCENDER MODULO
void encender_modem(void)
{
output_low (pwr) ;
delay_ms (1000) ;
output_high (pwr) ;
delay_ms (2000) ;
output_low (pwr) ;
delay_ms (8000) ;
int s=0;
fn=20;
printf ("AT\r\n");
while (cap==0)
{output_high (led_senal);
delay_ms(100);
s++;
if(s==50){bloqueo(1);}
}
cap=0;
//write_eeprom(0x01,NULL);
output_low (led_senal) ;
}
//COMANDO BASICOS DE CONFIGURACION
void config_modem(void)
{
printf ("AT+CMGF=1\r\n");
delay_ms (ret);
printf ("AT+CNMI=0\r\n");
delay_ms (ret);
printf ("AT+CSMP=17,167,0,1\r\n");
delay_ms (ret);
printf ("ATE0\r\n");
delay_ms (ret);
}
//FUNCION PRINCIPAL
void main(void)
{
enable_interrupts (int_RDA);
enable_interrupts (GLOBAL);
encender_modem ();
config_modem ();
ext_nros ();
delay_ms (500);
ext_etqs ();
delay_ms (500);
for(int p=e+1;p<=15;p++)
{
printf ("AT+CMGD=%u\r\n",p);//PARA BORRAR LOS POSIBLES MENSAJES PRESENTES DE LA POSICION 8 EN ADELANTE
delay_ms (ret);
}
if (read_eeprom(0x00)!='1')enviar_reporte (0);//ASI VERIFICO SI VENGO DE UN AUTO RESETEO
fn=0;
delay_ms(5000);
printf ("AT+CNMI=2\r\n");//ACTIVAR EL AVISO DE NVOS SMS ENTRANTES
while (TRUE)
{
check_sal();//VERIFICO ESTADO DE SALIDAS
output_toggle (led_senal);//LED DE SEÑAL QUE PARPADEA INDICANDO ESTADO DEL SMC
delay_ms (300);
if (sms==1)//VERIFICO SI HAY NUEVOS SMS DE ENTRADA
{
printf ("AT+CNMI=0\r\n");
posi=atoi (pos);
if (posi==e+1){leer_nvosms (posi);delay_ms (5000);printf ("AT+CMGD=%u\r\n",posi);}
if (posi>e+1){for(int q=e+1;q<=posi;q++){leer_nvosms (q);delay_ms (5000);printf ("AT+CMGD=%u\r\n",q);}}
inic_pos (); sms=0;fn=0; delay_ms (5000);printf ("AT+CNMI=2\r\n");}
if (input (alrm1)==0&&f1==0)//ACTIVACION DE ALARMA 1
{
ca1++;//RETARDO PARA EVITAR FALSAS ALARMAS
if(ca1==ret_alrm)
{
ca1=0;
f1=1;
mensaje_etqX_listcontactos (1,1);//MANDAR A ENVIAR ACTIVACION DE LA ETIQUETA 1
}
}
if ((input (alrm1)==1&&f1==0)||(input (alrm1)==0&&f1==1))ca1=0;//DESACTIVACION DE ALARMA SIN CUMPLIRSE EL TIEMPO DE RETARDO
if (input (alrm2)==0&&f2==0)
{
ca2++;
if(ca2==ret_alrm)
{
ca2=0;
f2=1;
mensaje_etqX_listcontactos (2,1);
}
}
if ((input (alrm2)==1&&f2==0)||(input (alrm2)==0&&f2==1))ca2=0;
if (input (alrm3)==0&&f3==0)
{
ca3++;
if(ca3==ret_alrm)
{
ca3=0;
f3=1;
mensaje_etqX_listcontactos (3,1);
}
}
if ((input (alrm3)==1&&f3==0)||(input (alrm3)==0&&f3==1))ca3=0;
if (input (alrm4)==0&&f4==0)
{
ca4++;
if(ca4==ret_alrm)
{
ca4=0;
f4=1;
mensaje_etqX_listcontactos (4,1);
}
}
if ((input (alrm4)==1&&f4==0)||(input (alrm4)==0&&f4==1))ca4=0;
if (input (alrm5)==0&&f5==0)
{
ca5++;
if(ca5==ret_alrm)
{
ca5=0;
f5=1;
mensaje_etqX_listcontactos (5,1);
}
}
if ((input (alrm5)==1&&f5==0)||(input (alrm5)==0&&f5==1))ca5=0;
if (input (alrm6)==0&&f6==0)
{
ca6++;
if(ca6==ret_alrm)
{
ca6=0;
f6=1;
mensaje_etqX_listcontactos (6,1);
}
}
if ((input (alrm6)==1&&f6==0)||(input (alrm6)==0&&f6==1))ca6=0;
//////////////////////////////////////////////////////////////////////////////////
if (f1==1||f2==1||f3==1||f4==1||f5==1||f6==1)//PARA INDICAR LA ACTIVACION DE CUALQUIER ALARMA PARA EL ENVIO DE REPORTES
hist=1;
////////////////////////////////////////////////////////DESACTIVACION DE ALARMAS
if (input (alrm1)==1&&f1==1)//
{
ca1++;
if(ca1==ret_alrm)
{
ca1=0;
f1=0;
mensaje_etqX_listcontactos (1,0);//PARA ENVIAR AVISO DE DESACTIVACION DE ALARMA 1
}
}
if (input (alrm2)==1&&f2==1)
{
ca2++;
if(ca2==ret_alrm)
{
ca2=0;
f2=0;
mensaje_etqX_listcontactos (2,0);
}
}
if (input (alrm3)==1&&f3==1)
{
ca3++;
if(ca3==ret_alrm)
{
ca3=0;
f3=0;
mensaje_etqX_listcontactos (3,0);
}
}
if (input (alrm4)==1&&f4==1)
{
ca4++;
if(ca4==ret_alrm)
{
ca4=0;
f4=0;
mensaje_etqX_listcontactos (4,0);
}
}
if (input (alrm5)==1&&f5==1)
{
ca5++;
if(ca5==ret_alrm)
{
ca5=0;
f5=0;
mensaje_etqX_listcontactos (5,0);
}
}
if (input (alrm6)==1&&f6==1)
{
ca6++;
if(ca6==ret_alrm)
{
ca6=0;
f6=0;
mensaje_etqX_listcontactos (6,0);
}
}
///////////////////ENVIO DE REPORTES AUTOMATICOS
if ( (input (s1)==0||input (s2)==0) && (f1==1||f2==1||f3==1||f4==1||f5==1||f6==1))
{
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_bit);
enable_interrupts (int_RTCC);
if (input (s1)==0&&input (s2)==1) rep=10;
if (input (s1)==1&&input (s2)==0) rep=20;
if (input (s1)==0&&input (s2)==0) rep=30;
record=1;
if (min>=rep&&seg==0){enviar_reporte (2); seg=0; min=0;fn=0; delay_ms(5000); printf ("AT+CNMI=2\r\n");}
}
if (f1==0&&f2==0&&f3==0&&f4==0&&f5==0&&f6==0&&hist==1)
{
enviar_reporte (2);
hist=0;
fn=0;
delay_ms(5000);
printf ("AT+CNMI=2\r\n");
}
if ( (input (s1)==1&&input (s2)==1)|| (f1==0&&f2==0&&f3==0&&f4==0&&f5==0&&f6==0))
{
record=0;
uptime=0;seg=0; min=0;
if(alarm_salida1==0&&alarm_salida2==0)
disable_interrupts (int_RTCC);
}
///////////
if (read_eeprom(0x00)=='1')
{
enviar_reporte (2);fn=0;delay_ms(5000);printf ("AT+CNMI=2\r\n");write_eeprom(0x00,NULL);
}
}
}