⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial.asm

📁 uart-I2C, working on PIC18F2420
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	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 + -