более скоростной shiftOut?
- Войдите на сайт для отправки комментариев
Сб, 21/01/2012 - 06:38
К примеру, цитата:
Для сравнения быстродействия:
Ниже приведены команды, которые при понимании логики работы программы в 99% случаев делают одно и то же.
digitalWrite(5,HIGH); // 72 такта
DDRD |=(1<<PIN5); // 2 такта
А писал ли кто нибудь аналог shiftOut, который реально быстрее работает? Особенно когда надо последовательно вызывать его 8 раз?
Нашел так
вот еще
и еще
Заработало это:
Экспериментирую, с твоей функцией, а можешь вставить весь скетч? а то у меня чето не работает....
чуть позже выложу
когда то делал так
функцию шифтаут можно еще лучше
Возможно "не в тему". Но можно еще посмотреть в сторону SPI. Вообщем-то логика сдвиговых регистров совпадает с ней. Так что можно попробовать воспользоватся "аппаратными" возможностями. И выводить простым SPI.transfer сразу байт . Не знаю на какой скорости передает аппаратный, но шансы что "выйдет быстрее", за счет того что сам процессор будет меньше загружен - имеются. Да и скетч "красивше" получится.
Вот тут, можно поглядеть как это примерно делается.
leshak, той функции что я выкинул последней, хватает по быстродействию ЗА глаза в огромным запасом..
Возможно "не в тему". Но можно еще посмотреть в сторону SPI.
Сорри. Не доглядел. Выше вы уже рассматривали этот вариант. Но в любом случае, думаю, ссылочка будет полезной. Там более "ардуинистая" работа с SPI.
leshak, той функции что я выкинул последней, хватает по быстродействию ЗА глаза в огромным запасом..
Ну хватает, так хватает. Хорошо :) Я же просто "упомянул" еще один вариант (и то слегка "мимо кассы"). Может кому-нибудь он "проще покажется", или, когда важней память - пригодится.
а вот по поводу память (не влеш а оперативки) - это очень интересно. Я уже сталкивался с нехваткой (не в шифтауте), начал читать.. макросы и тд..
Ну, по моим наблюдениям, самым быстрым "пожирателем памяти" являются всякие Serial.println("Bla-bla"); и проч. строки. Так что самую ощутимую экономию дает переход на PROGMEM, PSTR . Да и "поменять" довольно быстро, особо не "корежа логику".
Посидел, побаловался, есть интересное наблюдение:
делал для своего куба,
основной код скетча:
И собственно функция которая выводит информацию на куб
так она работает:
А вот так сигнал на защелку идет не всегда:
Я бы даже сказал что крайне редко, причем тактовый сигнал и сигнал данных идут нормально, в рабочем состоянии скорость порадовала по сравнению с прошлой версией на digitalWrite.
для справки: функция 8 раз записывает 64 бита данных о этаже и потом 8 бит о том какой этаж зажигать
не используй bitset/write, сразу меняй битовыми операциями на PORTD
установить PORTD |= (1<<NUMPIN)
снять PORTD &= ~(1<<NUMPIN)
NUMPIN = PD0..PD7 или 0..7
где кто в даташите
выдрано из рабочего проекта, быстрее некуда) только аппаратно наверно, хз
тут нет защелки, защелка СНИМАЕТСЯ перед посылками шифтаут и ставится после того как все посылки ушли. Задержек никаких нет у меня, все пашет. Кондюка на защелке нет. тестилось на 1 регистра и на 9 штуках.
да, у тебя ошибка. Снимай защелку вначале работы.
выдрано из рабочего проекта, быстрее некуда) только аппаратно наверно, хз
тут нет защелки, защелка СНИМАЕТСЯ перед посылками шифтаут и ставится после того как все посылки ушли. Задержек никаких нет у меня, все пашет. Кондюка на защелке нет. тестилось на 1 регистра и на 9 штуках.
Сегодня попробую обязательно.
да, у тебя ошибка. Снимай защелку вначале работы.
Малость не понял.... если вы про то, что перед запись новых данных надо защелку перевести в логический 0 то это я знаю, но после первого прохода функции там уже точно будет 0 .
Поэкспериментировав заметил одну фишку.... если я к ноге подключаю диод и контроллер до диод мигает через раз, собсно когда мигает тогда данные и выводятся, т.е. такое ощущение что на ноге просто нет сигнала.... но если отключить контроллер то диод начинает тускло гореть(видимо начинает выдавать нормальный сигнал..... я стал подозревать что есть трабл в контроллере...
Малость не понял.... если вы про то, что перед запись новых данных надо защелку перевести в логический 0 то это я знаю, но после первого прохода функции там уже точно будет 0 .
Поэкспериментировав заметил одну фишку.... если я к ноге подключаю диод и контроллер до диод мигает через раз, собсно когда мигает тогда данные и выводятся, т.е. такое ощущение что на ноге просто нет сигнала.... но если отключить контроллер то диод начинает тускло гореть(видимо начинает выдавать нормальный сигнал..... я стал подозревать что есть трабл в контроллере...
digitalWrite(_lat, HIGH);
digitalWrite(_lat, LOW);
вторую строчку убери, проверь правильность соединений
в динамической индикации принято делать так:
зажигаем секцию
задержка (оч малая), если не по таймеру
тушим секцию (катоды/строки/этаж)
идем в начало цикла
можно тушение вынести перд зажиганием, между ними нет задержки или очень малая
эм... как я понимаю логику работы регистров 74HC595N(скорее всего далее всем извесная вода) то у них есть пин данных, пин такта, и пин защелки, сам в себе этот регистр состоит из 8 элементов в которых по 2 D-триггера, собсно в первый триггер(в каждом элементе) мы загоняем при помощи пина данных и тактового. Затем когда информация записана в первые триггеры, сигналом на дащелку я синхронизирую значения на выходе для первого и второго триггера в каждом элементе, и могу продолжать дальше записывать в первый. т.е. состояние второго триггера меняется только тогда, когда подана логическая единица на пин защелки, как только убираем логическую единицу состояния на выходе регистра замирают.
исходя из этого я, используя тактовый пин и пин данных записываю в регистр 64+8 бита данных о том какие диоды и на каком этаже зажеч и в конце даю короткий сигнал на защелку чтобы перевести данные из внутренних регистров на внешние, и пока горит этаж я могу записать следующие 72 бита о следующем этаже, поэтому я делаю короткий сигнал на защелку в конце первого цикла. получается что диоды горят до тех пор пока не подготовится следующая порция информации о следующем этажеи быстро меняются сигналом на защелку...
и всетаки мне не понятно почему
Работает а
нет хотя логика ни как не меняется... если ссылатся на косяк в плате то почему первый вариант работает? может дело в малом времени реагирования на сигнал защелки? сигнал данных и тактовый реагируют нормально, и опятьже по даташиту регистры готовы работать на куда большей частоте чем может выдать дуина.
нашел в чем был косяк.... в конденсаторе на 0.1мкФ на защелке.... он все и портил, выпоял и все как часики работает)))) 2whoim еще вы мне говорили что не нужно....но я всеже один распаял, видимо при тех скоростях что сейчас работает он не успевал разряжатся....
скорость просто радует))) спасибо)))
Отчитываюсь:
логика кода одна и таже, до оптимизации:
скетч:
ссылка на видео: youtu.be/wBigrc10NPc
после оптимизации:
скетч:
ссылка на видео: youtu.be/Le9mrlMyOyQ
Я думаю результат на лицо, даже если посмотреть что у меня не самый лучший фотик для въемки видео но разница очевидна.
Видео посмотрю из дома, на работе дорогой интернет.
Я работаю с регистром так.
1) Ноль на защелку - регистр доступен для записи.
2) Посылки по количеству регистров (всех микросхем). Ставлю дата и дергаю клок. Посылка - байт на микросхему.
3) Когда все посылки ушли, защелку в единичку. Выходы микросхем в этот момент меняются в соответствии с посылками.
первая посылка попадает в "дальнюю" микросхему. Последняя - в "ближнюю".
PORTD |= (1 << _lat);
66
PORTD &= ~(1 << _lat);
вы по прежнему дергаете защелку туда-сюда.
В начале записи сняли, в конце поставили. Все!
PORTD |= (1 << _lat);
66
PORTD &= ~(1 << _lat);
вы по прежнему дергаете защелку туда-сюда.
В начале записи сняли, в конце поставили. Все!
Эм.. не вижу разницы.... в начале цикла её в 0 поставить или в конце передернуть.... просто в вашем случае получается что после того как функция отработала то на защелке останется 1 а в моем случае останется 0...
так правильнее логически, как задумано производителем. Мало ли что вылезет - пока защелка снята, регистры ждут, может мусор прийти например. Или мало времени будет чтобы сработала защелка.
понял)))) поправлю)))) пасибо за инфу)))
Да за что :) когда я уже доберусь до своего куба..
Хотя у меня будет не куб, будет 3D сфера )
мммм сфера тоже прикольно, как то видел на ютубе))) я вот подумываю сделать еще один тока из белых диодов в дите полусферы на потолок как люстру)))))