Добрый день! Кто подскажет, почему не запускается прерывание переполнения (т.е. не формируется событие переполнения) в режиме захвата. Из-за этого не получается запустить ведомый таймер или отработать прерывание переполнения. Измеритель частоты на 3 каскадах работает нормально. Пробовал различные комбинации с TIM1...TIM4. В режиме захвата, каждый таймер измеряет ШИМ нормально.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
как-то у Вас все термины в кучу, вот смотрите: каскадирование - соединение счетчиков (читай таймеров), так что предыдущий это как предделитель для следующего, т.е. для этого вызов прерывания не нужен; тут же Вы пишите "Измеритель частоты на 3 каскадах работает нормально" - т.е. получается состыковали 3 таймера? далее "переполнение" таймера - по сути это совпадение "веса" счетчика со значением в ARR, формируется упр.импульс события "переполнения", далее идут действия завязанные на это событие; например взводится флаг, если настроены прерывания таймер "стукнет током" контроллер прерывания - брось все запускай обработчик прерывания. переполнения может на приключиться, например, потому что - выключен, не тактируется, не дотягивается (т.е. в режиме сброс сбрасывается раньше, чем достигнет значения в ARR).
не особо знаю асму, все не проверял, но это бросилось в глаза : MOV32 R0,#TIM1_DIER_UIE ; STR Unit, [R0] что здесь должно загрузиться в R0?
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Видимо значение неуказанных символических имён предлагается угадать экстрасенсам? Дальше должно следовать выдавливание информации по капли из партизана. Видимо это не ему нужно, а он делает одолжение форуму выдавая детали по крупицам.
PS: И при чём тут вообще ШИМ???
PPS: А прерывание не вызывается видимо потому, что оно не разрешено в NVIC. Или потому, что не прописан адрес ISR в вектор таблицы прерываний. Или потому, что неправильно прописано расположение таблицы прерываний. Или потому что прерывания глобально запрещены. Или по 100500 другим причинам...
Видимо значение неуказанных символических имён предлагается угадать экстрасенсам?
Полагаю, что они объявлены в стандартном inc-файле МК в проекте. Из контекста следует. И отличается от маски бит в CMSIS именем периферии: #TIM1_DIER_UIE
Тому кто начинал программировать с языков высокого уровня психологически трудно перейти на Ассемблер, по себе знаю. Но жизнь заставила, нужно было делать ассемблерные вставки для ускорения работы программ. С тех пор пишу на Ассемблере. Если есть вопросы отвечу.
Но жизнь заставила, нужно было делать ассемблерные вставки для ускорения работы программ. С тех пор пишу на Ассемблере.
Ускорение инициализации периферии? Серьёзно??? А какой смысл? Да и нет там у вас там никакого ускорения, а наоборот - плохим знанием ассемблера вы сделали код более громоздким и тормозным чем его сделал бы нормальный компилятор. Одна только многократная загрузка адресов регистров одного и того же таймера чего стоит! Нафига так делать??
PS: Чтобы программировать на асме действительно эффективно и от этого была польза и смысл, надо сперва изучить систему команд МК. Чего вы не сделали, как видно по коду.
jcxz ! Вы хотите все сразу и большой ложкой. 1. Тот вид куска программы показан для лучшего понимания тем кто имеет мало опыта в Ассемблере. Если бы я представил в оптимизированном виде, Вы бы еще дольше разбирались. 2. Вы правы в том что я не указал, что есть "0" и "1", что вызвало суету. Исправляю:
GET stm32f103_Keil.s
Unit RN 11 ;"1" - еденица (R11) Noll RN 10 ;"0" - ноль (R10) Rsos RN 9 ;Rsos - Регистр СОСТОЯНИЯ ПРОГРАММЫ (R9)
; Для BitBand под рукой всегда должны быть нолик MOV32 Noll,#0 ; Для BitBand под рукой всегда должны быть единичка MOV32 Unit,#1
3. У меня конкретный вопрос. Я никогда не пользовался одновременно несколькими прерываниями, в частности - Обновлением и Захвата. Возможно это? Если возможно, то как? У меня не получается.
Конечно возможно. Какие биты разрешений подняты, такие и будут генерировать прерывания. Только их нужно в обработчике сортировать. Сейчас лениво лезть в проект, но у меня по какому то (не помню) таймеру в 407-м генерируются прерывания и по ШИМу (увы, не по захвату) и по апдейту. Причина банальна. Автор проекта, который я по наследству правил, не удосужился оставить конкретные ноги под медленный ШИМ и пришлось делать ШИМ ногодрыгом из прерываний.
А прерывание не вызывается видимо потому, что оно не разрешено в NVIC. Или потому, что не прописан адрес ISR в вектор таблицы прерываний. Или потому, что неправильно прописано расположение таблицы прерываний. Или потому что прерывания глобально запрещены.
Причина конечно есть, но поскольку РАЗДЕЛЬНО прерывания генерируются, то ни одна из перечисленных причин не катит. Вектор у таймера один, к слову. А IVT вообще должен формировать линкер...
Я может не правильно сформулировал задачу. Дело в том что по отдельности каждое прерывание работает (по очереди запрещал),а вот вместе нет - сбоит. Такое впечатление, что наезжают друг на друга прерывания. Хотя старался разводить их измеряемым сигналом. Отработку прерываний уменьшал до 0,8 мкС. У меня создалось впечатление, что сигналы запуска и захвата каким-то образом запускают прерывание обновления. Спасибо! Появились идеи, попробую проверить.
PSC [70-1], ARR [FFFF] (до максимума), SMS [100], TS [101], CC1S [ 01] - режим сброс, нога для сброса - вход первого канала, т.е. тактирование от внутр., при фронте на ноге 1-го канала, обнулится начнет снова; CC1E [ 1] - вход первого канала разрешен; MMS [010] - если случится "обновление" счетчика пнуть ведомый тамер, т.е. этот импульс транслируется в TRGO; CNT [ 0] - начальное значение счетчика CCR1 [ 0] - значение в регистре 1-го канала, странно как-то CEN [ 1] - разрешить тактирование счетчика UIE [ 1] - разрешить дергать контроллер прерываний при обновлении счетчика, т.е. из FFFF в 0000 CC1IE [ 1] - разрешить дергать контроллер прерываний при совпадении с регистром 1-го канала, а в нем 0000, т.е. опять же при переходе FFFF в 0000 счетчика.
чего я напутал?
а га, CC1E [ 1] - это переключение в захват, т.е. по фронту на ноге 1-го канала счетчик будет копироваться в регистр ентого канала и генериться прерывание, стоп но на этой же ноге сброс счетчика, т.е. опять прерывания одновременны? чего-то я запутался
предыдущий мой опус следовало б стереть, да теперь поздно.
я б, наверное, не каскадировал, а в обработчике по флагу переполнения наращивал 32-битную переменную, по флагу захвата забирал ccr. А если все таки каскадировать - без прерываний аппаратно - первый в режиме Сброс, остальные просто ведомые, вх.сигнал (по кому захватывать) подать на все; по прерыванию от первого забираем все ccr, ведомые таймеры на исходную (первый на автомате).
хотя, скорее всего, я просто не понял задачу kuratora
kurator - для таймеров st не нужна асма, это не старинный пик - где всё было программным. Более того, таймеры от st спроектированы так - чтобы регистрировать и отмерять время недостижимое классическим программным способом. Для начала сформулируйте основную задачу, что именно вам нужно сделать (не как сделать а именно что сделать). С подробным описанием возможностей и требований к будущему девайсу. Что-то мне подсказывает, что решение очень простое.
kurator - для таймеров st не нужна асма, это не старинный пик - где всё было программным. Более того, таймеры от st спроектированы так - чтобы регистрировать и отмерять время недостижимое классическим программным способом.
Какой то эпичный бред. Что про "асму", что про пики, что про таймеры в СТм.
Уважаемые, кто в курсе, можно ли 2 счётчика заставить считать синхронно, если да, то как? Что на данный момент, таймер 4 считает импульсы энкодера и настроен в режиме мастера, Т12 в режиме слейв, в результате переполнения Т4 получаем Т12 +1 Хотелось чтобы они считали тики вместе, только у каждого разная "верхушка" т.е. переполнение, например у Т4 наступает при 7123 импульса а у Т12 через 33, и по каждому переполнению генерится прерывание, это реально сделать, или такое надо делать по другому?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 38
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения