Ребята коты, всем привет! Хочу сделать отсчет времени в мк атмега8, но проблема в том что помимо этого еще хочу чтоб выполнялся мой код. На сколько я понимаю прерывание начнет выполнять код с того места где (допустим по обнулению таймера) оно ушло на код обработчика прерывания, но в таком случае тот же вывод на экран не выполнится, т.к. до того как выполнится код выводящий информацию на экран, таймер опять прервет его.
Есть ли в Атмегах какой - нибудь способ независимо считать а при надобности брать набежавшее значение? т.е. допустим запустили таймер- он считает себе и можно выполнять другие команды, но в опр момент можно забрать значение таймера. Заранее благодарен. PS Поправлюсь, я имею в виду более длительный таймер нежели клок/1024 и все это заполняет (в случае 8 бит) 256 значений. т.е. шибко такой таймер не поможет если речь идет о секундах. - как сделать таймер более вместительным?
Не совсем ясна задача. Если просто вести отсчет времени до определенного события - это одно, а вести и выводить постоянно, к примеру, на экран - это другое. Допустим, второй вариант. Вывод времени на LED индикаторы динамический. Настраиваем таймер, к примеру, на 1 мс. Каждую миллисекунду в прерывании во-первых, инкрементируем значение времени - мс - сек - мин - час , и когда изменится значение сек - мин - час , обновляем буфер вывода ; во-вторых, циклически выводим инфу из упомянутого буфера вывода в позиции знакомест индикаторов, получим частоту обновления 166Гц, что больше чем достаточно, и не занимает много процессорного времени. Можно по другому. Один таймер занимается только обслуживанием индикаторов, второй - подсчетом времени, и когда ( см. выше ) - он выставляет флаг, по которому второй таймер, отвлекшись от стробирования разрядов, обновляет буфер вывода. Вариантов может быть много. Главное - в прерывании производить минимально необходимые действия, чтобы оставить время основной программе.
Так вот одна неувязочка - я помоему жестко затупил и подумал что прерывание заново весь код гонит, но ведь оно просто будет потихонечку вклиниваться и делать свое дело, а код дальше продолжаться ведь так? В таком случае прошу помочь с кодом: #define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/eeprom.h> #include <avr/interrupt.h> volatile char timer2=0; ISR(TIMER0_OVF_vector) { timer2=105;//пока о ++ не идет речь, 105 хотя бы вывести) } int main() { TCCR0=0x05;//clk/1024 TIMSK=0x01;//прерывания while (1) {
itoa(timer2,&mass[0],10)/вывод на экран вывод(mass); } } /*Такой код у меня не работает почему то PS Может fuse есть какой - то за прерывание отвечающий, или с глобальным разрешением прерывания что - то не то:( */
....или с глобальным разрешением прерывания что - то не то:(
Да вот его что-то не видно в CodeVisionAVR это так #asm("sei"). По пробуйте что нибудь такое поставить перед циклом.
в WInAVR это так на сколько я понял sei(); поставил, но мой основной код вообще перестал выполнятся, а ножка D5 не знаю как остальной порт Д, начала дрыгаться(у меня на нее стоит включение подсветки LCD) Впрочем код по прерыванию тоже не выполняется видно 0 в первой строке и все, и пропорционально частоте мигает подсветка. вот так поставил: TCCR0=0x05;//clk/1024 TIMSK=0x01;//прерывания sei();//////////////////////////вот она DDRD=0x20; PORTD|=0x20;// А вот тут вопрос - почему дрыгается лапка при включенном sei();Это таймер/счетчик 1 но я его вообще не включал. while (1) {
itoa(timer2,&mass[0],10)/вывод на экран вывод(mass); } }
ISR(TIMER0_OVF_vector) { timer2=105;//пока о ++ не идет речь, 105 хотя бы вывести) }
*/
Ув. Protobear, вы не правильно написали, а затем напечатали код - при переписывании из ДШ возможно по ошибке на писали vector, вместо vect PS ISR(TIMER0_OVF_vect) Вот так работает) - Остается страшной тайной что такое vector и почему его пропустил компилятор и за что он тогда отвечает.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения