Автор Тема: Бегущий поворотник.  (Прочитано 445 раз)

Пишу_Видяхи

  • Как сделать
  • Бывалый
  • ***
  • Сообщений: 222
  • Karma: +4/-0
  • Меня не существует
Бегущий поворотник.
« : Декабря 02, 2022, 10:24:48 pm »
Помещу кусок кода сюда, так как в комментариях общаться неудобно.

int __attribute__((noreturn)) main(void)
{
DDRB |= (1<<LED_PIN);   //Делаем нужный пин выходом
 
//uint8_t i=0;
uint8_t a=MAX_LED;

clear_LED();
switch (rezim)
    {
case 1:
r_01();
break;
case 3:
case 4:
raduga(MAX_LED);
break;
    }

while (1){
switch (rezim){
case 0://режим поворотника
if(a==0){
a=MAX_LED;
_delay_ms(200); // для красоты
clear_LED();
ws2812_sendarray((uint8_t *)led,MAX_LED*3);
_delay_ms(500); // для красоты
}
led[a].r=RED;led[a].g=GREEN;led[a].b=BLUE;
ws2812_sendarray((uint8_t *)led,MAX_LED*3);
_delay_ms(STEP);
a--;
break;
    case 1:
step_right_loop();
ws2812_sendarray((uint8_t *)led,MAX_LED*3);
_delay_ms(STEP*MAX_LED);
break;
case 3:
step_right_loop();
ws2812_sendarray((uint8_t *)led,MAX_LED*3);
_delay_ms(STEP*3);
break;
    case 2:
if (a%2==0) full(); else clear_LED();
ws2812_sendarray((uint8_t *)led,MAX_LED*3);
_delay_ms(STEP*10);
a++;
break;
    case 4:
right_in();
//_delay_ms(200); // для красоты
//clear_LED();
ws2812_sendarray((uint8_t *)led,MAX_LED*3);
//_delay_ms(500); // для красоты
break;
}
  }

}

lygalovag

  • Призрак
  • Сообщений: 1
  • Karma: +0/-0
Re: Бегущий поворотник.
« Ответ #1 : Декабря 05, 2022, 08:05:12 am »
Вставил весь кусок. компиляция прошла. залил. бежит с 24 до 2. 1 не зажигает. думал может не работал первый, залил старую прошивку, зажигает с 1 по 24. в чём загвоздка?

Пишу_Видяхи

  • Как сделать
  • Бывалый
  • ***
  • Сообщений: 222
  • Karma: +4/-0
  • Меня не существует
Re: Бегущий поворотник.
« Ответ #2 : Декабря 07, 2022, 08:18:37 am »
Попробуйте заменить этот кусок кода:
case 0://режим поворотника
if(a==0){
a=MAX_LED;
_delay_ms(200); // для красоты
clear_LED();
ws2812_sendarray((uint8_t *)led,MAX_LED*3);
_delay_ms(500); // для красоты
}
led[a-1].r=RED;led[a-1].g=GREEN;led[a-1].b=BLUE;
ws2812_sendarray((uint8_t *)led,MAX_LED*3);
_delay_ms(STEP);
a--;
break;
Вывод в массиве сдвинут на 1 пиксель и до нулевого элемента не доходит.
led[a-1].r=RED;led[a-1].g=GREEN;led[a-1].b=BLUE;
эта строка должна исправить.