Перейти к содержанию

dim3740

Members
  • Постов

    473
  • Зарегистрирован

  • Посещение

Весь контент dim3740

  1. Uart надо 2 минимум, 31025 бит, midi. А так если: черновая отладка через заливку isp, а чистовая - щёлкать тумблером?
  2. Про HEX много статей, но редко уточняется, запарывается ли загрузчик при: 1) при утилитах типа ArduinoUploader (т.е. через USB) 2) через ISP . Конкретно: у меня после успешной зашивки через Аплоадер, стала ошибка ( уже через скетч) avrdude: verification error: content mismatch Как исправить? Начинаю курить в сторону "как зашить загрузчик", а главное - 1) объясните , плз, я зашивал файл типа ХХХwith.boatloder.hex, а в папке ТЕМП был еще просто XXX.hex. Какой надо? 2) Что я сделал неверно, конечно..?
  3. Спасибо. Итак, понял, что все зависит от того, как порты подключены к внешним устройствам... По моему эксперименту, внешняя нагрузка по TX (резистор 400 ом на 5 в в итоге) не мешает программированию. А RX - уже очень критично, все блокируется, хотя там также мой резистор на 750 ом на 5 в... (пока тестю). Юзаю NANO. На схеме вижу один ISP. Шить умею (почти), программатор есть (правда, косяк получил -но это другая тема). Беда в том, что и линии ISP задействованы на периферию - подключен USB HOST mini.
  4. Очень надо найти решение снова! Понятно, что через TX RX арудинка обменивается с компом при загрузке. Но эти же порты потом нужны для других интерфейсов. Ставить галетный выключатель (даже нужен переключатель!) неудобно. Вопросы: 1) Юзать иные способы заливки скетча осмысленно? 2) Какие требования по внешней нагрузке на линии RX TX не влияют на обмен с компом? Сопротивления.... ставить развязки и как?
  5. Спасибо. Займусь на выходных...пока занят((( Вот из спецификации по приему МИДИ фрагмент:
  6. Ну это для меня авторитетные они))) Сделал 1, т.е. фактически это один байт стал [0] , тоже работает на вскидку. Сбой, как всегда, после пары минут интенсивной игры...... Это все не дело)))) . я точно понял, что надо писать тестовый генератор (как писал выше), чем сейчас и занимаюсь на C#. Но это не просто, потому что надо тогда и МИДИ входной порт аппаратно задействовать. Но имхо тут все же мне помогут)))) На форуме программистов вообще МК не хотят заниматься((((
  7. Я не только слизал с весьма авторитетного источника, но и разобрался в меру своего опыта. Ваша мысль про размер буфера понятна и принята. Конечно, если приемник НЕ ГОТОВ по скорости принять инфу, то буфер переполнится. Но... мой приемник - это не более, как... скажем, громкоговоритель. Там нет никаких других процессов, кроме чтения. Синтезатор, который воспроизводит приемный поток свободен... на нем никто не играет (в отличие от синтезатора- источника). Поэтому в МОЕМ случае, имхо, ошибка никак не связана с размером буфера. Я пробовал кольцевой ставить всего 2 (и то успевает) , а пробовал 1000, ибо памяти мне не жалко. Эффект одинаковый. Т.е. сбой есть, но редкий.
  8. @hasl пример слизал отсюда...http://www.proavr.narod.ru/z5.htm и приложил скрин фрагмента. А синхронизация, имхо, как раз не нужна... на то и буфер. Хотя, думаю, что под синхро вы имели что-то другое. Скажу тогда, что игра на пианино имеет "паузы", и опорожнение буфера будет всегда. Да, код НЕ универсален, но я хочу делать то, что нужно именно в конкретном случае по ТЗ. И еще: как объяснить, что на 99% код работает?
  9. Это не страшно)) Главное, что Вы не пытаетесь учить меня профкодированию, а согласны подойти к проблеме обобщенно. Я также сейчас выдаю все "от печки", по сути задачи в целом, но и ваши советы проанализирую. Итак. На базе вышеприведенного кода я сделал почти 2 десятка МИДИ устройств за 3 года. И, для любительских задач "1\600" ошибка приемлима. Но, сейчас хотел бы все таки решить этот косяк. Ибо в профоборудовании его не наблюдаю. Кабели те же. Другое железо попробовать? МК есть PIC STM и т.п. Может вообще на AVR нет позитивных результатов ни у кого? Но тогда возникает вопрос об сравнимости "условий" эксперимента. Одно дело компьютерщик-музканант тыкает мышкой на компе, набирая по-нотке. Другое - сцена и игра 10 пальцами, кулаками, и еще и ногами и головой (как я). Тут поток сообщений гораздо выше. Идея: нужно создать тестовый генератор МИДИ последовательностей с регулируемым периодом посыла. И получить функцию "ошибка от периода". А сейчас все идет так: барабаню на клавишах ахинею, - "чем быстрее и больше - тем более вероятна ошибка". И жду, когда она появится.. А она непредсказуема((( Но если появляется - то это конфуз на сцене.... Вот так. Это эмоции))). Далее. Я вообще не могу найти алгоритмов как сделано подобное в проф.девайсах. ПОэтому - все - "от любительского опыта". Потом выложу код, что "разбор" 3-х байтов (определение стартового = "некого "пакета") и прочее я делаю ПОСЛЕ выхода из п\п уарта. Вы пИшите, что можно сделать его в самой п\п. Это мне нужно понять))) Тут надо оценить и вложенность прерываний, что я пока не анализировал. А мысль, что пока попробовать вообще опросом бита регистра - вообще нова до нельзя!
  10. 31250. Прием MIDI сообщений в музыкальном оборудовании. Сбой примерно 1 на сотню нажатых клавиш (т.е. получено около 600 байт) Это методом тыка. Почему то без него сбоев гораздо больше Пакетов нет... все непрерывно. Оперативка, выделение памяти по "правильные" переменные, оптимизация ее - это удел профи, и нехватки ресурсов. У меня примитивная задача, и минимальной атмеги хватит за глаза)))) Зачем экономит то, то не жалко? Да. Но сбой именно где-то в середине и т.п. передачи... Анализ ошибок эффективен, если есть возможность сообщения источнику о ней. У меня сигнал идет от синтезатора. на котором играем музыкант. Естесвенно, он не станет переигрывать сбойную ноту.))) М.б. это действительно, ошибка. Я не проф. программист, а музыкант. Поэтому многое делаю не понимая(((( Про деребезг - это я для примера, и конечно, простых кнопок, а не UART. Это я не подумал. Я предполагал, один UART и писать в три массива. Но, думаю, что ошибки идут чисто аппаратные (фронты сигналов, помехи и т.п.) и ошибка запишется во все три массива. Забыли эту мысль! Но за подробный разбор спасибо! Просто я бы хотел абстрагироваться от мелочей, и понять, нельзя ли кардинально решить задачу иначе? Я сейчас добавлю пост еще одним сообщением.... Вообще имеем черный ящик. На него приходят байты от источника (синтезатор). С него уходят байта на другой синтезатор. В Ч,Я - разные алгоритмы преобразования инфы. Допустим, что преобразования не нужно. Тогда справедлив ли код в обработчике UART, типа: temp=UDR и сразу UDR=temp. Да, он работает. Тут нет буфера, ибо зачем он нужен, если программист знает алгоритм работы девайса в целом и понимает, что НИЧТО не прервет эту отправку СРАЗУ. Ибо нет более высокого уровня задачи, нет падений питания, нет нажатия кнопок, таймеров и т.п. Но... он н универсален, ибо это частный случай. Идем дальше: пусть надо "вклинить" опрос пары кнопок. Размещаем этот опрос в главном цикле. Но опять таки играя музыкант НЕ нажимает эти кнопки. Так может опять буфер не нужен? А когда он нужен? Когда, нужно сделать что-то именно с поступающими байтами. Логика верна? Я не знаю, просто советуюсь....
  11. Вопрос в том ещё, что скажем есть 2-3 алгоритма устранения дребезга. Неужели нет других алгоритмов и по сабжу? Скажем что если юзать сразу три буферных одномерных массивов и потом сверять их на идентичность данных по одному и тому же индексу?
  12. Читается порт UART на микроконтроллере Atmega. Применяю типовой алгоритм, но аппаратно вижу ошибки. Что неверное, или отчего они могут быть? unsigned char rx_buffer[128]; //накопительный буфер unsigned char indexW; // индекс при наполнении накопительного буфера unsigned char Count; // счетчик накопительного буфера unsigned char indexR; // индекс при опорожнении накопительного буфера int Max; // максимум до переполнения char tempMessage; // временная переменная int main(void) { Max=100; // пробовал разные while(1) { _delay_us(40); // пробовал от 10 мкс до мс if (Count > 0) { tempMessage=rx_bufferR[indexR]; MesComplite(tempMessage); //тут анализ каждого считанного байта. Это занимает время //поэтому и нужен буфер indexR++; if (indexR>=Max) indexR=0; //Значение Max одинаковое для чтения и записи. Может разные проба? cli(); // для надежности запрет прерывания Count--; sei(); //разрешение if (Count>=Max) Count=0; } } } ISR(USART_RXC_vect) { if (UCSRA & (1<<7)) { rx_buffer[indexW]=UDR; indexW++; if (indexW>=Max) indexW=0; Count++; if (Count>Max) Count=0; } } 1. Задержка нужна в цикле whole? У меня при нуле еще больше ошибок((( 2. Размеры 128 и 100 методом подбора? 3. Инкременты ++ ставить после команды? 4. запреты прерывания нужны? 5. If делаю на "равенство и больше". Верно? 6. Какие есть иные методы повышения надежности, кроме повторной отправки при ошибке?
  13. Запросто, если рассматривать Китайские. В нашем магазине их видов 15 есть, большинство без маркировки... я крутил и так и этак... и люфты и клины, и заедания... А на вид - все одинаковые))) Поэтому и хочу выбрать на Ебее и остановиться на одном виде, благо мне разнообразия не требуется. А бесшелчковый точно есть. Ценник 60 руб в РФ, так что имхо это обычный, механический. Если надо - как-то сфоткаю, или видео могу сделать... Но маркировки нет. Толко цифры 364 на торце. Но работает - отлично, приятно и любо-дорого!))))
  14. Тестил с пяток недорогих энкодеров.... 1) последовательности кодов они выдают разные. Или даташит, или (если нет даже маркировки на корпусе) - то 2 светодиода и эксперимент. Так выявил, что просто был не тот код, т.е. ошибка. 2) Шарик - имхо, зло. Все дело - в психофизических ощущения, что "раз щелкнул", то, якобы, должно измениться и на индикаторе. А на дешевых энкодерах, есть и положения неопределенности, и дребезг, и заедания.... Если безшелковый - то этих проблем нет - крутишь, пока не получишь новое показание. А индикаторы бывают в 99 % устройств. 3) Шарик не везде есть. Есть и плоская пружина, которая одновременно и "щелкает" и создает усилия. Ее не выкинешь. В итоге - буду искать готовые бесшелчковые (один такой есть, но без четкой маркировки опять:) . и куплю горсть сразу....
  15. В моей заводской аудиоьехнике изменение индикатора идет на каждый щелчок. Но, теперь понял, что это не обязательно. ЕС11 цикл делает только за 4 щелчка, что абсолютно не эргономично и неестественно((( . Врашая же бесшелчковый, я "не чувствовал" фазу полного цикла и ориентировался только по индикатору. Что меня устраивало. (Надо просто найти с меньшими габаритами). Вопросы: 1) как найти модели энкодеров, которые на 1 щелчок дают полный цикл изменения 4-х состояний? 2) почему в Инете мало инфы про "бесшелчковые" энкодеры - ведь они удобнее, имхо....
  16. Есть механический энкодер типа EC16P24L20T12M7V(15) , который отлично работает. Показания считываются в переменную и выводятся на индикатор. Меняю его на самой плате, не меняя код, на EC11P20L15F7M7H1S(9). Показания теперь только дергаются в пределах единицы при поворотах. Сравниваю: земля у обоих в середине. Первый - бесшелчковый. Это важно? дребезг, имхо, у обоих есть. И размеры 16 больше раза в полтора. Я думаю, что просто некачественный товар, но пробовал ЕС11 две разных модификации, от разных поставщиков - оба глючат одинаково. В чем дело?
  17. Механический энкодер E16 (без щелчковый) отлично считывающий AVR-ом решил заменить на щелчковый. Купил два вида E11, который еще и меньше по размерам. Код тот-же, плата - та же. Но, считывание стало отстойное(((. Делаю через опрос, с задержкой. Время задержки улучшений не дает. E16 вообще не прихотлив был к времени. Вопрос: это могут быть разные типы энкодеров? Или безщелчковый всегда дает лучшие результаты? Или это просто плохое качество купленных E11 c Ебея?
  18. Собственно, это не подтяжка, а внешний резистор на вход RX При загрузке есть ошибка avrdude: stk500 getsync(): not in sync: reap=0x00 появляется только если вход RX подключен через резистор к 5 вольтам, и соединен с выходом оптрона для чтения приходящих данных ардуинкой Причем ошибка любого скетча.
  19. Конечно, с т.з системного профес. подхода так и надо делать... Но когда всего 2 кнопки, какой тут case? И при определенных ТЗ условиях дребезг может не сказываться на работу. Думаю, что мой код не содержит ошибок, кроме потребности оптимизации. Но не работает. Однако, если код опроса комбинации 2-х кнопок еще раз продублировать ДО кода второй кнопки (вставить вместо комментов), то этот "дубль" работает отлично (конечно, переменная H еще одна применена, скжем h2 и новая кнопка КН2 ).
  20. Есть две кнопки. Одна – как Shift. При комбинации обеих выполним одну процедуру. Если без шифта нажмем только вторую – то другую процедуру, т.е. Sound(). Но, не работает, т.е Sound() все равно иногда пролазит… Слышу на слух)) Помогите найти ошибку... int main(void) { flag=0; while(1) { //_delay_us(100); // нужно ли? Opros(); } } void Opros() { // Если нажата кнопка Shift и кнопка Кн1, то переменная h=1. Если нажата только Кн1 - то выполняется процедура Sound(). Shift всегда нажимаем прежде и поэтому его дребезг не важен. for (i=0; i<55; i++) // пробовал различные { _delay_us(2); // пробовал разное время if ((Shift==0) & (Кн1==0)) { flag=1; } else { flag=0; } } if (flag==1) //точно нажата Кн1 { h=1; return; } //if ((Shift==0) & (Кн1==0)) // более простой вариант = неправильно, т.к. в момент нажатия Кн1 будет дребезг и Sound() исполнится, хотя Shift уже нажат. //{ //h=1; //return; //} if (Кн1==0) // тут дребезг не важен, т.е. звук все равно включится. { Sound(); } }
  21. Может "до кучи" кто знает: "доктор" (это же понятно что такое?) вообще не показывает заряд, если подключен девайс без контроллера. Это нормально? По идее, доктор должен работать как амперметр, и ток должен мерять всегда. Думаю, в нем может быть последовательный резистор с малым сопротивлением, а не некий преобразователь. Это также подтверждается моими экспериментами, что "закорачиваение D" делается на ЗУ включеном ДО "доктора", а сам доктор пропускает эти два сигнала транзитом.
  22. Признаю, нецелесообразность проекта. 1) Включение "доктора" в разрыв требует сложного галетного переключателя. И то -это самое простое. 2) БП 5в 4А просаживается до 4,9 вольта, и дает ток на Айпад 500 ма, в то время как дешевая зарядка дает 5,1 в и 1 А. Почему не знаю... 3) таймер нужен на 1 или 2 часа, но проще заряжать такие девайсы днем и юзать программные кухонные таймеры. Это для Никль-кадмиевых нужен суточный капельный режим, а это не тот случай. И т.п. Хотя статья помогла, действительно, при потенциале 2,7 вольта на закороченном D+ и D- зарядка пошла на всех моих девайсах. Всем спасибо.
  23. Так дело ж не в мощности)))) У меня будет "носибельное" устройство, вплодь до поездки в отпуск. Нет, пока сложность и непонимание в вариантах подключения D+ и D-. Конечно, есть и Эплы, и многое другое в семье.... К примеру, Эпл требуют резисторы... Но возможно они уже есть в 40-пиновом шнуре. Но в Lighting вряд ли - места мало. (сейчас коза сказала:)... Тогда Эпл заряжается не от всех зарядок? Ведь в них и должны быть эти резисторы. Я думаю, что размещу не гнезда, а сразу выведу шнурки по Айфон и Айпад.
  24. Спасибо. 1) У меня есть готовый ЗУ\БП на 5 В 4 А розеточный, китайский... Можно его встроить в корпус, разломав,, а можно и так... Но вопрос - не нужно ли напряжение иметь не 5 в, а 5,2... 5,5 вольт для лучшего заряда? 2) Почитал про работу контроллеров заряда. Куча ньюансов((( но имхо мне это не важно - это их проблемы. Однако, с чем столкнусь, если скажем, подключу сразу гаджеты, а мой "индикатор-доктор" буду перещелкивать для контроля. Т.е. то напрямую, то- через него. Конечно, не часто... Думаю, что ничего страшного, только надо некоторое время выжидать, чтоб его показания становились "не переходными", а достоверными (в пределах китайского качества:)) Несколько "докторов" не целесообразно: качественные они не дешевые. 3) Сделаю гнезда паралельно ЮСБ, которые позволят подключать свои "поделки" с целью измерения потребляемого тока. Т.е. простой амперметр (в тестере у меня всего 300 ма максимум) 4) Функционала "тренировки" и т.п. через ЮСБ не обеспечить. А вынимать и делать крейты + контролеры заряда\ тренировки - вообще сложная задача. Думаю, это отдельная тема. У меня и так неплохой фунционал.
  25. Задумал сделать зарядку дла девайсов (Li-Ion) на 4 устройства минимум. Типовые китайские розеточные неудобны, греются, и занимают место в розетках. В моем понимании, нужен только мощный AC-DC преобразователь с током до 4 А и все. На выход поставлю на плату 4 USB гнезда. В разрыв, до гнезд, через переключатель будет подключаться китайский «Зарядное устройство USB доктор мобильный тестер …. ", а может даже не один. Решу вопрос о необходимости закорачивания контактов D+ D- в USB гнездах. Может быть нужны резисторы для ограничения токов заряда… Еще бывают девайсы без контроллеров зарядки (дешевы плееры). Для них на AVR встрою несложный таймер с индикатором, который будет отключать цепь по времени. Как думаете – все верно? (Для зарядки пальчиковых нет смысла городить тут ничего – применяю интеллектуальное ЗУ готовое)
×
×
  • Создать...