|
|
  |
AT89C2051 Внешнее прерывание, может быть конфликт? |
|
|
|
Nov 20 2006, 14:50
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 22-09-05
Пользователь №: 8 834

|
Всем привет пишу программу для игры <HOKEY>, вот немогу заставить чтобы два внешных прерывание стали нормально работать, прошу помогите, я навичок, скажите где нето зделал? #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 - Nov 20 2006, 14:53
--------------------
Прошивка это душа микроконтроллера!
|
|
|
|
|
Nov 21 2006, 14:11
|

Местный
  
Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276

|
Цитата(VAHOO @ Nov 21 2006, 09:11)  Ни кто не хочет помоч???  Добрый день. Что вы подразумеваете под нормальной работой??? Объясните что вас не устраивает?.
--------------------
Удачи.
|
|
|
|
|
Nov 21 2006, 15:01
|
Участник

Группа: Свой
Сообщений: 36
Регистрация: 7-11-05
Пользователь №: 10 549

|
Цитата(VAHOO @ Nov 21 2006, 10:11)  Ни кто не хочет помоч???  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 - Nov 21 2006, 15:06
|
|
|
|
|
Nov 21 2006, 15:14
|
Участник

Группа: Свой
Сообщений: 36
Регистрация: 7-11-05
Пользователь №: 10 549

|
Цитата(VAHOO @ Nov 21 2006, 10:11)  Ни кто не хочет помоч???  Объявление unsigned int tmpSum ;и условие if (tmpSum < 0 || tmpSum > 9 )"совместимы" наполовину  Не имеет смысла проверять tmpSum на отрицательное значение, tmpSum всегда будет больше нуля. Может в этом ошибка?
|
|
|
|
|
Nov 21 2006, 15:33
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 22-09-05
Пользователь №: 8 834

|
Использую компилятор KEIL UVISION,
а if (tmpSum < 0 || tmpSum > 9 )
это для того чтобы работал в переделе (0..9)
RedFroggy спосибо сейчас попробую и результати скожу
--------------------
Прошивка это душа микроконтроллера!
|
|
|
|
|
Nov 21 2006, 19:39
|
Участник

Группа: Свой
Сообщений: 36
Регистрация: 7-11-05
Пользователь №: 10 549

|
Цитата(VAHOO @ Nov 21 2006, 16:33)  а if (tmpSum < 0 || tmpSum > 9 )
это для того чтобы работал в переделе (0..9) Если Вы используете объявление переменной как безнаковое целое (unsigned int tmpSum), то проверка условия tmpSum < 0 теряет смысл, т.к tmpSum всегда положительное число.
|
|
|
|
|
Nov 21 2006, 23:04
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 22-09-05
Пользователь №: 8 834

|
всеравно не работает, если убираю строка
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(); } временные задержки;
--------------------
Прошивка это душа микроконтроллера!
|
|
|
|
|
Nov 21 2006, 23:36
|
Участник

Группа: Свой
Сообщений: 36
Регистрация: 7-11-05
Пользователь №: 10 549

|
Цитата(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;
|
|
|
|
|
Nov 22 2006, 09:28
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 22-09-05
Пользователь №: 8 834

|
ок, уже исправил, а что мне делать с прерываниями????
--------------------
Прошивка это душа микроконтроллера!
|
|
|
|
|
Nov 24 2006, 22:48
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 22-09-05
Пользователь №: 8 834

|
Цитата(Andy Great @ Nov 24 2006, 18:33)  Расставьте везде скобки, во многих случаях это помогает, компилятор Си использует довольно странные (хотя и строго определенные) приоритеты операций. Насколько я помню, операция || выполняется раньше > В форуме полно людей, просто их другие проблемы гложут. ок спосибо, но это не решает проблему
--------------------
Прошивка это душа микроконтроллера!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|