Добрый день, уважаемые форумчане. Делаю учебный проект на эту тему и решил поделиться с вами мыслями по реализации, может где ошибаюсь, буду благодарен за помощь. Спасибо.
Алгоритм действий такой 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. Готовы принимать следующий байт.
Пожалуйста, поправьте меня, если где не прав. Также буду благодарен за информацию , о том как тут организовать прерывания.
Ну вот например, флаг прерывания TI в дальнейшем я буду использовать для отслеживания передачи байта, но если передача прервалась, то каким-то образом надо "обслужить прерывание", я так понимаю...
Прерывания возникают при определенных событиях. Эти события четко прописаны в описании каждого микроконтроллера. Дело программиста использовать их или нет. Хотите использовать - настраиваем соответствующим образом нужные регистры и пишем подпрограмму-обработчик прерывания. Управление этой подпрограмме передастся из таблицы векторов прерывания.
"Передача байта прервалась" ? Это Вы пошутить решили ? Есть сигнал, означающий успешность/неуспешность передачи байта, вообще-то. Для начала (если у Вас, конечно не три дисплея по 1920*1440 , что удобно для чертежей и диаграмм) распечатайте и положите на стол перед собой назначение сигналов RS-232 , Centronics и документацию(datasheet) по intel_MSC-51 и диаграммы. Половина вопросов у Вас сразу пропадёт. Далее : 11`059 кГц действительно удобно. Порт 2 используйте в обоих направлениях, если не подключаете внешнюю память, ибо он по совместительству ещё и adr8-adrF , иначе только на ввод и только с доп. регистром, чтоб не "портился" старший байт адреса. Порт 1 используется как порт - лучше через него байты слать. Порт 3 как раз прямо по совместительству почти готовый RS-232 , но только рекомендуется ИМС развязки. Если всё вышерекомендованое посмотрели - пожалуйста - задавайте ещё вопросы.
_________________ < виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
Порт 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)) секунд. Проблема разрешается только увеличением частоты?
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 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
Распечатал, разбираюсь...Теперь кажется начинаю понимать...(кстати, мы уже договорились что данные будут приходить на порт 1), насколько я понял из литературы, строб линия от параллельного порта подключается к линии INT0 МК. И низкий уровень на этой линии (это и есть строб) дает понять что на порт пришли данные. Т.е. мне не надо организовывать сам строб? Мне надо программно разрешить прерывание по int0,а все дальнейшие действия будут обработкой этого прерывания? Извините, что такой тугой, я стараюсь, честно.
Строб - внешний сигнал, дает знать принимающему устройству(в вашем случае микроконтроллеру), что данные на шине выставлены. Все верно, этот сигнал очень удобно подключить к входу внешнего прерывания. Вам нужно разрешить эти прерывания и написать обработчик.
Спасибо, только вот теперь засомневался, стоит ли ставить ret после MAIN, ведь main вызывался не как подпрограмма, а на него просто длинный совершился. Я верно рассуждаю? Т.е. следовало бы там end ставить....
В теле самой MAIN, конечно же, не может быть ret, ибо это возврат по адресу, находящемуся в стеке. Скорее всего, у вас будет LJMP MAIN; хотя все зависит от вашего алгоритма обработки.
Тогда получается, что если вся остальная часть программы содержится в обработке прерывания, то что следует ставить после тела MAIN? (в мэйне настраивается последовательный порт и выставляются приоритеты, т.е. выполняется он 1 раз). Или же ничего не нужно ставить, но тогда кажется сразу начнет выполняться код, который стоит после метки EXTI0? Как избежать этого? Достаточно ли тело EXTI0 поставить перед main и завершить его ret?
Огромное спасибо! Появился еще один маленький вопрос Команда mov TCON, #00010001 запускает только "нулевой таймер", но не надо ли при этом запустить и первый (который используется при настройке UART под RS-232), также интересует в каком режиме лучше бы запускать нулевой таймер?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения