📄 serial.asm
字号:
cpfseq RECBUFF
goto command_error
;now send mute on
movlw 0x06
movwf current_subadd
movlw 0x00
movwf current_data
call send2TDA
movlw d'12'
movwf combyte
call talk2
;don't forget to clear the state....
clrf current_state
bcf FLAG3,b_TILDA
return
stateu
movlw d'32'
cpfseq current_state
bra su_0
bra su_1
su_0
movwf current_state
return
su_1
bcf FLAG1,b_pending
movlw "m"
cpfseq RECBUFF
goto command_error
movlw d'34'
movwf current_state
return
stateu_end
movlw ")"
cpfseq RECBUFF
goto command_error
;now send mute off
movlw 0x06
movwf current_subadd
movlw 0x01
movwf current_data
call send2TDA
movlw d'11'
movwf combyte
call talk2
;don't forget to clear the state....
clrf current_state
bcf FLAG3,b_TILDA
return
state8
movlw d'16'
movwf current_state
movlw "a" ;check for source command
cpfseq RECBUFF
bra s8_0
return ;first time through, just set state to state4 and return
;pending is already cleared in state0
s8_0
btfsc FLAG3,b_chan_rcvd ;look for first byte (which channel?)
bra s8_1
bsf FLAG3,b_chan_rcvd ;set marker, we are here
call convert_recbuff_dec ;convert recbuff to a decimal character
movf RECBUFF,w
movwf current_channel
rlncf current_channel ;multiply by 2
bcf FLAG1,b_pending
return
s8_1
btfsc FLAG2,b_sub_rcvd_l ;next byte is subaddress
bra s8_1_1
bsf FLAG2,b_sub_rcvd_l
call convert_recbuff_dec
movf RECBUFF,w
movwf current_subadd
bcf FLAG1,b_pending
return
s8_1_1
btfsc FLAG2,b_sub_rcvd_h
bra s8_1_2
bsf FLAG2,b_sub_rcvd_h
call convert_recbuff_dec
swapf RECBUFF
movf RECBUFF,w
iorwf current_subadd,f
swapf current_subadd,f
bcf FLAG1,b_pending
return
s8_1_2
btfsc FLAG2,b_data_l
bra s8_1_3
bsf FLAG2,b_data_l
call convert_recbuff_dec
movf RECBUFF,w
movwf current_data ;mov byte into current data byte
bcf FLAG1,b_pending
return
s8_1_3
call convert_recbuff_dec
swapf RECBUFF
movf RECBUFF,w
iorwf current_data,f
swapf current_data,f
bra send2TDA ;skip over reset
;at this point, we are sitting with:
;current TDA channel current_channel 1-6 allowed
;current sub address current_subadr 00-07. If incremental would be 10-17.
;current data byte current_data value depends upon sub address and command
;note we can also use this entry point from other routines as long as the above registers
;are set properly
reset_TDA
movlw 0x0f
call LONG_DELAY
bsf TDA_SCA ;be sure clock is high
call WAIT_STATE2
bsf TDA1_SDA ;be sure SDA is high
call WAIT_STATE2
bcf TDA1_SDA ;start condition
call WAIT_STATE2
bsf TDA1_SDA ;stop - use to reset
call WAIT_STATE2
bsf TDA2_SDA ;be sure SDA is high
call WAIT_STATE2
bcf TDA2_SDA ;start condition
call WAIT_STATE2
bsf TDA2_SDA ;stop - use to reset
call WAIT_STATE2
bsf TDA3_SDA ;be sure SDA is high
call WAIT_STATE2
bcf TDA3_SDA ;start condition
call WAIT_STATE2
bsf TDA3_SDA ;stop - use to reset
call WAIT_STATE2
bsf TDA4_SDA ;be sure SDA is high
call WAIT_STATE2
bcf TDA4_SDA ;start condition
call WAIT_STATE2
bsf TDA4_SDA ;stop - use to reset
call WAIT_STATE2
bsf TDA5_SDA ;be sure SDA is high
call WAIT_STATE2
bcf TDA5_SDA ;start condition
call WAIT_STATE2
bsf TDA5_SDA ;stop - use to reset
call WAIT_STATE2
bsf TDA6_SDA ;be sure SDA is high
call WAIT_STATE2
bcf TDA6_SDA ;start condition
call WAIT_STATE2
bsf TDA6_SDA ;stop - use to reset
call WAIT_STATE2
; bsf PIC_SCA
; call WAIT_STATE
; bsf PIC_SDA
; call WAIT_STATE
; bcf PIC_SDA
; call WAIT_STATE
; bsf PIC_SDA
; call WAIT_STATE
return
send2TDA
bsf TDA_SCA ;be sure clock is high
call WAIT_STATE
movf PCL,w ;false read to update PCU,PCH
rlncf current_channel,w
addwf PCL,F ;jump to correct channel
nop ;zero not allowed - treat as 1
bra s8_2 ;channel 1
bra s8_3 ;channel 2
bra s8_4 ;channel 3
bra s8_5 ;channel 4
bra s8_6 ;channel 5
bra s8_7 ;channel 6
s8_2
; bsf TDA1_SDA ;be sure SDA is high
; call WAIT_STATE
; bcf TDA1_SDA ;start condition
; call WAIT_STATE
; bsf TDA1_SDA ;stop - use to reset
; call WAIT_STATE
movlw TDA_ADDRESS
movwf I2CBUF
call START_TDA1 ;start condition to TDA1
call SEND_TDA1 ;send address to TDA1
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
movf current_subadd,w
movwf I2CBUF
call SEND_TDA1
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
movf current_data,w
movwf I2CBUF
call SEND_TDA1
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
call STOP_TDA1
; bsf TDA_SCA
; bsf TDA1_SDA ;be sure SDA is high
; call WAIT_STATE
; bcf TDA1_SDA ;start condition
; call WAIT_STATE
; bsf TDA1_SDA ;stop - use to reset
; call WAIT_STATE
bra end_state8
s8_3
; bsf TDA2_SDA ;be sure SDA is high
; call WAIT_STATE
; bcf TDA2_SDA ;start condition
; call WAIT_STATE
; bsf TDA2_SDA ;stop - use to reset
; call WAIT_STATE
movlw TDA_ADDRESS
movwf I2CBUF
call START_TDA2 ;start condition to TDA2
call SEND_TDA2 ;send address to TDA2
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
movf current_subadd,w
movwf I2CBUF
call SEND_TDA2
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
movf current_data,w
movwf I2CBUF
call SEND_TDA2
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
call STOP_TDA2
; bsf TDA_SCA
; bsf TDA2_SDA ;be sure SDA is high
; call WAIT_STATE
; bcf TDA2_SDA ;start condition
;; call WAIT_STATE
; bsf TDA2_SDA ;stop - use to reset
; call WAIT_STATE
bra end_state8
s8_4
; bsf TDA3_SDA ;be sure SDA is high
; call WAIT_STATE
; bcf TDA3_SDA ;start condition
; call WAIT_STATE
; bsf TDA3_SDA ;stop - use to reset
; call WAIT_STATE
movlw TDA_ADDRESS
movwf I2CBUF
call START_TDA3 ;start condition to TDA3
call SEND_TDA3 ;send address to TDA3
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
movf current_subadd,w
movwf I2CBUF
call SEND_TDA3
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
movf current_data,w
movwf I2CBUF
call SEND_TDA3
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
call STOP_TDA3
; bsf TDA_SCA
; bsf TDA3_SDA ;be sure SDA is high
; call WAIT_STATE
; bcf TDA3_SDA ;start condition
; call WAIT_STATE
; bsf TDA3_SDA ;stop - use to reset
; call WAIT_STATE
bra end_state8
s8_5
; bsf TDA4_SDA ;be sure SDA is high
; call WAIT_STATE
; bcf TDA4_SDA ;start condition
; call WAIT_STATE
; bsf TDA4_SDA ;stop - use to reset
; call WAIT_STATE
movlw TDA_ADDRESS
movwf I2CBUF
call START_TDA4 ;start condition to TDA4
call SEND_TDA4 ;send address to TDA4
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
movf current_subadd,w
movwf I2CBUF
call SEND_TDA4
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
movf current_data,w
movwf I2CBUF
call SEND_TDA4
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
call STOP_TDA4
; bsf TDA_SCA
; bsf TDA4_SDA ;be sure SDA is high
; call WAIT_STATE
; bcf TDA4_SDA ;start condition
; call WAIT_STATE
; bsf TDA4_SDA ;stop - use to reset
; call WAIT_STATE
bra end_state8
s8_6
; bsf TDA5_SDA ;be sure SDA is high
; call WAIT_STATE
; bcf TDA5_SDA ;start condition
; call WAIT_STATE
; bsf TDA5_SDA ;stop - use to reset
; call WAIT_STATE
movlw TDA_ADDRESS
movwf I2CBUF
call START_TDA5 ;start condition to TDA5
call SEND_TDA5 ;send address to TDA5
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
movf current_subadd,w
movwf I2CBUF
call SEND_TDA5
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
movf current_data,w
movwf I2CBUF
call SEND_TDA5
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
call STOP_TDA5
;
; bsf TDA_SCA
; bsf TDA5_SDA ;be sure SDA is high
; call WAIT_STATE
; bcf TDA5_SDA ;start condition
; call WAIT_STATE
; bsf TDA5_SDA ;stop - use to reset
; call WAIT_STATE
bra end_state8
s8_7
; bsf TDA6_SDA ;be sure SDA is high
; call WAIT_STATE
; bcf TDA6_SDA ;start condition
; call WAIT_STATE
; bsf TDA6_SDA ;stop - use to reset
; call WAIT_STATE
movlw TDA_ADDRESS
movwf I2CBUF
call START_TDA6 ;start condition to TDA6
call SEND_TDA6 ;send address to TDA6
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
movf current_subadd,w
movwf I2CBUF
call SEND_TDA6
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
movf current_data,w
movwf I2CBUF
call SEND_TDA6
btfsc FLAG3,b_ACKERROR
bra s8_comm_error
call STOP_TDA6
; bsf TDA_SCA
; bsf TDA6_SDA ;be sure SDA is high
; call WAIT_STATE
; bcf TDA6_SDA ;start condition
; call WAIT_STATE
; bsf TDA6_SDA ;stop - use to reset
; call WAIT_STATE
bra end_state8
s8_comm_error
call String_ERROR4
call reset_TDA
end_state8
btfsc FLAG2,b_tdaonly ;return from here if only using send routines
return
bcf FLAG1,b_pending
bcf FLAG3,b_TILDA ;get ready for next command
bcf FLAG3,b_chan_rcvd ;clear channel flag
bcf FLAG2,b_sub_rcvd_l
bcf FLAG2,b_sub_rcvd_h ;clear subaddress flag
bcf FLAG2,b_data_l
clrf current_subadd
clrf current_data
clrf current_state ;reset state
return
state9
movlw d'40'
movwf current_state
return
state_sl
bcf FLAG1,b_pending
movlw "l"
cpfseq RECBUFF
goto command_error
movlw d'42'
movwf current_state
return
state_slx
bcf FLAG1,b_pending
movlw d'44'
movwf current_state
movf RECBUFF,w
call convert_recbuff_dec
movf RECBUFF,w
movwf current_data
return
state_sl_end
bcf FLAG1,b_pending
movlw ")"
cpfseq RECBUFF
goto command_error
;current data is a little more tricky...
;inputs 7-5 are tarnslated to input 4 (switching is external through the mux)
;now we need to send the current channel and decode the current input,
; and send it to the TDA using state8 routine
; rlncf current_channel ;multiply by 2 for state8
input_sl_key
clrf current_subadd ;sub address is 0 for input select
movlw d'7'
cpfseq current_data
bra s9_2
call in6k7
movlw 0x023
movwf current_data ;see data table for tda
bra send2TDA
s9_2
movlw d'6'
cpfseq current_data
bra s9_3
call in6k7
movlw 0x023 ;see data table for tda
movwf current_data
bra send2TDA
s9_3
movlw d'5'
cpfseq current_data
bra s9_4
call in6k7
movlw 0x023 ;see data table for tda
movwf current_data
bra send2TDA
s9_4
movlw d'4'
cpfseq current_data
bra s9_5
call in6k7
movlw 0x023
movwf current_data
bra send2TDA
s9_5
movlw d'3'
cpfseq current_data
bra s9_6
movlw 0x022
movwf current_data
bra send2TDA
s9_6
movlw d'2'
cpfseq current_data
bra s9_7
movlw 0x021
movwf current_data
bra send2TDA
s9_7
movlw 0x020
movwf current_data
bra send2TDA
;only use this section if it is a 6K7....
in6k7
movf current_data,w
; rlncf current_data,w
movwf I2CBUF2 ;copy current input into send buffer
swapf I2CBUF2,f ;mov to high nibble
; rrncf current_channel,w
movf current_channel,w ;copy current channel into w
iorwf I2CBUF2,f ;logical or with send buffer
; swapf I2CBUF2,f ;swap channel back to high nibble
;format for channel/input -
;upper nibble is source (4/5/6/7)
;lower nibble is channel (1-6)
;example - set channel 6 to input 1 = 0110 0001 or 0x061 hex
call START_PIC
call SEND_PIC
btfsc FLAG2,b_ACKERROR2
call String_ERROR4
bcf FLAG2,b_ACKERROR2
call STOP_PIC
call WAIT_STATE2
return
;********************************************
;END OF STATES
;********************************************
paged
;Have to start by saving current settings.....hmmm, what are we missing....
;We have:
; current input
; current volume
; We don't know who is on or off.....do we need to?
;1) Set to mic
;2) Set volume for all
;3) When page goes away, restore
bsf FLAG2,b_tdaonly
movlw 0x00 ;sub addr 0 - In select and mic
movwf current_subadd
movlw 0x00 ;mic, gain = 14dB, mute = off, in=in1
movwf current_data
movlw 1
movwf current_channel
call send2TDA ;ch 1
incf current_channel,f
call wait_4
call send2TDA ;ch 2
incf current_channel,f
call wait_4
call send2TDA ;ch 3
incf current_channel,f
call wait_4
call send2TDA ;ch 4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -