Forum: Mikrocontroller und Digitale Elektronik PIC24 und Circular Buffer


von Savio (Gast)


Lesenswert?

Hello,
Weren dem TX mit UART 2 habe ich eine OERR bekommen. Ich habe die flags 
zuruck gesetzt. Aber nach die TX kommt eine RX Interrut getriggerd. Da 
sehe ich das ein paar chars sind immer verschoben. Ich denke es ist 
wegen die circular buffer zu tun im Uart RX Reg.

// DATA TRANSMISSION

void putstring_U2(Buffer * buf)
{
   char ch;
    int i = 0;
    U2STAbits.UTXEN = 1;
    disable_U2_RX();
    clear_U2_RX_BUF(U2_RX_BUF, sizeof(U2_RX_BUF));
    do
    {
      // transmit until CR or buffer empty
    if(i < buf->len)
      {
        ch = buf->data[i];
        // wait while Tx buffer full
        while ( IS_TRANSMIT_BUFFER_FULL_UART2());
      U2TXREG = (unsigned char)ch;
        i++;
    }
  }while(ch != CR);
  ch = U2RXREG;    // Reset the read buffer
  U2STAbits.OERR = 0;  // reset over run eror
  IFS4bits.U2ERIF = 0; // reset the flags
  enable_U2_RX();   // Enable reception
  dataReceived = false;
} // putChar_U2

// DATA RECEPTION


// wait for a new character to arrive to the UART2 serial port
char getChar_U2( void)
{
  while ( !IS_CHAR_READY_UART2());  // wait for a new character to 
arrive
  //U2_RTS = 1;
  IFS1bits.U2RXIF = 0;
  return U2RXREG;    // read the character from the receive buffer
}// getcharUART


void getstring_U2( char *u2s, int len)
{
  U2STAbits.UTXEN = 0;
  unsigned int cr_count = 0;
    do{
        *u2s = getChar_U2();       // wait for a new character
        if ( *u2s==0x0A)
        {cr_count++;}            // line feed, end loop
        if ( cr_count==2)
        {break;}
        u2s++;                // increment buffer pointer
        len--;
    } while ( len>1 );      // until buffer full
} // getstring_U2


void _attribute_ ((interrupt,no_auto_psv)) _U2RXInterrupt(void)
 {
    // disable further RX Interrupt
   // disable_U2_RX();
   // Check for over run error
     if( U2STAbits.OERR )           // if overrun, clear OERR flag
         U2STAbits.OERR = 0;        // according to datasheet paragraph 
16.5
  // Deal with the data here
   getstring_U2(U2_RX_BUF, sizeof(U2_RX_BUF));
   disable_U2_RX();
   dataReceived = true;  // Process the received data in Main
 }



Kann jemand mir helfen.. wie kann ich lessen.. genau wie es rein kommt 
im entsprechend array stelle..?! z.b.   U2_RX_BUF[0]  hatt immer die 
erste char was die U2RXREG bekommen hatt nach die interrupt !?

vielen dank
Savio

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.