как одним таймером отсчитать разные промежутки времени?
Написал belazov дата Пн, 11/22/2010 - 12:23
никак не въеду:
таймер Т1 на тини2313. прерывание при совпадении дает мне счетчик времени.
использую флаг от прерывания для отсчета необходимых пауз. на паузе зависает.
как еще можно сделать паузу чтоб она не мешала ничему?
unsigned char x=0; unsigned char y=0; unsigned char z=0; unsigned char N=0;
вариант первый
//флаг1 инвертируется каждое прерывание от таймера //число N задаю по ходу программы дл отработки пауз //разной длительности void wait(void) { z=N; //назначаю кол-во прерываний N для отсчета x=flag1; //начальное значение х y=0; //вспомагательная переменная if (y<z) //если y<z { while (x=flag1){}; //проверяю когда изменится flag1, т.е. произойдет прерывание //пока флаг не изм. крутится пустой цикл y=y+1; //как только flag1 изм., то инкремент y } else { N=0; //если y=z, то переход к следующей функции }; }
или вариант второй
void wait(void) { x=flag1; y=0; z=N; m1: if (y<z) { if (x==~flag1) {y=y=1;x=flag1;} else {goto m1;}; }; }
третий вариант
void wait(void) { z=N; //назначаю кол-во прерываний N для отсчета x=flag1; //начальное значение х y=0; if (y<z) //если y<z { while (x=flag1){}; //проверяю когда изменится flag1, т.е. произойдет прерывание //пока флаг не изм. крутится пустой цикл y=y+1; //как только flag1 изм., то инкремент y } else { N=0; //если y=z, то переход к следующей функции }; }
»
Не получилось с Tiny2313 и
Не получилось с Tiny2313 и перешел на Mega8. для задержек использую отдельно таймер Т2 в такой подпрограмме. НО! пока не пойму почему эта подпрограмма когда прошиваю только ее одну - работает как надо, а когда она в составе общей программы вызывается в нужных местах - не работает. причем (вывел индикацию работы Т2 на LED)не включается Т2.
Мои 5 копеек..
Можно использовать данный метод, если не критичны точность временных интервалов, объем памяти и время нахождения в прерывании :))
Ёлы-палы... Как код
Ёлы-палы... Как код подсвечивать????
Ты все правильно сделал
Ты все правильно сделал с тэгами кода в начале и в конце, надо еще выбрать в меню: "Input Format" опцию "С code".
Ок, буду знать..
Ок, буду знать..
Если вам надо несколько
Если вам надо несколько задержек по таймеру с разными периодами, то вам нужно в программе иметь несколько переменных по одной на каждый, а в обработчике прерывания таймера декременировать сразу две переменных. Проверяя их по очереди в главном цикле программы.
Т.е. загружаем в переменную число и начинаем его декрементировать в прерывании. И там же, в обработчике, проверяем его на ноль. Если ноль, то выставляем в памяти флажок. А наша фоновая программа этот флажок ловит и запускает нужное вам действие например зажигаем светодиод, попутно переустанавливая выдержку.
типа вот так?:x=5;y=10;//
типа вот так?: