Kamelot писал(а):тут даже на сайте про это написано:
Соответственно, если, скажем, PX3 настроен на ввод, то бесполезно писать что-либо в 3-й бит PortX, поскольку оно не будет выведено.
И наоборот, если например, PX5 настроен на вывод, то прочитав 5-й бит PinD, мы всегда обнаружим 0.
http://radiokot.ru/start/mcu_fpga/avr/06/
не читайте глупости.
правильное поведение следующее:
А) в DDRх все нули (для простоты) - порт работает целиком на ввод
A.1) Запись в
PORTx единиц приведет к тому, что включатся подтяжки в соответствующих разрядах. Это означает, что на ножках МК, ни к чему не подключенных, 100%
появятся высокие уровни. при чтении
PINx 100%
будут единицы для этих разрядов. Уровни на ножках МК, соединенных с какими-то цепями схемы, могут быть любыми, соответственно значения в PINx так же будут либо 0, либо 1 в зависимости от реального уровня напряжения на соответствующей ножке.
A.2) Чтение
PORTx всегда будет возвращать то, что ранее туда записали
А.3) Запись в
PORTx всех нулей отключит все подтяжки. Уровни сигналов на всех ножках МК станут
неопределенными, неподключенные никуда могу сохранять прежний уровень напряжения, оставшийся от предыдущего состояния, т.е.
PINx для тех разрядов, которые ранее были с подтяжками или на которые ранее из схемы приходили высокие уровни, будут оставаться в 1, остальные будут содержать значение в зависимости от сигналов, поступающих на МК из схемы. Единичные уровни разрядов
PINx, оставшихся от предыдущих "подтяжек" могут самопроизвольно перейти в 0 из-за разряда входной емкости (утечки). При этом нулевые разряды на болтающихс ножках могут ровно так же самопроизвольно из-за тех же утечек перейти в 1-ое состояние. Короче говоря, в этом случае
болтающиеся ноги - полная неопределенность.
A.4) Запись 0 в
PINx не влияет ни на что.
А.5) Запись 1 в
PINx для этого режима мною не изучена, я не могу предсказать результат - кто знает, конкретизируйте.
Б) в DDRx все 1 - порт работает целиком на вывод
Б.1) Запись в
PORTx любых сигналов приведет к переключению драйверов пинов в соответствующие уровни. Ток пина при этом должен быть ограничен
исключительно внешними цепями схемы, никаких
ограничителей втекающего или вытекающего тока внутри МК нет. Попытка подать 0 из схемы на ногу, выводящую 1, равно как и подача 1 на ногу, выводящую 0,
может привести к выгоранию порта.
Б.2) При чтении
PINx в его разрядах будут отображаться реальные уровни сигналов на ножках. Если МК пытается выдать 1, но внешняя схема такова, что напряжение на ноге проседает до 1,2 вольта - в соответствующем разряде
PINx вы прочтете 0, хотя в
PORTх будет 1. аналогично и для противоположной ситуации.
Б.3) Запись в PINx значения 0 никак не влияет ни на что
Б.4) Запись 1 в разряды PINx для МК "свежих" серий (все с буквой А, многие с буквой Р, некоторые обычные, но выпуска после 2010 года ориентировочно - уточнять в даташитах)
приведет к инвертированию уровня на ножке МК,
при этом состояние регистра PORTx будет сохранено прежним. Это самая важная особенность архитектуры.
P.S. не смотря на то, что ассемблер Atmel не делает разницы между заглавными и прописными буквами, очень рекомендую использовать наименованияя регистров и портов теми символами, как указано в документации. В частности, никаких
portb,
PortB,
PORTb или
portB - только
PORTB. аналогично и для всех других. это сбережет вам много нервов в будущем.