Прерывание RBIE работает только один раз — PIC16F877A

В моем коде есть два прерывания, одно происходит из-за переполнения TMR0, а другое — при нажатии кнопки.

это код в MikroC:

int compt = 0;
int seconds = 10 ;
int enable = 0;

void interrupt(){

     if (INTCON.INTF) {
        PORTD = 9;
        enable = 1;
        seconds = 10;
        INTCON.INTF = 0;
     }

     if (INTCON.TMR0IF) {
        compt++;
        INTCON.TMR0IF  = 0;
        TMR0 = 0x06;
     }
}


void main() {

     TRISB = 0x01;
     PORTB = 0;

     PORTD = 0;
     TRISD = 0x00;


     INTCON = 0xB0;
     OPTION_REG = 0x44;
     TMR0 = 0x06;

     while(1){

        if (compt == 625){
           if (enable) seconds--;
           compt = 0;
        }

        if (seconds > 0 && enable == 1) {
           PORTD = seconds;
           PORTB.RB1 = 1;
        }  else {
            enable = 0;
            PORTB.RB1 = 0;
            PORTD = 0;
        }

     }

}

то, что я пытаюсь достичь с помощью своего кода, показано на следующем рисунке:

введите здесь описание изображения

Когда я нажимаю одну из кнопок, начинается обратный отсчет, и светодиод загорается до тех пор, пока обратный отсчет не закончится, и если пользователь нажал кнопку, когда обратный отсчет еще не достиг 0, он начнется сначала, пока обратный отсчет снова не достигнет 0, затем светодиод должен погаснуть.

С чем я тут столкнулся, так это с тем, что прерывание от RBIE срабатывает только один раз, при втором нажатии на кнопку ничего не происходит.

Я не уверен, имеет ли TMR0F какое-то отношение к этому или нет, пробовал много вещей, но не смог заставить его работать.

Я надеюсь, что вы могли видеть то, что я не заметил, и помочь мне.


person Steven May    schedule 20.01.2019    source источник
comment
при втором нажатии кнопки ничего не происходит не означает, что прерывание от RBIE срабатывает только один раз. Ваши глобальные переменные не volatile, поэтому ваш основной цикл не удосуживается их перезагрузить.   -  person user58697    schedule 21.01.2019
comment
@ user58697 сделал переменные нестабильными, ничего не происходит :/   -  person Steven May    schedule 21.01.2019
comment
что значит "ничего не происходит"? Вы проверили с помощью отладчика, если прерывание «запущено»?   -  person Mike    schedule 22.01.2019


Ответы (2)


Опубликованный код компилируется без предупреждений и ошибок с MikroC.

Код выполняется с использованием симулятора в MLPAB v8.92, и при использовании стимула симулятора для утверждения прерывания INT0 он каждый раз обрабатывается правильно.

Ваша принципиальная схема выглядит так, как будто она была создана с помощью Proteus, возможно, есть проблемы с работой этого симулятора.

Единственная подозрительная настройка, которую я могу найти, это то, что слабые подтяжки включены для PORTB, но на вашей принципиальной схеме есть подтяжка 10 кОм на выводе INT0 (RB0).

Я бы предложил установить бит 8 в OPTION_REG равным единице, чтобы отключить подтягивания PORTB.

Извините, мой ответ не является более определенным, но я не могу воспроизвести вашу проблему из размещенной информации.

Похоже, этот вопрос задавали и на StackExchange.

person Dan1138    schedule 21.01.2019

Вы включили внутренний слабый подтягивающий резистор, а также подключили подтягивающий резистор к контакту RB0, внешний резистор не нужен, также вам необходимо обеспечить некоторую задержку (около 300 мс) после нажатия кнопки.

person Mufaddal Darbar    schedule 30.06.2021