USART вылетает на PIC18F2550, что делать?

Я работаю в связке PIC18F4550 и ПК с парой xBEE S2C. И я использую xc8 для компиляции кода.

Я отправляю некоторые символы на PIC с ПК с помощью Xbee, затем отправляю «/ r», и PIC должен вернуть мне символы, которые я отправил. Работает 9 итераций, потом вылетает. На изображении показана
последовательная консоль (красные символы — это ответ PIC ).

Я пытался сбросить настройки EUSART, но это, похоже, не работает. Всегда терпит неудачу на 9-й итерации. Я читал некоторые сообщения OERR и пробовал много вещей, но ничто не решило мою проблему.

РЕДАКТИРОВАТЬ: *** ПРИМЕЧАНИЕ. Эта ошибка возникает, если интервал передачи пакета меньше 1500 мс. И мне нужно передавать по крайней мере каждые 300 мс.

У кого-то есть идеи, что это может быть? Спасибо

 #define _XTAL_FREQ 8000000
 volatile char bufferRx[60];
 volatile char bufferTx[60];
 volatile char dum;
 int RxFlag,ContRx, ContTx;

void interrupt isr()
{   
  if(RCSTAbits.OERR)
    {
      RCSTAbits.CREN = 0;
      RCSTAbits.CREN = 1;         
    }
x = RCREG;
if(x== 13)
  {    
   bufferRx[ContRx] = x;
   RxFlag=1;
  }
 else
 {
  bufferRx[ContRx] = x;
  }
 ContRx++;
 }
void main(void)
{
//////////////////////////////////////////////////////////////////
//CONFIGURACIONES

//OSCILLATOR
 OSCCONbits.IRCF= 0b111;
 OSCCONbits.SCS=0b10;
//PORTS    
 PORTB = 0;
 TRISB=1;
 TRISC=0b10000000;
//INTERRUPTIONS
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
PIE1bits.RCIE=1;
PIE1bits.TXIE=0;
PIR1bits.RCIF=0;
//RCSTA  TXSTA
RCSTAbits.SPEN=1;
RCSTAbits.RX9=0;
RCSTAbits.CREN=1;
TXSTAbits.BRGH=0;
TXSTAbits.SYNC=0;
TXSTAbits.TXEN = 1;
TXSTAbits.TX9=0; 
//BAUDRATE BAUDCON
BAUDCONbits.ABDEN = 0;
BAUDCONbits.WUE = 0;
BAUDCONbits.TXCKP = 0;
BAUDCONbits.RXCKP = 0;
BAUDCONbits.BRG16=0;
SPBRG=51;
//////////////////////////////////////////////////////////////////
while(1)
{ 
    while(RCSTAbits.FERR)
    {
     dum = RCREG;       
    }
    if(RCSTAbits.OERR)
    {
      RCSTAbits.CREN = 0;
      RCSTAbits.CREN = 1;         
    }
    ContTx=0;
    if(RxFlag==1)
    {           
          for(int x=0;x<ContRx;x++)
          {
        bufferTx[x] = bufferRx[x];
        TXREG=bufferTx[x]; 
         while(TXSTAbits.TRMT==0);
         {          
         __delay_ms(1); 
              bufferTx[x]= 00;
              bufferRx[x]= 00;
         }             
        ContTx++;
          }  
          RxFlag=0;
          ContRx=0;  
    }        
}       
}

person D.Martinez    schedule 12.02.2018    source источник
comment
Задержка в 1 мс внутри обработчика прерывания — это катастрофа.   -  person Weather Vane    schedule 12.02.2018
comment
Другие задержки выглядят как fix-it. Примечание: вы должны проверять состояние передатчика перед отправкой, а не после. Кроме того, не делите буферы RX и TX, особенно когда RX прерывается: сделайте их отдельными буферами для одной цели.   -  person Weather Vane    schedule 12.02.2018
comment
спасибо, я удалил задержку на isr и разделил буферы rx и tx.   -  person D.Martinez    schedule 12.02.2018
comment
Не будет компилировать необъявленный ContRx.   -  person Martin James    schedule 12.02.2018
comment
Аналогичный «RxFlag»   -  person Martin James    schedule 12.02.2018
comment
спасибо, что указали на это, я отредактировал пост и забыл их поставить, теперь они объявлены.   -  person D.Martinez    schedule 12.02.2018


Ответы (1)


Вы нигде не используете ключевое слово «volatile», хотя вы изменяете некоторые глобальные переменные внутри ISR и используете их снаружи.

person hafeez    schedule 12.02.2018
comment
Спасибо за ответ, вы хотите добавить ключевое слово ко всем переменным, которые изменены в isr? volatile int ContRx,ContTx,RxFlag; изменчивый символ x; изменчивый буфер символов[60]; летучий уголь; - person D.Martinez; 12.02.2018
comment
Добавления для ContRx и RxFlag должно быть достаточно. Поскольку это те, которые изменяются внутри ISR, а затем на основе значения RxFlag решение об ответе принимается в основной функции. Я подозреваю, что что-то происходит с RxFlag на 9-й итерации, и ответ не отправляется. - person hafeez; 12.02.2018
comment
Я думаю, важно упомянуть, что эта проблема 9-й итерации возникает, если интервал передачи пакета, который я отправляю с ПК, меньше 1500 мс. Но мне нужно передавать по крайней мере каждые 300 мс. - person D.Martinez; 13.02.2018