Вопрос по таймеру в 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
[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4667254#p4667254"]И получается у вас WGM2[2:0] = 011, что соответствует Fast PWM top=OxFF[/uquote]
В Протусе прогнал, было TCCR2B 0b00001100 после инициализации, как начал проигрывать мелодию изменилось 0b00000011. Какой выход? Писать полность вместе с WGM22?
kote52, вариант 1 - да, писать вместе с WGM22
Вариант 2 - определить дефайны для всех режимов обоих регистров TCCR и присваивать дефайны. Плюс - все биты собраны в одном месте и забыть где то доприсвоить бит мала вероятность
Вариант 3 - использовать битовую арифметику при присвоении CS2x - сначала обнулить три бита CS, потом поднять нужные. Но с точки зрения кода это больше операций.
Для себя я б остановилась на дефайнах (или вообще на отдельной функции установки частоты и включения/выключения звука. Тогда все настройки таймера будут собраны в одном месте и битики не будут теряться)
Уважаемые форумчане, подскажите пожалуйста в чем проблема?
Настроика таймеров в atmega328p
Спойлерпривожу настройку только таймеров, порты там все стандартно на выход
При таких настройках на выходе OCR1B и OCR2B имею импульс в 4uS.
Спойлер
Отключаем Таймер1, все нормально, импульсов нет. Таймер1 управляет через RC цепь TL494, Таймер0 и Таймер2 полевиками, как быть когда нужно вообще убрать сигнал в 0 на OCR1B и OCR2B, отключать
Спойлер
[uquote="Starichok51",url="/forum/viewtopic.php?p=4683827#p4683827"]TCCR0A&=~(1<<COM0B1);
ну, и для остальных строк то же самое.[/uquote]
да ваша правда, дал маху, ну а что с импульсами то, подскажите?
[uquote="Starichok51",url="/forum/viewtopic.php?p=4683877#p4683877"]а что можно подсказать, если не известно, что программа делает и что она должна делать?[/uquote]
да я вроде выше описал "Таймер1 управляет через RC цепь TL494, Таймер0 и Таймер2 полевиками, как быть когда нужно вообще убрать сигнал в 0 на OCR1B и OCR2B." Зачем мне приоткрытые полевики? нет можно конечно оставить так, и отключать ногу от таймера как писал выше... но я хотел разобрать в причине появления этого импульса 4 uS, я накосячил, или же в работу тамеров 0 и 2 влияет как то таймер1?
При использовании ШИМ и значении OCRn = 0 на выводе всегда будет "иголка"… убирается она только путём перевода вывода на вход при значении OCRn = 0, при других значениях вывод переводится на выход. При этом затвор транзистора не должен оставаться без подтяжки к общей шине.
[uquote="VNS",url="/forum/viewtopic.php?p=4683918#p4683918"]При использовании ШИМ и значении OCRn = 0 на выводе всегда будет "иголка"[/uquote]
Уважаемый VNS мне это известно, но не 4 микросекунды же иголка должна быть? и почему нет иголок когда отключаю Таймер1 вообще(настройки по нолям для Т1)?
Последний раз редактировалось kote52 Вт фев 18, 2025 14:08:29, всего редактировалось 1 раз.
kote52, нужна правильная настройка самих портов.
порты, на которые подключаются выходы сравнения (OCRху), нужно настроить как выходы и записать туда ноль.
и когда ты отключаешь выходы сравнения от портов, то там сразу установятся нули.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Спасибо всем откликнувшимся!
Но эти иглы должны пропасть когда 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 байт оперативной и три линии ввода вывода без учёта ШИМ-выходов (если тактировать от кварца - и без учёта линий под кварц).
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...