====== Таймеры ====== Данная библиотека таймеров покрывает большую часть функциональности таймеров ATmega128. Так как таймеры AVR в разных чипах различаются, нельзя для их использования написать универсальные функции. Описанные функции ATmega128 в большей степени просто примитивные функции для изменения или чтения регистров, но всё же они читаемы, чем сами регистры. ===== Типы данных ===== * **//timer0_prescale//** \\ Тип выбора коэффициента делителя в такте таймера 0. Варианты значений и обозначения: * //TIMER0_NO_PRESCALE// - Делитель не используется. * //TIMER0_PRESCALE_8// - Коэффициент деления 8. * //TIMER0_PRESCALE_32// - Коэффициент деления 32. * //TIMER0_PRESCALE_64// - Коэффициент деления 64. * //TIMER0_PRESCALE_128// - Коэффициент деления 128. * //TIMER0_PRESCALE_256// - Коэффициент деления 256. * //TIMER0_PRESCALE_1024// - Коэффициент деления 1024. * **//timer2_prescale//** \\ Тип выбора коэффициента делителя в такте таймера 2. Варианты значений и обозначения: * //TIMER2_NO_PRESCALE// - Делитель не используется. * //TIMER2_PRESCALE_8// - Коэффициент деления 8. * //TIMER2_PRESCALE_64// - Коэффициент деления 64. * //TIMER2_PRESCALE_256// - Коэффициент деления 256. * //TIMER2_PRESCALE_1024// - Коэффициент деления 1024. * //TIMER2_PRESCALE_T2_FALLING// - Тактовый сигнал идёт по падающему фронту вывода T2. * //TIMER2_PRESCALE_T2_RISING// - Тактовый сигнал идёт по нарастающему фронту вывода T2. * **//timer1_prescale//** * **//timer3_prescale//** \\ Тип выбора коэффициента делителя в такте таймера 1/3. Варианты значений и обозначения („n“ обозначает 1 или 3): * //TIMERn_NO_PRESCALE// - Делитель не используется. * //TIMERn_PRESCALE_8// - Коэффициент деления 8. * //TIMERn_PRESCALE_64// - Коэффициент деления 64. * //TIMERn_PRESCALE_256// - Коэффициент деления 256. * //TIMERn_PRESCALE_1024// - Коэффициент деления 1024. * //TIMERn_PRESCALE_Tn_FALLING// - Тактовый сигнал идёт по спадающему фронту вывода Tn. * //TIMERn_PRESCALE_Tn_RISING// - Тактовый сигнал идёт по нарастающему фронту вывода Tn. * **//timer1_ctc_top//** * **//timer3_ctc_top//** \\ Тип выбора максимального значения у счётчика режима CTC таймера 1/3. Варианты значений и обозначения („n“ обозначает 1 или 3): * //TIMERn_CTC_TOP_OCRA// - Максимальное значение назначается регистром сравнения А таймера 1/3. * //TIMERn_CTC_TOP_ICR// – Максимальное значение назначается регистром счётчика событий таймера 1/3. * **//timer1_fast_pwm_top//** * **//timer3_fast_pwm_top//** \\ Тип выбора максимального значения у счётчика быстрого режима ШИМ таймера 1/3. Варианты значений и обозначения („n“ обозначает 1 или 3): * //TIMERn_FAST_PWM_TOP_256// - Максимальное значение 255. * //TIMERn_FAST_PWM_TOP_512// - Максимальное значение 511. * //TIMERn_FAST_PWM_TOP_1024// - Максимальное значение 1023. * //TIMERn_FAST_PWM_TOP_ICR// - Максимальное значение назначается регистром счётчика событий таймера 1/3. * //TIMERn_PAST_PWM_TOP_OCRA// - Максимальное значение назначается регистром сравнения А таймера 1/3. * **//timer1_fast_pwm_output_mode//** * **//timer1_fast_pwm_output_mode//** \\ Тип выбора выходов таймера 1/3 в быстром режиме ШИМ. Варианты значений и обозначения („n“ обозначает 1 или 3): * //TIMERn_FAST_PWM_OUTPUT_DISABLE// - Сигнал ШИМ не доходит до вывода. * //TIMERn_FAST_PWM_OUTPUT_TOGGLE_ON_MATCH// - Вывод становится обратным, когда счётчик приобретает значение регистра сравнения. * //TIMERn_FAST_PWM_OUTPUT_CLEAR_ON_MATCH// - Вывод становится низким, когда счётчик приобретает значение регистра сравнения и высоким, когда счётчик достигает нуля. * //TIMERn_FAST_PWM_OUTPUT_SET_ON_MATCH// - Вывод становится высоким, когда счётчик приобретает значение регистра сравнения, и низким, когда счётчик достигает нуля. ===== Функции ===== * **//void timer0_init_normal(timer0_prescale prescale)//** \\ Установка таймера 0 в нормальный режим. В этом режиме таймер считает до 255 включительно и единственное происходящее событие – это переполнение. Параметры: * //prescale// - Коэффициент делителя такта. * **//void timer2_init_normal(timer2_prescale prescale)//** \\ Установка таймера 2 в нормальный режим. В этом режиме таймер считает до 255 включительно и единственным событием является переполнение. Два коэффициента делителя такта позволяют установить источником тактового сигнала таймера вывод Т2. Параметры: * //prescale// - Коэффициент делителя такта или источник тактового сигнала. * **//void timer0_stop()//** * **//void timer2_stop()//** \\ Остановка таймера 0/2. * **//unsigned char timer0_get_value(void)//** * **//unsigned char timer2_get_value(void)//** \\ Возвращение текущего значения счётчика таймера 0/2. Параметры: * Возвращает текущее значение 8-битного счётчика. * **//void timer0_set_value(unsigned char value)//** * **//void timer2_set_value(unsigned char value)//** \\ Назначение нового значения счётчика таймера 0/2. Параметры: * //value// - Новое значение 8-битного счётчика. * **//void timer0_overflow_interrupt_enable(bool enable)//** * **//void timer2_overflow_interrupt_enable(bool enable)//** \\ Разрешение или запрещение прерывания переполнения таймера 0/2. Вектор прерывания TIMERn_OVF_vect где „n“ - это 0 или 2. Параметры: * //enable// - Значение //true/false// для запрета или разрешения прерывания. //true// разрешает, //false// запрещает. * **//bool timer0_overflow_flag_is_set(void)//** * **//bool timer2_overflow_flag_is_set(void)//** \\ Контроль флага переполнения таймера 0/2. Параметры: * Возвращает //true//, если переполнение произошло, и //false//, если нет. * **//void timer0_overflow_flag_clear(void)//** * **//void timer2_overflow_flag_clear(void)//** \\ Обнуление флага событий при переполнении таймера 0/2. * **//void timer1_init_normal(timer1_prescale prescale)//** * **//void timer3_init_normal(timer3_prescale prescale)//** \\ Установка таймера 1/3 в нормальный режим. В этом режиме таймер считает до 65535 включительно и единственным происходящим событием является переполнение. Параметры: * //prescale// - Коэффициент делителя такта. * **//void timer1_init_ctc(timer1_prescale prescale, timer1_ctc_top top)//** * **//void timer3_init_ctc(timer3_prescale prescale, timer3_ctc_top top)//** \\ Установка режима CTC (англ. //Clear Timer on Compare Match//) таймера 1/3. В этом режиме таймер считает не до 65535, а до выбранного значения регистра и при желании вызывает прерывание по его достижении. Параметры: * //prescale// - Коэффициент делителя такта. * //top// - Выбор регистра максимального значения таймера. Можно выбрать между двумя регистрами, для изменения которых существуют отдельные функции. Оба регистра можно настроить на прерывание при достижении верхушки таймера. * **//void timer1_init_fast_pwm(timer1_prescale prescale, timer1_fast_pwm_top top, timer1_fast_pwm_output_mode output_a, timer1_fast_pwm_output_mode output_b, timer1_fast_pwm_output_mode output_c)//** * **//void timer3_init_fast_pwm(timer3_prescale prescale, timer3_fast_pwm_top top, timer3_fast_pwm_output_mode output_a, timer3_fast_pwm_output_mode output_b, timer3_fast_pwm_output_mode output_c)//** \\ Настройка режима таймера 1/3 на запуск быстрой ШИМ. В этом режиме значение, до которого считает таймер (т.е. период сигнала ШИМ), выборочное. У таймера 3 ШИМ единицы для генерирования сигнала (A, B и C). Все они имеют устанавливаемый выход. Параметры: * //prescale// - Коэффициент делителя такта. * //top// - Выбор максимального значения таймера. Выбрать можно между константами и двумя регистрами. Оба регистра можно настроить на совершение прерывания при достижении верхушки счётчика. * //output_a// - Настройка выходного вывода A. * //output_b// - Настройка выходного вывода B. * //output_c// - Настройка выходного вывода C. * **//void timer1_stop()//** * **//void timer3_stop()//** \\ Остановка таймера 1/3. * **//unsigned char timer1_get_value(void)//** * **//unsigned char timer3_get_value(void)//** \\ Возвращение текущего значения счётчика таймера 1/3.Параметры: * Возвращает текущее значение 16-битного счётчика. * **//void timer1_set_value(unsigned char value)//** * **//void timer3_set_value(unsigned char value)//** \\ Назначение нового значения счётчика таймера 1/3. Параметры: * //value// - Новое значение 16-битного счётчика. * **//unsigned short timer1_get_compare_match_unitA_value(void)//** * **//unsigned short timer1_get_compare_match_unitB_value(void)//** * **//unsigned short timer1_get_compare_match_unitC_value(void)//** * **//unsigned short timer3_get_compare_match_unitA_value(void)//** * **//unsigned short timer3_get_compare_match_unitB_value(void)//** * **//unsigned short timer3_get_compare_match_unitC_value(void)//** \\ Возвращает значение сравнения единице генерирования сигнала A/B/C таймера 1/3. Параметры: * Возвращает значение 16-битной единицы регистра сравнения. * **//void timer1_set_compare_match_unitA_value(unsigned short value)//** * **//void timer1_set_compare_match_unitB_value(unsigned short value)//** * **//void timer1_set_compare_match_unitC_value(unsigned short value)//** * **//void timer3_set_compare_match_unitA_value(unsigned short value)//** * **//void timer3_set_compare_match_unitB_value(unsigned short value)//** * **//void timer3_set_compare_match_unitC_value(unsigned short value)//** \\ Назначает значение сравнения единицы генерирования сигнала A/B/C таймера 1/3. Параметры: * //value// - Новое 16-битное значение сравнения. * **//unsigned short timer1_get_input_capture_value(void)//** * **//unsigned short timer3_get_input_capture_value(void)//** \\ Возвращение значения счётчика событий таймера 1/3. Параметры: * Возвращает значение регистра 16-битного счётчика событий. * **//void timer1_set_input_capture_value(unsigned short value)//** * **//void timer3_set_input_capture_value(unsigned short value)//** \\ Назначает значение регистра счётчика событий таймера 1/3. Параметры: * //value// - Новое значение 16-битного счётчика событий. * **//void timer1_overflow_interrupt_enable(bool enable)//** * **//void timer3_overflow_interrupt_enable(bool enable)//** \\ Запрещение или разрешение прерывания переполнения таймера 1/3. Вектор прерывания TIMERn_OVF_vect, где „n“ – это 1 или 3. Параметры: * //enable// - Значение //true/false// для разрешения или запрета прерывания. //true// разрешает, //false// запрещает. * **//void timer1_compare_match_unitA_interrupt_enable(bool enable)//** * **//void timer1_compare_match_unitB_interrupt_enable(bool enable)//** * **//void timer1_compare_match_unitC_interrupt_enable(bool enable)//** * **//void timer3_compare_match_unitA_interrupt_enable(bool enable)//** * **//void timer3_compare_match_unitB_interrupt_enable(bool enable)//** * **//void timer3_compare_match_unitC_interrupt_enable(bool enable)//** \\ Разрешает или запрещает таймеру 1/3 прерывание события сравнения единицы генерирования сигнала A/B/C. Вектор прерывания – TIMERn_COMPx_vect, где „n“ – это 1 или 3 и „x“ - A, B или C. Параметры: * //enable// - Значение //true/false// для разрешения или запрета прерывания. //true// разрешает, //false// запрещает. * **//void timer1_input_capture_interrupt_enable(bool enable)//** * **//void timer3_input_capture_interrupt_enable(bool enable)//** \\ Разрешение или запрет прерывания счётчика событий таймера 1/3. Вектор прерывния TIMERn_CAPT_vect, где „n“ - это 1 или 3. Параметры: * //enable// - Значение //true/false// для разрешения или запрета прерывания. //true// разрешает, //false// запрещает. * **//bool timer1_overflow_flag_is_set(void)//** * **//bool timer3_overflow_flag_is_set(void)//** \\ Контроль совершения переполнения таймера 1/3. Параметры: * Возвращает значение //true//, если переполнение произошло, и //false//, если нет. * **//bool timer1_input_capture_flag_is_set(void)//** * **//bool timer3_input_capture_flag_is_set(void)//** \\ Контроль флага счётчика событий таймерa 1/3. Параметры: * Возвращает значение //true//, если событие произошло, и //false//, если нет. * **//void timer1_overflow_flag_clear(void)//** * **//void timer3_overflow_flag_clear(void)//** \\ Обнуление флага события переполнения таймера 1/3. * **//void timer1_input_capture_flag_clear(void)//** * **//void timer3_input_capture_flag_clear(void)//** \\ Обнуление флага счётчика событий таймера 1/3. ===== Пример ===== В примере таймер 0 устанавливается в обычный режим счёта и разрешается прерывание переполнения. #include #include // Программный отрезок прерывания ISR(TIMER0_OVF_vect) { } int main(void) { // Таймер 0 в нормальный режим, делитель такта 32 timer0_init_normal(TIMER0_PRESCALE_32); // Разрешение прерывания переполнения таймера 0 timer0_overflow_interrupt_enable(true); // Глобальное разрешение прерывания sei(); }