Есть микроконтроллер ATtiny13A PU. Знаю, что по умолчанию он работает на частоте 1.2 МГц. Поэтому поменял бит CKDIV8 (4 бит) в младшем фьюз-байте на 1. Через avrdude и программатор usbasp прошил. Сейчас такие биты:
Low Fuse:0b01111010 High Fuse:0b11111111
Далее, пишу код на MPLAB X IDE. На всякий случай объявил:
В общем, я тут запрещаю прерывания. Назначаю ножку PB0 (5-ая ножка) на выход. Сразу же и выдаю сигнал высокого уровня на эту ножку. Далее устанавливаю значение для счётчика таймера. Устанавливаю режим работы таймера CTC (Clear Timer on Compare). Устанавливаю чтобы счётчик таймера увеличивался каждый такт. Устанавливаю что сравнивать нужно со значением 0x01. Разрешаю прерывание по совпадению для A. И разрешаю прерывания.
Ожидал я, что чередоваться сигналы будут каждые, примерно, 104.16(6) наносекунд (1 секунда / 9.6 МГц). Для проверки использовал осциллограф Hantek DSO2D15.
В результате, осциллограф показывает не то что я ожидал. Осциллограф показывает чередование каждые, примерно, 4 микросекунды. При этом, как-то, изображение сигнала на левой половине экрана то показывается, то пропадает. А изредка и вообще показывает какой-то другой сигнал (низкий уровень по длинной прямой и где-то может что-то поднялось на короткий промежуток времени).
Конечно, может быть дело в самом осциллографе. Но в нём есть встроенный генератор, где я выставил его на сигналы прямоугольной формы с частотой 9.6 МГц и подключил щуп. Он всё это улавливал. Да, там форма сигнала вызывала вопросы (далеко не прямоугольной формы он их отображал), но в остальном всё работало и временные интервалы меня более чем устраивали. И весь экран был забит сигналом (а не только правая часть). И он был устойчив, ничего не пропадало.
Ну и стоит ещё сказать, что питаю я микроконтроллер от 5 вольт. В начале я пробовал не трогать ножку сброса. Но так же и пробовал подключать её к плюсу питания через резистор на 1 кОм. Разницы никакой. С другой стороны, какая может быть разница, если микроконтроллер должен сбрасываться от сигнала низкого уровня на этой ножке.
В общем, вопрос вот в чём, может у меня что-то в коде не так?
Пусть частота кварца 10 МГц. Длительность одного такта 100 наносекунд. Даже если в лоб написать на асме, чтобы наверняка прибить гвоздями оптимизацию, что получим?
Каждый такт не получится. Попробуйте хекс на основе кода на асме. Каждые 4 такта, т.е. 0,42мкс должен формироваться период.
Код:
.INCLUDE "tn13Adef.inc"
.CSEG SBI DDRB,0
LDI R22,1 OUT OCR0A,R22 LDI R22,1<<COM0A0|1<<WGM01 OUT TCCR0A,R22 LDI R22,1<<CS00 OUT TCCR0B,R22 RJMP PC .EXIT
Скачал Ваш hex-файл, прошил. Действительно работает. Сигнал меняется, вроде каждые около 200 нс. Но, если я не ошибаюсь, то тут используется PWM режим. А мне же, вообще, нужно чтобы у меня сигнал был разного интервала (нужно для отправки битов на микросхему WS2818B).
Что вот интересно. Я убрал делитель на 8. И, используя avr-as, написал такой код:
По сути, я максимально (на сколько я придумал) быстро меняю местами сигналы LOW/HIGH на пине PB0 (ножка 5). Вот только результат странный. Мало того, что я получаю временные интервалы какие-то запредельные, так ещё и сам сигнал выглядит вот такой формы (только тут я инвентировал полярность, а то иначе сайт не отображает, на самом деле + почти всё время, а - изредка пробегает):
А далее я включил снова делитель на 8. И, решил вместо пина PB0 (ножка 5) использовать PB1 (ножка 6). В программе меняю константы 0x01 на 0x02. Ведь было 0b00000001, а станет 0b00000010. В результате подключаю осциллограф к пину PB1 (ножка 6) и там нет сигнала вообще. А подключаю его к пину PB0 (ножка 5) и там есть сигнал и как раз равномерный (хоть и временные интервалы не те что я ожидал). Вот я и не пойму, а почему сигнал идёт на пине PB0 (ножка 5), если я в регистр ввода/вывода PORTB выдаю каждые 4 тика то 0b00000000, то 0b00000010. В чём моя ошибка?
Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.
LDI R16,0x17 LDI R17,0x19 out DDRB,R16 out PORTB,R17
LDI R18,0x03 ; ldi R18,0x01 loop:
out PINB,R18 ; 1 cycle
rjmp loop ; 2 cycles .EXIT
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Чуть не забыл. Неизвестно, исправили этот баг или нет. Несколько лет назад на одном из форумов мелькнула тема. Суть: Не помню какие мк. Копайте сами тему. Мне сейчас не до этого. Если сделать вывод в порт, будет задержка на не менее 8 тактов. Именно эта проблема решается только прямым управлением пинов. Sbi, cbi. Возможно, это этот случай. Вроде нашел тему.
А кто гарантировал, что сигнал внутреннего генератора абсолютно точен и стабилен? Это ведь даже не кварц... Да и требования к меандру довольно высоки - такую картинку предпочтительно на тиньке 25/45/85 делать. Была когда-то тест-игрушка для опытов с самодельным протоколом для WS2812 под ассемблером (авр студио 4.19):
С кодом ниже перебрал все возможные коэффициенты. флаш: 54 байт, выход: PB0 (pin 5), контроль: oсциллограф и частотомер. Fclk Internal = 9,6 MHz (Фильтрующий конденсатор рядом с МК предполагается ставить. Без него не обошлось без сюрпризов: чуть не бросил экспериментировать ).
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения