Рассказываю, что там было с портами. В прошлую среду многие столкнулись с тем, что установить значение для порта P0 можно только один - первый раз, присваивания для второй и следующих попыток оказывали воздействие только на содержимое регистра порта, а на его ножки, если они меняли их состояние из 0 в 1 - нет.
С портом P1 было что-то то же самое, но это как раз таки нормально - ведь порт P1, как следует из документации, может работать только на вход, но не на выход.
Я немного поэкспериментировал дома - оказалось, что порты, начиная с P2 и далее, работают без подобных вывертов. То есть, код вида:
- Код: Выделить всё
P2 = 0xbb;
P2 = 0xaa;
отрабатывает именно так, как и ожидается. Следовательно, между портом P0 и, например, портом P2 есть какая-то разница... И она действительно есть!
Вот примерно так (весьма и весьма схематично) выглядит внутреннее устройство порта P2, точнее той его части, что работает на выход:

- Строение порта P2
- P2_port.png (14.22 Кб) Просмотров: 38097
Тот самый регистр, куда вы заносите байт операцией
P2 = 0xbb - это "register (P2)". Его же содержимое отражается в верхней линейке чекбоксов (Reg) в окне, отображающем состояние порта P2 в симуляторе кейла.
Железная же ножка, которая торчит из корпуса микроконтроллера - на схеме это "Pin", квадратик с крестиком внутри. В симуляторе кейла ее состояние отражается в нижней линейке чекбоксов (Pin) в соответствующем окне. По понятным причинам, я не стал рисовать все восемь ножек, а нарисовал лишь одну, для бита #1.
Между ножкой и регистром есть схема сопряжения, нужная хотя бы для того, чтобы не сжечь к такой-то матери все внутренности микроконтроллера, если через ножку потечет слишком большой ток - сгорит лишь схема сопряжения, что не так страшно.
Теперь, о том, как все это работает. Для лучшего понимания, применю весьма близкую аналогию с водопроводом.
Представим, что GND - земля, "минус батарейки" - это канализация с черной дырой внутри, куда все неизбежно стекает. Провода - водопроводные трубы, по которым течет вода. VCC - питание, +5 вольт - это бак с водой на крыше небоскреба. Транзистор - это водопроводный вентиль. Резистор - сужение в трубе, предназначенное для того, чтобы вся вода не утекла сразу же в канализацию, унеся с собой детали от водопроводного вентиля, трубы и прочие штуки. Ну а ножка - ответвление от трубы, подключаемое к другой схеме.
Итак, что у нас происходит, когда мы записываем единицу в первый бит регистра? Вентиль закрыт. Вода из бака вытекает под напором из ответвления, наполняя собой трубы, подключенные к нему - иначе говоря, на ножке у нас логическая единица.

- P2 - логическая единица
- P2_port_1.png (14.79 Кб) Просмотров: 38097
Если же мы вместо единицы, запишем ноль - вентиль открывается и вода из бака улетает сразу в канализацию, а ответвлению ничего не достается (у нас ведь черная дыра там, не забыли?). Более того, если в трубах, подключенных к ответвлению была какая-то вода, то она тоже сливается в канализацию. Это - логический ноль.

- P2 - логический ноль
- P2_port_0.png (17.33 Кб) Просмотров: 38097
Перейдем же теперь к упомянутой особенности порта P0.

- Устройство порта P0
- P0_port.png (9.13 Кб) Просмотров: 38097
Как видно, у него нет ни небоскреба с баком (VCC), ни тем более сужения в трубе после бака (pull up резистора). Все что мы можем здесь - это открыть транзистор и установить логический ноль на ножке. Если транзистор закрыт - у нас уже не будет состояния логической единицы! Небоскреба с баком нет, давления в системе нет, вода не заливается в ответвление, ни тем более (вентиль ведь закрыт) не высасывается из него в канализацию.
Иными словами, ножка просто "плавает в воздухе". В железе, состояние ножки будет зависеть от фазы луны и настроения императора Галактики Ская Фалькорра с планеты Дракия. На ножке может быть как ноль, так и единица, или же вообще некие случайные колебания напряжения...
Чтобы использовать такой порт для вывода, к нему таки подключают и питание (VCC), и ограничительный резистор, но делают это уже снаружи микросхемы. Преимущества - можно подобрать резистор, который сможет выдержать такие токи, от которых внутренний резистор давно бы помер, вместе с транзистором.
Но у нас в симуляторе кейла, есть только внутренности микроконтроллера, объяснить симулятору, что мы хотим еще и внешние pull-up резисторы, мы не можем (вроде бы). А с тем "огрызком" что у нас есть, все что мы можем - выставить логический ноль на пине и все...
Университет развивает все способности, в том числе — глупость.
-- Антон Павлович Чехов