Struct por error de saturación y error de trama en USART PIC18F4550

1

Estoy intentando comunicar el PIC18F4550 con el módulo biomed. Soy muy nuevo para incrustar. Mi módulo envía un paquete de información de 5 bytes continuamente a 4800 baudios, 1 parada, paridad ODD.

He establecido mi velocidad en baudios perfectamente BRGH = 1, BRG16 = 1.

Mi principal es:

    void main()
{

    INTCON=0xC0;
    RCSTA=0x80;
    TXSTA=0x24;
    BAUDCON=0x08;
    PIE1bits.RCIE=1;
    IPR1bits.RCIP=1;
    SPBRGH=0x09;
    SPBRG=0xC3;
    RCSTAbits.CREN=1;
}

Mi ISR es:

    void uart_isr(void)
{
    if(PIR1bits.RCIF=1)

    for(i=0;i<32;i++)
        {
            PORTD=RCREG;
      if(RCSTAbits.OERR) 
        { PORTBbits.RB6=~PORTBbits.RB6;
          do{ 
            temp = RCREG; 
            temp = RCREG; 
            temp = RCREG; 
            RCSTAbits.CREN = 0; 
            RCSTAbits.CREN = 1; 
          }while(RCSTAbits.OERR); 
    } 

            PORTD=PORTD-32;
            buff[i]=PORTD;
            myMsDelay(15);

        }   

 }
}

Estoy recibiendo un montón de invasión. Por favor sugiera algún método para detener estos errores.

    
pregunta Harshal Dalal

1 respuesta

1

No estoy seguro de si esta es la totalidad de la causa raíz, pero definitivamente hay problemas en su código:

  

if (PIR1bits.RCIF = 1)

Ese es el error clásico de asignación vs comparación de operador. Estoy seguro de que quiso decir == en lugar de = .

  

myMsDelay (15);

Un retraso dentro de una rutina de interrupción es un gran no-no. Ya estás bloqueando el flujo de código regular desde que estás en el ISR. Ahora, está demorando 15ms dentro del ISR, lo que impide que se ejecute incluso el mismo ISR. Mi conjetura es que probablemente esa sea la razón por la que te estás excediendo. El código está girando en ese retraso mientras nuevos caracteres llegan al búfer. Pero su ISR no puede atenderlos porque está bloqueado en esa función de retardo.

    
respondido por el Dan Laks

Lea otras preguntas en las etiquetas