0 / 0 / 0
Регистрация: 01.09.2007
Сообщений: 25
1

sbi, cbi, sbic, sbs в подпрограммах

27.11.2012, 20:56. Показов 12937. Ответов 27
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!

Уважаемые форумчане!

Есть подпрограмма, использующая инструкции sbi, cbi, sbic, sbs.
Я ее хочу применить многократно, но для разных портов и пинов.
Например, при одном вызове она должна работать с РА0 (sbi ddra,0) при другом - с РD7 (sbi ddrd,7) и т.д.
Как это сделать?

С уважением, Otix
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2012, 20:56
Ответы с готовыми решениями:

Как переместить лицензию с WINDOWS Server SBS 2011 на WINDOWS Server SBS 2011 Standard ?
Добрый День! Подскажите пожалуйста как переместить лицензию с WINDOWS Server SBS 2011 на WINDOWS...

Сброс бита CBI (Atmel Studio 6.2)
Картинки внизу... Использую Atmel Studio 6.2 для написания программы для Avr Mega. Проэкт...

w2k3 SBS
здравствуйте.. такой вопрос.. Сервер w2k3 SBS, у юзеров комп.класса XP SP3.. Все в рабочей...

Настройка звука на 5.1 creative sbs 580
Доброго времени суток. Нужен драйвер на вин 10 для sbs 580. Гуглил: есть на вин 7. Если можно...

SBS 2011, посадить DHCP на вторичный ip
История (опцианально, можно не читать): Устроился в организацию там стоит Small Buisness Server...

27
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
27.11.2012, 21:06 2
А зачем здесь подпрограмма, логичнее оформить макросом. Четыре макроса на sbi, cbi, sbic, sbs.
0
0 / 0 / 0
Регистрация: 01.09.2007
Сообщений: 25
27.11.2012, 21:17 3
На счет макроса - это не решит проблему раздувания программы. Пока вот так в лоб не хочется решать, хочу найти решение покрасивее.

Да и сама структура программы такова, что эти подпрограммы с sbi\cbi вызываются из других подпрограмм; а те, в свою очередь, из других. То есть, макрос отпадает.

Откуда вылезла проблема: Хочу прикрутить три датчика DS18B20 на три разных ноги Atmega16. Вариант, когда все сидят на одной ноге - не подходит: В худшем варианте, когда меняются все три датчика - нужно реализовывать алгоритм их идентификации (какой датчик с каким ID где находится).
0
0 / 0 / 0
Регистрация: 15.03.2010
Сообщений: 287
27.11.2012, 21:34 4
дык на то и сеть 1wire, что все на одном проводе.
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
27.11.2012, 21:48 5
Разговор идет об ассемблере AVR (avrasm2.ixi)?.
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
27.11.2012, 22:09 6
А на С не подет?
Если че тут примерчик на С с 2-мя датчиками. Легко можно допилить до 3-х.....
http://asis-kbr.ru/forum/viewtopys.php?f=11&t=126
0
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
27.11.2012, 22:59 7
Цитата Сообщение от Otix
Вариант, когда все сидят на одной ноге - не подходит: В худшем варианте, когда меняются все три датчика - нужно реализовывать алгоритм их идентификации (какой датчик с каким ID где находится).
Да, есть такая проблема, maxim для её решения даже датчики DS28EA00 выпустил.
0
0 / 0 / 0
Регистрация: 01.09.2007
Сообщений: 25
27.11.2012, 23:04 8
pmdr_soft: Да, 1-Wire на одном проводе. Но это в других проектах. А тут надо, чтобы дядя с заскорузлыми руками мог прийти, поменять все датчики, и все опять заработало. Без дополнительных алгоритмов по идентификации и диалогового режима с участием этого самого дяди.

omokost:Да, это ассемблер AVR, Atmega16A.

ShodS: Пример нормальный. Но я пишу на ассемблере. И к протоколу 1-Wire обращаюсь по прерываниям от ТС2, с помощью которого формирую временные задержки. В общем, у меня какое-то подобие кооперативной RTOS, поэтому инструкции типа _delay_us (70) - это непозволительная трата времени. Эти 70 мкс у меня процессор занят другими задачами.

Может, кто подскажет более общо? Как в подпрограмме при вызовах из разных точек опрашивать/модифицировать разные биты разных портов? Может, есть какой-то обходной маневр?
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
27.11.2012, 23:08 9
Установка битов порта одной строчкой - AVR (решено) -
Почитайте, не поможет спросите более конкретно,
0
0 / 0 / 0
Регистрация: 01.09.2007
Сообщений: 25
27.11.2012, 23:19 10
Цитата Сообщение от omokost
Установка битов порта одной строчкой - AVR (решено) -
Почитайте, не поможет спросите более конкретно,
Ссылку покурю завтра, а то дети воют, жена пилит ...
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
28.11.2012, 00:04 11
Для ассемблера нет универсального ответа. В подпрограмму можно передать данные через регистры, через область памяти, через стек. Вы сами это выбираете, никаких соглашений компилятора здесь нет. Поэтому найти универсальный вариант не реально. Если вы подробно опишете что именно вам нужно, можно попробовать подобрать подходящий.
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
28.11.2012, 00:07 12
Да, есть такая проблема, maxim для её решения даже датчики DS28EA00 выпустил.
Вот ведь... редиски, а я сижу алгоритм пишу....
И к протоколу 1-Wire обращаюсь по прерываниям от ТС2, с помощью которого формирую временные задержки
Ну и зачем , если есть USORT?
0
0 / 0 / 0
Регистрация: 11.11.2012
Сообщений: 53
28.11.2012, 00:37 13
Цитата Сообщение от omokost
Для ассемблера нет универсального ответа. В подпрограмму можно передать данные через регистры, через область памяти, через стек. Вы сами это выбираете, никаких соглашений компилятора здесь нет. Поэтому найти универсальный вариант не реально. Если вы подробно опишете что именно вам нужно, можно попробовать подобрать подходящий.
Точно так. Еще могу добавить, что я бы сделал по косвенной адресации. Значение бит передаешь подпрограмме маской, а порт его адресом в пространстве памяти. И общаешься с портом как с ячейкой памяти. На AVR так не делал, а на 51 ядре в легкую.
0
0 / 0 / 0
Регистрация: 01.09.2007
Сообщений: 25
28.11.2012, 12:25 14
[QUOTE="YTYOUT"][QUOTE="Цитата:[/QUOTE]
Да, есть такая проблема, maxim для её решения даже датчики DS28EA00 выпустил.
Вот ведь... редиски, а я сижу алгоритм пишу....
И к протоколу 1-Wire обращаюсь по прерываниям от ТС2, с помощью которого формирую временные задержки
Ну и зачем , если есть USORT?
USORT привязан к определенной ноге контроллера. А это резко сужает возможности
0
0 / 0 / 0
Регистрация: 01.09.2007
Сообщений: 25
28.11.2012, 13:08 15
Цитата Сообщение от С_Ч
Цитата Сообщение от omokost
Для ассемблера нет универсального ответа. В подпрограмму можно передать данные через регистры, через область памяти, через стек. Вы сами это выбираете, никаких соглашений компилятора здесь нет. Поэтому найти универсальный вариант не реально. Если вы подробно опишете что именно вам нужно, можно попробовать подобрать подходящий.
Точно так. Еще могу добавить, что я бы сделал по косвенной адресации. Значение бит передаешь подпрограмме маской, а порт его адресом в пространстве памяти. И общаешься с портом как с ячейкой памяти. На AVR так не делал, а на 51 ядре в легкую.

Да, пожалуй, вырисовывается только такой вариант. Хранить в ОЗУ адрес порта, маску с битом. И делать что-то типа:

clr zh ;Старший байт адреса все равно нулевой (1 такт)
lds zl, Address_of_port ;младший байт адреса нужного порта (2 такта)
ld r16, z ;Грузим в рабочий регистр данные из порта (2 такта)

lds r17, Byt_Mask ;Грузим битовую маску (или номер бита, но тогда еще будет 1-2 команды) (2 такта)
or r16, r17 ;Выставляем нужный бит в "1" (1 такт)
st z, r16 ;Отправляем скорректированное значение назад в порт. (2 такта)

В итоге, вместо 2 тактов (sbi) получится 10 тактов. По времени дополнительно потеряем 0,5 мкс (кварц 16 МГц), но значительно увеличиваем гибкость программы.
0
MoxyMuz79
28.11.2012, 13:24 16
Как я вижу выход из сложившейся ситуации:
- Если число вариантов с битами/портами немного , то методом перебора и сравнения
cpi Rd,0x01
brne m1
sbi P,1 ; или cbi P,1
rjmp exit
m1: cpi Rd,0x02
brne m2
sbi P,2
rjmp exit
m2: ....
exit:

- либо универсальный вариант, исползуя обращение к порту как к яч.ОЗУ,
загружаем в Y номер порта P, в Rb - №бита и для установки бита в 1 пишем:
ldd Rd,Y+$20
ldi Rc,0x01
m1: tst Rb
breq m2
lsl Rc
dec Rb
rjmp m1
m2:or Rd,Rc
std (Y+$20),Rd

Есть еще один , экзотический вариант, но не уверен будет ли он работать ..
MoxyMuz79
28.11.2012, 13:32 17
Цитата Сообщение от Otix
В итоге, вместо 2 тактов (sbi) получится 10 тактов.
в ядре AVR нет команды косвенной адресации бит, поэтому в любом случае придется городить огород , вопрос в цене
0 / 0 / 0
Регистрация: 01.09.2007
Сообщений: 25
28.11.2012, 13:35 18
Цитата Сообщение от MoxyMuz79
Цитата Сообщение от Otix
В итоге, вместо 2 тактов (sbi) получится 10 тактов.
в ядре AVR нет команды косвенной адресации бит, поэтому в любом случае придется городить огород , вопрос в цене

В общем, или медленный, но универсальный огород - или быстрый, но заточенный под одну ногу код. Чудес не бывает.
0
MoxyMuz79
28.11.2012, 13:42 19
можно еще изголиться с командой перехода ijmp , там переход происходит по адресу в Z
MoxyMuz79
28.11.2012, 13:46 20
а экозотический это применить команду SPM , но в этом случае выигрыш сомнительный , время выполнения команда нестандартное , нужно проверять
28.11.2012, 13:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2012, 13:46
Помогаю со студенческими работами здесь

РАБОТА В ПОДПРОГРАММАХ
ДАНЫ ДВЕ МАТРИЦЫ A (N<=10, M<=15), B (K<=20, L<=15). ДЛЯ КАЖДОЙ ИЗ МАТРИЦ СФОРМИРОВАТЬ ОДНОМЕРНЫЙ...

SBS 2011 Не может создать почту для пользователя
При создании нового пользователя, не может создать ему ящик ну и пользователь в SBS не заводится,...

Упаковка бинарных ресурсов в батник ("CBI method" by Dragokas)
Cabinet's Batch inline. "CBI method" by Dragokas Метод предоставляет возможность встраивать...

Объявление массивов в подпрограммах
Доброго времени суток! Подскажите пожалуйста как происходит выделение памяти в подпрограммах. Я не...

Формальные и фактические параметры в подпрограммах
Можете объяснить механизм передачи параметров и назвать правило соответствия формальных и...

Работа с двумерным массивом в подпрограммах
Дана квадратная действительная матрица. Отсортировать по возрастанию все строки, содержащие нулевые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru