Maxik777 0 14 сентября, 2021 Опубликовано 14 сентября, 2021 · Жалоба Quote а в прерываниях от таймера лишь удлиняете его разрядность Как это понять? Я ещё только пытаюсь понять, как работать с таймером. А если бы ткнули носом в какой то конкретный пример, было бы замечательно. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 14 сентября, 2021 Опубликовано 14 сентября, 2021 · Жалоба 20 minutes ago, Maxik777 said: А как это делается с одним таймером, как написал aaarrr ? Для начала вам надо выбрать дискрет общего таймера. Этот дискрет будет определять с каким разрешением вы сможете регулировать период и длительность свечения. Так же он не должен слишком сильно нагружать основной цикл, т.е. таймер должен переполняться один раз за несколько проходов цикла while(1) в функции main. А дальше примерно так. Примитивненько конечно, но для понимания принципа надеюсь сойдет. Spoiler unsigned int tick_led_1; unsigned int tick_led_2; unsigned char enable_led_2; #define PULSE_TIME_1 (40UL) #define PERIOD_TIME_1 (80UL) #define PULSE_TIME_2 (40UL) #define PERIOD_TIME_2 (160UL) void Led () { if (TIFR0 & (1UL << TOV0)) { TIFR0 = (1UL << TOV0); // clear ++tick_led_1; if(tick_led_1 < PULSE_TIME_1) { PORTD |= (1 << 1); }else{ PORTD &= ~(1 << 1); } if(tick_led_1 >= PERIOD_TIME_1) { tick_led_1 = 0; } if(enable_led_2) { ++tick_led_2; if(tick_led_2 < PULSE_TIME_2) { PORTD |= (1 << 5); }else{ PORTD &= ~(1 << 5); } if(tick_led_2 >= PERIOD_TIME_2) { tick_led_2 = 0; } } } } void Key () { if (PINB & (1 << 0)) { enable_led_2 = 0; }else{ enable_led_2 = 1; } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maxik777 0 14 сентября, 2021 Опубликовано 14 сентября, 2021 · Жалоба Quote Примитивненько конечно, но для понимания принципа надеюсь сойдет. Большое спасибо!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться