Ir ao conteúdo

PIC32 - Problema nas uart's 5 e 6


luckkaz

Posts recomendados

Postado

Ola

Estou usando o PIC32mx795f512L, sendo que estou querendo configurar e fazer funcionar todas as uarts ao mesmo tempo (com interrupções). Porém, apenas consigo fazer funcionar ao mesmo tempo as uarts (1,2,3,4,5) ou (1,2,3,4,6), pois se junto a uart 5 com a 6, apenas a 6 funciona corretamente (as outras apenas transmitem e param de receber). Para testar o recebimento, estou enviando um caractere e faço um loopback (apenas pondo em curto os respectivos pinos do PIC) e então acendo um LED caso este seja recebido.

Abaixo colocarei a configuração da uart 6 , sendo que em todas as outra eu usei o mesmo padrão.

void inicio_uart_6(void)

{

UARTConfigure(UART6, UART_ENABLE_PINS_TX_RX_ONLY);

UARTSetFifoMode(UART6, UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY);

UARTSetLineControl(UART6, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);

UARTSetDataRate(UART6, GetPeripheralClock(), 10400);

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

// Configure UART6 RX Interrupt

INTEnable(INT_SOURCE_UART_RX(UART6), INT_ENABLED);

IPC12bits.U6IP = 2;

IPC12bits.U6IS = 0;

// configure for multi-vectored mode

INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);

// enable interrupts

INTEnableInterrupts();

}

Abaixo esta a ISR correspondente. Também segue o mesmo padrão para as outras.

void __ISR(50, ipl2) IntUart6Handler(void)

{

if(INTGetFlag(INT_SOURCE_UART_RX(UART6)))

{

INTClearFlag(INT_SOURCE_UART_RX(UART6));

pegar_6();

}

}

Abaixo as funções que eu utilizo para tratar os dados da uart. Também segue o mesmo padrão para as outras.

void enviar_6(void)

{

INTDisableInterrupts();

while(U6STAbits.UTXBF);

U6TXREG = manda; // Envia a variavel "manda"

INTEnableInterrupts();

}

void pegar_6 (void)

{

INTDisableInterrupts();

if(U6STA & 0x000E) // Erros recebidos?

{

U6STAbits.OERR = 0; // Limpa a flag de OERR para continuar recebendo

U6STAbits.FERR = 0;

U6STAbits.PERR = 0;

}

if(U6STAbits.URXDA)

{

recebe = U6RXREG; // Envia a variavel "recebe" pela serial

}

INTEnableInterrupts();

}

Desde já obrigado...

Postado

Lucas,achei interessante o material e ainda não lí o datasheet do PIC para ver algo,mas não consigo compilar aqui.

O MPLABA apresenta vários erros nas rotinas.

Se voce consegue a comunicação dos outros módulos UART,não poderia ser alguma restrição,voce procurou algo no Datasheet?

Postado

Acabei de achar o erro, era apenas um erro nas polarizações nos transistors nas saidas das uarts 5 e 6 (o problema foi que eu botava em curto os pinos TX e RX da uart porém por algum motivo eu não consegui receber o sinal mesmo desse jeito). Pra resolver apenas coloquei as saidas em dreno aberto e coloquei um pull up, dai começou a funcionar. :D

Mas obrigado por responder vtrx.

  • Coordenador
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...