E' da giorni che mi sto imbattendo su un problema, le ho provate tutte e non sono riuscito a venirne a capo. Sto facendo un progettino che vede coinvolto un modulo GSM telit GM862 e un PIC 16f1827. Il PIC implementa di suo l'UART, ma avendo sbagliato a disegnare il circuito e conseguentemente a far realizzare il PCB, ho pensato bene di provare ad implementare l'UART via software tramite delle librerie apposite. Io sto usando il complatore in C della mikroelettronica, ovvero MIKROC. La comunicazione avviene con con un baud rate da 9600 bps con un quarzo, per il microcontrollore, da 8 MHz . Nella funzione gm862Init() (scritta da me) ci sono una serie di comandi che vanno a configurare il suddetto modulo usando un ciclo for. Il ciclo for si compone cosi:
1) Scrivo il comando da inviare
2) Attendo la risposta mediante una funzione autobloccante di lettura
3) Suono il Buzzer di comando inviato correttamente
4) rieseguo dal passo 1.
Il primo comando della lista lo esegue correttamente, dopo essersi posto in ascolto e aver ricevuto il comando OK dal modulo, ottengo sempre degli errori di scrittura del nuovo comando. Onestamente non riesco a capire. Ad un primo momento ho abbassato la velocità di clock (fino a 1 MHz) del PIC per ridurre la possibilità d'errore; successivamente ho provato a ridurre la velovità di Baud rate fino a 2400 bps; ho provato poi a mettere un ritardo di esecuzione tra l'invio di un carattere e l'altro. Infine, ho provato anche ad attendere l'invio del comando fino a quando la linea TX non risulta essere libera per trasmettere. Tutti questi tentativi sono andati male. Mi è venuto in mente di interrompere le piste di rame sul PCB e collegarle in modo corretto mediante spezzoni di filo, ma non vorrei ad arrivare a questa soluzione drastica.
Qualche d'uno ha una vaga idea di come si possa risolvere il problema?
Di seguito posto il mio codice originale:
- Codice: Seleziona tutto
/************************* dichiarazioni di costanti***************************/
#define P1 PORTB.F6
#define P2 PORTB.F7
#define LED_P1 PORTB.F3
#define LED_P2 PORTB.F4
#define RELE_1 PORTB.F1
#define RELE_2 PORTA.F4
#define LED_FINISHED PORTB.F5
#define LED_ON 0
#define LED_OFF 1
#define READ_TEMP 1
/******************************************************************************/
/****************************** variabili comuni ******************************/
char str[64];
unsigned short int index=0, checked=0, action=0, gm_status=0;
char *commands[]={"AT", "AT+IPR=9600", "AT#BND=0", "AT#COPS=0", "AT+CMEE=2",
"AT#CMGF=1", "AT+CREG?", "AT#MONI=0", "AT+CMGS=\"+393349864109\"", "AT+CPMS=\"SM\"", "AT+CMGL=\"ALL\""
"ser1231211"};
/******************************************************************************/
/*************************** dichiarazione funzioni ***************************/
void picSetup();
float readTemperature();
void gm862Init();
void writeLine(char *cmd);
float readLine();
void playBuzzer(int frequency, int duration, int interval, int count);
unsigned short int checkStirngReceived(char received[], unsigned short int scan);
/******************************************************************************/
/***************************** gestione interrupt *****************************/
/******************************************************************************/
void main()
{
float tmp=0;
picSetup();
while(1)
{
/* if(action=READ_TEMP)
{
tmp = readTemperature();
action=0;
}*/
;
}
}
/******************************************************************************/
void gm862Init()
{
unsigned short int executed, list_commands=8;
Soft_UART_Init(&PORTB, 0, 1, 2400, 0);
for(executed=0; executed<list_commands; executed++)
{
writeLine(commands[i]);
while(readLine()!=3)
;
PlayBuzzer(440, 250, 200, executed+1);
}
}
void writeLine(char *cmd)
{
while(*cmd)
Soft_UART_Write(*cmd++);
Soft_UART_Write('\r');
}
float readLine()
{
unsigned short int error=0, i=0, received=0;
char mex[32];
do
{
mex[i] = Soft_UART_Read(&error);
received = checkStirngReceived(mex, i);
i+=1;
}
while(received!=3);
return 3;
}
unsigned short int checkStirngReceived(char received[], unsigned short int scan)
{
switch(gm_status)
{
case 0:
if(received[scan] == 'O')
gm_status = 1;
else
gm_status = 0;
break;
case 1:
if(received[scan] == 'K')
gm_status = 2;
else
gm_status = 0;
break;
case 2:
if(received[scan] == 13)
gm_status = 3;
else
gm_status = 0;
break;
case 3:
if(received[scan] == 10)
{
gm_status = 0;
return 3;
}
break;
default: return 0; break;
}
}
void playBuzzer(int frequency, int duration, int interval, int count)
{
unsigned short int i;
for(i=0; i<count; i+=1)
{
Sound_Play(frequency, duration);
Vdelay_ms(interval);
}
}
float readTemperature()
{
float temp=0;
temp = ADC_Read(0);
temp = (temp-102.4) /2.048;
return temp;
}
void picSetup()
{
TRISA = 0B00000100;
PORTA = 0;
LATA = 0;
//ADCON0 = 0B00000001;
//ADCON1 = 0B00001110;
//ADC_Init();
TRISB = 0B11000101;
PORTB = 0;
LATB = 0;
// INTCON = 0B11001000;
Sound_Init(&PORTA, 0);
Sound_Play(950, 500);
PORTA.F1=1;
Delay_ms(500);
PORTA.F1=0;
Delay_ms(500);
PORTB.F5=1;
Delay_ms(500);
PORTB.F5=0;
Delay_ms(500);
PORTB.F4=1;
Delay_ms(500);
PORTB.F4=0;
gm862Init();
}
Un grazie mille in anticipo,
Lcua31989

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)
