Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Тема закрыта

Кодопреобразователь Centronics -> RS-232 на МК 8051

Чт июн 21, 2012 16:20:07

Добрый день, уважаемые форумчане. Делаю учебный проект на эту тему и решил поделиться с вами мыслями по реализации, может где ошибаюсь, буду благодарен за помощь. Спасибо.

Алгоритм действий такой
1. Настраиваю UART согласно спецификации RS-232

mov TMOD, #20H ;таймер в режим 2
mov TH1, #0fd ;скорость передачи по последовательному порту 9600 бод
mov SCON, #50H ;формат кадра: 8 бит данных, стартовый бит, стоповый бит, программируемый 9ый бит
anl PCON, #07fh ; SMOD=0 (отказываемся от удвоенной скорости передачи)

Кстати, при симуляции в протеусе, какую устанавливать частоту резонатора? 11,059 МГЦ?

2. На параллельные линии 8051 приходят данные. (Насколько я понимаю, на порт P2)
3. Пускай порт P1 отвечает за линии строб, busy, ack. Данные пришли, устанавливаем busy в 1. Тут в голове возникает путаница. Как теперь поступить? mov SBUF,P2 ? А как быть со строб импульсом? mov SBUF,P2 и после этого сразу команда clr P1.x (линия которая отвечает за строб) ? Тогда потом надо снова устанавливать P1.x (до окончания передачи данных).
4. После передачи байта устанавливается 0 на линию, отвечающую за ack (подтверждение приема байта).
5. Снимаем busy. Готовы принимать следующий байт.

Пожалуйста, поправьте меня, если где не прав. Также буду благодарен за информацию , о том как тут организовать прерывания.

Чуть позже добавлю схему в протеусе.

Re: Кодопреобразователь Centronics -> RS-232 на МК 8051

Чт июн 21, 2012 17:31:51

Прерывания-то зачем?

Re: Кодопреобразователь Centronics -> RS-232 на МК 8051

Чт июн 21, 2012 17:52:39

Ну вот например, флаг прерывания TI в дальнейшем я буду использовать для отслеживания передачи байта, но если передача прервалась, то каким-то образом надо "обслужить прерывание", я так понимаю...

Re: Кодопреобразователь Centronics -> RS-232 на МК 8051

Чт июн 21, 2012 19:19:24

Прерывания возникают при определенных событиях. Эти события четко прописаны в описании каждого микроконтроллера. Дело программиста использовать их или нет. Хотите использовать - настраиваем соответствующим образом нужные регистры и пишем подпрограмму-обработчик прерывания. Управление этой подпрограмме передастся из таблицы векторов прерывания.

Re: Кодопреобразователь Centronics -> RS-232 на МК 8051

Чт июн 21, 2012 19:35:33

"Передача байта прервалась" ? Это Вы пошутить решили ? Есть сигнал, означающий успешность/неуспешность передачи байта, вообще-то. Для начала (если у Вас, конечно не три дисплея по 1920*1440 , что удобно для чертежей и диаграмм) распечатайте и положите на стол перед собой назначение сигналов RS-232 , Centronics и документацию(datasheet) по intel_MSC-51 и диаграммы. Половина вопросов у Вас сразу пропадёт.
Далее : 11`059 кГц действительно удобно. Порт 2 используйте в обоих направлениях, если не подключаете внешнюю память, ибо он по совместительству ещё и adr8-adrF , иначе только на ввод и только с доп. регистром, чтоб не "портился" старший байт адреса. Порт 1 используется как порт - лучше через него байты слать. Порт 3 как раз прямо по совместительству почти готовый RS-232 , но только рекомендуется ИМС развязки. Если всё вышерекомендованое посмотрели - пожалуйста - задавайте ещё вопросы.

Re: Кодопреобразователь Centronics -> RS-232 на МК 8051

Чт июн 21, 2012 23:10:48

Порт 2 используется в 2х направлениях, т.к. на него подключены линии busy,ack (in) и strobe (out). Через TxD (3 порт) передаются данные по последовательному интерфейсу. Скажите пожалуйста,общая идея верна? И возвращаясь к strobe: при копировании данных в буффер на mov идет 2 машинных цикла (каждый примерно по 1 мкс (12 тактов, 1 такт - 1/11МГц), а после выполнения этой команды сразу начинается передача бит по последовательному интерфейсу со скоростью 9600 бит/с? Т.е. мне остается сформировать строб определенной длительности (по спецификации 500 нс). Но 1 машинный цикл при тактовой частоте резонатора 11 МГц составляет 1/(11*10^(-6)) секунд. Проблема разрешается только увеличением частоты?

Re: Кодопреобразователь Centronics -> RS-232 на МК 8051

Пт июн 22, 2012 00:27:17

ГолодныйСтудент писал(а):2. На параллельные линии 8051 приходят данные. (Насколько я понимаю, на порт P2)
3. Пускай порт P1 отвечает за линии строб, busy, ack. Данные пришли, устанавливаем busy в 1. Тут в голове возникает путаница. Как теперь поступить? mov SBUF,P2 ? А как быть со строб импульсом? mov SBUF,P2 и после этого сразу команда clr P1.x (линия которая отвечает за строб) ? Тогда потом надо снова устанавливать P1.x (до окончания передачи данных).
4. После передачи байта устанавливается 0 на линию, отвечающую за ack (подтверждение приема байта).
5. Снимаем busy. Готовы принимать следующий байт.

Так, ладно, пусть на порт2 приходит параллельный байт, но только через регистр-защёлку, а то потеряются и/или будут мешать верхнему байту адреса (который в другом регистре-защёлке должен фиксироваться по ALE), но вопрос в том - как Вы узнаёте, что данные пришли ?(наводящий, так сказать вопрос) Далее, Вы хотите сделать строб длительностью менее машинного цикла. Это делается частично аппаратно, поскольку программно этого не достичь, понимаете ? Вы скажите, распечатали все спецификации и диаграммы, посмотрели на всё внимательно ? Или ещё нет ?

Re: Кодопреобразователь Centronics -> RS-232 на МК 8051

Пт июн 22, 2012 13:06:28

Распечатал, разбираюсь...Теперь кажется начинаю понимать...(кстати, мы уже договорились что данные будут приходить на порт 1), насколько я понял из литературы, строб линия от параллельного порта подключается к линии INT0 МК. И низкий уровень на этой линии (это и есть строб) дает понять что на порт пришли данные. Т.е. мне не надо организовывать сам строб? Мне надо программно разрешить прерывание по int0,а все дальнейшие действия будут обработкой этого прерывания?
Извините, что такой тугой, я стараюсь, честно.

Re: Кодопреобразователь Centronics -> RS-232 на МК 8051

Пт июн 22, 2012 14:54:00

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

Re: Кодопреобразователь Centronics -> RS-232 на МК 8051

Пт июн 22, 2012 16:00:22

Тогда общая структура программы будет выглядеть след. образом?

org 0000h
LJMP MAIN

org 0003h
call EXTI0 ; я правильно понимаю, что если будет прерывание по int0,то осуществится переход по EXTI0?
reti


org 30h
MAIN:
mov TMOD, #20H ;таймер в режим 2
mov TH1, #0fd ;скорость передачи по последовательному порту 9600 бод
mov SCON, #50H ;формат кадра: 8 бит данных, стартовый бит, стоповый бит, программируемый 9ый бит
anl PCON, #07fh ; SMOD=0 (отказываемся от удвоенной скорости передачи)

mov IP,#00000001b; с этого места выставляются приоритеты прерываний и разрешается прерывание int0
mov TCON,#00010001b
mov IE,#87h
ret


EXTI0:
;и тут идет обработка прерывания? т.е. выставляется busy, выполняется копирование в буфер и др. операции?

Re: Кодопреобразователь Centronics -> RS-232 на МК 8051

Пт июн 22, 2012 16:57:36

Да, верно. Только зачем
Код:
mov IE,#87h
?
Достаточно
Код:
mov IE,#81h

Re: Кодопреобразователь Centronics -> RS-232 на МК 8051

Пт июн 22, 2012 20:02:29

Спасибо, только вот теперь засомневался, стоит ли ставить ret после MAIN, ведь main вызывался не как подпрограмма, а на него просто длинный совершился. Я верно рассуждаю? Т.е. следовало бы там end ставить....

Re: Кодопреобразователь Centronics -> RS-232 на МК 8051

Пт июн 22, 2012 20:31:06

В теле самой MAIN, конечно же, не может быть ret, ибо это возврат по адресу, находящемуся в стеке. Скорее всего, у вас будет LJMP MAIN; хотя все зависит от вашего алгоритма обработки.

Re: Кодопреобразователь Centronics -> RS-232 на МК 8051

Пт июн 22, 2012 21:12:45

Тогда получается, что если вся остальная часть программы содержится в обработке прерывания, то что следует ставить после тела MAIN? (в мэйне настраивается последовательный порт и выставляются приоритеты, т.е. выполняется он 1 раз). Или же ничего не нужно ставить, но тогда кажется сразу начнет выполняться код, который стоит после метки EXTI0? Как избежать этого? Достаточно ли тело EXTI0 поставить перед main и завершить его ret?

Re: Кодопреобразователь Centronics -> RS-232 на МК 8051

Пт июн 22, 2012 21:38:38

Можно сделать даже так, что в MAIN после настройки мк будет только
Код:
loop:
        sjmp loop

Все зависит от вашей фантазии.

Re: Кодопреобразователь Centronics -> RS-232 на МК 8051

Сб июн 23, 2012 23:35:23

Огромное спасибо! Появился еще один маленький вопрос
Команда mov TCON, #00010001 запускает только "нулевой таймер", но не надо ли при этом запустить и первый (который используется при настройке UART под RS-232), также интересует в каком режиме лучше бы запускать нулевой таймер?
Тема закрыта