Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Da float a string in C

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: Da float a string in C

Messaggioda Foto Utentec1b8 » 30 lug 2013, 17:20

A me quel codice nemmeno compila.
Per farlo compilare ho dovuto portare la dichiarazione delle variabili esterne alla main, si compila e funziona.

Come già suggerito da Foto UtenteDirtyDeeds posta il codice completo altrimenti non si capisce dove stia il problema.

mikroC ha un debugger integrato.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[12] Re: Da float a string in C

Messaggioda Foto Utentelcua31989 » 30 lug 2013, 20:38

Ciao,

ecco il codice tenete presente che non è stato del tutto debaggato...

Codice: Seleziona tutto
/************************* 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;
}


questo se lo copierete e incollerete non dovreste avere problemi di compilazioni.

Ciao
lcua31989
Avatar utente
Foto Utentelcua31989
58 1 1 7
Frequentatore
Frequentatore
 
Messaggi: 194
Iscritto il: 28 nov 2012, 23:37

1
voti

[13] Re: Da float a string in C

Messaggioda Foto UtenteDirtyDeeds » 30 lug 2013, 20:42

Se definisci

Codice: Seleziona tutto
mex[]="t="


poi non puoi scrivere

Codice: Seleziona tutto
mex [5] = temp_decimale+48;


:!:

mex è un array di 3 caratteri.
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[14] Re: Da float a string in C

Messaggioda Foto Utentelcua31989 » 30 lug 2013, 21:29

perché non potrei? non è mica un array dinamico?
Avatar utente
Foto Utentelcua31989
58 1 1 7
Frequentatore
Frequentatore
 
Messaggi: 194
Iscritto il: 28 nov 2012, 23:37

1
voti

[15] Re: Da float a string in C

Messaggioda Foto UtenteDirtyDeeds » 30 lug 2013, 21:34

Che c'entra?

Il compilatore alloca per mex uno spazio di 3 byte. Scrivendo

Codice: Seleziona tutto
mex [5] = temp_decimale+48;


stai scrivendo oltre la fine dell'array.
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

2
voti

[16] Re: Da float a string in C

Messaggioda Foto UtentePaolino » 30 lug 2013, 21:35

Avendolo dichiarato a 3 elementi (simbolo t, simbolo = e il carattere "fine stringa"), se cerchi di accedere alla cella 5, trovi solo fuffa!

Ciao.

Paolo.

Edit: Foto UtenteDirtyDeeds, too fast :-D
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[17] Re: Da float a string in C

Messaggioda Foto Utentelcua31989 » 30 lug 2013, 21:45

Non lo sapevo xD...

comunque ho provato a modificarlo come dici tu, ma nulla da fare; ancora non funziona :( non so più cosa fare

Codice: Seleziona tutto
/************************* 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;
}


ciao lcua31989
Avatar utente
Foto Utentelcua31989
58 1 1 7
Frequentatore
Frequentatore
 
Messaggi: 194
Iscritto il: 28 nov 2012, 23:37

1
voti

[18] Re: Da float a string in C

Messaggioda Foto UtenteDirtyDeeds » 30 lug 2013, 21:55

lcua31989 ha scritto:non so più cosa fare


Innanzitutto potresti spiegare cosa leggi dalla seriale. Per esempio, da un'occhiata veloce al programma (ma non sono né un compilatore né un PIC), mi aspetto che il tuo programma tenti di scrivere una volta sulla UART e poi non faccia più una mazza...

PS: lo stile di programmazione è raccapricciante: non pensi che aiuterebbe usare uno stile di programmazione corretto?
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[19] Re: Da float a string in C

Messaggioda Foto Utentelcua31989 » 30 lug 2013, 22:12

Ciao,

sulla UART è collegato un modulo GM862. Il PIC manda dei comandi di accensione, inizializzazione e richiesta stato della rete GSM (che per ora ho commentato altrimenti non arrivo più a casa...) attraverso il codice che poi scommenterò quando il tutto funziona. O

Codice: Seleziona tutto
   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.                         


Queste righe fnzionano al 110% testate in simulazione e in pratica.
Avatar utente
Foto Utentelcua31989
58 1 1 7
Frequentatore
Frequentatore
 
Messaggi: 194
Iscritto il: 28 nov 2012, 23:37

0
voti

[20] Re: Da float a string in C

Messaggioda Foto Utentelcua31989 » 30 lug 2013, 22:19

comunque avendo messo "status_device=5;" il PIC nello switch va direttamente al case 5. In questa fase il micro dovrà inviare un SMS con la temperatura letta. Quello che non riesco a far funzionare è la trasmissione del dato temp sul modulo seriale. Con la calcolatrice tutto funziona, ma quando il PIC converte e invia il segnale alla rs232 ricevo solo fuffa. comunque per semplificare il codice che per ora è questo deve inizializzare i registri del PIC micro, il modulo uart e inviare il dato (che non fa). Le impostazioni sono corrette altrimenti le funzioni precedentemente descritte non funionerebbero. Mi scuso ma erroniamente ho premuto il tasto invia quando il thread non era ancora completato.

Codice: Seleziona tutto
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;

          }
   }
}


saluti
lcua31989
Avatar utente
Foto Utentelcua31989
58 1 1 7
Frequentatore
Frequentatore
 
Messaggi: 194
Iscritto il: 28 nov 2012, 23:37

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 33 ospiti