Например TDA7294

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



Текущее время: Вс янв 26, 2020 18:32:25

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


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



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

Карма: 38
Рейтинг сообщений: 1042
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 3944
Откуда: Сердце Пармы
Рейтинг сообщения: 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
Рейтинг сообщений: 1545
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 14474
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
ссылка у вас кривая

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

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

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


Вернуться наверх
 
DC/DC-преобразователи: принципы работы и уникальные решения Maxim Integrated

Что нового можно сказать про DC/DC? Написаны десятки статей, а самостоятельное изготовление преобразователя мощностью от единиц Вт до нескольких кВт даже в домашних условиях не составляет большого труда. Тем не менее, когда речь идет о микро-, или даже нано-ваттах, проектировщик может столкнуться с рядом трудностей. Грамотная схемотехника системы питания не возможна без знания основ работы DC/DC преобразователей. Освежить базовые знания и узнать об особенностях проектирования узлов питания мобильного устройства с оптимальным энергопотреблением можно из следующей статьи.

Читать статьи>>
Не в сети
 Заголовок сообщения: 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

Представив двухъядерные беспроводные микроконтроллеры STM32WB для IoT-приложений, компания STMicroelectronics предлагает разработчикам экосистему, включающую в себя отладочные платы, примеры кода для микроконтроллера, готовое ПО всех уровней и большой массив документации.

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

Карма: 54
Рейтинг сообщений: 724
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 3693
Откуда: Ижевск
Рейтинг сообщения: 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
Рейтинг сообщений: 401
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3311
Рейтинг сообщения: 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
Рейтинг сообщений: 724
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 3693
Откуда: Ижевск
Рейтинг сообщения: 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]
Скачиваний: 101
На индикаторах произвольные значения.
http://integrator.adior.ru/index.php/proshivki/430-tajmer-schetchik-t0-mikrokontrollera-attiny13


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

Карма: 54
Рейтинг сообщений: 724
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 3693
Откуда: Ижевск
Рейтинг сообщения: 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]
Скачиваний: 56

Работа таймера 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]
Скачиваний: 54
Вложение:
Комментарий к файлу: Полный бак.
2019-12-22_210122.png [94.38 KiB]
Скачиваний: 49

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


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

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


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

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

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


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

Карма: 148
Рейтинг сообщений: 2204
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 15064
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 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 часа


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

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


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

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


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