7seg писал(а):Есть у кого функция задержки времени без _delay_ms ,на таймере если еще и на нулевом то вобще гуд
а самому написать - не гуд?
настраиваете таймер на прерывания через любой подходящий вашим интересам интервал, например, если шаг задержки 1 мс, то и интервал прерываний таймера тоже разумно сделать 1 мс.
заводите себе глобальную переменную-стетчик, например delay. размер этой переменной должен вмещать нужную вам предельно большую задержку. т.е. если вы хотите до 10 секунд, а период тиков таймера 1 мс, максимальная задержка будет 10000 тиков таймера, т.е. переменная будет uint16_t delay; если счетчик вышел больше 1 байта, то дополнительно заводите себе переменную-флаг timeout (однобайтную!), которая и будет означать истечение задержки.
ну и теперь делаете обработчик прерываний таймера
Код: Выделить всё
ISR(TIMER0_OVF_vect){ // я дли примера взял по переполнению, можно любое иное прерывание
if(delay){
delay--;
timeout = 1;
}
}
еще делаете функцию установки задержки
Код: Выделить всё
#include <util/atomic.h>
void set_delay(uint16_t ms){
timeout = 0;
ATOMIC_BLOCK(ATOMIC_RESTORE_STATE){
delay = ms;
}
}
вот почти и все. в нужном вам месте вызываете эту функцию set_delay и затем время от времени проверяете timeout - как только эта переменная станет не равна нулю - задержка истекла.
Код: Выделить всё
while(1){ // главный цикл
if(timeout){
PORTB ^= _BV(PB0); // мигаем светодиодом на порту PB0
set_delay(1000); // с периодом 2 секунды
}
// а тут занимается остальными делами в главном цикле
}
если delay у вас однобайтным вышел, то timeout не требуется, можно смотреть сразу на delay: обнулилась - время вышло. ну и atomic.h в этом случае не требуется