реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> AT89C2051 Внешнее прерывание, может быть конфликт?
VAHOO
сообщение Nov 20 2006, 14:50
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 22-09-05
Пользователь №: 8 834



Всем привет пишу программу для игры <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 - Nov 20 2006, 14:53


--------------------
Прошивка это душа микроконтроллера!
Go to the top of the page
 
+Quote Post
VAHOO
сообщение Nov 21 2006, 09:11
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 22-09-05
Пользователь №: 8 834



Ни кто не хочет помоч??? sad.gif


--------------------
Прошивка это душа микроконтроллера!
Go to the top of the page
 
+Quote Post
Andy Great
сообщение Nov 21 2006, 11:28
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 793
Регистрация: 5-11-04
Из: Краматорск, Украина
Пользователь №: 1 057



Хорошим тоном было бы отформатировать текст программы (для этого есть теги) и указать компилятор, да и комментарии проставить не помешало бы: глядишь и сам бы нашел...

По существу: сам давно для 51х не писал, но проверьте номера прерываний, можно глянуть куда векторы указывают.
Go to the top of the page
 
+Quote Post
AndreyS
сообщение Nov 21 2006, 14:11
Сообщение #4


Местный
***

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



Цитата(VAHOO @ Nov 21 2006, 09:11) *
Ни кто не хочет помоч??? sad.gif



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

Объясните что вас не устраивает?.


--------------------
Удачи.
Go to the top of the page
 
+Quote Post
RedFroggy
сообщение Nov 21 2006, 15:01
Сообщение #5


Участник
*

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



Цитата(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 - Nov 21 2006, 15:06
Go to the top of the page
 
+Quote Post
RedFroggy
сообщение Nov 21 2006, 15:14
Сообщение #6


Участник
*

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



Цитата(VAHOO @ Nov 21 2006, 10:11) *
Ни кто не хочет помоч??? sad.gif


Объявление
unsigned int tmpSum ;
и условие
if (tmpSum < 0 || tmpSum > 9 )
"совместимы" наполовину smile.gif
Не имеет смысла проверять tmpSum на отрицательное значение, tmpSum всегда будет больше нуля.
Может в этом ошибка?
Go to the top of the page
 
+Quote Post
VAHOO
сообщение Nov 21 2006, 15:33
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 22-09-05
Пользователь №: 8 834



Использую компилятор KEIL UVISION,

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

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


RedFroggy спосибо сейчас попробую и результати скожу


--------------------
Прошивка это душа микроконтроллера!
Go to the top of the page
 
+Quote Post
RedFroggy
сообщение Nov 21 2006, 19:39
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 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 всегда положительное число.
Go to the top of the page
 
+Quote Post
VAHOO
сообщение Nov 21 2006, 23:04
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 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();
} временные задержки;


--------------------
Прошивка это душа микроконтроллера!
Go to the top of the page
 
+Quote Post
RedFroggy
сообщение Nov 21 2006, 23:36
Сообщение #10


Участник
*

Группа: Свой
Сообщений: 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;
Go to the top of the page
 
+Quote Post
VAHOO
сообщение Nov 22 2006, 09:28
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 22-09-05
Пользователь №: 8 834



ок, уже исправил, а что мне делать с прерываниями????


--------------------
Прошивка это душа микроконтроллера!
Go to the top of the page
 
+Quote Post
VAHOO
сообщение Nov 23 2006, 13:55
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 22-09-05
Пользователь №: 8 834



В этом форуме есть хоть 1 человек чтоб смог мне помоч help.gif help.gif help.gif


--------------------
Прошивка это душа микроконтроллера!
Go to the top of the page
 
+Quote Post
Andy Great
сообщение Nov 24 2006, 18:33
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 793
Регистрация: 5-11-04
Из: Краматорск, Украина
Пользователь №: 1 057



Расставьте везде скобки, во многих случаях это помогает, компилятор Си использует довольно странные (хотя и строго определенные) приоритеты операций. Насколько я помню, операция || выполняется раньше >
В форуме полно людей, просто их другие проблемы гложут.
Go to the top of the page
 
+Quote Post
VAHOO
сообщение Nov 24 2006, 22:48
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 22-09-05
Пользователь №: 8 834



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


ок спосибо, но это не решает проблему sad.gif


--------------------
Прошивка это душа микроконтроллера!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 11:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01457 секунд с 7
ELECTRONIX ©2004-2016