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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
ГолодныйСтудент
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт дек 06, 2011 21:28:45

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

Сообщение ГолодныйСтудент »

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

Алгоритм действий такой
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. Готовы принимать следующий байт.

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

Чуть позже добавлю схему в протеусе.
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Прерывания-то зачем?
Docendo discimus
Реклама
ГолодныйСтудент
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт дек 06, 2011 21:28:45

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

Сообщение ГолодныйСтудент »

Ну вот например, флаг прерывания TI в дальнейшем я буду использовать для отслеживания передачи байта, но если передача прервалась, то каким-то образом надо "обслужить прерывание", я так понимаю...
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Прерывания возникают при определенных событиях. Эти события четко прописаны в описании каждого микроконтроллера. Дело программиста использовать их или нет. Хотите использовать - настраиваем соответствующим образом нужные регистры и пишем подпрограмму-обработчик прерывания. Управление этой подпрограмме передастся из таблицы векторов прерывания.
Docendo discimus
Реклама
Эиком - электронные компоненты и радиодетали
petrenko
Друг Кота
Сообщения: 5326
Зарегистрирован: Вт фев 21, 2012 13:51:55
Откуда: Начинающий
Контактная информация:

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

Сообщение petrenko »

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

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

Сообщение ГолодныйСтудент »

Порт 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)) секунд. Проблема разрешается только увеличением частоты?
Реклама
petrenko
Друг Кота
Сообщения: 5326
Зарегистрирован: Вт фев 21, 2012 13:51:55
Откуда: Начинающий
Контактная информация:

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

Сообщение petrenko »

ГолодныйСтудент писал(а): 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), но вопрос в том - как Вы узнаёте, что данные пришли ?(наводящий, так сказать вопрос) Далее, Вы хотите сделать строб длительностью менее машинного цикла. Это делается частично аппаратно, поскольку программно этого не достичь, понимаете ? Вы скажите, распечатали все спецификации и диаграммы, посмотрели на всё внимательно ? Или ещё нет ?
< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
ГолодныйСтудент
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт дек 06, 2011 21:28:45

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

Сообщение ГолодныйСтудент »

Распечатал, разбираюсь...Теперь кажется начинаю понимать...(кстати, мы уже договорились что данные будут приходить на порт 1), насколько я понял из литературы, строб линия от параллельного порта подключается к линии INT0 МК. И низкий уровень на этой линии (это и есть строб) дает понять что на порт пришли данные. Т.е. мне не надо организовывать сам строб? Мне надо программно разрешить прерывание по int0,а все дальнейшие действия будут обработкой этого прерывания?
Извините, что такой тугой, я стараюсь, честно.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Строб - внешний сигнал, дает знать принимающему устройству(в вашем случае микроконтроллеру), что данные на шине выставлены. Все верно, этот сигнал очень удобно подключить к входу внешнего прерывания. Вам нужно разрешить эти прерывания и написать обработчик.
Docendo discimus
ГолодныйСтудент
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт дек 06, 2011 21:28:45

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

Сообщение ГолодныйСтудент »

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

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, выполняется копирование в буфер и др. операции?
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Да, верно. Только зачем

Код: Выделить всё

mov IE,#87h
?
Достаточно

Код: Выделить всё

mov IE,#81h
Docendo discimus
ГолодныйСтудент
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт дек 06, 2011 21:28:45

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

Сообщение ГолодныйСтудент »

Спасибо, только вот теперь засомневался, стоит ли ставить ret после MAIN, ведь main вызывался не как подпрограмма, а на него просто длинный совершился. Я верно рассуждаю? Т.е. следовало бы там end ставить....
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

В теле самой MAIN, конечно же, не может быть ret, ибо это возврат по адресу, находящемуся в стеке. Скорее всего, у вас будет LJMP MAIN; хотя все зависит от вашего алгоритма обработки.
Docendo discimus
ГолодныйСтудент
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт дек 06, 2011 21:28:45

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

Сообщение ГолодныйСтудент »

Тогда получается, что если вся остальная часть программы содержится в обработке прерывания, то что следует ставить после тела MAIN? (в мэйне настраивается последовательный порт и выставляются приоритеты, т.е. выполняется он 1 раз). Или же ничего не нужно ставить, но тогда кажется сразу начнет выполняться код, который стоит после метки EXTI0? Как избежать этого? Достаточно ли тело EXTI0 поставить перед main и завершить его ret?
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

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

Код: Выделить всё

loop:
        sjmp loop
Все зависит от вашей фантазии.
Docendo discimus
ГолодныйСтудент
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт дек 06, 2011 21:28:45

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

Сообщение ГолодныйСтудент »

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

Вернуться в «Микроконтроллеры и ПЛИС»