| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Как мне обстоять с таймерами? https://radiokot.ru/forum/viewtopic.php?f=57&t=77518 |
Страница 1 из 1 |
| Автор: | Protobear [ Вс сен 02, 2012 21:31:43 ] |
| Заголовок сообщения: | Как мне обстоять с таймерами? |
Ребята коты, всем привет! Хочу сделать отсчет времени в мк атмега8, но проблема в том что помимо этого еще хочу чтоб выполнялся мой код. На сколько я понимаю прерывание начнет выполнять код с того места где (допустим по обнулению таймера) оно ушло на код обработчика прерывания, но в таком случае тот же вывод на экран не выполнится, т.к. до того как выполнится код выводящий информацию на экран, таймер опять прервет его. Есть ли в Атмегах какой - нибудь способ независимо считать а при надобности брать набежавшее значение? т.е. допустим запустили таймер- он считает себе и можно выполнять другие команды, но в опр момент можно забрать значение таймера. Заранее благодарен. PS Поправлюсь, я имею в виду более длительный таймер нежели клок/1024 и все это заполняет (в случае 8 бит) 256 значений. т.е. шибко такой таймер не поможет если речь идет о секундах. - как сделать таймер более вместительным? |
|
| Автор: | Jack_A [ Вс сен 02, 2012 22:56:07 ] |
| Заголовок сообщения: | Re: Как мне обстоять с таймерами? |
Не совсем ясна задача. Если просто вести отсчет времени до определенного события - это одно, а вести и выводить постоянно, к примеру, на экран - это другое. Допустим, второй вариант. Вывод времени на LED индикаторы динамический. Настраиваем таймер, к примеру, на 1 мс. Каждую миллисекунду в прерывании во-первых, инкрементируем значение времени - мс - сек - мин - час , и когда изменится значение сек - мин - час , обновляем буфер вывода ; во-вторых, циклически выводим инфу из упомянутого буфера вывода в позиции знакомест индикаторов, получим частоту обновления 166Гц, что больше чем достаточно, и не занимает много процессорного времени. Можно по другому. Один таймер занимается только обслуживанием индикаторов, второй - подсчетом времени, и когда ( см. выше ) - он выставляет флаг, по которому второй таймер, отвлекшись от стробирования разрядов, обновляет буфер вывода. Вариантов может быть много. Главное - в прерывании производить минимально необходимые действия, чтобы оставить время основной программе. |
|
| Автор: | Protobear [ Пн сен 03, 2012 01:34:19 ] |
| Заголовок сообщения: | Re: Как мне обстоять с таймерами? |
Так вот одна неувязочка - я помоему жестко затупил и подумал что прерывание заново весь код гонит, но ведь оно просто будет потихонечку вклиниваться и делать свое дело, а код дальше продолжаться ведь так? В таком случае прошу помочь с кодом: #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 есть какой - то за прерывание отвечающий, или с глобальным разрешением прерывания что - то не то:( */ |
|
| Автор: | pokk [ Пн сен 03, 2012 07:47:09 ] |
| Заголовок сообщения: | Re: Как мне обстоять с таймерами? |
Protobear писал(а): ....или с глобальным разрешением прерывания что - то не то:( Да вот его что-то не видно в CodeVisionAVR это так #asm("sei"). По пробуйте что нибудь такое поставить перед циклом. |
|
| Автор: | Protobear [ Пн сен 03, 2012 08:25:36 ] |
| Заголовок сообщения: | Re: Как мне обстоять с таймерами? |
pokk писал(а): Protobear писал(а): ....или с глобальным разрешением прерывания что - то не то:( Да вот его что-то не видно в 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); } } |
|
| Автор: | Protobear [ Вт сен 04, 2012 01:37:08 ] |
| Заголовок сообщения: | Re: Как мне обстоять с таймерами? |
Protobear писал(а): ISR(TIMER0_OVF_vector) { timer2=105;//пока о ++ не идет речь, 105 хотя бы вывести) } */ Ув. Protobear, вы не правильно написали, а затем напечатали код - при переписывании из ДШ возможно по ошибке на писали vector, вместо vect PS ISR(TIMER0_OVF_vect) Вот так работает) - Остается страшной тайной что такое vector и почему его пропустил компилятор и за что он тогда отвечает. |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


