Ребята коты, всем привет! Хочу сделать отсчет времени в мк атмега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 и почему его пропустил компилятор и за что он тогда отвечает.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения