Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT89C2051 Внешнее прерывание
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
VAHOO
Всем привет пишу программу для игры <HOKEY>,
вот немогу заставить чтобы два внешных прерывание
стали нормально работать, прошу помогите, я навичок,
скажите где нето зделал? help.gif


#include <AT892051.h>
#include <REG2051.H>


static unsigned char Numbers[10] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
unsigned char igrok_A,igrok_B;
unsigned int i;

void DisplayA();
void DisplayB();
void Wait();
void Summary();
void Start();
void time();

void wait ()

{
;
}

void ex0_isr (void) interrupt 0
{

igrok_A++;
}

void ex1_isr (void) interrupt 1
{

igrok_B++;

}

main()

{
EA = 1;

EX0 = 1;
EX1 = 1;

IT0 = 1;
IT1 = 1;

igrok_A = -1;
igrok_B = -1;

while(1)

{
DisplayA();
DisplayB();

}

}

void DisplayA()
{
unsigned int tmpSum ;
unsigned char index;

P3 = 0;


tmpSum = igrok_A;
if (tmpSum < 0 || tmpSum > 9 )
return;

index = tmpSum ;

P3 |= 0x02 ;
P1 = Numbers[index];
for (i=0;i<50;i++)
{
wait();
}
P3 &=~0x02;

}

void DisplayB()
{
unsigned int tmpSum ;
unsigned char index;

P3 = 0;


tmpSum = igrok_B;
if (tmpSum < 0 || tmpSum > 9 )
return;


index = tmpSum ;

P3 |= 0x01;
P1 = Numbers[index];
for (i=0;i<50;i++)
{
wait();
}
P3 &=~0x01;


}
VAHOO
Ни кто не хочет помоч??? sad.gif
Andy Great
Хорошим тоном было бы отформатировать текст программы (для этого есть теги) и указать компилятор, да и комментарии проставить не помешало бы: глядишь и сам бы нашел...

По существу: сам давно для 51х не писал, но проверьте номера прерываний, можно глянуть куда векторы указывают.
AndreyS
Цитата(VAHOO @ Nov 21 2006, 09:11) *
Ни кто не хочет помоч??? sad.gif



Добрый день.
Что вы подразумеваете под нормальной работой???

Объясните что вас не устраивает?.
RedFroggy
Цитата(VAHOO @ Nov 21 2006, 10:11) *
Ни кто не хочет помоч??? sad.gif

1. Попробуйте изменить процедуру настройки МК. Первой командой должно быть, как правило, EA = 0, запрещающей все прерывания, а у Вас наоборот. Запретили прерывания, настроили спокойно регистры - потом включаем EA = 1.

2. Не ясен вопрос: "как заставить НОРМАЛЬНО работать?".

Если объявляете
unsigned char igrok_A,igrok_B;
то такая запись хоть и будет работать, но выглядит не совсем корректно, только сбивает с толку
igrok_A = -1;
igrok_B = -1;

лучше
igrok_A = 255; //0xFF
igrok_B = 255; //0xFF
RedFroggy
Цитата(VAHOO @ Nov 21 2006, 10:11) *
Ни кто не хочет помоч??? sad.gif


Объявление
unsigned int tmpSum ;
и условие
if (tmpSum < 0 || tmpSum > 9 )
"совместимы" наполовину smile.gif
Не имеет смысла проверять tmpSum на отрицательное значение, tmpSum всегда будет больше нуля.
Может в этом ошибка?
VAHOO
Использую компилятор KEIL UVISION,

а if (tmpSum < 0 || tmpSum > 9 )

это для того чтобы работал в переделе (0..9)


RedFroggy спосибо сейчас попробую и результати скожу
RedFroggy
Цитата(VAHOO @ Nov 21 2006, 16:33) *
а if (tmpSum < 0 || tmpSum > 9 )

это для того чтобы работал в переделе (0..9)


Если Вы используете объявление переменной как безнаковое целое (unsigned int tmpSum), то проверка условия tmpSum < 0 теряет смысл, т.к tmpSum всегда положительное число.
VAHOO
всеравно не работает, если убираю строка

EX1 = 1; тогда прерывание от P3.2 происходит когда на эту ношку подаю высоки уровень и
нормально работает, но мне надо чтобы работали вместе, вы по моему уже поняли, когда
шар попадает на ловушку на семисегментном индикаторе пишет 1 : 0 и так дале... допустим 9 : 9,
на строках
igrok_A = -1;
igrok_B = -1; игра начало с 0 : 0;

причем тут

igrok_A = 255; //0xFF
igrok_B = 255; //0xFF ???


static unsigned char Numbers[10] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};

это цифры от 0 до 9;


for (i=0;i<50;i++)
{
wait();
} временные задержки;
RedFroggy
Цитата(VAHOO @ Nov 21 2006, 23:04) *
igrok_A = -1;
igrok_B = -1; игра начало с 0 : 0;

причем тут

igrok_A = 255; //0xFF
igrok_B = 255; //0xFF ???


При том, что в данном случае в igrok_A, igrok_B запишется именно 255, а не -1.
Нужно -1? Тогда уж объявление надо делать
char igrok_A;
char igrok_B;
VAHOO
ок, уже исправил, а что мне делать с прерываниями????
VAHOO
В этом форуме есть хоть 1 человек чтоб смог мне помоч help.gif help.gif help.gif
Andy Great
Расставьте везде скобки, во многих случаях это помогает, компилятор Си использует довольно странные (хотя и строго определенные) приоритеты операций. Насколько я помню, операция || выполняется раньше >
В форуме полно людей, просто их другие проблемы гложут.
VAHOO
Цитата(Andy Great @ Nov 24 2006, 18:33) *
Расставьте везде скобки, во многих случаях это помогает, компилятор Си использует довольно странные (хотя и строго определенные) приоритеты операций. Насколько я помню, операция || выполняется раньше >
В форуме полно людей, просто их другие проблемы гложут.


ок спосибо, но это не решает проблему sad.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.