Forum: Mikrocontroller und Digitale Elektronik PIC32MX795F512L UART Receive


von Siegfried S. (Firma: Privat) (schnuremaus)


Angehängte Dateien:

Lesenswert?

Hallo,

PIC32MX795F512L
MPLAB 8.92
C32 Compiler

Habe zu dem µC vier UART Verbindungen.
Alle arbeiten mit 512.000 Baud.
Receive und Transmit sind Interrupt gesteuert.
VectorPriority = 2  und VectorSubPriority = 0

Problem:
Wenn auf dem ersten UART Daten reinkommen, und fast Zeitgleich auch auf 
dem zweiten, wird für diese Zeit die eingehende Daten vom ersten UART 
ignoriert.

Ist das so richtig?

siehe Anhang.

Schöne Zeit

von Jim M. (turboj)


Lesenswert?

Siegfried S. schrieb:
> Ist das so richtig?

Ja, vermutlich weil Dein Programm es so will. Mehr können wir Dir nur 
nach Einblick in den Source Code sagen.

Sowas passiert gerne wenn der Interrupt Handler zu "lang" ist.

von Siegfried S. (Firma: Privat) (schnuremaus)


Lesenswert?

gerne.

1
void __ISR(_UART_3_VECTOR, ipl2) IntUART3Handler(void)
2
{
3
BYTE RxData;
4
5
// Receive
6
    if ( (U3STAbits.OERR == 0) && (U3STAbits.PERR == 0) && (U3STAbits.FERR == 0) )
7
    {
8
9
      if ( (IEC1bits.U3RXIE == 1) && (IFS1bits.U3RXIF == 1) )
10
      {
11
      RxData = (BYTE)U3RXREG;
12
      IFS1bits.U3RXIF = 0;
13
TP_uC5_23 = 1;
14
      UartTickCnt[UART_INDEX_3] = 0;
15
      TickIsrStatus &=~ ISR_BIT_UART_03;
16
        if (RX_Cnt[UART_INDEX_3] < RS485_RX_BYTE_BUFFERSIZE_CH3)
17
        {
18
        UartRxBuffer_CH3.byte.mem[RX_Cnt[UART_INDEX_3]++] = RxData;
19
        TickISR |= ISR_BIT_UART_03;
20
         }
21
TP_uC5_23 = 0;
22
      }
23
24
     }
25
     else
26
     {
27
        if (U3STAbits.OERR == 1)
28
        {
29
TP_uC5_22 ^= 1;
30
         }
31
        if (U3STAbits.PERR == 1)
32
        {
33
         }
34
        if (U3STAbits.FERR == 1)
35
        {
36
         }
37
    RX_Error[UART_INDEX_3][RECEIVE_ERROR_ISR_UART]++;
38
    UART_RX_DATA[UART_INDEX_3] = (BYTE)U3RXREG;
39
    UartTickCnt[UART_INDEX_3] = 0;
40
    TickISR &=~ ISR_BIT_UART_03;
41
    TickIsrStatus &=~ ISR_BIT_UART_03;
42
    RX_Cnt[UART_INDEX_3] = 0;
43
    U3STAbits.OERR = 0;  
44
    U3STAbits.PERR = 0;  
45
    U3STAbits.FERR = 0;
46
    IFS1bits.U3RXIF = 0;
47
      }
48
49
}

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.