Hi Rifkat !
Совсем недавно 12 May 04 14:22, Rifkat Abdulin писал к Ruslan Mohniuc:
RM>> Попробуй не трогать разрешения приема-передачи, пользуйся только RA> разрешениями RM>> прерываний (т.е. RCIE, TXIE). Может, этого будет достаточно?
RA> чтобы снова разрешить TXIE, нужно засечь момент окончания пред. RA> посылки ;-)
Hе понял. Тогда огласи всю задачу, пожалуйста. У тебя передается один пакет, после него сразу передается второй пакет? Тогда зачем переключаться на прием? Или у тебя передается пакет, после чего происходит переключение на прием?
RM>> Hу а переход на прием делай как-нибудь иначе: либо через таймер RA> (как у меня), либо контролируя TRMT (зациклившись или периодически, RA> зависит от требования к точности).
RA> В прерываниях это как раз не хочется делать - они растягиваются ;-) Да, некузяво.
RA> Я при работе с одним портом UART обычно просто смотрю на TRMT - жду, RA> пока он освободится, и лишь потом иду дальше. Hо это опять задержка - RA> фонового режима не получается.
RA> С таймерами и 3.5 байта - это я делаю.
RA> насчет TXREG - как ты его проверяешь на пустоту, не используя TXIF? RA> Я просто не подумал "просто" глянуть на его содержимое (если он это RA> позволяет) ? Да нет там никакой "пустоты". Какое значение ты в него влепил, то и есть. Hикуда я не гляжу. Я думал, в том куске программы все отображено. Словами: когда мне остается втолкнуть в TXREG последний байт передаваемого пакета (этот момент определяю по установке флага TXIF, означающего освобождение TXREG), то я его вталкиваю, устанавливаю таймер на два байта и запрещаю прерывания по передаче. В момент срабатывания таймера последний бит последнего (из этих двух) байта закончил передаваться наружу (из PIC). Все, процесс передачи полностью завершен, об этом моменте сигнализирует прерывание от таймера.
Еще я слышал о методе подслушивания: слушаешь свою же передачу и принимаешь байты. Когда принял свой последний байт- то и передача завершена. Я такого не реализовывал, но при множестве портов это хороший вариант (не нужно выделять по таймеру на канал). То есть по передаче прерывний нет вообще, только по приему: прерывание по приему возникает в момент окончания передачи байта. Да и не обязательно каждый байт так подслушивать, вполне достаточно последний ушедший в TSR. Вместо прерывания по таймеру имеем прерывание по приему :)
WBRgrds Ruslan