Конечно зря. Как раз таки при SPI используется минимум ресурсов контроллера. Вообще, если возможно аппаратное решение, на кой использовать программное!
Да потому что аппаратное - это строгозаданное и ничего там не поменяешь (практически). Программное решение даёт возможность повесить на любой порт, свести к минимуму количество функций вывода, можно вместить а мелкие МК, да плюсов гора.
В случае работы с этими светодиодами посылка байта по SPI - это всего лишь посылка одного бита из 24.
Единственное преимущество использования SPI в данном случае - это лишь возможность заранее подготовить для отправки (все эти циклы, смены указателей и т.п.) следующий бит, параллельно посылке текущего, после чего всё равно придётся "висеть", ожидая окончания посылки этого бита.
То есть, на общую скорость работы (посылки всей последовательности для, к примеру, цепочки из 50 светодиодов => 50*24 бит) использование SPI особо не влияет.
P.S. Кстати, в процедуре отправки бита я бы "висел", ожидая готовности SPI, не после отправки данных, а перед ней. Иначе вообще особого преимущества в скорости нет.
Преимущество SPI не в скорости, а в том, что формируемые интервалы идеальны и не поплывут ни от температуры, ни от прерываний, ни от чего-то ещё. А именно с нечеткими интервалами последовательности импульсов основные проблемы с этими светодиодами. И да, кварц обязателен.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется... скушно, бабоньки!
Длительность импульса (единичные биты в 0xE0 или 0xF8) - да, не поплывёт, так как она определяется только SPI. Но вот паузы между импульсами могут вполне поплыть, так как стороннее прерывание может вкрасться между отправками байтов по SPI.
Хотя, возможно, для светодиодов важно именно первое, а второе не так уж и критично - лишь бы не было слишком долго, когда данные защёлкиваются и начинают ШИМ-иться.
Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650.
Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.
WiseLord, Trigger, Как вы считаете, как ещё можно организовать общение с данными светодиодами? Хочу именно программно, в самом деле что ли нельзя сделать? Или и правда пробовать переходить под 20 МГц с внешним кварцом и тем самым минимизировать погрешности...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Если нет желания использовать SPI, единственный вменяемый вариант - писать на ассемблере (делать ассемблерную вставку). Иначе за таймингами никак не уследить. Пример: https://github.com/adafruit/Adafruit_Ne ... oPixel.cpp Конечно, написанное там в CVAVR без доработки работать не будет, там по-другому оформляются ассемблерные вставки.
_________________ Этот пост оказался полезен? Не поленись, нажми слева!
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Ай да мужики, ай да красавцы Всем спасибо за участие! Безумно рад, что получилось запустить! Короче как действовал: Подключил осциллограф и методом научной пробы подобрал как располагать нупы. Не прибегая к ассемблерной вставке всей функции (а точнее языка, который я никогда толком не затрагивал), вот что получилось:
#asm("cli") if (B & 0x80) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (B & 0x40) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (B & 0x20) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (B & 0x10) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (B & 0x08) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (B & 0x04) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (B & 0x02) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (B & 0x10) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (R & 0x80) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (R & 0x40) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (R & 0x20) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (R & 0x10) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (R & 0x08) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (R & 0x04) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (R & 0x02) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (R & 0x10) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (G & 0x80) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (G & 0x40) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (G & 0x20) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (G & 0x10) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (G & 0x08) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (G & 0x04) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (G & 0x02) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;}
if (G & 0x10) { DIN = 1; #asm("nop")#asm("nop")#asm("nop") DIN = 0;} else {DIN = 1; #asm("nop")#asm("nop") DIN = 0;} delay_us(60);
}
Да, глупо. Но по-другому никак не выходило. Надеюсь кто-то когда-то будет искать решение такой же проблемы в интернете и наткнется на этот мой пост, может карму почистит P.s. тут еще дисплейчики на SSD1326 появились (256х32), так что пропадаю не на долго P.s.s. Чип у меня работает на встроенном генераторе на 8 мГц. Еще раз благодарю *Trigger*, WiseLord, ARV
Вы бы не просили, а то за такой код могут и начистить что-нибудь... И нагреется МК, поплывет встроенный генератор, и ваши NOP-ы передадут вам привет.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется... скушно, бабоньки!
Было бы интереснее, если бы в AVR был DMA. Тогда использовать SPI было бы вообще милое дело - заготовил массив данных для передачи, и МК бы сам всё отправил аппаратно, с точными интервалами, выполняя при этом параллельно другой полезный код.
P.S. Игрался с гирляндой на 50 светодиодов месяца три назад, делал на обычных задержках с замером осциллографом. Если код интересен, можно посмотреть на github, залил только что.
Основная идея следующая: заброс в ленту 24 * 50 битов (массив в 120 байтов) занимает около 3мс. Заброс делается автоматически по таймеру, один раз в 16мс, что даёт возможность обновлять ленту раз в 60 секунд в автоматическом режиме. В принципе, здесь можно было бы и SPI использовать, но обошёлся обычными задержками.
Получается, из 16мс между прерываниями таймера около 3мс (20% времени) МК занят собственно посылкой данных (столько бы отнимало это и при использовании SPI), а остальное время может делать прочую работу - огранизовывать эффекты. То есть, просто по заданным алгоритмам обновлять сам этот массив данных, уже не заботясь о том, как именно он будет выведен в ленту.
вы как тот юный пионер: в беседах с товарищами он крут "да я любую телку завалю!", а как только в ответ на вопрос "дай" получает "бери!" - тут же краснеет и не знает, куда бежать... как говорила тетя Роза: дать-то я не против, да не берут...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется... скушно, бабоньки!
Да это и не к вам претензия, ARV. В ваших способностях я с самого детства уверен. А вот когда человек влезает, чтобы понты покидать, что все туфта, а по факту сам ничего не может - мне это странно. Писал я сюда не чтобы с кем-то поссориться, а чтобы получить помощи. Оффтопить " да что за код, что за туфта и ТД" может каждый, а ты решение дай поставленной задаче более лучшее...
У меня вопрос к корифеям программирования, решил спросить здесь. Есть исходник, написанный на С, именно для CodeVision (это один из исходников зарядки для Ni-Cd, на ATtiny13 - вот ссылка-обсуждение - https://www.radiokot.ru:443/forum/viewtopic.php?t=7921).
На компе установлена версия CodeVisionAVR v3.12-new, скачан с рутрекера, стал вроде нормально, без проблем. При попытке просто компилировать - все нормально, а вот если нажать кнопку "Build", или "Build All", то есть с получением выходного HEX-файла, выдается ошибка следующего содержания:
"Linker error: C:\cvavr\BIN\Untitled\charger3.c(109): function 'main' from file: C:\cvavr\BIN\Untitled\charger.c, line: 10 is redefined". Ошибка указывает на строку "void main(void)".
Я уже голову сломал, чего же у меня не так настроено в этой программе. Может кто-то уже сталкивался с таким (в прищепке - сам исходник)
The code you posted does not explain the error message you presented. It has some issues, but none that should elicit any error. There are several possible reasons for the error, among them:
1. My best guess would be that you have another source file in the project that has its own main() function, and the IDE is configured to include both in the same target program. That might result simply by virtue of them being collocated in the same directory. That other source file might even be something dumb, such as a backup copy of the file you presented. 2. Alternatively, it may be that you have a project-local header named ctype.h, which defines a main() function, and Dev C++ is choosing that one instead of the standard library's header. (Yes, this is really just a variant on (1); there's not much leeway in "redefinition of 'int main()'".) 2. Or perhaps Dev C++ misspoke, and it's complaining about a redeclaration of main() rather than a redefinition. If its ctype.h header contained a conflicting declaration, such as int main(int argc, char *argv[]), then it might issue a complaint. In that unlikely case, you might be able to resolve the error by changing the declaration of your main() to the two-argument form.
Лучше ответить сложно. И, как справедливо замечено в самом начале, для объективного анализа хорошо иметь весь проект. Создав новый проект, вы, наверное, для верности решили добавить в проект и файл charger3.c.
В исходном варианте - без проблем. Замечание о несопадении типов в данном случае можно игнорировать.
Не пойму, зачем гадать, что не так, если компилятор прямым текстом говорит, что функция main встречается в коде не один раз?
Говорить-то он говорит, вот только с исходником я ничего не делал, какой был - такой и остался. В принципе, раз заработало - меня все устроило, а что там, да как, - это уже неважно.
Просто всегда считал, что если в режиме компиляции - проходит без ошибок, то и в остальных режимах - их тоже не должно быть вроде как. Столкнулся с такой бякой впервые.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения