Trabajo en un proyecto pero tengo un problema.
Quiero hacer un programa que conduzca los dos UART en un PIC, cada UART a una velocidad de transmisión diferente. La idea es tomar una señal para UART1 (9600 baudios) y enviarla a la salida UART 2 (1200 baudios). En el momento en que hago un código para conducir los dos UART.
Adjunto el código, y esto tiene comentarios en la prueba de eco, y los uart se ejecutan bien, cuando pongo los datos en uart 2, estos datos están bien en la salida a UART 1, pero, cuando quiero ingresar datos UART 1, para ver estos datos en la salida de uart 2, perdí muchos datos por diferentes velocidades de transmisión. Espero hacerme entender, mi problema es la pérdida de datos desde una velocidad de transmisión alta a una velocidad de transmisión baja, espero su opinión sobre cómo resolver esto.
#if defined (__PIC24F__)
#include <p24FJ64GB002.h>
#endif
#include "xc.h"
_CONFIG4(DSBOREN_OFF & DSWDTEN_OFF)
_CONFIG3(WPDIS_WPDIS)
_CONFIG2(POSCMOD_NONE & OSCIOFNC_OFF & FNOSC_FRC & PLL96MHZ_OFF )
_CONFIG1(FWDTEN_OFF & JTAGEN_OFF)
int c,D;
int main(void){
//OSCILLATOR CONFIG
OSCCON=0X0000; //
CLKDIVbits.RCDIV0=0; //clock divider to 0
//PIN CONFIG
AD1PCFGL=0XFFFF; //ALL PINS DIGITAL
TRISA = 0X0000; //PORT A OUTPUT
TRISB = 0XFFFF; //PORT B INPUT
RPOR2bits.RP5R=3; // RP5 TX UART1
RPOR3bits.RP6R=5; // RP6 TX UART2
RPINR18bits.U1RXR=0; //RP0 RX UART1
RPINR19bits.U2RXR=2; //RP1 RX UART2
//----------------------------------------------------------------------------
//UART CONFIG
U1BRG=103;
U2BRG=832;
U1MODEbits.UARTEN = 1; // UART Enable
U1MODEbits.USIDL = 1;// Stop in Idle Mode Bit
U1MODEbits.IREN = 0; // IrDA Encoder and Decoder Disabled
U1MODEbits.RTSMD = 1; // UxRTS in SIMPLEX mode
U1MODEbits.UEN = 00; // Tx and Rx pins are used,UxCTS,UxRTS, BCLK are controlled by port latch
U1MODEbits.WAKE = 0; // Wake up disabled on sleep mode
U1MODEbits.LPBACK = 0; // Loopback is disabled
U1MODEbits.ABAUD = 0; // Baud rate measurement is disabled
U1MODEbits.RXINV = 0; // Idle state is '1'
U1MODEbits.BRGH =1; // High baurdate selected
U1MODEbits.PDSEL = 00 ; // No parity, 8bits
U1MODEbits.STSEL = 0; // 1 Stop bit
U2MODEbits.UARTEN = 1; // UART Enable
U2MODEbits.USIDL = 1;// Stop in Idle Mode Bit
U2MODEbits.IREN = 0; // IrDA Encoder and Decoder Disabled
U2MODEbits.RTSMD = 1; // UxRTS in SIMPLEX mode
U2MODEbits.UEN = 00; // Tx and Rx pins are used,UxCTS,UxRTS, BCLK are controlled by port latch
U2MODEbits.WAKE = 0; // Wake up disabled on sleep mode
U2MODEbits.LPBACK = 0; // Loopback is disabled
U2MODEbits.ABAUD = 0; // Baud rate measurement is disabled
U2MODEbits.RXINV = 0; // Idle state is '1'
U2MODEbits.BRGH =1; // High baurdate selected
U2MODEbits.PDSEL = 00; // No parity, 8bits
U2MODEbits.STSEL = 0; // 1 Stop bit
//------------------------------------------------------------------
//CONFIGURACION DE TRANSMISION, RECEPCION E INTERRUPCIONES DE LAS UART
U1STAbits.UTXINV = 0; // UxTX idle state is '0'
U1STAbits.UTXBRK = 0; // Sync Break Disabled
U1STAbits.UTXEN = 1; // UART1 Transmitter is enabled
U1STAbits.URXISEL = 00; // Interrupt flag bit is set when a charater is received
IEC0bits.U1TXIE = 0; // Disable UART1 Tx interrupt
U2STAbits.UTXINV = 0; // UxTX idle state is '0'
U2STAbits.UTXBRK = 0; // Sync Break Disabled
U2STAbits.UTXEN = 1; // UART2 Transmitter is enabled
U2STAbits.URXISEL = 00; // Interrupt flag bit is set when a charater is received
IEC1bits.U2TXIE=0; // Disable UART2 Tx interrupt
while(1){
// //ECHO TEST UART 2 1200 BAUDS
// //wait for byte
// while(!U2STAbits.URXDA);
// c=U2RXREG;//get byte
// //wait for empty spot in transmit buffer
// while(U2STAbits.UTXBF == 1);
// //echo received character back
// U2TXREG = c;
//// //ECHO TEST UART 1 9600 BAUDS
// //wait for byte
// while(!U1STAbits.URXDA);
// D=U1RXREG;//get byte
// //wait for empty spot in transmit buffer
// while(U1STAbits.UTXBF == 1);
// //echo received character back
// U1TXREG = D;
//TEST TO PUT UT DATA FROM UART 2 1200 IN OUTPUT UART1 9600, ITS PART IS OK
while(!U2STAbits.URXDA);
D=U2RXREG;//get byte
//wait for empty spot in transmit buffer
while(U2STAbits.UTXBF == 1);
//echo received character back
U1TXREG = D;
}
return 0;
}