Страница 1 из 2

AVR Studio 4 - не могу разобраться с направлением портов!

Добавлено: Сб окт 13, 2007 07:02:37
Alex T.
Всем привет! Помогите пожалуйста разобраться с регистрами DDRx в AVR Studio 4. Привожу следующий отрывок кода:


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

.include "1200def.inc"

.ORG   000
      rjmp reset
reset:
      ldi r31,$1f
      out ddrb,r31
      ldi r31,$61
      out portb,r31
      rjmp scan
scan:
      sbis pinb,6
      rjmp left
      sbis pinb,5
      rjmp right
      rjmp scan
left:
      rjmp scan
right:
      rjmp scan


И так, выводя в DDRB число $1f (то есть 0b00011111) я задаю работу выводов PORTB pin 0 по pin 5 как выходы, а 6, 7 и 8 соотв. как входы. Но, во время симуляции, при выводе числа $61 (0b01100001) в PORTB (см. код), в регистр PINB считывается PORTB pin 0 вместо заданных как входы PORTB pin 5 и pin 6, в результате чего блок с месткой scan отрабатывает прыжок на метку left (чего в принципе не требуется). Если попытаться инверсировать число вводимое в регистр DDRB, то есть вместо $1f ввести $e0 (при этом направление портов тоже инвертируются), то все работает как надо, но остается вопрос, а как же с направлениями портов, ведь теперь они заданы наоборот? Может в AVR Studio надо где-то задавать правильную работу DDRx? В чем здесь ошибка?

Спасибо за помощь!

Добавлено: Сб окт 13, 2007 10:34:35
Reboot_s
Я ника не могу понять что надо, обьяснение запутанное.
Но могу заметить,что если вывод порта работает, как вход, то значение с него считывается внешнее, то есть от внешнего сигнала.
Надеюсь, помог.

Добавлено: Сб окт 13, 2007 10:39:48
tych
Я думаю вы не правы ! и путаете спрашивающего.
С порта всегда читается то что туда записали а до записи считываются нули. Устройство ножки смотрите по ссылке выше.

Добавлено: Сб окт 13, 2007 14:30:18
Alex T.
Насчет кода. Одним словом в AVR Studio, в PINB ничего не передается со входов, когда пины настроены на вход (да да, ВХОД), и наоборот передается, когда они настроены как выходы! Вот это и создает неурядицу.

Если не трудно, прогоните его под AVR Studio, и все станет ясно.

Добавлено: Сб окт 13, 2007 18:40:37
Alex T.
Ребята, БОЛЬШОЕ всем спасибо!!! Теперь понял, а то у меня создалась путаница в голове. Мне казалось, что при конфигурации порта как "вход", в PINx должно записываться то, что на данный момент записано в PORTx, а в случае выхода туда вообще ничего не пишется, в чем я и ошибался! Вы мне все прояснили. Теперь я знаю, что во время симуляции мне надо самому вручную выставлять или снимать биты на PINB.6 и PINB.5, чтобы как бы эмулировать состояние физических выводов! Еще раз всем спасибо за помощь. tych, прости что сразу не заметил кнопку www - я тут лишь с сегодняшнего дня, с непривычки видимо. :))

Добавлено: Сб окт 13, 2007 19:01:17
kamikadze
Прекрасная картинка с обучалки
Изображение

Добавлено: Сб окт 13, 2007 19:28:01
tych
Картинка великолепная ! НЕ ПРАВИЛЬНАЯ конечно. Но прикольно и красочно сделано :lol: В мурзилку хорошо подошла бы.
Вот схема ножки AVR и регистров близкая к реальности
Изображение

Добавлено: Сб окт 13, 2007 21:04:47
Aheir
Короче говоря, тему я почистил. :)

Подведем итоги. PINx и PORTx - разные регистры МК. Соответственно, PINx содержит логические уровни на соответствующих выводах МК, PORTx хранит записанное туда вами. PORTx читается всегда одинаково (до тех пор пока вы его сами не перепишете), вне зависимости от изменения внешних сигналов, если мы хотим следить за происходящим во внешнем мире - читаем PINx. Регистр DDRx определяет направление порта в том смысле, что блокирует передачу на выход уровней PORTx, если порт настроен на вход. Примерно так. Несколько упрощенно, но, думаю, понятно. :)

Добавлено: Сб окт 13, 2007 22:21:17
kamikadze
Ну то что озвучил Aheir изображено в обучалке

Добавлено: Сб окт 13, 2007 22:30:00
tych
kamikadze писал(а):Ну то что озвучил Aheir изображено в обучалке


И чё Aheir написал что DDRx отключает PINx ? Так ведь нарисовано на картинке из обучалки. А ножка является входом при "1" в битах DDRx ? :shock: :shock: :shock:

Добавлено: Вс окт 14, 2007 08:18:38
Alex T.
Точно, картинка неправильная и неполная, вот с нее-то и началась моя путаница! А кто писал обучалку? Посоветуем ему исправить картинку.

Добавлено: Вс окт 14, 2007 08:26:36
Alex T.
Короче говоря, тему я почистил. Smile

Подведем итоги. PINx и PORTx - разные регистры МК. Соответственно, PINx содержит логические уровни на соответствующих выводах МК, PORTx хранит записанное туда вами. PORTx читается всегда одинаково (до тех пор пока вы его сами не перепишете), вне зависимости от изменения внешних сигналов, если мы хотим следить за происходящим во внешнем мире - читаем PINx. Регистр DDRx определяет направление порта в том смысле, что блокирует передачу на выход уровней PORTx. Примерно так. Несколько упрощенно, но, думаю, понятно. Smile


Да, в полне понятно, но чтобы звучало полноценно, я бы еще отметил, что DDRx "блокирует" передачу уровней в случае, когда он определяет направление порта, как вход.

Не так ли, ведь при выходе ничего не блокируется)?

Добавлено: Вс окт 14, 2007 09:59:37
tych
Alex T. писал(а):Точно, картинка неправильная и неполная, вот с нее-то и началась моя путаница! А кто писал обучалку? Посоветуем ему исправить картинку.


ИМХО бесполезно. Примерно год назад я уж пытался советовать исправить.

Добавлено: Вс окт 14, 2007 10:00:43
tych
Alex T. писал(а):я бы еще отметил, что DDRx "блокирует" передачу уровней в случае, когда он определяет направление порта, как вход.


На чб рисунке ИМХО всё очевидно и ясно.

Добавлено: Вс окт 14, 2007 12:01:43
Aheir
Alex T. писал(а):...я бы еще отметил, что DDRx "блокирует" передачу уровней в случае, когда он определяет направление порта, как вход...


Добавил. :)
Последние наши посту здесь особого смысла не имеют, так что если никто не против, через пару дней устроим еще одну чистку темы.
Насчет обучалки - попробуем решить.

Добавлено: Вс окт 14, 2007 12:43:01
Alex T.
Я не против.

Добавлено: Вс окт 14, 2007 13:13:10
tych
Aheir писал(а):Последние наши посту здесь особого смысла не имеют, так что если никто не против, через пару дней устроим еще одну чистку темы.


Я против - всего лишь 1 голос. ИМХО много места они не занимают, а вот как тернист путь к истине показывают наглядно.

Добавлено: Пн окт 15, 2007 14:02:51
Serega
Тыч, обучалку по контроллерам писал я.
Картинку может и можно в мурзилку. Но она наглядно и без лишних тонкостей объясняет работу ПВВ. Начинающих совсем не обязательно грузить сложными схемами. Я могу привести твою схему ниже в качестве допматериала, но объяснять по ней я ничего не смогу.

Добавлено: Пн окт 15, 2007 16:42:43
tych
Serega писал(а):Тыч, обучалку по контроллерам писал я.
Картинка наглядно и без лишних тонкостей объясняет работу ПВВ.


Но она не правильная !

1. По ней проискодит отключение ножек МК от регистра PIN - а это не правильно. Он всегда подключен и в нем всегда отражаются уровни на ножках.

2. так как регистр DDR ты поместил снизу получается что ножка ВХОД когда бит в DDR равен "1" - а на самом деле наоборот.

Почему не нарисовать простой наглядный рисунок но ПРАВЕЛЬНЫЙ ???

Serega писал(а):Начинающих совсем не обязательно грузить сложными схемами.


и ВОВСЕ НЕ ДОПУСТИМО грузить не верными схемами.

Serega писал(а):Я могу привести твою схему ниже в качестве допматериала, но объяснять по ней я ничего не смогу.


Тебе не нужно объяснять, объяснение там где она опубликована.

Картинка, схема должна быть правильной, но в любом дш и апноуте к схемам приложены текстовые пояснения - это нормально.

Я думаю тебе не трудно нарисовать правильно - так как в МК и не сложно - т.е. условную схему.

Добавлено: Пн окт 15, 2007 16:56:11
tych
Serega писал(а):но объяснять по ней я ничего не смогу.


Ага... так я и поверил :lol: :lol: :lol: "обучалку написал но схем читать не умею".

"НУ ни как" не сообразить что DDRB.1 управляет переключателем и "1" он верху а "0" он внизу. Ну ни в жисть не догадаться. Да ?

Всё как-то в тумане ...

Ну то что сигнал с PB1 - по СТРЕЛОЧКЕ ! - поступает в PINB.1 ВСЕГДА это конечно ребус афигительный.

И уж ни как нельзя понять что "1" или "0" из PORTB.1 - по СТРЕЛОЧКЕ ! - поступает либо прямо на PB1 когда в DDRB.1 есть "1" либо в виде подтяжки через диод и резистор примерно 40 ком когда в DDRB.1 есть "0"

Диод не дает "0" в PORTB.1 тянуть в низ ногу PB1 - подтяжка выключена.

Блин ! Ну такая сложная схема ... Оййой ...

Изображение

А помню кто-то доказывал как важно новичку знать как устроен транзистор ! А эта схема выходит его "загрузит". Т.е. пытаясь изучить МК - не грузись устройством его ног ! - весело :lol: :lol: :lol: