Мне как то нужно было написать программу управления сварочным аппаратом. Так вот там приходилось бороться за время слежения за жесткой характеристикой аппарата. При этом нужно было рассчитывать множество промежуточных констант и их данные использовать в регулировке характеристики. На ассемблере все времена видны. А как на СИ вы отследите и если нужно уменьшите эти времена. За Вас все делает компилятор.
6.9.2 CLKPR – Регистр Прескалера часов • Бит 7 – CLKPCE: Включение смены Прескалера часов Бит CLKPCE должен быть записан в логику один, чтобы включить изменение битов CLKPS. Бит CLKPCE обновляется только тогда, когда другие биты в CLKPR одновременно записываются в ноль. CLKPCE очищается аппаратным обеспечением через четыре цикла после его записи или при записи битов CLKPS. Переписывание бита CLKPCE в течение этого периода тайм-аута не продлевает период тайм-аута и не очищает его.
Да возможно Вы правы. Но этот бит определяет настройку частот PLL, а PLL работает.
Дорогой! Конечно каждый программирует так, как ему удобно. Но это не касается данной ситуации. Если ты привык к асму - молодец, но ты же понимаешь, что языки программирования для того и создавались, чтобы программисты могли общаться друг с другом о коде.
Я бы помог тебе, но читать листинг на асме я просто не стану. Глаза перестают видеть. Тебе уже сказали (для примера) про установку бит - это просто ужас! Асмовский код нуждается в бесконечном количестве комментов. Установка бит у тебя делается на полстраницы, так напиши рядом на английском языке, что и куда ты пишешь (да пусть и на русском, только регистры все назови, как в ДШ).
Скорее всего ты что-то упустил при инициализации ендпоинта. В даташите указана последовательность, и не простая, что, когда, и в какой регистр писать. Я постарался проверить твой код, но глаза "в трубочку свернулись" - не обессудь ;)).
Посмотри, как сделана инициализации в примерах, да хоть в той же Ардуинке, там USB-UART, но сути это не меняет.
Мой тебе совет - напиши все инициализации и все, что не касается самого обмена, на нормальном языке, тогда проверить можно будет. А на асме напиши критические вставки, где ты хочешь максимально быстро обмениваться данными с компом.
Даже если ты потом у себя в программе и напишешь все на асме (ты ж хозяин своим увлечениям?), но искать ошибку в инициализации в таком виде - невозможно. По крайней мере у меня не получается.
----------------
И про "китайское железо" - абсолютные выдумки. Для 328 есть клоны - они иначе называются. Клонов на 32U4 никто еще не видел. ;)) Так что если у тебя две платы ведут себя по разному - это глюк программы, проявляющийся в нестабильности или что-то натворил уже сам! ;))
Если можно я попрошу какую нибудь ссылку на пример.
Хочу лишь сказать, что и этот код взят с рабочих примеров. А что касается установки бит, конечно проще не думать головой, а использовать готовые функции. Программирование на ассемблере всегда считалось высшей школой мастерства, потому что общаешься непосредственно с процессором, а тут общение за Вас написал дядя программист. По крайней мере так считалось в советской высшей школе. Она для меня образец.
Ну тогда откуда взялись эти монстры по установке бит???? Какое это, прости уж, "мастерство"?
----
А в целом нужно уметь писать на асме, но писать на нем весь код, а не только критические места, либо самолюбование, либо просто хобби. Кто-то же засовывает модели кораблей в бутылку ;))))
----------------
Еще аз, я НЕ ОСУЖДАЮ твои увлечения! Но ты их показываешь другим, и не просто для красоты, а с вопросами, а это немного напрягает.
Попробовал не помогает. Я брал инициализацию точки с рабочих примеров. ардуино общается с компьютером, как положено, флаги устанавливает, значит инициализация прошла.
Ну тогда откуда взялись эти монстры по установке бит???? Какое это, прости уж, "мастерство"?
----
А в целом нужно уметь писать на асме, но писать на нем весь код, а не только критические места, либо самолюбование, либо просто хобби. Кто-то же засовывает модели кораблей в бутылку ;))))
----------------
Еще аз, я НЕ ОСУЖДАЮ твои увлечения! Но ты их показываешь другим, и не просто для красоты, а с вопросами, а это немного напрягает.
Я не претендую на мастерство и код я писал, чтобы научиться работать с УСБ. Код всегда можно оптимизировать. Из тех кто критикует установку бит никто не привел оптимальный код, кроме указания логических операций ori, andi с маской. В ассемблере оперируешь с названием бита и не всегда помнишь его номер.
Значит еще что-то упустил. Инит ЕП нужно делать непосредственно перед разрешением прерывания внутри ЕП. Возможно забыл само прерывание разрешить ;)).
Тот момент, что я указал, явно противоречит как ДШ, так и работающему коду. Это просто необходимо поставить, а дальше наверняка есть еще что-то.
Но дальше моя доброта на чтение асм-листингов не распространяется, прости. Тебе нужно искать каких-нибудь фанатов программирования для АВР на асме. Я знал для ПИКа таких, собственно один из моих одноклассников. Ненавидел Си ;))))))! Но мы - старичье по 50+ лет. Еще раз - сорри.
Но та ошибка, что я нашел, это точно ошибка. ДШ, раздел Endpoin selection, Endpoint activation. Не игнорируй, плз!
Значит еще что-то упустил. Инит ЕП нужно делать непосредственно перед разрешением прерывания внутри ЕП. Возможно забыл само прерывание разрешить ;)).
Тот момент, что я указал, явно противоречит как ДШ, так и работающему коду. Это просто необходимо поставить, а дальше наверняка есть еще что-то.
Но дальше моя доброта на чтение асм-листингов не распространяется, прости. Тебе нужно искать каких-нибудь фанатов программирования для АВР на асме. Я знал для ПИКа таких, собственно один из моих одноклассников. Ненавидел Си ;))))))! Но мы - старичье по 50+ лет. Еще раз - сорри.
Но та ошибка, что я нашел, это точно ошибка. ДШ, раздел Endpoin selection, Endpoint activation. Не игнорируй, плз!
Если можно я попрошу какую нибудь ссылку на пример.
ты само Ардуино ИДЕ скачай ;)))) Там вот прямо в коде ядра есть USBCore.cpp ;)) Вся инициализация и поддержка USB-UART да еще и с прерыванием именно на EP 0, ровно то, что ты пишешь.
Программирование на ассемблере всегда считалось высшей школой мастерства По крайней мере так считалось в советской высшей школе. Она для меня образец.
Извините, уважаемый, но тут Вы откровенно врёте. Качественное программирование ценилось в зависимости от задач этого самого программирования. Например в расчетных задачах никакой идиот не стал бы использовать ассемблер и каждый раз прописывать библиотечные функции. Там использовался Фортран. В задачах управления, как я помню, использовался Лисп. Да, при общении с конечным оборудованием использовался ассемблер, но его здорово теснил си (ещё без плюсов). Я говорю про 85-92 года, когда я этим конкретно занимался. Еще на ЕС, СМ и ВАКС.
Если можно я попрошу какую нибудь ссылку на пример.
ты само Ардуино ИДЕ скачай ;)))) Там вот прямо в коде ядра есть USBCore.cpp ;)) Вся инициализация и поддержка USB-UART да еще и с прерыванием именно на EP 0, ровно то, что ты пишешь.
Вот теперь точно фсё! ;)
Задача решилась. Теперь для меня ясно китайцы на прерываниях не экономят. Все устройство работает через прерывания. Спасибо ГУФ Вам за помощь, но все оказалось гораздо глубже.
Программирование на ассемблере всегда считалось высшей школой мастерства По крайней мере так считалось в советской высшей школе. Она для меня образец.
Извините, уважаемый, но тут Вы откровенно врёте. Качественное программирование ценилось в зависимости от задач этого самого программирования. Например в расчетных задачах никакой идиот не стал бы использовать ассемблер и каждый раз прописывать библиотечные функции. Там использовался Фортран. В задачах управления, как я помню, использовался Лисп. Да, при общении с конечным оборудованием использовался ассемблер, но его здорово теснил си (ещё без плюсов). Я говорю про 85-92 года, когда я этим конкретно занимался. Еще на ЕС, СМ и ВАКС.
А я программированием занялся лет 15 назад, а так ремонтировал станки с ЧПУ на отечественных 1801ВМ2
Все устройство работает через прерывания. Спасибо ГУФ Вам за помощь, но все оказалось гораздо глубже.
Вежливым будет рассказать. Хотя тебе решать.
Все дело в реакции устройства на первый дескриптор сброса. Оказывается, что в Протеусе ему по барабану, а в железе все сбрасывает и разрешение на прерывание. Пришлось добавить еще цикл инициализации точки. и все ок.
Все дело в реакции устройства на первый дескриптор сброса. Оказывается, что в Протеусе ему по барабану, а в железе все сбрасывает и разрешение на прерывание. Пришлось добавить еще цикл инициализации точки. и все ок.
В ардуиновском коде в обработке основного прерывания ЮСБ эту инициализацию, активацию и разрешение делают. Я всегда просто этот кусок повторял, не задумываясь особо ;)).
Все дело в реакции устройства на первый дескриптор сброса. Оказывается, что в Протеусе ему по барабану, а в железе все сбрасывает и разрешение на прерывание. Пришлось добавить еще цикл инициализации точки. и все ок.
Как нашел?
Просто все логически сопоставил. Я помню, что настройки точки ноль сбрасываются и у меня есть в коде ее повторная инициализация. Но ни как не мог подумать, что сбрасываются и разрешения. Чисто интуиция. Есть еще одни грабли, но об этом в следующей теме открою завтра. А так код был все ок.
Программирование на ассемблере всегда считалось высшей школой мастерства, потому что общаешься непосредственно с процессором, а тут общение за Вас написал дядя программист. По крайней мере так считалось в советской высшей школе. Она для меня образец.
Думаю, Вас кто-то обманул.
Посудите сами, у кого выше уровень: у писателя, который стал классиком, или у писаря, который переписал произведение классика красивым почерком. Так вот, ассемблер - это уровень каллиграфиста, а не писателя. Высший уровень - это проектировщик, а кодер - это, наоборот, низший уровень.
Было время, когда не было микрофонов и ценились люди с луженой глоткой. И такие люди до сих пор не могут смириться с тем, что популярность теперь приходит не к ним, а к людям, с выразительными, хотя и не сильными голосами.
Так и в программировании: когда в контроллере на все про все было 64 байта памяти, ценилось умение впихнуть в эти байты по максимуму. При том, что умение проектировать уважалось во все времена. Теперь же умение сэкономить десяток байтов ценой многодневного (а то и многомесячного) труда не востребовано, - дешевле взять чуть более просторный контроллер, и это выйдет гораздо дешевле (хотя бы за счет сроков разработки).
Так что сегодня знать Ассемблер полезно (хотя бы чтобы представлять, во что превратится Си-шный код), но писать на нем не нужно.
Вывод здесь только один - писать на С Вы не умеете. Может, научиться?
Может, но сначала давайте попробуем разобраться в причине вопроса, озвученного в теме форума.
Мне как то нужно было написать программу управления сварочным аппаратом. Так вот там приходилось бороться за время слежения за жесткой характеристикой аппарата. При этом нужно было рассчитывать множество промежуточных констант и их данные использовать в регулировке характеристики. На ассемблере все времена видны. А как на СИ вы отследите и если нужно уменьшите эти времена. За Вас все делает компилятор.
Какие фьюзы прошиваются ? Подозреваю что в proteus работает, а в железе нет из-за разницы фьюзов ...
Ну до микросекунд отследить и управлять несложно - есть готовые подпрограммы. А какие порядки Вас интересуют?
Программирую программой AVRDUDE_PROG3.2 Так вот там режим установки фьюзов прямой. На всех фьюзах стоят галки кроме bodlevel0,1,2.
Меня сейчас интересует ответ на тему форума. Это первично. Все остальное приходяще.
Строки 670-675 могут не срабатывать ! CLKPCE должен быть установлен в чистом регистре, а вы его загружаете значением из CLKPR.
Фото фьюзов покажите всё таки ...
Фото Ардуино до стирания китайской прошивки.
Фьюзы перед загрузкой моей
Почему фото из буфера не вставились.
Поясните как вставить изображение, через буфер вставляется, но в окне не появляется.
Почитайте вы уже правила форума ... FAQ ... на ставьте телегу впереди лошади !!!
...а на ассемблере написал свою библиотеку и все считает
То есть, писать библиотеки на Си мы не умеем?
Перевод с даташита
6.9.2 CLKPR – Регистр Прескалера часов • Бит 7 – CLKPCE: Включение смены Прескалера часов Бит CLKPCE должен быть записан в логику один, чтобы включить изменение битов CLKPS. Бит CLKPCE обновляется только тогда, когда другие биты в CLKPR одновременно записываются в ноль. CLKPCE очищается аппаратным обеспечением через четыре цикла после его записи или при записи битов CLKPS. Переписывание бита CLKPCE в течение этого периода тайм-аута не продлевает период тайм-аута и не очищает его.
Да возможно Вы правы. Но этот бит определяет настройку частот PLL, а PLL работает.
Дорогой! Конечно каждый программирует так, как ему удобно. Но это не касается данной ситуации. Если ты привык к асму - молодец, но ты же понимаешь, что языки программирования для того и создавались, чтобы программисты могли общаться друг с другом о коде.
Я бы помог тебе, но читать листинг на асме я просто не стану. Глаза перестают видеть. Тебе уже сказали (для примера) про установку бит - это просто ужас! Асмовский код нуждается в бесконечном количестве комментов. Установка бит у тебя делается на полстраницы, так напиши рядом на английском языке, что и куда ты пишешь (да пусть и на русском, только регистры все назови, как в ДШ).
Скорее всего ты что-то упустил при инициализации ендпоинта. В даташите указана последовательность, и не простая, что, когда, и в какой регистр писать. Я постарался проверить твой код, но глаза "в трубочку свернулись" - не обессудь ;)).
Посмотри, как сделана инициализации в примерах, да хоть в той же Ардуинке, там USB-UART, но сути это не меняет.
Мой тебе совет - напиши все инициализации и все, что не касается самого обмена, на нормальном языке, тогда проверить можно будет. А на асме напиши критические вставки, где ты хочешь максимально быстро обмениваться данными с компом.
Даже если ты потом у себя в программе и напишешь все на асме (ты ж хозяин своим увлечениям?), но искать ошибку в инициализации в таком виде - невозможно. По крайней мере у меня не получается.
----------------
И про "китайское железо" - абсолютные выдумки. Для 328 есть клоны - они иначе называются. Клонов на 32U4 никто еще не видел. ;)) Так что если у тебя две платы ведут себя по разному - это глюк программы, проявляющийся в нестабильности или что-то натворил уже сам! ;))
Строки 670-675 могут не срабатывать ! CLKPCE должен быть установлен в чистом регистре, а вы его загружаете значением из CLKPR.
Фото фьюзов покажите всё таки ...
Проверял код в виде не влияет
Скорее всего ты что-то упустил при инициализации ендпоинта.
Я нашел ошибку. Ты не сделал инит ЕП ДО ТОГО, как разрешить прерывание.
Ща покажу, как надо, тока на С, ессно.
Спасибо за такой обстоятельный комментарий.
Если можно я попрошу какую нибудь ссылку на пример.
Хочу лишь сказать, что и этот код взят с рабочих примеров. А что касается установки бит, конечно проще не думать головой, а использовать готовые функции. Программирование на ассемблере всегда считалось высшей школой мастерства, потому что общаешься непосредственно с процессором, а тут общение за Вас написал дядя программист. По крайней мере так считалось в советской высшей школе. Она для меня образец.
Ну тогда откуда взялись эти монстры по установке бит???? Какое это, прости уж, "мастерство"?
----
А в целом нужно уметь писать на асме, но писать на нем весь код, а не только критические места, либо самолюбование, либо просто хобби. Кто-то же засовывает модели кораблей в бутылку ;))))
----------------
Еще аз, я НЕ ОСУЖДАЮ твои увлечения! Но ты их показываешь другим, и не просто для красоты, а с вопросами, а это немного напрягает.
Скорее всего ты что-то упустил при инициализации ендпоинта.
Я нашел ошибку. Ты не сделал инит ЕП ДО ТОГО, как разрешить прерывание.
Ща покажу, как надо, тока на С, ессно.
Попробовал не помогает. Я брал инициализацию точки с рабочих примеров. ардуино общается с компьютером, как положено, флаги устанавливает, значит инициализация прошла.
Ну тогда откуда взялись эти монстры по установке бит???? Какое это, прости уж, "мастерство"?
----
А в целом нужно уметь писать на асме, но писать на нем весь код, а не только критические места, либо самолюбование, либо просто хобби. Кто-то же засовывает модели кораблей в бутылку ;))))
----------------
Еще аз, я НЕ ОСУЖДАЮ твои увлечения! Но ты их показываешь другим, и не просто для красоты, а с вопросами, а это немного напрягает.
Я не претендую на мастерство и код я писал, чтобы научиться работать с УСБ. Код всегда можно оптимизировать. Из тех кто критикует установку бит никто не привел оптимальный код, кроме указания логических операций ori, andi с маской. В ассемблере оперируешь с названием бита и не всегда помнишь его номер.
Попробовал не помогает.
Значит еще что-то упустил. Инит ЕП нужно делать непосредственно перед разрешением прерывания внутри ЕП. Возможно забыл само прерывание разрешить ;)).
Тот момент, что я указал, явно противоречит как ДШ, так и работающему коду. Это просто необходимо поставить, а дальше наверняка есть еще что-то.
Но дальше моя доброта на чтение асм-листингов не распространяется, прости. Тебе нужно искать каких-нибудь фанатов программирования для АВР на асме. Я знал для ПИКа таких, собственно один из моих одноклассников. Ненавидел Си ;))))))! Но мы - старичье по 50+ лет. Еще раз - сорри.
Но та ошибка, что я нашел, это точно ошибка. ДШ, раздел Endpoin selection, Endpoint activation. Не игнорируй, плз!
ori, andi
Это единственный верный способ, а не тот монстр, что ты используешь.
Сорри. Помочь я тебе больше не смогу, а трепаться можно в свободное время.
Попробовал не помогает.
Значит еще что-то упустил. Инит ЕП нужно делать непосредственно перед разрешением прерывания внутри ЕП. Возможно забыл само прерывание разрешить ;)).
Тот момент, что я указал, явно противоречит как ДШ, так и работающему коду. Это просто необходимо поставить, а дальше наверняка есть еще что-то.
Но дальше моя доброта на чтение асм-листингов не распространяется, прости. Тебе нужно искать каких-нибудь фанатов программирования для АВР на асме. Я знал для ПИКа таких, собственно один из моих одноклассников. Ненавидел Си ;))))))! Но мы - старичье по 50+ лет. Еще раз - сорри.
Но та ошибка, что я нашел, это точно ошибка. ДШ, раздел Endpoin selection, Endpoint activation. Не игнорируй, плз!
Так и сделано в коде
Если в Протеусе запрещаешь прерывания RXsTPE, RXoute, то он в прерывания тоже не входит
Если можно я попрошу какую нибудь ссылку на пример.
ты само Ардуино ИДЕ скачай ;)))) Там вот прямо в коде ядра есть USBCore.cpp ;)) Вся инициализация и поддержка USB-UART да еще и с прерыванием именно на EP 0, ровно то, что ты пишешь.
Вот теперь точно фсё! ;)
Спасибо.
Программирование на ассемблере всегда считалось высшей школой мастерства По крайней мере так считалось в советской высшей школе. Она для меня образец.
Извините, уважаемый, но тут Вы откровенно врёте. Качественное программирование ценилось в зависимости от задач этого самого программирования. Например в расчетных задачах никакой идиот не стал бы использовать ассемблер и каждый раз прописывать библиотечные функции. Там использовался Фортран. В задачах управления, как я помню, использовался Лисп. Да, при общении с конечным оборудованием использовался ассемблер, но его здорово теснил си (ещё без плюсов). Я говорю про 85-92 года, когда я этим конкретно занимался. Еще на ЕС, СМ и ВАКС.
Если можно я попрошу какую нибудь ссылку на пример.
ты само Ардуино ИДЕ скачай ;)))) Там вот прямо в коде ядра есть USBCore.cpp ;)) Вся инициализация и поддержка USB-UART да еще и с прерыванием именно на EP 0, ровно то, что ты пишешь.
Вот теперь точно фсё! ;)
Задача решилась. Теперь для меня ясно китайцы на прерываниях не экономят. Все устройство работает через прерывания. Спасибо ГУФ Вам за помощь, но все оказалось гораздо глубже.
Программирование на ассемблере всегда считалось высшей школой мастерства По крайней мере так считалось в советской высшей школе. Она для меня образец.
Извините, уважаемый, но тут Вы откровенно врёте. Качественное программирование ценилось в зависимости от задач этого самого программирования. Например в расчетных задачах никакой идиот не стал бы использовать ассемблер и каждый раз прописывать библиотечные функции. Там использовался Фортран. В задачах управления, как я помню, использовался Лисп. Да, при общении с конечным оборудованием использовался ассемблер, но его здорово теснил си (ещё без плюсов). Я говорю про 85-92 года, когда я этим конкретно занимался. Еще на ЕС, СМ и ВАКС.
А я программированием занялся лет 15 назад, а так ремонтировал станки с ЧПУ на отечественных 1801ВМ2
Все устройство работает через прерывания. Спасибо ГУФ Вам за помощь, но все оказалось гораздо глубже.
Вежливым будет рассказать. Хотя тебе решать.
Все устройство работает через прерывания. Спасибо ГУФ Вам за помощь, но все оказалось гораздо глубже.
Вежливым будет рассказать. Хотя тебе решать.
Все дело в реакции устройства на первый дескриптор сброса. Оказывается, что в Протеусе ему по барабану, а в железе все сбрасывает и разрешение на прерывание. Пришлось добавить еще цикл инициализации точки. и все ок.
Все дело в реакции устройства на первый дескриптор сброса. Оказывается, что в Протеусе ему по барабану, а в железе все сбрасывает и разрешение на прерывание. Пришлось добавить еще цикл инициализации точки. и все ок.
Как нашел?
В ардуиновском коде в обработке основного прерывания ЮСБ эту инициализацию, активацию и разрешение делают. Я всегда просто этот кусок повторял, не задумываясь особо ;)).
Все дело в реакции устройства на первый дескриптор сброса. Оказывается, что в Протеусе ему по барабану, а в железе все сбрасывает и разрешение на прерывание. Пришлось добавить еще цикл инициализации точки. и все ок.
Как нашел?
Просто все логически сопоставил. Я помню, что настройки точки ноль сбрасываются и у меня есть в коде ее повторная инициализация. Но ни как не мог подумать, что сбрасываются и разрешения. Чисто интуиция. Есть еще одни грабли, но об этом в следующей теме открою завтра. А так код был все ок.
Блин, пока я собирался "вернуться с работы и заняться", тут уже всё "без сопливых" решили :-) ну, и отлично!
Значит, это протеус китайский попался!
Блин, пока я собирался "вернуться с работы и заняться", тут уже всё "без сопливых" решили :-) ну, и отлично!
Значит, это протеус китайский попался!
Ничего завтра к концу дня открою другу тему про ардуино, тогда поговорим. Там косяки посерьезней.
Программирование на ассемблере всегда считалось высшей школой мастерства, потому что общаешься непосредственно с процессором, а тут общение за Вас написал дядя программист. По крайней мере так считалось в советской высшей школе. Она для меня образец.
Думаю, Вас кто-то обманул.
Посудите сами, у кого выше уровень: у писателя, который стал классиком, или у писаря, который переписал произведение классика красивым почерком. Так вот, ассемблер - это уровень каллиграфиста, а не писателя. Высший уровень - это проектировщик, а кодер - это, наоборот, низший уровень.
Было время, когда не было микрофонов и ценились люди с луженой глоткой. И такие люди до сих пор не могут смириться с тем, что популярность теперь приходит не к ним, а к людям, с выразительными, хотя и не сильными голосами.
Так и в программировании: когда в контроллере на все про все было 64 байта памяти, ценилось умение впихнуть в эти байты по максимуму. При том, что умение проектировать уважалось во все времена. Теперь же умение сэкономить десяток байтов ценой многодневного (а то и многомесячного) труда не востребовано, - дешевле взять чуть более просторный контроллер, и это выйдет гораздо дешевле (хотя бы за счет сроков разработки).
Так что сегодня знать Ассемблер полезно (хотя бы чтобы представлять, во что превратится Си-шный код), но писать на нем не нужно.