Toggling the Pin

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15558
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Toggling the Pin

Сообщение BOB51 »

Ну так свет клином только на АВРках не сошелся - подбор из имеющегося (mcs51, pic10/12/16/18/Enhanced Mid-Range, avr tiny/mega, stm8) и по разводке выводов и по начинке весьма велик.
8)
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Toggling the Pin

Сообщение Z_h_e »

Не хрена себе тему раздули на три листа...

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

ILYAUL, вот Вы говорите без разницы каким механизмом инвертировать выход ноги. Возьмем такую задачу. Нужно написать обработчик прерывания, который должен инвертировать бит0 портаА (выход). Значение этого бита может меняться в других местах кода программы. С помощью данного тоглинга процедура будет выглядеть так

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

SubProgramm:
                 SBI PINA,0
                 reti
Предложите код подпрограммы такой же длины не применяя тоглинг.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25222
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Toggling the Pin

Сообщение КРАМ »

Вы сначала приведите ПРИМЕР такой реальной задачи. Чтобы ОДНА лишняя строка была критична.
По моему опыту, эта команда сильно полезна для генерации меандра на ноге с предельным периодом в шесть машинных циклов. В осталном легко заменяется на маску XOR.
Последний раз редактировалось КРАМ Чт сен 03, 2015 14:56:40, всего редактировалось 1 раз.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Toggling the Pin

Сообщение Z_h_e »

Эта другая тема. Но могу привести. Например, может случиться так, что из-за одной лишней команды не хватит длины прыжка безусловного перехода.
Если подпрограммы вызывается часто, то время ее выполнения можно реально сократить и контроллер чаще будет спать. А Вы сможете подпрограмму написать добавив лишь одну строчку?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25222
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Toggling the Pin

Сообщение КРАМ »

Это херовый код, если имеется такое условие. И по прежнему умозрительный. На практике не встречается.
Про одну строчку читайте выше
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Toggling the Pin

Сообщение Z_h_e »

КРАМ, напишите мне код с одной дополнительной командой, я так не могу.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25222
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Toggling the Pin

Сообщение КРАМ »

Я не в курсе ассемблера авр, поэтому напишу на асме пика
movlw b'00001000'
xorwf PORTA, F
Логическая функция исключающее ИЛИ реверсирует бит в том разряде, где маска равна 1.
В приведенном примере будет реверс бита 3 в порту А.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Toggling the Pin

Сообщение Z_h_e »

Вобще то тут АВР обсуждаем...
Ну давайте отвечу на Ваш странную логику. Вы забыли сохранить регистр WORK в стеке и достать его обратно. С ПИКами продолжать не будем, это не то место.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
HardWareMan
Мучитель микросхем
Сообщения: 431
Зарегистрирован: Ср сен 02, 2015 07:47:20

Re: Toggling the Pin

Сообщение HardWareMan »

Z_h_e писал(а):

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

SubProgramm:
                 SBI PINA,0
                 reti
Предложите код подпрограммы такой же длины не применяя тоглинг.
Если эту задачу делать через EOR порта PORTx то придется таки сохранять в стеке SREG (а вместе с ним и еще один верхний регистр), иначе грабли обеспечены. Так что что-бы тут не говорили "гуру" и "мэтры" кодинга под AVR, если команда/функция есть, то почему бы ей не воспользоваться, верно? С другой стороны, если вернуться к негодованию ТС, то действительно могли бы сделать защиту "от дурака" переименовав регистр в "TOGGLEx", как уже было тут предложено.
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
Андрей СШ
Опытный кот
Сообщения: 806
Зарегистрирован: Ср май 06, 2015 06:41:27
Откуда: Благовещенск

Re: Toggling the Pin

Сообщение Андрей СШ »

КРАМ писал(а):Вы сначала приведите ПРИМЕР такой реальной задачи. Чтобы ОДНА лишняя строка была критична.
Всего навсего программный SPI или TWI.
Одна лишняя строка и потеря 10-и % скорости обеспечена.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25222
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Toggling the Pin

Сообщение КРАМ »

Андрей СШ писал(а): Одна лишняя строка и потеря 10-и % скорости обеспечена.
И что из этого?
Потеря скорости обмена на 10% В КАКОЙ ЗАДАЧЕ будет являться критической?
Это примерно как с оперативной памятью. Всегда можно умозрительно представить ситуацию, когда не хватило одной ячейки... Только кто так выбирает МК?
Если все так плохо и 10% скорости программного SPI или I2C обваливают алгоритм на ДАННОМ МК - смените МК. У части контроллеров нет команды "toggle". Но не у всех же. Есть МК с более высокой тактовой частотой.
Пересмотрите алгоритм. Выберете контроллер с меньшей латентностью прерываний.
ЗЫ. И 10% потерь даже в представленном примере выглядят синтетическими, то есть НЕТТО-потерями. Попробуйте расписать такой обмен с переводом указателя ЗА 10 СТРОК кода (точнее, за 10 машинных циклов). То есть обмен МАССИВОМ, где и будет потеряно 10% времени.
HardWareMan писал(а): Если эту задачу делать через EOR порта PORTx то придется таки сохранять в стеке SREG (а вместе с ним и еще один верхний регистр), иначе грабли обеспечены.
Тут я все таки полюбопытствую. Просто потому что не знаю этой особенности архитектуры АВР.
А что, порт не имеет прямой адресации в ОЗУ? В чем состоят грабли маски на порт без стека? Причем тут контекст?
Андрей СШ
Опытный кот
Сообщения: 806
Зарегистрирован: Ср май 06, 2015 06:41:27
Откуда: Благовещенск

Re: Toggling the Pin

Сообщение Андрей СШ »

КРАМ писал(а):Попробуйте расписать такой обмен с переводом указателя ЗА 10 СТРОК кода (точнее, за 10 машинных циклов). То есть обмен МАССИВОМ, где и будет потеряно 10% времени.
Не понял что значит с "переводом указателя", но вот вам код передачи байта по синхронному интерфейсу

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

01: LDI R18, clock_mask    ;маска для определения где пин тактового сигнала
02: LDI R17, 8                   ;длинна байта для передачи
03: LDS R16, память          ; собственно данные
04: ROL R16
05: CBI MOSI
06: BRCC #08
07: SBI MOSI
08: OUT PINx, R18            ;дёргаем тактовый выход
09: OUT PINx, R18            ;это занимает всего два такта процессора
10: DEC R17
11: BRNE #04
В этом коде 11 команд (включая #03, которой может и не быть в зависимости от источника данных) он исполняется в худшем случае за 5+12*8-1 = 100 тактов.

Если добавить в него всего одну команду SBI, то он увеличится до 116-и циклов, а это +16% времени выполнения.
В чем состоят грабли маски на порт без стека?
Грабли в том, что такой команды нет.
Последний раз редактировалось Андрей СШ Пт сен 04, 2015 04:33:46, всего редактировалось 1 раз.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25222
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Toggling the Pin

Сообщение КРАМ »

Вы так и дальше будете выводить единственную ячейку ОЗУ? Или все таки будете инкрементировать ее адрес и контролировать завершение цикла вывода МАССИВА?
В реальной задаче не выводится единственный байт. В реальной задаче байты выводятся бесконечно. И нужно либо указывать длину выводимого массива (точнее модифицировать указатель), либо модифицировать сами данные в единственной выводимой ячейке. То есть лишняя строка будет РАЗМАЗАНА на бОльшую длину кода.
Но я не понял, где в этом алгоритме может быть применена команда "Toggle"?
Андрей СШ
Опытный кот
Сообщения: 806
Зарегистрирован: Ср май 06, 2015 06:41:27
Откуда: Благовещенск

Re: Toggling the Pin

Сообщение Андрей СШ »

КРАМ писал(а):Но я не понял, где в этом алгоритме может быть применена команда "Toggle"?
Я даже не знаю что дальше сказать.

Вы готовы немного всё таки изучить AVR для участия в этом споре? А то мне очень сложно приводить доказательства человеку, который не знает ассемблера AVR.

http://www.gaw.ru/html.cgi/txt/doc/micr ... /start.htm
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25222
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Toggling the Pin

Сообщение КРАМ »

Вы не поверите, но у меня слева от окна радиокота открыт даташит на Мегу8 в разделе системы команд.
Однако Вы не ответили на вопрос ни с указателями, ни с реверсом пина.
Команды CBI/SBI не имеют отношения к "toggle".
Насколько я понимаю, ВСЯ АРИФМЕТИКА в АВР производится только через РОНы.
Тогда почему нужно плакать по поводу "toggle", если вопрос о перегрузке в РОН - маске - выгрузке в ОЗУ - это стандартная процедура в АВР? Ну такая архитектура, ну и что?
В ПИКах другая ущербность.
Последний раз редактировалось КРАМ Пт сен 04, 2015 04:54:27, всего редактировалось 1 раз.
Андрей СШ
Опытный кот
Сообщения: 806
Зарегистрирован: Ср май 06, 2015 06:41:27
Откуда: Благовещенск

Re: Toggling the Pin

Сообщение Андрей СШ »

Если прочитать первое сообщение темы, то можно узнать, что:
1. Даташит на Мегу8 надо закрыть.
2. Даташит на tiny4313 надо открыть.
3. Toggling выполняется командой

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

08: OUT PINx, R18            ;дёргаем тактовый выход
Но это хорошо, что Вы согласны всё таки спорить на аргументах, а не на "сам дурак"

Вопрос про указатель я просто не понял. К счастью мне всегда удаётся организовать код без указателей и поэтому я не понимаю почему они обязательно должны быть в "реальных" задачах.

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

Я предпочитаю делить код на: исполняемый AVRкой и ошибочный. Это по крайней мере не вызывает споров.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25222
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Toggling the Pin

Сообщение КРАМ »

А в каком месте было "сам дурак"?
Я собственно и просил рассказать ровно то, о чем Вы мне любезно изложили.
Правда вопрос о критичности 10 (или 16) процентов остался открытым.
В коде действительно имеется выгрузка только ОДНОГО байта. Содержимого ЕДИНСТВЕННОЙ ячейки.
Андрей СШ писал(а): Вопрос про указатель я просто не понял. К счастью мне всегда удаётся организовать код без указателей и поэтому я не понимаю почему они обязательно должны быть в "реальных" задачах.
:shock:
Научите, уважаемый...
Андрей СШ
Опытный кот
Сообщения: 806
Зарегистрирован: Ср май 06, 2015 06:41:27
Откуда: Благовещенск

Re: Toggling the Pin

Сообщение Андрей СШ »

"Сам дурак" было в этой теме до Вашего появления.

10% на самом деле обычно действительно не критично. Ничего не развалится, но станет на 10% медленнее или на 10% прожорливее. Плохо это или нормально зависит от обстоятельств.

Как это ни странно но этот пример я взял не с потолка. У меня действительно есть два устройства в которых микроконтроллер передаёт за раз один байт из одной ячейки:
1. График в статье http://radiokot.ru/circuit/digital/automat/90/ построен путём периодической передачи в слепую одной и той же переменной. При этом замедление передачи данных замедляет основной алгоритм, что снижает эффективность устройства. А там даже 1% критично.

2. Есть микроконтроллер, который периодически замеряет напряжение на аккумуляторной банке и передаёт его в "центр" (всего один байт). Тут увеличение кода передачи на 16% увеличивает энергопотребление приблизительно на 8%, что при длительном хранении аккумулятора вылезает боком.

По toggle никто не плачет, потому что оно есть и можно использовать. Проблема только в том, что активируется фича не очевидным образом. Но и это уже не проблема для тех, кто посетил эту тему.
КРАМ писал(а):Научите, уважаемый...
Ну как то само так получается при использовании любого нормального (не Си) языка программирования. http://geektimes.ru/post/257638/
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25222
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Toggling the Pin

Сообщение КРАМ »

К сожалению, пока не могу открыть ссылку (я в Турции, а в отеле периодически обваливают нагрузкой ВайФай роутеры).
Однако.
Я очень редко прибегаю к Си (разве только когда речь идет об объемных стеках типа USB или TCP/IP, а остальные задачи реализую практически только в ассемблере.
Так вот я не понимаю как можно писать без указателей, если подавляющее большинство задач так или иначе связаны с обработкой МАССИВОВ.
А адресация массива производится ТОЛЬКО через указатель...
Впрочем, возможно по ссылке есть иной метод... :)
ЗЫ. Модификация переменной в Ваших примерах так или иначе входит в общий цикл вывода. И значит потери времени в % станут меньше.
Ситуации, когда критичность к скорости исполнения кода велика вплоть до 10% потерь - это крайне редкая ситуация. Скажем, в случае с аккумулятором легко возмещаются изменением ПЕРИОДА измерений или усложнением алгоритма обмена, когда передача "на базу" происходит не всех измерений подряд.
Я тоже могу привести пример, когда я был связан с отсутствием альтернативного контроллера по экономическим основаниям и вынужден был слегка превысить (на 9%) допустимую по даташиту скорость аппаратного SPI. Но к вопросу топикстартера эти случаи отношения не имеют.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Toggling the Pin

Сообщение oleg110592 »

Андрей СШ писал(а):Проблема только в том, что активируется фича не очевидным образом
совершенно очевидным способом - смотрим в даташите раздел "I/O-Ports" пункт "Toggling the Pin" в меге8 такого пункта нет. Правда документацию читать обычно не принято.
В продвинутой меге48/88, по ногам совместимой с мегой8, эта фича работает.
Ответить

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