Autor Tema: Problema UART PIC24 - SIM5320  (Leído 2592 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Rikr09

  • PIC16
  • ***
  • Mensajes: 112
Problema UART PIC24 - SIM5320
« en: 09 de Abril de 2013, 10:30:16 »
Buenas amigos de Todopic!

En esta ocasión vengo con un problema que tengo al comunicar mi PIC 24FJ128GA310 con el Módulo SIM5320. Resulta que quiero colocar en modo transparente la comunicación entre el PIC y este ultimo, para ello lo que hago es Byte que recibo por el UART1 lo mando por el UART2(que visualizo en el Hercules) y vicerveza, BYTE que recibo por el UART2, lo mando por el UART1 hacia el Módulo; asi:

Código: [Seleccionar]
void Modulo_3G1(){
       
//unsigned int j = 0; Se enciende el Módulo
        M3G_ON_OFF = 1; __delay_ms(500);
        PWRKEY = 1; __delay_ms(120); PWRKEY = 0; __delay_ms(500);
        UA2("Inicio...");
        LED_PRUEBA = 0;
//      _____________________________________________________

        while(1){
            if(BandUx == 1){
                U2(Dato1);
                Dato1 = 0; BandUx = 0;
            }

            if(BandUx == 2){
                U1(Dato2);
                Dato2 = 0; BandUx = 0;
            }
        }

}


Los métodos U1 y U2 son los que siguen:

Código: [Seleccionar]
/************************
*   Salida del UART2 *
************************/

void U2( unsigned char s ){
    U2TXREG = s;
    while( U2STAbits.TRMT == 0 );
}

/************************
*   Salida del UART1 *
************************/
void U1( unsigned char s ){
    U1TXREG = s;
    while( U1STAbits.TRMT == 0 );
}

Y los valores Dato1 y Dato2 se cargan al momento en que hay una interrupción de recepción por el UART correspondiente:

Código: [Seleccionar]
void __attribute__ ((interrupt, no_auto_psv)) _U2RXInterrupt(void) {
    Dato2 = U2RXREG;
    BandUx = 2;
    IFS1bits.U2RXIF = 0;
}


/********************************
*   Interrupciones del UART1 *
********************************/
void __attribute__ ((interrupt, no_auto_psv)) _U1RXInterrupt(void) {
    Dato1 = U1RXREG;
    BandUx = 1;
    IFS0bits.U1RXIF = 0;
}

Ahora bien, el problema que tengo es que al enviarle datos al Módulo manualmente, es decir, escribo en la pantalla del Hercules por ejemplo A T + C S Q (presiono enter), el módulo me responde, pero los Datos los recibo incompletos, véase:
Citar
at+csq{0D}{0D}+S:2,9{0A}{0A}K{0A} cuando en realidad la pregunta/respuesta deberia ser: at+csq{0D}{0D}{0A}+CSQ: 13,0{0D}{0A}{0D}{0A}OK{0D}{0A}

Por otro lado, al mandar el comando completo sin escribirlo "manualmente", el módulo no responde sencillamente, es como si los datos se perdieran y no le llegaran completos o no sé en realidad.

El FCY es 16 000 000UL, el  BaudRate que estoy empleado es 115200, velocidad con la que funciona el módulo, y la manera como configuro los UART son:

Código: [Seleccionar]
void InitUART2(){
    U2MODE = 0X8008;
    U2BRG = ((FCY/BRG_DIV)/BaudRate)-1;
    U2STA = 0x0000;
    IFS1bits.U2TXIF = 0; // Limpia la interrupcion de TX
    IEC1bits.U2TXIE = 0; // Habilita la interrupcion de TX
    IFS1bits.U2RXIF = 0; // Limpia la interrupcion de RX
    IEC1bits.U2RXIE = 1; // Habilita la interrupcion de RX
    IPC7bits.U2RXIP = 7; // Habilita la prioridad 2 de RX
    U2MODEbits.WAKE = 1;        // Habilita para despertar al puerto
    U2MODEbits.UARTEN = 1; // Habilita el puerto
    U2STAbits.UTXEN = 1; // Habilita la transmision
}

/********************************
*  Configuracion del UART 1 *
********************************/
void InitUART1(){
    //U1MODE = 0x0808;
    U1MODE = 0X8008;

    U1BRG = ((FCY/BRG_DIV)/BaudRate)-1;
    U1STA = 0x0000;;
    IFS0bits.U1TXIF = 0; // Limpia la interrupcion de TX
    IEC0bits.U1TXIE = 0; // Habilita la interrupcion de TX
    IFS0bits.U1RXIF = 0; // Limpia la interrupcion de RX
    IEC0bits.U1RXIE = 1; // Habilita la interrupcion de RX
    IPC2bits.U1RXIP = 7; // Habilita la prioridad 2 de RX
    U1MODEbits.WAKE = 1; // Habilita para despertar al puerto
    U1MODEbits.UARTEN = 1; // Habilita el puerto
    U1STAbits.UTXEN = 1; // Habilita la transmision
}

 A este punto ya no sé que hacer, asi que por favor amigos les agradezco que me ayuden con esto, Gracias!!!!!!!!!!!!!!  :-/

Desconectado Rikr09

  • PIC16
  • ***
  • Mensajes: 112
Re: Problema UART PIC24 - SIM5320
« Respuesta #1 en: 09 de Abril de 2013, 11:38:08 »
Bueno amigos, segui intentando resolver mi problema y di con el resultado afortunadamente  :-) ... Lo q hice fue ir directamente a las funciones con que transmito los Byte y espero por el Registro UTXBF:Transmit Buffer Full Status bit , y una vez esta lleno, ahi si pase a transmitir el dato, asi:

Código: [Seleccionar]
/************************
*   Salida del UART2 *
************************/

void U2( unsigned char s ){
    while( U2STAbits.UTXBF);
    U2TXREG = s;
}

/************************
*   Salida del UART1 *
************************/
void U1( unsigned char s ){
    while( U1STAbits.UTXBF);
    U1TXREG = s;
}

 Y listo asunto solucionado!

Desconectado Rikr09

  • PIC16
  • ***
  • Mensajes: 112
Re: Problema UART PIC24 - SIM5320
« Respuesta #2 en: 11 de Abril de 2013, 17:16:27 »
Bueno, ahora tengo otro problema...

Luego de hacer las pruebas pertinentes teniendo todo mi sistema SIM5320 <--> PIC24FJ126GA310 en modo transparente; surgió la necesidad de poder recibir las tramas de COMANDOS AT que me envia dicho módulo para luego interpretarlas (cosa que nisiquiera he pensado aún, por ahora me ahorro ese dolor de cabeza). He implementado lo que sigue; pero nrecibo las tramas incompletas, es decir, no llega la última letra del ECO que me envía el módulo como respuesta, por ejemplo: la trama de respuesta deberia ser {0D}{0A}START{0D}{0A y en vez de eso recibo {0D}{0A}STAR.. y hasta el momento no se me ocurre mas nada, la T{0D}{0A} me llegan con la siguiente trama.

Yo empleo un Timer para que una vez se desborde, habilite la bandera BAND_RXTX y se pueda leer lo que hay en el GPRS_Buff:

Código: [Seleccionar]
void __attribute__ ((interrupt, no_auto_psv)) _T1Interrupt(void){
    BAND_RXTX = 1;
    TMR1=0;_T1IE = 0;
    _T1IF = 0;
}

La interrupción del UART1:

Código: [Seleccionar]
void __attribute__((interrupt, no_auto_psv)) _U1RXInterrupt(void){
    BandUx = 1;
    TMR1 = 0;_T1IE = 1;
    Dato1 = GPRS_RXBUFF;
    GPRS_Buff[cont2++] = GPRS_RXBUFF;
    GPRS_RXIF = 0;
}

y aquí está el While principal:

Código: [Seleccionar]
while(1){

            if( BAND_RXTX == 1 ){
                    for( j=0; j<cont2; j++){
                        U2( GPRS_Buff[j]);
                    }BAND_RXTX = 0;cont2=0;
            }
           

        if( BandUx == 2 ){
            U1TxByte(Dato2);
            Dato2 = 0; BandUx = 0;
        }
}

Por favor, ayudenme con esto!! Gracias!

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Problema UART PIC24 - SIM5320
« Respuesta #3 en: 11 de Abril de 2013, 18:48:51 »
eso supongo te pasa por que el timer desborda y lee lo que hay en el bufer.

Te coloco el codigo de recepcion que estoy usando con un modulo sim900. No es la manera más optima de hacer la busqueda de comandos pero funciona bien.


Código: C
  1. void __attribute__((__interrupt__,auto_psv)) _U2RXInterrupt(void)
  2. {
  3. bufer_RX_U2[cont_bufer_RX_U2++] = U2RXREG;
  4. _U2RXIF = 0;
  5.  
  6. if(sms_presente == 1)   ///YA DETECTO AVISO DE LLEGADA DE SMS>>PROCEDO A LEER EL NUMERO DE CASILLA DEL SMS
  7.         {
  8.         if(bufer_RX_U2[cont_bufer_RX_U2-1]      != '\r')
  9.                 {
  10.                 sms_rec *= 10;
  11.                 sms_rec += bufer_RX_U2[cont_bufer_RX_U2-1]-48;
  12.                 }//
  13.         else    ///SE DETECTO CASILLA >> PROCEDO A LEER EL SMS
  14.                 {
  15.                 num_sms[cont_num_sms++] = sms_rec;
  16.                 sms_rec = 0;
  17.                 sms_sin_leer++;
  18.                 sms_presente = 2;   ///INDICA LA PRESENCIA DE UN SMS NUEVO
  19.                 }//
  20.         }//
  21.  
  22. if((bufer_RX_U2[cont_bufer_RX_U2-6]     == '\r')\
  23.         &&(bufer_RX_U2[cont_bufer_RX_U2-5]      == '\n')\
  24.         &&(bufer_RX_U2[cont_bufer_RX_U2-4]      == 'O')\
  25.         &&(bufer_RX_U2[cont_bufer_RX_U2-3]      == 'K')\
  26.         &&(bufer_RX_U2[cont_bufer_RX_U2-2]      == '\r')\
  27.         &&(bufer_RX_U2[cont_bufer_RX_U2-1]      == '\n'))
  28.                 {
  29.                 rpta_gprs = estado_RX_U2 = GPRS_OK;
  30.                 }//
  31.  
  32. else if((bufer_RX_U2[cont_bufer_RX_U2-9] == '\r')\
  33.         &&(bufer_RX_U2[cont_bufer_RX_U2-8] == '\n')\
  34.         &&(bufer_RX_U2[cont_bufer_RX_U2-7] == 'E')\
  35.         &&(bufer_RX_U2[cont_bufer_RX_U2-6] == 'R')\
  36.         &&(bufer_RX_U2[cont_bufer_RX_U2-5] == 'R')\
  37.         &&(bufer_RX_U2[cont_bufer_RX_U2-4] == 'O')\
  38.         &&(bufer_RX_U2[cont_bufer_RX_U2-3] == 'R')\
  39.         &&(bufer_RX_U2[cont_bufer_RX_U2-2] == '\r')\
  40.         &&(bufer_RX_U2[cont_bufer_RX_U2-1] == '\n'))
  41.                 {
  42.                 rpta_gprs = estado_RX_U2 = GPRS_ERROR;
  43.                 //cont_bufer_RX_U2 = 0;
  44.                 }//
  45.  
  46. else if((bufer_RX_U2[cont_bufer_RX_U2-12] == '+')\
  47.                 &&(bufer_RX_U2[cont_bufer_RX_U2-11] == 'C')\
  48.                 &&(bufer_RX_U2[cont_bufer_RX_U2-10] == 'M')\
  49.                 &&(bufer_RX_U2[cont_bufer_RX_U2-9] == 'T')\
  50.                 &&(bufer_RX_U2[cont_bufer_RX_U2-8] == 'I')\
  51.                 &&(bufer_RX_U2[cont_bufer_RX_U2-7] == ':')\
  52.                 &&(bufer_RX_U2[cont_bufer_RX_U2-6] == ' ')\
  53.                 &&(bufer_RX_U2[cont_bufer_RX_U2-5] == '"')\
  54.                 &&(bufer_RX_U2[cont_bufer_RX_U2-4] == 'S')\
  55.                 &&(bufer_RX_U2[cont_bufer_RX_U2-3] == 'M')\
  56.                 &&(bufer_RX_U2[cont_bufer_RX_U2-2] == '"')\
  57.                 &&(bufer_RX_U2[cont_bufer_RX_U2-1] == ','))
  58.                         {
  59.                         sms_presente = 1;
  60.                         }//
  61. }//

espero te sirva.

A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado Rikr09

  • PIC16
  • ***
  • Mensajes: 112
Re: Problema UART PIC24 - SIM5320
« Respuesta #4 en: 11 de Abril de 2013, 19:23:59 »
eso supongo te pasa por que el timer desborda y lee lo que hay en el bufer.

Te coloco el codigo de recepcion que estoy usando con un modulo sim900. No es la manera más optima de hacer la busqueda de comandos pero funciona bien.


Código: C
  1. void __attribute__((__interrupt__,auto_psv)) _U2RXInterrupt(void)
  2. {
  3. bufer_RX_U2[cont_bufer_RX_U2++] = U2RXREG;
  4. _U2RXIF = 0;
  5.  
  6. if(sms_presente == 1)   ///YA DETECTO AVISO DE LLEGADA DE SMS>>PROCEDO A LEER EL NUMERO DE CASILLA DEL SMS
  7.         {
  8.         if(bufer_RX_U2[cont_bufer_RX_U2-1]      != '\r')
  9.                 {
  10.                 sms_rec *= 10;
  11.                 sms_rec += bufer_RX_U2[cont_bufer_RX_U2-1]-48;
  12.                 }//
  13.         else    ///SE DETECTO CASILLA >> PROCEDO A LEER EL SMS
  14.                 {
  15.                 num_sms[cont_num_sms++] = sms_rec;
  16.                 sms_rec = 0;
  17.                 sms_sin_leer++;
  18.                 sms_presente = 2;   ///INDICA LA PRESENCIA DE UN SMS NUEVO
  19.                 }//
  20.         }//
  21.  
  22. if((bufer_RX_U2[cont_bufer_RX_U2-6]     == '\r')\
  23.         &&(bufer_RX_U2[cont_bufer_RX_U2-5]      == '\n')\
  24.         &&(bufer_RX_U2[cont_bufer_RX_U2-4]      == 'O')\
  25.         &&(bufer_RX_U2[cont_bufer_RX_U2-3]      == 'K')\
  26.         &&(bufer_RX_U2[cont_bufer_RX_U2-2]      == '\r')\
  27.         &&(bufer_RX_U2[cont_bufer_RX_U2-1]      == '\n'))
  28.                 {
  29.                 rpta_gprs = estado_RX_U2 = GPRS_OK;
  30.                 }//
  31.  
  32. else if((bufer_RX_U2[cont_bufer_RX_U2-9] == '\r')\
  33.         &&(bufer_RX_U2[cont_bufer_RX_U2-8] == '\n')\
  34.         &&(bufer_RX_U2[cont_bufer_RX_U2-7] == 'E')\
  35.         &&(bufer_RX_U2[cont_bufer_RX_U2-6] == 'R')\
  36.         &&(bufer_RX_U2[cont_bufer_RX_U2-5] == 'R')\
  37.         &&(bufer_RX_U2[cont_bufer_RX_U2-4] == 'O')\
  38.         &&(bufer_RX_U2[cont_bufer_RX_U2-3] == 'R')\
  39.         &&(bufer_RX_U2[cont_bufer_RX_U2-2] == '\r')\
  40.         &&(bufer_RX_U2[cont_bufer_RX_U2-1] == '\n'))
  41.                 {
  42.                 rpta_gprs = estado_RX_U2 = GPRS_ERROR;
  43.                 //cont_bufer_RX_U2 = 0;
  44.                 }//
  45.  
  46. else if((bufer_RX_U2[cont_bufer_RX_U2-12] == '+')\
  47.                 &&(bufer_RX_U2[cont_bufer_RX_U2-11] == 'C')\
  48.                 &&(bufer_RX_U2[cont_bufer_RX_U2-10] == 'M')\
  49.                 &&(bufer_RX_U2[cont_bufer_RX_U2-9] == 'T')\
  50.                 &&(bufer_RX_U2[cont_bufer_RX_U2-8] == 'I')\
  51.                 &&(bufer_RX_U2[cont_bufer_RX_U2-7] == ':')\
  52.                 &&(bufer_RX_U2[cont_bufer_RX_U2-6] == ' ')\
  53.                 &&(bufer_RX_U2[cont_bufer_RX_U2-5] == '"')\
  54.                 &&(bufer_RX_U2[cont_bufer_RX_U2-4] == 'S')\
  55.                 &&(bufer_RX_U2[cont_bufer_RX_U2-3] == 'M')\
  56.                 &&(bufer_RX_U2[cont_bufer_RX_U2-2] == '"')\
  57.                 &&(bufer_RX_U2[cont_bufer_RX_U2-1] == ','))
  58.                         {
  59.                         sms_presente = 1;
  60.                         }//
  61. }//

espero te sirva.


Listo Kallitos Gracias!! No lo he detalladado a fondo, pero según loq vi por encima, habria que seguir agregando casos para cada uno de los posibles comandos que me podria responder el modulo cierto?


 

anything