8051 два таймера и проблема прерываний в c - PullRequest
1 голос
/ 22 апреля 2020

Я хочу, чтобы два таймера работали одновременно, но, похоже, он вообще не работает

Я написал код для мигания светодиода.
Светодиод будет мигать, когда я использую один из таймеров. и прерывание, когда я использовал их оба, два порта для светодиодов не работают.

Было ли какое-либо правило, которое не может использовать два прерывания или таймера одновременно?
или просто мой mcu сломан?

кстати я использую кодирование AT89S52
с помощью keil uVision5
и программу с WLpro

Вот мой код

#include <reg52.h>

sbit LED = P0 ^ 5;
sbit LED2 = P0 ^ 6;
int i = 0;
int y = 0;
int x = 0;
int count = 0;

void blink2()
interrupt 3
{
  TH1=0x7d;
  TL1=0xec;
  y++;

  if(y==100) {
    if(i==1) {
      LED=0;
      x=0;
    }
    else {
      LED=1;
      x=1;
    }
    y=0;
  }
}

void blink1() 
interrupt 1
{
  TH0=0xd8;
  TL0=0xf0;
  count++;

  if(count==100) {
    if(i==1) {
      LED2=0;
      i=0;
    }
    else {
      LED2=1;
      i=1;
    }
    count=0;
  }
}

void main() {
  TMOD = 0x11;  // timer mode
  TH0 = 0xd8;
  TL0 = 0xf0;

  TH1 = 0x7d;
  TL1 = 0xec;

  TR0 = 1;
  TR1 = 1;

  IE = 0x8a;
}

1 Ответ

1 голос
/ 22 апреля 2020

В blink2 () вы проверяете глобальную переменную i , но никогда не меняете ее.

Обратите внимание: blink1 () управляет LED2, а blink2 () управляет светодиодом. Возможно, более последовательное именование поможет, и то же самое относится к переменным i, x, y и count.

Нет ограничений на использование более одного прерывания одновременно, но когда из них выполняется, остальные временно заблокирован Это не ваша проблема здесь, ваш код в порядке; но если вы хотите, чтобы прерывание могло прерываться по очереди, для низкой задержки вы должны повторно включить прерывания в (относительно) «медленном» обработчике.

Последнее предложение: где у вас есть «if (y) == 100) "и в последнее время" y = 0 ", если вы переместите" y = 0 "чуть ниже" if (y == 100) ", удобочитаемость улучшится.

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

...