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

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

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

Ответ
 
Опции темы Опции просмотра
Старый 09.02.2018, 11:31   #1
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 43
Сообщений: 415
Вес репутации: 243/26
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
Адрес: Новочеркасск
Возраст: 35
Сообщений: 1,139
Вес репутации: 3762/79
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
Сообщений: 977
Вес репутации: 2077/64
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/26
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
Адрес: Харьков
Сообщений: 359
Вес репутации: 992/48
tsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to behold
По умолчанию 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/26
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
Адрес: Харьков
Сообщений: 359
Вес репутации: 992/48
tsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to behold
По умолчанию Re: С18, проблема с USART2 (сбрасывается бит INTCONbits.PEIE )

Если буфер УАРТа имеет несколько байт (FIFO), то в обработчике нужно организовать цикл чтения нескольких байт из RCREG, пока флаг RCIF не станет равным нулю. Но перед этим нужно проверить еще бит "переполнения" буфера OERR.
tsb58 вне форума   Ответить с цитированием
Старый 09.02.2018, 13:46   #8
tsb58
Senior Member
 
Аватар для tsb58
 
Регистрация: 04.11.2008
Адрес: Харьков
Сообщений: 359
Вес репутации: 992/48
tsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to behold
По умолчанию 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/26
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
Адрес: Харьков
Сообщений: 359
Вес репутации: 992/48
tsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to behold
По умолчанию 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/26
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
Адрес: Харьков
Сообщений: 359
Вес репутации: 992/48
tsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to behold
По умолчанию 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/26
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
Адрес: Харьков
Сообщений: 359
Вес репутации: 992/48
tsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to behold
По умолчанию 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/26
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, время: 15:51.


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