defunct 0 2 января, 2008 Опубликовано 2 января, 2008 · Жалоба Ведь мне никто не запрещает в прерывании остановить таймер, выполнить все что мне нужно, а по выходу из прерывания снова его запустить? Никто не запрещает. С другой стороны, никто не запрещает также запустить таймер с одинаковыми интервалами времени. И пусть себе тикает. В обработчике прерывания таймера - взводить флажек, сигнализирующий, что некое событие наступило. И уже потом "в спокойной обстановке" тобиш в основном цикле программы проверить флажек и выполнить все, что требуется для обработки этого события.. С моей точки зрения процедура-обработчик может быть сколь угодно долгой. Конечно может, но меня например несколько раздражает когда жмешь CTRL-ALT-DEL, а системе "пофиг", т.к. некий программист решил сделать сколь угодно долгий обработчик. Если вам подходит такой стиль - то без проблем, пишите так ;> а как же мне тогда правильно таймер проинициализировать? Получается TCCR0=0x05; TCNT0=0xFF; Есть режим таймера CTC - очистка по сравнению. В этом режиме не надо трогать TCNT регистр, т.к. таймер сам будет сбрасываться тогда когда вы ему укажате. Правда в m8 этот режим есть только у таймера 1 и таймера 2. Если вам нужно отмерять один "тик", то на таймере 2 инициализация будет выглядеть так: #define WGM21 3 #define OCIE2 7 OCR2 = 1; TCCR2 = 0x07 | (1 << WGM21); TIMSK = (1 << OCIE2); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hc2hunter 0 2 января, 2008 Опубликовано 2 января, 2008 · Жалоба Если вам нужно отмерять один "тик", то на таймере 2 инициализация будет выглядеть так: #define WGM21 3 #define OCIE2 7 OCR2 = 1; TCCR2 = 0x07 | (1 << WGM21); TIMSK = (1 << OCIE2); Да, я встречал подобную запись, когда разбирал чей-то код. Однако работаю в CVAVR, а там такое не прокатывает... не знает он что такое WGM и OCIE2... :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость =AVR= 2 января, 2008 Опубликовано 2 января, 2008 · Жалоба Как не знает? Даже сразу после того, как ему сказали #define WGM21 и #define OCIE2?? Вот уж поистине ... - Новый год :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hc2hunter 0 2 января, 2008 Опубликовано 2 января, 2008 · Жалоба э... туплю кажись... м-де... :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dim_ON 0 4 января, 2008 Опубликовано 4 января, 2008 · Жалоба Помогите плиз разобраться с таймерами Необходимо что бы Т0 и Т1 работали на переполнение с частотой ЦПУ (это не надо объяснять), а вот Т2 от часового кварца Подключаю часовой кварц к PC6, PC7 (ATmega16, 32), а инициализация будет, следующей?: #define TIMER_CLK_DIV8 0x02 ///< Timer clocked at 32.768KHz/8 #define TIMER_PRESCALE_MASK 0x07 ///< Timer Prescaler Bit-Mask #define TIMER2OVERFLOW_INT 5 volatile unsigned long Timer2Reg0; void timer2Init(void) { // initialize timer 2 outb(TCCR2, (inb(TCCR2) & ~TIMER_PRESCALE_MASK) | TIMER_CLK_DIV8); // count 32.768KHz/8 outb(TCNT2, 0); // reset TCNT2 sbi(TIMSK, TOIE2); // enable TCNT2 overflow sbi(ASSR, AS2); // switch to asynchronous input (32KHz crystal) Timer2Reg0 = 0; // initialize time registers // attach service to real-time clock interrupt // rtcService() will be called at ((32768/8)/256) = 16Hz timerAttach(TIMER2OVERFLOW_INT, rtcService); sei(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 4 января, 2008 Опубликовано 4 января, 2008 · Жалоба Часть ветки перенесена сюда: http://electronix.ru/forum/index.php?showtopic=41484&hl= Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aesthete Animus 0 4 января, 2008 Опубликовано 4 января, 2008 · Жалоба Помогите плиз разобраться с таймерами Необходимо что бы Т0 и Т1 работали на переполнение с частотой ЦПУ (это не надо объяснять), а вот Т2 от часового кварца Подключаю часовой кварц к PC6, PC7 (ATmega16, 32), а инициализация будет, следующей?: Разрешите приведу код из doc2505 небольшими изменениями для иициализации часового кварца void init_Ex3(void) { ASSR= 1<<AS2; // Enable asynchronous // mode // Clear timer on compare match / Timer Clock = // system clock / 1024 TCCR2 = (1<<CTC2)|(1<<CS22)|(1<<CS21)|(1<<CS20); TIFR= 1<<OCF2; // Clear OCF2/ Clear // pending interrupts TIMSK= 1<<OCIE2; // Enable Timer2 Output // Compare Match Interrupt OCR2= 31; // Set Output Compare // Value to 32 DDRB= 0xFF; // Set Port B as output while (ASSR&(1<<OCR2UB)); // Wait for registers to update } В этом случае, прерывание по сравнению таймера №2 (SIG_OUTPUT_COMPARE2) будет вызываться раз в секунду. Хочу заметить, что в документации для регистра OCR2 задано неверное значение, у них вместо 31 написано 32. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dim_ON 0 5 января, 2008 Опубликовано 5 января, 2008 · Жалоба Сори за офф, но решил не создавать новой темы, а спросить тут. Правильно ли я понимаю функционирование таймеров/счетчиков: Режим переполнения(overflow) - это когда таймеры считают синхроипульсы, и прерывание происходит когда MAX_COUNT-->0, при этом MAX_COUNT зависит от размерности таймера. Режим совпадения(outcompare) - это когда в регистр OCR записывают MAX_COUNT, счетчик каждый такт сравнивает содержимое регистров OCR и TCNT, при равенстве происходит прерывание. Режим захвата и сравнения - это когда состояние регистра TCNT сохраняется в регистре ICR по активному фронту ноги ICP, и для сравнения нам надо считывать ICR Асинхронный режим - это когда источником синхроимпульсов является резонатор, подключенный к ногам TOSC1 и TOSC2 Режим генерации ШИМ - это отдельная тема Режим подсчета внешних событий - это когда содержимое регистра TCNT увеличивается при...?? Не пойму, можно ли настраивать что бы работали на инкремент или декремент? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться