AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
13.06.2015, 19:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2008
Адрес: Москва Щукино
Сообщений: 1,478
Сказал спасибо: 359
Сказали Спасибо 860 раз(а) в 361 сообщении(ях)
|
Кто-нибудь помнит MCS-51?
Вопрос может показаться дурацким, но за все время работы мне ни разу не было нужно что-то передавать с процессора через последовательный порт и эта тема ускользнула от меня.
А сейчас понадобилось... и не работает.
Литературу я уже поднял. Там намеков на эту ситуацию нет, там вообще все элементарно:
MOV SBUF, #число
JNB TI, $
CLR TI
RET
Ну, я в общем-то и без литературы делал то же самое. Но, как только управление передается этой подпрограмме - все зависает насмерть. К сожалению у меня нет отладчика (все, что я делал раньше, прекрасно отлаживалось и без него). Я не могу посмотреть, на чем эта бяка висит. Подозреваю, что на "JNB TI, $", но не факт.
Вэлл, устроил разборку с удалением подозрительных строк. И вот, что получилось. В начале программы есть блочок, настраивающий порт на нужный режим и скорость:
------------------------------
MOV SCON, #01010000B ; режим 2 (8 бит передается)
MOV TMOD, #00100001B ; установка таймера 1 (8 бит)
MOV TH1, #0FDH ; настройка скорости 9600 бод
MOV TCON,#01000000B ; таймер 1 включить
MOV IE, #10010000B ; разрешить прерывания от последовательного порта (EA, ES = 1)
------------------------------
Так вот, если удалить последнюю строку, передача начинает нормально работать и компьютер читает посланный байт. Но мне, блин, нужна эта строка. У меня не только передача идет, но и прием, причем именно по прерыванию на фоне работающей программы.
Ладно. Когда будет прием, я не знаю, а вот момент передачи мне известен, я могу на это мгновение застопорить программу и запретить прерывания. Сказано - сделано. Пишу:
MOV IE, #0 ;запрещаю прерывания перед передачей
MOV SBUF, #число
JNB TI, $
CLR TI
MOV IE, #10010000B ;и разрешаю после
RET
Не работает. Висит, зараза.
Проверяю, что находится в IE после старта по-умолчанию. Оказывается не ноль, а 01000000B.
Заменяю первую строку на MOV IE, #64 - оп-па, заработало.
Но ведь в справочнике написано: биты 5, 6 - зарезервированы, значит не имеют значения? Оказывается имеют.
В общем-то задачка решена. Но уж очень по-обезъяньи: работает, но не понимаю, почему. Так вот вопрос: чем разрешение прерывания по последовательному порту может помешать передаче? И какого ... зарезервированные биты влияют на работу?
Конкретный процессор был AT89C52. Порт заведен на MAX232 (точнее, какой-то более дешевый аналог) и через подключен к Com порту компьютера. По осциллографу то, что идет с процессора через MAX232 ни на микрон не отличается от идущего с Com порта компьютера. Чтение однозначное (вот уже пол-дня на прогоне - ни одного сбоя).
Последний раз редактировалось spamkerdyk; 13.06.2015 в 19:42.
|
|
|
|
13.06.2015, 20:15
|
|
Гражданин KAZUS.RU
Регистрация: 13.06.2005
Адрес: РК г.Павлодар
Сообщений: 866
Сказал спасибо: 99
Сказали Спасибо 216 раз(а) в 140 сообщении(ях)
|
Re: Кто-нибудь помнит MCS-51?
Вот нарыл древний проект может будет полезным.
__________________
Не ошибается лишь тот, кто ни чего не делает!
|
|
|
|
13.06.2015, 20:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Кто-нибудь помнит MCS-51?
С такими регистрами лучше работать командами CLRB и SETB
а не MOV IE, #0 ;запрещаю прерывания перед передачей
|
|
|
|
13.06.2015, 21:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2008
Адрес: Москва Щукино
Сообщений: 1,478
Сказал спасибо: 359
Сказали Спасибо 860 раз(а) в 361 сообщении(ях)
|
Re: Кто-нибудь помнит MCS-51?
В древнем проекте не такой, как у меня режим порта. Вроде тоже mode 1, но зачем-то загружаются оба байта таймера. Похоже на скорость 62.2 кбод. А во время передачи бит Ti не отслеживается, а просто отрабатывается задержка в 100 мкс. Так конечно тоже можно, но как-то "не кошерно".
Сообщение от Boba_spb
|
С такими регистрами лучше работать командами CLRB и SETB
а не MOV IE, #0 ;запрещаю прерывания перед передачей
|
Почему в данном случае MOV? Потому что после MOV я однозначно знаю, что во всех битах регистра, к тому же регистр у меня настраивается один раз и на все время работы программы.
И, я правильно понял, что вы тоже на время передачи запрещаете прерывания?
Последний раз редактировалось spamkerdyk; 13.06.2015 в 21:57.
|
|
|
|
13.06.2015, 22:48
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,725
Сказал спасибо: 2,424
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: Кто-нибудь помнит MCS-51?
Не запрещал никакие прерывания. Все работало нормально. Помнится,что приоритет прерывания ставил высокий.Не помню уже подробностей-работает же. Процессор ADuC.
|
|
|
|
13.06.2015, 22:53
|
|
Заблокирован
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
|
Re: Кто-нибудь помнит MCS-51?
А как Вы принимает байт от компа? Есть обработчик прерывания? Вот, прерывание разрешили, байт пришёл от компа, флаг RI поднялся, и тут же случилось прерывание по приему. Если нет обработчика и никто этот флаг не сбрасывает, то проц зависнет в бесконечных прерывания по RI.
|
|
|
|
13.06.2015, 23:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Кто-нибудь помнит MCS-51?
Сообщение от baiderin
|
Помнится,что приоритет прерывания ставил высокий.
|
SETB PS
|
|
|
|
13.06.2015, 23:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2008
Адрес: Москва Щукино
Сообщений: 1,478
Сказал спасибо: 359
Сказали Спасибо 860 раз(а) в 361 сообщении(ях)
|
Re: Кто-нибудь помнит MCS-51?
Сообщение от Yurkin2014
|
А как Вы принимает байт от компа?
|
Сейчас работающие подпрограммы выглядят так:
ORG 0000H
RST: JMP RSET ;Прерывание по RESET
.........
ORG 0023H
COM: JMP PCcntr ;прерывание от последовательного порта
----------------------------
RSET: Программа...
---------------------------
TRANS: MOV IE, #01000000B ;запрещаем прерывания вобоще
MOV SBUF, A
JNB TI, $
CLR TI
MOV IE, #10010000B ;теперь снова разрешаем прерывания
RET
PCcntr: CLR IE.4 ; Запрещаем прерывания от порта на время обработки принятой команды
MOV R5, SBUF
CLR RI ; Сбрасываем флаг приема
SETB IE.4 ; разрешаем прерывания
RETI
Первая подпрограмма "TRANS" - это передача байта, предварительно помещенного в аккумулятор. Вторая "PCcntr" - обработчик прерывания при приеме байта. Принятый байт попадает в R5, дальше используется как команда для перехода по ветвям программы.
Так вот, если в TRANS выбросить первую и предпоследнюю строки - а по всей теории их быть не должно, при попытке первой же передачи подпрограмма зависает.
-----
Не обращайте внимание на запрет прерываний при приеме. Есть он или нет - эта подпрограмма все равно работает правильно. Запрет связан с тем, что в реальной большой программе на этом месте идет прием восьми байтов (уже не по прерываниям, а по отслеживанию флага RI). Сейчас у меня работает тестовый вариант, я не стал удалять эти строки просто, чтобы потом не забыть про них.
Сейчас все в тестовом режиме работает. Комп посылает процессору случайный байт, процессор принимает и выкладывает его на порт 0 и тут же отсылает обратно. Компьютерная программа выдает этот байт для наглядности на индикаторы. Вот так уже целый день барабанит. Если бы был сбой, то программа бы заверещала. Но она молчит.
Последний раз редактировалось spamkerdyk; 13.06.2015 в 23:38.
|
|
|
|
13.06.2015, 23:34
|
|
Заблокирован
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
|
Re: Кто-нибудь помнит MCS-51?
Сообщение от spamkerdyk
|
"PCcntr" - обработчик прерывания при приеме байта
|
Прерывание наступает как от приёма, так и от передачи. Один обработчик на два случая. При передаче байта поднимается флаг TI и тут же программа прыгает на PCcntr, где благополучно зависает, т.к. флаг TI не сброшен, то получается бесконечный PCcntr заход-выход и снова заход-выход и т.д. В основной программе дело не успевает дойти до "CLR TI".
Надо в обработчике сначала проверять, что вызвало прерывание: TI или RI. Если TI, то просто сбрасываем TI и выходим. Если RI, то сбрасываем RI, читаем принятый байт из регистра и выходим.
Последний раз редактировалось Yurkin2014; 13.06.2015 в 23:40.
|
|
|
Сказали "Спасибо" Yurkin2014
|
|
|
13.06.2015, 23:58
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,580
Сказал спасибо: 181
Сказали Спасибо 3,161 раз(а) в 2,047 сообщении(ях)
|
Re: Кто-нибудь помнит MCS-51?
советую с отключенными прерываниями понаблюдать флаги всякие. например выводя байт флагов на временно освобожденный порт
или в догонку через тот же ком порт их высылать и на компе рассматривать
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:27.
|
|