Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 09.02.2018, 11:31   #1
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 43
Сообщений: 415
Вес репутации: 243/28
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию С18, проблема с USART2 (сбрасывается бит INTCONbits.PEIE )

Добрый день.
pic18f25k80, C18

Прошло 4 года и понадобилось мне использовать прерывания по UART...
Ранее программа работала без них и все было хорошо, используя оба USART.
Недавно попытался переделать прием USART2 на прерывание, написал код, но вылезла такая проблема: первый раз прерывание вызывается, но после этого портится регистр INTCON, был 0xC0, становится 0x82, т.е. снимается флаг разрешения прерываний переферии
PEIE/GIEL: Peripheral Interrupt Enable bit

теперь я не могу догнать в чем причина... подозреваю штатные функции моудуля usart но мне доступны только h файлы...
но что интересно - пока я общаюсь с процем по USART1 (который написан без прерываний) - все хорошо. как только появляется один байт на линии USART2, срабатывает прерывание (я вставил туда загорание светодиода на 500 мс) - все, после этого прерывания USART2 больше не работает (сбрасывается бит INTCONbits.PEIE ), а USART1 как работал, так и работает....
не могу понять кто снимает этот флаг (бит 6) в регистре INTCON.


Код:
// чтобы не мудрить, пока отправляю все прерывания в один обработчик
// СМЕЩЕНИЕ 0x0A00 из-за бутлоадера.
// Low priority interrupt vector
#pragma code low_vector=0x0A18
void low_interrupt () {     _asm goto InterruptHandler _endasm }
 #pragma code
// High priority interrupt vector
#pragma code high_vector=0x0A08
void high_interrupt () {   _asm goto InterruptHandler _endasm }
#pragma code

void InterruptHandler  (void) {

    if (PIR3bits.RC2IF == 1) {
        LEDS_ALL_STATE_ON();
        PIR3bits.RC2IF = 0;
        FSR0 = (int) packet + packet_cnt;
        POSTINC0 = RCREG2;
        INDF0 = 0;  // зануляю след символ буфера
        packet_cnt++;
        packet_need_check = 1;
        DelayMS(255);
        DelayMS(255);
        LEDS_ALL_STATE_OFF();

    }

} // low_isr END


void init(void) {

    TRISA = 0xFF;
    // выход это 0, вход 1
    TRISB = 0x80 + 0x08 + 0x04; // Входы только RB7(RX2), RB3 RB2
    TRISC = 0xFF - 0x40; // RC6 -> USART1.TX

    // Делаю цифровыми RB0/AN10, RB1/AN8, RB4/AN9, чтобы корректно читать их состояние
    ANCON1 &= 0xF8; // -4-2-1

    // ADC
    ADCON1 = 0b00010000; //VSS,VDD ref. AN0 analog only
    ADCON0 = 0x00; //clear ADCON0 to select channel 0 (AN0)
    ADCON2 = 0b00001000; //ADCON2 setup: Left justified, Tacq=2Tad, Tad=2*Tosc (or Fosc/2)


    UART_TX = 0;
    OBD2_TX = 0;

    LEDS_ALL_STATE_OFF();

    Open1USART(USART_TX_INT_OFF & USART_RX_INT_OFF &
            USART_ASYNCH_MODE & USART_EIGHT_BIT &
            USART_CONT_RX & USART_BRGH_HIGH, 25); //38400=25+1 если BAUD_16_BIT_RATE иначе 9600=25+1
    //    baud1USART( BAUD_16_BIT_RATE );
    //  т.к. baud1USART( BAUD_16_BIT_RATE ) не отрабатывает как надо, то принудительно
    //  бит выставляю по даташиту
    BAUDCON1 |= 8; // BRG16


    // OBD2 скорость 10400
    Open2USART ( USART_TX_INT_OFF & 
            USART_ASYNCH_MODE & USART_EIGHT_BIT &
            USART_CONT_RX & USART_BRGH_HIGH, 23);  // 10400=23+1


/* Настройки прерываний */
    INTCONbits.PEIE = 1;            // Периферийные прерывания разрешены
    INTCONbits.GIE  = 1;            // Глобальные прерывания разрешены
    RCONbits.IPEN   = 1;            // Разрешить двуприоритетные прерывания

    INTCONbits.INT0IF = 0;  // запрет прерывания INT0
    PIE3bits.RC2IE   = 1;  // Включить прерывание (interrupt) USART2 RX
    IPR3bits.RC2IP   = 0;  // Установить низкий приоритет для прерывания USART2 RX

    TimerInit();

    query_cnt = 0;
    packet_cnt = 0;
    packet_need_check = 0;

    ClearBuffer(query, sizeof (query));

    ECU_Reset();
    ClearBuffer(buffer, sizeof (buffer));

    OBD_ECU_ADDR = 0x33;
    OBD2_scanner = 0xF1;
    OBD2_ecu = 0x10; // кем прикидывается при работе "как ELM327"

}
__________________
STM32F042
PIC18F25k80

Последний раз редактировалось hfmscan; 09.02.2018 в 11:38.
hfmscan вне форума   Ответить с цитированием
Старый 09.02.2018, 12:17   #2
yeskela
Senior Member
 
Аватар для yeskela
 
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 36
Сообщений: 1,140
Вес репутации: 3762/81
yeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond repute
По умолчанию Re: С18, проблема с USART2 (сбрасывается бит INTCONbits.PEIE )

Цитата:
Сообщение от hfmscan Посмотреть сообщение
портится регистр INTCON, был 0xC0, становится 0x82, т.е. снимается флаг разрешения прерываний переферии
PEIE/GIEL: Peripheral Interrupt Enable bit

Код:
// чтобы не мудрить, пока отправляю все прерывания в один обработчик
// СМЕЩЕНИЕ 0x0A00 из-за бутлоадера.
// Low priority interrupt vector
#pragma code low_vector=0x0A18
void low_interrupt () {     _asm goto InterruptHandler _endasm }
 #pragma code
// High priority interrupt vector
#pragma code high_vector=0x0A08
void high_interrupt () {   _asm goto InterruptHandler _endasm }
#pragma code

#pragma interrupt InterruptHandler //или #pragma interruptlow InterruptHandler 
void InterruptHandler  (void) {
    //ISR code
}

} // low_isr END
Флаг сбрасывается аппаратно, а восстанавливается при выходе из обработчика по RETFIE. А чтобы компилятор понял, что функция InterruptHandler - обработчик прерывания, и нужно из неё выходить по RETFIE вместо RET, нужно явно это указать при помощи pragma
__________________
Отсутствие доступа в интернет с рабочего места очень замедляет работу. Наличие - полностью парализует её.

Последний раз редактировалось yeskela; 09.02.2018 в 12:35. Причина: Поправил pragma.
yeskela вне форума   Ответить с цитированием
Старый 09.02.2018, 12:18   #3
smart_pic
Senior Member
 
Регистрация: 08.12.2008
Адрес: Ставрополь
Возраст: 54
Сообщений: 990
Вес репутации: 2239/68
smart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond repute
Отправить сообщение для smart_pic с помощью Skype™
По умолчанию Re: С18, проблема с USART2 (сбрасывается бит INTCONbits.PEIE )

Написать свою функцию инициализации UART.
там несколько строк кода.
smart_pic вне форума   Ответить с цитированием
Старый 09.02.2018, 12:40   #4
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 43
Сообщений: 415
Вес репутации: 243/28
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию Re: С18, проблема с USART2 (сбрасывается бит INTCONbits.PEIE )

Цитата:
Сообщение от yeskela Посмотреть сообщение
Флаг сбрасывается аппаратно, а восстанавливается при выходе из обработчика по RETFIE. А чтобы компилятор понял, что функция InterruptHandler - обработчик прерывания, и нужно из неё выходить по RETFIE вместо RET, нужно явно это указать при помощи pragma
Вот спасибо. Задышало! теперь другие глюки полез искать.

Кстати, есть еще один большой вопрос с этими прерываниями.
Помню что УАРТ держит 2 принятых байта в буфере, и 3-ий в это время может приниматься... так вот, если у меня в некий момент времени идет запрет прырываний, потом я включаю обработку (но в этот момент в буфере уже 2 байта лежат), то я же сбросив флаг прерывания и считав один байт - потеряю второй из буфера...
как тут быть?

Цитата:
Сообщение от smart_pic Посмотреть сообщение
Написать свою функцию инициализации UART.
там несколько строк кода.
да, и это будет, но чуток позже
__________________
STM32F042
PIC18F25k80
hfmscan вне форума   Ответить с цитированием
Старый 09.02.2018, 12:51   #5
tsb58
Senior Member
 
Аватар для tsb58
 
Регистрация: 04.11.2008
Адрес: Харьков
Сообщений: 362
Вес репутации: 1041/50
tsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud of
По умолчанию Re: С18, проблема с USART2 (сбрасывается бит INTCONbits.PEIE )

Цитата:
Сообщение от hfmscan Посмотреть сообщение
... я же сбросив флаг прерывания и считав один байт - потеряю второй из буфера...
Флаг прерывания PIR3bits.RC2IF не сбрасывается программно. Он сбрасывается аппаратно, после чтения данных из буфера УАРТа.
Миниатюры
PIR3_RC2IF.png  
tsb58 вне форума   Ответить с цитированием
Старый 09.02.2018, 13:00   #6
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 43
Сообщений: 415
Вес репутации: 243/28
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию Re: С18, проблема с USART2 (сбрасывается бит INTCONbits.PEIE )

Цитата:
Сообщение от tsb58 Посмотреть сообщение
Флаг прерывания PIR3bits.RC2IF не сбрасывается программно. Он сбрасывается аппаратно, после чтения данных из буфера УАРТа.
Спасибо!
Значит, я обработчик пишу так:

Код:
void InterruptHandler  (void) {

    while (PIR3bits.RC2IF == 1) {
        FSR0 = (int) packet + packet_cnt;
        POSTINC0 = RCREG2;
        INDF0 = 0;  
        packet_cnt++;
        packet_need_check = 1;

    }

} // low_isr END
__________________
STM32F042
PIC18F25k80
hfmscan вне форума   Ответить с цитированием
Старый 09.02.2018, 13:02   #7
tsb58
Senior Member
 
Аватар для tsb58
 
Регистрация: 04.11.2008
Адрес: Харьков
Сообщений: 362
Вес репутации: 1041/50
tsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud of
По умолчанию Re: С18, проблема с USART2 (сбрасывается бит INTCONbits.PEIE )

Если буфер УАРТа имеет несколько байт (FIFO), то в обработчике нужно организовать цикл чтения нескольких байт из RCREG, пока флаг RCIF не станет равным нулю. Но перед этим нужно проверить еще бит "переполнения" буфера OERR.
tsb58 вне форума   Ответить с цитированием
Старый 09.02.2018, 13:46   #8
tsb58
Senior Member
 
Аватар для tsb58
 
Регистрация: 04.11.2008
Адрес: Харьков
Сообщений: 362
Вес репутации: 1041/50
tsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud of
По умолчанию Re: С18, проблема с USART2 (сбрасывается бит INTCONbits.PEIE )

Цитата:
Сообщение от hfmscan Посмотреть сообщение
снимается флаг разрешения прерываний переферии PEIE/GIEL: Peripheral Interrupt Enable bit
Чтобы правильно понять, почему так происходило, нужно посмотреть в описание этого бита в документации. Дело в том, что при разрешении приоритетов прерываний (как сделано у Вас), этот бит меняет свою функциональность с Peripheral Interrupt Enable bit (PEIE) на Low-priority peripheral interrupts bit (GIEL).
Миниатюры
INTCON_PEIE-GIEL.png  
tsb58 вне форума   Ответить с цитированием
Старый 09.02.2018, 13:56   #9
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 43
Сообщений: 415
Вес репутации: 243/28
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию Re: С18, проблема с USART2 (сбрасывается бит INTCONbits.PEIE )

т.е. из-за моей инициализации , этот флаг работает как GIEL и при возникновении прерывания низкого уровня, контроллер ставит запрет их, и вызывает обработчик, а так как он не знал что моя функция это и есть обработчик прерывания низкого уровня и не восстанавливал состояние регистров после обработки прерывания...

обработчик теперь выглядит так:

Код:
#pragma interrupt InterruptHandlerLow //или #pragma interrupt low_isr
void InterruptHandlerLow  (void) {

    static uchar flag;

    flag = RCSTA2 & 0x06;
    while ( PIR3bits.RC2IF ) {

//        PIR3bits.RC2IF = 0;
        FSR0 = (int) packet + packet_cnt;
        POSTINC0 = RCREG2;
        INDF0 = 0;  // зануляю след символ буфера
        // игнорирую лидирующие нули
        if (!((packet_cnt == 0)&&(packet[0] == 0)))
            packet_cnt++;
        packet_need_check = 1;
    }
    if ( flag ) {
        RCSTA2bits.CREN = 0;
        flag = 0; // тут нужно чем то занять один такт
        RCSTA2bits.CREN = 1;
        if (iUSART2ExErr < 0xFF) iUSART2ExErr++;
//        USART2_was_fault = 0xFF;
    }

} // low_isr END
__________________
STM32F042
PIC18F25k80
hfmscan вне форума   Ответить с цитированием
Старый 09.02.2018, 14:35   #10
tsb58
Senior Member
 
Аватар для tsb58
 
Регистрация: 04.11.2008
Адрес: Харьков
Сообщений: 362
Вес репутации: 1041/50
tsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud of
По умолчанию Re: С18, проблема с USART2 (сбрасывается бит INTCONbits.PEIE )

Ну, можно и так...
Но мне кажется, что не стоит использовать такою "зашифрованную" маску битов (RCSTA2 & 0x06). Почему бы прямо не написать, какие флаги проверяются. Например, вместо кода
Код:
flag = RCSTA2 & 0x06;
написать
Код:
if (RCSTA2bits.FERR || RCSTA2bits.OERR) flag =1;
tsb58 вне форума   Ответить с цитированием
Старый 09.02.2018, 14:41   #11
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 43
Сообщений: 415
Вес репутации: 243/28
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию Re: С18, проблема с USART2 (сбрасывается бит INTCONbits.PEIE )

не очень понимаю, чем плох мой вариант, вернее он просто менее читабелен чем ваш

я вот свой код посмотрел, у меня еще проверка на OERR и FERR стояла так же и в основном цикле программы (дополнительно), хотя по логике в любом случае должен выставлять флаг прерывания и оно должно сработать... но зачем-то я так делал, может глюк искал какой...

Спасибо!
__________________
STM32F042
PIC18F25k80
hfmscan вне форума   Ответить с цитированием
Старый 09.02.2018, 15:02   #12
tsb58
Senior Member
 
Аватар для tsb58
 
Регистрация: 04.11.2008
Адрес: Харьков
Сообщений: 362
Вес репутации: 1041/50
tsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud of
По умолчанию Re: С18, проблема с USART2 (сбрасывается бит INTCONbits.PEIE )

Цитата:
Сообщение от hfmscan Посмотреть сообщение
не очень понимаю, чем плох мой вариант, вернее он просто менее читабелен чем ваш
Так вот эта "читабельность" и важна. Вы ведь сами писали
Цитата:
Прошло 4 года и понадобилось мне использовать прерывания по UART...
К написанным ранее программам приходится периодически возвращаться. И хорошо, если в них все понятно и читабельно. А что скрывается за 0x06 - придется вспоминать или искать в документации.
Цитата:
Сообщение от hfmscan Посмотреть сообщение
я вот свой код посмотрел, у меня еще проверка на OERR и FERR стояла так же и в основном цикле программы (дополнительно), хотя по логике в любом случае должен выставлять флаг прерывания и оно должно сработать... но зачем-то я так делал, может глюк искал какой...
Я думаю, что признаки ошибок OERR и FERR нужно проверять там, где обрабатываются принятые данные, чтобы знать валидные (достоверные) эти данные или нет. А основному циклу программы нужно как то "сообщить", что произошел сбой в приеме данных.
tsb58 вне форума   Ответить с цитированием
Старый 13.02.2018, 09:09   #13
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 43
Сообщений: 415
Вес репутации: 243/28
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию Re: С18, проблема с USART2 (сбрасывается бит INTCONbits.PEIE )

Цитата:
Сообщение от tsb58 Посмотреть сообщение
в обработчике нужно организовать цикл чтения нескольких байт из RCREG, пока флаг RCIF не станет равным нулю. Но перед этим нужно проверить еще бит "переполнения" буфера OERR.
Здравствуйте,
я вот не понимаю до конца почему нужно флаги OERR и FERR читать до чтения байтов из буфера, а не потом?
ведь в моем коде эта ошибка может возникнуть в промежутке между flag и RCREG, и эту ситуацию я не обработаю...
Чем плохо проверять флаги и перезапускать USART после того как все выбрали из буфера?

Заранее благодарен, Михаил.
__________________
STM32F042
PIC18F25k80
hfmscan вне форума   Ответить с цитированием
Старый 13.02.2018, 15:49   #14
tsb58
Senior Member
 
Аватар для tsb58
 
Регистрация: 04.11.2008
Адрес: Харьков
Сообщений: 362
Вес репутации: 1041/50
tsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud of
По умолчанию Re: С18, проблема с USART2 (сбрасывается бит INTCONbits.PEIE )

В даташите на PIC18xxK80 описание флагов FERR и OERR довольно краткое. Я имел дело с PIC18xxK50, в даташите которого о них написано подробнее. Так про флаг FERR прямо говорится, что его нужно проверять перед чтением RCREG, так как он относится конкретно к каждому байту из буфера FIFO. Флаг OERR можно, теоретически, проверять и после чтения байта из RCREG. Но Вы же прочитанный байт сразу "ложите" в некий буфер принимаемого "пакета", а если бит OERR установлен - значит уже часть информации потеряна, придется "сбрасывать" UART (битом CREN или CPEN) и "браковать" уже принятую часть информации.
Кстати, получается, что неправильно запоминать биты FERR и OERR в локальную переменную перед входом в цикл чтения FIFO. Нужно проверять их внутри цикла.
Миниатюры
18FxxK50_FERR_OERR.png  
tsb58 вне форума   Ответить с цитированием
Старый 13.02.2018, 20:54   #15
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 43
Сообщений: 415
Вес репутации: 243/28
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию Re: С18, проблема с USART2 (сбрасывается бит INTCONbits.PEIE )

Спасибо, буду изучать текст (английским плохо владею),но основную суть понял что FERR проверяем перед чтением каждого байта и бракуем байт если бит установлен, а OERR проверю после чтения всех байт и если он установлен то тоже все бракую и перезапускаю USART
__________________
STM32F042
PIC18F25k80
hfmscan вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прошу помощи при освоении Pic12f629 adenalaida Вопросы начинающих 154 12.02.2016 02:41
Проблема с программным кодом Yevgeniy_F Вопросы начинающих 212 01.08.2013 06:52
Имитатор DS18B20 Filya44 Вопросы начинающих 14 12.03.2012 17:39
Переделка asm кода ЖКИ с 8 бит на 4 бита Noelchuvak Продукция MICROCHIP 66 27.12.2011 21:46
MPLAB не находит c018i.o qwerty1 Продукция MICROCHIP 45 22.04.2011 12:14


Часовой пояс GMT +3, время: 05:57.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot