Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: вопрос
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
skilful
Добрый день. Хочу спросить у участников форума - возникла необходимость соединить несколько ног МК (одного порта). Необходимо, допустим, подавать сигнал на PB0, а снимать с PB3, PB4.
Для этого необходимы следующие настройки порта:

DDRB = 00000000 b
PORTB = 00000001 b


Подскажите пожалуйста так будет правильно делать?
VDG
Нет.
DDRB = 0bxxx00xx1
PORTB = 0bxxx00xx?
Kovrov
главное чтобы не соединять ноги от 2х и более портов настроенных на вывод
если нужен такой вариант то цепляйте резистор(Ы).
в вашем случае все порты настроены на ввод + включен подтягивающий резистор на PB0
напомню что направление портов есть DDRx 1= out 0=in
prottoss
Цитата(skilful @ Dec 4 2006, 00:30) *
Добрый день. Хочу спросить у участников форума - возникла необходимость соединить несколько ног МК (одного порта). Необходимо, допустим, подавать сигнал на PB0, а снимать с PB3, PB4.
Для этого необходимы следующие настройки порта:

DDRB = 00000000 b
PORTB = 00000001 b

Подскажите пожалуйста так будет правильно делать?
Интересно, зачем такие выкрутасы нужны? Неужели нет возможности решить задачу внутри МК?

PS: ИМХО таких задач нет!!!
Kovrov
ну наверное чисто теоретически
Dog Pawlowa
Цитата(prottoss @ Dec 3 2006, 20:57) *
Интересно, зачем такие выкрутасы нужны? Неужели нет возможности решить задачу внутри МК?
PS: ИМХО таких задач нет!!!

Хм, я использую... А почему? Хм...
Обычно на момент проектирования печатной платы не до конца ясен принцип обработки некоторых входных сигналов. То ли АЦП, то ли компаратор, то ли прерывание по изменению уровня, то ли логика захвата, то ли просто считывание, то ли вход таймера. Каак заведу на все входы! А потом выбираю спокойно :-)
Да и с выходными точно так же.
skilful
имеется разъем на много ног (около 50). Необходимо прозвонить каждый с каждым контакт внутри разъема, чтобы определить какой контакт с кем замкнут. Вот и думаю решить задачу с помощью МК (каждая нога МК на контакт разъема).
Алгоритм моих действий прост - выставляю единицу на 1 ноге и читаю сигнал на других ногах. Если прочитаю на какой-нить другой единицу, то эти 2 контакта замкнуты....и т.д.

Поэтому и возникла задача соединения 2-х и более ног МК.


Только я уже запутался. В спецификации на МК написано
DDRB=0; PORTB=0 - высокое входное сопротивление порта


Тогда как нужно настроить порты (PB0 - выход; PB3 - вход )??? Вот так?????

DDRB = 0000 0001
PORTB = 0000 0001


Если не правильно все изложил напишите...
prottoss
Цитата(Dog Pawlowa @ Dec 4 2006, 01:37) *
Хм, я использую... А почему? Хм...
Обычно на момент проектирования печатной платы не до конца ясен принцип обработки некоторых входных сигналов. То ли АЦП, то ли компаратор, то ли прерывание по изменению уровня, то ли логика захвата, то ли просто считывание, то ли вход таймера. Каак заведу на все входы! А потом выбираю спокойно :-)
Да и с выходными точно так же.
А я это делаю это еще спокойнее с помощью бумаги, карандаша. Т.е. сначала думаю, потом паяю.

Цитата(skilful @ Dec 4 2006, 01:43) *
Только я уже запутался.
Что тут понимать то? Всего четыре сосны:

1 Сосна:
DDR = 0, PORT = 0 - вход, он же просто нога МК в высокоипедансном состоянии

2 Сосна
DDR = 0, PORT = 1 - вход с подтяжкой пуллап-резистором к шине питания

3 Сосна
DDR = 1, PORT = 0 - выход, установлен уровень лог. ноль

4 Сосна
DDR = 1, PORT = 1 - выход, установлен уровень лог. единицы
skilful
ну да, так для моей задачи изначальное сотояние

DDR = 0000 0001
PORT = 0000 0001

подойдет???
prottoss
Цитата(skilful @ Dec 4 2006, 02:03) *
ну да, так для моей задачи изначальное сотояние
DDR = 0000 0001
PORT = 0000 0001
подойдет???
Догадайтесь уж сами, я Вам из прЫнцЫпа не скажу. Вам уже все на десятый раз разжевали, а Вы все пойдет-не-пойдет... Пошлите, он и пойдет)
Dopler
Цитата(prottoss @ Dec 3 2006, 20:57) *
Цитата(skilful @ Dec 4 2006, 00:30) *
Добрый день. Хочу спросить у участников форума - возникла необходимость соединить несколько ног МК (одного порта). Необходимо, допустим, подавать сигнал на PB0, а снимать с PB3, PB4.
Для этого необходимы следующие настройки порта:

DDRB = 00000000 b
PORTB = 00000001 b

Подскажите пожалуйста так будет правильно делать?
Интересно, зачем такие выкрутасы нужны? Неужели нет возможности решить задачу внутри МК?

PS: ИМХО таких задач нет!!!


Вот для примера задача.
Устройство работает с синхронизацией от сети (лампочками мигает), прерывание заведено на INT0, а заказчик говорит, вот бы еще и без синхронизации работало (мигать светодиодами). Так я нароил шим внутри на 50 гц и выдал на ножку (аппаратно), соседнюю с INT0. Заказчик, когда нужна сеть, ведет сигнал от сети, когда не нужна - замыкает две соседние ножки.
skilful
Цитата(Kovrov @ Dec 3 2006, 20:46) *
главное чтобы не соединять ноги от 2х и более портов настроенных на вывод
если нужен такой вариант то цепляйте резистор(Ы).
в вашем случае все порты настроены на ввод + включен подтягивающий резистор на PB0
напомню что направление портов есть DDRx 1= out 0=in





Тогда будет


DDR = 0000 0000
PORT = 0000 0001 ???
_artem_
Думаю что Ваш алгоритм можно немного изменить -
а. В каждый момент только один порт работает на выход - выдает логический ноль
б. Все остальные порта работают на вход с пулап включенным.
в. В начале сделайте все порта на вход с пулап и прочитайте значения на них - те что ноль могут замыкать на землю.
г. В дальнейшем поочередно пробуйте по одному порту на вывод а остальные на вход контролируя изменение состояния на инпут портах.

В этом случае короткого замыкания можно не бояться .
skilful
ну да, Артем, ты абсолютно прав! Спасибо, просто я хотел сделать наоборот - выдается +5В на ногу и делается перебор считываний на других ногах. Если еще где-нить +5В, то есть замыкание



Одну ногу я подключаю через подтягивающий резистор - на выходе высокий логический уровень, на остальных высокое входное сопротивление. Т. е. при подаче моих 5 В я их и прочитаю на других ногах, если есть замыкание.


Поэтому и думаю про варианты

DDRB = 00000000 b
PORTB = 00000001 b

или

DDRB = 00000001 b
PORTB = 00000001 b
vooon
Посмотрите таблицу:

Код
+--------+-----+--------+------+
|reg\mode| inp | inp up | outp |
+--------+-----+--------+------+
|DDRx.y  |  0  |    0   |   1  |
|PORTx.y |  0  |    1   |   a  |
+--------+-----+--------+------+
|PINx.y  |  Z  |    1   |   a  |
+--------+-----+--------+------+

, где x - имя порта (например "B", тогда DDRB, PORTB, PINB),
      y - номер пина (мы помним что каждому пину порта соответствует один бит в регистрах
направления (DDR), порта (PORT), реального состояния (PIN))

      Z - высокоимпедансное состояние, если на пине нет ни какого сигналла (ни к чему не
подключен) обычно читается как 0, но из-за помех вполне возможно прочитать как 1.

      a - от состояния бита зависит состояние выхода (0/1)

inp    - обозначает режим при котором пин работает на вход, высокоимпедансный вход

inp up - обозначает режим при котором пин работает на вход, но подтянут внутренним резистором
(60-150 кОм) к шине питания МК. читается как 1, если что-нибудь не притянет к земле... :)

outp   - выход, состояние пина зависит от значения записанного в PORTx.y

напомню что регистр PINx доступен только для чтения! и содержит реальное состояние этого пина.


Удачи smile.gif

Add: Хм пока писал....
prottoss
Цитата(Dopler @ Dec 4 2006, 03:02) *
Вот для примера задача.
Устройство работает с синхронизацией от сети (лампочками мигает), прерывание заведено на INT0, а заказчик говорит, вот бы еще и без синхронизации работало (мигать светодиодами). Так я нароил шим внутри на 50 гц и выдал на ножку (аппаратно), соседнюю с INT0. Заказчик, когда нужна сеть, ведет сигнал от сети, когда не нужна - замыкает две соседние ножки.
так вот в вашем случае как раз ничего соединять то и не надо - можно программно в порт, на котором находится прерывание записать, нужное значение, и прерывание выполнится...
add
Цитата
так вот в вашем случае как раз ничего соединять то и не надо - можно программно в порт, на котором находится прерывание записать, нужное значение, и прерывание выполнится...

Думаю несовсем так.. поскольку речь шла о том что "заказчик" сам изменяет конфигурацию. Совсем не обязательно что то переключать..(хотя можно и кнопку даже приделать..) Можно просто определить есть ли внешняя частота сети 50Гц, если нет то тактировать вутренним прерыванием.
prottoss
Цитата(add @ Dec 4 2006, 13:51) *
Цитата
так вот в вашем случае как раз ничего соединять то и не надо - можно программно в порт, на котором находится прерывание записать, нужное значение, и прерывание выполнится...

Думаю несовсем так.. поскольку речь шла о том что "заказчик" сам изменяет конфигурацию. Совсем не обязательно что то переключать..(хотя можно и кнопку даже приделать..) Можно просто определить есть ли внешняя частота сети 50Гц, если нет то тактировать вутренним прерыванием.
Ну дык и я о том же... Вообще, ИМХО, соединение нескольких портов(имеется в виду выводов) МК в одну точку не есть хороший тон, так как надежность устройства резко уменьшается... Ввиду разных катаклизмов, которыми кишит пространсво и время не известно что может быть с этими портами и в какую сторону они будут работать после Большого Сбоя Программы, тем паче, что устройство берет сигнал с розетки...
Dog Pawlowa
Цитата(prottoss @ Dec 3 2006, 21:54) *
А я это делаю это еще спокойнее с помощью бумаги, карандаша. Т.е. сначала думаю, потом паяю.

А я уже давно ничего не паяю. Для этого специально обученные люди есть :-)
Реальная ситуация недельной давности. Заказчик пишет "мы получили заказ на разработку А, где будет применяться плата от проекта Б, предусмотри подключение температурного датчика и двух счетчиков воды". Плата А уже почти разведена(тоже специально обученным человеком), а я даже не знаю, с какой точностью нужно измерять температуру, удаление датчика и проч. Вот и приходится закладываться на разные решения.
Так что не всегда есть нормальные условия думать. Вам повезло tort.gif
prottoss
Цитата(Dog Pawlowa @ Dec 4 2006, 14:58) *
А я уже давно ничего не паяю. Для этого специально обученные люди есть :-)
Реальная ситуация недельной давности. Заказчик пишет "мы получили заказ на разработку А, где будет применяться плата от проекта Б, предусмотри подключение температурного датчика и двух счетчиков воды". Плата А уже почти разведена(тоже специально обученным человеком), а я даже не знаю, с какой точностью нужно измерять температуру, удаление датчика и проч. Вот и приходится закладываться на разные решения.
Так что не всегда есть нормальные условия думать. Вам повезло tort.gif
Ну, когда я говорил "Я" и "паяю", то имел ввиду не только себя))). Смысл в том, что сначало надо продумать, а потом уже воплощать в железо. А когда проектировщик свое за стенкой, а Вы свое, а еще есть дяденька, который носки вяжет, но они тожа в проекте заложены... тада дааа...

Patch holes, the ship will soon sink

VDG
Цитата(skilful @ Dec 3 2006, 22:43) *
Тогда как нужно настроить порты (PB0 - выход; PB3 - вход )??? Вот так?????

А мой разжеванный ответ мимо ушей пустили? angry.gif
skilful
Цитата(VDG @ Dec 3 2006, 20:46) *
Нет.
DDRB = 0bxxx00xx1
PORTB = 0bxxx00xx?




Я так понял при если на на PB0 единица, то порт может сгореть, ведь такая настройка не включает подтягивающий резистор?

еще 2 вопроса:


1) если устанавливаем
DDR = 0000 0000
PORT = 1111 1111

включены подтягивающие резистры и PIN = 1111 1111
если нога не садится на землю. А в AVR STudio значение PIN не становится = 1111 1111. Почему??
2) на тех ногах, где аналоговый компаратор есть ли эти подтягивающие резисторы?? А то в одной книге написано есть, в другой - нет. ?
Wild007
Цитата(skilful @ Dec 4 2006, 21:38) *
Цитата(VDG @ Dec 3 2006, 20:46) *

Нет.
DDRB = 0bxxx00xx1
PORTB = 0bxxx00xx?

еще 2 вопроса:
1) если устанавливаем
DDR = 0000 0000
PORT = 1111 1111
включены подтягивающие резистры и PIN = 1111 1111
если нога не садится на землю. А в AVR STudio значение PIN не становится = 1111 1111. Почему??

Потому что Studio НЕ ЗНАЕТ куда и как вы подключили м\к и оставляет их значение на ваш выбор. Кликните мышкой на значении (белый квадратик) и он изменит свой цвет (на выводе станет 1) и если вы не будете менять направление порта, там и останется 1.
Dopler
Цитата(prottoss @ Dec 4 2006, 10:14) *
Цитата(add @ Dec 4 2006, 13:51) *
Цитата
так вот в вашем случае как раз ничего соединять то и не надо - можно программно в порт, на котором находится прерывание записать, нужное значение, и прерывание выполнится...

Думаю несовсем так.. поскольку речь шла о том что "заказчик" сам изменяет конфигурацию. Совсем не обязательно что то переключать..(хотя можно и кнопку даже приделать..) Можно просто определить есть ли внешняя частота сети 50Гц, если нет то тактировать вутренним прерыванием.
Ну дык и я о том же... Вообще, ИМХО, соединение нескольких портов(имеется в виду выводов) МК в одну точку не есть хороший тон, так как надежность устройства резко уменьшается... Ввиду разных катаклизмов, которыми кишит пространсво и время не известно что может быть с этими портами и в какую сторону они будут работать после Большого Сбоя Программы, тем паче, что устройство берет сигнал с розетки...


Ну если так рассуждать, то один контролер вообще нельзя соединять с другим линиями (а вдруг в обоих программа собъется). Бесспорно, недопустимо соединять несколько выводов МК в один (якобы для увеличения мощности), что используется сплошь и рядом в радиолюбительской практике, а соединить выход со входом одного МК через резистор (например, 4к7) уж точно не криминал.
В моем случае речь шла об одноразовой поделке, не претендующей на основательность и фундоментальность, я просто привел пример в противовес вашему категоричному "Не существует".
prottoss
Цитата(Dopler @ Dec 5 2006, 23:57) *
В моем случае речь шла об одноразовой поделке, не претендующей на основательность и фундоментальность, я просто привел пример в противовес вашему категоричному "Не существует".
"Не существует" - имелось ввиду анализ сигнала на одном выводе МК с помощью другого вывода МК - для этого достаточно считать для этого спэшл предназначенный регистр PINx
skilful
Ну, хватит smile.gif) я воспользуюсь решение Артема (thx). Думаю оно никак не испортит МК. Ознакомьтесь с ним. Вот скажите лучше, пожалуйста, на ногах у Мега 64, где висит компаратор подтягивающие резисторы тоже можно включить?? Разные книженции сбили меня с толку. Заранее благодарю.
prottoss
Цитата(skilful @ Dec 6 2006, 02:26) *
Ну, хватит smile.gif ) я воспользуюсь решение Артема (thx). Думаю оно никак не испортит МК. Ознакомьтесь с ним. Вот скажите лучше, пожалуйста, на ногах у Мега 64, где висит компаратор подтягивающие резисторы тоже можно включить?? Разные книженции сбили меня с толку. Заранее благодарю.
Если порт используется как GPIO - то есть просто как порт, то конечно, можно как обычно. Если порт используется как выводы компаратора, то пуллапы можно отключить "совсем-совсем" через SFIOR
skilful
Спасибо всем. Низкий поклон smile.gif)) Премного благодарен
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.