Нужна помощь по написанию функции на АСМе

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
rxstart1
Вымогатель припоя
Сообщения: 508
Зарегистрирован: Пт фев 22, 2013 18:00:43
Откуда: Беларусь, г. Гомель

Нужна помощь по написанию функции на АСМе

Сообщение rxstart1 »

В общем возникла необходимость написать функцию задержки на АСМе и передать в нее параметр как в СИ, вот тут то и наступил на грабли. т. е. в идеале это должна быть функция вида _delay(<время задержки>) вот с передачей параметра и возникла проблема, т. е. если я делаю асм вставку, где в регистр запихиваю фиксированное значение все работает, но мне нужна именно функция, что бы использовать ее много раз в коде. Пишу в AVR VISUAL STUDIO.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Нужна помощь по написанию функции на АСМе

Сообщение COKPOWEHEU »

http://nongnu.org/avr-libc/user-manual/assembler.html
тут описано через какие регистры передаются параметры в avr-gcc, какие регистры можно использовать и какие соглашения требуется соблюдать.
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: Нужна помощь по написанию функции на АСМе

Сообщение Vov123 »

Придётся писать столько подпрограмм, сколько видов задержек надо, или вызывать одну подпрограмму столько раз, какая задержка необходима.
Вероятно второй вариант более оптимальный.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нужна помощь по написанию функции на АСМе

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Re: Нужна помощь по написанию функции на АСМе

Сообщение ptr128 »

Код: Выделить всё

void delay(uint8_t delay)
{
  asm volatile ( ";                 \n\t \
WAIT_LOOP%=:                        \n\t \
  dec   %[delay]            ;1    \n\t \
  brne  WAIT_LOOP%=         ;1/2  \n\t \
  "
  : [delay] "+d" (delay) :  : "cc" );
}

Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Аватара пользователя
rxstart1
Вымогатель припоя
Сообщения: 508
Зарегистрирован: Пт фев 22, 2013 18:00:43
Откуда: Беларусь, г. Гомель

Re: Нужна помощь по написанию функции на АСМе

Сообщение rxstart1 »

Спасибо за ответ. Стандартная функция не устраивает из-за размера библиотеки :)))
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: Нужна помощь по написанию функции на АСМе

Сообщение Vov123 »

так эта функция только максимум на 255 тиков
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Re: Нужна помощь по написанию функции на АСМе

Сообщение ptr128 »

Этот пример для 8-битного параметра. Никто Вам не мешает использовать 16/24/32/64 бита. Вопрос был в том, как передать параметр в ассемблер, что я и показал.

А вообще, по уму, больше чем несколько десятков тактов задержки на цикле делать не рекомендую. Пользуйтесь таймерами и прерываниями для больших интервалов.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нужна помощь по написанию функции на АСМе

Сообщение ARV »

rxstart1 писал(а):Спасибо за ответ. Стандартная функция не устраивает из-за размера библиотеки :)))

да вы что?! :shock: а я вот в полный рост использую "библиотечные" задержки в проектах на attiny13... и как-то на размер не жалуюсь...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
AQ29
Нашел транзистор. Понюхал.
Сообщения: 198
Зарегистрирован: Сб июл 30, 2011 21:00:24

Re: Нужна помощь по написанию функции на АСМе

Сообщение AQ29 »

rxstart1 писал(а):В общем возникла необходимость написать функцию задержки на АСМе и передать в нее параметр...
Пишу в AVR VISUAL STUDIO.

Пишите на АБ, там можно практически всё программировать через вызов функций с параметрами.
Если нужна задержка в миллисекундах, то можно использовать функцию delay_ms (), где в скобках - время в миллисекундах.
Если нужны любые другие задержки, то можно просто использовать функцию delay (), где в скобках параметры задержки.
И это всё будет ассемблер.
AQ29
Нашел транзистор. Понюхал.
Сообщения: 198
Зарегистрирован: Сб июл 30, 2011 21:00:24

Re: Нужна помощь по написанию функции на АСМе

Сообщение AQ29 »

ptr128 писал(а):А вообще, по уму, больше чем несколько десятков тактов задержки на цикле делать не рекомендую. Пользуйтесь таймерами и прерываниями для больших интервалов.

Таймер может быть занят другими подпрограммами.
Если МК во время задержки ничего не делает, лучше сделать задержку на цикле. Точнее, сделать вызов соответствующей функции.
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Re: Нужна помощь по написанию функции на АСМе

Сообщение ptr128 »

AQ29 писал(а):Таймер может быть занят другими подпрограммами.
Если МК во время задержки ничего не делает, лучше сделать задержку на цикле.

Таймер не может быть "занят подпрограммой", особенно если МК при этом "ничего не делает".
А с точки зрения написания прерывания таймера, никто не запрещает в этом пререывании, например, считать время в какой-то переменной и в каких-то попугаях. А во всем остальном коде, использовать это время для длительных задержек.
По крайней мере, Вы сможете действительно тогда измерять промежутки времени относительно точно, а не как в цикле, плюс минус лапоть, не зная, сколько времени ушло на обработку прерываний во время выполнения Вашего цикла.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Нужна помощь по написанию функции на АСМе

Сообщение COKPOWEHEU »

Таймер может быть занят генерацией ШИМа, подсчетом внешних импульсов, полуфабрикатом для какого-нибудь интерфейса (UART хотя бы). Если при этом в основном цикле не требуется быстрой реакции на события, использование "тупых" задержек вполне допустимо.
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Re: Нужна помощь по написанию функции на АСМе

Сообщение ptr128 »

COKPOWEHEU писал(а):Таймер может быть занят генерацией ШИМа

Таймер, генерирующий ШИМ, вполне приемлем для вычисления задержек, кратных частоте ШИМ.

COKPOWEHEU писал(а):использование "тупых" задержек вполне допустимо

ptr128 писал(а):плюс минус лапоть, не зная, сколько времени ушло на обработку прерываний


COKPOWEHEU писал(а):подсчетом внешних импульсов, полуфабрикатом для какого-нибудь интерфейса (UART хотя бы)

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

Спор ни о чем. Приведите конкретный пример проекта, в котором заняты все таймеры и ни один из них нельзя использовать унифицировано. Тогда можно будет обсудить. В том числе и то, насколько правильно был выбран именно этот МК.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Нужна помощь по написанию функции на АСМе

Сообщение COKPOWEHEU »

Таймер, генерирующий ШИМ, вполне приемлем для вычисления задержек, кратных частоте ШИМ.
Это если его частота фиксирована.
Никто не запрещает так же watchdog таймер в режиме прерывания использовать для задержек.
Немногие контроллеры так умеют. Вроде, только тиньки и то не все.
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Re: Нужна помощь по написанию функции на АСМе

Сообщение ptr128 »

COKPOWEHEU писал(а):
Таймер, генерирующий ШИМ, вполне приемлем для вычисления задержек, кратных частоте ШИМ.
Это если его частота фиксирована.

А какой смысл менять частоту ШИМ? В подавлющем большинстве случаев, мы управляем скважностью ШИМ на одной и той же частоте.

COKPOWEHEU писал(а):
watchdog таймер
Немногие контроллеры так умеют. Вроде, только тиньки и то не все.

Вы бы пример привели. А то я не знаю ни одного AVR, без Watchdog Interrupt
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нужна помощь по написанию функции на АСМе

Сообщение ARV »

ptr128 писал(а):А то я не знаю ни одного AVR, без Watchdog Interrupt
atmega8
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Re: Нужна помощь по написанию функции на АСМе

Сообщение ptr128 »

ARV писал(а):
ptr128 писал(а):А то я не знаю ни одного AVR, без Watchdog Interrupt
atmega8

Благодарю. Буду теперь знать, с чем не стоит связываться )
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Нужна помощь по написанию функции на АСМе

Сообщение COKPOWEHEU »

А какой смысл менять частоту ШИМ? В подавлющем большинстве случаев, мы управляем скважностью ШИМ на одной и той же частоте.

Есть еще режим СТС. Ну можно и поизвращаться экзотическую задачу придумать :) но мне лень
Вы бы пример привели. А то я не знаю ни одного AVR, без Watchdog Interrupt
ATtiny2313, ATmega8, ATmega8515. Наверное, все более-менее старые версии. Кстати на ATmega8 напрасно наезжаете - довольно удачный контроллер. А вот у AT90S2313 / ATtiny2313 видимо, нехорошая аура - новички с ним постоянно косячат :)
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Re: Нужна помощь по написанию функции на АСМе

Сообщение ptr128 »

COKPOWEHEU писал(а):
Вы бы пример привели. А то я не знаю ни одного AVR, без Watchdog Interrupt
ATtiny2313

А вот про него не надо! С ним я уже лично знаком )
Изображение

COKPOWEHEU писал(а):Кстати на ATmega8 напрасно наезжаете - довольно удачный контроллер.

Тут не наезд, а лично мнение, да еще и со смайликом.
А если серьезно, за те же деньги STM8 есть уже на плате и микроUSB для питания. То есть, для себя я пока ограничился линейкой, полностью покрывающей мои текущие потребности:
ATTiny2313, STM8S103F, STM8S103K, ATmega168A, ATmega328P, STM32F103, ESP8266
Вложения
attiny2313_wdg.jpg
(26.07 КБ) 738 скачиваний
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Ответить

Вернуться в «AVR»