Логика Работы Прерываний? Или Ошибка В Коде?

23-06-2015, 00:58 От: admin Посмотрели: 325
Делаю я контроллер для управления компом в машине... Столкнулся с такой проблемой .. выделенный кусок кода работает нормально, если выключены прерывания. т.е. при выполнении условий отрабатывает инструкция PORTB |= _BV(4); и у порта В на 4 пине логическая 1 остается до тех пор пока я ее не выключу (т.е. не выполнится условие


if (bit_is_clear(PINC,3))

{
PORTB &= ~_BV(4);
}


Но вот стоит включить прерывания, т.е. закомментировать cli(); в начале выделенного куска, порт переходит в лог.1 только тогда когда выполняется условие в выделенном куске кода, если условие не выполняется сразу становится лог.0. Вопрос - Почему? уже все векторы прерываний закомментировал. оставил только главную функцию(int main).


int main(void)
{
// int count=1;
// int time1;
PORTB = 0b00000000; //настраиваем
DDRB = 0b11111111; //порты
PORTC = 0b00000000;//
DDRC = 0b00000000;//
PORTD = 0b00001100;//
DDRD = 0b11110001;//
MCUCR=0x01;// прерывание по любому изменению логического уровня INT0 и низкому уровню на INT1
GICR=0xC0;// разрешаем прерывания на INT0 и INT1
GIFR=0x40;// сбрасывается флаг INT0 (в данный момент не требуется)
TCCR1B=0x03;// предделитель таймера 1 на 64
OCR1A=65534;// максимальное число счетчика таймера 1
TCCR2=0x05; // предделитель таймера 2 на 1024
TIMSK |= _BV(7); // разрешается прерывание по совпадению таймера 2
TIMSK |= _BV(4); // тоже,таймера1
TIMSK |= _BV(2); // прерывание по переполнению таймера 1
//OCR2=700;
PORTB |= _BV(5); // выставляется высокий уровень 5го бита порта B
sei();
while (1)
{

//если нет 12в с компа, то выключить усилитель.
// if (bit_is_clear(PINC,4)) PORTB &= ~_BV(3);

if (bit_is_clear(PINC,3))
{
PORTB &= ~_BV(4);
}
//Если пропало питание на USB то выключаем дежурку
if (bit_is_set(PINC,5)) //Если ключ в положении ON...
{
################################################################
cli();

if (bit_is_clear(PINC,4)) //...и нет питания 12v...
{
if (bit_is_clear(PINC,3))//И нет питанич на USB,то включаем дежурку
{
if (status==0)
{
PORTB |= _BV(4);
_delay_ms(1500);
click(0);//включаем комп
}
}
else
//if (status==0) click(0);//выводим из дежурки
_delay_ms(500);
status=1;
}
##################################################################3
// sei();
}
else
status=0;
}
return 0;
}

Раздел: AVR

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

Обсудить на форуме


На момент добавления Логика Работы Прерываний? Или Ошибка В Коде? все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Популярные новости
Календарь новостей
«    Апрель 2024    »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
2930