TODOPIC

Microcontroladores PIC => Pic32 => Mensaje iniciado por: boanerxe en 03 de Diciembre de 2012, 14:20:20

Título: No se ejecuta la Interrupcion al recibir por UART2
Publicado por: boanerxe en 03 de Diciembre de 2012, 14:20:20
Hola a todos,

Estoy tratando de adaptar las librerias que provee Microchip para una de sus placas de desarrollo (M2M) para comunicarse con un modulo GPRS y GPS de UBlox, pero para un micro PIC32MX440F512h.

El caso es que tengo un problema de lo mas tonto con la UART. Resulta que consigo transmitir un comando al modulo GPRS, y este envia una respuesta (lo he comprobado con un osciloscopio y con un "espia USB".

Sin embargo, esos datos enviados nunca llegan a estar disponibles en el micro (si justo despues de enviar de enviar ejecuto  while (!UARTReceivedDataIsAvailable(UART2)); se queda bloqueado ahi).

Y claro, obviamente la interrupcion no salta.

Como datos os pongo como inicializo la UART:

Código: [Seleccionar]
INTSetVectorPriority(INT_UART_2_VECTOR, INT_PRIORITY_LEVEL_5);
INTSetVectorSubPriority(INT_UART_2_VECTOR, INT_SUB_PRIORITY_LEVEL_1);
INTEnable(INT_U2RX, INT_ENABLED);

INTClearFlag(INT_SOURCE_UART_RX(UART2));
INTClearFlag(INT_SOURCE_UART_TX(UART2));

UARTConfigure(UART2 , UART_ENABLE_PINS_CTS_RTS | UART_RTS_WHEN_RX_NOT_FULL);

UARTSetDataRate(UART2 , p32GetPeripheralBusClock(), 19200);

UARTSetLineControl(UART2 , UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);

UARTSetFifoMode(UART2 , UART_INTERRUPT_ON_RX_NOT_EMPTY);

UARTEnable(UART2 , UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_TX | UART_RX));

Estoy usando MPLAB X .

Mis bits de configuracion:

Código: [Seleccionar]
#pragma config UPLLEN   = ON       
#pragma config UPLLIDIV = DIV_2     
#pragma config FPLLMUL  = MUL_16   
#pragma config FPLLIDIV = DIV_2     
#pragma config FPLLODIV = DIV_4     
#pragma config FPBDIV   = DIV_2     
#pragma config FWDTEN   = OFF     
#pragma config WDTPS    = PS2048   
#pragma config FCKSM    = CSECME
#pragma config OSCIOFNC = OFF   
#pragma config POSCMOD  = XT 
#pragma config IESO     = OFF   
#pragma config FSOSCEN  = ON     
#pragma config FNOSC    = PRIPLL   
#pragma config CP       = OFF     
#pragma config BWP      = OFF 
#pragma config PWP      = OFF   
#pragma config ICESEL   = ICS_PGx2 
#pragma config DEBUG    = OFF   

Alguna idea de que puede estar pasando???

Gracias!
Título: Re: No se ejecuta la Interrupcion al recibir por UART2
Publicado por: IngRandall en 04 de Enero de 2013, 11:03:46
Algo parecido que me paso a mi fue que el uart2 en realidad es el uart3, no tengo ni idea de por que, pero alli donde dice
Código: [Seleccionar]
UARTConfigure(UART2 , UART_ENABLE_PINS_CTS_RTS | UART_RTS_WHEN_RX_NOT_FULL); puedes presionar la tecla Ctrl+click sobre UART2 y te mostrara una lista como esta
Código: [Seleccionar]
#define UART2       UART3A
#define UART3       UART2A
#define UART4       UART1B
#define UART5       UART3B
#define UART6       UART2B

Muestra la interrupción de recepción del uart a ver si de pronto por allí esta el problema.

Código: [Seleccionar]
void configuracion_uart2(){
    UARTConfigure(UART2, UART_ENABLE_PINS_TX_RX_ONLY);
    UARTSetFifoMode(UART2, UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY);
    UARTSetLineControl(UART2, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
    UARTSetDataRate(UART2, GetPeripheralClock(), DESIRED_BAUDRATE);
    UARTEnable(UART2, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));

// Configure UART2 RX Interrupt
    INTEnable(INT_SOURCE_UART_RX(UART2), INT_ENABLED);
    INTSetVectorPriority(INT_VECTOR_UART(UART2), INT_PRIORITY_LEVEL_4);
    INTSetVectorSubPriority(INT_VECTOR_UART(UART2), INT_SUB_PRIORITY_LEVEL_0);
}

void __ISR(_UART2_VECTOR, ipl4) IntUart2Handler(void){//_UART2_VECTOR
    while ( !U2STAbits.URXDA); // wait for a new char to arrive

    Dato = U2RXREG;

    IFS1bits.U2RXIF = 0;
}