Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
04.04.2009, 21:22
|
|
Частый гость
Регистрация: 14.04.2007
Сообщений: 23
Сказал спасибо: 3
Сказали Спасибо 1 раз в 1 сообщении
|
Помогите со сбросом USART КР580ВВ51А
Здравствуйте, уважаемые форумчане!
Сейчас в институте по курсу Микропроцессорные системы мы занимаемся программированием учебного комплекса "Электроника МС2702", построенного на базе микропроцессора КР580ИК80А.
Возникла проблема со сбросом микросхемы-контроллера последовательного ввода-вывода КР580ВВ51А, входящей в состав комплекса.
Задание состоит в том, чтобы запрограммировать обмен данными между персональным компьютером и комплексом, подключенным к его COM-порту. Сам обмен организовать получилось, но не получается сделать корректный сброс микросхемы ВВ51. Проблема такая. После ввода программы в память комплекса производится (и то не всегда!) нажатие клавиши аппаратного сброса. При этом производится сброс процессора и контроллера ввода-вывода.
Согласно документации, ВВ51 после сброса ожидает на свой порт управления (в нашем комплексе это порт FBh) последовательно сначала управляющее слово режима работы (УСРР), а затем управляющее слово инструкции (УСИ). В слове режима работы указывается режим передачи (синхрон/асинхрон, параметры посылки и т.п.), а в слове инструкции либо разрешается ввод-вывод, либо производится программный сброс контроллера ВВ51. Сразу после сброса контроллера и загрузки этих двух слов все последующие слова интерпретируются как слово инструкции, что позволяет включать-выключать ввод-вывод или производить сброс при работе программы.
Так вот проблема в том, что если программа была перезапущена с самого начала без аппаратного сброса, то отправленное слово режима работы на этапе инициализации ввода-вывода будет интерпретироваться контроллером как слово инструкции, а не слово режима работы. Поэтому при перезапуске программы без аппаратного сброса комплекса (и только тогда) необходимо сначала слать в контроллер слово сброса, а дальше - выполнять программу как обычно.
Вот тут у меня и возникают сложности. Как можно узнать наиболее правильно, был произведен аппаратный сброс или нет? Читать содержимое регистров процессора на предмет какого-то флажка - мне кажется корявым и не надежным решением. Есть ли другие способы? Может быть, есть способ узнать от самого контроллера ввода-вывода, какое слово он сейчас ожидает и в каком режиме он находится?
В аттаче - asm-код программы с комментариями.
Буду очень признателен, если вы хотя бы подскажете, как решить эту проблему.
Заранее спасибо!
Прикрепленный файл: 6958881.zip
|
|
|
|
06.04.2009, 17:21
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
В 580 серии узнать о аппаратном сбросе нельзя никак. Сам ВВ51 имеет внутренний и внешний сброс. У буржуев написано так:
Цитата:
|
The meaning of the bits in the command register is as follows:
D7: EH 1=hunt mode 0=normal operation
D6: IR 1=internal reset 0=normal operation
D5: RTS set nRTS output value 1: nRTS='0' 0: nRTS='1'
D4: ER 1=reset error flags 0=keep error flags
D3: SBRK 1=send break character 0=normal operation
D2: RXE 1=enable receiver 0=disable receiver
D1: DTR set nDTR output value 1: nDTR='0' 0: nDTR='1'
D0: TXEN 1=enable transmitter 0=disable transmitter
|
Т.е. записав "1" в 6-й разряд регистра команд можно выполнить сброс контроллера и начать его инициализацию
Выполнять инициализацию нужно независимо от аппаратного сброса. Ведь на момент начала работы программы кто-то мог запрограммировать другой режим, и для корректной работы нужно задать свой режим работы. Возможно после команды сброса нужно ввести проверку состояния контроллера и не начинать передачу до момента готовности ВВ51. Другой вариант- обычная задержка на 100-200мкС.
|
|
|
|
06.04.2009, 18:09
|
|
Частый гость
Регистрация: 14.04.2007
Сообщений: 23
Сказал спасибо: 3
Сказали Спасибо 1 раз в 1 сообщении
|
Цитата:
|
Выполнять инициализацию нужно независимо от аппаратного сброса.
|
Совершенно согласен. Но вот тут и возникает проблема, как организовать сброс, независимый от начального состояния комплекса?
Мне тут подсказывают, что надо отправить сначала слово-болванку (которое не навредит, но будет распознано либо как слово инструкции либо как слово режима - без разницы), затем заслать слово сброса, а уже потом инициализировать контроллер.
Остается пораскинуть мозгами и понять, наконец, какое слово выбрать за болванку.
Еще предложения будут?
P.S. Касательно того, что надо заслать единичку для сброса - не все так просто. Контроллер на один и тот же канал принимает два управляющих слова, каждое из которых интерпретируется по-своему. Проблема как раз и состоит в том, как выбрать правильный порядок засылки, чтобы произвести сброс.
|
|
|
|
06.04.2009, 18:29
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,955
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Когда-то очень давно писал софт для платы с несколькими ВВ51. Тонкостей не помню, дело было в 90-х годах, но помню что после долгих плясок с бубном вокруг описанного в документации - остановились на железно работающем варианте - в самом начале писали три раза 0 в нее, а потом уже делали стандартную инициализацию.
Кажется, подобный глюк был именно в ВВ51, в буржуйских все по даташиту.
Теоретически могу и исходник найти... наверное.
|
|
|
|
07.04.2009, 01:07
|
|
Частый гость
Регистрация: 14.04.2007
Сообщений: 23
Сказал спасибо: 3
Сказали Спасибо 1 раз в 1 сообщении
|
Три раза 0, боюсь, не устроит нашего преподавателя.
Сегодня у него интересовались, можно ли в качестве "болванки" использовать 00? Он сказал, что нет, т.к. если перевести этим нулем микросхему в режим синхронной передачи, она начнет требовать еще управляющие слова (для задания символов синхронизации, как по даташиту).
Я пробовал слать в качестве "болванки" слово режима работы:
СРР -› Сброс -› СРР -› Разрешение ввода-вывода.
Слова выглядели вот так:
СРР: 1111 1010 - 2 стоп-бита, контроль по четности, контроль разрешен, длина 7 бит, предделитель 16.
Сброс: 0100 0000
Разрешение ввода-вывода: 0011 0111
Однако, если использовать в качестве "болванки" СРР, то может происходить сброс, т.к. в СРР установлен предпоследний бит (D6). Поэтому комплекс, когда я так сделал, сначала на меня матом ругался, а потом смайликами ухмылялся
В качестве болванки уже хотел использовать 00, но теперь придется придумывать еще что-то, а опробовать программу смогу теперь только в субботу.
Цитата:
|
Кажется, подобный глюк был именно в ВВ51, в буржуйских все по даташиту.
|
Ого! а там еще и глюки есть?! не нравится мне это.
А нет ли у Вас, nml, эмулятора какого-нибудь с поддержкой программирования КР580ВВ51А? Я б с ним поигрался
P.S. сейчас посмотрел ДШ: возможно, прокатит вариант 01h. По крайней мере, контроллер останется в асинхронном режиме. Но я не уверен, что не будет других косяков.
|
|
|
|
07.04.2009, 09:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
Вот нашел в гугле документ, в котором говорится, что для перепрограммирования режима работы ВВ51 нужно писать в регистр управления 2 байта - сброс и инициализацию (стр 25)
Прикрепленный файл: 7587123.pdf
|
|
|
|
07.04.2009, 14:59
|
|
Частый гость
Регистрация: 14.04.2007
Сообщений: 23
Сказал спасибо: 3
Сказали Спасибо 1 раз в 1 сообщении
|
Большое спасибо за книгу, однако (пните меня, если не прав):
Цитата:
|
для перепрограммирования режима работы ВВ51 нужно писать в регистр управления 2 байта - сброс и инициализацию
|
Это - для перепрограммирования. А описанная в документе процедура инициализации (режим работы - инструкции) применима только тогда, когда программа загружается после включения комплекса и аппаратного сброса.
В моем же случае возможен перезапуск программы с начала без аппаратного сброса. Получается, что процедуру сброса-инициализации надо производить не всегда одинаково.
Поэтому буду пробовать на ближайшей лабораторной работе запустить программу, описанную в последнем своем посте.
|
|
|
|
07.04.2009, 20:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
На стр 25 описан случай, когда необходимо перенастраивать контроллер на различные режимы, при этом упор делается исключительно на возможность выполнения программного сброса и правила использования нескольких режимов т.е. как раз Ваш случай. Я подобными устройствами занимался в конце 80-х, поэтому всего не помню, но любой комплекс (у меня он назывался "Электроника К1-10") после аппаратного сброса обязательно настраивает всю свою периферию на режимы по умолчанию, которые описаны в документации. Поэтому я с 99% уверенностью могу сказать, что если Вы включите команды сброса ВВ51 (MVI A,40H OUT 0FBH) в свою программу, то она будет нормально работать.
|
|
|
|
07.04.2009, 21:21
|
|
Частый гость
Регистрация: 14.04.2007
Сообщений: 23
Сказал спасибо: 3
Сказали Спасибо 1 раз в 1 сообщении
|
Я с Вами согласен, но проблема в другом.
1) Программа будет работать нормально до первой остановки и перезапуска. Проблема возникает как раз из-за того, что сброса может и не быть, а программа будет перезапущена.
Ситуация такая:
Загрузили прогу в память -› аппар. сброс-› запуск программы (ВВ51 ожидает режим работы, затем - слово инструкции для ввода-вывода или сброса) -› Загрузка режима работы -› разрешение ввода-вывода -› обмен данными.
Теперь остановим программу и запустим с адреса 2100.
Контроллер уже был проинициализирован ранее, а потому все команды понимает как инструкции. И сразу же он натыкается на Загрузка режима работы -› разрешение ввода-вывода.
Поэтому делать, видимо, надо так:
Загрузили программу в память -› аппаратный сброс-› запуск программы с адреса 2100 -› заглушка (тут и проблема- что применить?) -› команда сброса -› режим работы -› разрешение ввода-вывода -› обмен данными.
Именно эту схему видимо придется применить.
2) Проблема у меня только в том, что проверить программу я не смогу до лабораторной работы, а о правильности своей логики могу только догадываться (какое слово для сброса применить - не уверен, подскажите, пожалуйста). В прошлый раз сброс осуществить не удалось (программу я прикладывал).
P.S. Задачка-то простая, но возможность отлаживать код есть только на лабе, где его уже требуют сдать. До субботы я ничего проверить не имею возможности.[/quote]
|
|
|
|
08.04.2009, 11:43
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,955
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Сообщение от nml
|
Теоретически могу и исходник найти... наверное.
|
Вот нашел. Это процеДурка инициализировала ВВ51, выдрана из рабочего проекта (работало на минской ТЭЦ-4)
Код:
|
Procedure Init(Adr:Word);
Begin
Port[Adr]:=0; Zdr;
Port[Adr]:=0; Zdr;
Port[Adr]:=0; Zdr;
Port[Adr]:=0; Zdr;
Port[Adr]:=$40; Zdr;
Port[Adr]:=$FF; Zdr;
Port[Adr]:=$37; Zdr;
End; |
То есть 4 нуля писались перед началом инициализации. Без этого - раз на раз не приходилось.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:12.
|
|