Все знают здесь такую штуку как Arduino, и наверное слышали о такой функции как millis(), считающая миллисекунды. По мне так очень полезная штука, позволяющая понять сколько времени прошло, или засечь интервал времени. Но Arduino - невозможно воспринимать всерьез, и захотелось сделать тоже самое, только на ассемблере MCS-51. Как это написать пока не знаю, может через годик-другой придумаю как, но концепция пока такая: Функция имеет длину 32 бита (usigned long), и слава богам, беззнаковая. Значит, получается так: берем timer2, который есть во многих "больших" МК, и редко используется, по крайней мере, мной. Завожу таймер на одну миллисекунду, (причем он умеет автоперезагружаться). Создаю обработчик прерывания от этого, при каждом вызове котором последовательно инкрементируется 4 регистра памяти. Как посчитал, переполнение этого счетчика произойдет через 49 суток (+ накапливающаяся ошибка на времени выполнения инструкций, но пофиг, МК се равно не годятся для прецизионного счета времени). Потом просто читаю эти регистры, вычитаю, сравниваю, и т.п. Как-то так. Непонятно (кроме того как это вообще сделать) как жить вместе с прерыванием, которое возникает каждые 1 мс. Все что пишу, придется увязывать с этим прерыванием. Запрещать нельзя, иначе с точностью совсем все плохо будет. Что делать, когда 49 суток истекут, произойдет переполнение и проворот счетчика на нули, если до этого ее предыдущее значение "за миг" до переполнения уже записано. Из меньшего вычтется большее, получаем флаг OV, и фигню в беззнаковой "переменной". Проверять, не переполнится ли в ближайшем времени, это вообще, ад. Короче, мне кажется что это все фигня, то что я придумал. Может есть способы лучше, для организации такого "длинного счета"?
Не забывайте, что ардуино минимум в 12 раз производительнее, чем MCS-51, во всяком случае если сравнивать с классикой. прерывание каждую миллисекунду для MCS-51 в классическом исполнении - это перебор.
не стоит гнаться за слишком универсальными функциями - зачем оно вам? ардуино - это конструктор, а у вас наверняка весь конструктор в голове, вам этот излишний универсализм не нужен.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Что делать, когда 49 суток истекут, произойдет переполнение и проворот счетчика на нули, если до этого ее предыдущее значение "за миг" до переполнения уже записано. Из меньшего вычтется большее, получаем флаг OV, и фигню в беззнаковой "переменной".
Не будет никакой фигни, из меньшего вычтется большее и получится правильный результат.
как-то перебор получать прерываний каждую миллисекунду просто для того, чтобы иметь возможность оные миллисекунды изредка читать. Имхо разумнее так: таймер на максимально допустимое для него значение счетчика, прерывание по переполнению, в переменной считаем эти самые переполнения. При вызове функции считаем время как "длительность_до_переполнения * количество_переполнений + текущее время счетчика"
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Не забывайте, что ардуино минимум в 12 раз производительнее, чем MCS-51, во всяком случае если сравнивать с классикой.
А зачем нужна эта классика, когда есть однотактные STC и Silabs, скажем. На китайце я и два таймера с 1 мс периодом запускал, и нормально. Переполнение unsigned long можно завести в еще один unsigned long и дальше по цепочке.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Но Arduino - невозможно воспринимать всерьез, и захотелось сделать тоже самое, только на ассемблере MCS-51.
Деградация... Берите ARM, скажем STM32. У него есть системный таймер. Настраиваете прерывание на 1 мс и увеличивайте в нем переменную. Т. е. архитектура 32-ух битная, то нет всей той возни с софтовой работой с переменными больше байта как в 8-ми битниках - STM32 нативно поддерживает переменные до 4 байт, т. е. регистры 32-ух битные.
С удовольствием бы, только у меня ума не хватит с ним разобраться. Очень сложная штука, почти как компьютерный проц. Увидел как-то список документов, которые надо освоить - нутро упало. Да и он на три вольта, значит все надо преобразователями уровней обвешивать.
С удовольствием бы, только у меня ума не хватит с ним разобраться. Очень сложная штука, почти как компьютерный проц. Увидел как-то список документов, которые надо освоить - нутро упало. Да и он на три вольта, значит все надо преобразователями уровней обвешивать.
Какие аппаратные возможности MCS-51 мы используешь? Таймеры, USART, что еще? Вот если в таком же объеме использовать STM32F0, без всяких DMA и т.д., то не настолько он и сложнее...
Я бы на сказал бы. Может если изучать все на уровне асма, то кажется сложным, но если писать на ЯВУ с использованием SPL или HAL, все относительно просто и нет необходимости от и до изучать всю документацию. На первых порах достаточно "по диагонали" прочитать даташит и по мере необходимости Reference manual.
На первых порах достаточно "по диагонали" прочитать даташит и по мере необходимости Reference manual.
Может всё-таки наоборот?
Основная информация о периферии содержится именно во втором документе.
Что касается процедуры обработки таймера в данном конкретном случае, если писать на Си, никакой разницы для писателя нет, все манипуляции с последовательным наращиванием байтов сделает компилятор. На асме в конечном коде да, разница будет, но кого это заботит? А код в прерывании для обеих платформ будет оперировать с unsigned long, в одной нативно, в другой адаптивно.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Последний раз редактировалось Zhuk72 Пт сен 15, 2017 21:09:50, всего редактировалось 1 раз.
Нет, я же упомянул про SPL и HAL. Даташит нужно изучить чтобы иметь представление о МК и его возможностях, а при необходимости уточнения возможностей и методов работы с каким-либо периферийным модулем, нужно изучать Reference manual.
По поводу SPL/HAL vs CMSIS мы уже говорили как-то, возвращаться к этому, тем более в этой теме, смысла нет.
Уже второй раз встречаю человека, восторгающегося этим "Millis". Что в нем такого особенного? Или это главная изюминка Ардуины? В любом нормальном МК такое делается по ходу дела на "раз-два", т.к. практически в любом проекте требуется делать какие-то периодические задачи.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Все знают здесь такую штуку как Arduino, и наверное слышали о такой функции как millis(), считающая миллисекунды. По мне так очень полезная штука, позволяющая понять сколько времени прошло, или засечь интервал времени. Но Arduino - невозможно воспринимать всерьез, и захотелось сделать тоже самое, только на ассемблере MCS-51.... Короче, мне кажется что это все фигня, то что я придумал. Может есть способы лучше, для организации такого "длинного счета"?
Для mcs51 (как и для остальных семейств) существуют два способа формирования временных интервалов. Программный - основан на времени исполнения цепочки команд (счетчик и/или простая цепочка nop). Однако... появление МК с "конвеером предвыборки команд" делает такой способ весьма грубым... Аппаратно-программный - основан на формировании маркера системной сетки частот при прерывании, сгенерированном автоперезагружаемым таймером на вход которого подается частота от системного генератора. Для mcs51 в минимальном варианте это любой из С/Т0 или С/Т1 в режиме 2. А вот входная частота - требует прочтения документации по конкретному кристаллу... У "стандартных" и at89c/s5x от атмел - частота кварца/12. У иных может быть другая (зависит от организации системного генератора).
У STM32 ядро ARM. Считаете что у всех ARMов упоротый асм? Это не только МК, но и телефоны, платншеты и т. д.
BOB51 писал(а):
Насчет "несеръозности" ардуинки - ОШИБКА от неумелой готовки.
Сколько таймеров ардуине на ATmega328 и какая у них разрядность? Сколько каналов ШИМ они поддерживают? Какой коэффициент деления у их предделителей? Таймеры поддерживают аппаратную работу с энкодерами и ШИМ захват? Однократный запуск поддерживают? А теперь посмотрите описание таймеров самого первого МК STM32 и как говорится, почувствуйте разницу по сравнению с ардуино http://robocraft.ru/blog/ARM/739.html
Это первая модель МК. В других есть скажем 32-уж битные таймеры. С остальной периферией также - у ардуино она вообще никакая по сравнению с STM32. Так что это не ошибка - ардуино это несерьезно. Вы видимо просто ее еще ни с чем не сравнивали. Вот и кажется что она "крутая", но МК давно устаревший.
понятно, что цены на такие платки не слишком народные...
и "по умолчанию" этот комплект не присутствует (загрузка из инета после инсталляции IDE по желанию пользователя)... но...IDE то для работы одна и та же!
А никто не мешает держать ВСЕ виды элементной базы в равном доступе. И использовать то, что наиболее полно удовлетворяет прикладной задаче (начиная с просторелюх с тумблерами и заканчивая псевдокомпьютерами распберри).
Да и насчет "примитива" у ардуино IDE я б так не сказал. Упрощено за счет применения стандартных библиотек "по умолчанию" и некоторые особенности... Однако ВСЕ необходимые функции имеются в наличии даже без обязательных ассемблерных вставок. А при глубококопании вполне можно и чего своего соорудить уже в конкретном подвиде Си для АВР или иного МК. Только то уже для спецов по мере освоения. Относительно схемотехники внешней обвязки ессно есть замечание в связи с особенностью работы бутлоадера - но вполне понятное и предсказуемо устранимое. Вобшшемсс... платка оценивается как программно-управляемый "черный ящик" с определенным набором внешних выводов при соответствующем их функционале. Как и любой МК любого семейства.
Юзать ArduinoIDE и довольствоваться только малой частью возможностей МК это мягко говоря нерационально. Достаточно того что IDE не поддерживает внутрисхемную отладку, а она порой бывает нужна потому что много времени экономит. Не приходится гадать почему устройство работает не так как должно - запустил отладку и вперед искать баги в коде или изучать работу МК (если мало опыта работы с ним).
Я их (ардуинки) и не собираюсь "по полной возможности МК" использовать. Да и в большинстве конструкций ОДНОВРЕМЕННО ВСЕ аппаратные ресурсы не используются - максимум половина (ежли еще и это задействуется) Для такого случая есть обычные МК всех доступных семейств и ассемблер. Задача ардуинок - второй уровень системы, абстрактные вычисления и "человеколюбивые" протоколы/интерфейсы. Можно конечно и напрямую использовать - либо в виде малых платок либо в виде отдельных микросхем с соответствующей прошивкой (однако обойдется дороже аналогичной платки в сборе). Да и смысл слишком глубоко рыть в МК с некоторой разновидностью ОС - просто берем и используем необходимое при соответствии задаче.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения