Arduino не входит в прерывание конечных точек

sadman41
Offline
Зарегистрирован: 19.10.2016
  uint32_t number = 0xFFFFFFFF;
  uint64_t result = (uint64_t)number * 2;

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vladsf пишет:
Мне как то нужно было умножить два числа вида $FFFFFFFF. На СИ этого не получается, там ограничения в максимальном размере - $FFFF
Понятно.

Вывод здесь только один - писать на С Вы не умеете. Может, научиться?

vladsf
Offline
Зарегистрирован: 30.03.2021

Может, но сначала давайте попробуем разобраться в причине вопроса, озвученного в теме форума.

vladsf
Offline
Зарегистрирован: 30.03.2021

Мне как то нужно было написать программу управления сварочным аппаратом. Так вот там приходилось бороться за время слежения за жесткой характеристикой аппарата. При этом нужно было рассчитывать множество промежуточных констант и их данные использовать в регулировке характеристики. На ассемблере все времена видны. А как на СИ вы отследите и если нужно уменьшите эти времена. За Вас все делает компилятор.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Какие фьюзы прошиваются ? Подозреваю что в proteus работает, а в железе нет из-за разницы фьюзов ...

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

vladsf пишет:
На ассемблере все времена видны. А как на СИ вы отследите и если нужно уменьшите эти времена. За Вас все делает компилятор.

Ну до микросекунд отследить и управлять несложно - есть готовые подпрограммы. А какие порядки Вас интересуют?

vladsf
Offline
Зарегистрирован: 30.03.2021

Программирую программой AVRDUDE_PROG3.2 Так вот там режим установки фьюзов прямой. На всех фьюзах стоят галки кроме bodlevel0,1,2.

vladsf
Offline
Зарегистрирован: 30.03.2021

Меня сейчас интересует ответ на тему форума. Это первично. Все остальное приходяще.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Строки 670-675 могут не срабатывать ! CLKPCE должен быть установлен в чистом регистре, а вы его загружаете значением из CLKPR.

Фото фьюзов покажите всё таки ...

vladsf
Offline
Зарегистрирован: 30.03.2021

Фото Ардуино до стирания китайской прошивки.

 

Фьюзы перед загрузкой моей

Почему фото из буфера не вставились.

 

vladsf
Offline
Зарегистрирован: 30.03.2021

vladsf
Offline
Зарегистрирован: 30.03.2021

Поясните как вставить изображение, через буфер вставляется, но в окне не появляется.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Почитайте вы уже правила форума ... FAQ ... на ставьте телегу впереди лошади !!!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vladsf пишет:

...а на ассемблере написал свою библиотеку и все считает

То есть, писать библиотеки на Си мы не умеем?

vladsf
Offline
Зарегистрирован: 30.03.2021

vladsf
Offline
Зарегистрирован: 30.03.2021

Перевод с даташита

6.9.2 CLKPR – Регистр Прескалера часов • Бит 7 – CLKPCE: Включение смены Прескалера часов Бит CLKPCE должен быть записан в логику один, чтобы включить изменение битов CLKPS. Бит CLKPCE обновляется только тогда, когда другие биты в CLKPR одновременно записываются в ноль. CLKPCE очищается аппаратным обеспечением через четыре цикла после его записи или при записи битов CLKPS. Переписывание бита CLKPCE в течение этого периода тайм-аута не продлевает период тайм-аута и не очищает его.

Да возможно Вы правы. Но этот бит определяет настройку частот PLL, а PLL работает.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Дорогой! Конечно каждый программирует так, как ему удобно. Но это не касается данной ситуации. Если ты привык к асму - молодец, но ты же понимаешь, что языки программирования для того и создавались, чтобы программисты могли общаться друг с другом о коде.

Я бы помог тебе, но читать листинг на асме я просто не стану. Глаза перестают видеть. Тебе уже сказали (для примера) про установку бит - это просто ужас! Асмовский код нуждается в бесконечном количестве комментов. Установка бит у тебя делается на полстраницы, так напиши рядом на английском языке, что и куда ты пишешь (да пусть и на русском, только регистры все назови, как в ДШ).

Скорее всего ты что-то упустил при инициализации ендпоинта. В даташите указана последовательность, и не простая, что, когда, и в какой регистр писать. Я постарался проверить твой код, но глаза "в трубочку свернулись" - не обессудь ;)). 

Посмотри, как сделана инициализации в примерах, да хоть в той же Ардуинке, там USB-UART, но сути это не меняет.

Мой тебе совет - напиши все инициализации и все, что не касается самого обмена, на нормальном языке, тогда проверить можно будет. А  на асме напиши критические вставки, где ты хочешь максимально быстро обмениваться данными с компом.

Даже если ты потом у себя в программе и напишешь все на асме  (ты ж хозяин своим увлечениям?), но искать ошибку в инициализации в таком виде  - невозможно. По крайней мере у меня не получается.

----------------

И про "китайское железо" - абсолютные выдумки. Для 328 есть клоны - они иначе называются. Клонов на 32U4 никто еще не видел. ;)) Так что если у тебя две платы ведут себя по разному - это глюк программы, проявляющийся в нестабильности или что-то натворил уже сам! ;))

vladsf
Offline
Зарегистрирован: 30.03.2021

Komandir пишет:

Строки 670-675 могут не срабатывать ! CLKPCE должен быть установлен в чистом регистре, а вы его загружаете значением из CLKPR.

Фото фьюзов покажите всё таки ...

Проверял код в виде не влияет

init_USB_DEVICE:
clr	r16
sts	CLKPR,r16
lds r16, Clkpr
ldi r23, CLKPCE
call wybor_bit_or;and
sts Clkpr, r16
clr	r16
sts	CLKPR,r16	

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

wdrakula пишет:

Скорее всего ты что-то упустил при инициализации ендпоинта.

Я нашел ошибку. Ты не сделал инит ЕП ДО ТОГО, как разрешить прерывание.

Ща покажу, как надо, тока на С, ессно.

    UENUM = 0;
    UECONX = (1<<EPEN);
    UECFG0X = EP_TYPE_CONTROL;
    UECFG1X = EP_SINGLE_64;

 

vladsf
Offline
Зарегистрирован: 30.03.2021

Спасибо за такой обстоятельный комментарий.

Если можно я попрошу какую нибудь ссылку на пример.

Хочу лишь сказать, что и этот код взят с рабочих примеров. А что касается установки бит, конечно проще не думать головой, а использовать готовые функции. Программирование на ассемблере всегда считалось высшей школой мастерства, потому что общаешься непосредственно с процессором, а тут общение за Вас написал дядя программист. По крайней мере так считалось в советской высшей школе. Она для меня образец.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

vladsf пишет:
Она для меня образец.

Ну тогда откуда взялись эти монстры по установке бит???? Какое это, прости уж, "мастерство"?

----

А в целом нужно уметь писать на асме, но писать на нем весь код, а не только критические места, либо самолюбование, либо просто хобби. Кто-то же засовывает модели кораблей в бутылку ;))))

----------------

Еще аз, я НЕ ОСУЖДАЮ твои увлечения! Но ты их показываешь другим, и не просто для красоты, а с вопросами, а это немного напрягает.

vladsf
Offline
Зарегистрирован: 30.03.2021

wdrakula пишет:

wdrakula пишет:

Скорее всего ты что-то упустил при инициализации ендпоинта.

Я нашел ошибку. Ты не сделал инит ЕП ДО ТОГО, как разрешить прерывание.

Ща покажу, как надо, тока на С, ессно.

    UENUM = 0;
    UECONX = (1<<EPEN);
    UECFG0X = EP_TYPE_CONTROL;
    UECFG1X = EP_SINGLE_64;

 

 

 

Попробовал не помогает. Я брал инициализацию точки с рабочих примеров. ардуино общается с компьютером, как положено, флаги устанавливает, значит инициализация прошла.

vladsf
Offline
Зарегистрирован: 30.03.2021

wdrakula пишет:

vladsf пишет:
Она для меня образец.

Ну тогда откуда взялись эти монстры по установке бит???? Какое это, прости уж, "мастерство"?

----

А в целом нужно уметь писать на асме, но писать на нем весь код, а не только критические места, либо самолюбование, либо просто хобби. Кто-то же засовывает модели кораблей в бутылку ;))))

----------------

Еще аз, я НЕ ОСУЖДАЮ твои увлечения! Но ты их показываешь другим, и не просто для красоты, а с вопросами, а это немного напрягает.

Я не претендую на мастерство и код я писал, чтобы научиться работать с УСБ. Код всегда можно оптимизировать. Из тех кто критикует установку бит никто не привел оптимальный код, кроме указания логических операций ori, andi  с маской. В ассемблере оперируешь с названием бита и не всегда помнишь его номер.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

vladsf пишет:

Попробовал не помогает.

Значит еще что-то упустил. Инит ЕП нужно делать непосредственно перед разрешением прерывания внутри ЕП. Возможно забыл само прерывание разрешить ;)).

Тот момент, что я указал, явно противоречит как ДШ, так и работающему коду. Это просто необходимо поставить, а дальше наверняка есть еще что-то.

Но дальше моя доброта на чтение асм-листингов не распространяется, прости. Тебе нужно искать каких-нибудь фанатов программирования для АВР на асме. Я знал для ПИКа таких, собственно один из моих одноклассников. Ненавидел Си ;))))))! Но мы  - старичье по 50+ лет. Еще раз - сорри.

Но та ошибка, что я нашел, это точно ошибка. ДШ, раздел Endpoin selection, Endpoint activation. Не игнорируй, плз!

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

vladsf пишет:

 ori, andi

Это единственный верный способ, а не тот монстр, что ты используешь.

Сорри. Помочь я тебе больше не смогу, а трепаться можно в свободное время.

vladsf
Offline
Зарегистрирован: 30.03.2021

wdrakula пишет:

vladsf пишет:

Попробовал не помогает.

Значит еще что-то упустил. Инит ЕП нужно делать непосредственно перед разрешением прерывания внутри ЕП. Возможно забыл само прерывание разрешить ;)).

Тот момент, что я указал, явно противоречит как ДШ, так и работающему коду. Это просто необходимо поставить, а дальше наверняка есть еще что-то.

Но дальше моя доброта на чтение асм-листингов не распространяется, прости. Тебе нужно искать каких-нибудь фанатов программирования для АВР на асме. Я знал для ПИКа таких, собственно один из моих одноклассников. Ненавидел Си ;))))))! Но мы  - старичье по 50+ лет. Еще раз - сорри.

Но та ошибка, что я нашел, это точно ошибка. ДШ, раздел Endpoin selection, Endpoint activation. Не игнорируй, плз!

Так и сделано в коде

call ep0_iniz
lds r16, UDIEN
ldi r23, EORSTE
call wybor_bit_or
sts	UDIEN,r16
ldi	r16,0
sts	UENUM,r16			; Âûáèðàåì EndPoint 0 (ìàëî ëè ÷òî òàì ñëó÷èëîñü)
lds r16, UEIENX
ldi r23, RXSTPE; ðàçðåøåíèå ïðåðûâàíèÿ ïî setup pacet
call wybor_bit_or
sts	UEIENX,r16
lds r16, UEIENX
ldi r23, RXOUTE; ðàçðåøåíèå ïðåðûâàíèÿ ïî ïðèåìó äàííûõ
call wybor_bit_or
sts	UEIENX,r16

Если в Протеусе запрещаешь прерывания RXsTPE, RXoute, то он в прерывания тоже не входит

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

vladsf пишет:

 

Если можно я попрошу какую нибудь ссылку на пример.

ты само Ардуино ИДЕ скачай ;)))) Там вот прямо в коде ядра есть USBCore.cpp ;)) Вся инициализация и поддержка USB-UART да еще и с прерыванием именно на EP 0, ровно то, что ты пишешь.

Вот теперь точно фсё! ;)

vladsf
Offline
Зарегистрирован: 30.03.2021

Спасибо.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

vladsf пишет:

Программирование на ассемблере всегда считалось высшей школой мастерства По крайней мере так считалось в советской высшей школе. Она для меня образец.

Извините, уважаемый, но тут Вы откровенно врёте. Качественное программирование ценилось в зависимости от задач этого самого программирования. Например в расчетных задачах никакой идиот не стал бы использовать ассемблер и каждый раз прописывать библиотечные функции. Там использовался Фортран. В задачах управления, как я помню, использовался Лисп. Да, при общении с конечным оборудованием использовался ассемблер, но его здорово теснил си (ещё без плюсов). Я говорю про 85-92 года, когда я этим конкретно занимался. Еще на ЕС, СМ и ВАКС.

vladsf
Offline
Зарегистрирован: 30.03.2021

wdrakula пишет:

vladsf пишет:

 

Если можно я попрошу какую нибудь ссылку на пример.

ты само Ардуино ИДЕ скачай ;)))) Там вот прямо в коде ядра есть USBCore.cpp ;)) Вся инициализация и поддержка USB-UART да еще и с прерыванием именно на EP 0, ровно то, что ты пишешь.

Вот теперь точно фсё! ;)

Задача решилась. Теперь для меня ясно китайцы на прерываниях не экономят. Все устройство работает через прерывания. Спасибо ГУФ Вам за помощь, но все оказалось гораздо глубже.

vladsf
Offline
Зарегистрирован: 30.03.2021

mykaida пишет:

vladsf пишет:

Программирование на ассемблере всегда считалось высшей школой мастерства По крайней мере так считалось в советской высшей школе. Она для меня образец.

Извините, уважаемый, но тут Вы откровенно врёте. Качественное программирование ценилось в зависимости от задач этого самого программирования. Например в расчетных задачах никакой идиот не стал бы использовать ассемблер и каждый раз прописывать библиотечные функции. Там использовался Фортран. В задачах управления, как я помню, использовался Лисп. Да, при общении с конечным оборудованием использовался ассемблер, но его здорово теснил си (ещё без плюсов). Я говорю про 85-92 года, когда я этим конкретно занимался. Еще на ЕС, СМ и ВАКС.

А я программированием занялся лет 15 назад, а так ремонтировал станки с ЧПУ на отечественных 1801ВМ2

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

vladsf пишет:

 Все устройство работает через прерывания. Спасибо ГУФ Вам за помощь, но все оказалось гораздо глубже.

Вежливым будет рассказать. Хотя тебе решать.

vladsf
Offline
Зарегистрирован: 30.03.2021

wdrakula пишет:

vladsf пишет:

 Все устройство работает через прерывания. Спасибо ГУФ Вам за помощь, но все оказалось гораздо глубже.

Вежливым будет рассказать. Хотя тебе решать.

Все дело в реакции устройства на первый дескриптор сброса. Оказывается, что в Протеусе ему по барабану, а в железе все сбрасывает и разрешение на прерывание. Пришлось добавить еще цикл инициализации точки. и все ок.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

vladsf пишет:

Все дело в реакции устройства на первый дескриптор сброса. Оказывается, что в Протеусе ему по барабану, а в железе все сбрасывает и разрешение на прерывание. Пришлось добавить еще цикл инициализации точки. и все ок.

Как нашел?

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

В ардуиновском коде в обработке основного прерывания ЮСБ эту инициализацию, активацию и разрешение делают. Я всегда просто этот кусок повторял, не задумываясь особо ;)).

vladsf
Offline
Зарегистрирован: 30.03.2021

wdrakula пишет:

vladsf пишет:

Все дело в реакции устройства на первый дескриптор сброса. Оказывается, что в Протеусе ему по барабану, а в железе все сбрасывает и разрешение на прерывание. Пришлось добавить еще цикл инициализации точки. и все ок.

Как нашел?

 

Просто все логически сопоставил. Я помню, что настройки точки ноль сбрасываются и у меня есть в коде ее повторная инициализация. Но ни как не мог подумать, что сбрасываются и разрешения. Чисто интуиция. Есть еще одни грабли, но об этом в следующей теме открою завтра. А так код был все ок.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, пока я собирался "вернуться с работы и заняться", тут уже всё "без сопливых" решили :-) ну, и отлично!

Значит, это протеус китайский попался!

vladsf
Offline
Зарегистрирован: 30.03.2021

ЕвгенийП пишет:

Блин, пока я собирался "вернуться с работы и заняться", тут уже всё "без сопливых" решили :-) ну, и отлично!

Значит, это протеус китайский попался!

Ничего завтра к концу дня открою другу тему про ардуино, тогда поговорим. Там косяки посерьезней.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vladsf пишет:

Программирование на ассемблере всегда считалось высшей школой мастерства, потому что общаешься непосредственно с процессором, а тут общение за Вас написал дядя программист. По крайней мере так считалось в советской высшей школе. Она для меня образец.

Думаю, Вас кто-то обманул.

Посудите сами, у кого выше уровень: у писателя, который стал классиком, или у писаря, который переписал произведение классика красивым почерком. Так вот, ассемблер - это уровень каллиграфиста, а не писателя. Высший уровень - это проектировщик, а кодер - это, наоборот, низший уровень.

Было время, когда не было микрофонов и ценились люди с луженой глоткой. И такие люди до сих пор не могут смириться с тем, что популярность теперь приходит не к ним, а к людям, с выразительными, хотя и не сильными голосами.

Так и в программировании: когда в контроллере на все про все было 64 байта памяти, ценилось умение впихнуть в эти байты по максимуму. При том, что умение проектировать уважалось во все времена. Теперь же умение сэкономить десяток байтов ценой многодневного (а то и многомесячного) труда не востребовано, - дешевле взять чуть более просторный контроллер, и это выйдет гораздо дешевле (хотя бы за счет сроков разработки).

Так что сегодня знать Ассемблер полезно (хотя бы чтобы представлять, во что превратится Си-шный код), но писать на нем не нужно.