обычно (если нет каки либо предпочтений к "а" и "б") этого достаточно. этого достаточно чтобы получить 2 сдвинутых по фазе счета таймера прерывания с изменяемой длительностью периода. если надо 3 разнофазных прерывания то используют или режим с тор=0xFFFF (прерывания А, Б, и переполнение) или, если нужно при этом изменять период, задействуют режим 12 (стс, тор=icr1), правда в этом случае захватом уже не воспользоваться...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Добрый день! Пытаюсь разобраться с таймерами 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. Странно, ведь после ресета они итак должны быть по умолчанию обнулены...
Здравствуйте. Могли бы помочь через аппаратный (желательно, но можно и программный) ШИМ контроллера Attiny2313A сделать анимацию RGB-ленты (плавное перетекание цветов друг в друга, любое их смешивание, лишь бы плавное)? Схема, код, а также предпринимавшиеся действия описаны здесь. Результат на данный момент: смешивание есть для всех цветов, кроме красного. Как только очередь доходит до него, красный включается мгновенно и горит на полной яркости до переключения на следующие цвета. Подозреваю, что это из-за попытки решить задачу "в лоб", повесив по 1 цвету на каждый таймер, но т.к. таймеров всего 2, а цветов 3, получается такая накладка.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Могли бы помочь через аппаратный (желательно, но можно и программный) ШИМ контроллера Attiny2313A сделать анимацию RGB-ленты (плавное перетекание цветов друг в друга, любое их смешивание, лишь бы плавное)? Схема, код, а также предпринимавшиеся действия описаны здесь.
Это в разы проще делается на WS2811/2812/2815. Или этот вариант не рассматриваем в принципе?
_________________ Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Могли бы помочь через аппаратный (желательно, но можно и программный) ШИМ контроллера Attiny2313A сделать анимацию RGB-ленты (плавное перетекание цветов друг в друга, любое их смешивание, лишь бы плавное)? Схема, код, а также предпринимавшиеся действия описаны здесь.
Это в разы проще делается на WS2811/2812/2815. Или этот вариант не рассматриваем в принципе?
Готовые контроллеры не рассматриваем, т.к. цель - самообразование, изучение МК
Зарегистрирован: Пн ноя 04, 2019 09:58:29 Сообщений: 102 Откуда: г. Нижний Тагил Свердл. обл.
Рейтинг сообщения:0
Доброго времени суток. Делаю простой частотомер на Attiny13 (в рамках самообразования) с выводом значений на семисегментные индикаторы через 74HC595. С регистром разобрался, а вот с выводом значений есть затруднения. Это мой первый опыт программирования микроконтроллеров, как и программирования вообще. (Не считая бэйсика в эпоху ЭВМ). Среда AtmelStudio, симуляция в Proteus. Код... Спойлер
Код:
// Подключение семисегментных индикаторов с помощью сдвигового регистра 74HC595. // Простой частотометр на Attiny13. #define F_CPU 9600000UL // #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h>
volatile unsigned int edgecounter = 0, counter = 0, n;
// Обработчик прерывания по переполнению Т0, вызывается 4000 раз в секунду ISR(TIM0_OVF_vect){ TCNT0 = 6; // Счетчик Т0 начинает считать с 6, т.к. 1MHz/(256-6) = 4000Hz counter++; }
По схеме измеряемая частота подается на 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 влезет процедура деления.
Зарегистрирован: Пн ноя 04, 2019 09:58:29 Сообщений: 102 Откуда: г. Нижний Тагил Свердл. обл.
Рейтинг сообщения:0
Добрый вечер всем. Вроде бы разобрался. Работает. Тестировано на ATtiny25/45/85 ---- F_CPU 8 MHz В протеусе с пипетки подал импульсы на PB2 50 kHz. Получены правильные значения. Таким образом любй счетчик можно запустить в четыре строки кода. Остальное - логика и обслуга. Но это уже другая история. Продолжение в разработке... Спойлер
ISR(INT0_vect)//External Interrupt { ips++;// На порт PB2 подаем импульсы _П_П_П_П_П_ };
ISR(TIM0_COMPA_vect)//прерывание по совпадению { MAX7219_display_number(ips);//выводим на дисплей цифры ips=0; };
int main (void) { DDRB = 0xFF; // configure PORTB as output PORTB_OUT(4); // Настраиваем 4 пин порта B на выход PORTB_IN(2);
MAX7219_init(); MAX7219_set_intensity(8);
INT0_init(); TIM0_COMPA_init();
sei();// Разрешить глобальные прерывания
while (1){ /*-----*/ } return 0; };
/* Счетчик импульсов. ATtiny25/45/85 F_CPU 8 MHz. Подаём на PB2 импульсы с частотой 50 kHz На индикаторе получаем; 50000/(8000000/1024/255) = 1632 фактическое значение = 1614 */
Простой аскетичный и лаконичный счетчик импульсов по внешнему прерыванию. Если захваченые импульсы умножить на 30, то получим частоту в герцах, которую и подаём. [50000/(8000000/1024/255)]*31 = 50592 Hz
Работа таймера NE555 в астабильном режиме + ATtiny25/45/85 = Ёмкостной датчик уровня топлива. Примерно так называется мой проект, идея которого прицепилась ко мне как репей. В целом реализация такой концепции мне уже проглядывается. Работа таймера NE555 смоделирована в симуляторе. Но, как я и ожидал, запихать NE555 + ATtiny25/45/85 с кучей аналоговых элементов в протеус не получится. Simulation is not running in real time due to excessive CPU load. А джельтменский набор юного жестянщика ещё в пути. (программатор, монтажн. платы и пр.) Как придет буду лудить на столе.
Реальные значения параметров конденсатора пока не известны. Но в пределах десятка пикофарад. Разницу в частоте между пустым и полным баком как раз и предстоит уловить и представить на индикаторе либо в литрах, либо в процентах. P.S. Возможно эта тема уже другой ветки форума.
По мне, проще сосчитать число импульсов за заданный интервал времени и из, предварительно составленной таблицы, найти и вывести на индикатор уровень топлива. Никаких расчетов не нужно.
когда я делал емкостный ДУТ, то извращался сложнее... на тини 2313 сделал 4 емкостных сенсора (вся генерация в самой тини) 1 и 2 - идут по низу горизонтально один над другим и определяют удельную проницаемость топлива если их показания сходны, или зажигают красную лампу (мало топлива или вода в баке) если показания сильно разные. 3 - вертикальный - замер уровня топлива. 4 - горизонтальный вверху - замер проницаемости паров. все электроды залиты в бензостойкий компаунд и собраны в конденсаторы (вторая пластина - минус) такая схема даст низкий температурный дрейф и хорошую стабильность при изменении свойств среды. Вычисление уровня топлива H=((t3-t4)/(t2-t4))*100%; (ситуацию t2==t4 обрабатываем отдельно -> бак под завязку)
Добавлено after 5 minutes 43 seconds: правда в машину этот ДУТ так и не попал, пока состав компаунда подбирал да место для датчика изучал - машина продалась...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Зарегистрирован: Пн ноя 04, 2019 09:58:29 Сообщений: 102 Откуда: г. Нижний Тагил Свердл. обл.
Рейтинг сообщения:0
Сейчас у меня есть над чем подумать, а именно - помехозащищенность. В силу специфики конструкции все будет находиться в непосредственной близости от высоковольтных проводов, мотор - рядная четверка с очень плотной компоновкой. Специфика японского мотопрома (TC - мотоцикл). Обязательным считаю экранирование проводов, ну или ещё чего там. SMD монтаж элементов на одной из пластин ёмкостного зонда, заливка компаундом Loctite, всё внутри бензобака. А возможно ли заранее что то внести в программный код? почесав за ухом думаю что нет
Металлический бак, чем не экран? Да, я тоже хотел ставить схемку прямо внутрь бака - короче провода = выше чувствительность и меньше помех... так-же стоит усреднять показания от нескольких замеров, это и электрические помехи сгладит (если они всёж просочатся) и плескание топлива...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
расскажу, как легко и просто можно из 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
; идем на задание задержки для следующего цикла таймера rjmp test_delay
при необходимости, для очень больших задержек точно так же можно расширить 16-битный таймер1 до трех байт. однажды один человек заказал мне прошивку для генератора импульсов с изменяемой частотой, от 1 Герца (период 1 секунда). там я ему, как раз, расширил таймер1 до трех байтов.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
До кучи покажу свою наработку. Программные таймеры. В МК как правило 1, 2 таймера. В старших моделях уже побольше. И начинающих это всегда сбивает с толку. В программе надо задать несколько временных параметров. А аппаратных таймеров раз и обчелся. Решение - программные таймеры.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 38
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения