Страница 3 из 6
Re: Toggling the Pin
Добавлено: Чт сен 03, 2015 11:42:10
BOB51
Ну так свет клином только на АВРках не сошелся - подбор из имеющегося (mcs51, pic10/12/16/18/Enhanced Mid-Range, avr tiny/mega, stm8) и по разводке выводов и по начинке весьма велик.

Re: Toggling the Pin
Добавлено: Чт сен 03, 2015 14:45:53
Z_h_e
Не хрена себе тему раздули на три листа...
ТС спасибо, не знал о таком механизме переключения порта, реально можно в некоторых случаях сократить код.
ILYAUL, вот Вы говорите без разницы каким механизмом инвертировать выход ноги. Возьмем такую задачу. Нужно написать обработчик прерывания, который должен инвертировать бит0 портаА (выход). Значение этого бита может меняться в других местах кода программы. С помощью данного тоглинга процедура будет выглядеть так
Предложите код подпрограммы такой же длины не применяя тоглинг.
Re: Toggling the Pin
Добавлено: Чт сен 03, 2015 14:50:28
КРАМ
Вы сначала приведите ПРИМЕР такой реальной задачи. Чтобы ОДНА лишняя строка была критична.
По моему опыту, эта команда сильно полезна для генерации меандра на ноге с предельным периодом в шесть машинных циклов. В осталном легко заменяется на маску XOR.
Re: Toggling the Pin
Добавлено: Чт сен 03, 2015 14:54:36
Z_h_e
Эта другая тема. Но могу привести. Например, может случиться так, что из-за одной лишней команды не хватит длины прыжка безусловного перехода.
Если подпрограммы вызывается часто, то время ее выполнения можно реально сократить и контроллер чаще будет спать. А Вы сможете подпрограмму написать добавив лишь одну строчку?
Re: Toggling the Pin
Добавлено: Чт сен 03, 2015 14:59:23
КРАМ
Это херовый код, если имеется такое условие. И по прежнему умозрительный. На практике не встречается.
Про одну строчку читайте выше
Re: Toggling the Pin
Добавлено: Чт сен 03, 2015 15:06:03
Z_h_e
КРАМ, напишите мне код с одной дополнительной командой, я так не могу.
Re: Toggling the Pin
Добавлено: Чт сен 03, 2015 15:13:17
КРАМ
Я не в курсе ассемблера авр, поэтому напишу на асме пика
movlw b'00001000'
xorwf PORTA, F
Логическая функция исключающее ИЛИ реверсирует бит в том разряде, где маска равна 1.
В приведенном примере будет реверс бита 3 в порту А.
Re: Toggling the Pin
Добавлено: Чт сен 03, 2015 15:22:47
Z_h_e
Вобще то тут АВР обсуждаем...
Ну давайте отвечу на Ваш странную логику. Вы забыли сохранить регистр WORK в стеке и достать его обратно. С ПИКами продолжать не будем, это не то место.
Re: Toggling the Pin
Добавлено: Чт сен 03, 2015 17:45:25
HardWareMan
Z_h_e писал(а):
Предложите код подпрограммы такой же длины не применяя тоглинг.
Если эту задачу делать через EOR порта PORTx то придется таки сохранять в стеке SREG (а вместе с ним и еще один верхний регистр), иначе грабли обеспечены. Так что что-бы тут не говорили "гуру" и "мэтры" кодинга под AVR, если команда/функция есть, то почему бы ей не воспользоваться, верно? С другой стороны, если вернуться к негодованию ТС, то действительно могли бы сделать защиту "от дурака" переименовав регистр в "TOGGLEx", как уже было тут предложено.
Re: Toggling the Pin
Добавлено: Пт сен 04, 2015 01:18:54
Андрей СШ
КРАМ писал(а):Вы сначала приведите ПРИМЕР такой реальной задачи. Чтобы ОДНА лишняя строка была критична.
Всего навсего программный SPI или TWI.
Одна лишняя строка и потеря 10-и % скорости обеспечена.
Re: Toggling the Pin
Добавлено: Пт сен 04, 2015 03:25:27
КРАМ
Андрей СШ писал(а):
Одна лишняя строка и потеря 10-и % скорости обеспечена.
И что из этого?
Потеря скорости обмена на 10% В КАКОЙ ЗАДАЧЕ будет являться критической?
Это примерно как с оперативной памятью. Всегда можно умозрительно представить ситуацию, когда не хватило одной ячейки... Только кто так выбирает МК?
Если все так плохо и 10% скорости программного SPI или I2C обваливают алгоритм на ДАННОМ МК - смените МК. У части контроллеров нет команды "toggle". Но не у всех же. Есть МК с более высокой тактовой частотой.
Пересмотрите алгоритм. Выберете контроллер с меньшей латентностью прерываний.
ЗЫ. И 10% потерь даже в представленном примере выглядят синтетическими, то есть НЕТТО-потерями. Попробуйте расписать такой обмен
с переводом указателя ЗА 10 СТРОК кода (точнее,
за 10 машинных циклов). То есть обмен МАССИВОМ, где и будет потеряно 10% времени.
HardWareMan писал(а):
Если эту задачу делать через EOR порта PORTx то придется таки сохранять в стеке SREG (а вместе с ним и еще один верхний регистр), иначе грабли обеспечены.
Тут я все таки полюбопытствую. Просто потому что не знаю этой особенности архитектуры АВР.
А что, порт не имеет прямой адресации в ОЗУ? В чем состоят грабли маски на порт без стека? Причем тут контекст?
Re: Toggling the Pin
Добавлено: Пт сен 04, 2015 04:13:54
Андрей СШ
КРАМ писал(а):Попробуйте расписать такой обмен с переводом указателя ЗА 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% времени выполнения.
В чем состоят грабли маски на порт без стека?
Грабли в том, что такой команды нет.
Re: Toggling the Pin
Добавлено: Пт сен 04, 2015 04:31:36
КРАМ
Вы так и дальше будете выводить единственную ячейку ОЗУ? Или все таки будете инкрементировать ее адрес и контролировать завершение цикла вывода МАССИВА?
В реальной задаче не выводится единственный байт. В реальной задаче байты выводятся бесконечно. И нужно либо указывать длину выводимого массива (точнее модифицировать указатель), либо модифицировать сами данные в единственной выводимой ячейке. То есть лишняя строка будет РАЗМАЗАНА на бОльшую длину кода.
Но я не понял, где в этом алгоритме может быть применена команда "Toggle"?
Re: Toggling the Pin
Добавлено: Пт сен 04, 2015 04:38:49
Андрей СШ
КРАМ писал(а):Но я не понял, где в этом алгоритме может быть применена команда "Toggle"?
Я даже не знаю что дальше сказать.
Вы готовы немного всё таки изучить AVR для участия в этом споре? А то мне очень сложно приводить доказательства человеку, который не знает ассемблера AVR.
http://www.gaw.ru/html.cgi/txt/doc/micr ... /start.htm
Re: Toggling the Pin
Добавлено: Пт сен 04, 2015 04:45:43
КРАМ
Вы не поверите, но у меня слева от окна радиокота открыт даташит на Мегу8 в разделе системы команд.
Однако Вы не ответили на вопрос ни с указателями, ни с реверсом пина.
Команды CBI/SBI не имеют отношения к "toggle".
Насколько я понимаю, ВСЯ АРИФМЕТИКА в АВР производится только через РОНы.
Тогда почему нужно плакать по поводу "toggle", если вопрос о перегрузке в РОН - маске - выгрузке в ОЗУ - это стандартная процедура в АВР? Ну такая архитектура, ну и что?
В ПИКах другая ущербность.
Re: Toggling the Pin
Добавлено: Пт сен 04, 2015 04:51:52
Андрей СШ
Если прочитать первое сообщение темы, то можно узнать, что:
1. Даташит на Мегу8 надо закрыть.
2. Даташит на tiny4313 надо открыть.
3. Toggling выполняется командой
Но это хорошо, что Вы согласны всё таки спорить на аргументах, а не на "сам дурак"
Вопрос про указатель я просто не понял. К счастью мне всегда удаётся организовать код без указателей и поэтому я не понимаю почему они обязательно должны быть в "реальных" задачах.
Ну и само понятие "реальной" задачи несколько неконкретно и поэтому "реальность" не может быть использована для доказания чего-либо.
Я предпочитаю делить код на: исполняемый AVRкой и ошибочный. Это по крайней мере не вызывает споров.
Re: Toggling the Pin
Добавлено: Пт сен 04, 2015 05:02:42
КРАМ
А в каком месте было "сам дурак"?
Я собственно и просил рассказать ровно то, о чем Вы мне любезно изложили.
Правда вопрос о критичности 10 (или 16) процентов остался открытым.
В коде действительно имеется выгрузка только ОДНОГО байта. Содержимого ЕДИНСТВЕННОЙ ячейки.
Андрей СШ писал(а):
Вопрос про указатель я просто не понял. К счастью мне всегда удаётся организовать код без указателей и поэтому я не понимаю почему они обязательно должны быть в "реальных" задачах.
Научите, уважаемый...
Re: Toggling the Pin
Добавлено: Пт сен 04, 2015 06:18:55
Андрей СШ
"Сам дурак" было в этой теме до Вашего появления.
10% на самом деле обычно действительно не критично. Ничего не развалится, но станет на 10% медленнее или на 10% прожорливее. Плохо это или нормально зависит от обстоятельств.
Как это ни странно но этот пример я взял не с потолка. У меня действительно есть два устройства в которых микроконтроллер передаёт за раз один байт из одной ячейки:
1. График в статье
http://radiokot.ru/circuit/digital/automat/90/ построен путём периодической передачи в слепую одной и той же переменной. При этом замедление передачи данных замедляет основной алгоритм, что снижает эффективность устройства. А там даже 1% критично.
2. Есть микроконтроллер, который периодически замеряет напряжение на аккумуляторной банке и передаёт его в "центр" (всего один байт). Тут увеличение кода передачи на 16% увеличивает энергопотребление приблизительно на 8%, что при длительном хранении аккумулятора вылезает боком.
По toggle никто не плачет, потому что оно есть и можно использовать. Проблема только в том, что активируется фича не очевидным образом. Но и это уже не проблема для тех, кто посетил эту тему.
КРАМ писал(а):Научите, уважаемый...
Ну как то само так получается при использовании любого нормального (не Си) языка программирования.
http://geektimes.ru/post/257638/
Re: Toggling the Pin
Добавлено: Пт сен 04, 2015 06:36:53
КРАМ
К сожалению, пока не могу открыть ссылку (я в Турции, а в отеле периодически обваливают нагрузкой ВайФай роутеры).
Однако.
Я очень редко прибегаю к Си (разве только когда речь идет об объемных стеках типа USB или TCP/IP, а остальные задачи реализую практически только в ассемблере.
Так вот я не понимаю как можно писать без указателей, если подавляющее большинство задач так или иначе связаны с обработкой МАССИВОВ.
А адресация массива производится ТОЛЬКО через указатель...
Впрочем, возможно по ссылке есть иной метод...

ЗЫ. Модификация переменной в Ваших примерах так или иначе входит в общий цикл вывода. И значит потери времени в % станут меньше.
Ситуации, когда критичность к скорости исполнения кода велика вплоть до 10% потерь - это крайне редкая ситуация. Скажем, в случае с аккумулятором легко возмещаются изменением ПЕРИОДА измерений или усложнением алгоритма обмена, когда передача "на базу" происходит не всех измерений подряд.
Я тоже могу привести пример, когда я был связан с отсутствием альтернативного контроллера по экономическим основаниям и вынужден был слегка превысить (на 9%) допустимую по даташиту скорость аппаратного SPI. Но к вопросу топикстартера эти случаи отношения не имеют.
Re: Toggling the Pin
Добавлено: Пт сен 04, 2015 06:53:33
oleg110592
Андрей СШ писал(а):Проблема только в том, что активируется фича не очевидным образом
совершенно очевидным способом - смотрим в даташите раздел "I/O-Ports" пункт "Toggling the Pin" в меге8 такого пункта нет. Правда документацию читать обычно не принято.
В продвинутой меге48/88, по ногам совместимой с мегой8, эта фича работает.