Копать надо тут:
Код:
/**************************************************************************************
* Обработчик внещних прерываний timer1A
***************************************************************************************/
ISR(TIMER1_COMPA_vect){
TIMSK &= ~_BV(OCIE1A); //запрещаем прерывания timer1, чтобы не было рекурсии
sei();
if ((bullets >0)&&(!play_hit_snd))//если патроны не кончились
{
if (last_simple == 0)
{
fire_led_status=ON; //включаем вспышку
}
else;
if (last_simple < sizeof(pSnd))//3913
{
if (last_simple==(sizeof(pSnd)/100)*CUT_OFF_SOUNT)
{
if (fire_mode()==queues)
{
if ((get_keyboard_status()==key_pressed)&&(life>0)) //курок нажат, то отсекаем звук
{
bullets--;//уменьшаем на 1 количество патронов
send_ir_package(); //Производим "выстрел"
last_simple=0; //воспроизводим звук сначала
fire_led_status=FQR_4HZ;
}
else fire_led_status=ON;
}
else;
}
else;
OCR0 = pgm_read_byte(&(pSnd[last_simple++]));
}
if (last_simple >= sizeof(pSnd)&&(last_simple)!=0xFFFF)//3913
{
OCR0 = 128; //Скважность = 0,5
fire_led_status=OFF;
};
}
if (bullets <= 0) //патроны кончились
{
BULLETS_OUT_LED_ON; // включаем светодиод "Патроны кончились"
if (last_simple < sizeof(pSnd)) {OCR0 = pgm_read_byte(&(pSnd[last_simple++]));}//дадим выстрелу прозвучать до конца
else fire_led_status = OFF;
};
static volatile uint16_t tmp_cntr=0;
if ((tmp_cntr - (tmp_cntr/100)*100)==0)
{
switch(keyboard_event)
{
case no_key_pressing:
{
keyboard_event=test_keyboard();
break;
}
default:;
}
}
if (++tmp_cntr > 1000) //пора обновить индикацию
{
tmp_cntr = 0;
static volatile uint8_t bit_mask = 0b00000001;
if ((life_leds_status[0]&bit_mask)==0)
{
LIFE_LED1_OFF;
}
else
{
LIFE_LED1_ON;
};
if ((life_leds_status[1]&bit_mask)==0)
{
LIFE_LED2_OFF;
}
else
{
LIFE_LED2_ON;
};
if ((life_leds_status[2]&bit_mask)==0)
{
LIFE_LED3_OFF;
}
else
{
LIFE_LED3_ON;
};
if ((life_leds_status[3]&bit_mask)==0)
{
LIFE_LED4_OFF;
}
else
{
LIFE_LED4_ON;
};
if ((fire_led_status&bit_mask)==0)
{
FIRE_LED_OFF;
}
else
{
FIRE_LED_ON;
};
bit_mask = (bit_mask<<1);
if (bit_mask == 0) bit_mask = 0b00000001;
}
Чувствую - перемудрил со вспышкой!
Проще надо сделать.
Понимаю парни, что в чужом коде разбираться "удовольствие" на любителя!
Постараюсь объясник ка все работает, но в двух словах не получиться.
Как реализована индикация?
Каждый светодиод жизни и диод вспышки имеют, как я их называю - регистры статуса.
Это простые переменные размером с байт (uint8_t).
Примерно четыре раза в секунду происходит опрос очередного бита регистра статуса, и если бит=1 диод включается, если 0 - выключается.
Биты опрашиваются друг за другом "по кругу".
Таким образом, чтобы диод горел постоянно - значение регистра статуса должно быть 11111111 = 255.
Чтобы не горел совсем - 00000000.
Чтобы мигал с частотой один Герц - 00001111.
2 Герца - 00110011
4 Герца - 01010101
Смысл ясен?
Вернёмся к вспышке.
Если огонь ведётся очередью - диод мигает с частотой 4 Гц.
Если одиночными - ... уже подзабыл.
Но вроде выключается диод с окончанием звука выстрела.
Но ошибку надо искать в приведённом коде.
Может ошибка чисто моя, "человеческая", и компилятор не причем...
А лучше - переделать, как я уже предлагал ранее.