Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 13.06.2015, 19:31  
spamkerdyk
Почётный гражданин KAZUS.RU
 
Аватар для spamkerdyk
 
Регистрация: 27.01.2008
Адрес: Москва Щукино
Сообщений: 1,478
Сказал спасибо: 359
Сказали Спасибо 860 раз(а) в 361 сообщении(ях)
spamkerdyk на пути к лучшему
По умолчанию Кто-нибудь помнит 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.
spamkerdyk вне форума  
Непрочитано 13.06.2015, 20:15  
woroba
Гражданин KAZUS.RU
 
Регистрация: 13.06.2005
Адрес: РК г.Павлодар
Сообщений: 866
Сказал спасибо: 99
Сказали Спасибо 216 раз(а) в 140 сообщении(ях)
woroba на пути к лучшему
По умолчанию Re: Кто-нибудь помнит MCS-51?

Вот нарыл древний проект может будет полезным.
Вложения:
Тип файла: rar V1.2.rar (3.6 Кб, 12 просмотров)
__________________
Не ошибается лишь тот, кто ни чего не делает!
woroba вне форума  
Непрочитано 13.06.2015, 20:15  
Boba_spb
Почётный гражданин KAZUS.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: Кто-нибудь помнит MCS-51?

С такими регистрами лучше работать командами CLRB и SETB
а не MOV IE, #0 ;запрещаю прерывания перед передачей
Boba_spb вне форума  
Непрочитано 13.06.2015, 21:55  
spamkerdyk
Почётный гражданин KAZUS.RU
 
Аватар для spamkerdyk
 
Регистрация: 27.01.2008
Адрес: Москва Щукино
Сообщений: 1,478
Сказал спасибо: 359
Сказали Спасибо 860 раз(а) в 361 сообщении(ях)
spamkerdyk на пути к лучшему
По умолчанию Re: Кто-нибудь помнит MCS-51?

В древнем проекте не такой, как у меня режим порта. Вроде тоже mode 1, но зачем-то загружаются оба байта таймера. Похоже на скорость 62.2 кбод. А во время передачи бит Ti не отслеживается, а просто отрабатывается задержка в 100 мкс. Так конечно тоже можно, но как-то "не кошерно".

Сообщение от Boba_spb Посмотреть сообщение
С такими регистрами лучше работать командами CLRB и SETB
а не MOV IE, #0 ;запрещаю прерывания перед передачей
Почему в данном случае MOV? Потому что после MOV я однозначно знаю, что во всех битах регистра, к тому же регистр у меня настраивается один раз и на все время работы программы.
И, я правильно понял, что вы тоже на время передачи запрещаете прерывания?

Последний раз редактировалось spamkerdyk; 13.06.2015 в 21:57.
spamkerdyk вне форума  
Непрочитано 13.06.2015, 22:48  
baiderin
Почётный гражданин KAZUS.RU
 
Аватар для baiderin
 
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,725
Сказал спасибо: 2,424
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
baiderin на пути к лучшему
По умолчанию Re: Кто-нибудь помнит MCS-51?

Не запрещал никакие прерывания. Все работало нормально. Помнится,что приоритет прерывания ставил высокий.Не помню уже подробностей-работает же. Процессор ADuC.
baiderin вне форума  
Непрочитано 13.06.2015, 22:53  
Yurkin2014
Заблокирован
 
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
Yurkin2014 на пути к лучшему
По умолчанию Re: Кто-нибудь помнит MCS-51?

А как Вы принимает байт от компа? Есть обработчик прерывания? Вот, прерывание разрешили, байт пришёл от компа, флаг RI поднялся, и тут же случилось прерывание по приему. Если нет обработчика и никто этот флаг не сбрасывает, то проц зависнет в бесконечных прерывания по RI.
Yurkin2014 вне форума  
Непрочитано 13.06.2015, 23:02  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Кто-нибудь помнит MCS-51?

Сообщение от baiderin Посмотреть сообщение
Помнится,что приоритет прерывания ставил высокий.
SETB PS
omercury вне форума  
Непрочитано 13.06.2015, 23:18  
spamkerdyk
Почётный гражданин KAZUS.RU
 
Аватар для spamkerdyk
 
Регистрация: 27.01.2008
Адрес: Москва Щукино
Сообщений: 1,478
Сказал спасибо: 359
Сказали Спасибо 860 раз(а) в 361 сообщении(ях)
spamkerdyk на пути к лучшему
По умолчанию 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 и тут же отсылает обратно. Компьютерная программа выдает этот байт для наглядности на индикаторы. Вот так уже целый день барабанит. Если бы был сбой, то программа бы заверещала. Но она молчит.
Вложения:
Тип файла: rar P6010003.rar (1.35 Мб, 15 просмотров)

Последний раз редактировалось spamkerdyk; 13.06.2015 в 23:38.
spamkerdyk вне форума  
Непрочитано 13.06.2015, 23:34  
Yurkin2014
Заблокирован
 
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
Yurkin2014 на пути к лучшему
По умолчанию Re: Кто-нибудь помнит MCS-51?

Сообщение от spamkerdyk Посмотреть сообщение
"PCcntr" - обработчик прерывания при приеме байта
Прерывание наступает как от приёма, так и от передачи. Один обработчик на два случая. При передаче байта поднимается флаг TI и тут же программа прыгает на PCcntr, где благополучно зависает, т.к. флаг TI не сброшен, то получается бесконечный PCcntr заход-выход и снова заход-выход и т.д. В основной программе дело не успевает дойти до "CLR TI".
Надо в обработчике сначала проверять, что вызвало прерывание: TI или RI. Если TI, то просто сбрасываем TI и выходим. Если RI, то сбрасываем RI, читаем принятый байт из регистра и выходим.

Последний раз редактировалось Yurkin2014; 13.06.2015 в 23:40.
Yurkin2014 вне форума  
Сказали "Спасибо" Yurkin2014
spamkerdyk (14.06.2015)
Непрочитано 13.06.2015, 23:58  
индюк
Гуру портала
 
Аватар для индюк
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,580
Сказал спасибо: 181
Сказали Спасибо 3,161 раз(а) в 2,047 сообщении(ях)
индюк на пути к лучшему
По умолчанию Re: Кто-нибудь помнит MCS-51?

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

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кто нибудь имеет описание, как обращаться к KEELOQовскому регистру в PIC12F635/PIC16F636? Make_Pic Микроконтроллеры, АЦП, память и т.д 1 07.05.2010 12:53
Кто - нибудь углубленно знаком с AVR309? graham Микроконтроллеры, АЦП, память и т.д 0 15.02.2006 19:24
Кто нибудь делал вольтметр на ПИК - откликнитесь AnB Измерительное оборудование 23 20.12.2005 22:49
Люди! Кто нибудь видел в России MAX 3353, и где? walrus Информация по радиокомпонентам 1 13.09.2004 22:00


Часовой пояс GMT +4, время: 13:27.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot