please dont rip this site

Scenix Lib IO Dev Modem Fsk.src

;  Filename:	FSK_TX.SRC

; Author:	Stephen Holland

;		Applications Engineer

;		Scenix Semiconductor Inc.

; Revision:	1.0

; Date:		July 05, 1998

; Part:		SX28AC rev. 2.5

; Freq:		50Mhz

; Compiled using Parallax SX-Key software v0.8

;    

; *This virtual peripheral relies on an external RC filter to generate complete

;  FSK signal.

;

;

; Using a PC terminal program, all data received by the UART is sent out via

; FSK transmission

;

		device	pins28,pages4,banks8,oschs

		device	turbo,stackx,optionx,carryx

		id	'FSK_TX'

		reset	reset_entry

;

;

; Equates

;

rx_pin		=	ra.1

tx_pin		=	ra.2



pwm0_pin	=	ra.0



;

;

; Variables

;

			org	8



temp			ds	1

byte			ds	1

string			ds	1





			org	10h			;bank0 variables



timers			=	$



							;timer

timer_accl		ds	1

timer_acch		ds	1

timer_flag		ds	1



bit_cnt			ds	1





			org	30h			;bank1 variables



serial			=	$



tx_high			ds	1			;tx

tx_low			ds	1

tx_count		ds	1

tx_divide		ds	1

tx_flag			ds	1			;flag-byte

							;bit 0, busy transmitting, 0=no, 1=yes

tx_dly_count		ds	1





rx_count		ds	1			;rx

rx_divide		ds	1

rx_byte			ds	1

rx_flag			ds	1

rx_dly_count		ds	1





			org	50h			;bank3 variables



pwm			=	$



pwm_duty_1		ds	1

pwm_period_1		ds	1

lo_or_hi		ds	1



counter_fsk		ds	1



row			ds	1

col			ds	1



FSK_trm_byte		ds	1



;

;

; Interrupt routine - virtual peripherals

;

			org	0

interrupt					;3 it takes 3 cycles to get an interrupt

		bank	timers			;1

						;timer

		stc				;1 set carry

		add	timer_accl,#1		;2 add timer_accl+carry(=1)

		sc

		jmp	:timer_out



		add	timer_acch,#0

		snc				;1

		setb	timer_flag.0		;1

:timer_out					;=7



;********D/A CONVERSIONS*************

da_conv		bank	pwm			;1

		dec	pwm_duty_1		;1 decrement port_duty

		movb	pwm0_pin,/pwm_duty_1.7	;4 move complement of most significant bit to output



		decsz	pwm_period_1		;1

		jmp	da_conv_out		;3

		mov	pwm_duty_1,#5		;2

		jb	lo_or_hi.0,:period_1200	;1 hi for 1200, lo for 2200

:period_2200	mov	pwm_period_1,#10	;1 this is for phase coherence in freq shifts

		jmp	:continue

:period_1200	mov	pwm_period_1,#9		;2

:continue



make_fsk

make1200	csae	counter_fsk,#end1200	;1 take new table value

		jmp	:continue		;1 

		mov	counter_fsk,#sine1200	;1 reload table-counter

:continue	mov	w,counter_fsk		;1

		mov	m,#6			;1 set page

		iread				;1 get table_data

		mov	m,#$F			;1

		mov	pwm_duty_1,w		;1 = 21

		inc	counter_fsk		;1

		sb	lo_or_hi.0		;1 hi for 1200, lo for 2200

		inc	counter_fsk		;1 this is for phase coherence in freq shifts

		jmp	da_conv_out





da_conv_out	



;********SERIAL COMMUNICATIONS*************

:ser_comm	bank	serial			;1



		inc	tx_dly_count		;1

		inc	rx_dly_count		;1

		snb	rx_dly_count.2		;1 divide by 4

		jmp	:tst_rx			;3

		sb	tx_dly_count.4		;1 = 8 ;divide by 16

		jmp	interrupt_out		;3



:tst_tx		clr	tx_dly_count		;1

		jnb	tx_flag.0,interrupt_out	;2



		test	tx_count		;1 busy?

		clc				;1 ready stop bit

		snz				;1

		clrb	tx_flag.0		;1

		sz				;1 if busy, shift bits

		rr	tx_high			;1

		sz				;1

		rr	tx_low			;1

		sz				;1	;if busy, dec counter

		dec	tx_count		;1

		movb	tx_pin,/tx_low.6	;4 =18	;output next bit

		jmp	interrupt_out		;3





:tst_rx		clr	rx_dly_count		;1

		movb	c,rx_pin		;4	;serial receive

		test	rx_count		;1	;waiting for stop bit?

		jnz	:rxbit			;3,2	;if not, :bit

		mov	w,#9			;1	;in case start, ready 9 bits

		sc				;1	;if start, set rx_count

		mov	rx_count,w		;1

		mov	rx_divide,#7		;2	;ready 1.5 bit periods

:rxbit		djnz	rx_divide,:rxdone	;3,2	;8th time through?

		setb	rx_divide.2		;1	;yes, ready 1 bit period

		dec	rx_count		;1	;last bit?

		sz				;1	;if not, save bit

		rr	rx_byte			;1

		snz				;1	;if so, set flag

		setb	rx_flag.1		;1 =23

:rxdone

interrupt_out	mov	w,#-163			;1	;interrupt every 159 clocks

		retiw				;3





;

;

; Reset entry

;

reset_entry	mov	 ra,#%0110		;init ra

		mov	!ra,#%0011		;Set ra data direction register



		mov	m,#$F



		bank	serial

		inc	rx_dly_count		;just to create a slight time-shift



		clr	fsr			;reset all ram banks

:loop		setb	fsr.4

		clr	ind

		ijnz	fsr,:loop



		bank	pwm			;adc set speed/resolution

		mov	pwm_period_1,#9

		mov	pwm_duty_1,#5



		bank	serial

		clr	bit_cnt



		mov	!option,#%10011111	;enable rtcc interrupt



;

;*************************************************************

; Main 

;*************************************************************

;

;

; Terminal - main loop

;

main

		mov	w,#_hello		;send hello string

		page	send_string

		call	send_string



		mov	w,#_prompt		;send prompt string

		page	send_string

		call	send_string



main_loop

		page	get_byte

		call	get_byte



; This is where the line could be tested if it clear to send, if not then jump to :send_later



		bank	serial

		jnb	rx_flag.7,:send_later		;If bit not set then nothing to send



		page	FSK_send

		call	FSK_send



:send_later

; This is where a FSK_receive function would be called



		jmp	main_loop

;*************************************************************

;*************************************************************

; Subroutines 

;*************************************************************

		org	$200

;*************************************************************

; Jump table for page 1

;*************************************************************

FSK_send	jmp	FSK_send_byte

FSK_send_return

		retp

;*************************************************************

;

; Get byte via serial port

;

get_byte	bank	serial

		sb	rx_flag.1

		retp



		clrb	rx_flag.1

		setb	rx_flag.7		;Tell FSK module to send

		mov	w,rx_byte		;followed by send_byte

		bank	pwm

		mov	FSK_trm_byte,w



		mov	w,#_sending		;send 'sending' string

		page	send_string

		call	send_string



		bank	pwm

		mov	w,FSK_trm_byte



		call	send_byte

		

		mov	w,#_prompt		;send prompt string

		page	send_string

		call	send_string



		retp

;

; Send byte via serial port

;

send_byte	bank	serial



:wait		test	tx_count		;wait for not busy

		jnz	:wait



		not	w			;ready bits

		mov	tx_high,w

		setb	tx_low.7



		mov	tx_count,#10		;1 start + 8 data + 1 stop bit

		setb	tx_flag.0



		retp

;

;

; Send string at w

;

send_string	mov	string,w		;send string at w



:loop		mov	w,string		;read chr at w

		mov	m,#1



		iread

		mov	m,#$F



		test	w			;if 0, exit

		snz

		retp



		page	send_byte

		call	send_byte		;not 0, send chr



		inc	string			;next chr

		jmp	:loop

;

;

; Make byte uppercase

;

uppercase	csae	byte,#'a'

		ret



		sub	byte,#'a'-'A'

		ret

;*************************************************************

FSK_send_byte

		setb	ra.3			;Enable output

		mov	!ra,#%0010		;Enable pwm output



; This is where channel seizure or handshaking generation would be inserted.



		bank	pwm

		setb	lo_or_hi.0		;Set PWM to transmit 1200Hz for start bit



		bank	timers

		mov	!option,#%11011111	;disable rtcc interrupt

		mov	timer_accl,#$5d		;1250uS		

		mov	timer_acch,#$fd		;--//--

		mov	!option,#%10011111	;enable rtcc interrupt

		clrb	timer_flag.0		;Clear overflow-flag



		jnb	timer_flag.0,$		;Is overflow-flag set?



		mov	bit_cnt,#8		;Initialize bit_cnt



:next_bit	bank	pwm

		jnb	FSK_trm_byte.0,:set_2200_pwm



:set_1200_pwm	setb	lo_or_hi.0		;Set PWM to transmit 1200Hz

		jmp	:set_timer_833u



:set_2200_pwm	clrb	lo_or_hi.0		;Set PWM to transmit 2200Hz



:set_timer_833u

		bank	timers

		mov	!option,#%11011111	;disable rtcc interrupt

		mov	timer_accl,#$00		;833uS		

		mov	timer_acch,#$fe		;--//--

		mov	!option,#%10011111	;enable rtcc interrupt

		clrb	timer_flag.0		;Clear overflow-flag



		jnb	timer_flag.0,$		;Is overflow-flag set?



		bank	pwm

		rr	FSK_trm_byte

		bank	timers

		djnz	bit_cnt,:next_bit



		bank	pwm

		clrb	lo_or_hi.0		;Set PWM to transmit 2200Hz for stop bit

		bank	timers

		mov	!option,#%11011111	;disable rtcc interrupt

		mov	timer_accl,#$00		;833uS		

		mov	timer_acch,#$fe		;--//--

		mov	!option,#%10011111	;enable rtcc interrupt

		clrb	timer_flag.0		;Clear overflow-flag



		jnb	timer_flag.0,$		;Is overflow-flag set?		

:FSK_transmit_out

		mov	!ra,#%0011		;Disable pwm output

		clrb	ra.3			;Disable output

		bank	serial

		clrb	rx_flag.7



		jmp	FSK_send_return

;*************************************************************

;*************************************************************

;

		org	$1a0

;

; Data

;

_hello		dw	13,10,13,10,'SX Modem Demo...',13,10,0

_cr		dw	13,10,0

_prompt		dw	13,10,'>',0

_sending	dw	13,10,'Sending...',32,0

_hex		dw	'0123456789ABCDEF'





				

		org	$600



sine1200	=	$

		DW	5	; 1

		DW	7	; 2

		DW	8	; 3

		DW	8	; 4

		DW	9	; 5

		DW	9	; 6

		DW	10	; 7

		DW	9	; 8

		DW	9	; 9

		DW	8	;10

		DW	8	;11

		DW	7	;12

		DW	6	;13

		DW	5	;14

		DW	3	;15

		DW	2	;16

		DW	1	;17

		DW	1	;18

		DW	0	;19

		DW	0	;20

		DW	0	;21

		DW	0	;22

		DW	0	;23

		DW	1	;24

		DW	1	;25

		DW	2	;26

		DW	3	;27

end1200		=	$

		DW	4	;28




file: /Techref/scenix/lib/io/dev/modem/fsk.src, 9KB, , updated: 1999/2/20 11:23, local time: 2024/11/14 08:36,
TOP NEW HELP FIND: 
18.116.47.222:LOG IN

 ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?
Please DO link to this page! Digg it! / MAKE!

<A HREF="http://linistepper.com/Techref/scenix/lib/io/dev/modem/fsk.src"> scenix lib io dev modem fsk</A>

Did you find what you needed?