Вот промежуточный МК.
код под спойлером
====================================
include P12F629.inc ; подключаем файлик компилятора на выбранный контроллер
__CONFIG 3194h ; конфигурируем MK - встроенный RC, MCLR выкл, собака выкл.
errorlevel -207,-302,-305 ; обьявляем компилятору не выводить указанных ошибок
;===============================================================================================
;------------- Назначаем ячейки ОЗУ ( Обзываем регистры общего назначения )---------------------
;===============================================================================================
cblock 0x20
Reg_1 ; дежурные регистры
Reg_2 ; -//-
Reg_3 ; -//-
; W_ ; под хранение данных регистра W при обработке преываний
; STATUS_ ; под хранение данных регистра STATUS при обработке преpываний
Tbyte ; буфер передатчика
Rbyte ; буфер приемника
Flags ; флаги (0/1) (0 - состояние Tbyte (пуст/не пуст),
; 1 - состояние Rbyte (пуст/не пуст),
; 2 - переполнение приемника (нет/есть),
; 3 - ошибка приема (нет/есть))
Tx_Count ; счетчик переданных бит
Rx_Count ; счетчик принятых бит
SCount ; счетчик циклов задержки
CMD_mp3 ; под хранение команды отправляемой в TF_плеер програмным UART
BD_H ; под хранение старшего байта данных команд в TF_плеер
BD_L ; под хранение младшего байта данных команд в TF_плеер
FB_mp3 ; байт обратной связи для передачи в TF_плееp
countX
B_Data ; под хранение байтов принятого пакета
endc
cblock .0
endc
;===============================================================================================
;------------- Определяем константы ------------------------------------------------------------
;===============================================================================================
Baudrate equ .24 ; подсчитаное число циклов задержки для данной скорости USART
;===============================================================================================
;------------- Обзываем лапы МК ----------------------------------------------------------------
;===============================================================================================
#define U_rx_pin GPIO,2 ; приемный вход UART от МК управления
#define U_tx_pin GPIO,5 ; передающий выход UART на FTPlayer
;===============================================================================================
;------------- Пишем микропрограмки ( МАКРОСЫ) -------------------------------------------------
;===============================================================================================
Bank_0 macro ; переход в банк 0
bcf STATUS,RP0
bcf STATUS,RP1
endm
Bank_1 macro ; переход в банк 1
bsf STATUS,RP0
bcf STATUS,RP1
endm
;===============================================================================================
org 0x0 ; задаем стартовый адрес основной программы
goto InitPIC
;===============================================================================================
org 0x04 ; задаем стартовый адрес обработчика прерываний
;===============================================================================================
;----------- ОБРАБОТЧИК ПРЕРЫВАНИЙ -------------------------------------------------------------
;===============================================================================================
; movwf W_ ; сохраняем текущий контекст ключевых регистров, чтобы после
; swapf STATUS,W ; выполнения обработчика прерываний вернуться к прерваному месту
; movwf STATUS_ ; в основной программе
;===============================================================================================
call Recieve
bcf INTCON,0 ; сбросить флаг прерывания от RB4...RB7
;===============================================================================================
; swapf STATUS_,W ;
; movwf STATUS ;
; swapf W_,F ;
; swapf W_,W ;
retfie ; выходим из обработчика прерываний
;===============================================================================================
;------------- ИНИЦИАЛИЗАЦИЯ КОНТРОЛЛЕРА -------------------------------------------------------
;===============================================================================================
InitPIC
clrf GPIO ; чистим PORT
bsf U_tx_pin ; передающую линию UARTa в дежурное состояние
movlw 0x07 ; компаратор нах
movwf CMCON
Bank_1
movlw b'00000100' ; затачиваем PORT под себя
movwf TRISIO
movlw b'00000100' ; подключаем подтягивающие резюки
movwf WPU
bcf OPTION_REG,7;
movlw b'00000100' ; разрешаем прерывания по изменению состояния на лапе RB2
movwf IOCB
Bank_0
;--- Настройка прерываний
clrf Flags ; чистим регистр флагов
bsf INTCON,3 ; разрешаем прерывания от RB4..RB7
;--- Квитируем МК на прием n+1 байт в пакете. В данном проекте в пакете 11 байт.
movlw .12
movwf countX
call Recieve
decfsz countX,F
b $-2
;===============================================================================================
;--------- О С Н О В Н А Я П Р О Г Р А М М А -------------------------------------------------
;===============================================================================================
RX_frame
bsf INTCON,7 ; разрешаем все немаскированные прерывания
;--- Прием пакета
btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data
bcf Flags,1 ; сбрасываем флаг приемника
btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+1 ;
bcf Flags,1 ; сбрасываем флаг приемника
btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+2 ;
bcf Flags,1 ; сбрасываем флаг приемника
btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+3 ;
bcf Flags,1 ; сбрасываем флаг приемника
btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+4 ;
bcf Flags,1 ; сбрасываем флаг приемника
btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+5 ;
bcf Flags,1 ; сбрасываем флаг приемника
btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+6 ;
bcf Flags,1 ; сбрасываем флаг приемника
btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+7 ;
bcf Flags,1 ; сбрасываем флаг приемника
btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+8 ;
bcf Flags,1 ; сбрасываем флаг приемника
btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+9 ;
bcf Flags,1 ; сбрасываем флаг приемника
btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+10 ;
bcf Flags,1 ; сбрасываем флаг приемника
bcf INTCON,7 ; запрещаем прерывания
;--- Проверка принятого пакета
movf B_Data+9,W ; вычисляем контрольную сумму из принятого пакета
movwf B_Data+9 ; от 10го принятого байта вычитаем 5ый принятый байт
movwf Reg_1 ;
movf B_Data+5,W ;
movwf B_Data+5 ;
subwf Reg_1,W ; W = 10 - 5
subwf B_Data+10,W ; сверяем с 11ым принятым в пакете байтом
bnz RX_frame ; если не соответствует значит пакет не принят. Уходим к новому приему пакета
; если пакет принят то проверяем старший криптобайт
movlw 0x19
subwf B_Data+1 ;
bnz RX_frame ; если не соответствует значит пакет не свой. Уходим к новому приему пакета
; если соответствует то проверяем младший криптобайт
movlw 0x73
subwf B_Data+2 ;
bnz RX_frame ; если не соответствует значит пакет не свой. Уходим к новому приему пакета
; если соответствует то формируем пакет на передачу в устройство.
;=================
; Здесь можно вставить код для опроса и выполнения команд промежуточным МК
; его байт в приемном пакете Data_3
;=================
;--- Отправка пакета оконечному устройству
movlw 0x7E ; стартовый байт
call Transmit
movlw 0xFF ; номер модификации устройства
call Transmit
movf B_Data+4,W ; ключевой байт контрольной суммы пакета
call Transmit
movf B_Data+5,W ; команда плееру
call Transmit
movf B_Data+6,W ; ответный байт
call Transmit
movf B_Data+7,W ; старший байт данных
call Transmit
movf B_Data+8,W ; младший байт данных
call Transmit
movlw 0xFE ; старший байт контрольной суммы пакета
call Transmit
movf B_Data+9,W ; младший байт контрольной суммы пакета
call Transmit
movlw 0xEF ; стоповый байт
call Transmit
b RX_frame
;===============================================================================================
;------------- ПОД'ПРОГРАММЫ -------------------------------------------------------------------
;===============================================================================================
;---- Прием байта
Recieve
btfsc U_rx_pin ; если вход=0, то обнаружен старт-бит
return
btfsc Flags,1 ; проверяем - пуст ли приемник,
b Err_overflow; если нет - выставл. флаг переполн. и выходим
bsf Flags,1 ; ставим признак принятия посылки
movlw .8
movwf Rx_Count ; счетчик принятых бит=8
call Delay2 ; пауза = 1/4 длительности бита (чтобы читать бит ближе к середине
call Delay
bcf STATUS,0 ; сбрасываем флаг cf
rrf Rbyte,1 ; сдвигаем регистр вправо
btfsc U_rx_pin ; если вход=1, то пишем 1, если нет - пропускаем
bsf Rbyte,7 ; ставим бит=1
decfsz Rx_Count,1 ; уменьш.счетчик и провер.- приняли 8 бит или нет
b $-6 ; если нет - принимаем следующий бит
call Delay
btfsc U_rx_pin ; если вход=0, то стоп бит не пришел
b $+4
bsf Flags,3 ; если стоп бит не пришел - ошибка приема
b $+2
Err_overflow
bsf Flags,2 ; выставляем флаг переполнения
return
;--- Передача байта ( вызывается после после загр-ки данных в буфер (TByte))
Transmit
movwf Tbyte
bsf Flags,0 ; устанавливаем флаг состояния передатчика в 1
movlw .8
movwf Tx_Count ; Счетчик переданных бит=8
bcf U_tx_pin ; Посылаем старт бит (=0)
Next_Tx
call Delay
btfss Tbyte,0 ; Проверяем бит для посылки
; (посылаем биты от младшего к старшему)
b $+3 ; если 0 - идем сюда, если 1, пропуск-м эту команду
bsf U_tx_pin ; Посылаем единицу
b $+2
bcf U_tx_pin ; Посылаем ноль
rrf Tbyte,1 ; Переходим к следующему биту
decfsz Tx_Count,1 ; Уменьш. счетчик переданных бит и проверяем,
; если он = 0, то след-щая команда пропуск-ся
b Next_Tx ; Переходим к посылке следующего бита
call Delay ; Задержка для последнего бита
bsf U_tx_pin ; Посылаем стоп-бит
call Delay ; Ждем (пока его не принял приемник - нельзя
; посылать следующий байт)
clrf Tbyte ; Очищаем регистр TByte
bcf Flags,0 ; и сбрасываем флаг его состояния
return
;--- Задержка, в соответствии с baudrate (в данном случае от 9 мкс до 1,029 мс с шагом 4 мкс)
Delay
movlw Baudrate
movwf SCount
nop
decfsz SCount,1
b $-2
return
;--- Задержка/4 ------------------------------------------
Delay2
movlw Baudrate
movwf SCount
bcf STATUS,0
rrf SCount,1
bcf STATUS,0
rrf SCount,1
nop
decfsz SCount,1
goto $-2
return
;===============================================================================================
end