Si se desea el proyecto entero hay que pedirlo al correo electrónico o mediante un comentario. Este procedimiento se corresponde al esquema presentado en el enlace.
>>- - - - - - --
// arranque.c Arranca el módulo Telit
// SE inicia enviando un AT y tiene que responder ok.
void arranca(){
do {
inicbuff2(); // Borro buffer.
puerto_b= 0;
rcvchar=0x00; // último caracter recibido
Rxnum=0x00; // Identifica la cantidad de bytes recibidos
TimerCero=0x00;
Timer_=0x00; //Variable de tiempo a temporizar en 10miliseg
Retornos=0x00; //CAntidad de retornos a contar
VarRetornos=0x00; //CAntidad de retornos a contar
Desplaza=0x00; //cantidad de puestos que ha de desplazar para leer
flagcommand=0; // Flag para indicar comando disponible
flagOK=1;
flagPrimero=0; //Flag de primer \n
flagATOK = 1; //Flag de confirmación de interpretación correcta.
repeat=1; //Repetir la función que se está ejecutando
NoAutorizado= 1; //Flag de control de telefonos autorizados
// EstadoAlarma=0; //Estado de alarma activa al inicio
output_high(PIN_C1); //Activa el reset
delay_ms(610);
output_low(PIN_C1); //desActiva el reset
output_high(PIN_C0); //Activa el reset
delay_ms(1110);
output_low(PIN_C0); //desActiva el reset
delay_ms(300); //Fin del reset
//_________________________________
cargar();
VarRetornos=2; // Espera la llegada del OK
Desplaza = 0x07; //posiciona el la O de ok
printf ("ATE0\r"); //1 Comando de no Eco (con cero al final)
TempRecibe(300); //activa la temporización en la recepción
while ((flagATOK) && (flagOK)) ; //Fin de recepción
procesa();
if (flagATOK == 0){//1
delay_ms(200); //Fin del reset
cargar();
VarRetornos=2; // Espera la llegada del OK
Desplaza = 0x02; //posiciona el la O de ok
printf ("AT+CMEE=1\r"); //2 Comando PARA DEVOLUCION DE ERRORES
TempRecibe(550); //activa la temporización en la recepción
while (flagATOK && flagOK) ; //Fin de recepción
procesa();
if (flagATOK == 0){//2
delay_ms(100); //Fin del reset
cargar();
VarRetornos=2; // Espera la llegada del OK
Desplaza = 0x02; //posiciona el la O de ok
printf ("AT+IPR=9600\r"); //3 Comando PARA DEVOLUCION DE ERRORES
TempRecibe(2020); //activa la temporización en la recepción
while (flagATOK && flagOK) ; //Fin de recepción
procesa();
if (flagATOK == 0){//3
delay_ms(1000); //Fin del reset
cargar();
VarRetornos=2; // (4)Espera la llegada del OK
Desplaza = 0x02; //posiciona el la O de ok
TempRecibe(2020); //activa la temporización en la recepción
printf ("AT+CPIN\r"); //5 Comando PARA DEVOLUCION DE ERRORES
while (flagATOK && flagOK) ; //Fin de recepción
procesa();
if (flagATOK == 0){//4
output_high(PIN_B4);
delay_ms(14000); //Tiempo para que conecte con repetidor
output_low(PIN_B4);
do{
delay_ms(1010); //Fin del reset
cargar();
VarRetornos=2; // Espera la llegada del OK
Desplaza = 0x02; //posiciona el la O de ok
printf ("AT+CREG\r"); //Comando ESTADO CONEXION
TempRecibe(2500); //activa la temporización en la recepción
while (flagATOK && flagOK) ; //Fin de recepción
procesa();
}while(repeat);
delay_ms(500); //Fin del reset
if (flagATOK == 0){//5
cargar();
VarRetornos=4; // Espera la llegada del OK
Desplaza = 0x02; //posiciona el la O de ok
printf ("AT+CSQ\r"); //Comando CANTIDAD DE SEÑAL
TempRecibe(550); //activa la temporización en la recepción
while (flagATOK && flagOK) ; //Fin de recepción
procesa();
delay_ms(500); //Fin del reset
if (flagATOK == 0){//6
cargar();
VarRetornos=2; // Espera la llegada del OK
Desplaza = 0x02; //posiciona el la O de ok
printf ("AT+CMGF=1\r"); //Comando MODO TEXTO
TempRecibe(550); //activa la temporización en la recepción
while (flagATOK && flagOK) ; //Fin de recepción
procesa();
delay_ms(500); //Fin del reset
if (flagATOK == 0){//7
cargar();
VarRetornos=2; // Espera la llegada del OK
Desplaza = 0x02; //posiciona el la O de ok
printf ("AT+CLIP=1\r"); //Comando MODO TEXTO
TempRecibe(20000); //activa la temporización en la recepción
while (flagATOK && flagOK) ; //Fin de recepción
procesa();
delay_ms(500); //Fin del reset delay_ms(1201); //Fin del reset
if (flagATOK == 0){//8
cargar();
VarRetornos=2; // Espera la llegada del OK
Desplaza = 0x02; //posiciona el la O de ok
printf ("AT+CNMI=1,1,0,0,0\r"); //Configura el SMS
// TempRecibe(5050); //activa la temporización en la recepción
while (flagATOK) ; //Fin de recepción
procesa();
} //8 /* */
} //7
} //6
} //5
} //4
} //3
} //2
} //1
// } //O
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if (flagATOK == 0) {
cargar();
VarRetornos=4; // Espera la llegada del OK
Desplaza = 0x02; //posiciona el la O de ok
//Lo deja preparado para la recepción
repeat = 0;
output_high(PIN_B7);
}
else {
repeat = 1;
output_high(PIN_B6);
}
if( EstadoAlarma==1)
output_high(PIN_B4);
delay_ms(2000);
// output_low(PIN_B4);
inicbuff2();
}while (repeat); //Secuencia de repeticion constante
} //Fin arranca
//_________________________________________________________
void cargar(void){
output_high(PIN_B3); //Activa Transmision
inicbuff2(); // Borro buffer.
flagPrimero=0 ;
flagOK = 1;
flagATOK = 1;
Rxnum =0 ; //Contador de entrada de bytes
repeat= 1;
Retornos=0;
fagTiempo=1;
rcvchar=0x00;
TimerCero=0x00;
Timer_=0x00; //Variable de tiempo a temporizar en 10miliseg
}
// VarRetornos=0x00; //CAntidad de retornos a contar
// NoAutorizado= 1; //Flag de control de telefonos autorizados
// EstadoAlarma=0; //Estado de alarma activa al inicio
//_______Activa temporización en transmisión______________________
void TempRecibe(long Temp){
enable_interrupts(int_rtcc);
disable_interrupts(int_rtcc);; // Habilita Interrupción RDA
output_low(PIN_B3); //desactiva transmision
Timer_ = Temp;
set_rtcc(0); /* Se inicializa el timer a cero */
enable_interrupts(int_rtcc); // Habilita Interrupción RDA
flagOK=1;
fagTiempo=1;
}
//________________________________________________________
void inicbuff2(void){ // Inicia a \0 cbuff -------------------
int i;
for(i=0;i
cbuff[i]=0x00; // caracteres en el buffer
}
xbuff=0x00; // Inicializo el indice de siguiente
// caracter
}
//________Identifica si hay o no que enviar el PIN
//_____________________ Tratamiento de errores____________________
void errores (void){
int i = 15; // situta puntero en el numero de averia
// disable_interrupts(int_rtcc);;
switch(cbuff[i]) {
case '0': { //Comprueba si el primer valor recibido es sincronizacion
puerto_b=0x00;
output_high(PIN_B3);
delay_ms(500);
// bloqueo();
}
case '1': { //Comprueba si el primer valor recibido es sincronizacion
puerto_b=0x01;
output_high(PIN_B3);
delay_ms(500);
// bloqueo();
}
case '2': { //Comprueba si el primer valor recibido es sincronizacion
puerto_b=0x02;
output_high(PIN_B3);
delay_ms(500);
// bloqueo();
}
case '3': { //Comprueba si el primer valor recibido es sincronizacion
puerto_b=0x03;
output_high(PIN_B3);
delay_ms(500);
// bloqueo();
}
case '4': { //Comprueba si el primer valor recibido es sincronizacion
puerto_b=0x04;
output_high(PIN_B3);
delay_ms(500);
// bloqueo();
}
case '5': { //Comprueba si el primer valor recibido es sincronizacion
puerto_b=0x05;
output_high(PIN_B3);
delay_ms(500);
// bloqueo();
}
case '6': { //Comprueba si el primer valor recibido es sincronizacion
puerto_b=0x06;
output_high(PIN_B3);
delay_ms(500);
// bloqueo();
}
case '7': { //Comprueba si el primer valor recibido es sincronizacion
puerto_b=0x07;
output_high(PIN_B3);
delay_ms(500);
// bloqueo();
}
default:flagATOK =1; //error en la transmision
}
}
//__________ Comprueba si hay señal suficiente para ejecutar el proceso
void senyal (){
int i= 8; // situta puntero al inicio de la averia
disable_interrupts(int_rtcc);;
if ((cbuff[i]>='1')&& (cbuff[i]<='3')&& (cbuff[(i+1)]>='0')&& (cbuff[(i+1)]<='9' )) {
flagATOK = 0;
}else {
flagATOK =1;
puerto_b= 0xE0;
bloqueo ();
}
}
//__ Comprueba el estado de la conexion
void conection (){
int i= 11; // situta puntero al inicio
disable_interrupts(int_rtcc);;
output_high(PIN_B7);
delay_ms(20); // espera la llegada del OK
switch(cbuff[i]) {
case ('0'): { //Comprueba si el primer
repeat = 1;
} break;
case ('1'): { //Comprueba si el primer
repeat = 0;
} break;
case ('2'): { //Comprueba si el primer
repeat = 1;
} break;
default:{
flagATOK =1; //error en la transmision
repeat = 1 ; //sale del bucle al tener un error seguramente.
puerto_b= 0xE0;
bloqueo();
}
}
}
//_____________________________________________________________
void procesa(){
int i ;
i= Desplaza;
disable_interrupts(int_rtcc);; // Habilita Interrupción RDA
if (flagOK==1){//PP
// disable_interrupts(int_rtcc);; // Habilita Interrupción RDA
if (cbuff[2]!= '+'){// 1
switch(cbuff[i]){
case 'O': { //Comprueba si el primer valor recibido es sincronizacion
flagATOK =0;
} break;
case 'R': { // RING Comprueba sI ES UNA LLAMADA
delay_ms(500);
llamada ();
} break;
default:flagATOK =1; //error en la transmision
}
}//1
else{ // sIGNIFICA QUE HA LLEGADO UN + ***************************
i= 4; // situta puntero al inicio de la averia
switch(cbuff[i]) {
case 'P': { //CPI Comprueba si el primer valor recibido es sincronizacion
// Enviar a tratamiento del pin
verPin ();
} break;
case 'M': { //CME Comprueba si el primer valor recibido es sincronizacion
// Enviara a tratamiento de error
// delay_ms(50);
errores();
} break;
case 'S': { //CSQ Comprueba si el primer valor recibido es sincronizacion
// Enviara a tratamiento de señal
senyal ();
} break;
case 'R' : { //CRE Comprueba si el primer valor recibido es sincronizacion
// Enviara a tratamiento de señal
conection ();
} break;
default:flagATOK =1; //error en la transmision
}
}
}//PP
}
//__________________________________________________
void verPin(void){
int i= 9; //Situa al inicio de la palabra P ó S
disable_interrupts(int_rtcc);;
if (cbuff[i]== 'R'){ //Significa que es Ready por tanto vuelve sin más
flagATOK = 0; //No hace falta hacer nada (no envia pin)
delay_ms(700); //Espera a recibir el ok
}
else {
i=14;
delay_ms(700); //Espera a recibir el ok
if (cbuff[i]== 'I'){ //Tiene que enviar el Pin
cargar(); //Envia el Pin
VarRetornos=2; // Espera la llegada del OK
Desplaza = 0x02; //posiciona el la O de ok
printf ("AT+CPIN=4340\r"); //Comando ENVIA EL CODIGO PIN**
TempRecibe(2010); //activa la temporización en la recepción
while (flagATOK && flagOK){ //Fin de recepción
} //Espera a que termine de recibir
// disable_interrupts(int_rtcc);; // Habilita Interrupción RDA
i=2;
if (cbuff[i]== 'O') //Si ha llegado el Ok continua
flagATOK = 0; //hA SIDO CORRECTO
else flagATOK = 1; // Algo ha fallado en la recpecion del 0k final.
}
else {
puerto_b= 0xF0; //precisa del PUKV???
bloqueo();
}
}
}