Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Millis() на ассемблере MCS-51

Пт сен 15, 2017 14:28:54

Все знают здесь такую штуку как Arduino, и наверное слышали о такой функции как millis(), считающая миллисекунды. По мне так очень полезная штука, позволяющая понять сколько времени прошло, или засечь интервал времени. Но Arduino - невозможно воспринимать всерьез, и захотелось сделать тоже самое, только на ассемблере MCS-51. Как это написать пока не знаю, может через годик-другой придумаю как, но концепция пока такая:
Функция имеет длину 32 бита (usigned long), и слава богам, беззнаковая. Значит, получается так: берем timer2, который есть во многих "больших" МК, и редко используется, по крайней мере, мной. Завожу таймер на одну миллисекунду, (причем он умеет автоперезагружаться). Создаю обработчик прерывания от этого, при каждом вызове котором последовательно инкрементируется 4 регистра памяти. Как посчитал, переполнение этого счетчика произойдет через 49 суток (+ накапливающаяся ошибка на времени выполнения инструкций, но пофиг, МК се равно не годятся для прецизионного счета времени). Потом просто читаю эти регистры, вычитаю, сравниваю, и т.п. Как-то так.
Непонятно (кроме того как это вообще сделать) как жить вместе с прерыванием, которое возникает каждые 1 мс. Все что пишу, придется увязывать с этим прерыванием. Запрещать нельзя, иначе с точностью совсем все плохо будет.
Что делать, когда 49 суток истекут, произойдет переполнение и проворот счетчика на нули, если до этого ее предыдущее значение "за миг" до переполнения уже записано. Из меньшего вычтется большее, получаем флаг OV, и фигню в беззнаковой "переменной". Проверять, не переполнится ли в ближайшем времени, это вообще, ад.
Короче, мне кажется что это все фигня, то что я придумал. Может есть способы лучше, для организации такого "длинного счета"?

Re: Millis() на ассемблере MCS-51

Пт сен 15, 2017 14:43:06

Не забывайте, что ардуино минимум в 12 раз производительнее, чем MCS-51, во всяком случае если сравнивать с классикой.
прерывание каждую миллисекунду для MCS-51 в классическом исполнении - это перебор.

не стоит гнаться за слишком универсальными функциями - зачем оно вам? ардуино - это конструктор, а у вас наверняка весь конструктор в голове, вам этот излишний универсализм не нужен.

Re: Millis() на ассемблере MCS-51

Пт сен 15, 2017 15:39:20

Что делать, когда 49 суток истекут, произойдет переполнение и проворот счетчика на нули, если до этого ее предыдущее значение "за миг" до переполнения уже записано. Из меньшего вычтется большее, получаем флаг OV, и фигню в беззнаковой "переменной".

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

Re: Millis() на ассемблере MCS-51

Пт сен 15, 2017 16:14:14

Завожу таймер на одну миллисекунду

как-то перебор получать прерываний каждую миллисекунду просто для того, чтобы иметь возможность оные миллисекунды изредка читать. Имхо разумнее так: таймер на максимально допустимое для него значение счетчика, прерывание по переполнению, в переменной считаем эти самые переполнения. При вызове функции считаем время как "длительность_до_переполнения * количество_переполнений + текущее время счетчика"

Re: Millis() на ассемблере MCS-51

Пт сен 15, 2017 16:37:27

Не забывайте, что ардуино минимум в 12 раз производительнее, чем MCS-51, во всяком случае если сравнивать с классикой.

А зачем нужна эта классика, когда есть однотактные STC и Silabs, скажем. На китайце я и два таймера с 1 мс периодом запускал, и нормально.
Переполнение unsigned long можно завести в еще один unsigned long и дальше по цепочке.

Re: Millis() на ассемблере MCS-51

Пт сен 15, 2017 17:54:16

Голимый писал(а):Но Arduino - невозможно воспринимать всерьез, и захотелось сделать тоже самое, только на ассемблере MCS-51.
Деградация... :facepalm:
Берите ARM, скажем STM32. У него есть системный таймер. Настраиваете прерывание на 1 мс и увеличивайте в нем переменную. Т. е. архитектура 32-ух битная, то нет всей той возни с софтовой работой с переменными больше байта как в 8-ми битниках - STM32 нативно поддерживает переменные до 4 байт, т. е. регистры 32-ух битные. :)

Re: Millis() на ассемблере MCS-51

Пт сен 15, 2017 18:24:19

Мурик писал(а):Берите ARM, скажем STM32

С удовольствием бы, только у меня ума не хватит с ним разобраться. Очень сложная штука, почти как компьютерный проц. Увидел как-то список документов, которые надо освоить - нутро упало.
Да и он на три вольта, значит все надо преобразователями уровней обвешивать.

Re: Millis() на ассемблере MCS-51

Пт сен 15, 2017 18:48:34

С удовольствием бы, только у меня ума не хватит с ним разобраться. Очень сложная штука, почти как компьютерный проц. Увидел как-то список документов, которые надо освоить - нутро упало.
Да и он на три вольта, значит все надо преобразователями уровней обвешивать.

Какие аппаратные возможности MCS-51 мы используешь? Таймеры, USART, что еще? Вот если в таком же объеме использовать STM32F0, без всяких DMA и т.д., то не настолько он и сложнее...

Re: Millis() на ассемблере MCS-51

Пт сен 15, 2017 19:30:46

Голимый писал(а):Очень сложная штука
Я бы на сказал бы.
Может если изучать все на уровне асма, то кажется сложным, но если писать на ЯВУ с использованием SPL или HAL, все относительно просто и нет необходимости от и до изучать всю документацию. На первых порах достаточно "по диагонали" прочитать даташит и по мере необходимости Reference manual.

Re: Millis() на ассемблере MCS-51

Пт сен 15, 2017 20:03:21

На первых порах достаточно "по диагонали" прочитать даташит и по мере необходимости Reference manual.

Может всё-таки наоборот?
:)
Основная информация о периферии содержится именно во втором документе.

Что касается процедуры обработки таймера в данном конкретном случае, если писать на Си, никакой разницы для писателя нет, все манипуляции с последовательным наращиванием байтов сделает компилятор. На асме в конечном коде да, разница будет, но кого это заботит? А код в прерывании для обеих платформ будет оперировать с unsigned long, в одной нативно, в другой адаптивно.
Последний раз редактировалось Zhuk72 Пт сен 15, 2017 21:09:50, всего редактировалось 1 раз.

Re: Millis() на ассемблере MCS-51

Пт сен 15, 2017 20:08:34

Zhuk72 писал(а):Может всё-таки наоборот?
Нет, я же упомянул про SPL и HAL. :)
Даташит нужно изучить чтобы иметь представление о МК и его возможностях, а при необходимости уточнения возможностей и методов работы с каким-либо периферийным модулем, нужно изучать Reference manual. :)

Re: Millis() на ассемблере MCS-51

Пт сен 15, 2017 21:11:32

По поводу SPL/HAL vs CMSIS мы уже говорили как-то, возвращаться к этому, тем более в этой теме, смысла нет.

Уже второй раз встречаю человека, восторгающегося этим "Millis". Что в нем такого особенного? Или это главная изюминка Ардуины?
В любом нормальном МК такое делается по ходу дела на "раз-два", т.к. практически в любом проекте требуется делать какие-то периодические задачи.

Re: Millis() на ассемблере MCS-51

Сб сен 16, 2017 00:39:08

Может если изучать все на уровне асма, то кажется сложным

у STM-ов асм несколько упорот. Согласно легенде, его сгенерировали автоматом из описания железа, не предполагая использования человеками)

Re: Millis() на ассемблере MCS-51

Сб сен 16, 2017 08:31:27

Все знают здесь такую штуку как Arduino, и наверное слышали о такой функции как millis(), считающая миллисекунды. По мне так очень полезная штука, позволяющая понять сколько времени прошло, или засечь интервал времени. Но Arduino - невозможно воспринимать всерьез, и захотелось сделать тоже самое, только на ассемблере MCS-51....
Короче, мне кажется что это все фигня, то что я придумал. Может есть способы лучше, для организации такого "длинного счета"?


Для mcs51 (как и для остальных семейств) существуют два способа формирования временных интервалов.
Программный - основан на времени исполнения цепочки команд (счетчик и/или простая цепочка nop).
Однако... появление МК с "конвеером предвыборки команд" делает такой способ весьма грубым...
Аппаратно-программный - основан на формировании маркера системной сетки частот при прерывании, сгенерированном автоперезагружаемым таймером на вход которого подается частота от системного генератора.
Для mcs51 в минимальном варианте это любой из С/Т0 или С/Т1 в режиме 2.
А вот входная частота - требует прочтения документации по конкретному кристаллу...
У "стандартных" и at89c/s5x от атмел - частота кварца/12. У иных может быть другая (зависит от организации системного генератора).
:beer:

Пы.Сы.

Насчет "несеръозности" ардуинки - ОШИБКА от неумелой готовки.
Забегай сюды (viewtopic.php?p=3177870#p3177870) со своими вопросами (и схемами) - обсудим.
Там же и КОТУИНО на основе AT89S52 под ассемблером имеется
viewtopic.php?p=3167597#p3167597
:hunger:

Re: Millis() на ассемблере MCS-51

Сб сен 16, 2017 10:44:53

arkhnchul писал(а):у STM-ов асм несколько упорот.
У STM32 ядро ARM. Считаете что у всех ARMов упоротый асм? Это не только МК, но и телефоны, платншеты и т. д.

BOB51 писал(а):Насчет "несеръозности" ардуинки - ОШИБКА от неумелой готовки.
Сколько таймеров ардуине на ATmega328 и какая у них разрядность? Сколько каналов ШИМ они поддерживают? Какой коэффициент деления у их предделителей? Таймеры поддерживают аппаратную работу с энкодерами и ШИМ захват? Однократный запуск поддерживают? А теперь посмотрите описание таймеров самого первого МК STM32 и как говорится, почувствуйте разницу по сравнению с ардуино http://robocraft.ru/blog/ARM/739.html

Это первая модель МК. В других есть скажем 32-уж битные таймеры.
С остальной периферией также - у ардуино она вообще никакая по сравнению с STM32.
Так что это не ошибка - ардуино это несерьезно. Вы видимо просто ее еще ни с чем не сравнивали. Вот и кажется что она "крутая", но МК давно устаревший. :dont_know:

Re: Millis() на ассемблере MCS-51

Сб сен 16, 2017 16:23:27

А что Вы скажете насчет такого:
Изображение
Изображение
Изображение
понятно, что цены на такие платки не слишком народные...
:cry:
и "по умолчанию" этот комплект не присутствует (загрузка из инета после инсталляции IDE по желанию пользователя)...
но...IDE то для работы одна и та же!
8)
А воть пара прямых ссылей:
https://store.arduino.cc/genuino-101
https://www.arduino.cc/en/uploads/Main/ ... ematic.pdf
это "наборчик для начинающих"
и чуток посолиднее:
https://store.arduino.cc/arduino-tian
https://store.arduino.cc/homepage/arduino-mkrfox1200
и мноого еще чего...
:roll:
конечно не абсолютная панацея, а ВСЕГО ЛИШЬ ОЧЕРЕДНОЙ КИРПИЧИК ЭЛЕМЕНТНОЙ БАЗЫ, которым нельзя брезговать.
:beer:
Последний раз редактировалось BOB51 Сб сен 16, 2017 16:42:52, всего редактировалось 1 раз.

Re: Millis() на ассемблере MCS-51

Сб сен 16, 2017 16:40:34

BOB51 писал(а):А что Вы скажете насчет такого
Дорого и ArduinoIDE будет предоставлять доступ только к малой части всех возможностей МК. :dont_know:

BOB51 писал(а):но...IDE то для работы одна и та же!
См. выше.
В чем сложность перехода на другую IDE? Тем более что у ArduinoIDE очень примитивные возможности.

Re: Millis() на ассемблере MCS-51

Сб сен 16, 2017 16:45:19

А никто не мешает держать ВСЕ виды элементной базы в равном доступе.
И использовать то, что наиболее полно удовлетворяет прикладной задаче (начиная с просторелюх с тумблерами и заканчивая псевдокомпьютерами распберри).
8)
Да и насчет "примитива" у ардуино IDE я б так не сказал.
Упрощено за счет применения стандартных библиотек "по умолчанию" и некоторые особенности...
Однако ВСЕ необходимые функции имеются в наличии даже без обязательных ассемблерных вставок.
А при глубококопании вполне можно и чего своего соорудить уже в конкретном подвиде Си для АВР или иного МК. Только то уже для спецов по мере освоения.
Относительно схемотехники внешней обвязки ессно есть замечание в связи с особенностью работы бутлоадера - но вполне понятное и предсказуемо устранимое.
Вобшшемсс... платка оценивается как программно-управляемый "черный ящик" с определенным набором внешних выводов при соответствующем их функционале.
Как и любой МК любого семейства.
8)

Re: Millis() на ассемблере MCS-51

Сб сен 16, 2017 17:02:22

Юзать ArduinoIDE и довольствоваться только малой частью возможностей МК это мягко говоря нерационально. Достаточно того что IDE не поддерживает внутрисхемную отладку, а она порой бывает нужна потому что много времени экономит. Не приходится гадать почему устройство работает не так как должно - запустил отладку и вперед искать баги в коде или изучать работу МК (если мало опыта работы с ним).

Re: Millis() на ассемблере MCS-51

Сб сен 16, 2017 17:17:09

Я их (ардуинки) и не собираюсь "по полной возможности МК" использовать. Да и в большинстве конструкций ОДНОВРЕМЕННО ВСЕ аппаратные ресурсы не используются - максимум половина (ежли еще и это задействуется)
Для такого случая есть обычные МК всех доступных семейств и ассемблер.
Задача ардуинок - второй уровень системы, абстрактные вычисления и "человеколюбивые" протоколы/интерфейсы.
Можно конечно и напрямую использовать - либо в виде малых платок либо в виде отдельных микросхем с соответствующей прошивкой (однако обойдется дороже аналогичной платки в сборе).
Да и смысл слишком глубоко рыть в МК с некоторой разновидностью ОС - просто берем и используем необходимое при соответствии задаче.
8)
Ответить