Помогите оптимизировать программу. Arduino Uno . Есть 3 диода и кнопка на макетной плате.1 нажатие на кнопку-загорается 1й с частотой 1 Гц, второе нажатие - 2й диод с частой 2 Гц и так с3м диодом. - вопрос №3227497


#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>

struct diode
{
int on_time; // vremya dioda vo vklyuchenom sostoyanii (kratnoe 10 ms) } vmeste
int off_time; // v vykl sost (kratnoe 10 ms) } peroid
};

void mode_0(int *coynter_button); // vse diody ne goryat
void mode_1(int *coynter_button); // d1 — 1 Gc; d2 — vykl; d3 — vykl;
void mode_2(int *coynter_button); // d1 — vykl; d2 — 2 Gc; d3 — vykl;
void mode_3(int *coynter_button); // d1 — vykl; d2 — vykl; d3 — 3 Gc;
void flicker (struct diode diode_1, struct diode diode_2, struct diode diode_3);
// funkciya vkl/vykl diodov s zadanoj chastotoj i proverka najatiya knopki
int main(void)
{
DDRB = (1<<DDB3) | (1<<DDB2) | (1<<DDB1);
// vystavlijaem dannye linii na vyhod k nim podklyucheny diody
// liniya DDRB4 nastroena na vhod, k nej podklyuchena knopka
PORTB = (1<<PB4);
// vystavlyaem nachalnye znacheniya dlya vyhodov log 0 ili 1
// opredelyaem sostoyanie dlya vhodov 1 — podtyanut k 1
// 0 — z sostojanie
int counter_button = 0; //schetchik nazhatij knopki
while (1)
{
switch (counter_button)
{
case 0:
mode_0(&counter_button);
break;
case 1:
mode_1(&counter_button);
break;
case 2:
mode_2(&counter_button);
break;
case 3:
mode_3(&counter_button);
break;
}
}
return 0;
}

void mode_0(int *counter_button)
{
struct diode diode_1 = {0, 100}; //
struct diode diode_2 = {0, 100}; // parametry vremeni vkl/vykl diodov
struct diode diode_3 = {0, 100}; //
flicker (diode_1, diode_2, diode_3);
(*counter_button) ++; // uvilichivaem zmachenie schetchika nazhatij
return;
}
// analogichno dlya vseh funkcij mode_x

void mode_1(int *counter_button)
{
struct diode diode_1 = {100, 100};
struct diode diode_2 = {0, 0};
struct diode diode_3 = {0, 0};
flicker (diode_1, diode_2, diode_3);
(*counter_button) ++;
return;
}

void mode_2(int *counter_button)
{
struct diode diode_1 = {0, 0};
struct diode diode_2 = {50, 50};
struct diode diode_3 = {0, 0};
flicker (diode_1, diode_2, diode_3);
(*counter_button) ++;
return;
}

void mode_3(int *counter_button)
{
struct diode diode_1 = {0, 0};
struct diode diode_2 = {0, 0};
struct diode diode_3 = {33, 33};
flicker (diode_1, diode_2, diode_3);
(*counter_button) = 1;
return;
}



void flicker (struct diode diode_1, struct diode diode_2, struct diode diode_3)
{
int diode_counter_1 = 0; //
int diode_counter_2 = 0; // schetchiki perioda mercaniya diodov
int diode_counter_3 = 0; //
int previous_press = (PINB & (1<<PB4)); // staroe znachenie sostoyaniya knopki
int current_press = (PINB & (1<<PB4)); // tekuschee znachenie sostoyaniya knopki
// eti 2 peremennye nuzhny dlya proverki knopki po frontu
while ( 1 )
{
if (diode_counter_1 < diode_1.on_time) // uslovie vklyuchenogo dioda
{
PORTB |= (1<<PB3); // vklyuchaem diod vystavlyaya nujnoe znachenie bita
}
else
{
PORTB &= ~(1<<PB3); // vyklyuchaem diod
}
diode_counter_1++; // uvelichivaem znachenie schetchika dlya dannogo dioda
if (diode_counter_1 > (diode_1.on_time + diode_1.off_time))
// uslovie zaversheniya perioda
{
diode_counter_1 = 0; // sbrasyvaem schetchik
}

// analogichno dlya vseh diodov

if (diode_counter_2 < diode_2.on_time)
{
PORTB |= (1<<PB2);
}
else
{
PORTB &= ~(1<<PB2);
}
diode_counter_2++;
if (diode_counter_2 > (diode_2.on_time + diode_2.off_time))
{
diode_counter_2 = 0;
}

if (diode_counter_3 < diode_3.on_time)
{
PORTB |= (1<<PB1);
}
else
{
PORTB &= ~(1<<PB1);
}
diode_counter_3++;
if (diode_counter_3 > (diode_3.on_time + diode_3.off_time))
{
diode_counter_3 = 0;
}
current_press = (PINB & (1<<PB4)); // proveryaem cnopku i prisvaivaem
// tekuschee znachenie
if (current_press > previous_press) // uslovie po perednemu frontu
{
_delay_us(50); // zaderzhka dlya predotvrascheniya effecta
// drebezzheniya kontaktov
break;
}
previous_press = current_press; // prisvaivaem tekuschee znachenie staromu
_delay_ms(10); // zadergka cikla
// zaderzhka cikla

Еугения, [27.03.19 20:39]
* (vremya vkl + vremya vykl) = realnoe vremya perioda
}
return;
}

Ответы

Вы описали работу устройства не полностью.
Когда начинает мигать второй диод, первый прекращает или нет? и так далее…
28.03.19

Еva

от 100 p.
Читать ответы
Посмотреть всех экспертов из раздела Учеба и наука > Информатика
Пользуйтесь нашим приложением Доступно на Google Play Загрузите в App Store