please dont rip this site

Scenix Powervp.src

;sxdemo.src
;
; Device
;
		device	pins28,pages1,banks8,oschs
		device	turbo,stackx,optionx
		id	'SX Demo'
		reset	reset_entry
;
;						This code demonstrates the ability of the SX28AC to use software
;						Virtual Peripherals to implement the following:
;							4 PWM outputs (RA0 - RA3)
;							6 UARTS	      (RB0-RB5, RC0-RC5)
;							4 16 bit TIMERS
;							2 8 bit A/D Converters (RB6-RB7, RC6-RC7)
;
; Equates
;
ra_dir		=	%0000
pwm0_pin	=	ra.0
pwm1_pin	=	ra.1
pwm2_pin	=	ra.2
pwm3_pin	=	ra.3

rb_dir		=	%00111111
rx0_pin		=	rb.0
rx1_pin		=	rb.1
rx2_pin		=	rb.2
rx3_pin		=	rb.3
rx4_pin		=	rb.4
rx5_pin		=	rb.5
adc0_out_pin	=	rb.6
adc1_out_pin	=	rb.7

rc_dir		=	%11000000
tx0_pin		=	rc.0
tx1_pin		=	rc.1
tx2_pin		=	rc.2
tx3_pin		=	rc.3
tx4_pin		=	rc.4
tx5_pin		=	rc.5
adc0_in_pin	=	rc.6
adc1_in_pin	=	rc.7
;
;
; Variables
;
		org	8			;common-bank variables

master_count	ds	1
master_mask	ds	1

itemp		ds	1

rx_flags	ds	1
rx0_full	=	rx_flags.0
rx1_full	=	rx_flags.1
rx2_full	=	rx_flags.2
rx3_full	=	rx_flags.3
rx4_full	=	rx_flags.4
rx5_full	=	rx_flags.5

		org	$10			;bank0 variables

timer_low	ds	1			;timer write buffer
timer_high	ds	1

timer_flags	ds	1
timer0_flag	=	timer_flags.0
timer1_flag	=	timer_flags.1
timer2_flag	=	timer_flags.2
timer3_flag	=	timer_flags.3

		org	$30			;bank1 variables

timers		=	$

timer0_low	ds	1			;timer0
timer0_high	ds	1
timer0_l	ds	1
timer0_h	ds	1

timer1_low	ds	1			;timer1
timer1_high	ds	1
timer1_l	ds	1
timer1_h	ds	1

timer2_low	ds	1			;timer2
timer2_high	ds	1
timer2_l	ds	1
timer2_h	ds	1

timer3_low	ds	1			;timer3
timer3_high	ds	1
timer3_l	ds	1
timer3_h	ds	1


		org	$50			;bank2 variables

analog		=	$

pwm0		ds	1			;pwm0
pwm0_acc	ds	1

pwm1		ds	1			;pwm1
pwm1_acc	ds	1

pwm2		ds	1			;pwm2
pwm2_acc	ds	1

pwm3		ds	1			;pwm3
pwm3_acc	ds	1

adc0		ds	1			;adc0
adc0_acc	ds	1
adc0_count	ds	1

adc1		ds	1			;adc1
adc1_acc	ds	1
adc1_count	ds	1

		org	$70			;bank3 variables

serial_out	=	$

tx0_flag	ds	1			;tx0
tx0_data	ds	1

tx1_flag	ds	1			;tx1
tx1_data	ds	1

tx2_flag	ds	1			;tx2
tx2_data	ds	1

tx3_flag	ds	1			;tx3
tx3_data	ds	1

tx4_flag	ds	1			;tx4
tx4_data	ds	1

tx5_flag	ds	1			;tx5
tx5_data	ds	1

tx6_flag	ds	1			;tx6
tx6_data	ds	1

tx7_flag	ds	1			;tx7
tx7_data	ds	1

		org	$90			;bank4 variables

serial_in	=	$

rx0_flag	ds	1			;rx0
rx0_data	ds	1

rx1_flag	ds	1			;rx1
rx1_data	ds	1

rx2_flag	ds	1			;rx2
rx2_data	ds	1

rx3_flag	ds	1			;rx3
rx3_data	ds	1

rx4_flag	ds	1			;rx4
rx4_data	ds	1

rx5_flag	ds	1			;rx5
rx5_data	ds	1

rx6_flag	ds	1			;rx6
rx6_data	ds	1

rx7_flag	ds	1			;rx7
rx7_data	ds	1

		org	0
		jmp	interrupt
;
;
;***************
;* Subroutines *
;***************
;
;
; Set up timer W [0-3] - timer_low and timer_high must hold value
;
timer_setup	not	timer_low	;get swapped 2's complement of value
		not	timer_high
		inc	timer_low
		snz
		inc	timer_high
		swap	timer_low
		swap	timer_high

		and	w,#$03		;point fsr to timer [W] data
		clc
		rl	wreg
		rl	wreg
		or	w,#timers
		mov	fsr,w

		mov	ind,timer_low	;init timer [W]
		inc	fsr
		mov	ind,timer_high
		inc	fsr
		mov	ind,#$FE
		inc	fsr
		mov	ind,#$FF

		ret
;
;
;********
;* Main *
;********
;
; Reset entry
;
reset_entry	clr	ra			;init ra
		mov	!ra,#ra_dir

		clr	rb			;init rb
		mov	!rb,#rb_dir

		clr	rc			;init rc
		mov	!rc,#rc_dir

		mov	m,#$D			;set cmos input levels on rc
		mov	!rc,#0
		mov	m,#$F

		mov	fsr,#$08		;reset all ram registers
:loop		sb	fsr.3
		setb	fsr.4
		clr	ind
		ijnz	fsr,:loop

		mov	master_mask,#$01	;init master_mask

		mov	!option,#%00000000	;enable rtcc interrupt
;
;
; User's program
;
; To setup timer, write value to timer_low and timer_high,
; load W with timer# (0-3), and call set_timer.  the corresponding
; timerX_flag will be set.  It must be reset in software.
;
; To set a pwm channel, write an 8-bit value to pwmX.
;
; To read an adc, simple read adcX.
;
; To output serial, wait for the particular txX_flag to contain 0,
; then write the byte to transmit to txX_data and write 10h to txX_flag.
;
; To input serial, check for an rxX_full flag set.  Then get the
; byte from the associated rxX_data register.  Clear the rxX_full
; flag afterwards. 
;
main		bank	analog			;select analog bank
		mov	w,adc0			;read adc
		mov	pwm0,w			;write value to pwm

		bank	serial_out		;select serial out bank
		test	tx0_flag		;if tx0 is ready, output byte
		jnz	:tx0_busy
		mov	tx0_data,w
		mov	tx0_flag,#$10		
:tx0_busy
		test	tx1_flag		;if tx1 is ready, check rx0
		jnz	:tx1_busy
		jnb	rx0_full,:tx1_busy	;if rx0 not full, skip
		bank	serial_in		;select serial in bank
		mov	w,rx0_data		;get byte received from rx0
		bank	serial_out		;select serial out bank
		mov	tx1_data,w		;write byte to tx0
		mov	tx1_flag,#$10
		clrb	rx0_full
:tx1_busy
		jmp	main
;
;
; Interrupt routine - virtual peripherals
;
interrupt	inc	master_count	;1	;update timing data
		mov	w,<<master_mask	;1
		rl	master_mask	;1

		bank	timers		;1	;timers

		inc	timer0_l	;1	;16-bit timer0
		snz			;1
		inc	timer0_h	;1
		mov	w,<>timer0_low	;1
		snz			;1
		mov	timer0_l,w	;1
		mov	w,<>timer0_high	;1
		snz			;1
		mov	timer0_h,w	;1
		snz			;1
		setb	timer0_flag	;1 =11

		inc	timer1_l	;1	;16-bit timer1
		snz			;1
		inc	timer1_h	;1
		mov	w,<>timer1_low	;1
		snz			;1
		mov	timer1_l,w	;1
		mov	w,<>timer1_high	;1
		snz			;1
		mov	timer1_h,w	;1
		snz			;1
		setb	timer1_flag	;1 =11

		inc	timer2_l	;1	;16-bit timer2
		snz			;1
		inc	timer2_h	;1
		mov	w,<>timer2_low	;1
		snz			;1
		mov	timer2_l,w	;1
		mov	w,<>timer2_high	;1
		snz			;1
		mov	timer2_h,w	;1
		snz			;1
		setb	timer2_flag	;1 =11

		inc	timer3_l	;1	;16-bit timer3
		snz			;1
		inc	timer3_h	;1
		mov	w,<>timer3_low	;1
		snz			;1
		mov	timer3_l,w	;1
		mov	w,<>timer3_high	;1
		snz			;1
		mov	timer3_h,w	;1
		snz			;1
		setb	timer3_flag	;1 =11

		bank	analog		;1	;pwm's and adc's

		clr	itemp		;1

		add	pwm0_acc,pwm0	;2	;pwm0
		snc			;1
		setb	itemp.0		;1 =4

		add	pwm1_acc,pwm1	;2	;pwm1
		snc			;1
		setb	itemp.1		;1 =4

		add	pwm2_acc,pwm2	;2	;pwm2
		snc			;1
		setb	itemp.2		;1 =4

		add	pwm3_acc,pwm3	;2	;pwm3
		snc			;1
		setb	itemp.3		;1 =4

		mov	ra,itemp	;2

		mov	w,/rc		;1	;adc0/adc1
		mov	rb,w		;1	;complement inputs to outputs

		rl	wreg		;1	;get adc0 into w.7 and adc1 into c

		sb	wreg.7		;1	;adc0
		inc	adc0_acc	;1	;if was high, inc acc
		mov	w,adc0_acc	;1	;get acc into w
		inc	adc0_count	;1	;done?
		snz			;1	;if so, update adc0
		mov	adc0,w		;1
		snz			;1	;if so, reset acc
		clr	adc0_acc	;1 =8

		sc			;1	;adc1
		inc	adc1_acc	;1	;if was high, inc acc
		mov	w,adc1_acc	;1	;get acc into w
		inc	adc1_count	;1	;done?
		snz			;1	;if so, update adc0
		mov	adc1,w		;1
		snz			;1	;if so, reset acc
		clr	adc1_acc	;1 =8

		bank	serial_out	;1

		mov	w,<<master_count;1	;8 serial outputs
		and	w,#$0E		;1
		or	w,#serial_out	;1
		mov	fsr,w		;1
		mov	w,rc		;1
		or	w,master_mask	;1
		snb	ind.7		;1
		xor	w,master_mask	;1
		mov	rc,w		;1
		test	ind		;1
		rl	ind		;1
		clc			;1
		setb	fsr.0		;1
		sz			;1
		rr	ind		;1
		clrb	fsr.0		;1
		rr	ind		;1
		sz			;1
		dec	ind		;1 =19

		bank	serial_in	;1

rx0		clc			;1	;serial input
		snb	rb.0		;1	;get rx pin into c
		stc			;1
		mov	w,#$F0		;1	;busy?
		and	w,rx0_flag	;1
		jnz	:busy		;2,4	;(jitter okay)
		jc	:not		;2,3	;start bit?
		mov	w,#$0C		;1	;got start
		add	w,master_count	;1	;set 1.5 bit delay
		and	w,#$0F		;1
		or	w,#$60		;1
		mov	rx0_flag,w	;1
:busy		mov	w,rx0_flag	;1	;busy, bit ready?
		xor	w,master_count	;1
		and	w,#$0F		;1
		jnz	:not		;2,4	;(jitter okay)
		mov	w,rx0_flag	;1	;if stop bit, don't save
		or	w,#$0F		;1
		incsz	wreg		;1
		rr	rx0_data	;1	;data bit, save
		add	rx0_flag,#$10	;2	;inc bit counter
		snc			;1
		setb	rx0_full	;1	;if done, set flag
		xor	rx0_flag,#$08	;1	;set 1 bit delay
:not
rx1		clc			;1	;serial input
		snb	rb.0		;1	;get rx pin into c
		stc			;1
		mov	w,#$F0		;1	;busy?
		and	w,rx1_flag	;1
		jnz	:busy		;2,4	;(jitter okay)
		jc	:not		;2,3	;start bit?
		mov	w,#$0C		;1	;got start
		add	w,master_count	;1	;set 1.5 bit delay
		and	w,#$0F		;1
		or	w,#$60		;1
		mov	rx1_flag,w	;1
:busy		mov	w,rx1_flag	;1	;busy, bit ready?
		xor	w,master_count	;1
		and	w,#$0F		;1
		jnz	:not		;2,4	;(jitter okay)
		mov	w,rx1_flag	;1	;if stop bit, don't save
		or	w,#$0F		;1
		incsz	wreg		;1
		rr	rx1_data	;1	;data bit, save
		add	rx1_flag,#$10	;2	;inc bit counter
		snc			;1
		setb	rx1_full	;1	;if done, set flag
		xor	rx1_flag,#$08	;1	;set 1 bit delay
:not
rx2		clc			;1	;serial input
		snb	rb.0		;1	;get rx pin into c
		stc			;1
		mov	w,#$F0		;1	;busy?
		and	w,rx2_flag	;1
		jnz	:busy		;2,4	;(jitter okay)
		jc	:not		;2,3	;start bit?
		mov	w,#$0C		;1	;got start
		add	w,master_count	;1	;set 1.5 bit delay
		and	w,#$0F		;1
		or	w,#$60		;1
		mov	rx2_flag,w	;1
:busy		mov	w,rx2_flag	;1	;busy, bit ready?
		xor	w,master_count	;1
		and	w,#$0F		;1
		jnz	:not		;2,4	;(jitter okay)
		mov	w,rx2_flag	;1	;if stop bit, don't save
		or	w,#$0F		;1
		incsz	wreg		;1
		rr	rx2_data	;1	;data bit, save
		add	rx2_flag,#$10	;2	;inc bit counter
		snc			;1
		setb	rx2_full	;1	;if done, set flag
		xor	rx2_flag,#$08	;1	;set 1 bit delay
:not
rx3		clc			;1	;serial input
		snb	rb.0		;1	;get rx pin into c
		stc			;1
		mov	w,#$F0		;1	;busy?
		and	w,rx3_flag	;1
		jnz	:busy		;2,4	;(jitter okay)
		jc	:not		;2,3	;start bit?
		mov	w,#$0C		;1	;got start
		add	w,master_count	;1	;set 1.5 bit delay
		and	w,#$0F		;1
		or	w,#$60		;1
		mov	rx3_flag,w	;1
:busy		mov	w,rx3_flag	;1	;busy, bit ready?
		xor	w,master_count	;1
		and	w,#$0F		;1
		jnz	:not		;2,4	;(jitter okay)
		mov	w,rx3_flag	;1	;if stop bit, don't save
		or	w,#$0F		;1
		incsz	wreg		;1
		rr	rx3_data	;1	;data bit, save
		add	rx3_flag,#$10	;2	;inc bit counter
		snc			;1
		setb	rx3_full	;1	;if done, set flag
		xor	rx3_flag,#$08	;1	;set 1 bit delay
:not
rx4		clc			;1	;serial input
		snb	rb.0		;1	;get rx pin into c
		stc			;1
		mov	w,#$F0		;1	;busy?
		and	w,rx4_flag	;1
		jnz	:busy		;2,4	;(jitter okay)
		jc	:not		;2,3	;start bit?
		mov	w,#$0C		;1	;got start
		add	w,master_count	;1	;set 1.5 bit delay
		and	w,#$0F		;1
		or	w,#$60		;1
		mov	rx4_flag,w	;1
:busy		mov	w,rx4_flag	;1	;busy, bit ready?
		xor	w,master_count	;1
		and	w,#$0F		;1
		jnz	:not		;2,4	;(jitter okay)
		mov	w,rx4_flag	;1	;if stop bit, don't save
		or	w,#$0F		;1
		incsz	wreg		;1
		rr	rx4_data	;1	;data bit, save
		add	rx4_flag,#$10	;2	;inc bit counter
		snc			;1
		setb	rx4_full	;1	;if done, set flag
		xor	rx4_flag,#$08	;1	;set 1 bit delay
:not
rx5		clc			;1	;serial input
		snb	rb.5		;1	;get rx pin into c
		stc			;1
		mov	w,#$F0		;1	;busy?
		and	w,rx5_flag	;1
		jnz	:busy		;2,4	;(jitter okay)
		jc	:not		;2,3	;start bit?
		mov	w,#$0C		;1	;got start
		add	w,master_count	;1	;set 1.5 bit delay
		and	w,#$0F		;1
		or	w,#$60		;1
		mov	rx5_flag,w	;1
:busy		mov	w,rx5_flag	;1	;busy, bit ready?
		xor	w,master_count	;1
		and	w,#$0F		;1
		jnz	:not		;2,4	;(jitter okay)
		mov	w,rx5_flag	;1	;if stop bit, don't save
		or	w,#$0F		;1
		incsz	wreg		;1
		rr	rx5_data	;1	;data bit, save
		add	rx5_flag,#$10	;2	;inc bit counter
		snc			;1
		setb	rx5_full	;1	;if done, set flag
		xor	rx5_flag,#$08	;1	;set 1 bit delay
:not
		mov	w,#-163		;1	;interrupt every 163*2 clocks
		retiw			;3	;(2 is from prescaler, rate=8*19.2KHz)


file: /Techref/scenix/powervp.src, 11KB, , updated: 1999/6/14 10:16, local time: 2024/12/8 19:54,
TOP NEW HELP FIND: 
18.97.14.82: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://www.piclist.com/techref/scenix/powervp.src"> scenix powervp</A>

Did you find what you needed?

  PICList 2024 contributors:
o List host: MIT, Site host massmind.org, Top posters @none found
- Page Editors: James Newton, David Cary, and YOU!
* Roman Black of Black Robotics donates from sales of Linistep stepper controller kits.
* Ashley Roll of Digital Nemesis donates from sales of RCL-1 RS232 to TTL converters.
* Monthly Subscribers: Gregg Rew. on-going support is MOST appreciated!
* Contributors: Richard Seriani, Sr.
 

Welcome to www.piclist.com!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  .