Вопрос по таймеру в ATtiny25. Пока всё в Протеусе, реальное железо будет позже. Выставляю биты CTC1, PWM1A, COM1A1, заношу все необходимые данные, таймер запускается. По даташиту в таком случае выход OC1A (PB1) должен выдавать шим-сигнал, инверсный выход !OC1A (PB0) должен молчать (not connected). До запуска таймера на PB0 стояла единица. В тот момент, когда таймер запускается, на PB0 появляется ноль, после остановки - снова единица. Должно ли так быть в реальном железе?
Перевожу таймер в Normal mode (PWM1A = 0) - такой проблемы нет.
_________________ Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Опять расхождение Proteus vs реальное железо. ATtiny25/45/85, Proteus 8.17SP2, WinAVR. Пишу так: void pwm_init(unsigned char prescaler, unsigned char divider, unsigned char width) { OCR1A=width; OCR1C=divider-1; TCCR1=BIT(CTC1)|BIT(COM1A1)|BIT(PWM1A)|(prescaler & 0xF); } Вся остальная инициализация в начале мейна и тут не играет роли. Задаю divider=16, prescaler=1, width=4. Тактирование от часового кварца 32768 Гц. Должна выдаваться частота 2048 Гц, в железе всё чётко, в Протеусе же частота существенно выше - пищалка на выходе пищит более высоким тоном, как будто divider на единицу меньше. Глюк в библиотеке и я чего-то не понимаю?
_________________ Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Харьков, ну так давай проект в Протеусе, а мы проверим. Не верить же тебе на слово. Баги в Протеусе имеются но, как правило, в хитрых режимах. Типа, sleep, wdt...
Как раз со слипом проблем не встречал. Весь проект довольно специфический (и ещё не совсем готовый). Вытащил необходимый кусочек и вставил в отдельный файл. Файл переименовать в *.pdsprj, не распаковывать. По даташиту fPWM = fTCK1 / (OCR1C + 1), поэтому в функции явно вычитаю единицу перед записью в регистр. Должно выдать 2048 Гц (32768 / 16). В железе реально 2048 Гц, в Протеусе существенно больше, как будто единица вычитается ещё раз.
Получится проверить на более старых или более новых версиях Протеуса без перекомпиляции прошивки?
На счет регистра 0<<COM2B1 - когда надо я его включаю. Беспокоит частота которая не меняется, меняется только скважность, длинна периода остается неизменной, хотя в регистр OCR2A все записывается верно.
kote52, Mode: Fast PWM top=OCR2A - это будет, когда WGM2[2:0] = 111 А вы WGM22 обнуляете, когда присваиваете значение CS2[2:0] регистру TCCR2B И получается у вас WGM2[2:0] = 011, что соответствует Fast PWM top=OxFF
И получается у вас WGM2[2:0] = 011, что соответствует Fast PWM top=OxFF
В Протусе прогнал, было TCCR2B 0b00001100 после инициализации, как начал проигрывать мелодию изменилось 0b00000011. Какой выход? Писать полность вместе с WGM22?
kote52, вариант 1 - да, писать вместе с WGM22 Вариант 2 - определить дефайны для всех режимов обоих регистров TCCR и присваивать дефайны. Плюс - все биты собраны в одном месте и забыть где то доприсвоить бит мала вероятность Вариант 3 - использовать битовую арифметику при присвоении CS2x - сначала обнулить три бита CS, потом поднять нужные. Но с точки зрения кода это больше операций. Для себя я б остановилась на дефайнах (или вообще на отдельной функции установки частоты и включения/выключения звука. Тогда все настройки таймера будут собраны в одном месте и битики не будут теряться)
Зарегистрирован: Пт мар 19, 2021 08:58:45 Сообщений: 118
Рейтинг сообщения:0
Уважаемые форумчане, подскажите пожалуйста в чем проблема? Настроика таймеров в atmega328p Спойлерпривожу настройку только таймеров, порты там все стандартно на выход
При таких настройках на выходе OCR1B и OCR2B имею импульс в 4uS. Спойлер Отключаем Таймер1, все нормально, импульсов нет. Таймер1 управляет через RC цепь TL494, Таймер0 и Таймер2 полевиками, как быть когда нужно вообще убрать сигнал в 0 на OCR1B и OCR2B, отключать Спойлер
а что можно подсказать, если не известно, что программа делает и что она должна делать?
да я вроде выше описал "Таймер1 управляет через RC цепь TL494, Таймер0 и Таймер2 полевиками, как быть когда нужно вообще убрать сигнал в 0 на OCR1B и OCR2B." Зачем мне приоткрытые полевики? нет можно конечно оставить так, и отключать ногу от таймера как писал выше... но я хотел разобрать в причине появления этого импульса 4 uS, я накосячил, или же в работу тамеров 0 и 2 влияет как то таймер1?
При использовании ШИМ и значении OCRn = 0 на выводе всегда будет "иголка"… убирается она только путём перевода вывода на вход при значении OCRn = 0, при других значениях вывод переводится на выход. При этом затвор транзистора не должен оставаться без подтяжки к общей шине.
При использовании ШИМ и значении OCRn = 0 на выводе всегда будет "иголка"
Уважаемый VNS мне это известно, но не 4 микросекунды же иголка должна быть? и почему нет иголок когда отключаю Таймер1 вообще(настройки по нолям для Т1)?
Последний раз редактировалось kote52 Вт фев 18, 2025 14:08:29, всего редактировалось 1 раз.
kote52, нужна правильная настройка самих портов. порты, на которые подключаются выходы сравнения (OCRху), нужно настроить как выходы и записать туда ноль. и когда ты отключаешь выходы сравнения от портов, то там сразу установятся нули.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Зарегистрирован: Пт мар 19, 2021 08:58:45 Сообщений: 118
Рейтинг сообщения:0
Спасибо всем откликнувшимся! Но эти иглы должны пропасть когда Out A или B будут Inverted PWR. А у меня получается низкий уровень на 4uS. Опять же если у отключаю Таймер 1, все в норме!
Вопрос по таймеру 1 в ATtiny85. Использую его, чтобы издавать звук. Задаю параметры таймера в OCR1B и OCR1C, потом выставляю биты PWM1B, COM1B1, CTC1 и настройки prescaler. Затем меняю OCR1B и OCR1C (иногда и prescaler) на лету, вычитывая их из PROGMEM. Проверяю в Протеусе - в эти регистры иногда пишется что попало, если перед записью не остановить таймер: TCCR1=0. Причём если начинает глючить, то продолжает, пока не остановишь таймер полностью. В железе пока этого глюка не замечал. Очередной баг Протеуса или более глубокая проблема? Проблема началась после смены выхода OC1A на OC1B с соответствующими изменениями в регистрах (в дальнейшем планируется использовать и OC0B). Если это окажется важно, чип тактируется от встроенного генератора 128 кГц. Вот так работает всегда:
И ещё вопрос. Существуют ли AVR микроконтроллеры, которые имеют четыре таймера (или больше) с ШИМ-выходами? Функциональность нужна идентичная таймеру 1 в tiny85 - выбор предделителя 2⁰, 2¹, 2² и т. д. и деление частоты на любой коэффициент от 2 до 255 (реально нужны от 30 до 242). Из остального - минимум 8 к флэш, 256 байт оперативной и три линии ввода вывода без учёта ШИМ-выходов (если тактировать от кварца - и без учёта линий под кварц).
_________________ Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения