BOB51, да и в сях на таком коде должно работать. Студия в этом плане по возможности некорректный бряк перемещает туда, где он будет корректен. Я повторил показанный Сергеем кусок кода (картинка большая, засим под спойлером)Спойлер У меня бряк ставится на DDRB = 0b00000001; Но при дебаге по F11 честно перескакивает на PORTB = 0b00000001;
Скорее всего это из-за того, что заполнение DDRB - это первая команда в Си-листинге. Но при выполнении по F5 студия честно останавливается на присвоении PORTB.
Сергей Серебряков, попробуйте запустить дебаг (F11) и пошагово выполнить (F10/F11) вашу программу.
И да, проверьте, какие у вас настройки оптимизации и дебага. У меня с вот такими работает:
В 4 студии была функция Up-Download memory чтобы в процессе отладки можно было прочитать или записать память из файла. В 7-й студии не нашёл. Как это там называется или кто как решает такой вопрос?
FreshMan, выделяете текст. [/] на доп.клавиатуре коментит построчными // комментариями. [*] на доп. клавиатуре комментит выделенное блочным /* комментарием */ Но если не дунуть текст не выделять - ничего не получится.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Во время отладки вывожу в окне Output некоторые переменные в прерываниях. Для этого настраиваю Action в точках останова. Но мне также дополнительно требуется выводить, сколько натикало в Cycle Counter в каждом прерывании:
Перерыл все - не нашел (а может плохо искал). Единственное, в Visual Studio 2022 для точек останова есть функция $TICK https://docs.microsoft.com/en-us/visual ... racepoints Оказывается, она работает и для Microchip Studio, хотя ее нет в списке поддерживаемых функций, но, как я понял, выводит тики процессора машины, а не МК.
Доброго всем. Наверняка такой вопрос задавался, но поиском не нашел. Может ли такое быть, что Студия при оптимизации кода, заменяет 16 битную переменную на 8 битную? И как с этим бороться? переменная объявлена как uint16_t, присвоено значение 1162, декрементом должна добежать до нуля, но в Протеусе четко видно, что добегает до 907 и потом сразу падает в ноль
Сомневайтесь в этом утверждении (вполне вероятно, что другое), но поставьте volatile для этого случая и попробуйте.
через переводчик:
Цитата:
Ключевое слово volatile предназначено для предотвращения применения компилятором каких-либо оптимизаций к объектам, которые могут изменяться таким образом, который не может быть определен компилятором.
Land, запустите на выполнение в симуляторе студии. поставте бряк в проблемном месте и покажите нам сишный код и дизасм этого места. ЗЫ. Возможно, дизасм вам даже без нас ответ даст, 16 бит там или 8.
while (steps){} // висим в цикле пока не отщелкаются все шаги TCCR0B = 0x00; TIFR0 |= (1<< OCF0A)|(1 << OCF0B); TIMSK0 = 0x00; PORTB &= ~0x19; // ~(1 << INA)|(1 << EN1)|(1 << EN2) flag = RST; }
строка while (steps){} . В протеусе слежу за значением steps в окне переменная steps глобальная volatile uint16_t steps = STEP; Ей присваивается значение STEP = 1162. В прерывании таймера step декрементируется:
в дизасемблере присвоение значения выглядит так (1162 = 0x048A):
Код:
steps = STEP; 000000CD LDI R20,0x8A Load immediate --- D:\FIRMWARE\ATMEL\Jalousie_NEW\Driver\Driver\Debug/.././main.c ---------- 000000CE LDI R21,0x04 Load immediate 00000143 STS 0x0062,R21 Store direct to data space 00000145 STS 0x0061,R20 Store direct to data space
а декремент в прерывании уже так:
Код:
--steps; 0000003F LDS R24,0x0061 Load direct from data space 00000041 LDS R25,0x0062 Load direct from data space 00000043 SBIW R24,0x01 Subtract immediate from word 00000044 STS 0x0062,R25 Store direct to data space 00000046 STS 0x0061,R24 Store direct to data space
и, если я правильно понимаю, как-то так цикл while (steps){}
Код:
00000163 STS 0x0062,R1 Store direct to data space 00000165 STS 0x0061,R1 Store direct to data space 00000167 LDS R24,0x0061 Load direct from data space 00000169 LDS R25,0x0062 Load direct from data space 0000016B OR R24,R25 Logical OR 0000016C BRNE PC-0x05 Branch if not equal
вроде как и все правильно Может это глюк протеуса? Только почему Студия последовательно два значения в один регистр пихает? 00000163 STS 0x0062,R1 Store direct to data space 00000165 STS 0x0061,R1 Store direct to data space типа 16-ти разрядное значение загрузили: Синтаксис: Операнды: Счётчик команд: (i) STS k16, Rr 0 ≤ r ≤ 31, 0 ≤ k ≤ 65535 PC ← PC + 2
Land, запустите на выполнение в симуляторе студии. поставте бряк в проблемном месте и покажите нам сишный код и дизасм этого места. ЗЫ. Возможно, дизасм вам даже без нас ответ даст, 16 бит там или 8.
А в Студии все работает С 950 шагов до 890 прошел нормально. И кому верить? Протеусу или Студии?
На "живой конструкции" нельзя попробовать? Напр. светодиод привязан к флагу, или флаг -> к дисплея и т.н. А нет двух свободных пинов для флаг-контроля через модуль rx/tx и UART с визуализации к компу? Так эти туманные вопросы (цитат: "И кому верить? Протеусу или Студии?"), часто граничащие со слухами, легендами и т.п. непроверенные утверждения, то будут устранены. Или код разрабатываться только "на бумаге" (и на симуляторе)?
До сих пор обнаружил несколько несоответствий реакции кода при Proteus, но не против протестировать часть кода с его помощью. Но никогда: весь код, особенно с алгоритмами, связанными с отчетами о времени, прерывания и подобные.
veso74, можно конечно в железе посмотреть. Печаль в том, что собственно этот кусок в железе тестировался и все крутилось. Правда с меньшим числом шагов, может я и не заметил проблемы. А ног свободных нет, это в 13-й тиньке сидит. Ок, значит надо будет опять проводочки паять )
00000163 STS 0x0062,R1 Store direct to data space 00000165 STS 0x0061,R1 Store direct to data space 00000167 LDS R24,0x0061 Load direct from data space 00000169 LDS R25,0x0062 Load direct from data space 0000016B OR R24,R25 Logical OR 0000016C BRNE PC-0x05 Branch if not equal
вроде как и все правильно Может это глюк протеуса? Только почему Студия последовательно два значения в один регистр пихает? 00000163 STS 0x0062,R1 Store direct to data space 00000165 STS 0x0061,R1 Store direct to data space
В AVR GCC регистр R1 всегда содержит ноль. В функции компилятор не видит измений переменной steps и поэтому присваивает ей ноль, соответственно ваш цикл ожидания не отрабатывает. Добавьте volatile к определению переменной steps, это должно помочь. Другой подводный камень - прерывание может случиться между 00000167 и 00000169 и это тоже может привести к сбоям.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения