Esta es una forma sencilla de arrancar el módulo y ha de quedar claro que las variables y llamadas a otros subprogramas puedem quedar en otro lugar. Es un ejemplo que se puede seguir para la puesta en marcha.
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();
}
}
}