Jump to content

ARV

Members
  • Content Count

    2325
  • Joined

  • Last visited

  • Days Won

    16

Everything posted by ARV

  1. Даже ребенка в игре с кубиками учат, что при строительстве пирамидки снизу должны быть кубики побольше, а выше - поменьше. То есть объясняют порядок, которого следует придерживаться. Так и в программировании: если придерживаться порядка, то будет легче. Разумеется, если руки не дрожат и есть опыт, можно построить пирамиду и наоборот6 снизу маленький и тонкий, а на нем огромная куча больших и толстых. Но все это развалится от малешего толчка. Так и в программировании: если делать как-нибудь, оно вполне может работать, и даже будет скорее всего работать, но буквально до первой попытки что-то изменить. При программировании на Си вопрос оптимальности - надуманный вопрос. В огромном количестве случаев любая "оптимизация вручную" (пример с делением) наверняка в конечном итоге проиграет оптимизации, которую устроит компилятор. Но даже если это и не так - необходимости в столь тонкой оптимизации почти никогда не встречается в любительских проектах: производительность современных микроконтроллеров настолько высока, что экономить на делении, заменяя его сдвигами, нет никакого смысла. А все непонятки и сложности от незнакомости. Любому начинающему приучиться делать свои проекты многофайловыми совсем не сложно, а пользы от этого в будущем будет много. Есть большая и толстая книга: или в переводе на русский Прочесть которую необходимо каждому, кто вознамерился заниматься программирвоанием хотя бы раз в неделю. Хорошо прочищает голову, освобождая от всяких вопросов типа "а нужно ли?".
  2. Проще или не проще - вопрос лично для меня не стоит. Правильнее или не правильнее - так я ставлю вопрос. И ответ на него дал. Писать код неправильно учиться не надо, усилий требует вырабатывание привычки писать код правильно. В программировании любая простота обязательно оборачиавется проблемами: либо до какого-то события, либо после него: мы или мучаемся над изучением/осваиванием чего-либо, либо мучаемся потом, отлавливая ошибки. Какие проблемы решать лучше - каждый сам выбирает для себя.
  3. Во-первых, этой строчки не должно быть в тексте ваших исходников. Определение тактовой частоты должно задаваться в makefile или в свойствах проекта вцелом, а не в индивидуальных исходниках. В самом дико крайнем случае - в единственном заголовочном файле, подключаемым ко всем исходникам проекта, но и этот случай я бы не одобрил. Во-вторых, суффикс UL означает, что число следует рассматривать, как unsigned long, а суффикс L - как просто long. Это необходимо потому, что в Си по умолчанию (т.е. без суффиксов) все числа имеют размерность int, а значит, бОльшее число туда может влезть не полностью, что приведет к загадочным результатам вычислений. В последних версиях (стандартов Си или компиляторов?) это вроде как уже немного скорректировано, но я бы на это не стал надеяться, и рекомендовл бы продолжать использовать суффиксы явно.
  4. А где же сам сброс? Как-то сложновато выходит с ADIF: у вас же есть ADSC, который сам падает по завершению, почему бы не делать так: ADCSRA |= _BV(ADSC); while(ADCSRA & _BV(ADSC)); // результат тот же, а писанины меньше и шансов ошибиться тоже меньше И лично я фильтрую всегда скользящим средним - хоть расход памяти и больше, но и результат более прогнозируемый: #define FILTR_DEPTH 32 int filtr(int data){ static int buf[FILTR_DEPTH]; static uint8_t pos; int16 result = 0; buf[pos++] = data; if(pos >= FILTR_DEPTH) pos = 0; for(uint8_t i=0; i<FILTR_DEPTH; i++) sum += buf[i]; return sum / FILTR_DEPTH; } FILTR_DEPTH чем больше, тем сильнее фильтрация. Желательно выбирать значение равным степени 2: 4, 8, 16, 32 или 64, больше 64 смысла нет. Кстати, функцию ADC_read можно ускорить: цикл ожидания завершения преобразования перенести в самое начало, а запускать преобразование в самом конце: while(ADCSRA & _BV(ADSC)); // ждем завершения преобразования int result = ADC; // запоминаем результат ADCSRA |= _BV(ADSC); // запускаем преоразование return result; // выдаем результат Пока вы там будете выводить на ЖКИ, АЦП у вас будет делать замер, и к следующему обращению результат уже будет готов, ждать не придется.
  5. Ну, если фильтруются отсчеты АЦП, а показания скачут, значит, ошибка в программе или схеме есть. Разумеется, при условии, что само измеряемое напряжение не пульсирует.
  6. Потому что даже идеальный АЦП шумит в младшем бите, а с учётом не идеальности как источника измеряемого сигнала, так и АЦП, наволок и помех, и подавно... Перед выводом на индикатор надо обязательно фильтровать значения.
  7. Не знаю, что там за уроки, но правильно так: всё, что не ноль, эквивалентно истине. Поэтому (a) и (a != 0) абсолютно эквивалентны в качестве условия в if и других местах, где требуется. Главное, не думать, что истина всегда эквивалентна 1. То есть (PINB & 1) и (PINB & 2) совсем не то же самое, что (PINB & 1) == 1 и (PINB & 2) == 1
  8. Довольно неоптимальная конструкция, скорее всего компилятор для (1<<i) тоже организует цикл. Вот так гораздо лучше: for(uint8_t i=1; i; i<<1){ PORTD = i; _delay_ms(500); } Соответственно, во втором варианте надо лишь инвертировать i перед вывoдом в порт: PORTD = ~i;
  9. В библиотеке Peter Fleury, которую я рекомендовал, есть возможность настроить области памяти ЖКИ по-своему.
  10. На USBAsp есть специальная перемычка JP3 для снижения скорости прошивания - не помогает?
  11. Имхо, я бы кинул его в мусорку и купил новый, с гарантией того, что заработает с первого тыка.
  12. Вот-вот, какие-то основания есть считать сие изделие исправным?
  13. А фотку можно этого чуда со стороны "надписей"?
  14. Для того, чтобы не работало в железе, достаточно, чтобы распиновка была чуть-чуть другой. Все ЖКИ, что попадались мне, всегда имели распиновку, в которой последовательно сгруппированы линии данных, затем три управляющих и с краю - питание с контрастностью. Направление нумерации линий данных, как правило, всегда одинаковое - от "края" разъема по порядку, а вот управляющие линии E, RW и RS могут быть перетасованы. Линии питания всегда "с противоположного края" по отношению к линиям данных. Так что по плате ЖКИ можно легко отследить общий провод, плюс питания тоже не сложно, с другой стороны разъема пойдут линии данных, а из трех оставшихся линий набирается не так уж много вариантов, чтобы перебрать их методом тыка. Во всяком случае я так запустил свой первый ЖКИ из какого-то принтера без маркировки вобще. Почему-то мне интуиция подсказывает, что никакой экзотики у вас не будет, надо лишь найти правильную распиновку.... Разумеется, не факт, что попадавшие мне в руки ЖКИ гарантируют, что и все другие имеют аналогичные распиновки... Однако, я совершенно не верю в то, что линии данных могут быть перетасованы или смешаны с линиями управления, хотя допускаю, что питание может вклиниться между данными и управляющими линиями, или даже перекочевать на другой край разъема - к линиям данных. В любом случае вариантов подключения не бесконечное количество, методом тыка за день экспериментов можно все перебрать Хотя при стоимости ЖКИ в 150 рублей вообще не вижу препятствий выбросить "неизвестный" и купить вместо него нормально документированный.
  15. Странно... Ну, тогда можете скачать из моей статьи: https://simple-devices.ru/articles/7-soft/128-winavr-lcd-interface
  16. Если вопрос ко мне, то я не искал вообще: инициализация из библиотеки срабатывала всегда. Почему-то мне кажется, проблема с инициализацией всегда возникает там, где вместо чтения бита BUSY используют задержки... Библиотека Peter Fleury именно считывает этот бит, используя линию R/W - небольшая плата за стабильную работу, имхо.
  17. Спасибо за информацию
  18. А как встроенные эффекты работают? Если в ленте будет 100 светодиодов, эффект будет "правильный"? Сколько можно подключить светодиодов, чтобы встроенные эффекты не портились - минимум и максимум? Сколько всего встроено эффектов и как их менять? Извините, что задаю вопросы, на которые, возможно, были ответы в видео - не смотрел целиком по причине слабого интернета...
  19. Я верно понял, что без компьютера это устройство способно только показывать спектр звукового сигнала?
  20. В гугле, как обычно: http://www.peterfleury.epizy.com/avr-software.html
  21. Вот к чему прогресс приводит Я вот хрен знает откуда ЖКИ беру - то из Китая закажу, то за мои услуги мне насыпят жменю откуда-то выдранных, то из принтера или ксерокса древнего выдеру... Цветочки, выросщие в навозе, неприхотливы - стандартные либы стандартно работают. А ваши оранжерейные орхидеи капризничают... Разбаловались - по магазинам ЖКИ брать. Проще быть надо
  22. Понятия не имею, насколько. Думаю, несущественно. Я делал анализатор 10 полос по 15 светиков красно-зеленых, без всяких там регистров на 32-й меге.
  23. Откуда вы только берете библиотеки и ЖКИ с "нестандартными" инициализациями?! В моей практике было примерно 6 разновидностей ЖКИ от однострочных до четырехстрочных, и все превосходно управлялись одной-единственной библиотекой от Peter Fleury... И в "протезе" всегда никаких проблем не возникало при этом...
×
×
  • Create New...