Ну можно входную частоту подключить к INT0 или INT1, т.е. внешнее прерывание. Внешнее прерывание настроить на срабатывание и на фронт и на спад. В обработчике прерывания выдать импульс.
Если нужен импульс определенной ширины. В обработчике внешнего прерывания выходной порт устанавливает в 1. Запускаете таймер. В обработчике прерывания таймера (тут разные варианты могут быть) выходной порт в 0, остановка таймера.
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
[uquote="makser",url="/forum/viewtopic.php?p=470498#p470498"]Обращаю внимание: функция sqrt() иногда выдает не верный результат, пользуйтесь pow().[/uquote]так да немного не так. попробуйте узнать результат pow(2, 0). Вы будете удивлены но результат будет не верным
Задача состояла в управлении двигателем постоянного тока в простецком намоточном станке. Мне потребовался плавный разгон двигателя на старте и сброс оборотов перед окончанием намотки. Проблема у меня возникла в следующем. На старте, я в регистр OCR2 прописываю значение малых оборотов OCR2=40;. Далее, дискретно по определенным количествам витков я поднимаю значение до OCR2=255;.
Все работает, двигатель разгоняется.
Но при значении в регистре OCR2=255; я не могу стабильно остановить двигатель макросом OffPWM();.
ШИМ судя по всему отключается, но в порту PD7 остается 1.
Перерыл в интернете кучу примеров и обучалок, везде ставится задача стартануть ШИМ. А как остановить - не нашел.
Подскажите, пожалуйста, верное решение.
PS. дольше код уже сижу вдумчиво разбираю, чем эти катушки несчастные мотать. Пока сделал без плавного разгона и часть намотал, но хочется решить задачку
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
А если просто добавить в макрос установку в порт нуля? Ну, или если при активном ШИМ так просто управлять портом нельзя (я этого точно не помню), то деактивировать ещё и CTC2 бит, например.
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Проблема у вас была не в том, что ПОСЛЕ записывали, а в том, что не выключали "особую функцию порта", которая включалась битами регистра TCCR2. Вы же только ОСТАНАВЛИВАЛИ таймер, но не выключали режим. После обнуления регистра все стало на свои места.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV писал(а):а в том, что не выключали "особую функцию порта"
Увы нет.
Была у меня версия управления, где макрос на включения ПОЛНОСТЬЮ настраивал регистр TCCR2, а макрос отключения его обнулял. И эта версия не работала, именно потому, что после обновления регистра я и записывал 0 в порт.
Поэтому я и посчитал, что все равно, что делать. То ли полностью регистр прописывать и обнулять, то ли просто таймер останавливать.
ARV писал(а):Вы же только ОСТАНАВЛИВАЛИ таймер, но не выключали режим.
А не выключая режим управлять портом прописывая туда 0 или 1 нельзя? Правильно я понял?
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Можно. Но это значение PORT "не доходит" до ножки, будучи перехвачено особой функцией.
С другой стороны, единожды (при инициализации системы) записав PORT=0, мы должны бы иметь этот ноль на ножке при отключении особой функции (ШИМ).
Хотя я не уверен, возможно ШИМ меняет содержимое PORT, и обнулять его нужно каждый раз.
Здравствуйте, подскажите пожалуйста) Имеется светодиодная строка на 4 матрицах 8х8 с микросхемами max 7219 (вроде как spi) . Дабы разобраться в принципе управления этой микросхемой взял вот такую функцию)
И вроде бы понятно , но это включает конкретно в одной матрице 1 строку и ней конкретно" точки".
То есть чтобы вывести например цифру из точек высотой в 7, на одной матрице мне надо будет прописать:
короче говоря код слишком сильно разрастается)ибо это на одной матрице только , а их 4) может быть я использую не тот принцип вывода?) или я чегото не понял?)Но по крайней мере я управляю семи точками вручную и мне это понятно...)
Всё верно, именно так информация и выводится.
У max7219 есть особая команда noop, при которой на матрицу ничего не выводится, но данные передаются в следующую подключенную по цепочке матрицу. На пальцах - если подключено 4 матрицы последовательно, и надо вывести что-то в третью, то передаётся noop/0 (для четвёртой), столбец/данные (для третьей), и снова дважды noop/0 для второй и первой. После защёлкивания всё отобразится как и хотелось.
Самое здесь интересное - это sendDataBuf функция, в которую передаётся адрес из массива (32 байта - вертикальных столбика), после чего на матрицу выводится этот буфер. Программе всё что нужно - просто отрисовать что-либо в этот буфер, а затем просто дёрнуть эту функцию.
Последний раз редактировалось WiseLord Вс июл 02, 2017 08:52:21, всего редактировалось 1 раз.
No-Op Register
The no-op register is used when cascading MAX7219s
or MAX7221s. Connect all devices’ LOAD/CS inputs
together and connect DOUT to DIN on adjacent
devices. DOUT is a CMOS logic-level output that easily
drives DIN of successively cascaded parts. (Refer to
the Serial Addressing Modes section for detailed infor-
mation on serial input/output timing.) For example, if
four MAX7219s are cascaded, then to write to the
fourth chip, sent the desired 16-bit word, followed by
three no-op codes (hex XX0X, see Table 2). When
LOAD/CS goes high, data is latched in all devices. The
first three chips receive no-op commands, and the
fourth receives the intended data.
Всё едино гнать данные и адрес/команду каждый раз.
Выдает ошибку:
Error: function argument #1 of type 'flash unsigned char [17]' is incompatible with required parameter of type 'const unsigned char *'
Если убрать const unsigned char сделать unsigned char то ошибка пропадает, но зачем мне размещать статические строки в ОЗУ, Как правильно разместить строки во флешь? Что-то типа:
Добрый день. Нужна Ваша помощь. Такое дело, сделал счетчик витков для намоточного станка на attiny2313 + семисегментный дисплей и щелевой датчик висящий на порте PB2 с одним прерыванием на оборот. Возникла идея еще измерять количество оборотов в минуту, максимальная скорость вращения 120-130 об/мин. мин. примерно 10 об/мин. хотелось бы получить точность не хуже плюс-минус пару оборотов в минуту.
Единственное что приходит в голову, измерять период с помощью Таймера1, но так как периоды получаются очень большие на малых оборотах, ничего не получается по формуле.
Помогите советом.!