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

- Реклама
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Toggling the Pin
Не хрена себе тему раздули на три листа...
ТС спасибо, не знал о таком механизме переключения порта, реально можно в некоторых случаях сократить код.
ILYAUL, вот Вы говорите без разницы каким механизмом инвертировать выход ноги. Возьмем такую задачу. Нужно написать обработчик прерывания, который должен инвертировать бит0 портаА (выход). Значение этого бита может меняться в других местах кода программы. С помощью данного тоглинга процедура будет выглядеть так
Предложите код подпрограммы такой же длины не применяя тоглинг.
ТС спасибо, не знал о таком механизме переключения порта, реально можно в некоторых случаях сократить код.
ILYAUL, вот Вы говорите без разницы каким механизмом инвертировать выход ноги. Возьмем такую задачу. Нужно написать обработчик прерывания, который должен инвертировать бит0 портаА (выход). Значение этого бита может меняться в других местах кода программы. С помощью данного тоглинга процедура будет выглядеть так
Код: Выделить всё
SubProgramm:
SBI PINA,0
reti- КРАМ
- Друг Кота
- Сообщения: 25223
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Toggling the Pin
Вы сначала приведите ПРИМЕР такой реальной задачи. Чтобы ОДНА лишняя строка была критична.
По моему опыту, эта команда сильно полезна для генерации меандра на ноге с предельным периодом в шесть машинных циклов. В осталном легко заменяется на маску XOR.
По моему опыту, эта команда сильно полезна для генерации меандра на ноге с предельным периодом в шесть машинных циклов. В осталном легко заменяется на маску XOR.
Последний раз редактировалось КРАМ Чт сен 03, 2015 14:56:40, всего редактировалось 1 раз.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Toggling the Pin
Эта другая тема. Но могу привести. Например, может случиться так, что из-за одной лишней команды не хватит длины прыжка безусловного перехода.
Если подпрограммы вызывается часто, то время ее выполнения можно реально сократить и контроллер чаще будет спать. А Вы сможете подпрограмму написать добавив лишь одну строчку?
Если подпрограммы вызывается часто, то время ее выполнения можно реально сократить и контроллер чаще будет спать. А Вы сможете подпрограмму написать добавив лишь одну строчку?
- КРАМ
- Друг Кота
- Сообщения: 25223
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Toggling the Pin
Это херовый код, если имеется такое условие. И по прежнему умозрительный. На практике не встречается.
Про одну строчку читайте выше
Про одну строчку читайте выше
- Реклама
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Toggling the Pin
КРАМ, напишите мне код с одной дополнительной командой, я так не могу.
- КРАМ
- Друг Кота
- Сообщения: 25223
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Toggling the Pin
Я не в курсе ассемблера авр, поэтому напишу на асме пика
movlw b'00001000'
xorwf PORTA, F
Логическая функция исключающее ИЛИ реверсирует бит в том разряде, где маска равна 1.
В приведенном примере будет реверс бита 3 в порту А.
movlw b'00001000'
xorwf PORTA, F
Логическая функция исключающее ИЛИ реверсирует бит в том разряде, где маска равна 1.
В приведенном примере будет реверс бита 3 в порту А.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Toggling the Pin
Вобще то тут АВР обсуждаем...
Ну давайте отвечу на Ваш странную логику. Вы забыли сохранить регистр WORK в стеке и достать его обратно. С ПИКами продолжать не будем, это не то место.
Ну давайте отвечу на Ваш странную логику. Вы забыли сохранить регистр WORK в стеке и достать его обратно. С ПИКами продолжать не будем, это не то место.
- HardWareMan
- Мучитель микросхем
- Сообщения: 431
- Зарегистрирован: Ср сен 02, 2015 07:47:20
Re: Toggling the Pin
Если эту задачу делать через EOR порта PORTx то придется таки сохранять в стеке SREG (а вместе с ним и еще один верхний регистр), иначе грабли обеспечены. Так что что-бы тут не говорили "гуру" и "мэтры" кодинга под AVR, если команда/функция есть, то почему бы ей не воспользоваться, верно? С другой стороны, если вернуться к негодованию ТС, то действительно могли бы сделать защиту "от дурака" переименовав регистр в "TOGGLEx", как уже было тут предложено.Z_h_e писал(а):Предложите код подпрограммы такой же длины не применяя тоглинг.Код: Выделить всё
SubProgramm: SBI PINA,0 reti
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
Re: Toggling the Pin
Всего навсего программный SPI или TWI.КРАМ писал(а):Вы сначала приведите ПРИМЕР такой реальной задачи. Чтобы ОДНА лишняя строка была критична.
Одна лишняя строка и потеря 10-и % скорости обеспечена.
- КРАМ
- Друг Кота
- Сообщения: 25223
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Toggling the Pin
И что из этого?Андрей СШ писал(а): Одна лишняя строка и потеря 10-и % скорости обеспечена.
Потеря скорости обмена на 10% В КАКОЙ ЗАДАЧЕ будет являться критической?
Это примерно как с оперативной памятью. Всегда можно умозрительно представить ситуацию, когда не хватило одной ячейки... Только кто так выбирает МК?
Если все так плохо и 10% скорости программного SPI или I2C обваливают алгоритм на ДАННОМ МК - смените МК. У части контроллеров нет команды "toggle". Но не у всех же. Есть МК с более высокой тактовой частотой.
Пересмотрите алгоритм. Выберете контроллер с меньшей латентностью прерываний.
ЗЫ. И 10% потерь даже в представленном примере выглядят синтетическими, то есть НЕТТО-потерями. Попробуйте расписать такой обмен с переводом указателя ЗА 10 СТРОК кода (точнее, за 10 машинных циклов). То есть обмен МАССИВОМ, где и будет потеряно 10% времени.
Тут я все таки полюбопытствую. Просто потому что не знаю этой особенности архитектуры АВР.HardWareMan писал(а): Если эту задачу делать через EOR порта PORTx то придется таки сохранять в стеке SREG (а вместе с ним и еще один верхний регистр), иначе грабли обеспечены.
А что, порт не имеет прямой адресации в ОЗУ? В чем состоят грабли маски на порт без стека? Причем тут контекст?
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
Если добавить в него всего одну команду SBI, то он увеличится до 116-и циклов, а это +16% времени выполнения.
Грабли в том, что такой команды нет.В чем состоят грабли маски на порт без стека?
Последний раз редактировалось Андрей СШ Пт сен 04, 2015 04:33:46, всего редактировалось 1 раз.
- КРАМ
- Друг Кота
- Сообщения: 25223
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Toggling the Pin
Вы так и дальше будете выводить единственную ячейку ОЗУ? Или все таки будете инкрементировать ее адрес и контролировать завершение цикла вывода МАССИВА?
В реальной задаче не выводится единственный байт. В реальной задаче байты выводятся бесконечно. И нужно либо указывать длину выводимого массива (точнее модифицировать указатель), либо модифицировать сами данные в единственной выводимой ячейке. То есть лишняя строка будет РАЗМАЗАНА на бОльшую длину кода.
Но я не понял, где в этом алгоритме может быть применена команда "Toggle"?
В реальной задаче не выводится единственный байт. В реальной задаче байты выводятся бесконечно. И нужно либо указывать длину выводимого массива (точнее модифицировать указатель), либо модифицировать сами данные в единственной выводимой ячейке. То есть лишняя строка будет РАЗМАЗАНА на бОльшую длину кода.
Но я не понял, где в этом алгоритме может быть применена команда "Toggle"?
Re: Toggling the Pin
Я даже не знаю что дальше сказать.КРАМ писал(а):Но я не понял, где в этом алгоритме может быть применена команда "Toggle"?
Вы готовы немного всё таки изучить AVR для участия в этом споре? А то мне очень сложно приводить доказательства человеку, который не знает ассемблера AVR.
http://www.gaw.ru/html.cgi/txt/doc/micr ... /start.htm
- КРАМ
- Друг Кота
- Сообщения: 25223
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Toggling the Pin
Вы не поверите, но у меня слева от окна радиокота открыт даташит на Мегу8 в разделе системы команд.
Однако Вы не ответили на вопрос ни с указателями, ни с реверсом пина.
Команды CBI/SBI не имеют отношения к "toggle".
Насколько я понимаю, ВСЯ АРИФМЕТИКА в АВР производится только через РОНы.
Тогда почему нужно плакать по поводу "toggle", если вопрос о перегрузке в РОН - маске - выгрузке в ОЗУ - это стандартная процедура в АВР? Ну такая архитектура, ну и что?
В ПИКах другая ущербность.
Однако Вы не ответили на вопрос ни с указателями, ни с реверсом пина.
Команды CBI/SBI не имеют отношения к "toggle".
Насколько я понимаю, ВСЯ АРИФМЕТИКА в АВР производится только через РОНы.
Тогда почему нужно плакать по поводу "toggle", если вопрос о перегрузке в РОН - маске - выгрузке в ОЗУ - это стандартная процедура в АВР? Ну такая архитектура, ну и что?
В ПИКах другая ущербность.
Последний раз редактировалось КРАМ Пт сен 04, 2015 04:54:27, всего редактировалось 1 раз.
Re: Toggling the Pin
Если прочитать первое сообщение темы, то можно узнать, что:
1. Даташит на Мегу8 надо закрыть.
2. Даташит на tiny4313 надо открыть.
3. Toggling выполняется командой
Но это хорошо, что Вы согласны всё таки спорить на аргументах, а не на "сам дурак"
Вопрос про указатель я просто не понял. К счастью мне всегда удаётся организовать код без указателей и поэтому я не понимаю почему они обязательно должны быть в "реальных" задачах.
Ну и само понятие "реальной" задачи несколько неконкретно и поэтому "реальность" не может быть использована для доказания чего-либо.
Я предпочитаю делить код на: исполняемый AVRкой и ошибочный. Это по крайней мере не вызывает споров.
1. Даташит на Мегу8 надо закрыть.
2. Даташит на tiny4313 надо открыть.
3. Toggling выполняется командой
Код: Выделить всё
08: OUT PINx, R18 ;дёргаем тактовый выход
Вопрос про указатель я просто не понял. К счастью мне всегда удаётся организовать код без указателей и поэтому я не понимаю почему они обязательно должны быть в "реальных" задачах.
Ну и само понятие "реальной" задачи несколько неконкретно и поэтому "реальность" не может быть использована для доказания чего-либо.
Я предпочитаю делить код на: исполняемый AVRкой и ошибочный. Это по крайней мере не вызывает споров.
- КРАМ
- Друг Кота
- Сообщения: 25223
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Toggling the Pin
А в каком месте было "сам дурак"?
Я собственно и просил рассказать ровно то, о чем Вы мне любезно изложили.
Правда вопрос о критичности 10 (или 16) процентов остался открытым.
В коде действительно имеется выгрузка только ОДНОГО байта. Содержимого ЕДИНСТВЕННОЙ ячейки.
Научите, уважаемый...
Я собственно и просил рассказать ровно то, о чем Вы мне любезно изложили.
Правда вопрос о критичности 10 (или 16) процентов остался открытым.
В коде действительно имеется выгрузка только ОДНОГО байта. Содержимого ЕДИНСТВЕННОЙ ячейки.
Андрей СШ писал(а): Вопрос про указатель я просто не понял. К счастью мне всегда удаётся организовать код без указателей и поэтому я не понимаю почему они обязательно должны быть в "реальных" задачах.
Научите, уважаемый...
Re: Toggling the Pin
"Сам дурак" было в этой теме до Вашего появления.
10% на самом деле обычно действительно не критично. Ничего не развалится, но станет на 10% медленнее или на 10% прожорливее. Плохо это или нормально зависит от обстоятельств.
Как это ни странно но этот пример я взял не с потолка. У меня действительно есть два устройства в которых микроконтроллер передаёт за раз один байт из одной ячейки:
1. График в статье http://radiokot.ru/circuit/digital/automat/90/ построен путём периодической передачи в слепую одной и той же переменной. При этом замедление передачи данных замедляет основной алгоритм, что снижает эффективность устройства. А там даже 1% критично.
2. Есть микроконтроллер, который периодически замеряет напряжение на аккумуляторной банке и передаёт его в "центр" (всего один байт). Тут увеличение кода передачи на 16% увеличивает энергопотребление приблизительно на 8%, что при длительном хранении аккумулятора вылезает боком.
По toggle никто не плачет, потому что оно есть и можно использовать. Проблема только в том, что активируется фича не очевидным образом. Но и это уже не проблема для тех, кто посетил эту тему.
10% на самом деле обычно действительно не критично. Ничего не развалится, но станет на 10% медленнее или на 10% прожорливее. Плохо это или нормально зависит от обстоятельств.
Как это ни странно но этот пример я взял не с потолка. У меня действительно есть два устройства в которых микроконтроллер передаёт за раз один байт из одной ячейки:
1. График в статье http://radiokot.ru/circuit/digital/automat/90/ построен путём периодической передачи в слепую одной и той же переменной. При этом замедление передачи данных замедляет основной алгоритм, что снижает эффективность устройства. А там даже 1% критично.
2. Есть микроконтроллер, который периодически замеряет напряжение на аккумуляторной банке и передаёт его в "центр" (всего один байт). Тут увеличение кода передачи на 16% увеличивает энергопотребление приблизительно на 8%, что при длительном хранении аккумулятора вылезает боком.
По toggle никто не плачет, потому что оно есть и можно использовать. Проблема только в том, что активируется фича не очевидным образом. Но и это уже не проблема для тех, кто посетил эту тему.
Ну как то само так получается при использовании любого нормального (не Си) языка программирования. http://geektimes.ru/post/257638/КРАМ писал(а):Научите, уважаемый...
- КРАМ
- Друг Кота
- Сообщения: 25223
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Toggling the Pin
К сожалению, пока не могу открыть ссылку (я в Турции, а в отеле периодически обваливают нагрузкой ВайФай роутеры).
Однако.
Я очень редко прибегаю к Си (разве только когда речь идет об объемных стеках типа USB или TCP/IP, а остальные задачи реализую практически только в ассемблере.
Так вот я не понимаю как можно писать без указателей, если подавляющее большинство задач так или иначе связаны с обработкой МАССИВОВ.
А адресация массива производится ТОЛЬКО через указатель...
Впрочем, возможно по ссылке есть иной метод...
ЗЫ. Модификация переменной в Ваших примерах так или иначе входит в общий цикл вывода. И значит потери времени в % станут меньше.
Ситуации, когда критичность к скорости исполнения кода велика вплоть до 10% потерь - это крайне редкая ситуация. Скажем, в случае с аккумулятором легко возмещаются изменением ПЕРИОДА измерений или усложнением алгоритма обмена, когда передача "на базу" происходит не всех измерений подряд.
Я тоже могу привести пример, когда я был связан с отсутствием альтернативного контроллера по экономическим основаниям и вынужден был слегка превысить (на 9%) допустимую по даташиту скорость аппаратного SPI. Но к вопросу топикстартера эти случаи отношения не имеют.
Однако.
Я очень редко прибегаю к Си (разве только когда речь идет об объемных стеках типа USB или TCP/IP, а остальные задачи реализую практически только в ассемблере.
Так вот я не понимаю как можно писать без указателей, если подавляющее большинство задач так или иначе связаны с обработкой МАССИВОВ.
А адресация массива производится ТОЛЬКО через указатель...
Впрочем, возможно по ссылке есть иной метод...
ЗЫ. Модификация переменной в Ваших примерах так или иначе входит в общий цикл вывода. И значит потери времени в % станут меньше.
Ситуации, когда критичность к скорости исполнения кода велика вплоть до 10% потерь - это крайне редкая ситуация. Скажем, в случае с аккумулятором легко возмещаются изменением ПЕРИОДА измерений или усложнением алгоритма обмена, когда передача "на базу" происходит не всех измерений подряд.
Я тоже могу привести пример, когда я был связан с отсутствием альтернативного контроллера по экономическим основаниям и вынужден был слегка превысить (на 9%) допустимую по даташиту скорость аппаратного SPI. Но к вопросу топикстартера эти случаи отношения не имеют.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Toggling the Pin
совершенно очевидным способом - смотрим в даташите раздел "I/O-Ports" пункт "Toggling the Pin" в меге8 такого пункта нет. Правда документацию читать обычно не принято.Андрей СШ писал(а):Проблема только в том, что активируется фича не очевидным образом
В продвинутой меге48/88, по ногам совместимой с мегой8, эта фича работает.



