[an error occurred while processing this directive] [an error occurred while processing this directive]
Интересно, а как вы этот 'асм' будете читать, скажем, через месяц ...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено з_а_С 08 февраля 2002 г. 14:03
В ответ на: Фрагмент кода приемна байта(+) отправлено Alowolf 08 февраля 2002 г. 12:05

... Но это так, мысли в слух и не по теме :).

Начнём с "непоняток":
- Какова длинна блока данных?
Если всего три байта, то как их "выплевывает" в порт "писюковая" программа?
- По какому критерию ваша программа в контроллере решает, что пора начинать приём? И сколько времени тратится на принятие этого решения?

А теперь ближе к тексту.
- "Собачка" могла порыться вот здесь:
(asm)
BTFSS FLAG,06H
GOTO bt_fail ;если прошло 300 мсек - выход
;---
bt_fail:
BCF RCSTA,04H ;на случай OERR - сброс/установка CREN
BSF RCSTA,04H
Ни каких "на всякий случай" ! Сброс бита CREN автоматически выключае логику приема. Повторная установка этого бита в '1' вызывает, помимо прочего очистку буфера приёмника. А если в этот момент РС передавал байт информации? Ему то ведь ни кто даже не "намекнул", что этот байт передается "В никуда".
Если пакет принимаемых данных с РС больше двух байт, ни в коем случае не следует выключать приёмник контроллера без особой на то нужды. Причем в вашем случае необходимо сначала проверить бит OERR в регистре RCSTA и, если он установлен, производить манипуляции с битом CREN.
"Околовсяческие" замечания.
А почему бы не воспользоваться возможностью приема из прерывания? Ну, хотя бы для "точной" фиксации первого принятого байта.
Напрмер вот так:
;==========================< Interrupt Service >=============
;- - Serial Service -
_RX_Service:
BTFSS PIR1,RCIF
GOTO _Next_Service
MOVF RCSTA,W
MOVWF Beffer_RS
; Здесь можно уже и "вываливаться" из прерывания, если критично время
; прибывания в ISR. Читать буфер приемника будем в основной программе.
; Или можно продолжить
BTFSC Buffer_RS,FERR ; а может просто ошибка кадра ?
GOTO _Err_RX_ISR_Route
BTFSS Buffer_RS,OERR ; или тормозим, походу? Вона скока уже
; прилетело.
GOTO _End_RX_ISR
_Over_Route:
BCF RCSTA,RCEN ; все равно он и так остановлен
MOVF RCREG,W
MOVWF Temp_RS_00
NOP
MOVF RCREG,W
MOVWF Temp_RS_01
; Здесь то же можно "вывалиться" из прерывания. Не помешает
; установить какой нибудь флаг. Тормозим дескать. Больше двух байт
; прилетело! Включать приемник будем в основной программе.
; Потому как, чаще всего, нужно проанализировать уже принятые байты.
; Случай, что называется, - из ряда вон...
; Тут подумать надо, может придется запрашивать повторную передачу.
_Err_RX_ISR_Route:
MOVF RCREG,W
; и опять "на выход" нам эта Кака в приёмном буфере ни к чему.
; Наплохо бы флажком махнуть, мол ложная тревога.
_End_RX_ISR:
MOVF RCREG,W
MOVWF Temp_RS_00
GOTO _End_ISR_Service

__САмый_Злостный_Анонимус_Сергей

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru