|
Программирование MCS-51, Настройка портов на ввод |
|
|
|
Jan 13 2012, 15:01
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Jead @ Jan 13 2012, 17:19)  Ну не совсем обнулять, а скажем послать в него определенную комбинацию, н-р: MOV P1,#01000000b. Наверное, Вы хотели спросить следующее: Допустим, что младшие 3 бита порта Р1 предназначены для ввода, а старшие 5 бит - для вывода. Как, настроив младшие биты порта Р1 на ввод, изменять значение битов порта Р1 на вывод, при этом не затрагивая биты этого порта, настроенные на ввод? Ответ: 1. Допустим, что в начале работы программы значения выходных пинов (битов) порта Р1 - низкий уровень (ноль). Настройка (инициализация) порта Р1 осуществляется следующим образом: MOV P1, #00000111b В случае, если некоторые пины (биты) порта Р1, предназначенные для вывода, в начале работы программы должны иметь высокий уровень (единицу), то инициализация будет выглядеть так (например, самый старший разряд - высокий.единица): MOV P1, #10000111b 2. Например, теперь необходимо сигнал на третьем (считаем с нуля!) пине (бите) сделать сигнал высокого уровня. Делается это так: ORL P1, #00001000b или так SETB P1.3 3. Теперь, например, на этом (третьем) пине (бите) нужен низкий уровень: ANL P1,#NOT 00001000b или CLR P1.3 4. Если нужно установить сразу два бита (например, четвертый и пятый): ORL P1,#00110000b сбросить в ноль эти два бита ANL P1,#NOT 00110000b 5. Если нужно изменить значение одного бита (например, третьего) на противоположное: CPL P1.3 Ну, вот, как-то таким образом.
|
|
|
|
|
Jan 18 2012, 19:59
|
Группа: Участник
Сообщений: 12
Регистрация: 30-10-11
Пользователь №: 68 056

|
Палыч, сделал все как Вы подсказали, вышло вот так Код SJMP BEGIN ORG 0000h BEGIN: MOV P1,#01111111b ORL P1,#00001000b M4: MOV A,#00000000b JNB P1.0,M1 INC A M1: JNB P1.1,M2 INC A M2: JNB P1.2,M3 INC A M3: JZ M4 CLR P1.3 DJNZ A,M5 DJNZ A,M6 SETB P1.6 SJMP M4 M5: SETB P1.4 SJMP M4 M6: SETB P1.5 SJMP M4 END Но вот только я не совсем понимаю, если мы делаем MOV P1, #00000111b(настраиваем порты на ввод), то как нам потом снимать значения, т.е. есть ли там единица или нет? Грубо говоря, биты с нулевого по второй у нас подключены к кнопкам, с третьего по шестой - к светодиодам. И надо считывыя с Р.0, Р.1 и Р.2 результат (есть ли единица там или нет, т.е. нажата ли кнопка) определить какое количество кнопок нажато и зажечь определенный светодиод. Но когда мы настраиваем порты на ввод и вывод компилятор видит во всех этих настроенных битах единицы и, соответственно, не реагирует.
|
|
|
|
|
Jan 18 2012, 20:27
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Jead @ Jan 18 2012, 23:59)  Но вот только я не совсем понимаю, если мы делаем MOV P1, #00000111b(настраиваем порты на ввод), то как нам потом снимать значения, т.е. есть ли там единица или нет? При обращении к порту возможны три типа команд: 1. запись (пример: MOV P1,#0) 2. чтение (MOV А,P1 или JNB P1.0,метка) 3. чтение-модификация-запись (ANL P1,#NOT 00001000b) Команда первого типа (запись) помещает некое значение в ячейку памяти (триггер), состояние которого определяет состояние ключа, соединяющего пин с землёй. Команда второго типа (чтение) помещает значение в соответствии с уровнем сигнала на пине порта в "получатель", заданный в команде. При этом не важно, что выдавалось ранее в порт и зафиксированно состоянием триггера, важен только уровень на пине (как уже объяснял выше: высокий уровень, заданный выданной в порт единицей может "пересилить" низкий уровень "навалившийся" извне). А, вот, для команд третьего типа, как раз, не важен уровень сигнала на пине порта, а принимается в расчет состояние того самого триггера, о котором говорилось выше. Так вот: для настройки на ввод и установки состояния выводов используются команды первого и третьего типа, а для ввода - команды второго типа.
|
|
|
|
|
Jan 18 2012, 20:51
|
Группа: Участник
Сообщений: 12
Регистрация: 30-10-11
Пользователь №: 68 056

|
Спасибо большое за информацию, но я видать совсем дурак =(  В компиляторе мне для проверки программы мне надо подать единицы на первые три пина порта Р.1 (в рамке), но там УЖЕ единицы... =(
|
|
|
|
|
Jan 18 2012, 21:17
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Jead @ Jan 19 2012, 00:51)  но там УЖЕ единицы... =( Если говорить "грубо", то: регистры параллельных портов имеют два значения (или можно представить - два регистра под одним адресом и именем): один - для ввода, другой - для вывода. Их значения одинаковы, если извне микроконтроллера никто не вмешивается в работу порта. Но могут быть и разные, разница может быть только одна: там где у регистра на вывод единица, у регистра на ввод может появиться ноль, если извне кто-то вмешался в работу порта и "пересилил" высокий уровень на пине низким уровнем. Вы пытаетесь изучать работу МК с помощью симулятора... Ваш симулятор мне не знаком. Но, насколько я заметил на рисунке: у портов так же два значения (вероятно, одно - для ввода, другое - для вывода; Вы их обвели красным). Вероятно, одно из них (то, что "для ввода") можно произвольно изменять "руками", имитируя нажатие кнопки...
|
|
|
|
|
Jan 19 2012, 06:23
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Чтобы Вам втолковать работу параллельных портов в классическом МК51, мне в голову пришла такая аналогия: Представьте, что в некоем доме (это - МК) есть входная дверь (это - пин порта). Два человека, один изнутри, а второй - снаружи, пытаются её открыть/закрыть. Состояние двери будет определяться - кто же из двух человек сильнее. Так вот: человек внутри с большой силой может держать дверь закрытой (МК "держать" низкий уровень), а открывать дверь - у него силёнок не хватает пересилить того человека, что снаружи. В МК51 настройка порта "на ввод" - некая абстракция: порт всегда работает на вывод (пытается открыть/закрыть "дверь"), но всегда можно узнать истинное значение уровня сигнала на пине (состояние "двери"). МК с силой "держит" низкий уровень (удерживает "дверь" закрытой), а высокий уровень (открыть "дверь") - силенок не хватает (вернее - маловато: может это сделать, если ему кто-то сильный не препятствует). Если мы желаем знать "намерения" человека снаружи (определить уровень сигнала на выходе какой-либо микросхемы, подключив его к пину порта - "ввести" сигнал), то прикладывать силу к двери не нужно, и тогда дверь перейдёт в состояние соответствующее намерениям человека снаружи. Как было сказано выше: состояние порта МК, когда "сила" не прикладывается - высокий уровень сигнала на пине (единица). Если к пину подключена линия на которой низкий уровень, то при достаточной мощности внешнего сигнала уровень на пине "опустится" и это можно зафиксировать чтением состояния порта. Именно поэтому, "настраивая" порт на ввод выдают в него единицу. Если оставить на пине низкий уровень, который МК удерживает "сильно" (см. выше), то при мощном сигнале высокого уровне извне произайдёт "разрушение" выходных цепей пина (в аналогии выше - оба человека очень сильно тянут дверь каждый в свою сторону: ручки у двери оторвутся  ). Это - ещё один веский аргумент установки порта в единицу при подключении к пину внешнего сигнала. Вот - как-то так. Как ещё Вам рассказать про работу параллельного порта МК уж и не знаю...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|