[ mnn @ 11.04.2020. 09:40 ] @
Imam problem da mi Eusart "zaglavi" nakon nekog vremena posle pojave interapta INT0. Nakon resetovanja uređaja opet sve radi neko vreme. Pokušao sam da u INT0 stavim rutinu za resetovanje Eusarta nakon nekoliko interapta. Problem se smanjio ali mi se opet dešava samo nakon dužeg perioda.
Od interapta koristim kao High INT0, Eusart RX i TMR1 a od Low interapta TMR6. Nemam nekog dužeg zadržavanja u interaptima osim ovog u low TMR6 koji mi poziva neku funkciju za obradu prijema sa Eusarta.
Tu mi još radi LCD sa I2C komunikacijom, nešto upisa u EEpromi i obradom sa ITN0 i TMR1.
[ goran_68 @ 12.04.2020. 12:46 ] @
Daj bar neki kod i koji ti je to PIC18F.
[ mnn @ 12.04.2020. 14:33 ] @
PIC18f47q10

Pretpostavljam da ne stigne da izčita RCREG te da setuje OERR. Fukcija koju generiše Kod konfigurator "ima" generisnau rutinu za resetovane Eusarta koja to "ne radi". Za probu sam reset Eusart-a prebacio u INT0 rutinu i nakon toga nisam primetio da zaglavljuje .

Code:
  void EUSART1_RxDataHandler(void){
   
    /*================================================================================================================================
     *                                                                  Moj kod
     ==================================================================================================================================*/

    kontrola.test = RC1REG; //  upis primljenog bjata
    flag.usart = 1; //  omogucava za u glavnoj rutini upisujemo registre primljenog bajta

    /*===================================================================================================================================
     ===================================================================================================================================*/    
    // use this default receive interrupt handler code
    eusart1RxBuffer[eusart1RxHead++] = RC1REG;
    if(sizeof(eusart1RxBuffer) <= eusart1RxHead)
    {
        eusart1RxHead = 0;
    }
    eusart1RxCount++;
}

void EUSART1_DefaultFramingErrorHandler(void){}

void EUSART1_DefaultOverrunErrorHandler(void){
    // EUSART1 error - restart

    RC1STAbits.CREN = 0;
    RC1STAbits.CREN = 1;

}

Code:
  

void __interrupt() INTERRUPT_InterruptManagerHigh(void) {
    // interrupt handler
    if (PIE0bits.INT0IE == 1 && PIR0bits.INT0IF == 1) // INT0
    {
        //********************** moj kod ********************************************************
        flag.p = 1; //  
        brojac_pu++;
        brojac_po++;
        brojac_tt++;
        pom++;
        if (pom >= 3) {// citamo tek kad se desi n interapta
            total_timer_TMR1 = TMR1_ReadTimer(); /*  citamo stanje tajmera   */
            TMR1_WriteTimer(0); /*  nakon citanja vracamo ga na nulu    */
            pom_brojac_int = broj_interapata_TMR1; //  
            broj_interapata_TMR1 = 0;
            pom = 0;
        }        
        if (RC1STAbits.OERR) {        //    naknadno ubačeno 
            RC1STAbits.CREN = 0;
            RC1STAbits.CREN = 1;
        }
        //*******************************************************************************************
        INT0_ISR();
}

[ goran_68 @ 13.04.2020. 08:37 ] @
Ako koristiš njegov interni oscilator mogle bi da ti se pojave framing greške jer taj oscilator može da ima odstupanja od 5% (Imaš ovo u Errata).
Ovo sa OERR znači da ne stigne da pročita RCREG. Možeš li da smanjiš baud rate? Najverovatnije je da te zeza ovaj INT0. Ne vidim šta radiš u njegovoj obradi a za ovo rešenje sa brisanjem OERR nakon nekoliko INT0 smatram da nije dovoljno dobro.
Jednostavno prekidne rutina treba da se smanje što više i mislim da nećeš imati problema.
Prilikom pisanja u EEPROM treba da se isključe prekidi a podatak na EUSART može da dođe i tad tako da i tu možda bude problema.