Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.95/60: Рейтинг темы: голосов - 60, средняя оценка - 4.95
Otix
0 / 0 / 0
Регистрация: 01.09.2007
Сообщений: 25
1

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

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

Доброго времени суток!

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

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

С уважением, Otix
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2012, 20:56
Ответы с готовыми решениями:

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

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

Продам Microsoft SBS 2003 Premium
Продам Microsoft SBS 2003 Premium Рус. лицензия. За полцены.

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

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

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

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

Откуда вылезла проблема: Хочу прикрутить три датчика DS18B20 на три разных ноги Atmega16. Вариант, когда все сидят на одной ноге - не подходит: В худшем варианте, когда меняются все три датчика - нужно реализовывать алгоритм их идентификации (какой датчик с каким ID где находится).
0
pmdr_soft
0 / 0 / 0
Регистрация: 15.03.2010
Сообщений: 287
27.11.2012, 21:34 4
дык на то и сеть 1wire, что все на одном проводе.
0
27.11.2012, 21:34
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
27.11.2012, 21:48 5
Разговор идет об ассемблере AVR (avrasm2.ixi)?.
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
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
Otix
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
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
27.11.2012, 23:08 9
Установка битов порта одной строчкой - AVR (решено) -
Почитайте, не поможет спросите более конкретно,
0
Otix
0 / 0 / 0
Регистрация: 01.09.2007
Сообщений: 25
27.11.2012, 23:19 10
Цитата Сообщение от omokost
Установка битов порта одной строчкой - AVR (решено) -
Почитайте, не поможет спросите более конкретно,
Ссылку покурю завтра, а то дети воют, жена пилит ...
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
28.11.2012, 00:04 11
Для ассемблера нет универсального ответа. В подпрограмму можно передать данные через регистры, через область памяти, через стек. Вы сами это выбираете, никаких соглашений компилятора здесь нет. Поэтому найти универсальный вариант не реально. Если вы подробно опишете что именно вам нужно, можно попробовать подобрать подходящий.
0
YTYOUT
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
Otix
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
Otix
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
0 / 0 / 0
Регистрация: 25.11.2012
Сообщений: 5
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

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

В общем, или медленный, но универсальный огород - или быстрый, но заточенный под одну ногу код. Чудес не бывает.
0
MoxyMuz79
0 / 0 / 0
Регистрация: 25.11.2012
Сообщений: 5
28.11.2012, 13:42 19
можно еще изголиться с командой перехода ijmp , там переход происходит по адресу в Z
0
MoxyMuz79
0 / 0 / 0
Регистрация: 25.11.2012
Сообщений: 5
28.11.2012, 13:46 20
а экозотический это применить команду SPM , но в этом случае выигрыш сомнительный , время выполнения команда нестандартное , нужно проверять
0
28.11.2012, 13:46
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2012, 13:46

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

Вычисление значений функций в подпрограммах
программа на языке ассемблера для вычисления значения y. Значения y1 и y2 необходимо вычислять в...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.