Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/22: Рейтинг темы: голосов - 22, средняя оценка - 4.86
Brom
5 / 5 / 0
Регистрация: 25.02.2010
Сообщений: 15
1

Помогите с макросом чтения-записи порта

11.12.2012, 17:30. Просмотров 3964. Ответов 12
Метки нет (Все метки)

Всем здрасти!

Прошу помощи. Сам не могу разобраться :(

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

Сейчас у меня сделано примерно так:
Установка порта
cbi ddrc, pc0
Чтение
in temp, pyms

Получается, что в данном виде мне придется передавать параметрами pc0 и pyms, которые теоретически отвечают за одно и то же. Ну или по крайней мере явно указывают на один порт.

Могу ли я передавать в процедуру просто номер ноги и используя эту "цифру" производить чтение и запись?

Что-то тяжело объяснить получилось, но надеюсь в общих чертах понятно
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2012, 17:30
Ответы с готовыми решениями:

Два потока, чтения и записи с ком порта
с++, старый,не нэтовский, вроде 2000, может старее два потока, чтения и записи с ком порта,...

Низкая скорость чтения/записи SSD. Помогите советом.
Проблема собстно в теме. Конфигурация SSD 2.5" SATA-3 64Gb Plextor M3 Marvel_88SS9174...

Остановка чтения из COM-порта
Здравствуйте, уважаемые. Возник вопрос: как принудительно остановить чтение из COM-порта. у меня...

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

12
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
11.12.2012, 19:15 2
Просто номер ноги передать нельзя - у всех портов они совпадают (PC0 и PD0 - одно и то же на самом деле). Для упрощения можно, например, сделать примерно так:
Код
#define PORT_PIN(port)   (p##port-2)
#define PORT_PORT(port)  (p##port)
#define PORT_DDR(port)   (p##port-1)

#define PinOut(port) p##port, b##port
#define PinIn(port)  p##port-2, b##port
#define PinDir(port) p##port-1, b##port

#define SetPinOut(pin)   sbi p##pin-1, b##pin
#define SetPinIn(pin)    cbi p##pin-1, b##pin
Это описание желензых пинов

Код
#define pMY_PIN1       PORTA
#define bMY_PIN1       6
А потом, уже в коде

Код
SetPinIn(MY_PIN1)

in temp, PORT_PIN(MY_PIN1)
0
_moysi
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
11.12.2012, 19:39 3
Э. Опять попытка подмены конечной цели одним из путей достижения её.

Замечаем:

"cbi PORTx, 3" ~ "omdi PORTx, 0b11110111" ~
Код
ldi Temp1, 0b11110111
in Temp2, PORTx
omd Temp2, Temp1
out PORTx, Temp2
"sbi PORTx, 3" ~ "ori PORTx, 0b00001000 " ~
Код
ldi Temp, 0b00001000
in Temp2, PORTx
or Temp2, Temp1
out PORTx, Temp2
Дальше всё по вкусу и ситуации.
Можно сдвигать маску 0b00000001 нужное количество раз вбок. Можно по таблице преобразовывать условный "номер пина" в (любую) маску, соответствующую удобно сделанной разводке платы. Можно...
0
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
11.12.2012, 19:42 4
Ну да, одну инструкцию меняем на 4. К чему такой поток сознания?
0
_moysi
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
11.12.2012, 19:48 5
Человек хочет РАЗНЫЕ пины дёргать. "Передавать в процедуру просто номер ноги" конец цитаты.

Поток сознания с целью выебнуться. Сумничать. Причём не публично по просьбе, теме и/или для наполнения сайта контентом, но как навязчивое персональное обращение. "В каждую бочку затычка".
Чувство Собственной Важности - слышал чонить про такую тему?
0
Brom
5 / 5 / 0
Регистрация: 25.02.2010
Сообщений: 15
11.12.2012, 22:06 6
У меня на одном порту (С) висит несколько одинаковых 1-wire жеелзок.
Хочу опрашивать их поочередно, зашив в процедуру portc и ddrc, а номер пина для чтения и записи передавать параметром.

Я как раз смотрел на адреса портов, посетила мысль использовать их значения. Как раз как предложил THI BIOST.

Не очень понял с кодом:
Код
ldi Temp1, 0b11110111
in Temp2, PORTx
omd Temp2, Temp1
out PORTx, Temp2
Ведь это чтение состояния порта, а не сигналов на пинах? Если не ошибаюсь, после in будет то значение, как настроен порт (с подтяжкой или нет). Хотя я че-то запутался уже. Надо на симуляторе проверить.

В любом случае спасибо за помощь!
0
otiko1988
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 88
13.12.2012, 14:15 7
А сожете подсказать макрос изменения уровня на ноге, типа без прерывания any change
В паскале была такая if pinb,1=not pinb,1 then//////

в винавр немогу ниче придумать if (PIND&_BV(6)) .. може подскажите? то задача медленая, прерывание тратить влом.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
13.12.2012, 14:25 8
А sbi PINx,NumberPin не прокатывает
0
otiko1988
0 / 0 / 0
Регистрация: 24.02.2011
Сообщений: 88
13.12.2012, 14:36 9
А по русски? тоесть си
0
_pv
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,515
13.12.2012, 15:00 10
если просто синвертировать выход, то:
PINx |= (1 << y)
правда не во всех аврах работать будет.

а если надо отследить любое изменение уровня на входе, то надо запоминать предыдущее состояние:
static char prev_pin = PINx;

char pin = PINx;
if ((pin ^ prev_pin) & (1 << y)) {...}
prev_pin = pin;
0
_moysi
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
13.12.2012, 19:00 11
Ещё внимательнее рассмотри тот пример, в котором "многа кода не асилил". Не только команду "скопировать в временную переменную состояние регистра (не PINx, а PORTx, всё правильно)", на остальное смотреть тоже надо.
Сравни:

а). изменить состояние пина,
б). изменить состояние порта.

Ключевое слово для понимания и зацепки наконец уже за смысл идеи: "наложить маску". Через это слово можно гуглить материалы самостоятельно, выбирать по вкусу стиль изложения и личность автора.

Я не понимаю, что можно добавить к уже изложенному. И зачем.
Вопрос простой, банальный, для начинающих.

несколько одинаковых 1-wire жеелзок
Грамотнее разобраться с адресацией в самом 1-вире. И масштабируемее, и в смысле себестоимости, площади платы, соединениях, массогабарите. Там на одной линии можно и нужно иметь более чем одно устройство.

Это про самый первый вопрос от bRom. Спасибить не за что: я уже разъяснил свою мотивацию "делать это" и она не красива.

---
Для проверки понимания вопрос: чем отличается макрос/дефайн/somethinglike от процедуры? А чем похож?
Ответ не мне нужен, а для понимания.
0
Brom
5 / 5 / 0
Регистрация: 25.02.2010
Сообщений: 15
18.12.2012, 17:26 12
Цитата Сообщение от _moysi
Ещё внимательнее рассмотри тот пример, в котором "многа кода не асилил". Не только команду "скопировать в временную переменную состояние регистра (не PINx, а PORTx, всё правильно)", на остальное смотреть тоже надо.
Сравни:
а). изменить состояние пина,
б). изменить состояние порта.
Я прочитал внимательно еще раз, прогнал на симуляторе. В итоге все равно, строкой in Temp2, PORTx я не получаю сигнала на пине. Если не ошибаюсь, то это актуально для манипуляций с ногой, когда она настроена на выход, и читается заданный уровень.
А я хочу смотреть что мне ответил термометр. Прихожу к выводу, что надо зашить pyms, а передавать pc0 как параметр.

Цитата Сообщение от _moysi
Ключевое слово для понимания и зацепки наконец уже за смысл идеи: "наложить маску". [..]
Спасиб, я знаю что есть маски, и как с ними работать. Здесь вопрос в другом.

Цитата Сообщение от _moysi
[..]Грамотнее разобраться с адресацией в самом 1-вире. [..]
Вот только у меня термометр, который не имеет адресации. Я собственно по этому и задаю вопрос. Была бы адресация, изучал бы адресацию.

Цитата Сообщение от _moysi
---
Для проверки понимания вопрос: чем отличается макрос/дефайн/somethinglike от процедуры? А чем похож?
Ответ не мне нужен, а для понимания.
Должна быть подпрограмма, обернутая макросом. Согласен, слово процедура тут несколько неуместно.
0
BykTiho
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
18.12.2012, 18:12 13
Цитата Сообщение от bRom
Я прочитал внимательно еще раз, прогнал на симуляторе. В итоге все равно, строкой in Temp2, PORTx я не получаю сигнала на пине. Если не ошибаюсь, то это актуально для манипуляций с ногой, когда она настроена на выход, и читается заданный уровень.
А я хочу смотреть что мне ответил термометр. Прихожу к выводу, что надо зашить pyms, а передавать pc0 как параметр
Нужно понять разницу между PORTx и PINx. Разница заключается в том, что PORT - записывает данные в порт контроллера, а PIN - читает состояние порта контроллера. Для чтения используется именно команда in temp, PINx, которая переместит в регистр temp значения на выводах порта X. И не важно, на вход или на выход настроены конкретные биты. Это влияет только на то, кто может поменять значение бита (программа или внешний сигнал). Следовательно, команда in temp, PORTx не покажет реальной ситуации в регистрах порта...
0
18.12.2012, 18:12
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2012, 18:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Оптимизация чтения с COM - порта
И снова здравствуйте, у меня возникла проблема, от которой уже мозги кипят. Разобраться с ней...

Метод чтения байтов из порта
Добрый день! Почему ругается компилятор ? Как исправить ? Спасибо! private: System::Void...

Функция чтения ком порта
Господа помогите новичку. Необходимо написать функцию чтения строк с ком порта длина которых больше...

Не работает поток чтения из COM порта
Программа открывает COM порт и шлет в него 8-ми битное значение. Поток передачи работает: на TX...


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

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

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