Прерывание RBIE срабатывает только один раз - PIC16F877A - PullRequest
0 голосов
/ 20 января 2019

В моем коде у меня есть два прерывания, одно происходит из-за переполнения 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;
        }

     }

}

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

enter image description here

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

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

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

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

1 Ответ

0 голосов
/ 22 января 2019

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

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

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

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

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

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

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

...