Per farlo compilare ho dovuto portare la dichiarazione delle variabili esterne alla main, si compila e funziona.
Come già suggerito da
mikroC ha un debugger integrato.
Moderatore:
Paolino
/************************* dichiarazioni di costanti***************************/
#define RL_STOP_LED PORTA.F1
#define RL_PAUSE_LED PORTB.F4
#define THR_LED PORTB.F5
#define RL_STOP PORTA.F4
#define RL_PAUSE PORTB.F3
#define BUTTON_STOP IOCBF.F6
#define BUTTON_PAUSE IOCBF.F7
#define GSM_POWER PORTA.F3
#define ERROR 1
#define OK 2
#define GREATER_THAN 3
#define HAVING_SMS 4
#define RING 5
/******************************************************************************/
/****************************** variabili comuni ******************************/
unsigned short int checked=0, status_device=0, creg_status=0, gsm_buffer=0,
char_counter=0, index_phone=0, type_sms=0, i=0;
unsigned int number_stored=0;
int temp_decine=0, temp_unita=0, temp_decimale=0, conv_temp=0;
float threshold_temp=12.3, temp=12.3;
char phone_number_stored[13], phone_number_cmgl[13], name[13],
max_number_in_rubric[3], mex[]="t=", out_temp[];
/* status_device
0 --> null
1 --> stop
2 --> pause
3 --> play
4 --> sms ON
5 --> sms SYS
6 --> ring
*/
/******************************************************************************/
/*************************** dichiarazione funzioni ***************************/
unsigned short int getModuleResponseFromMain();
unsigned short int moduleIsRegistrated();
void gm862Init(char *settings[], unsigned short int _number_of_commands);
unsigned short int TurnOnGM862();
void picSetup();
void writeSMS(char *destination_phone, char *text);
unsigned short int readSMS();
void writeLine(char *cmd);
void deleteSMS();
unsigned short int checkString(char _received);
void rejectCall();
float readTemperature();
unsigned short int isInRubric(char phone[]);
/******************************************************************************/
/***************************** gestione interrupt *****************************/
void Interrupt()
{
char buffer='\0';
if(PIR1.RCIF)
{
buffer = UART1_Read();
if(buffer!=0x0D && buffer!=0x0A )
checked = checkString(buffer);
if(checked==HAVING_SMS)
status_device=3;
}
if(INTCON.IOCIF)
{
if(BUTTON_STOP) //se il pulsante P1 (STOP) è stato premuto (F6)
{
if(RL_STOP) //se il relè di commutazione è ativo
{
status_device=1;//interrompo tutto il processo
}
else
{
RL_STOP=0;
RL_STOP_LED=0;
Delay_ms(500);
RL_STOP_LED=1;
Delay_ms(500);
RL_STOP_LED=0;
Delay_ms(1500);
RL_STOP_LED=1;
status_device=0;
}
}
//pausa = 2; play=3
if(BUTTON_PAUSE) //se il pulsante P2 è stato premuto (F7)
{
if(RL_STOP==0)
{
for(i=0; i<4; i+=1)
{
RL_PAUSE_LED=0;
RL_STOP_LED=1;
Delay_ms(1500);
RL_PAUSE_LED=1;
RL_STOP_LED=0;
Delay_ms(3000);
}
RL_STOP_LED = RL_PAUSE_LED=0;
i=0;
}
else
{
if(status_device==2)
status_device=3;
else if(status_device==3)
status_device=2;
else
{
for(i=0; i<4; i+=1)
{
RL_PAUSE_LED=0;
RL_STOP_LED=1;
Delay_ms(1500);
RL_PAUSE_LED=1;
RL_STOP_LED=0;
Delay_ms(3000);
}
RL_STOP_LED = RL_PAUSE_LED=0;
i=0;
}
}
}
}
INTCON.IOCIF=0;
INTCON.INTF=0;
PIR1.RCIF=0;
IOCBF=0x00;
}
/******************************************************************************/
void main()
{
picSetup();
status_device=5;
while(1)
{
switch(status_device)
{
case 0: //not working
RL_STOP=0;
RL_PAUSE=0;
THR_LED=1;
RL_STOP_LED=1;
RL_PAUSE_LED=1;
break;
case 1: //stop
THR_LED=1; //spengo led di threshold
RL_PAUSE_LED=1; //spengo led pause
RL_STOP_LED=0; //accendo led modalità caldaia
RL_STOP=0; //diseccito relè di stop
//inviare sms thermocell OFF
deleteSMS();
status_device=0;
break;
case 2: //pause
THR_LED=1; //spengo led di threshold
RL_PAUSE_LED=0; //accendo led pause
RL_STOP_LED=1; //accendo led modalità caldaia
Delay_ms(1000);
RL_PAUSE_LED=1;
Delay_ms(1000);
break;
case 3: //play
//tengo monitorato la temperatura ambientale, se essa è inferiore
//eccito il relè di pausa altrimenti diseccito. Rele pausa spento
//led threshold deve lampeggiare quando è in funzione
//e fisso quando è in pausa per temperatura ambiente maggiore di
//set point.
//invio sms quando la temperatura è raggiunta
break;
case 4: //power on sms
//status_device=3;
break;
case 5: //infosystem sms
//temp_unita = (((conv_temp - temp_decimale)/10)%10);
//temp_decine = (((conv_temp - temp_decimale)-(temp_unita*10))/100);
mex [5] = temp_decimale+48;
//mex [3] = temp_unita+48;
//mex [2] = temp_decine+48;
Uart1_Write_Text(mex);
Uart1_Write_text(out_temp);
status_device=0;
break;
case 6:
//rifiuto chiamata
rejectCall();
break;
}
}
}
/******************************************************************************/
/*******************************************************************************
La funzione configura tutte le periferiche del microcontrollore usato
*******************************************************************************/
void picSetup()
{
char *command[]={"AT+IPR=9600",
"AT+CMGF=1", "AT#MONI=0", "AT+CPMS=SM", "AT+CLIP=1",
"AT+CNMI=2,1,0,0"};
TRISA = 0B00100100;
ANSELA = 0B00000000;
ADCON0 = 0B00001001;
ADCON1 = 0B11110000;
ADC_Init();
TRISB = 0B11000011;
ANSELB =0B00000000;
WPUB = 0B00000000;
OPTION_REG=0b00000000;
INTCON = 0B11001000;
IOCBP = 0B11000000;
IOCBN = 0B11000000;
IOCBF = 0B00000000;
PIE1.RCIE=1;
PIR1.RCIF=0;
PIE1.TXIE=0;
APFCON0.RXDTSEL=0; //RX is RB1 (INPUT)
APFCON0.TXCKSEL=0; //TX is RB2 (OUTPUT)
RCSTA=0B10010000;
Uart1_Init(9600);
/*TX & RX*/
TXSTA.BRGH=0;
BAUDCON.BRG16=0;
/* TurnOnGM862();
gm862Init(command, 6);
do
{
;
}
while(moduleIsRegistrated()!=1); */
creg_status=0;
}
/*******************************************************************************
La funzione accende il modulo, essa ritornerà:
1 se è andato tutto a buon fine
*******************************************************************************/
unsigned short int TurnOnGM862()
{
Delay_ms(5000);
GSM_POWER=1;
Delay_ms(10000);
GSM_POWER=0;
Delay_ms(20000);
GSM_POWER=1;
do
{
writeLine("AT");
Delay_ms(20000);
}
while(getModuleResponseFromMain()!=OK);
GSM_POWER=1;
return 1;
}
/*******************************************************************************
La funzione inizializza il modulo GM862, la funzione accetta come parametri:
@settings --> che rappresenta la stringa dei settaggi inerenti al modulo
@numbers --> che rappresenta il numero di comandi inseriti nella stringa
*******************************************************************************/
void gm862Init(char *settings[], unsigned short int _number_of_commands)
{
unsigned short int executed=0;
for(executed=0; executed<_number_of_commands; executed+=1)
{
do
{
writeLine(settings[executed]);
Delay_ms(20000);
}
while(getModuleResponseFromMain()!=OK);
Delay_ms(5000);
}
}
/*******************************************************************************
La funzione controlla se il modulo è allacciato correttamente alla rete GSM.
Essa ritorna:
1) 0 --> se il modulo non è registrato correttamente alla rete GSM senza
provare a registrarsi ad essa
2) 1 --> se il modulo è registrato correttamente alla rete GSM
3) 2 --> se il modulo non è registrato correttamente alla rete GSM ma sta
provando a registrarsi
4) 3 --> regstrazione scaduta
5) 4 --> la rete è in uno stato sconosciuto
6) 5 --> Registrato ma in roaming
*******************************************************************************/
unsigned short int moduleIsRegistrated()
{
do
{
writeLine("AT+CREG?");
Delay_ms(10000);
}
while(getModuleResponseFromMain()!=OK);
return creg_status;
}
/*******************************************************************************
ritorna l'ultima risposta al comando inviato al modulo. Vedere la funzione
checkString()
*******************************************************************************/
unsigned short int getModuleResponseFromMain()
{
unsigned short int returned=0;
returned=checked;
checked=0;
UART1_Write_Text("\r\n");
UART1_Write_Text("returned: ");
UART1_Write(returned+48);
UART1_Write_Text("\r\ncreg: ");
UART1_Write(creg_status+48);
UART1_write_Text("\r\n******\r\n");
return returned;
}
/*******************************************************************************
scrivo l'sms verso il destinatario
@destination --> il numero di telefono da inviare
@text --> testo da inviare al destinatario
*******************************************************************************/
void writeSMS(char destination_phone[], char *text)
{
UART1_Write_Text("AT+CMGS=");
/* UART1_Write_text(destination_phone);
UART1_Write(',');
UART1_Write_Text("145");
while(getModuleResponseFromMain()!=GREATER_THAN) //attendo il carattere >
;
UART1_Write_Text(text);
UART1_Write(0x1A); //fine comando */
}
/*******************************************************************************
elimino l'SMS
*******************************************************************************/
void deleteSMS()
{
unsigned short int index, float_to_int=0, unit_calc=0;
float dec_calc=0.0;
for(index=1; index<99; index+=1)
{
UART1_Write_text("AT+CMGD=");
if(index>=1 && index<=9)
UART1_Write(index+48);
else
{
dec_calc = index/10;
float_to_int = (int) dec_calc;
unit_calc = index%10;
UART1_Write(dec_calc+48);
UART1_Write(unit_calc+48);
}
UART1_Write('\r');
UART1_Write('\n');
Delay_ms(100);
if(getModuleResponseFromMain()==ERROR)
return;
}
}
unsigned short int readSMS()
{
unsigned short int to_return=0;
writeLine("AT@CMGL=\"REC UNREAD\"");
while(getModuleResponseFromMain()!=OK)
;
to_return = type_sms;
type_sms=0;
return to_return;
}
/*******************************************************************************
La funzione controlla che la stringa ricevuto contenga i caratteri di
risposta del modulo.
Come parametri essa richiede:
1) _received --> che rappresenta il carattere ricevuto
La funzione ristorna i seguenti valori:
1) 0 --> se il messaggio inviato non corrisponde a nulla
2) 1 --> se il modulo risponde con ERROR
3) 2 --> se il modulo risponde con OK
4) 3 --> se il modulo risponde con il simbolo >
5) 4 --> se si è ricevuto un sms
6) 5 --> se si riceve RING
*******************************************************************************/
unsigned short int checkString(char _received)
{
switch(gsm_buffer)
{
case 0:
if( _received=='O' || _received=='E' || _received=='R' ||
_received=='+' || _received=='@'
)
gsm_buffer=1;
if(_received=='>')
{
gsm_buffer=0;
return GREATER_THAN;
}
break;
case 1:
if(_received=='K') //\r\nOK\r\n
{
gsm_buffer=0;
return OK;
} //+CLIP, +CMTI, +CREG, @CMGL, +CPBR, CMS
if(_received=='R' || _received=='I' || _received=='C')
gsm_buffer=2;
if(_received=='L') //@CMGL
gsm_buffer=8;
break;
case 2:
if(_received=='R' || _received=='N' || _received=='L' ||
_received=='M' || _received=='P' || _received=='G' ) //\r\nERROR\r\n OPPURE CREG
gsm_buffer=3;
else
gsm_buffer=0;
break;
case 3:
if(_received=='O' || _received=='E' || _received=='I' ||
_received=='T') //\r\nERROR\r\n
gsm_buffer=4;
else if(_received=='B')
gsm_buffer=32;
else if(_received=='S')
gsm_buffer=41;
else
gsm_buffer=0;
break;
case 4:
if(_received=='R') //\r\nERROR\r\n
{
gsm_buffer=0;
return ERROR;
}
else if(_received=='G') //\r\nCREG\r\n
gsm_buffer=5;
else if(_received=='P') //+CLIP:
gsm_buffer=6;
else if(_received=='I') //+CMTI:
gsm_buffer=7;
else
gsm_buffer=0;
break;
case 5:
if(_received==':' || _received==' ') //+CREG:
gsm_buffer=5;
else
gsm_buffer=55;
break;
case 6:
status_device=6;
return RING;
break;
case 7:
if(_received==':') //+CMTI:
{
gsm_buffer=0;
return HAVING_SMS;
}
gsm_buffer=0;
break;
case 8:
if(_received==':')
gsm_buffer=8;
else if(_received==' ')
gsm_buffer=8;
if(_received=='\"') //@CMGL
{
char_counter+=1;
}
if(char_counter==2)
{
phone_number_cmgl[index_phone]=_received;
index_phone+=1;
}
if(index_phone==12 && char_counter==3)
{
gsm_buffer=9;
index_phone=0;
char_counter=0;
}
break;
case 9:
if(_received=='A' || _received=='S' || _received=='I')
gsm_buffer=10;
else
gsm_buffer=0;
break;
case 10:
if(_received=='D' || _received=='Y' || _received=='N')
gsm_buffer=11;
else
gsm_buffer=0;
break;
case 11:
if(_received=='D')
gsm_buffer=13;
else if(_received=='S')
gsm_buffer=17;
else if(_received=='F')
gsm_buffer=12;
else
gsm_buffer=0;
break;
case 12:
if(_received=='O')
gsm_buffer=31;
else
{
gsm_buffer=0;
}
break;
/*case 13:
if(_received==' ')
{
gsm_buffer=14;
if(index_phone>0)
index_phone=0;
}
else
gsm_buffer=0;
break;
case 14:
if((_received>='a' && _received<='z') ||
(_received>='A' && _received<='Z') ||
(_received>='0' && _received<='9')
)
{
name[index_phone]=_received;
if(index_phone==12)
index_phone=0;
else
index_phone+=1;
}
if(_received==',' || _received==';')
gsm_buffer=15;
else
gsm_buffer=14;
break;
case 15:
if( _received==' ')
{
if(index_phone>0)
index_phone=0;
gsm_buffer=16;
}
else
gsm_buffer=0;
break;
case 16:
if((_received>='0' && _received<='9') || (_received=='+'))
{
phone_number_cmgl[char_counter]=_received;
if(char_counter==12)
{
gsm_buffer=0;
char_counter=0;
type_sms=1;
}
else
{
char_counter+=1;
type_sms=0;
}
}
return ;
break; */
case 17:
if(_received=='=')
gsm_buffer=18;
else
gsm_buffer=0;
break;
case 18:
if(_received=='O' || _received=='o')
gsm_buffer=19;
else
gsm_buffer=0;
break;
case 19:
if(_received=='N' || _received=='n')
gsm_buffer=21;
break;
case 21:
if(_received==' ')
gsm_buffer=22;
break;
case 22:
if(_received=='T' || _received=='t')
gsm_buffer=23;
break;
case 23:
if(_received=='E' || _received=='e')
gsm_buffer=24;
break;
case 24:
if(_received=='M' || _received=='m')
gsm_buffer=25;
break;
case 25:
if(_received=='P' || _received=='p')
gsm_buffer=26;
break;
case 26:
if(_received=='=')
gsm_buffer=27;
break;
case 27:
if(_received>='0' && _received<='9')
{
threshold_temp = ((_received-48)*100);
gsm_buffer=28;
}
break;
case 28:
if(_received>='0' && _received<='9')
{
threshold_temp += ((_received-48)*10);
gsm_buffer=29;
}
break;
case 29:
if(_received>='.' || _received>=',')
gsm_buffer=30;
break;
case 30:
if(_received>='0' && _received<='9')
{
threshold_temp += (_received-48);
threshold_temp = threshold_temp / 10;
status_device=3;
gsm_buffer=0;
}
else
type_sms = 0;
break;
case 31:
status_device=5;
gsm_buffer=0;
break;
case 32:
if(_received=='R')
gsm_buffer=33;
else
gsm_buffer=0;
break;
case 33:
if(_received==':')
gsm_buffer=34;
else
gsm_buffer=0;
break;
case 34:
if(_received==' ')
gsm_buffer=35;
else
gsm_buffer=0;
break;
case 35:
if(_received=='(')
gsm_buffer=36;
else if(_received>='0' && _received<='9')
{
number_stored=_received-48;
gsm_buffer=0;
}
break;
case 36:
if(_received>='0' && _received<='9')
gsm_buffer=37;
else
gsm_buffer=0;
break;
case 37:
if(_received=='-')
gsm_buffer=38;
else
gsm_buffer=0;
break;
case 38:
if(_received>='0' && _received<='9')
{
max_number_in_rubric[0] = _received;
gsm_buffer=39;
}
else
gsm_buffer=0;
break;
case 39:
if(_received>='0' && _received<='9')
{
max_number_in_rubric[1] = _received;
gsm_buffer=40;
}
else
gsm_buffer=0;
break;
case 40:
if(_received>='0' && _received<='9')
{
max_number_in_rubric [2] = _received;
}
gsm_buffer=0;
break;
case 41:
if(_received==' ')
gsm_buffer=42;
else
gsm_buffer=0;
break;
case 42:
if(_received=='E')
gsm_buffer=43;
else
gsm_buffer=0;
break;
case 43:
if(_received=='R')
gsm_buffer=46;
else
gsm_buffer=0;
break;
case 44:
if(index_phone!=0)
index_phone = 0;
gsm_buffer=45;
break;
case 45:
if(_received>='0' && _received<='9' || _received=='+')
phone_number_stored[index_phone]=_received;
else if(_received==',')
index_phone=gsm_buffer=0;
break;
case 46:
if(_received=='R')
gsm_buffer=47;
else
gsm_buffer=0;
break;
case 47:
if(_received=='O')
gsm_buffer=48;
else
gsm_buffer=0;
break;
case 48:
if(_received=='R')
gsm_buffer=49;
else
gsm_buffer=0;
break;
case 49:
if(_received==':')
gsm_buffer=50;
else
gsm_buffer=0;
break;
case 50:
if(_received==' ')
gsm_buffer=51;
else
gsm_buffer=0;
break;
case 51:
if(_received=='3')
gsm_buffer=52;
else
gsm_buffer=0;
break;
case 52:
if(_received=='2')
gsm_buffer=53;
else
gsm_buffer=0;
break;
case 53:
if(_received=='1')
gsm_buffer=54;
else
gsm_buffer=0;
break;
case 54:
gsm_buffer=0;
return ERROR;
break;
case 55:
if(_received>=',')
gsm_buffer=56;
else
gsm_buffer=55;
break;
case 56:
THR_LED=0;
if(_received>='0' && _received<='5')
{
creg_status = (_received - 48);
gsm_buffer=0;
}
else
gsm_buffer=0;
break;
default:
gsm_buffer=0;
return 0;
break;
}
}
void rejectCall()
{
writeLine("+++");
writeLine("ATH");
}
/*******************************************************************************
La funzione controlla che il numero che ha inviato l'sms sia uguale a
quello che ha chiamato.
@phone_1 --> il numero di cellulare 1 da confrontare
@phone_2 --> il numero di cellulare 2 da confrontare
Essa ritorna:
1) 0 --> se i numeri differiscono;
2) 1 --> se i numeri sono identici;
******************************************************************************/
unsigned short int checkNumber(char phone_1[], char phone_2[])
{
unsigned short int index_checked;
for(index_checked=0; index_checked<13; index_checked+=1)
{
if(phone_1[index_checked]!=phone_2[index_checked])
return 0;
}
return 1;
}
unsigned short int isInRubric(char phone[])
{
unsigned short int number_count=1;
writeLine("AT+CPBR=?");
while(getModuleResponseFromMain()!=OK)
;
UART1_Write_Text("AT+CPBR=1,");
UART1_Write(max_number_in_rubric[0]);
UART1_Write(max_number_in_rubric[1]);
UART1_Write(max_number_in_rubric[2]);
UART1_Write('\r');
UART1_Write('\n');
while(getModuleResponseFromMain()!=OK)
;
for(number_count=1; number_count<=number_stored; number_count+=1)
{
UART1_Write_Text("AT+CPBR=");
UART1_Write(number_count+48);
UART1_Write('\r');
UART1_Write('\n');
while(getModuleResponseFromMain()!=OK)
;
if(checkNumber(phone_number_cmgl, phone_number_stored)==1)
return 1;
Delay_ms(100);
}
return 0;
}
void writeLine(char *cmd)
{
while(*cmd)
UART1_Write(*cmd++);
UART1_Write('\r');
UART1_Write('\n');
}
float readTemperature()
{
float temp=0;
temp = ADC_Read(2);
temp = (temp-102.4) /2.048;
return temp;
}
mex[]="t="mex [5] = temp_decimale+48;
instead of
(Anonimo).
ain't
, right?
in lieu of
.
for
arithm.

mex [5] = temp_decimale+48;
instead of
(Anonimo).
ain't
, right?
in lieu of
.
for
arithm.



/************************* dichiarazioni di costanti***************************/
#define RL_STOP_LED PORTA.F1
#define RL_PAUSE_LED PORTB.F4
#define THR_LED PORTB.F5
#define RL_STOP PORTA.F4
#define RL_PAUSE PORTB.F3
#define BUTTON_STOP IOCBF.F6
#define BUTTON_PAUSE IOCBF.F7
#define GSM_POWER PORTA.F3
#define ERROR 1
#define OK 2
#define GREATER_THAN 3
#define HAVING_SMS 4
#define RING 5
/******************************************************************************/
/****************************** variabili comuni ******************************/
unsigned short int checked=0, status_device=0, creg_status=0, gsm_buffer=0,
char_counter=0, index_phone=0, type_sms=0, i=0;
unsigned int number_stored=0;
int temp_decine=0, temp_unita=0, temp_decimale=0, conv_temp=0;
float threshold_temp=12.3, temp=12.3;
char phone_number_stored[13], phone_number_cmgl[13], name[13],
max_number_in_rubric[3], mex[]="t=xx.x";
/* status_device
0 --> null
1 --> stop
2 --> pause
3 --> play
4 --> sms ON
5 --> sms SYS
6 --> ring
*/
/******************************************************************************/
/*************************** dichiarazione funzioni ***************************/
unsigned short int getModuleResponseFromMain();
unsigned short int moduleIsRegistrated();
void gm862Init(char *settings[], unsigned short int _number_of_commands);
unsigned short int TurnOnGM862();
void picSetup();
void writeSMS(char *destination_phone, char *text);
unsigned short int readSMS();
void writeLine(char *cmd);
void deleteSMS();
unsigned short int checkString(char _received);
void rejectCall();
float readTemperature();
unsigned short int isInRubric(char phone[]);
/******************************************************************************/
/***************************** gestione interrupt *****************************/
void Interrupt()
{
char buffer='\0';
if(PIR1.RCIF)
{
buffer = UART1_Read();
if(buffer!=0x0D && buffer!=0x0A )
checked = checkString(buffer);
if(checked==HAVING_SMS)
status_device=3;
}
if(INTCON.IOCIF)
{
if(BUTTON_STOP) //se il pulsante P1 (STOP) è stato premuto (F6)
{
if(RL_STOP) //se il relè di commutazione è ativo
{
status_device=1;//interrompo tutto il processo
}
else
{
RL_STOP=0;
RL_STOP_LED=0;
Delay_ms(500);
RL_STOP_LED=1;
Delay_ms(500);
RL_STOP_LED=0;
Delay_ms(1500);
RL_STOP_LED=1;
status_device=0;
}
}
//pausa = 2; play=3
if(BUTTON_PAUSE) //se il pulsante P2 è stato premuto (F7)
{
if(RL_STOP==0)
{
for(i=0; i<4; i+=1)
{
RL_PAUSE_LED=0;
RL_STOP_LED=1;
Delay_ms(1500);
RL_PAUSE_LED=1;
RL_STOP_LED=0;
Delay_ms(3000);
}
RL_STOP_LED = RL_PAUSE_LED=0;
i=0;
}
else
{
if(status_device==2)
status_device=3;
else if(status_device==3)
status_device=2;
else
{
for(i=0; i<4; i+=1)
{
RL_PAUSE_LED=0;
RL_STOP_LED=1;
Delay_ms(1500);
RL_PAUSE_LED=1;
RL_STOP_LED=0;
Delay_ms(3000);
}
RL_STOP_LED = RL_PAUSE_LED=0;
i=0;
}
}
}
}
INTCON.IOCIF=0;
INTCON.INTF=0;
PIR1.RCIF=0;
IOCBF=0x00;
}
/******************************************************************************/
void main()
{
picSetup();
status_device=5;
while(1)
{
switch(status_device)
{
case 0: //not working
RL_STOP=0;
RL_PAUSE=0;
THR_LED=1;
RL_STOP_LED=1;
RL_PAUSE_LED=1;
break;
case 1: //stop
THR_LED=1; //spengo led di threshold
RL_PAUSE_LED=1; //spengo led pause
RL_STOP_LED=0; //accendo led modalità caldaia
RL_STOP=0; //diseccito relè di stop
//inviare sms thermocell OFF
deleteSMS();
status_device=0;
break;
case 2: //pause
THR_LED=1; //spengo led di threshold
RL_PAUSE_LED=0; //accendo led pause
RL_STOP_LED=1; //accendo led modalità caldaia
Delay_ms(1000);
RL_PAUSE_LED=1;
Delay_ms(1000);
break;
case 3: //play
//tengo monitorato la temperatura ambientale, se essa è inferiore
//eccito il relè di pausa altrimenti diseccito. Rele pausa spento
//led threshold deve lampeggiare quando è in funzione
//e fisso quando è in pausa per temperatura ambiente maggiore di
//set point.
//invio sms quando la temperatura è raggiunta
break;
case 4: //power on sms
//status_device=3;
break;
case 5: //infosystem sms
conv_temp = temp*10;
temp_decimale = ((conv_temp)%10);
//temp_unita = (((conv_temp - temp_decimale)/10)%10);
//temp_decine = (((conv_temp - temp_decimale)-(temp_unita*10))/100);
mex [5] = temp_decimale+48;
//mex [3] = temp_unita+48;
//mex [2] = temp_decine+48;
Uart1_Write_Text(mex);
status_device=0;
break;
case 6:
//rifiuto chiamata
rejectCall();
break;
}
}
}
/******************************************************************************/
/*******************************************************************************
La funzione configura tutte le periferiche del microcontrollore usato
*******************************************************************************/
void picSetup()
{
char *command[]={"AT+IPR=9600",
"AT+CMGF=1", "AT#MONI=0", "AT+CPMS=SM", "AT+CLIP=1",
"AT+CNMI=2,1,0,0"};
TRISA = 0B00100100;
ANSELA = 0B00000000;
ADCON0 = 0B00001001;
ADCON1 = 0B11110000;
ADC_Init();
TRISB = 0B11000011;
ANSELB =0B00000000;
WPUB = 0B00000000;
OPTION_REG=0b00000000;
INTCON = 0B11001000;
IOCBP = 0B11000000;
IOCBN = 0B11000000;
IOCBF = 0B00000000;
PIE1.RCIE=1;
PIR1.RCIF=0;
PIE1.TXIE=0;
APFCON0.RXDTSEL=0; //RX is RB1 (INPUT)
APFCON0.TXCKSEL=0; //TX is RB2 (OUTPUT)
RCSTA=0B10010000;
Uart1_Init(9600);
/*TX & RX*/
TXSTA.BRGH=0;
BAUDCON.BRG16=0;
/* TurnOnGM862();
gm862Init(command, 6);
do
{
;
}
while(moduleIsRegistrated()!=1); */
creg_status=0;
}
/*******************************************************************************
La funzione accende il modulo, essa ritornerà:
1) 0 se è spento
2) 1 se è acceso
*******************************************************************************/
unsigned short int TurnOnGM862()
{
Delay_ms(5000);
GSM_POWER=1;
Delay_ms(10000);
GSM_POWER=0;
Delay_ms(20000);
GSM_POWER=1;
do
{
writeLine("AT");
Delay_ms(20000);
}
while(getModuleResponseFromMain()!=OK);
GSM_POWER=1;
}
/*******************************************************************************
La funzione inizializza il modulo GM862, la funzione accetta come parametri:
@settings --> che rappresenta la stringa dei settaggi inerenti al modulo
@numbers --> che rappresenta il numero di comandi inseriti nella stringa
*******************************************************************************/
void gm862Init(char *settings[], unsigned short int _number_of_commands)
{
unsigned short int executed=0;
for(executed=0; executed<_number_of_commands; executed+=1)
{
do
{
writeLine(settings[executed]);
Delay_ms(20000);
}
while(getModuleResponseFromMain()!=OK);
Delay_ms(5000);
}
}
/*******************************************************************************
La funzione controlla se il modulo è allacciato correttamente alla rete GSM.
Essa ritorna:
1) 0 --> se il modulo non è registrato correttamente alla rete GSM senza
provare a registrarsi ad essa
2) 1 --> se il modulo è registrato correttamente alla rete GSM
3) 2 --> se il modulo non è registrato correttamente alla rete GSM ma sta
provando a registrarsi
4) 3 --> regstrazione scaduta
5) 4 --> la rete è in uno stato sconosciuto
6) 5 --> Registrato ma in roaming
*******************************************************************************/
unsigned short int moduleIsRegistrated()
{
do
{
writeLine("AT+CREG?");
Delay_ms(10000);
}
while(getModuleResponseFromMain()!=OK);
return creg_status;
}
/*******************************************************************************
ritorna l'ultima risposta al comando inviato al modulo. Vedere la funzione
checkString()
*******************************************************************************/
unsigned short int getModuleResponseFromMain()
{
unsigned short int returned=0;
returned=checked;
checked=0;
UART1_Write_Text("\r\n");
UART1_Write_Text("returned: ");
UART1_Write(returned+48);
UART1_Write_Text("\r\ncreg: ");
UART1_Write(creg_status+48);
UART1_write_Text("\r\n******\r\n");
return returned;
}
/*******************************************************************************
scrivo l'sms verso il destinatario
@destination --> il numero di telefono da inviare
@text --> testo da inviare al destinatario
*******************************************************************************/
void writeSMS(char destination_phone[], char *text)
{
UART1_Write_Text("AT+CMGS=");
/* UART1_Write_text(destination_phone);
UART1_Write(',');
UART1_Write_Text("145");
while(getModuleResponseFromMain()!=GREATER_THAN) //attendo il carattere >
;
UART1_Write_Text(text);
UART1_Write(0x1A); //fine comando */
}
/*******************************************************************************
elimino l'SMS
*******************************************************************************/
void deleteSMS()
{
unsigned short int index, float_to_int=0, unit_calc=0;
float dec_calc=0.0;
for(index=1; index<99; index+=1)
{
UART1_Write_text("AT+CMGD=");
if(index>=1 && index<=9)
UART1_Write(index+48);
else
{
dec_calc = index/10;
float_to_int = (int) dec_calc;
unit_calc = index%10;
UART1_Write(dec_calc+48);
UART1_Write(unit_calc+48);
}
UART1_Write('\r');
UART1_Write('\n');
Delay_ms(100);
if(getModuleResponseFromMain()==ERROR)
return;
}
}
unsigned short int readSMS()
{
unsigned short int to_return=0;
writeLine("AT@CMGL=\"REC UNREAD\"");
while(getModuleResponseFromMain()!=OK)
;
to_return = type_sms;
type_sms=0;
return to_return;
}
/*******************************************************************************
La funzione controlla che la stringa ricevuto contenga i caratteri di
risposta del modulo.
Come parametri essa richiede:
1) _received --> che rappresenta il carattere ricevuto
La funzione ristorna i seguenti valori:
1) 0 --> se il messaggio inviato non corrisponde a nulla
2) 1 --> se il modulo risponde con ERROR
3) 2 --> se il modulo risponde con OK
4) 3 --> se il modulo risponde con il simbolo >
5) 4 --> se si è ricevuto un sms
6) 5 --> se si riceve RING
*******************************************************************************/
unsigned short int checkString(char _received)
{
switch(gsm_buffer)
{
case 0:
if( _received=='O' || _received=='E' || _received=='R' ||
_received=='+' || _received=='@'
)
gsm_buffer=1;
if(_received=='>')
{
gsm_buffer=0;
return GREATER_THAN;
}
break;
case 1:
if(_received=='K') //\r\nOK\r\n
{
gsm_buffer=0;
return OK;
} //+CLIP, +CMTI, +CREG, @CMGL, +CPBR, CMS
if(_received=='R' || _received=='I' || _received=='C')
gsm_buffer=2;
if(_received=='L') //@CMGL
gsm_buffer=8;
break;
case 2:
if(_received=='R' || _received=='N' || _received=='L' ||
_received=='M' || _received=='P' || _received=='G' ) //\r\nERROR\r\n OPPURE CREG
gsm_buffer=3;
else
gsm_buffer=0;
break;
case 3:
if(_received=='O' || _received=='E' || _received=='I' ||
_received=='T') //\r\nERROR\r\n
gsm_buffer=4;
else if(_received=='B')
gsm_buffer=32;
else if(_received=='S')
gsm_buffer=41;
else
gsm_buffer=0;
break;
case 4:
if(_received=='R') //\r\nERROR\r\n
{
gsm_buffer=0;
return ERROR;
}
else if(_received=='G') //\r\nCREG\r\n
gsm_buffer=5;
else if(_received=='P') //+CLIP:
gsm_buffer=6;
else if(_received=='I') //+CMTI:
gsm_buffer=7;
else
gsm_buffer=0;
break;
case 5:
if(_received==':' || _received==' ') //+CREG:
gsm_buffer=5;
else
gsm_buffer=55;
break;
case 6:
status_device=6;
return RING;
break;
case 7:
if(_received==':') //+CMTI:
{
gsm_buffer=0;
return HAVING_SMS;
}
gsm_buffer=0;
break;
case 8:
if(_received==':')
gsm_buffer=8;
else if(_received==' ')
gsm_buffer=8;
if(_received=='\"') //@CMGL
{
char_counter+=1;
}
if(char_counter==2)
{
phone_number_cmgl[index_phone]=_received;
index_phone+=1;
}
if(index_phone==12 && char_counter==3)
{
gsm_buffer=9;
index_phone=0;
char_counter=0;
}
break;
case 9:
if(_received=='A' || _received=='S' || _received=='I')
gsm_buffer=10;
else
gsm_buffer=0;
break;
case 10:
if(_received=='D' || _received=='Y' || _received=='N')
gsm_buffer=11;
else
gsm_buffer=0;
break;
case 11:
if(_received=='D')
gsm_buffer=13;
else if(_received=='S')
gsm_buffer=17;
else if(_received=='F')
gsm_buffer=12;
else
gsm_buffer=0;
break;
case 12:
if(_received=='O')
gsm_buffer=31;
else
{
gsm_buffer=0;
}
break;
/*case 13:
if(_received==' ')
{
gsm_buffer=14;
if(index_phone>0)
index_phone=0;
}
else
gsm_buffer=0;
break;
case 14:
if((_received>='a' && _received<='z') ||
(_received>='A' && _received<='Z') ||
(_received>='0' && _received<='9')
)
{
name[index_phone]=_received;
if(index_phone==12)
index_phone=0;
else
index_phone+=1;
}
if(_received==',' || _received==';')
gsm_buffer=15;
else
gsm_buffer=14;
break;
case 15:
if( _received==' ')
{
if(index_phone>0)
index_phone=0;
gsm_buffer=16;
}
else
gsm_buffer=0;
break;
case 16:
if((_received>='0' && _received<='9') || (_received=='+'))
{
phone_number_cmgl[char_counter]=_received;
if(char_counter==12)
{
gsm_buffer=0;
char_counter=0;
type_sms=1;
}
else
{
char_counter+=1;
type_sms=0;
}
}
return ;
break; */
case 17:
if(_received=='=')
gsm_buffer=18;
else
gsm_buffer=0;
break;
case 18:
if(_received=='O' || _received=='o')
gsm_buffer=19;
else
gsm_buffer=0;
break;
case 19:
if(_received=='N' || _received=='n')
gsm_buffer=21;
break;
case 21:
if(_received==' ')
gsm_buffer=22;
break;
case 22:
if(_received=='T' || _received=='t')
gsm_buffer=23;
break;
case 23:
if(_received=='E' || _received=='e')
gsm_buffer=24;
break;
case 24:
if(_received=='M' || _received=='m')
gsm_buffer=25;
break;
case 25:
if(_received=='P' || _received=='p')
gsm_buffer=26;
break;
case 26:
if(_received=='=')
gsm_buffer=27;
break;
case 27:
if(_received>='0' && _received<='9')
{
threshold_temp = ((_received-48)*100);
gsm_buffer=28;
}
break;
case 28:
if(_received>='0' && _received<='9')
{
threshold_temp += ((_received-48)*10);
gsm_buffer=29;
}
break;
case 29:
if(_received>='.' || _received>=',')
gsm_buffer=30;
break;
case 30:
if(_received>='0' && _received<='9')
{
threshold_temp += (_received-48);
threshold_temp = threshold_temp / 10;
status_device=3;
gsm_buffer=0;
}
else
type_sms = 0;
break;
case 31:
status_device=5;
gsm_buffer=0;
break;
case 32:
if(_received=='R')
gsm_buffer=33;
else
gsm_buffer=0;
break;
case 33:
if(_received==':')
gsm_buffer=34;
else
gsm_buffer=0;
break;
case 34:
if(_received==' ')
gsm_buffer=35;
else
gsm_buffer=0;
break;
case 35:
if(_received=='(')
gsm_buffer=36;
else if(_received>='0' && _received<='9')
{
number_stored=_received-48;
gsm_buffer=0;
}
break;
case 36:
if(_received>='0' && _received<='9')
gsm_buffer=37;
else
gsm_buffer=0;
break;
case 37:
if(_received=='-')
gsm_buffer=38;
else
gsm_buffer=0;
break;
case 38:
if(_received>='0' && _received<='9')
{
max_number_in_rubric[0] = _received;
gsm_buffer=39;
}
else
gsm_buffer=0;
break;
case 39:
if(_received>='0' && _received<='9')
{
max_number_in_rubric[1] = _received;
gsm_buffer=40;
}
else
gsm_buffer=0;
break;
case 40:
if(_received>='0' && _received<='9')
{
max_number_in_rubric [2] = _received;
}
gsm_buffer=0;
break;
case 41:
if(_received==' ')
gsm_buffer=42;
else
gsm_buffer=0;
break;
case 42:
if(_received=='E')
gsm_buffer=43;
else
gsm_buffer=0;
break;
case 43:
if(_received=='R')
gsm_buffer=46;
else
gsm_buffer=0;
break;
case 44:
if(index_phone!=0)
index_phone = 0;
gsm_buffer=45;
break;
case 45:
if(_received>='0' && _received<='9' || _received=='+')
phone_number_stored[index_phone]=_received;
else if(_received==',')
index_phone=gsm_buffer=0;
break;
case 46:
if(_received=='R')
gsm_buffer=47;
else
gsm_buffer=0;
break;
case 47:
if(_received=='O')
gsm_buffer=48;
else
gsm_buffer=0;
break;
case 48:
if(_received=='R')
gsm_buffer=49;
else
gsm_buffer=0;
break;
case 49:
if(_received==':')
gsm_buffer=50;
else
gsm_buffer=0;
break;
case 50:
if(_received==' ')
gsm_buffer=51;
else
gsm_buffer=0;
break;
case 51:
if(_received=='3')
gsm_buffer=52;
else
gsm_buffer=0;
break;
case 52:
if(_received=='2')
gsm_buffer=53;
else
gsm_buffer=0;
break;
case 53:
if(_received=='1')
gsm_buffer=54;
else
gsm_buffer=0;
break;
case 54:
gsm_buffer=0;
return ERROR;
break;
case 55:
if(_received>=',')
gsm_buffer=56;
else
gsm_buffer=55;
break;
case 56:
THR_LED=0;
if(_received>='0' && _received<='5')
{
creg_status = (_received - 48);
gsm_buffer=0;
}
else
gsm_buffer=0;
break;
default:
gsm_buffer=0;
return 0;
break;
}
}
void rejectCall()
{
writeLine("+++");
writeLine("ATH");
}
/*******************************************************************************
La funzione controlla che il numero che ha inviato l'sms sia uguale a
quello che ha chiamato.
@phone_1 --> il numero di cellulare 1 da confrontare
@phone_2 --> il numero di cellulare 2 da confrontare
Essa ritorna:
1) 0 --> se i numeri differiscono;
2) 1 --> se i numeri sono identici;
******************************************************************************/
unsigned short int checkNumber(char phone_1[], char phone_2[])
{
unsigned short int index_checked;
for(index_checked=0; index_checked<13; index_checked+=1)
{
if(phone_1[index_checked]!=phone_2[index_checked])
return 0;
}
return 1;
}
unsigned short int isInRubric(char phone[])
{
unsigned short int number_count=1;
writeLine("AT+CPBR=?");
while(getModuleResponseFromMain()!=OK)
;
UART1_Write_Text("AT+CPBR=1,");
UART1_Write(max_number_in_rubric[0]);
UART1_Write(max_number_in_rubric[1]);
UART1_Write(max_number_in_rubric[2]);
UART1_Write('\r');
UART1_Write('\n');
while(getModuleResponseFromMain()!=OK)
;
for(number_count=1; number_count<=number_stored; number_count+=1)
{
UART1_Write_Text("AT+CPBR=");
UART1_Write(number_count+48);
UART1_Write('\r');
UART1_Write('\n');
while(getModuleResponseFromMain()!=OK)
;
if(checkNumber(phone_number_cmgl, phone_number_stored)==1)
return 1;
Delay_ms(100);
}
return 0;
}
void writeLine(char *cmd)
{
while(*cmd)
UART1_Write(*cmd++);
UART1_Write('\r');
UART1_Write('\n');
}
float readTemperature()
{
float temp=0;
temp = ADC_Read(2);
temp = (temp-102.4) /2.048;
return temp;
}
lcua31989 ha scritto:non so più cosa fare
instead of
(Anonimo).
ain't
, right?
in lieu of
.
for
arithm.

TurnOnGM862(); //accensione
gm862Init(command, 6); //inizializzazione
do
{
;
}
while(moduleIsRegistrated()!=1); //resto in polling fino a quando il modulo GSM è registrato sulla GSM
creg_status=0; //azzero lo stato di lettura della precedente funzione.
void main()
{
picSetup();
status_device=5;
while(1)
{
switch(status_device)
{
case 0: //not working
RL_STOP=0;
RL_PAUSE=0;
THR_LED=1;
RL_STOP_LED=1;
RL_PAUSE_LED=1;
break;
case 1: //stop
THR_LED=1; //spengo led di threshold
RL_PAUSE_LED=1; //spengo led pause
RL_STOP_LED=0; //accendo led modalità caldaia
RL_STOP=0; //diseccito relè di stop
//inviare sms thermocell OFF
deleteSMS();
status_device=0;
break;
case 2: //pause
THR_LED=1; //spengo led di threshold
RL_PAUSE_LED=0; //accendo led pause
RL_STOP_LED=1; //accendo led modalità caldaia
Delay_ms(1000);
RL_PAUSE_LED=1;
Delay_ms(1000);
break;
case 3: //play
//tengo monitorato la temperatura ambientale, se essa è inferiore
//eccito il relè di pausa altrimenti diseccito. Rele pausa spento
//led threshold deve lampeggiare quando è in funzione
//e fisso quando è in pausa per temperatura ambiente maggiore di
//set point.
//invio sms quando la temperatura è raggiunta
break;
case 4: //power on sms
//status_device=3;
break;
case 5: //infosystem sms
conv_temp = temp*10;
temp_decimale = ((conv_temp)%10);
temp_unita = (((conv_temp - temp_decimale)/10)%10);
temp_decine = (((conv_temp - temp_decimale)-(temp_unita*10))/100);
mex [5] = temp_decimale+48;
mex [3] = temp_unita+48;
mex [2] = temp_decine+48;
Uart1_Write_Text(mex);
status_device=0;
break;
case 6:
//rifiuto chiamata
rejectCall();
break;
}
}
}Torna a Firmware e programmazione
Visitano il forum: Nessuno e 22 ospiti