Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: I/o порты AT89C5131, подскажите, pls
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
Мария Е
Здравствуйте!
Подскажите, пожалуйста, как настраивать параллельные порты ввода/вывода в контроллере AT89С5131 на прием данных и на вывод. В даташите ничего не написано кроме того, что каждому порту соответствует один регистр Р0...Р4.
Заранее спасибо.
Golikov A.
Цитата(Мария Е @ Jan 29 2008, 21:02) *
Здравствуйте!
Подскажите, пожалуйста, как настраивать параллельные порты ввода/вывода в контроллере AT89С5131 на прием данных и на вывод. В даташите ничего не написано кроме того, что каждому порту соответствует один регистр Р0...Р4.
Заранее спасибо.


ну на выход это не сложно, записал в порт и все готово.

sfr P4=0x80 //port address see datasheet

P4=0x03; //set
P4^=0x02; //change
P4|=0x02; //set
P4&=(~0x03); //clear

А на вход, ходят слухи что если записать в порт все единички, а потом прочитать, то прочитаешь именно то что внешнее устройство пишет в порт.
Вот как это реализовано честно не знаю, и почему не возникает конфликтов тоже, может я в корне не правsmile.gif...

p4=0x03;
if(P4==0x01) //read example

но вот последние надо уточнить, на самом деле самому интересно...
SALOME
Цитата(Golikov A. @ Jan 30 2008, 01:28) *
А на вход, ходят слухи что если записать в порт все единички, а потом прочитать, то прочитаешь именно то что внешнее устройство пишет в порт.

Порты I/O, как правило, состоят из регистра_защелки, выходного драйвера, и входного буфера. Защелки имеют внутренние подтягивающие к питанию элементы - pull-up и транзисторы. Когда вы используете порт как вход, то нужно записать "1", которая запирает pull down транзистор и теперь внешний источник источник может изменить состояние вывода. Одни команды могут считывать информацию с выхода защелки, а другие с вывода порта. Лучше считывать с защелки. Но по любому предварительная запись "1" в порт при вводе данных не помешает.
Miron
Цитата(SALOME @ Jan 30 2008, 06:32) *
Лучше считывать с защелки. Но по любому предварительная запись "1" в порт при вводе данных не помешает.


Если порт используется как вход то считавать надо с выводов а не с защелки, потому как именно
защелка удерживает порт в состоянии 1 для считывания.
Golikov A.
То есть другими словами у 51 ядра
сильный нолик, и слабая единичка.
То есть если порт выдает нули, и кто-то подаст на него единички, то это конфликт и что-то может сгореть, а если порт выдает единички, то его состояние можно изменить...


беспокоит 2 вещи:
1. не повлияет ли слабая единичка на работу ключей, ведь ключи считай ее через базу-коллетор на землю просаживают (или я что-то не понимаюsmile.gif))....

2. кто на себя берет труд понимать откуда писать , куда читать? В асьме понятно могут быть разные команды, а в Кеиле?

вот команда P4^=0x01; надо же сначала прочитать состояние порта, а потом туда записать измененное, не получится ли так, что прочитается состояние входного буфера?
Мария Е
Цитата(Golikov A. @ Jan 29 2008, 21:28) *
ну на выход это не сложно, записал в порт и все готово.

sfr P4=0x80 //port address see datasheet

P4=0x03; //set
P4^=0x02; //change
P4|=0x02; //set
P4&=(~0x03); //clear

А на вход, ходят слухи что если записать в порт все единички, а потом прочитать, то прочитаешь именно то что внешнее устройство пишет в порт.
Вот как это реализовано честно не знаю, и почему не возникает конфликтов тоже, может я в корне не правsmile.gif...

p4=0x03;
if(P4==0x01) //read example

но вот последние надо уточнить, на самом деле самому интересно...

В принципе, я это знала, просто вызывает большие сомнения насчет использования портов как входов. Сначала записать туда все единички, а потом считывать пришедшие данные... странно как-то. Кстати, программирую на Си в Кейле и не представляю, как там различается считывание из регистра или из защелки. А Ассемблер, к сожалению, не знаю.
Если у кого-то есть опыт работы с портами, поделитесь.
Stanislav
Цитата(Golikov A. @ Jan 30 2008, 13:10) *
То есть другими словами у 51 ядра
сильный нолик, и слабая единичка.
То есть если порт выдает нули, и кто-то подаст на него единички, то это конфликт и что-то может сгореть, а если порт выдает единички, то его состояние можно изменить...
Именно так.
У 51-го двунаправленный ввод-вывод "не настоящий". По сути, это открытый сток с подтяжкой в "1" слабым током. Правда, в конце цикла вывода в порт "единичка" на короткое время становится достаточно "сильной", чтобы быстрее перезаряжать ёмкости монтажа. Но замыкать вывод на "землю" неопасно.

Цитата(Golikov A. @ Jan 30 2008, 13:10) *
...беспокоит 2 вещи:
1. не повлияет ли слабая единичка на работу ключей, ведь ключи считай ее через базу-коллетор на землю просаживают (или я что-то не понимаюsmile.gif))....
Какие ключи и какая база-коллектор? 07.gif Вы о чём вообще?
Базу биполярного транзистора с заземлённым эмиттером можно подключать к выводу порта непосредственно.

Цитата(Golikov A. @ Jan 30 2008, 13:10) *
...2. кто на себя берет труд понимать откуда писать , куда читать? В асьме понятно могут быть разные команды, а в Кеиле?

вот команда P4^=0x01; надо же сначала прочитать состояние порта, а потом туда записать измененное, не получится ли так, что прочитается состояние входного буфера?
Данная операция относится к типу "чтение-модификация-запись". При этом нужно соблюдать осторожность, потому что если из порта читается истинное состояние линий ввода-вывода, они могут "залипнуть".
Если компилятор переводит данную операцию в XRL P4,#1, произойдёт чтение защёлки (а не порта), модификация и запись в защёлку, без залипаний. Я с компилером С для 51-х не работал, и точно сказать не могу, какой именно код он сгенерит, хотя, очень вероятно, что именно такой.

Цитата(Мария Е @ Jan 30 2008, 20:23) *
В принципе, я это знала, просто вызывает большие сомнения насчет использования портов как входов. Сначала записать туда все единички, а потом считывать пришедшие данные... странно как-то.
Да, так. Потому, что порты у 51-го контроллера "недоделанные". smile.gif

ЗЫ. Извиняюсь за некоторую путанность - торопился.
На сайте Атмел есть хорошие мануалы. Почитать будет весьма не лишне.
Golikov A.
Большое спасибо, теперь стало все на свои места...

а мануалы на атмеле обыскаться можно, все не через поиск выпадают...

Цитата(Мария Е @ Jan 30 2008, 20:23) *
В принципе, я это знала, просто вызывает большие сомнения насчет использования портов как входов. Сначала записать туда все единички, а потом считывать пришедшие данные... странно как-то. Кстати, программирую на Си в Кейле и не представляю, как там различается считывание из регистра или из защелки. А Ассемблер, к сожалению, не знаю.
Если у кого-то есть опыт работы с портами, поделитесь.



Ну сейчас меня будут пинать, но ассемблер в чистом виде уже не актуален... Пишите на С, в кейле, в дебаг режиме можно посмотреть какой ассемблерный код он создал для какой С строки, сверяясь с набором команд по мануалу от атмела (этот легко найти на сайтеsmile.gif) можете понимать что делается, и примерно понять как создать ассемблерный код.

Помню такого метода вполне хватало чтобы создавать ассемблерные вставки для ТМС320Ц6713, а у него и алу двойное, и много тонкостей. Так что думаю, что на ассемблерные вставки для этой микрухи такого метода выше крыши...

Дабы не сильно пинали скажу почему так отношусь к Асму, Писать полный коммерческий код на асьме, по трудозатратам невыгодно. Если код легкий, то потери вызванные С кодом несоизмеримы с ресурсами которые есть в современных контроллерах и зачем мучится?, а если код сложный, то пока допишешь продукт уже не нужен будетsmile.gif... Ну это как бы мое мнение...
Мария Е
Цитата
Ну сейчас меня будут пинать, но ассемблер в чистом виде уже не актуален... Пишите на С, в кейле, в дебаг режиме можно посмотреть какой ассемблерный код он создал для какой С строки, сверяясь с набором команд по мануалу от атмела (этот легко найти на сайтеsmile.gif) можете понимать что делается, и примерно понять как создать ассемблерный код.


Я, конечно, попробую, но просто дело в том, что у меня Кейл не доломанный, дебаг запускается только для прог меньше 2 кбайт, а мой уже почти 4кб))

Спасибо огромное, надеюсь с помощью всех полученных советов a14.gif , справлюсь с посылкой и приемом данных)
Egor-ka
Цитата(Stanislav @ Jan 30 2008, 20:52) *
Данная операция относится к типу "чтение-модификация-запись". При этом нужно соблюдать осторожность, потому что если из порта читается истинное состояние линий ввода-вывода, они могут "залипнуть".
Если компилятор переводит данную операцию в XRL P4,#1, произойдёт чтение защёлки (а не порта), модификация и запись в защёлку, без залипаний. Я с компилером С для 51-х не работал, и точно сказать не могу, какой именно код он сгенерит, хотя, очень вероятно, что именно такой.


Проверял как компилятор Кейла переводит P4^=0x01, да, действительно, он переводит эту операцию в XRL P4,#1.
Если подвести итог, то получается чтобы считать данные с выводов нужно выполнить следующую последовательность операций:

P2=0xff; //для записи всех единиц, чтобы настроить порт P2 на прием данных
P2&=0xff; // для чтения, т.к. после этой операции состояние регистра не меняется
A=P2; // теперь А равна пришедшим значениям на ножки P2 ?

Так?
Палыч
Цитата(Egor-ka @ Jan 31 2008, 12:59) *
...чтобы считать данные с выводов нужно выполнить следующую последовательность операций:
P2=0xff; //для записи всех единиц, чтобы настроить порт P2 на прием данных
P2&=0xff; // для чтения, т.к. после этой операции состояние регистра не меняется
A=P2; // теперь А равна пришедшим значениям на ножки P2 ?
Вторая строка - лишняя:
P2= 0xFF; // Настройка Р2 на прием данных (можно проделать однажды в начале программы)
A= P2; // Чтение данных
Golikov A.
Вопрос такой: если в случайной точке программы надо узнать что выставлено на порт, как это можно получить. Именно что выставлено из контроллера на ружу. Я так понимаю, что нужна специальная инструкция, обычная считает как раз состояние порта, что выставили на контроллер.
Что за инструкция, и как объяснить кеилу на С чтобы он вызвал именно ее?
Палыч
Цитата(Golikov A. @ Feb 4 2008, 13:42) *
Вопрос такой: если в случайной точке программы надо узнать что выставлено на порт, как это можно получить. Именно что выставлено из контроллера наружу.
Обычно, это - не требуется. Команды такой - нет. Если, очень хочется: при выдаче в порт сохраняйте выдаваемое значение в ячейке памяти. Проблема - надуманная: даже в случайную точку программы попадают по какому-то пути и известно, что при этом заносят в регистры порта.
Golikov A.
Цитата(Палыч @ Feb 4 2008, 14:13) *
Обычно, это - не требуется. Команды такой - нет. Если, очень хочется: при выдаче в порт сохраняйте выдаваемое значение в ячейке памяти. Проблема - надуманная: даже в случайную точку программы попадают по какому-то пути и известно, что при этом заносят в регистры порта.



Проблема не надуманнаяsmile.gif

даже P4^=0x10; и прочие конструкции [Оператор]= требует знание состояния порта, и под них спец инструкции есть насколько мне известно...

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

Спасибо, понял.
Палыч
Цитата(Golikov A. @ Feb 4 2008, 14:41) *
даже P4^=0x10; и прочие конструкции [Оператор]= требует знание состояния порта, и под них спец инструкции есть насколько мне известно...
Инструкции Read-Modify-Write (в ассемблере ANL, ORL, XRL и др) собственно и читают регистр-защелку (модифицируют и потом записывают), поэтому в любом месте программы можно пользоваться конструкциями типа P4 ^= 0x10; P4 &= 0x10; P4 |= 0x10; и им подобными, "не зная" что ранее было занесено в регистр.
StasK
А если, например пин P1_0 настроен на выход от таймера, то можно ли при этом использовать остальные пины порта P1 как хочется. Если да, то команда P1=0x02 не должна нарушить P1_0?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.