Например TDA7294

Форум РадиоКот • Просмотр темы - Таймеры/счётчики в AVR
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Вт янв 28, 2020 23:22:25

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 1051 ]     ... , , , 51, ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вт дек 25, 2018 17:13:16 
Друг Кота
Аватар пользователя

Карма: 38
Рейтинг сообщений: 1045
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 3952
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
обычно (если нет каки либо предпочтений к "а" и "б") этого достаточно.
этого достаточно чтобы получить 2 сдвинутых по фазе счета таймера прерывания с изменяемой длительностью периода.
если надо 3 разнофазных прерывания то используют или режим с тор=0xFFFF (прерывания А, Б, и переполнение) или, если нужно при этом изменять период, задействуют режим 12 (стс, тор=icr1), правда в этом случае захватом уже не воспользоваться...

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Чт мар 28, 2019 08:13:33 
Открыл глаза

Зарегистрирован: Пн дек 19, 2016 10:20:28
Сообщений: 70
Рейтинг сообщения: 0
Добрый день! Пытаюсь разобраться с таймерами 328й атмеги.
Конкретнее с 8ми битным таймером0.

Хочу запустить его в режиме CTC, чтобы он по совпадению со счетчиком, изменял состояние ноги OC0A.
Вроде все сделал по даташиту, но... Не работает.

Вот код:

Код:
 //Настраиваем вывод таймера OC0A (PD6) на вывод
  PORTD&= ~(1<<PIND6);         //Значение по умолчанию 0.
  DDRD|= (1<<DDD6);            //Вывод PD6 - выход
 

  //Настраиваем Таймер0
  TCCR0A|= (1<<WGM01); //Выставляем режим CTC
  TCCR0A|= (1<<COM0A0); //Инвертируем значение OC0A (PD6) по срабатыванию таймера.

  OCR0A=0xFA;          //Выставляем значение счетчика (к примеру 0xFA)

  TCCR0B|= (1<<CS02)|(1<<CS00);  //Ставим предделитель на значение 1024. CS02=1. CS00=1. Запускаем генерацию


И... Ничего не происходит!
Хелп! :)

P.S. Заработало! Перед заданием режимов добавил в код обнуление регистров TCCR0A и TCCR0B. Странно, ведь после ресета они итак должны быть по умолчанию обнулены...


Вернуться наверх
 
JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

Отличное качество, подтвержденное более чем 600,000 пользователей! Более 10,000 заказов в день.

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/quote

Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Пн апр 01, 2019 18:33:07 
Родился

Зарегистрирован: Пн апр 01, 2019 18:19:22
Сообщений: 3
Рейтинг сообщения: 0
Здравствуйте.
Могли бы помочь через аппаратный (желательно, но можно и программный) ШИМ контроллера Attiny2313A сделать анимацию RGB-ленты (плавное перетекание цветов друг в друга, любое их смешивание, лишь бы плавное)? Схема, код, а также предпринимавшиеся действия описаны здесь.
Результат на данный момент: смешивание есть для всех цветов, кроме красного. Как только очередь доходит до него, красный включается мгновенно и горит на полной яркости до переключения на следующие цвета. Подозреваю, что это из-за попытки решить задачу "в лоб", повесив по 1 цвету на каждый таймер, но т.к. таймеров всего 2, а цветов 3, получается такая накладка.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $88 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Пн апр 01, 2019 18:53:40 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 83
Рейтинг сообщений: 1551
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 14480
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
ссылка у вас кривая

Добавлено after 1 minute 9 seconds:
и по ссылке не видно, чтобы вы вообще пытались заставть R-канал хоть как-то ШИМ-ировать.

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
удивительно, но при взгляде на многих сверху ничего не меняется...

клавиатура частенько сбоит - пропускает буквы. так что прошу простить, если что...


Вернуться наверх
 
Molex: соединения, связь, инновации

Развитие техники предъявляет все более высокие требования к разъемам и скорости передачи данных. Соединения становятся прецизионными и наукоемкими изделиями. На сегодня Molex – это не только высокотехнологичные разъёмы, но и инновационные устройства передачи данных.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Пн апр 01, 2019 18:58:55 
Родился

Зарегистрирован: Пн апр 01, 2019 18:19:22
Сообщений: 3
Рейтинг сообщения: 0
ссылка у вас кривая

Добавлено after 1 minute 9 seconds:
и по ссылке не видно, чтобы вы вообще пытались заставть R-канал хоть как-то ШИМ-ировать.


Ссылку сразу поправил. Попытка заставить R-канал работать (и вопрос об этом же) в той же теме двумя сообщениями ниже. Цитирую:

Пробовал:
Код:
    // Для R (PB4), т.к. OCR1B аппаратно привязан к ней
    TCCR1B = (1 << ICNC1) | (1 << WGM11); // phase correct PWM mode
    OCR1B = 0x10; // initial PWM pulse width
    TCCR1C = (1 << CS01); // clock source = CLK/8, start PWM

а также
Код:
    // Для R (PD5), т.к. OCR0B аппаратно привязан к ней
    TCCR0B = (1 << FOC0A) | (1 << WGM02); // phase correct PWM mode
    OCR0B = 0x10; // initial PWM pulse width
    TCCR1C = (1 << CS01); // clock source = CLK/8, start PWM

переключая контакт R соответственно с PB4 на PD5. Не сработало


Вернуться наверх
 
Как реализовать минимальное энергопотребление беспроводного микроконтроллера STM32WB55

Система питания беспроводных микроконтроллеров STM32WB55 выглядит непросто, но при этом каждый узел может быть запитан отдельным напряжением, величина которого будет являться наилучшим компромиссом для конкретной тактовой частоты. Это делает STM32WB55 идеальными для создания устройств с батарейным питанием.

Читать статью>>
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вт апр 02, 2019 01:54:24 
Друг Кота

Карма: 54
Рейтинг сообщений: 726
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 3694
Откуда: Ижевск
Рейтинг сообщения: 0
Правильно установите режим работы таймеров. По памяти, что-то типа
Код:
   // Для R (PB4), т.к. OCR1B аппаратно привязан к ней
    TCCR1A = (1 <<COM1B1) | (1 << WGM11); // phase correct PWM mode ICR1
    OCR1B = 0x10; // initial PWM pulse width
    TCCR1B = (1 << WGM13)|(1 << CS11); // clock source = CLK/8, start PWM

//    TCCR1B = (1 << ICNC1) | (1 << WGM11); // phase correct PWM mode
//    OCR1B = 0x10; // initial PWM pulse width
//    TCCR1C = (1 << CS01); // clock source = CLK/8, start PWM

ICR1 нужно установить


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вт апр 02, 2019 21:36:28 
Сверлит текстолит когтями

Карма: 34
Рейтинг сообщений: 229
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Сообщений: 1224
Откуда: Харьков
Рейтинг сообщения: 0
Цитата:
Могли бы помочь через аппаратный (желательно, но можно и программный) ШИМ контроллера Attiny2313A сделать анимацию RGB-ленты (плавное перетекание цветов друг в друга, любое их смешивание, лишь бы плавное)? Схема, код, а также предпринимавшиеся действия описаны здесь.

Это в разы проще делается на WS2811/2812/2815. Или этот вариант не рассматриваем в принципе?

_________________
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Чт апр 04, 2019 14:30:40 
Родился

Зарегистрирован: Пн апр 01, 2019 18:19:22
Сообщений: 3
Рейтинг сообщения: 0
Цитата:
Могли бы помочь через аппаратный (желательно, но можно и программный) ШИМ контроллера Attiny2313A сделать анимацию RGB-ленты (плавное перетекание цветов друг в друга, любое их смешивание, лишь бы плавное)? Схема, код, а также предпринимавшиеся действия описаны здесь.

Это в разы проще делается на WS2811/2812/2815. Или этот вариант не рассматриваем в принципе?

Готовые контроллеры не рассматриваем, т.к. цель - самообразование, изучение МК


Вернуться наверх
 
Распродажа паяльных станций ATTEN и аксессуаров!
Индукционная паяльная станция AT315D - 3 977 ₽, станция паяльная AT80D – 2177 ₽, станция паяльная AT936b – 1000 ₽!

Заходите в раздел акции и спецпредложения на сайте prist.ru, покупайте измерительные приборы, инструмент и паяльно-ремонтное оборудование по специальным ценам.
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Чт апр 04, 2019 17:46:29 
Друг Кота
Аватар пользователя

Карма: 31
Рейтинг сообщений: 400
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3316
Рейтинг сообщения: 0
таймеров всего 2, а цветов 3, получается такая накладка.

три шима можно с 2 таймеров:
Изображение
Код:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

int
main(void)
{
    CLKPR = (1 << CLKPCE);
    CLKPR = (0 << CLKPCE) | (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0);
    DDRB = (0 << DDB7) | (0 << DDB6) | (0 << DDB5) | (1 << DDB4) | (1 << DDB3) | (1 << DDB2) | (0 << DDB1) | (0 << DDB0);
    // Mode: Fast PWM top=0xFF
    // OC0A output: Inverted PWM
    // OC0B output: Disconnected
    TCCR0A = (1 << COM0A1) | (1 << COM0A0) | (0 << COM0B1) | (0 << COM0B0) | (1 << WGM01) | (1 << WGM00);
    TCCR0B = (0 << WGM02) | (0 << CS02) | (1 << CS01) | (0 << CS00);
    // Mode: Fast PWM top=0x00FF
    // OC1A output: Inverted PWM
    // OC1B output: Inverted PWM
    TCCR1A = (1 << COM1A1) | (1 << COM1A0) | (1 << COM1B1) | (1 << COM1B0) | (0 << WGM11) | (1 << WGM10);
    TCCR1B = (0 << ICNC1) | (0 << ICES1) | (0 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (0 << CS10);
    OCR1AL = 200;
    OCR1BL = 127;
    OCR0A = 64;
    // Analog Comparator: Off
    ACSR = (1 << ACD) | (0 << ACBG) | (0 << ACO) | (0 << ACI) | (0 << ACIE) | (0 << ACIC) | (0 << ACIS1) | (0 << ACIS0);

    // Main loop
    while (1)
    {

    }
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Сб ноя 23, 2019 21:04:41 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн ноя 04, 2019 09:58:29
Сообщений: 23
Откуда: г. Нижний Тагил Свердл. обл.
Рейтинг сообщения: 0
Всем привет. Переделываю код с Atmega8 на Attiny13 в AtmelStudio
Это в Atmega8
// Прерывание по захвату Таймера/счетчика 1
ISR(TIMER1_CAPT_vect)
А вот как объявить прерывание по захвату в Attiny13?
Что то я не нашел, открыл <avr/iotn13a.h> там так:
/* Interrupt vectors */
/* Vector 0 is the reset vector */
#define INT0_vect_num 1
#define INT0_vect _VECTOR(1) /* External Interrupt 0 */
#define PCINT0_vect_num 2
#define PCINT0_vect _VECTOR(2) /* External Interrupt Request 0 */
#define TIM0_OVF_vect_num 3
#define TIM0_OVF_vect _VECTOR(3) /* Timer/Counter0 Overflow */
#define EE_RDY_vect_num 4
#define EE_RDY_vect _VECTOR(4) /* EEPROM Ready */
#define ANA_COMP_vect_num 5
#define ANA_COMP_vect _VECTOR(5) /* Analog Comparator */
#define TIM0_COMPA_vect_num 6
#define TIM0_COMPA_vect _VECTOR(6) /* Timer/Counter Compare Match A */
#define TIM0_COMPB_vect_num 7
#define TIM0_COMPB_vect _VECTOR(7) /* Timer/Counter Compare Match B */
#define WDT_vect_num 8
#define WDT_vect _VECTOR(8) /* Watchdog Time-out */
#define ADC_vect_num 9
#define ADC_vect _VECTOR(9) /* ADC Conversion Complete */


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вс ноя 24, 2019 01:26:51 
Друг Кота

Карма: 54
Рейтинг сообщений: 726
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 3694
Откуда: Ижевск
Рейтинг сообщения: 0
Просто у tn13 режима захвата нет.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Чт ноя 28, 2019 19:47:48 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн ноя 04, 2019 09:58:29
Сообщений: 23
Откуда: г. Нижний Тагил Свердл. обл.
Рейтинг сообщения: 0
Доброго времени суток. Делаю простой частотомер на Attiny13 (в рамках самообразования) с выводом значений на семисегментные индикаторы через 74HC595. С регистром разобрался, а вот с выводом значений есть затруднения. Это мой первый опыт программирования микроконтроллеров, как и программирования вообще. (Не считая бэйсика в эпоху ЭВМ). Среда AtmelStudio, симуляция в Proteus. Код...
Пока что бубен мой основной метод познания. Буду благодарен за отклик.
Вложение:
2019-11-28_223530.jpg [175.55 KiB]
Скачиваний: 104
На индикаторах произвольные значения.
http://integrator.adior.ru/index.php/proshivki/430-tajmer-schetchik-t0-mikrokontrollera-attiny13


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Пт ноя 29, 2019 04:24:26 
Друг Кота

Карма: 54
Рейтинг сообщений: 726
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 3694
Откуда: Ижевск
Рейтинг сообщения: 1
По схеме измеряемая частота подается на PB3(PCINT3/CLKI/ADC3). Не увидел обращения к PB3. Не вижу разрешения прерывания PCINT3, не вижу настройки мультиплексора АЦП на работу от аналогового компаратора и разрешения прерывания от оного. CLKI вход внешней частоты тактирования. Вопрос. Куда подается измеряемая частота?
Как вариант. Подать измеряемую частоту на вход PB1(MISO/AIN1/OC0B/INT0/PCINT1). Тогда в коде задействуется прерывание INT0. Первым активным фронтом Fx разрешается работа T0 на отсчет 1 секунды. Каждое прерывание INT0, в течение действия этой секунды, наращивает счетчик Nx. По окончании 1 секунды, прерывания INT0 запрещаются и в счетчике накопится Nx~Fx.
Другой вариант. Не меняя схемы, организовать циклический частотомер прямого счета используя PCINT3. Всё остается как в первом варианте, но на выходе Fx=Nx/2.
Организацию псевдозахвата не предлагаю, т.к. вряд ли в tn13 влезет процедура деления.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вс дек 22, 2019 18:04:04 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн ноя 04, 2019 09:58:29
Сообщений: 23
Откуда: г. Нижний Тагил Свердл. обл.
Рейтинг сообщения: 0
Добрый вечер всем. Вроде бы разобрался. Работает.
Тестировано на ATtiny25/45/85 ---- F_CPU 8 MHz
В протеусе с пипетки подал импульсы на PB2 50 kHz. Получены правильные значения.
Таким образом любй счетчик можно запустить в четыре строки кода. Остальное - логика и обслуга. Но это уже другая история. Продолжение в разработке...
Простой аскетичный и лаконичный счетчик импульсов по внешнему прерыванию.
Если захваченые импульсы умножить на 30, то получим частоту в герцах, которую и подаём.
[50000/(8000000/1024/255)]*31 = 50592 Hz
Вложение:
153021.jpg [103.5 KiB]
Скачиваний: 59

Работа таймера NE555 в астабильном режиме + ATtiny25/45/85 = Ёмкостной датчик уровня топлива.
Примерно так называется мой проект, идея которого прицепилась ко мне как репей. В целом реализация такой концепции мне уже проглядывается.
Работа таймера NE555 смоделирована в симуляторе. Но, как я и ожидал, запихать NE555 + ATtiny25/45/85 с кучей аналоговых элементов в протеус не получится. Simulation is not running in real time due to excessive CPU load. А джельтменский набор юного жестянщика ещё в пути. (программатор, монтажн. платы и пр.) Как придет буду лудить на столе.
Вложение:
Комментарий к файлу: Картинка
2019-12-22_204411.png [94.56 KiB]
Скачиваний: 55
Вложение:
Комментарий к файлу: Полный бак.
2019-12-22_210122.png [94.38 KiB]
Скачиваний: 50

Реальные значения параметров конденсатора пока не известны. Но в пределах десятка пикофарад.
Разницу в частоте между пустым и полным баком как раз и предстоит уловить и представить на индикаторе либо в литрах, либо в процентах.
P.S. Возможно эта тема уже другой ветки форума.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Пн дек 23, 2019 05:26:32 
Друг Кота

Карма: 54
Рейтинг сообщений: 726
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 3694
Откуда: Ижевск
Рейтинг сообщения: 0
По мне, проще сосчитать число импульсов за заданный интервал времени и из, предварительно составленной таблицы, найти и вывести на индикатор уровень топлива. Никаких расчетов не нужно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Пн дек 23, 2019 12:24:18 
Друг Кота
Аватар пользователя

Карма: 38
Рейтинг сообщений: 1045
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 3952
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
когда я делал емкостный ДУТ, то извращался сложнее... на тини 2313 сделал 4 емкостных сенсора (вся генерация в самой тини)
1 и 2 - идут по низу горизонтально один над другим и определяют удельную проницаемость топлива если их показания сходны, или зажигают красную лампу (мало топлива или вода в баке) если показания сильно разные.
3 - вертикальный - замер уровня топлива.
4 - горизонтальный вверху - замер проницаемости паров.
все электроды залиты в бензостойкий компаунд и собраны в конденсаторы (вторая пластина - минус)
такая схема даст низкий температурный дрейф и хорошую стабильность при изменении свойств среды.
Вычисление уровня топлива H=((t3-t4)/(t2-t4))*100%; (ситуацию t2==t4 обрабатываем отдельно -> бак под завязку)

Добавлено after 5 minutes 43 seconds:
правда в машину этот ДУТ так и не попал, пока состав компаунда подбирал да место для датчика изучал - машина продалась...

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Пн дек 23, 2019 20:15:57 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн ноя 04, 2019 09:58:29
Сообщений: 23
Откуда: г. Нижний Тагил Свердл. обл.
Рейтинг сообщения: 0
Сейчас у меня есть над чем подумать, а именно - помехозащищенность. В силу специфики конструкции все будет находиться в непосредственной близости от высоковольтных проводов, мотор - рядная четверка с очень плотной компоновкой. Специфика японского мотопрома (TC - мотоцикл). Обязательным считаю экранирование проводов, ну или ещё чего там. SMD монтаж элементов на одной из пластин ёмкостного зонда, заливка компаундом Loctite, всё внутри бензобака. А возможно ли заранее что то внести в программный код? :dont_know:
почесав за ухом думаю что нет


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вт дек 24, 2019 10:24:04 
Друг Кота
Аватар пользователя

Карма: 38
Рейтинг сообщений: 1045
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 3952
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Металлический бак, чем не экран? Да, я тоже хотел ставить схемку прямо внутрь бака - короче провода = выше чувствительность и меньше помех... так-же стоит усреднять показания от нескольких замеров, это и электрические помехи сгладит (если они всёж просочатся) и плескание топлива...

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Ср дек 25, 2019 19:08:39 
Модератор
Аватар пользователя

Карма: 148
Рейтинг сообщений: 2204
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 15069
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
расскажу, как легко и просто можно из 8-битного таймера (таймер2 в atmega8) сделать 16-битный таймер.
вот такой код я придумал:
Код:
   ; объявляем регистр флагов
.def flags         = R19   ; различные флаги
   ; объявляем флаг
.equ timer2_ready   = 4      ; таймер отработал заданное время

   ; объявляем "старший байт" таймера2
.def count_256      = R20   ; старший байт для Таймера2, счетчик "полных оборотов" таймера
   ; объявляем регистры, где будет находится требуемое время таймера (задержка)
.def delayL         = R21   ; задержка, младший байт
.def delayH         = R22   ; задержка, старший байт

   ; прерывание таймера2, режим СТС
timer2_CTC:

   ; сохраним регистры, которые использует прерывание

sbrc flags, timer2_ready
   ; если задержка выполнена, то идем на выполнение "тела" прерывания
rjmp work

   ; тестируем байты задержки
test_delay:
   ; проверяем старший байт на ноль
tst delayH
   ; если старший байт задержки равен нулю, то сразу идем на задание младшего байта задержки
breq set_delayL
   ; сравним счетчик "полных оборотов" со старшим байтом задержки
cp count_256, delayH
   ; если меньше, то идем на задание "полного оборота"
brlo set_256
   ; счетчик "полных оборотов" стал равен старшему байту, проверяем младший байт на ноль
tst delayL
   ; если младший байт равен нулю, то задержка состоит только из старшего байта и выполнена полностью
   ; поэтому идем на выполнение "тела" прерывания
breq work
   ; иначе сбрасываем счетчик "полных оборотов"
clr count_256
   ; и идем на задание младшего байта задержки
rjmp set_delayL

   ; задание "полного оборота"
set_256:
   ; увеличиваем счетчик "полных оборотов"
inc count_256
ser R16
   ; задаем 255 - "полный оборот"
out OCR2, R16
   ; и выходим из прерывания
rjmp end_timer2

   ; задание младшего байта задержки
set_delayL:
out OCR2, delayL
   ; поставим бит (флаг), что задержка выполнена. точнее, будет выполнена после отработки младшего байта
sbr flags, 1<<timer2_ready

   ; конец прерывания таймера2
end_timer2:
   ; восстановим регистры, которые использует прерывание
reti

work:
   ; сбросим бит (флаг) готовности задержки
cbr flags, 1<<timer2_ready

; "тело" прерывания

   ; идем на задание задержки для следующего цикла таймера
rjmp test_delay

при необходимости, для очень больших задержек точно так же можно расширить 16-битный таймер1 до трех байт.
однажды один человек заказал мне прошивку для генератора импульсов с изменяемой частотой, от 1 Герца (период 1 секунда). там я ему, как раз, расширил таймер1 до трех байтов.

_________________
Мудрость приходит вместе с импотенцией...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Ср дек 25, 2019 19:14:31 
Вымогатель припоя

Карма: 7
Рейтинг сообщений: 118
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 641
Рейтинг сообщения: 0
До кучи покажу свою наработку. Программные таймеры. В МК как правило 1, 2 таймера. В старших моделях уже побольше. И начинающих это всегда сбивает с толку. В программе надо задать несколько временных параметров. А аппаратных таймеров раз и обчелся. Решение - программные таймеры.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 1051 ]     ... , , , 51, ,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Baasil и гости: 10


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y