Делаю я контроллер для управления компом в машине... Столкнулся с такой проблемой .. выделенный кусок кода работает нормально, если выключены прерывания. т.е. при выполнении условий отрабатывает инструкция PORTB |= _BV(4); и у порта В на 4 пине логическая 1 остается до тех пор пока я ее не выключу (т.е. не выполнится условие
Но вот стоит включить прерывания, т.е. закомментировать cli(); в начале выделенного куска, порт переходит в лог.1 только тогда когда выполняется условие в выделенном куске кода, если условие не выполняется сразу становится лог.0. Вопрос - Почему? уже все векторы прерываний закомментировал. оставил только главную функцию(int main).
Раздел: AVR
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