Toggling the Pin

Обсуждаем контроллеры компании Atmel.
Андрей СШ
Опытный кот
Сообщения: 806
Зарегистрирован: Ср май 06, 2015 06:41:27
Откуда: Благовещенск

Re: Toggling the Pin

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

Если под указателем понимать любой способ адресации массива, то вот например передача массива из 10-и байт

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

01: LDI R28, адрес массива
02: LDI R19, 10                  ;размер массива
03: LDI R18, clock_mask    ;маска для определения где пин тактового сигнала
04: LDI R17, 8                   ;длинна байта для передачи
05: LD R16, Y+                  ; собственно данные
06: ROL R16
07: CBI MOSI
08: BRCC #10
09: SBI MOSI
10: OUT PINx, R18            ;дёргаем тактовый выход
11: OUT PINx, R18            ;это занимает всего два такта процессора
12: DEC R17
12: BRNE #06
13: DEC R19
14: BRNE #04
Этот код занимает 1013 тактов. Если заменить переключение на SBI/CBI - 1173 такта. Итого +15,8% времени.
С увеличением размера массива эффект увеличивается.

Хотя я под указателем имел ввиду специальный тип данных в языках высокого уровня, указывающий на адрес в памяти. Индекс массива - не указатель.

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

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

Re: Toggling the Pin

Сообщение BOB51 »

Да ладно уж вам, спорщики. 8)
Вот кстати... был давненько у меня интересный "затык" -
насчет вреда алгоритма и "подвоха на ровном месте":
http://radiokot.ru/forum/viewtopic.php? ... 0%BE%D0%B4
как классический пример такого "прокола".
8)
Кстати, с причиной "сигнатурной блокировки" я там так и не разобрался - просто привел исходный текст к "стандартному решению" - сейчас как раз тема возможную причину подкинула - особенности измененной схемотехники порта.
:dont_know:
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25223
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Toggling the Pin

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

Андрей СШ писал(а): Хотя я под указателем имел ввиду специальный тип данных в языках высокого уровня
Так он и в АСМе ничем не отличается. Переменная принятая для целей адресации массивов и есть указатель.
Просто в АСМе соглашения о типе данных не имеют определенной формализации.
oleg110592 писал(а):
Андрей СШ писал(а):Проблема только в том, что активируется фича не очевидным образом
совершенно очевидным способом - смотрим в даташите раздел "I/O-Ports" пункт "Toggling the Pin" в меге8 такого пункта нет. Правда документацию читать обычно не принято.
В продвинутой меге48/88, по ногам совместимой с мегой8, эта фича работает.
Это называется НЕОЧЕВИДНЫЙ способ.
Если описание команд не содержит этой разновидности ЗАПИСИ команды, а способ изложен черт знает где, то это и есть неочевидность.
Я еще понимаю, когда исполнение некоего действа связано с выводом-вводом в некую специальную периферию (типа ко-процессора), а тут совершенно определенная запись в АСМе не описана в разделе спецификации команд...
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Toggling the Pin

Сообщение oleg110592 »

КРАМ писал(а):способ изложен черт знает где
в соответствующем разделе документации от производителя, где описана работа с портами, это черти где? Где же надо и в каком разделе описывать как инвертировать пин порта по вашему мнению. В описании команд ассемблера?
На Си PINB |= (1<<PB0); тоже инвертирует.
Листинг:
PINB |= (1<<PB0);
a02: 18 9a sbi 0x03, 0 ; 3
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Toggling the Pin

Сообщение ARV »

можно и проще PINB = (1<<PB0);
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Toggling the Pin

Сообщение oleg110592 »

PINB = (1<<PB0);
a02: 81 e0 ldi r24, 0x01 ; 1
a04: 83 b9 out 0x03, r24 ; 3
Реклама
Андрей СШ
Опытный кот
Сообщения: 806
Зарегистрирован: Ср май 06, 2015 06:41:27
Откуда: Благовещенск

Re: Toggling the Pin

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

Где же надо и в каком разделе описывать как инвертировать пин порта по вашему мнению.
Как минимум в разделе
10.4.4 PINB – Port B Input Pins Address
Но там ничего такого не упоминается. А название раздела прямо утверждает, что такой функции нет.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25223
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Toggling the Pin

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

oleg110592 писал(а):
КРАМ писал(а):способ изложен черт знает где
в соответствующем разделе документации от производителя, где описана работа с портами, это черти где? Где же надо и в каком разделе описывать как инвертировать пин порта по вашему мнению. В описании команд ассемблера?
Да, Олег, именно там и следует.
Поскольку никакого другого способа использовать эту операцию нет.
И причем тут Си? :dont_know:
Представьте себе, если бы вместо списка инструкций в даташите было бы приведено схемотехническое описание АЛУ...
Не, конечно ко всему можно привыкнуть...
Для работы с произвольным МК совсем не обязательно вчитываться во все уголки даташита. Обычно изучение ведут от традиционной потребности.
Даташит должен быть интуитивно понятен. Нужно использовать АЦП, значит я открываю раздел электрических характеристик и читаю там необходимые параметры. Можно конечно половину характеристик АЦП раскидать по разным разделам типа осциллятора, пинов, компаратора и черт знает еще чего.
Но неудобно...
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Toggling the Pin

Сообщение ILYAUL »

Этот код занимает 1013 тактов. Если заменить переключение на SBI/CBI - 1173 такта. Итого +15,8% времени.
Врёт и не краснеет.
Можете сами проверить, код приложен в картинках , Я не знаю в каком компиляторе он работает , но типа такой команды
CBI MOSI
для AVR не существует
Вложения
2.jpg
(254.61 КБ) 501 скачивание
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Toggling the Pin

Сообщение oleg110592 »

КРАМ писал(а):Да, Олег, именно там и следует.
Поскольку никакого другого способа использовать эту операцию нет
Какого способа? Записать лог. "1" в регистр порта? Точно так же можно писать "1" в самые разнообразные регистры микроконтроллера AVR. Где в каком разделе описания ассемблера, по вашему мнению, должно быть описание инвертирования ноги порта? В описании команды SBI?
Как минимум в разделе
10.4.4
чем не устрамвает отдельный раздел (например для меги48)
14.2.2 Toggling the pin
Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn. Note that the
SBI instruction can be used to toggle one single bit in a port.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25223
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Toggling the Pin

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

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

Re: Toggling the Pin

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

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

Кроме того опять повторю, что описание регистра PINx прямо говорит, что он для чтения.

Да и вообще "очевидность" понятие субъективное, так что его нет смысла обсуждать. Предлагаю вернуться к обсуждению фичи и её использованию.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Toggling the Pin

Сообщение oleg110592 »

КРАМ писал(а):Да,именно там, если отказались от специальной мнемоники для этой команды
Только вот незадача - в виду убогости архитектуры AVR, SBI команда работает с младшими 32 регистрами I/O (адреса с 0 по 31). А например в 100 ногом мега1280, так как адресов на периферию не хватило, регистры портов H-L начинаются с адреса 0x101, посему:
For the Extended I/O space from $60 - $1FF in SRAM, only the ST/STS/STD and LD/LDS/LDD instructions can be used.
регистра PINx прямо говорит, что он для чтения.
R/W прям говорит, что он для чтения?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25223
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Toggling the Pin

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

oleg110592 писал(а):Только вот незадача - в виду убогости архитектуры AVR
Какая разница какая архитектура и какие ограничения на адреса?
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Toggling the Pin

Сообщение oleg110592 »

там где SBI нельзя, дополнительной команды нет (и не надо), где же можно? Правильно - в описании портов.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Toggling the Pin

Сообщение akl »

Даже сами разработчики Atmel QTouch Library лажанулись, применив для ATmega64, которая не поддерживает переключение, такую конструкцию. А разница в тактах всё таки чувствуетсяИзображение
1.GIF
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Toggling the Pin

Сообщение ARV »

КРАМ писал(а):
oleg110592 писал(а):Где в каком разделе описания ассемблера, по вашему мнению, должно быть описание инвертирования ноги порта? В описании команды SBI?
Да,именно там, если отказались от специальной мнемоники для этой команды, то нужно было привести СИНТАКСИС при котором команда будет использована с другой спецификацией.
Так описывают разные способы адресации для одной и той же команды, так описывают разные источники и назначение для одной и той же команды, так описывают влияние команд на флаги, так описывают длину команды во флеше, так описывают длительность ее исполнения, там, наконец, приводят КОД этой команды...
Потому что у этой команды, на самом деле, ДРУГОЙ КОД.
в желании оставить последнее слово за собой вы уже перешли все разумные границы.

1. SBI имеет всегда одну мнемонику, имеет всегда один и тот же опкод (разумеется, не считая битов, отвечающих за адресацию регистров)
2. назначение команды - ЗАПИСЬ 1 В ЗАДАННЫЙ БИТ РЕГИСТРА ВВОДА-ВЫВОДА. больше никакого иного значения она не имеет
3. архитектурная особенность AVR заключается в том, что регистр PINx доступен для чтения и записи, но при записи в него данные теряются. т.е. команда SBI записывает в его разряд 1, но убедиться в том, что запись прошла, нереально - эта 1 просто теряется
4. архитектурная особенность "новых" AVR заключается в том, что запись в PINx приводит к инверсии значения в соответствующем разряде PORTx. это не новая команда инверсии, это не новый опкод, это вообще ФИЧА. лично я думаю, что очередные индусы напортачили при разработке топологии кристалла, а потом выяснилось, что БАГ оказался удачным и местами полезным - его ввели в документацию, как ФИЧУ.

таким образом, КРАМ, требовать, чтобы для инверсии бита в одном порту путем записи в другой, вводили особую команду, это неразумно. если запись в UDR меняет состояние битов в UCSRA (например), по-вашему выходит, надо особую мнемонику придумывать для этого?!

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

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

Re: Toggling the Pin

Сообщение Z_h_e »

ARV, я думаю бесполезно объяснять. Этот топик должен был исчерпать себя после трех постов, однако он растет и растет.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Toggling the Pin

Сообщение ILYAUL »

А разница в тактах всё таки чувствуется
Это-то понятно почему. SBI при первом обращении 1 такт . Все последующие 2. Т.к существует скрытая команда EOR
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25223
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Toggling the Pin

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

ARV писал(а): 1. SBI имеет всегда одну мнемонику, имеет всегда один и тот же опкод (разумеется, не считая битов, отвечающих за адресацию регистров)
2. назначение команды - ЗАПИСЬ 1 В ЗАДАННЫЙ БИТ РЕГИСТРА ВВОДА-ВЫВОДА. больше никакого иного значения она не имеет
3. архитектурная особенность AVR заключается в том, что...
Ну, Атмел ведь не один на этом свете. Поэтому полагать действия его разработчиков багом я бы поостерегся.
Но вернемся к мнемонике.
Все команды с операциями над битом с непосредственной адресацией этого бита (то есть в самой команде) ВСЕГДА выглядят как КОП+адрес регистра+адрес пина. В разной внутренней последовательности. Архитектурный изыск при дешифрации и исполнении этой команды может быть самый разнообразный. Поскольку атомарные операции всегда находятся в противоречии с адресными шинами и шинами данных.
То есть совершенно безразлично что относить к КОП, а что к адресу. Я, кстати, НИГДЕ НЕ УПОТРЕБЛЯЛ термина опкод. По вполне понятной причине. Так что приписывать мне это не след.
Если взять команду BTG сходной по архитектуре с Атмелом 24-ой серии Микрочипа, то там не возникло никаких вопросов относительно адреса и опкода.
Команда выполняется аналогично. Или и там индусы постарались? :dont_know:
Ответить

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