Перейти к содержанию
    

Ведь мне никто не запрещает в прерывании остановить таймер, выполнить все что мне нужно, а по выходу из прерывания снова его запустить?

Никто не запрещает.

 

С другой стороны, никто не запрещает также запустить таймер с одинаковыми интервалами времени. И пусть себе тикает.

В обработчике прерывания таймера - взводить флажек, сигнализирующий, что некое событие наступило.

И уже потом "в спокойной обстановке" тобиш в основном цикле программы проверить флажек и выполнить все, что требуется для обработки этого события..

 

С моей точки зрения процедура-обработчик может быть сколь угодно долгой.

Конечно может, но меня например несколько раздражает когда жмешь 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);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если вам нужно отмерять один "тик", то на таймере 2 инициализация будет выглядеть так:

 

#define WGM21 3

#define OCIE2 7

 

OCR2 = 1;

TCCR2 = 0x07 | (1 << WGM21);

TIMSK = (1 << OCIE2);

 

Да, я встречал подобную запись, когда разбирал чей-то код.

Однако работаю в CVAVR, а там такое не прокатывает... не знает он что такое WGM и OCIE2... :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость =AVR=

Как не знает? Даже сразу после того, как ему сказали #define WGM21 и #define OCIE2?? Вот уж поистине ... - Новый год :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите плиз разобраться с таймерами

Необходимо что бы Т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();
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите плиз разобраться с таймерами

Необходимо что бы Т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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сори за офф, но решил не создавать новой темы, а спросить тут.

Правильно ли я понимаю функционирование таймеров/счетчиков:

Режим переполнения(overflow) - это когда таймеры считают синхроипульсы, и прерывание происходит когда MAX_COUNT-->0, при этом MAX_COUNT зависит от размерности таймера.

 

Режим совпадения(outcompare) - это когда в регистр OCR записывают MAX_COUNT, счетчик каждый такт сравнивает содержимое регистров OCR и TCNT, при равенстве происходит прерывание.

 

Режим захвата и сравнения - это когда состояние регистра TCNT сохраняется в регистре ICR по активному фронту ноги ICP, и для сравнения нам надо считывать ICR

 

Асинхронный режим - это когда источником синхроимпульсов является резонатор, подключенный к ногам TOSC1 и TOSC2

 

Режим генерации ШИМ - это отдельная тема

 

Режим подсчета внешних событий - это когда содержимое регистра TCNT увеличивается при...??

Не пойму, можно ли настраивать что бы работали на инкремент или декремент?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...